pi-obsidian-memory 0.0.0 → 0.1.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 (572) hide show
  1. package/README.md +173 -7
  2. package/package.json +45 -7
  3. package/skills/obsidian-memory/SKILL.md +101 -0
  4. package/src/domain/capture/constants.ts +5 -0
  5. package/src/domain/capture/index.ts +6 -0
  6. package/src/domain/capture/input-problems.ts +9 -0
  7. package/src/domain/capture/schemas.ts +92 -0
  8. package/src/domain/capture/tally.ts +26 -0
  9. package/src/domain/capture/types.ts +49 -0
  10. package/src/domain/capture/validate.ts +75 -0
  11. package/src/domain/command-flags/constants.ts +141 -0
  12. package/src/domain/command-flags/index.ts +1 -0
  13. package/src/domain/config/change.ts +105 -0
  14. package/src/domain/config/constants.ts +25 -0
  15. package/src/domain/config/diagnostics.ts +35 -0
  16. package/src/domain/config/disclosures.ts +8 -0
  17. package/src/domain/config/fields.ts +7 -0
  18. package/src/domain/config/index.ts +11 -0
  19. package/src/domain/config/inspection.ts +43 -0
  20. package/src/domain/config/invariants.ts +68 -0
  21. package/src/domain/config/legacy-capture.ts +17 -0
  22. package/src/domain/config/observations.ts +109 -0
  23. package/src/domain/config/parse.ts +25 -0
  24. package/src/domain/config/paths.ts +61 -0
  25. package/src/domain/config/registration.ts +34 -0
  26. package/src/domain/config/repair.ts +36 -0
  27. package/src/domain/config/resources.ts +65 -0
  28. package/src/domain/config/rules.ts +49 -0
  29. package/src/domain/config/schemas.ts +155 -0
  30. package/src/domain/config/settings.ts +23 -0
  31. package/src/domain/config/types.ts +239 -0
  32. package/src/domain/decision-model/constants.ts +7 -0
  33. package/src/domain/decision-model/cutoffs.ts +8 -0
  34. package/src/domain/decision-model/endpoint.ts +11 -0
  35. package/src/domain/decision-model/failure-detail.ts +8 -0
  36. package/src/domain/decision-model/index.ts +6 -0
  37. package/src/domain/decision-model/rank.ts +36 -0
  38. package/src/domain/decision-model/types.ts +77 -0
  39. package/src/domain/embeddings/constants.ts +55 -0
  40. package/src/domain/embeddings/identity.ts +30 -0
  41. package/src/domain/embeddings/index.ts +5 -0
  42. package/src/domain/embeddings/schemas.ts +25 -0
  43. package/src/domain/embeddings/types.ts +52 -0
  44. package/src/domain/embeddings/vectors.ts +53 -0
  45. package/src/domain/folder-index/constants.ts +9 -0
  46. package/src/domain/folder-index/display.ts +22 -0
  47. package/src/domain/folder-index/index.ts +5 -0
  48. package/src/domain/folder-index/listing.ts +58 -0
  49. package/src/domain/folder-index/render.ts +114 -0
  50. package/src/domain/folder-index/types.ts +41 -0
  51. package/src/domain/index.ts +22 -0
  52. package/src/domain/lifecycle/index.ts +2 -0
  53. package/src/domain/lifecycle/lifecycle.ts +39 -0
  54. package/src/domain/lifecycle/types.ts +17 -0
  55. package/src/domain/loaded-memory/budget.ts +14 -0
  56. package/src/domain/loaded-memory/constants.ts +9 -0
  57. package/src/domain/loaded-memory/index.ts +4 -0
  58. package/src/domain/loaded-memory/render.ts +30 -0
  59. package/src/domain/loaded-memory/types.ts +19 -0
  60. package/src/domain/memory/draft.ts +12 -0
  61. package/src/domain/memory/index.ts +4 -0
  62. package/src/domain/memory/schemas.ts +15 -0
  63. package/src/domain/memory/target.ts +27 -0
  64. package/src/domain/memory/types.ts +20 -0
  65. package/src/domain/memory-agent/index.ts +5 -0
  66. package/src/domain/memory-agent/input-problems.ts +9 -0
  67. package/src/domain/memory-agent/refusal.ts +6 -0
  68. package/src/domain/memory-agent/schemas.ts +112 -0
  69. package/src/domain/memory-agent/types.ts +25 -0
  70. package/src/domain/memory-agent/validate.ts +67 -0
  71. package/src/domain/names/constants.ts +32 -0
  72. package/src/domain/names/index.ts +2 -0
  73. package/src/domain/names/names.ts +83 -0
  74. package/src/domain/note/check.ts +68 -0
  75. package/src/domain/note/constants.ts +15 -0
  76. package/src/domain/note/frontmatter-fields.ts +175 -0
  77. package/src/domain/note/frontmatter.ts +138 -0
  78. package/src/domain/note/index.ts +9 -0
  79. package/src/domain/note/parse.ts +41 -0
  80. package/src/domain/note/render.ts +27 -0
  81. package/src/domain/note/schema-errors.ts +41 -0
  82. package/src/domain/note/schemas.ts +38 -0
  83. package/src/domain/note/types.ts +53 -0
  84. package/src/domain/note/validate.ts +19 -0
  85. package/src/domain/path-platform/index.ts +2 -0
  86. package/src/domain/path-platform/path-module.ts +11 -0
  87. package/src/domain/path-platform/types.ts +1 -0
  88. package/src/domain/search-catalog/constants.ts +1 -0
  89. package/src/domain/search-catalog/coverage.ts +35 -0
  90. package/src/domain/search-catalog/dont-forget.ts +10 -0
  91. package/src/domain/search-catalog/fingerprint.ts +9 -0
  92. package/src/domain/search-catalog/index.ts +10 -0
  93. package/src/domain/search-catalog/inspection.ts +47 -0
  94. package/src/domain/search-catalog/plan.ts +68 -0
  95. package/src/domain/search-catalog/ranking.ts +27 -0
  96. package/src/domain/search-catalog/schemas.ts +49 -0
  97. package/src/domain/search-catalog/types.ts +103 -0
  98. package/src/domain/search-catalog/vector-refresh.ts +22 -0
  99. package/src/domain/shell-edit/command-segments.ts +28 -0
  100. package/src/domain/shell-edit/command-words.ts +22 -0
  101. package/src/domain/shell-edit/constants.ts +125 -0
  102. package/src/domain/shell-edit/executed-files.ts +154 -0
  103. package/src/domain/shell-edit/index.ts +6 -0
  104. package/src/domain/shell-edit/powershell-files.ts +38 -0
  105. package/src/domain/shell-edit/rules.ts +19 -0
  106. package/src/domain/shell-edit/types.ts +75 -0
  107. package/src/domain/tool-flags/constants.ts +178 -0
  108. package/src/domain/tool-flags/index.ts +2 -0
  109. package/src/domain/tool-flags/types.ts +7 -0
  110. package/src/domain/validation/constants.ts +1 -0
  111. package/src/domain/validation/describe.ts +137 -0
  112. package/src/domain/validation/index.ts +3 -0
  113. package/src/domain/validation/types.ts +3 -0
  114. package/src/domain/vault-access/absolute-candidate.ts +81 -0
  115. package/src/domain/vault-access/argument-tokens.ts +22 -0
  116. package/src/domain/vault-access/command-mentions-vault.ts +115 -0
  117. package/src/domain/vault-access/constants.ts +54 -0
  118. package/src/domain/vault-access/index.ts +7 -0
  119. package/src/domain/vault-access/types.ts +18 -0
  120. package/src/domain/vault-access/vault-access-refusal.ts +36 -0
  121. package/src/domain/vault-access/vault-location.ts +22 -0
  122. package/src/domain/vault-assets/index.ts +2 -0
  123. package/src/domain/vault-assets/render.ts +51 -0
  124. package/src/domain/vault-assets/types.ts +36 -0
  125. package/src/domain/vault-catalog/analyze.ts +37 -0
  126. package/src/domain/vault-catalog/classify.ts +37 -0
  127. package/src/domain/vault-catalog/dont-forget.ts +6 -0
  128. package/src/domain/vault-catalog/export-entries.ts +10 -0
  129. package/src/domain/vault-catalog/index.ts +5 -0
  130. package/src/domain/vault-catalog/types.ts +114 -0
  131. package/src/domain/vault-diagnosis/diagnose.ts +79 -0
  132. package/src/domain/vault-diagnosis/index.ts +2 -0
  133. package/src/domain/vault-diagnosis/types.ts +31 -0
  134. package/src/domain/vault-path/constants.ts +13 -0
  135. package/src/domain/vault-path/index.ts +2 -0
  136. package/src/domain/vault-path/vault-path.ts +65 -0
  137. package/src/pi/capture/cadence.ts +49 -0
  138. package/src/pi/capture/completion.ts +26 -0
  139. package/src/pi/capture/constants.ts +5 -0
  140. package/src/pi/capture/handlers.ts +30 -0
  141. package/src/pi/capture/index.ts +8 -0
  142. package/src/pi/capture/runtime.ts +83 -0
  143. package/src/pi/capture/schemas.ts +8 -0
  144. package/src/pi/capture/tool-calls.ts +6 -0
  145. package/src/pi/capture/transcript.ts +55 -0
  146. package/src/pi/capture/types.ts +46 -0
  147. package/src/pi/change-report/constants.ts +15 -0
  148. package/src/pi/change-report/index.ts +3 -0
  149. package/src/pi/change-report/report.ts +54 -0
  150. package/src/pi/change-report/types.ts +8 -0
  151. package/src/pi/context/constants.ts +5 -0
  152. package/src/pi/context/index.ts +3 -0
  153. package/src/pi/context/status.ts +15 -0
  154. package/src/pi/context/types.ts +98 -0
  155. package/src/pi/extension.ts +100 -0
  156. package/src/pi/index.ts +26 -0
  157. package/src/pi/memory-add/constants.ts +13 -0
  158. package/src/pi/memory-add/index.ts +5 -0
  159. package/src/pi/memory-add/memory-add.ts +31 -0
  160. package/src/pi/memory-add/respond.ts +55 -0
  161. package/src/pi/memory-add/schemas.ts +29 -0
  162. package/src/pi/memory-add/types.ts +15 -0
  163. package/src/pi/memory-archive/constants.ts +8 -0
  164. package/src/pi/memory-archive/index.ts +4 -0
  165. package/src/pi/memory-archive/memory-archive.ts +29 -0
  166. package/src/pi/memory-archive/schemas.ts +15 -0
  167. package/src/pi/memory-archive/types.ts +8 -0
  168. package/src/pi/memory-block/block.ts +75 -0
  169. package/src/pi/memory-block/constants.ts +24 -0
  170. package/src/pi/memory-block/index.ts +4 -0
  171. package/src/pi/memory-block/render.ts +54 -0
  172. package/src/pi/memory-block/types.ts +24 -0
  173. package/src/pi/memory-doctor/constants.ts +43 -0
  174. package/src/pi/memory-doctor/index.ts +4 -0
  175. package/src/pi/memory-doctor/memory-doctor.ts +135 -0
  176. package/src/pi/memory-doctor/report.ts +101 -0
  177. package/src/pi/memory-doctor/types.ts +13 -0
  178. package/src/pi/memory-export/constants.ts +15 -0
  179. package/src/pi/memory-export/index.ts +4 -0
  180. package/src/pi/memory-export/memory-export.ts +57 -0
  181. package/src/pi/memory-export/name.ts +9 -0
  182. package/src/pi/memory-export/types.ts +4 -0
  183. package/src/pi/memory-get/constants.ts +12 -0
  184. package/src/pi/memory-get/index.ts +5 -0
  185. package/src/pi/memory-get/memory-get.ts +23 -0
  186. package/src/pi/memory-get/respond.ts +38 -0
  187. package/src/pi/memory-get/schemas.ts +13 -0
  188. package/src/pi/memory-get/types.ts +10 -0
  189. package/src/pi/memory-init/constants.ts +17 -0
  190. package/src/pi/memory-init/index.ts +2 -0
  191. package/src/pi/memory-init/memory-init.ts +63 -0
  192. package/src/pi/memory-search/constants.ts +16 -0
  193. package/src/pi/memory-search/index.ts +5 -0
  194. package/src/pi/memory-search/memory-search.ts +22 -0
  195. package/src/pi/memory-search/respond.ts +62 -0
  196. package/src/pi/memory-search/schemas.ts +11 -0
  197. package/src/pi/memory-search/types.ts +10 -0
  198. package/src/pi/memory-session/constants.ts +7 -0
  199. package/src/pi/memory-session/index.ts +4 -0
  200. package/src/pi/memory-session/keeper.ts +101 -0
  201. package/src/pi/memory-session/respond.ts +6 -0
  202. package/src/pi/memory-session/types.ts +23 -0
  203. package/src/pi/memory-settings/constants.ts +69 -0
  204. package/src/pi/memory-settings/edits.ts +46 -0
  205. package/src/pi/memory-settings/index.ts +9 -0
  206. package/src/pi/memory-settings/lines.ts +119 -0
  207. package/src/pi/memory-settings/models.ts +81 -0
  208. package/src/pi/memory-settings/projects.ts +46 -0
  209. package/src/pi/memory-settings/providers.ts +77 -0
  210. package/src/pi/memory-settings/save.ts +16 -0
  211. package/src/pi/memory-settings/screen.ts +27 -0
  212. package/src/pi/memory-settings/types.ts +87 -0
  213. package/src/pi/memory-setup/constants.ts +33 -0
  214. package/src/pi/memory-setup/disclosure.ts +22 -0
  215. package/src/pi/memory-setup/index.ts +4 -0
  216. package/src/pi/memory-setup/memory-setup.ts +153 -0
  217. package/src/pi/memory-setup/types.ts +6 -0
  218. package/src/pi/memory-succeed/constants.ts +10 -0
  219. package/src/pi/memory-succeed/index.ts +4 -0
  220. package/src/pi/memory-succeed/memory-succeed.ts +34 -0
  221. package/src/pi/memory-succeed/schemas.ts +30 -0
  222. package/src/pi/memory-succeed/types.ts +8 -0
  223. package/src/pi/memory-update/constants.ts +8 -0
  224. package/src/pi/memory-update/index.ts +4 -0
  225. package/src/pi/memory-update/memory-update.ts +29 -0
  226. package/src/pi/memory-update/schemas.ts +24 -0
  227. package/src/pi/memory-update/types.ts +8 -0
  228. package/src/pi/paths/constants.ts +7 -0
  229. package/src/pi/paths/index.ts +2 -0
  230. package/src/pi/paths/paths.ts +15 -0
  231. package/src/pi/paths/platform.ts +7 -0
  232. package/src/pi/registrar.ts +25 -0
  233. package/src/pi/registration-report/constants.ts +13 -0
  234. package/src/pi/registration-report/index.ts +2 -0
  235. package/src/pi/registration-report/report.ts +26 -0
  236. package/src/pi/relevant-memory/constants.ts +3 -0
  237. package/src/pi/relevant-memory/index.ts +4 -0
  238. package/src/pi/relevant-memory/prompt.ts +23 -0
  239. package/src/pi/relevant-memory/runtime.ts +88 -0
  240. package/src/pi/relevant-memory/types.ts +14 -0
  241. package/src/pi/semantic/constants.ts +3 -0
  242. package/src/pi/semantic/index.ts +2 -0
  243. package/src/pi/semantic/runtime.ts +59 -0
  244. package/src/pi/session-start/constants.ts +7 -0
  245. package/src/pi/session-start/index.ts +3 -0
  246. package/src/pi/session-start/session-start.ts +48 -0
  247. package/src/pi/session-start/types.ts +5 -0
  248. package/src/pi/shell-edit-guard/guard.ts +41 -0
  249. package/src/pi/shell-edit-guard/index.ts +3 -0
  250. package/src/pi/shell-edit-guard/prompt.ts +30 -0
  251. package/src/pi/shell-edit-guard/types.ts +13 -0
  252. package/src/pi/types.ts +44 -0
  253. package/src/pi/vault-guard/constants.ts +1 -0
  254. package/src/pi/vault-guard/index.ts +4 -0
  255. package/src/pi/vault-guard/request.ts +39 -0
  256. package/src/pi/vault-guard/types.ts +5 -0
  257. package/src/pi/vault-guard/vault-guard.ts +21 -0
  258. package/src/services/capture-cadence/domain-rules.ts +8 -0
  259. package/src/services/capture-cadence/index.ts +1 -0
  260. package/src/services/clock/clock.ts +7 -0
  261. package/src/services/clock/index.ts +1 -0
  262. package/src/services/config/canonicalize.ts +163 -0
  263. package/src/services/config/constants.ts +1 -0
  264. package/src/services/config/fully-qualified-path.ts +14 -0
  265. package/src/services/config/index.ts +12 -0
  266. package/src/services/config/path-identity.ts +65 -0
  267. package/src/services/config/publication.ts +75 -0
  268. package/src/services/config/read.ts +47 -0
  269. package/src/services/config/registration.ts +26 -0
  270. package/src/services/config/resolve-input.ts +27 -0
  271. package/src/services/config/snapshot.ts +26 -0
  272. package/src/services/config/target.ts +2 -0
  273. package/src/services/config/types.ts +97 -0
  274. package/src/services/config/vault-access.ts +2 -0
  275. package/src/services/config/volume-namespace.ts +5 -0
  276. package/src/services/config/write.ts +63 -0
  277. package/src/services/decision-model/constants.ts +16 -0
  278. package/src/services/decision-model/decide.ts +42 -0
  279. package/src/services/decision-model/diagnostics.ts +6 -0
  280. package/src/services/decision-model/endpoint.ts +1 -0
  281. package/src/services/decision-model/failure-detail.ts +1 -0
  282. package/src/services/decision-model/index.ts +7 -0
  283. package/src/services/decision-model/interruption.ts +29 -0
  284. package/src/services/decision-model/jev.ts +61 -0
  285. package/src/services/decision-model/laya-batch.ts +64 -0
  286. package/src/services/decision-model/laya-http-failure.ts +41 -0
  287. package/src/services/decision-model/laya-response.ts +95 -0
  288. package/src/services/decision-model/laya.ts +35 -0
  289. package/src/services/decision-model/preflight.ts +24 -0
  290. package/src/services/decision-model/prompts.ts +36 -0
  291. package/src/services/decision-model/schemas.ts +43 -0
  292. package/src/services/decision-model/score-candidates.ts +41 -0
  293. package/src/services/decision-model/types.ts +182 -0
  294. package/src/services/embeddings/asset-download.ts +45 -0
  295. package/src/services/embeddings/asset-fetch.ts +39 -0
  296. package/src/services/embeddings/asset-inspection.ts +36 -0
  297. package/src/services/embeddings/batch.ts +32 -0
  298. package/src/services/embeddings/chunks.ts +80 -0
  299. package/src/services/embeddings/configuration.ts +8 -0
  300. package/src/services/embeddings/constants.ts +24 -0
  301. package/src/services/embeddings/errors.ts +11 -0
  302. package/src/services/embeddings/google.ts +90 -0
  303. package/src/services/embeddings/http.ts +64 -0
  304. package/src/services/embeddings/index.ts +17 -0
  305. package/src/services/embeddings/inference.ts +35 -0
  306. package/src/services/embeddings/local.ts +138 -0
  307. package/src/services/embeddings/model-asset.ts +68 -0
  308. package/src/services/embeddings/model-cache.ts +30 -0
  309. package/src/services/embeddings/openai.ts +64 -0
  310. package/src/services/embeddings/operation.ts +31 -0
  311. package/src/services/embeddings/responses.ts +41 -0
  312. package/src/services/embeddings/runtime.ts +13 -0
  313. package/src/services/embeddings/schemas.ts +53 -0
  314. package/src/services/embeddings/types.ts +116 -0
  315. package/src/services/id/id.ts +5 -0
  316. package/src/services/id/index.ts +1 -0
  317. package/src/services/index.ts +11 -0
  318. package/src/services/llm/capture.ts +19 -0
  319. package/src/services/llm/check-chat-models.ts +38 -0
  320. package/src/services/llm/complete.ts +57 -0
  321. package/src/services/llm/constants.ts +32 -0
  322. package/src/services/llm/domain-rules.ts +2 -0
  323. package/src/services/llm/index.ts +6 -0
  324. package/src/services/llm/lifetime.ts +16 -0
  325. package/src/services/llm/retrieve.ts +19 -0
  326. package/src/services/llm/schemas.ts +9 -0
  327. package/src/services/llm/types.ts +94 -0
  328. package/src/services/search-index/catalog-query.ts +34 -0
  329. package/src/services/search-index/catalog-statements.ts +33 -0
  330. package/src/services/search-index/catalog.ts +19 -0
  331. package/src/services/search-index/cleanup.ts +13 -0
  332. package/src/services/search-index/close.ts +5 -0
  333. package/src/services/search-index/constants.ts +102 -0
  334. package/src/services/search-index/dont-forget.ts +1 -0
  335. package/src/services/search-index/fingerprint.ts +17 -0
  336. package/src/services/search-index/folder-index-statements.ts +17 -0
  337. package/src/services/search-index/folder-index-storage.ts +54 -0
  338. package/src/services/search-index/folder-indexes.ts +13 -0
  339. package/src/services/search-index/index.ts +14 -0
  340. package/src/services/search-index/inspection.ts +1 -0
  341. package/src/services/search-index/inventory.ts +67 -0
  342. package/src/services/search-index/legacy.ts +64 -0
  343. package/src/services/search-index/location.ts +12 -0
  344. package/src/services/search-index/open.ts +46 -0
  345. package/src/services/search-index/query.ts +39 -0
  346. package/src/services/search-index/ranking.ts +12 -0
  347. package/src/services/search-index/reconcile.ts +93 -0
  348. package/src/services/search-index/recovery.ts +56 -0
  349. package/src/services/search-index/refusals.ts +21 -0
  350. package/src/services/search-index/schema.ts +42 -0
  351. package/src/services/search-index/schemas.ts +181 -0
  352. package/src/services/search-index/search.ts +5 -0
  353. package/src/services/search-index/statements.ts +18 -0
  354. package/src/services/search-index/storage.ts +207 -0
  355. package/src/services/search-index/types.ts +113 -0
  356. package/src/services/search-index/vector-statements.ts +18 -0
  357. package/src/services/search-index/vector-storage.ts +169 -0
  358. package/src/services/search-index/vectors.ts +18 -0
  359. package/src/services/search-index/write.ts +9 -0
  360. package/src/services/shell-edit/ask.ts +53 -0
  361. package/src/services/shell-edit/domain-rules.ts +2 -0
  362. package/src/services/shell-edit/index.ts +4 -0
  363. package/src/services/shell-edit/schemas.ts +23 -0
  364. package/src/services/shell-edit/types.ts +61 -0
  365. package/src/services/shell-scripts/constants.ts +1 -0
  366. package/src/services/shell-scripts/files.ts +16 -0
  367. package/src/services/shell-scripts/index.ts +5 -0
  368. package/src/services/shell-scripts/package-scripts.ts +74 -0
  369. package/src/services/shell-scripts/schemas.ts +3 -0
  370. package/src/services/shell-scripts/scripts.ts +27 -0
  371. package/src/services/shell-scripts/types.ts +11 -0
  372. package/src/services/vault/archive.ts +31 -0
  373. package/src/services/vault/bootstrap/ensure.ts +50 -0
  374. package/src/services/vault/bootstrap/index.ts +2 -0
  375. package/src/services/vault/bootstrap/paths.ts +57 -0
  376. package/src/services/vault/bootstrap/types.ts +17 -0
  377. package/src/services/vault/bootstrap/write.ts +47 -0
  378. package/src/services/vault/catalog/bytes.ts +51 -0
  379. package/src/services/vault/catalog/dont-forget.ts +1 -0
  380. package/src/services/vault/catalog/enumerate.ts +69 -0
  381. package/src/services/vault/catalog/export.ts +21 -0
  382. package/src/services/vault/catalog/failures.ts +16 -0
  383. package/src/services/vault/catalog/index.ts +10 -0
  384. package/src/services/vault/catalog/inspect.ts +41 -0
  385. package/src/services/vault/catalog/observe.ts +35 -0
  386. package/src/services/vault/catalog/resolve.ts +94 -0
  387. package/src/services/vault/catalog/stat.ts +23 -0
  388. package/src/services/vault/catalog/types.ts +69 -0
  389. package/src/services/vault/catalog/visit.ts +58 -0
  390. package/src/services/vault/complete-blank.ts +66 -0
  391. package/src/services/vault/constants.ts +3 -0
  392. package/src/services/vault/context/index.ts +1 -0
  393. package/src/services/vault/context/types.ts +10 -0
  394. package/src/services/vault/create.ts +19 -0
  395. package/src/services/vault/display.ts +6 -0
  396. package/src/services/vault/domain-rules.ts +10 -0
  397. package/src/services/vault/draft.ts +2 -0
  398. package/src/services/vault/filesystem/failures.ts +53 -0
  399. package/src/services/vault/filesystem/hash.ts +5 -0
  400. package/src/services/vault/filesystem/index.ts +5 -0
  401. package/src/services/vault/filesystem/read.ts +61 -0
  402. package/src/services/vault/filesystem/types.ts +36 -0
  403. package/src/services/vault/filesystem/write.ts +80 -0
  404. package/src/services/vault/find.ts +27 -0
  405. package/src/services/vault/folder-contents.ts +31 -0
  406. package/src/services/vault/folder-index/index.ts +2 -0
  407. package/src/services/vault/folder-index/read.ts +87 -0
  408. package/src/services/vault/folder-index/types.ts +19 -0
  409. package/src/services/vault/folder-listing.ts +1 -0
  410. package/src/services/vault/index.ts +21 -0
  411. package/src/services/vault/inspect-folder.ts +13 -0
  412. package/src/services/vault/list.ts +121 -0
  413. package/src/services/vault/memory-folder.ts +24 -0
  414. package/src/services/vault/paths.ts +11 -0
  415. package/src/services/vault/publish.ts +52 -0
  416. package/src/services/vault/read.ts +46 -0
  417. package/src/services/vault/refresh-folders.ts +197 -0
  418. package/src/services/vault/refresh-plan.ts +79 -0
  419. package/src/services/vault/refresh.ts +8 -0
  420. package/src/services/vault/refusals.ts +23 -0
  421. package/src/services/vault/relocate.ts +131 -0
  422. package/src/services/vault/relocation-checks.ts +89 -0
  423. package/src/services/vault/resolve-stored-file.ts +43 -0
  424. package/src/services/vault/resolve.ts +109 -0
  425. package/src/services/vault/succeed.ts +45 -0
  426. package/src/services/vault/types.ts +199 -0
  427. package/src/services/vault/update-file.ts +58 -0
  428. package/src/services/vault/update.ts +22 -0
  429. package/src/services/vault/write-new-file.ts +37 -0
  430. package/src/shared/index.ts +1 -0
  431. package/src/shared/result/index.ts +1 -0
  432. package/src/shared/result/types.ts +17 -0
  433. package/src/usecases/add-memory/add-memory.ts +83 -0
  434. package/src/usecases/add-memory/index.ts +4 -0
  435. package/src/usecases/add-memory/maintenance.ts +23 -0
  436. package/src/usecases/add-memory/schemas.ts +12 -0
  437. package/src/usecases/add-memory/types.ts +47 -0
  438. package/src/usecases/archive-memory/archive-memory.ts +27 -0
  439. package/src/usecases/archive-memory/index.ts +3 -0
  440. package/src/usecases/archive-memory/schemas.ts +11 -0
  441. package/src/usecases/archive-memory/types.ts +17 -0
  442. package/src/usecases/capture-memory/apply.ts +73 -0
  443. package/src/usecases/capture-memory/capture-memory.ts +117 -0
  444. package/src/usecases/capture-memory/constants.ts +15 -0
  445. package/src/usecases/capture-memory/index.ts +5 -0
  446. package/src/usecases/capture-memory/observe.ts +122 -0
  447. package/src/usecases/capture-memory/settings.ts +20 -0
  448. package/src/usecases/capture-memory/types.ts +103 -0
  449. package/src/usecases/check-shell-edit/check-shell-edit.ts +28 -0
  450. package/src/usecases/check-shell-edit/index.ts +2 -0
  451. package/src/usecases/check-shell-edit/types.ts +30 -0
  452. package/src/usecases/check-vault-access/check-vault-access.ts +23 -0
  453. package/src/usecases/check-vault-access/constants.ts +7 -0
  454. package/src/usecases/check-vault-access/index.ts +4 -0
  455. package/src/usecases/check-vault-access/raw-device.ts +10 -0
  456. package/src/usecases/check-vault-access/targets.ts +49 -0
  457. package/src/usecases/check-vault-access/types.ts +33 -0
  458. package/src/usecases/complete-blank-memory/complete-blank-memory.ts +48 -0
  459. package/src/usecases/complete-blank-memory/constants.ts +3 -0
  460. package/src/usecases/complete-blank-memory/index.ts +4 -0
  461. package/src/usecases/complete-blank-memory/schemas.ts +14 -0
  462. package/src/usecases/complete-blank-memory/types.ts +28 -0
  463. package/src/usecases/diagnose-memory/constants.ts +3 -0
  464. package/src/usecases/diagnose-memory/decision.ts +36 -0
  465. package/src/usecases/diagnose-memory/diagnose-memory.ts +52 -0
  466. package/src/usecases/diagnose-memory/embeddings.ts +39 -0
  467. package/src/usecases/diagnose-memory/index.ts +5 -0
  468. package/src/usecases/diagnose-memory/types.ts +86 -0
  469. package/src/usecases/diagnose-memory/vault.ts +33 -0
  470. package/src/usecases/export-memory/collect.ts +20 -0
  471. package/src/usecases/export-memory/constants.ts +3 -0
  472. package/src/usecases/export-memory/export-memory.ts +84 -0
  473. package/src/usecases/export-memory/index.ts +3 -0
  474. package/src/usecases/export-memory/types.ts +28 -0
  475. package/src/usecases/get-memory/get-memory.ts +97 -0
  476. package/src/usecases/get-memory/index.ts +2 -0
  477. package/src/usecases/get-memory/types.ts +25 -0
  478. package/src/usecases/index.ts +25 -0
  479. package/src/usecases/list-memory/index.ts +2 -0
  480. package/src/usecases/list-memory/leased/index.ts +2 -0
  481. package/src/usecases/list-memory/leased/read.ts +16 -0
  482. package/src/usecases/list-memory/leased/types.ts +21 -0
  483. package/src/usecases/list-memory/list-memory.ts +33 -0
  484. package/src/usecases/list-memory/types.ts +8 -0
  485. package/src/usecases/load-dont-forget/index.ts +2 -0
  486. package/src/usecases/load-dont-forget/load-dont-forget.ts +111 -0
  487. package/src/usecases/load-dont-forget/types.ts +26 -0
  488. package/src/usecases/memory-change/change.ts +42 -0
  489. package/src/usecases/memory-change/index.ts +5 -0
  490. package/src/usecases/memory-change/maintenance.ts +11 -0
  491. package/src/usecases/memory-change/partial.ts +18 -0
  492. package/src/usecases/memory-change/receipt.ts +40 -0
  493. package/src/usecases/memory-change/types.ts +44 -0
  494. package/src/usecases/operation-context/context.ts +37 -0
  495. package/src/usecases/operation-context/index.ts +2 -0
  496. package/src/usecases/operation-context/types.ts +19 -0
  497. package/src/usecases/registration/check.ts +6 -0
  498. package/src/usecases/registration/entry.ts +33 -0
  499. package/src/usecases/registration/index.ts +8 -0
  500. package/src/usecases/registration/init.ts +94 -0
  501. package/src/usecases/registration/prepare-init.ts +43 -0
  502. package/src/usecases/registration/prepare.ts +35 -0
  503. package/src/usecases/registration/propose.ts +34 -0
  504. package/src/usecases/registration/publication.ts +90 -0
  505. package/src/usecases/registration/setup.ts +41 -0
  506. package/src/usecases/registration/types.ts +107 -0
  507. package/src/usecases/relevant-memory/agent.ts +55 -0
  508. package/src/usecases/relevant-memory/constants.ts +28 -0
  509. package/src/usecases/relevant-memory/cutoffs.ts +29 -0
  510. package/src/usecases/relevant-memory/decision.ts +102 -0
  511. package/src/usecases/relevant-memory/index.ts +11 -0
  512. package/src/usecases/relevant-memory/loaded.ts +31 -0
  513. package/src/usecases/relevant-memory/refresh.ts +30 -0
  514. package/src/usecases/relevant-memory/retrieve-memory.ts +62 -0
  515. package/src/usecases/relevant-memory/schemas.ts +20 -0
  516. package/src/usecases/relevant-memory/session-memory.ts +53 -0
  517. package/src/usecases/relevant-memory/track-dont-forget.ts +13 -0
  518. package/src/usecases/relevant-memory/types.ts +106 -0
  519. package/src/usecases/resolve-memory/index.ts +2 -0
  520. package/src/usecases/resolve-memory/leased/index.ts +2 -0
  521. package/src/usecases/resolve-memory/leased/resolve.ts +109 -0
  522. package/src/usecases/resolve-memory/leased/types.ts +35 -0
  523. package/src/usecases/resolve-memory/resolve-memory.ts +23 -0
  524. package/src/usecases/resolve-memory/types.ts +7 -0
  525. package/src/usecases/search-memory/constants.ts +1 -0
  526. package/src/usecases/search-memory/index.ts +3 -0
  527. package/src/usecases/search-memory/search-memory.ts +132 -0
  528. package/src/usecases/search-memory/types.ts +39 -0
  529. package/src/usecases/semantic/constants.ts +7 -0
  530. package/src/usecases/semantic/index.ts +5 -0
  531. package/src/usecases/semantic/prepare.ts +30 -0
  532. package/src/usecases/semantic/rank.ts +83 -0
  533. package/src/usecases/semantic/refresh-vectors.ts +95 -0
  534. package/src/usecases/semantic/types.ts +17 -0
  535. package/src/usecases/semantic-port/index.ts +1 -0
  536. package/src/usecases/semantic-port/types.ts +20 -0
  537. package/src/usecases/semantic-provider/constants.ts +6 -0
  538. package/src/usecases/semantic-provider/index.ts +5 -0
  539. package/src/usecases/semantic-provider/local.ts +33 -0
  540. package/src/usecases/semantic-provider/remote.ts +10 -0
  541. package/src/usecases/semantic-provider/size.ts +10 -0
  542. package/src/usecases/semantic-provider/types.ts +19 -0
  543. package/src/usecases/session/index.ts +2 -0
  544. package/src/usecases/session/lease.ts +70 -0
  545. package/src/usecases/session/receipts.ts +46 -0
  546. package/src/usecases/session/state.ts +106 -0
  547. package/src/usecases/session/types.ts +45 -0
  548. package/src/usecases/settings/change.ts +142 -0
  549. package/src/usecases/settings/index.ts +3 -0
  550. package/src/usecases/settings/prepare.ts +24 -0
  551. package/src/usecases/settings/types.ts +32 -0
  552. package/src/usecases/succeed-memory/index.ts +3 -0
  553. package/src/usecases/succeed-memory/schemas.ts +13 -0
  554. package/src/usecases/succeed-memory/succeed-memory.ts +34 -0
  555. package/src/usecases/succeed-memory/types.ts +18 -0
  556. package/src/usecases/synchronize-memory/index.ts +2 -0
  557. package/src/usecases/synchronize-memory/leased/aliases.ts +55 -0
  558. package/src/usecases/synchronize-memory/leased/folder-states.ts +58 -0
  559. package/src/usecases/synchronize-memory/leased/index.ts +2 -0
  560. package/src/usecases/synchronize-memory/leased/inspection.ts +32 -0
  561. package/src/usecases/synchronize-memory/leased/maintenance.ts +41 -0
  562. package/src/usecases/synchronize-memory/leased/publication.ts +55 -0
  563. package/src/usecases/synchronize-memory/leased/scan.ts +37 -0
  564. package/src/usecases/synchronize-memory/leased/synchronize.ts +102 -0
  565. package/src/usecases/synchronize-memory/leased/types.ts +60 -0
  566. package/src/usecases/synchronize-memory/synchronize-memory.ts +26 -0
  567. package/src/usecases/synchronize-memory/types.ts +5 -0
  568. package/src/usecases/update-memory/index.ts +3 -0
  569. package/src/usecases/update-memory/schemas.ts +14 -0
  570. package/src/usecases/update-memory/types.ts +16 -0
  571. package/src/usecases/update-memory/update-memory.ts +31 -0
  572. package/CHANGELOG.md +0 -6
