pi-obsidian-memory 0.0.1 → 0.1.1

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 +237 -7
  2. package/package.json +41 -11
  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 -21
@@ -0,0 +1,46 @@
1
+ import type { ProjectEntry } from "#src/usecases"
2
+ import {
3
+ NO_PROJECTS_NOTICE,
4
+ PROJECT_ACTION_TITLE,
5
+ PROJECT_CHANGE_VAULT,
6
+ PROJECT_REMOVE,
7
+ PROJECT_TITLE,
8
+ PROJECT_VAULT_TITLE,
9
+ } from "./constants.ts"
10
+ import { saveChange } from "./save.ts"
11
+ import type { SettingsEnv } from "./types.ts"
12
+
13
+ export function projectLabel(project: ProjectEntry): string {
14
+ return `${project.name} — ${project.folder} → ${project.vault}`
15
+ }
16
+
17
+ async function repoint(env: SettingsEnv, project: ProjectEntry): Promise<void> {
18
+ const answer = await env.ctx.ui.input(PROJECT_VAULT_TITLE, project.vault)
19
+ if (typeof answer !== "string" || answer.trim() === "") return
20
+ await saveChange(env, {
21
+ change: { kind: "projectVault", name: project.name, vault: answer.trim() },
22
+ what: `project ${project.name} now uses ${answer.trim()}`,
23
+ reload: true,
24
+ })
25
+ }
26
+
27
+ async function remove(env: SettingsEnv, project: ProjectEntry): Promise<void> {
28
+ await saveChange(env, {
29
+ change: { kind: "removeProject", name: project.name },
30
+ what: `project ${project.name} was removed from the memory`,
31
+ reload: true,
32
+ })
33
+ }
34
+
35
+ export async function projectsEdit(env: SettingsEnv): Promise<void> {
36
+ const { projects } = env.state.config
37
+ if (projects.length === 0) return env.ctx.ui.notify(NO_PROJECTS_NOTICE, "info")
38
+ const labels = projects.map(projectLabel)
39
+ const answer = await env.ctx.ui.select(PROJECT_TITLE, labels)
40
+ const project = projects.find((_entry, index) => labels[index] === answer)
41
+ if (!project) return
42
+ const actions = [PROJECT_CHANGE_VAULT, PROJECT_REMOVE]
43
+ const action = await env.ctx.ui.select(PROJECT_ACTION_TITLE, actions)
44
+ if (action === PROJECT_CHANGE_VAULT) return repoint(env, project)
45
+ if (action === PROJECT_REMOVE) return remove(env, project)
46
+ }
@@ -0,0 +1,77 @@
1
+ import {
2
+ CURRENT_MARK,
3
+ DECISION_TITLE,
4
+ EMBEDDING_CHOICES,
5
+ EMBEDDINGS_TITLE,
6
+ JEV_DISCLOSURE,
7
+ JEV_OPTION,
8
+ LAYA_DEFAULT_ENDPOINT,
9
+ LAYA_ENDPOINT_TITLE,
10
+ LAYA_OPTION,
11
+ REMOTE_EMBEDDINGS_DISCLOSURE,
12
+ } from "./constants.ts"
13
+ import { saveChange } from "./save.ts"
14
+ import type { SettingsEnv } from "./types.ts"
15
+
16
+ async function askEndpoint(env: SettingsEnv): Promise<string | null> {
17
+ let placeholder = LAYA_DEFAULT_ENDPOINT
18
+ const { decisionModel } = env.state.config
19
+ if (decisionModel.provider === "laya") placeholder = decisionModel.endpoint
20
+ const answer = await env.ctx.ui.input(LAYA_ENDPOINT_TITLE, placeholder)
21
+ if (typeof answer !== "string") return null
22
+ const typed = answer.trim()
23
+ if (typed !== "") return typed
24
+ if (decisionModel.provider === "laya") return decisionModel.endpoint
25
+ return null
26
+ }
27
+
28
+ async function useLaya(env: SettingsEnv): Promise<void> {
29
+ const endpoint = await askEndpoint(env)
30
+ if (typeof endpoint !== "string") return
31
+ await saveChange(env, {
32
+ change: { kind: "decision", provider: "laya", endpoint },
33
+ what: "decision model is now Laya (local). It ships no cutoffs: set the gate and relevance cutoffs here, or per-message memory stays off",
34
+ reload: false,
35
+ })
36
+ }
37
+
38
+ async function useJev(env: SettingsEnv): Promise<void> {
39
+ env.ctx.ui.notify(JEV_DISCLOSURE, "warning")
40
+ await saveChange(env, {
41
+ change: { kind: "decision", provider: "typesafe" },
42
+ what: "decision model is now Jev. The cutoffs start from TypeSafe's values (0.5 and 0.5)",
43
+ reload: false,
44
+ })
45
+ }
46
+
47
+ export async function decisionEdit(env: SettingsEnv): Promise<void> {
48
+ const jevCurrent = env.state.config.decisionModel.provider === "typesafe"
49
+ let options = [`${JEV_OPTION} ${CURRENT_MARK}`, LAYA_OPTION]
50
+ if (!jevCurrent) options = [`${LAYA_OPTION} ${CURRENT_MARK}`, JEV_OPTION]
51
+ const answer = await env.ctx.ui.select(DECISION_TITLE, options)
52
+ if (typeof answer !== "string" || !options.includes(answer)) return
53
+ if (answer.startsWith(JEV_OPTION)) {
54
+ if (!jevCurrent) await useJev(env)
55
+ return
56
+ }
57
+ await useLaya(env)
58
+ }
59
+
60
+ export async function embeddingsEdit(env: SettingsEnv): Promise<void> {
61
+ const current = env.state.config.embeddings
62
+ const same = (provider: string) => provider === current.provider
63
+ const labels = EMBEDDING_CHOICES.filter((choice) => same(choice.value.provider)).map(
64
+ (choice) => `${choice.label} ${CURRENT_MARK}`,
65
+ )
66
+ const others = EMBEDDING_CHOICES.filter((choice) => !same(choice.value.provider))
67
+ const options = [...labels, ...others.map((choice) => choice.label)]
68
+ const answer = await env.ctx.ui.select(EMBEDDINGS_TITLE, options)
69
+ const picked = others.find((choice) => choice.label === answer)
70
+ if (!picked) return
71
+ if (picked.value.provider !== "local") env.ctx.ui.notify(REMOTE_EMBEDDINGS_DISCLOSURE, "warning")
72
+ await saveChange(env, {
73
+ change: { kind: "embeddings", embeddings: picked.value },
74
+ what: `embeddings are now ${picked.label}`,
75
+ reload: false,
76
+ })
77
+ }
@@ -0,0 +1,16 @@
1
+ import { changeMemorySettings } from "#src/usecases"
2
+ import { RELOAD_NOTE, SAVED } from "./constants.ts"
3
+ import type { Saving, SettingsEnv } from "./types.ts"
4
+
5
+ export async function saveChange(env: SettingsEnv, saving: Saving): Promise<boolean> {
6
+ const result = await changeMemorySettings({ change: saving.change, expectedHash: env.state.hash }, env.context)
7
+ if (!result.succeeded) {
8
+ if (result.reason !== "cancelled") env.ctx.ui.notify(result.problems.join("\n"), "error")
9
+ return false
10
+ }
11
+ const lines = [`${SAVED} ${saving.what}.`]
12
+ if (saving.reload) lines.push(RELOAD_NOTE)
13
+ lines.push(...result.output.warnings.map((warning) => `- ${warning}`))
14
+ env.ctx.ui.notify(lines.join("\n"), "info")
15
+ return true
16
+ }
@@ -0,0 +1,27 @@
1
+ import type { MemoryPiContext } from "#src/pi/context"
2
+ import { prepareMemorySettings, type RegistrationContext } from "#src/usecases"
3
+ import { DONE_LABEL, SETTINGS_TITLE } from "./constants.ts"
4
+ import { settingLines } from "./lines.ts"
5
+ import type { SettingsDeps } from "./types.ts"
6
+
7
+ function freshContext(base: RegistrationContext): RegistrationContext {
8
+ const stamp = base.session.stamp()
9
+ return { ...base, stamp, signal: base.session.signal(stamp) }
10
+ }
11
+
12
+ export async function runSettingsScreen(ctx: MemoryPiContext, deps: SettingsDeps): Promise<void> {
13
+ while (true) {
14
+ const context = freshContext(deps.registration)
15
+ const prepared = await prepareMemorySettings(context)
16
+ if (!prepared.succeeded) {
17
+ if (!context.signal.aborted) ctx.ui.notify(prepared.problems.join("\n"), "error")
18
+ return
19
+ }
20
+ const lines = settingLines(prepared.output.config)
21
+ const labels = [...lines.map((line) => line.label), DONE_LABEL]
22
+ const answer = await ctx.ui.select(SETTINGS_TITLE, labels)
23
+ const line = lines.find((_entry, index) => labels[index] === answer)
24
+ if (!line) return
25
+ await line.edit({ ctx, deps, context, state: prepared.output })
26
+ }
27
+ }
@@ -0,0 +1,87 @@
1
+ import type { MemoryPiContext } from "#src/pi/context"
2
+ import type {
3
+ ChatModelReference,
4
+ MemoryConfig,
5
+ RegistrationContext,
6
+ SettingChange,
7
+ SettingsPreparation,
8
+ } from "#src/usecases"
9
+
10
+ export interface CurrentModel {
11
+ provider?: string
12
+ id?: string
13
+ }
14
+
15
+ export interface ModelChoice {
16
+ label: string
17
+ reference: ChatModelReference
18
+ current: boolean
19
+ }
20
+
21
+ export type VaultChanger = (context: RegistrationContext) => Promise<void>
22
+
23
+ export interface SettingsDeps {
24
+ registration: RegistrationContext
25
+ changeGlobalVault: VaultChanger
26
+ }
27
+
28
+ export interface SettingsEnv {
29
+ ctx: MemoryPiContext
30
+ deps: SettingsDeps
31
+ context: RegistrationContext
32
+ state: SettingsPreparation
33
+ }
34
+
35
+ export type LineEdit = (env: SettingsEnv) => Promise<void>
36
+
37
+ export interface SettingLine {
38
+ label: string
39
+ edit: LineEdit
40
+ }
41
+
42
+ export interface Saving {
43
+ change: SettingChange
44
+ what: string
45
+ reload: boolean
46
+ }
47
+
48
+ export interface SwitchDiscriminant {
49
+ kind: "captureSwitch"
50
+ }
51
+
52
+ export interface CountDiscriminant {
53
+ kind: "captureCount"
54
+ }
55
+
56
+ export type CaptureCountName = Extract<SettingChange, CountDiscriminant>["name"]
57
+
58
+ export type CaptureSwitchName = Extract<SettingChange, SwitchDiscriminant>["name"]
59
+
60
+ export interface SwitchEditSpec {
61
+ name: CaptureSwitchName
62
+ what: string
63
+ current: boolean
64
+ }
65
+
66
+ export interface EmbeddingChoice {
67
+ value: MemoryConfig["embeddings"]
68
+ label: string
69
+ }
70
+
71
+ export interface ModelEditSpec {
72
+ title: string
73
+ what: string
74
+ kind: "captureModel" | "agentModel"
75
+ current: CurrentModel
76
+ }
77
+
78
+ export type NumberChange = (value: number) => SettingChange
79
+
80
+ export interface NumberEditSpec {
81
+ title: string
82
+ what: string
83
+ kind: "threshold" | "count"
84
+ current: string
85
+ change: NumberChange
86
+ clear: SettingChange | null
87
+ }
@@ -0,0 +1,33 @@
1
+ export const MEMORY_SETUP_COMMAND = "memory-setup"
2
+
3
+ export const MEMORY_SETUP_DESCRIPTION = "Choose or attach the global memory vault and write the memory config"
4
+
5
+ export const SETUP_CREATE_OPTION = "Create a new vault"
6
+
7
+ export const SETUP_ATTACH_OPTION = "Attach an existing folder"
8
+
9
+ export const SETUP_MODE_TITLE = "Global memory vault"
10
+
11
+ export const SETUP_VAULT_TITLE = "Vault folder (absolute path)"
12
+
13
+ export const SETUP_KEEP_VAULT_TITLE = "Vault folder (leave empty to keep the current one)"
14
+
15
+ export const SETUP_VAULT_PLACEHOLDER = "Absolute folder path"
16
+
17
+ export const SETUP_CAPTURE_MODEL_TITLE =
18
+ "Chat model for automatic capture (the model in use is the default and Escape keeps the one marked)"
19
+
20
+ export const SETUP_AGENT_MODEL_TITLE =
21
+ "Chat model for the memory agent (a small model, it searches memory for each message; sorted by price; Escape keeps the current one)"
22
+
23
+ export const SETUP_NO_MODEL = "No chat model is available. Connect a model in pi, then run /memory-setup again."
24
+
25
+ export const SETUP_CANCELLED = "Setup cancelled: nothing changed."
26
+
27
+ export const SETUP_DONE = "Memory is set up. Global vault:"
28
+
29
+ export const REPAIR_TITLE = "The memory config needs changes"
30
+
31
+ export const REPAIR_CONFIRM_LINE = "Continue and rewrite it with every key?"
32
+
33
+ export const REPLACE_LINE = "The file is not valid JSON and will be replaced."
@@ -0,0 +1,22 @@
1
+ import {
2
+ CHAT_MODELS_DISCLOSURE,
3
+ DISCLOSURE_TITLE,
4
+ JEV_DISCLOSURE,
5
+ REMOTE_EMBEDDINGS_DISCLOSURE,
6
+ } from "#src/pi/memory-settings"
7
+ import type { SetupDisclosure } from "#src/usecases"
8
+
9
+ export function disclosureText(disclosures: SetupDisclosure[]): string {
10
+ return [DISCLOSURE_TITLE, ...disclosures.map(disclosureLine)].join("\n")
11
+ }
12
+
13
+ function disclosureLine(disclosure: SetupDisclosure): string {
14
+ switch (disclosure) {
15
+ case "chat-models":
16
+ return CHAT_MODELS_DISCLOSURE
17
+ case "jev":
18
+ return JEV_DISCLOSURE
19
+ case "remote-embeddings":
20
+ return REMOTE_EMBEDDINGS_DISCLOSURE
21
+ }
22
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./constants.ts"
2
+ export * from "./disclosure.ts"
3
+ export * from "./memory-setup.ts"
4
+ export * from "./types.ts"
@@ -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"