@@ -0,0 +1,153 @@
1
+ import type { MemoryCommand, MemoryPaths, MemoryPiContext } from "#src/pi/context"
2
+ import type { MemorySessionKeeper } from "#src/pi/memory-session"
3
+ import { type CurrentModel, chooseModel, RELOAD_NOTE, runSettingsScreen } from "#src/pi/memory-settings"
4
+ import { describeRegistered, describeRegistrationFailure } from "#src/pi/registration-report"
5
+ import {
6
+ type ConfigRepairDraft,
7
+ prepareMemorySettings,
8
+ prepareMemorySetup,
9
+ proposeMemorySetup,
10
+ type RegistrationContext,
11
+ type SetupPreparation,
12
+ type SetupVaultMode,
13
+ setupMemory,
14
+ } from "#src/usecases"
15
+ import {
16
+ MEMORY_SETUP_DESCRIPTION,
17
+ REPAIR_CONFIRM_LINE,
18
+ REPAIR_TITLE,
19
+ REPLACE_LINE,
20
+ SETUP_AGENT_MODEL_TITLE,
21
+ SETUP_ATTACH_OPTION,
22
+ SETUP_CANCELLED,
23
+ SETUP_CAPTURE_MODEL_TITLE,
24
+ SETUP_CREATE_OPTION,
25
+ SETUP_DONE,
26
+ SETUP_KEEP_VAULT_TITLE,
27
+ SETUP_MODE_TITLE,
28
+ SETUP_NO_MODEL,
29
+ SETUP_VAULT_PLACEHOLDER,
30
+ SETUP_VAULT_TITLE,
31
+ } from "./constants.ts"
32
+ import { disclosureText } from "./disclosure.ts"
33
+ import type { VaultStep } from "./types.ts"
34
+
35
+ export function memorySetupCommand(paths: MemoryPaths, sessions: MemorySessionKeeper): MemoryCommand {
36
+ return {
37
+ description: MEMORY_SETUP_DESCRIPTION,
38
+ async handler(_args, ctx) {
39
+ if (!ctx.hasUI) return
40
+ const { registration } = sessions.registrationFlow(ctx, paths)
41
+ await runMemorySetup(ctx, registration)
42
+ },
43
+ }
44
+ }
45
+
46
+ async function runMemorySetup(ctx: MemoryPiContext, registration: RegistrationContext): Promise<void> {
47
+ const settings = await prepareMemorySettings(registration)
48
+ if (settings.succeeded) {
49
+ await runSettingsScreen(ctx, { registration, changeGlobalVault: (context) => changeVault(ctx, context) })
50
+ return
51
+ }
52
+ await runFirstSetup(ctx, registration)
53
+ }
54
+
55
+ async function runFirstSetup(ctx: MemoryPiContext, registration: RegistrationContext): Promise<void> {
56
+ const preparation = await prepareSetup(ctx, registration)
57
+ if (!preparation) return
58
+ if (!(await confirmRepair(ctx, preparation.draft))) return cancelled(ctx)
59
+ if (noModelToChoose(ctx, preparation.draft)) return
60
+ const draft = await chooseModels(ctx, preparation.draft)
61
+ if (!draft) return cancelled(ctx)
62
+ await commitVault(ctx, registration, { snapshot: preparation.snapshot, draft })
63
+ }
64
+
65
+ async function changeVault(ctx: MemoryPiContext, registration: RegistrationContext): Promise<void> {
66
+ const preparation = await prepareSetup(ctx, registration)
67
+ if (!preparation) return
68
+ await commitVault(ctx, registration, preparation)
69
+ }
70
+
71
+ async function commitVault(
72
+ ctx: MemoryPiContext,
73
+ registration: RegistrationContext,
74
+ preparation: VaultStep,
75
+ ): Promise<void> {
76
+ const { snapshot, draft } = preparation
77
+ const mode = await askMode(ctx, draft)
78
+ if (!mode) return cancelled(ctx)
79
+ const vault = await askVault(ctx, draft)
80
+ if (typeof vault !== "string") return cancelled(ctx)
81
+ const proposal = await proposeMemorySetup({ draft, vault, mode }, registration)
82
+ if (!proposal.succeeded) return ctx.ui.notify(proposal.problems.join("\n"), "error")
83
+ ctx.ui.notify(disclosureText(proposal.output.disclosures), "warning")
84
+ const result = await setupMemory(
85
+ {
86
+ config: proposal.output.config,
87
+ expectedHash: snapshot.hash,
88
+ replacementConfirmed: draft.replacementRequired,
89
+ },
90
+ registration,
91
+ )
92
+ if (!result.succeeded) return ctx.ui.notify(describeRegistrationFailure(result), "error")
93
+ const saved = describeRegistered(`${SETUP_DONE} ${proposal.output.config.global.vault}`, result.output)
94
+ ctx.ui.notify(`${saved}\n${RELOAD_NOTE}`, "info")
95
+ }
96
+
97
+ function cancelled(ctx: MemoryPiContext): void {
98
+ ctx.ui.notify(SETUP_CANCELLED, "info")
99
+ }
100
+
101
+ async function prepareSetup(ctx: MemoryPiContext, registration: RegistrationContext): Promise<SetupPreparation | null> {
102
+ const preparation = await prepareMemorySetup({ selectedModel: null }, registration)
103
+ if (!preparation.succeeded) {
104
+ ctx.ui.notify(preparation.problems.join("\n"), "error")
105
+ return null
106
+ }
107
+ return preparation.output
108
+ }
109
+
110
+ function modelResolved(model: ConfigRepairDraft["capture"]["model"]): boolean {
111
+ return typeof model.provider === "string" && typeof model.id === "string"
112
+ }
113
+
114
+ function noModelToChoose(ctx: MemoryPiContext, draft: ConfigRepairDraft): boolean {
115
+ if (ctx.modelRegistry.getAvailable().length > 0) return false
116
+ if (modelResolved(draft.capture.model) && modelResolved(draft.memoryAgent.model)) return false
117
+ ctx.ui.notify(SETUP_NO_MODEL, "error")
118
+ return true
119
+ }
120
+
121
+ function inUseOf(ctx: MemoryPiContext): CurrentModel {
122
+ if (!ctx.model) return {}
123
+ return { provider: ctx.model.provider, id: ctx.model.id }
124
+ }
125
+
126
+ async function chooseModels(ctx: MemoryPiContext, draft: ConfigRepairDraft): Promise<ConfigRepairDraft | null> {
127
+ const capture = await chooseModel(ctx, SETUP_CAPTURE_MODEL_TITLE, draft.capture.model, inUseOf(ctx))
128
+ if (!capture) return null
129
+ const agent = await chooseModel(ctx, SETUP_AGENT_MODEL_TITLE, draft.memoryAgent.model, {})
130
+ if (!agent) return null
131
+ return { ...draft, capture: { ...draft.capture, model: capture }, memoryAgent: { model: agent } }
132
+ }
133
+
134
+ async function confirmRepair(ctx: MemoryPiContext, draft: ConfigRepairDraft): Promise<boolean> {
135
+ if (draft.problems.length === 0 && !draft.replacementRequired) return true
136
+ const lines = draft.problems.map((problem) => `- ${problem}`)
137
+ if (draft.replacementRequired) lines.push(REPLACE_LINE)
138
+ return ctx.ui.confirm(REPAIR_TITLE, [...lines, REPAIR_CONFIRM_LINE].join("\n"))
139
+ }
140
+
141
+ async function askMode(ctx: MemoryPiContext, draft: ConfigRepairDraft): Promise<SetupVaultMode | null> {
142
+ let options = [SETUP_CREATE_OPTION, SETUP_ATTACH_OPTION]
143
+ if (draft.global.vault) options = [SETUP_ATTACH_OPTION, SETUP_CREATE_OPTION]
144
+ const answer = await ctx.ui.select(SETUP_MODE_TITLE, options)
145
+ if (answer === SETUP_CREATE_OPTION) return "create"
146
+ if (answer === SETUP_ATTACH_OPTION) return "attach"
147
+ return null
148
+ }
149
+
150
+ function askVault(ctx: MemoryPiContext, draft: ConfigRepairDraft): Promise<string | undefined> {
151
+ if (draft.global.vault) return ctx.ui.input(SETUP_KEEP_VAULT_TITLE, draft.global.vault)
152
+ return ctx.ui.input(SETUP_VAULT_TITLE, SETUP_VAULT_PLACEHOLDER)
153
+ }
@@ -0,0 +1,6 @@
1
+ import type { ConfigRepairDraft, SetupPreparation } from "#src/usecases"
2
+
3
+ export interface VaultStep {
4
+ snapshot: SetupPreparation["snapshot"]
5
+ draft: ConfigRepairDraft
6
+ }
@@ -0,0 +1,10 @@
1
+ export const MEMORY_SUCCEED_TOOL_NAME = "memory_succeed"
2
+
3
+ export const MEMORY_SUCCEED_TOOL_LABEL = "Memory succeed"
4
+
5
+ export const MEMORY_SUCCEED_TOOL_DESCRIPTION =
6
+ "Use only when the user explicitly asks to replace a memory that stopped being true or was resolved. Read it with memory_get first."
7
+
8
+ export const REPLACED_PREFIX = "Replaced in"
9
+
10
+ export const NEW_NOTE_LABEL = "new note:"
@@ -0,0 +1,4 @@
1
+ export * from "./constants.ts"
2
+ export * from "./memory-succeed.ts"
3
+ export * from "./schemas.ts"
4
+ export * from "./types.ts"
@@ -0,0 +1,34 @@
1
+ import { type ChangeResponse, reportFailure, reportSuccess } from "#src/pi/change-report"
2
+ import type { MemoryPaths } from "#src/pi/context"
3
+ import { type MemorySessionKeeper, noSessionResponse } from "#src/pi/memory-session"
4
+ import { succeedMemory } from "#src/usecases"
5
+ import {
6
+ MEMORY_SUCCEED_TOOL_DESCRIPTION,
7
+ MEMORY_SUCCEED_TOOL_LABEL,
8
+ MEMORY_SUCCEED_TOOL_NAME,
9
+ NEW_NOTE_LABEL,
10
+ REPLACED_PREFIX,
11
+ } from "./constants.ts"
12
+ import { MemorySucceedParamsSchema } from "./schemas.ts"
13
+ import type { MemorySucceedTool } from "./types.ts"
14
+
15
+ export function memorySucceedTool(paths: MemoryPaths, sessions: MemorySessionKeeper): MemorySucceedTool {
16
+ return {
17
+ name: MEMORY_SUCCEED_TOOL_NAME,
18
+ label: MEMORY_SUCCEED_TOOL_LABEL,
19
+ description: MEMORY_SUCCEED_TOOL_DESCRIPTION,
20
+ parameters: MemorySucceedParamsSchema,
21
+ async execute(_toolCallId, params, signal, _onUpdate, ctx): Promise<ChangeResponse> {
22
+ const context = sessions.currentOperation(ctx.cwd, paths, signal)
23
+ if (!context) return noSessionResponse()
24
+ const { vault, path, folder, statement, type, body, dontForget } = params
25
+ const result = await succeedMemory({ vault, path, folder, draft: { statement, type, body, dontForget } }, context)
26
+ if (!result.succeeded) return reportFailure(result, path)
27
+ const { archivedPath, successorPath, maintenanceProblems } = result.output
28
+ return reportSuccess(
29
+ `${REPLACED_PREFIX} ${result.output.vault}: ${archivedPath}; ${NEW_NOTE_LABEL} ${successorPath}`,
30
+ maintenanceProblems,
31
+ )
32
+ },
33
+ }
34
+ }
@@ -0,0 +1,30 @@
1
+ import Type from "typebox"
2
+
3
+ import { SucceedMemoryRequestSchema } from "#src/usecases"
4
+
5
+ export const MemorySucceedParamsSchema = Type.Object(
6
+ {
7
+ vault: Type.With(SucceedMemoryRequestSchema.properties.vault, {
8
+ description: "global: about the user. project: about this project. The vault the old note was read from.",
9
+ }),
10
+ path: Type.With(SucceedMemoryRequestSchema.properties.path, {
11
+ description: "The old note's path, exactly as read with memory_get.",
12
+ }),
13
+ folder: Type.With(SucceedMemoryRequestSchema.properties.folder, {
14
+ description: "Subject folder of the new note, in English, from general to specific. Reuse a folder that exists.",
15
+ }),
16
+ statement: Type.With(SucceedMemoryRequestSchema.properties.draft.properties.statement, {
17
+ description: "The new note's name, in English: one short statement saying what is true now.",
18
+ }),
19
+ type: Type.With(SucceedMemoryRequestSchema.properties.draft.properties.type, {
20
+ description: "The kind of memory of the new note.",
21
+ }),
22
+ body: Type.With(SucceedMemoryRequestSchema.properties.draft.properties.body, {
23
+ description: "The full detail of the new note, in English. Never empty.",
24
+ }),
25
+ dontForget: Type.With(SucceedMemoryRequestSchema.properties.draft.properties.dontForget, {
26
+ description: "true only when the new note must be loaded in every session.",
27
+ }),
28
+ },
29
+ { additionalProperties: false },
30
+ )
@@ -0,0 +1,8 @@
1
+ import type { ToolDefinition } from "@earendil-works/pi-coding-agent"
2
+ import type { Static } from "typebox"
3
+
4
+ import type { MemorySucceedParamsSchema } from "./schemas.ts"
5
+
6
+ export type MemorySucceedParams = Static<typeof MemorySucceedParamsSchema>
7
+
8
+ export type MemorySucceedTool = ToolDefinition<typeof MemorySucceedParamsSchema, undefined>
@@ -0,0 +1,8 @@
1
+ export const MEMORY_UPDATE_TOOL_NAME = "memory_update"
2
+
3
+ export const MEMORY_UPDATE_TOOL_LABEL = "Memory update"
4
+
5
+ export const MEMORY_UPDATE_TOOL_DESCRIPTION =
6
+ "Use only when the user explicitly asks to change a memory. Read it with memory_get first."
7
+
8
+ export const UPDATED_PREFIX = "Updated in"
@@ -0,0 +1,4 @@
1
+ export * from "./constants.ts"
2
+ export * from "./memory-update.ts"
3
+ export * from "./schemas.ts"
4
+ export * from "./types.ts"
@@ -0,0 +1,29 @@
1
+ import { type ChangeResponse, reportFailure, reportSuccess } from "#src/pi/change-report"
2
+ import type { MemoryPaths } from "#src/pi/context"
3
+ import { type MemorySessionKeeper, noSessionResponse } from "#src/pi/memory-session"
4
+ import { updateMemory } from "#src/usecases"
5
+ import {
6
+ MEMORY_UPDATE_TOOL_DESCRIPTION,
7
+ MEMORY_UPDATE_TOOL_LABEL,
8
+ MEMORY_UPDATE_TOOL_NAME,
9
+ UPDATED_PREFIX,
10
+ } from "./constants.ts"
11
+ import { MemoryUpdateParamsSchema } from "./schemas.ts"
12
+ import type { MemoryUpdateTool } from "./types.ts"
13
+
14
+ export function memoryUpdateTool(paths: MemoryPaths, sessions: MemorySessionKeeper): MemoryUpdateTool {
15
+ return {
16
+ name: MEMORY_UPDATE_TOOL_NAME,
17
+ label: MEMORY_UPDATE_TOOL_LABEL,
18
+ description: MEMORY_UPDATE_TOOL_DESCRIPTION,
19
+ parameters: MemoryUpdateParamsSchema,
20
+ async execute(_toolCallId, params, signal, _onUpdate, ctx): Promise<ChangeResponse> {
21
+ const context = sessions.currentOperation(ctx.cwd, paths, signal)
22
+ if (!context) return noSessionResponse()
23
+ const result = await updateMemory(params, context)
24
+ if (!result.succeeded) return reportFailure(result, params.path)
25
+ const { vault, path, maintenanceProblems } = result.output
26
+ return reportSuccess(`${UPDATED_PREFIX} ${vault}: ${path}`, maintenanceProblems)
27
+ },
28
+ }
29
+ }
@@ -0,0 +1,24 @@
1
+ import Type from "typebox"
2
+
3
+ import { UpdateMemoryRequestSchema } from "#src/usecases"
4
+
5
+ export const MemoryUpdateParamsSchema = Type.Object(
6
+ {
7
+ vault: Type.With(UpdateMemoryRequestSchema.properties.vault, {
8
+ description: "global: about the user. project: about this project. The vault the note was read from.",
9
+ }),
10
+ path: Type.With(UpdateMemoryRequestSchema.properties.path, {
11
+ description: "The note's path, exactly as read with memory_get. A new name needs a new note, not an update.",
12
+ }),
13
+ body: Type.With(UpdateMemoryRequestSchema.properties.body, {
14
+ description: "The full new body, in English. Never empty.",
15
+ }),
16
+ type: Type.With(UpdateMemoryRequestSchema.properties.type, {
17
+ description: "Only when the kind of memory changes; leave out to keep it.",
18
+ }),
19
+ dontForget: Type.With(UpdateMemoryRequestSchema.properties.dontForget, {
20
+ description: "true to load it in every session, false to stop; leave out to keep it.",
21
+ }),
22
+ },
23
+ { additionalProperties: false },
24
+ )
@@ -0,0 +1,8 @@
1
+ import type { ToolDefinition } from "@earendil-works/pi-coding-agent"
2
+ import type { Static } from "typebox"
3
+
4
+ import type { MemoryUpdateParamsSchema } from "./schemas.ts"
5
+
6
+ export type MemoryUpdateParams = Static<typeof MemoryUpdateParamsSchema>
7
+
8
+ export type MemoryUpdateTool = ToolDefinition<typeof MemoryUpdateParamsSchema, undefined>
@@ -0,0 +1,7 @@
1
+ export const MEMORY_FOLDER_NAME = "pi-obsidian-memory"
2
+
3
+ export const CONFIG_FILE_NAME = "config.json"
4
+
5
+ export const INDEX_FOLDER_NAME = "index"
6
+
7
+ export const MODEL_FOLDER_NAME = "models"
@@ -0,0 +1,2 @@
1
+ export * from "./paths.ts"
2
+ export * from "./platform.ts"
@@ -0,0 +1,15 @@
1
+ import { join } from "node:path"
2
+
3
+ import { CONFIG_FILE_NAME, INDEX_FOLDER_NAME, MEMORY_FOLDER_NAME, MODEL_FOLDER_NAME } from "./constants.ts"
4
+
5
+ export function memoryConfigPath(agentDir: string): string {
6
+ return join(agentDir, MEMORY_FOLDER_NAME, CONFIG_FILE_NAME)
7
+ }
8
+
9
+ export function memoryModelCachePath(agentDir: string): string {
10
+ return join(agentDir, MEMORY_FOLDER_NAME, MODEL_FOLDER_NAME)
11
+ }
12
+
13
+ export function memoryIndexPath(agentDir: string): string {
14
+ return join(agentDir, MEMORY_FOLDER_NAME, INDEX_FOLDER_NAME)
15
+ }
@@ -0,0 +1,7 @@
1
+ import type { PathPlatform } from "#src/usecases"
2
+
3
+ export function hostPathPlatform(host: NodeJS.Platform): PathPlatform {
4
+ if (host === "win32") return "win32"
5
+ if (host === "darwin") return "darwin"
6
+ return "linux"
7
+ }
@@ -0,0 +1,25 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent"
2
+
3
+ import { CURSOR_TYPE } from "#src/pi/capture"
4
+ import type { ExtensionRegistrar } from "./types.ts"
5
+
6
+ export function registrarFor(pi: ExtensionAPI): ExtensionRegistrar {
7
+ return {
8
+ registerAddTool: (tool) => pi.registerTool(tool),
9
+ registerSearchTool: (tool) => pi.registerTool(tool),
10
+ registerGetTool: (tool) => pi.registerTool(tool),
11
+ registerUpdateTool: (tool) => pi.registerTool(tool),
12
+ registerArchiveTool: (tool) => pi.registerTool(tool),
13
+ registerSucceedTool: (tool) => pi.registerTool(tool),
14
+ registerCommand: (name, command) => pi.registerCommand(name, command),
15
+ onSessionStart: (handler) => pi.on("session_start", handler),
16
+ onBeforeAgentStart: (handler) => pi.on("before_agent_start", handler),
17
+ onToolCall: (handler) => pi.on("tool_call", handler),
18
+ onShellToolCall: (handler) => pi.on("tool_call", handler),
19
+ onMessageEnd: (handler) => pi.on("message_end", handler),
20
+ onTurnEnd: (handler) => pi.on("turn_end", handler),
21
+ onBeforeCompact: (handler) => pi.on("session_before_compact", handler),
22
+ appendCursor: (data) => pi.appendEntry(CURSOR_TYPE, data),
23
+ onSessionShutdown: (handler) => pi.on("session_shutdown", handler),
24
+ }
25
+ }
@@ -0,0 +1,13 @@
1
+ export const VAULT_CREATED_LINE = "Vault folder created."
2
+
3
+ export const CREATED_HEADING = "Created:"
4
+
5
+ export const PRESERVED_HEADING = "Kept as they were:"
6
+
7
+ export const WARNINGS_HEADING = "Warnings:"
8
+
9
+ export const PROBLEMS_HEADING = "Not changed. Problems:"
10
+
11
+ export const BOOTSTRAP_STAGE_LINE = "Stopped while preparing the vault; the config was not written."
12
+
13
+ export const CONFIG_STAGE_LINE = "The vault is ready but the config was not written."
@@ -0,0 +1,2 @@
1
+ export * from "./constants.ts"
2
+ export * from "./report.ts"
@@ -0,0 +1,26 @@
1
+ import type { RegistrationFailure, RegistrationOutcome } from "#src/usecases"
2
+ import {
3
+ BOOTSTRAP_STAGE_LINE,
4
+ CONFIG_STAGE_LINE,
5
+ CREATED_HEADING,
6
+ PRESERVED_HEADING,
7
+ PROBLEMS_HEADING,
8
+ VAULT_CREATED_LINE,
9
+ WARNINGS_HEADING,
10
+ } from "./constants.ts"
11
+
12
+ export function describeRegistered(headline: string, outcome: RegistrationOutcome): string {
13
+ const lines = [headline]
14
+ if (outcome.assets.createdRoot) lines.push(VAULT_CREATED_LINE)
15
+ if (outcome.assets.created.length > 0) lines.push(`${CREATED_HEADING} ${outcome.assets.created.join(", ")}`)
16
+ if (outcome.assets.preserved.length > 0) lines.push(`${PRESERVED_HEADING} ${outcome.assets.preserved.join(", ")}`)
17
+ if (outcome.warnings.length > 0) lines.push(WARNINGS_HEADING, ...outcome.warnings.map((warning) => `- ${warning}`))
18
+ return lines.join("\n")
19
+ }
20
+
21
+ export function describeRegistrationFailure(failure: RegistrationFailure): string {
22
+ const lines = [PROBLEMS_HEADING, ...failure.problems.map((problem) => `- ${problem}`)]
23
+ if (failure.stage === "bootstrap") lines.push(BOOTSTRAP_STAGE_LINE)
24
+ if (failure.stage === "config") lines.push(CONFIG_STAGE_LINE)
25
+ return lines.join("\n")
26
+ }
@@ -0,0 +1,3 @@
1
+ export const RELEVANT_MESSAGE_TYPE = "obsidian-memory-relevant"
2
+
3
+ export const JEV_MISSING = "pi has no Jev model (typesafe jev-latest) in its catalog"
@@ -0,0 +1,4 @@
1
+ export * from "./constants.ts"
2
+ export * from "./prompt.ts"
3
+ export * from "./runtime.ts"
4
+ export * from "./types.ts"
@@ -0,0 +1,23 @@
1
+ import type { ClassifierPrompt } from "#src/pi/context"
2
+ import type { JevPrompt, JevQuestion } from "./types.ts"
3
+
4
+ function questionOf(question: JevQuestion) {
5
+ return {
6
+ type: question.type,
7
+ instructions: question.instructions,
8
+ criteria: { true: question.criteria.true, false: question.criteria.false },
9
+ }
10
+ }
11
+
12
+ function stateOf(state: JevPrompt["state"]) {
13
+ if ("candidate" in state) {
14
+ return { message: state.message, candidate: { statement: state.candidate.statement, body: state.candidate.body } }
15
+ }
16
+ return { message: state.message, project: state.project, folder: state.folder }
17
+ }
18
+
19
+ export function classifierPrompt(prompt: JevPrompt): ClassifierPrompt {
20
+ const { state, questions } = prompt
21
+ if ("needed" in questions) return { state: stateOf(state), questions: { needed: questionOf(questions.needed) } }
22
+ return { state: stateOf(state), questions: { relevant: questionOf(questions.relevant) } }
23
+ }
@@ -0,0 +1,88 @@
1
+ import { Value } from "typebox/value"
2
+
3
+ import { type MemoryPiContext, STATUS_SEARCHING, withMemoryStatus } from "#src/pi/context"
4
+ import type { BeforeAgentStartHandler } from "#src/pi/memory-block"
5
+ import { type JevSource, LoadedChangesSchema, loadSessionMemory, retrieveMemory } from "#src/usecases"
6
+ import { JEV_MISSING, RELEVANT_MESSAGE_TYPE } from "./constants.ts"
7
+ import { classifierPrompt } from "./prompt.ts"
8
+ import type { RelevantMemoryDeps } from "./types.ts"
9
+
10
+ export class RelevantMemoryRuntime {
11
+ #deps: RelevantMemoryDeps
12
+ #told = new Set<string>()
13
+
14
+ constructor(deps: RelevantMemoryDeps) {
15
+ this.#deps = deps
16
+ }
17
+
18
+ reset(): void {
19
+ this.#told = new Set<string>()
20
+ }
21
+
22
+ restore(ctx: MemoryPiContext): void {
23
+ const loaded = this.#deps.sessions.loaded()
24
+ for (const entry of ctx.sessionManager.getBranch()) {
25
+ if (entry.type !== "custom_message" || entry.customType !== RELEVANT_MESSAGE_TYPE) continue
26
+ if (Value.Check(LoadedChangesSchema, entry.details)) loaded.apply(entry.details)
27
+ }
28
+ }
29
+
30
+ async sessionText(ctx: MemoryPiContext): Promise<string | null> {
31
+ const operation = this.#deps.sessions.retrievalOperation(ctx.cwd, this.#deps.paths)
32
+ if (!operation) return null
33
+ const result = await loadSessionMemory(operation, {
34
+ complete: this.#deps.completionOf(ctx),
35
+ loaded: this.#deps.sessions.loaded(),
36
+ })
37
+ if (!result.succeeded) return null
38
+ this.tell(ctx, result.output.notices)
39
+ return result.output.text
40
+ }
41
+
42
+ beforeAgentStart(): BeforeAgentStartHandler {
43
+ return async (event, ctx) => {
44
+ if (event.messageType !== "user") return undefined
45
+ const operation = this.#deps.sessions.retrievalOperation(ctx.cwd, this.#deps.paths)
46
+ if (!operation) return undefined
47
+ const result = await withMemoryStatus(ctx, STATUS_SEARCHING, () =>
48
+ retrieveMemory({ message: event.prompt }, operation, {
49
+ complete: this.#deps.completionOf(ctx),
50
+ jev: this.#jevFor(ctx),
51
+ loaded: this.#deps.sessions.loaded(),
52
+ }),
53
+ )
54
+ if (!result.succeeded) return undefined
55
+ this.tell(ctx, result.output.notices)
56
+ if (typeof result.output.text !== "string") return undefined
57
+ return {
58
+ message: {
59
+ customType: RELEVANT_MESSAGE_TYPE,
60
+ content: result.output.text,
61
+ display: false,
62
+ details: result.output.changes,
63
+ },
64
+ }
65
+ }
66
+ }
67
+
68
+ tell(ctx: MemoryPiContext, notices: string[]): void {
69
+ for (const notice of notices) {
70
+ if (this.#told.has(notice)) continue
71
+ this.#told.add(notice)
72
+ if (ctx.hasUI) ctx.ui.notify(notice, "warning")
73
+ }
74
+ }
75
+
76
+ #jevFor(ctx: MemoryPiContext): JevSource {
77
+ return async (modelId) => {
78
+ const model = ctx.modelRegistry.findOfType("classifier", "typesafe", modelId)
79
+ if (!model) return { available: false, reason: JEV_MISSING }
80
+ return {
81
+ available: true,
82
+ classifier: {
83
+ classify: (request) => ctx.modelRegistry.classify(model, classifierPrompt(request.context), request.options),
84
+ },
85
+ }
86
+ }
87
+ }
88
+ }
@@ -0,0 +1,14 @@
1
+ import type { CompletionFactory } from "#src/pi/capture"
2
+ import type { MemoryPaths } from "#src/pi/context"
3
+ import type { MemorySessionKeeper } from "#src/pi/memory-session"
4
+ import type { BoolQuestion, DecisionPrompt } from "#src/usecases"
5
+
6
+ export interface RelevantMemoryDeps {
7
+ paths: MemoryPaths
8
+ sessions: MemorySessionKeeper
9
+ completionOf: CompletionFactory
10
+ }
11
+
12
+ export type JevPrompt = DecisionPrompt
13
+
14
+ export type JevQuestion = BoolQuestion
@@ -0,0 +1,3 @@
1
+ export const MODEL_INVALID = "the downloaded local model is damaged; remove its folder to download it again"
2
+
3
+ export const SHUTDOWN_FAILED = "The local search model did not shut down cleanly:"
@@ -0,0 +1,2 @@
1
+ export * from "./constants.ts"
2
+ export * from "./runtime.ts"
@@ -0,0 +1,59 @@
1
+ import type { MemoryPiContext } from "#src/pi/context"
2
+ import {
3
+ createRemoteSemantic,
4
+ type LocalModelAccess,
5
+ type LocalSemantic,
6
+ localModelAccess,
7
+ type SemanticPort,
8
+ type SemanticSource,
9
+ } from "#src/usecases"
10
+ import { MODEL_INVALID, SHUTDOWN_FAILED } from "./constants.ts"
11
+
12
+ export class SemanticRuntime {
13
+ #context: MemoryPiContext | null = null
14
+ #local: LocalSemantic | null = null
15
+ #modelCachePath: string
16
+ #access: LocalModelAccess = localModelAccess
17
+
18
+ constructor(modelCachePath: string, access?: LocalModelAccess) {
19
+ this.#modelCachePath = modelCachePath
20
+ if (access) this.#access = access
21
+ }
22
+
23
+ readonly source: SemanticSource = (configuration) => {
24
+ if (configuration.provider === "local") return this.#localPort()
25
+ return this.#remotePort(configuration.provider)
26
+ }
27
+
28
+ attach(context: MemoryPiContext): void {
29
+ this.#context = context
30
+ }
31
+
32
+ async shutdown(): Promise<void> {
33
+ const local = this.#local
34
+ const context = this.#context
35
+ this.#local = null
36
+ this.#context = null
37
+ if (!local) return
38
+ try {
39
+ await local.dispose()
40
+ } catch (error) {
41
+ if (!(error instanceof Error)) throw error
42
+ if (context?.hasUI) context.ui.notify(`${SHUTDOWN_FAILED} ${error.message}`, "warning")
43
+ }
44
+ }
45
+
46
+ async #localPort(): Promise<SemanticPort> {
47
+ if (this.#local) return this.#local.port
48
+ const status = await this.#access.check(this.#modelCachePath, new AbortController().signal)
49
+ if (status === "invalid") return { available: false, reason: MODEL_INVALID }
50
+ this.#local = this.#access.create({ cachePath: this.#modelCachePath })
51
+ return this.#local.port
52
+ }
53
+
54
+ async #remotePort(provider: "openai" | "google"): Promise<SemanticPort> {
55
+ const apiKey = await this.#context?.modelRegistry.getApiKeyForProvider(provider)
56
+ if (typeof apiKey !== "string" || apiKey === "") return { available: false, reason: `no API key for ${provider}` }
57
+ return createRemoteSemantic(provider, apiKey)
58
+ }
59
+ }
@@ -0,0 +1,7 @@
1
+ export const NO_MEMORY_NOTICE = "No memory is configured yet. Run /memory-setup to choose the global vault."
2
+
3
+ export const INVALID_CONFIG_NOTICE = "Memory is off: the config is invalid and nothing from it is used. Problems:"
4
+
5
+ export const REPAIR_HINT = "Run /memory-setup to repair it; it keeps every value that is still valid."
6
+
7
+ export const UNREADABLE_CONFIG_NOTICE = "Memory is off: the config cannot be read. Problems:"