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,8 @@
1
+ import type { MemoryScope } from "#src/services"
2
+
3
+ export type { FolderRead, ListMemoryResult } from "#src/usecases/list-memory/leased"
4
+
5
+ export interface ListMemoryRequest {
6
+ vault: MemoryScope
7
+ folder: string
8
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./load-dont-forget.ts"
2
+ export * from "./types.ts"
@@ -0,0 +1,111 @@
1
+ import {
2
+ closeIndex,
3
+ dontForgetCandidates,
4
+ inspectVaultFile,
5
+ isLoadedDontForget,
6
+ type OpenedIndex,
7
+ readIndexInventory,
8
+ type VaultNoteAnalysis,
9
+ } from "#src/services"
10
+ import {
11
+ type MemoryOperationContext,
12
+ memoryAdmissionRefusal,
13
+ memoryOperationInterruption,
14
+ } from "#src/usecases/operation-context"
15
+ import { type ResolvedMemory, type ResolvedVault, resolveLeasedMemory } from "#src/usecases/resolve-memory/leased"
16
+ import { openVaultIndex, synchronizeOpenedMemory } from "#src/usecases/synchronize-memory/leased"
17
+ import type { DontForgetVault, LoadDontForgetResult, LoadedDontForgetNote } from "./types.ts"
18
+
19
+ export async function loadDontForget(context: MemoryOperationContext): Promise<LoadDontForgetResult> {
20
+ const lease = await context.session.acquire(context.stamp, context.signal)
21
+ if (!lease) return memoryAdmissionRefusal(context)
22
+ try {
23
+ const memory = await resolveLeasedMemory(context)
24
+ if (!memory.succeeded) return memory
25
+ return await loadResolvedVaults(memory.output, context)
26
+ } finally {
27
+ lease.release()
28
+ }
29
+ }
30
+
31
+ async function loadResolvedVaults(
32
+ memory: ResolvedMemory,
33
+ context: MemoryOperationContext,
34
+ ): Promise<LoadDontForgetResult> {
35
+ const targets = [memory.global]
36
+ if (memory.project) targets.push(memory.project)
37
+ const vaults: DontForgetVault[] = []
38
+ for (const target of targets) {
39
+ const interrupted = memoryOperationInterruption(context)
40
+ if (interrupted) return interrupted
41
+ vaults.push(await loadLeasedVault(memory, target, context))
42
+ }
43
+ const stale = memoryOperationInterruption(context)
44
+ if (stale) return stale
45
+ return { succeeded: true, output: { vaults } }
46
+ }
47
+
48
+ async function loadLeasedVault(
49
+ memory: ResolvedMemory,
50
+ target: ResolvedVault,
51
+ context: MemoryOperationContext,
52
+ ): Promise<DontForgetVault> {
53
+ const opened = openVaultIndex(memory, target)
54
+ if (!opened.succeeded) return { vault: target.scope, notes: [], problems: opened.problems }
55
+ const result: DontForgetVault = { vault: target.scope, notes: [], problems: [] }
56
+ try {
57
+ await loadSynchronizedVault(result, opened, memory, target, context)
58
+ } finally {
59
+ const closed = closeIndex(opened.output)
60
+ if (!closed.succeeded) result.problems.push(...closed.problems)
61
+ }
62
+ return result
63
+ }
64
+
65
+ async function loadSynchronizedVault(
66
+ result: DontForgetVault,
67
+ opened: OpenedIndex,
68
+ memory: ResolvedMemory,
69
+ target: ResolvedVault,
70
+ context: MemoryOperationContext,
71
+ ): Promise<void> {
72
+ const synchronized = await synchronizeOpenedMemory(opened, memory, target, context, null)
73
+ if (!synchronized.succeeded) {
74
+ result.problems.push(...synchronized.problems)
75
+ return
76
+ }
77
+ const inventory = readIndexInventory(opened.output)
78
+ if (!inventory.succeeded) {
79
+ result.problems.push(...inventory.problems)
80
+ return
81
+ }
82
+ for (const path of dontForgetCandidates(inventory.output).sort()) {
83
+ if (memoryOperationInterruption(context)) return
84
+ const inspected = await inspectVaultFile(target.vault, { path })
85
+ if (!inspected.succeeded) {
86
+ result.problems.push(...inspected.problems)
87
+ continue
88
+ }
89
+ const note = loadedNote(target, path, inspected.output.analysis, inspected.output.rawHash)
90
+ if (note) result.notes.push(note)
91
+ }
92
+ }
93
+
94
+ function loadedNote(
95
+ target: ResolvedVault,
96
+ path: string,
97
+ analysis: VaultNoteAnalysis,
98
+ hash: string,
99
+ ): LoadedDontForgetNote | null {
100
+ if (!isLoadedDontForget(analysis) || analysis.status !== "parsed" || !analysis.frontmatter) return null
101
+ return {
102
+ vault: target.scope,
103
+ path,
104
+ type: analysis.frontmatter.type,
105
+ id: analysis.frontmatter.id,
106
+ hash,
107
+ statement: analysis.parsed.statement,
108
+ body: analysis.parsed.body,
109
+ problems: [...analysis.frontmatterProblems, ...analysis.nameProblems, ...analysis.bodyProblems],
110
+ }
111
+ }
@@ -0,0 +1,26 @@
1
+ import type { CatalogHit, MemoryScope } from "#src/services"
2
+ import type { Succeeded } from "#src/shared"
3
+ import type { MemoryResolutionRefusal } from "#src/usecases/resolve-memory"
4
+
5
+ export interface LoadedDontForgetNote {
6
+ vault: MemoryScope
7
+ path: string
8
+ type: CatalogHit["type"]
9
+ id: string
10
+ hash: string
11
+ statement: string
12
+ body: string
13
+ problems: string[]
14
+ }
15
+
16
+ export interface DontForgetVault {
17
+ vault: MemoryScope
18
+ notes: LoadedDontForgetNote[]
19
+ problems: string[]
20
+ }
21
+
22
+ export interface LoadedDontForget {
23
+ vaults: DontForgetVault[]
24
+ }
25
+
26
+ export type LoadDontForgetResult = Succeeded<LoadedDontForget> | MemoryResolutionRefusal
@@ -0,0 +1,42 @@
1
+ import {
2
+ captureMemoryOperationContext,
3
+ type MemoryOperationContext,
4
+ memoryAdmissionRefusal,
5
+ memoryOperationInterruption,
6
+ } from "#src/usecases/operation-context"
7
+ import { resolveLeasedMemory, selectMemoryVault } from "#src/usecases/resolve-memory/leased"
8
+ import type { MemoryAddress } from "#src/usecases/session"
9
+ import { receiptedNote } from "./receipt.ts"
10
+ import type { ApplyChange, ChangeOutcome, ChangeRefusal } from "./types.ts"
11
+
12
+ export async function changeLeasedMemory<Result extends ChangeOutcome>(
13
+ address: MemoryAddress,
14
+ callerContext: MemoryOperationContext,
15
+ apply: ApplyChange<Result>,
16
+ ): Promise<Result | ChangeRefusal> {
17
+ const context = captureMemoryOperationContext(callerContext)
18
+ const lease = await context.session.acquire(context.stamp, context.signal)
19
+ if (!lease) return memoryAdmissionRefusal(context)
20
+ try {
21
+ const interrupted = memoryOperationInterruption(context)
22
+ if (interrupted) return interrupted
23
+ const memory = await resolveLeasedMemory(context)
24
+ if (!memory.succeeded) return memory
25
+ const stale = memoryOperationInterruption(context)
26
+ if (stale) return stale
27
+ const target = selectMemoryVault(memory.output, address.vault)
28
+ if (!target.succeeded) return target
29
+ const receipted = receiptedNote(context, address, target.output.vault.path)
30
+ if (!receipted.succeeded) return receipted
31
+ const result = await apply({ target: target.output, context, receipted: receipted.output })
32
+ if (consumesReceipt(result)) context.session.consumeReceipt(context.stamp, address)
33
+ return result
34
+ } finally {
35
+ lease.release()
36
+ }
37
+ }
38
+
39
+ function consumesReceipt(result: ChangeOutcome): boolean {
40
+ if (result.succeeded) return true
41
+ return result.reason === "conflict" || result.reason === "partial"
42
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./change.ts"
2
+ export * from "./maintenance.ts"
3
+ export * from "./partial.ts"
4
+ export * from "./receipt.ts"
5
+ export * from "./types.ts"
@@ -0,0 +1,11 @@
1
+ import type { MaintenanceWarnings, RefreshResult } from "#src/services"
2
+
3
+ export function refreshWarnings(refreshed: RefreshResult): string[] {
4
+ if (!refreshed.succeeded) return refreshed.problems.map((problem) => `${refreshed.reason}: ${problem}`)
5
+ return warningsOf(refreshed)
6
+ }
7
+
8
+ export function warningsOf(result: MaintenanceWarnings): string[] {
9
+ if (result.maintenanceProblems) return [...result.maintenanceProblems]
10
+ return []
11
+ }
@@ -0,0 +1,18 @@
1
+ import { displayNotePath, type PartialRelocation } from "#src/services"
2
+ import type { Failed } from "#src/shared"
3
+ import type { PartialMemoryChange } from "./types.ts"
4
+
5
+ export function reportPartial<Other extends Failed>(result: Other | PartialRelocation): Other | PartialMemoryChange {
6
+ if (!("written" in result)) return result
7
+ return describePartial(result)
8
+ }
9
+
10
+ function describePartial(partial: PartialRelocation): PartialMemoryChange {
11
+ return {
12
+ succeeded: false,
13
+ reason: "partial",
14
+ problems: partial.problems,
15
+ published: partial.written.map((placed) => displayNotePath(placed.folder, placed.note.statement)),
16
+ originalState: partial.originalState,
17
+ }
18
+ }
@@ -0,0 +1,40 @@
1
+ import type { Note } from "#src/services"
2
+ import type { MemoryOperationContext } from "#src/usecases/operation-context"
3
+ import type { DeliveredRead, MemoryAddress } from "#src/usecases/session"
4
+ import type { ReceiptRefusal, ReceiptResult } from "./types.ts"
5
+
6
+ export function receiptedNote(
7
+ context: MemoryOperationContext,
8
+ address: MemoryAddress,
9
+ canonicalVault: string,
10
+ ): ReceiptResult {
11
+ const read = context.session.getReceipt(context.stamp, address)
12
+ if (!read) {
13
+ return refuse("not-read", `${address.path} was not read with memory_get in this session`)
14
+ }
15
+ if (read.canonicalVault !== canonicalVault) {
16
+ return refuse("stale-vault", `the vault registered for ${address.vault} changed since ${address.path} was read`)
17
+ }
18
+ if (read.archived) {
19
+ return refuse("archived", `${address.path} is archived and archived notes are not changed`)
20
+ }
21
+ const note = noteOf(read)
22
+ if (!note) {
23
+ return refuse("needs-fixing", `${address.path} has no valid frontmatter`)
24
+ }
25
+ return { succeeded: true, output: { read, note, folder: folderOf(read.path) } }
26
+ }
27
+
28
+ function noteOf(read: DeliveredRead): Note | null {
29
+ const { analysis } = read
30
+ if (!analysis.frontmatter) return null
31
+ return { statement: analysis.parsed.statement, frontmatter: analysis.frontmatter, body: analysis.parsed.body }
32
+ }
33
+
34
+ function folderOf(path: string): string {
35
+ return path.slice(0, Math.max(0, path.lastIndexOf("/")))
36
+ }
37
+
38
+ function refuse(reason: ReceiptRefusal["reason"], problem: string): ReceiptRefusal {
39
+ return { succeeded: false, reason, problems: [problem] }
40
+ }
@@ -0,0 +1,44 @@
1
+ import type { NoProjectRefusal, Note, PartialRelocation } from "#src/services"
2
+ import type { Failed, Succeeded } from "#src/shared"
3
+ import type { MemoryOperationContext } from "#src/usecases/operation-context"
4
+ import type { MemoryResolutionRefusal, ResolvedVault } from "#src/usecases/resolve-memory"
5
+ import type { DeliveredRead } from "#src/usecases/session"
6
+
7
+ export interface ReceiptedNote {
8
+ read: DeliveredRead
9
+ note: Note
10
+ folder: string
11
+ }
12
+
13
+ export interface ReceiptRefusal extends Failed {
14
+ reason: "not-read" | "stale-vault" | "needs-fixing" | "archived"
15
+ }
16
+
17
+ export type ReceiptResult = Succeeded<ReceiptedNote> | ReceiptRefusal
18
+
19
+ export interface PartialMemoryChange extends Failed {
20
+ reason: "partial"
21
+ published: string[]
22
+ originalState: PartialRelocation["originalState"]
23
+ }
24
+
25
+ export interface LeasedChange {
26
+ target: ResolvedVault
27
+ context: MemoryOperationContext
28
+ receipted: ReceiptedNote
29
+ }
30
+
31
+ export interface ChangeOutcomeFailure {
32
+ succeeded: false
33
+ reason: string
34
+ }
35
+
36
+ export interface ChangeOutcomeSuccess {
37
+ succeeded: true
38
+ }
39
+
40
+ export type ChangeOutcome = ChangeOutcomeSuccess | ChangeOutcomeFailure
41
+
42
+ export type ApplyChange<Result extends ChangeOutcome> = (change: LeasedChange) => Promise<Result>
43
+
44
+ export type ChangeRefusal = MemoryResolutionRefusal | NoProjectRefusal | ReceiptRefusal
@@ -0,0 +1,37 @@
1
+ import type { MemoryOperationContext, MemoryOperationRefusal } from "./types.ts"
2
+
3
+ export function captureMemoryOperationContext(context: MemoryOperationContext): MemoryOperationContext {
4
+ const captured: MemoryOperationContext = {
5
+ configPath: context.configPath,
6
+ workingFolder: context.workingFolder,
7
+ indexPath: context.indexPath,
8
+ platform: context.platform,
9
+ session: context.session,
10
+ stamp: context.stamp,
11
+ signal: context.signal,
12
+ }
13
+ if (context.semantic) captured.semantic = context.semantic
14
+ return captured
15
+ }
16
+
17
+ export function memoryOperationInterruption(context: MemoryOperationContext): MemoryOperationRefusal | null {
18
+ if (!context.session.isCurrent(context.stamp)) return staleMemorySession()
19
+ if (context.signal.aborted) {
20
+ return { succeeded: false, reason: "cancelled", problems: ["Memory read cancelled; retry with a live signal"] }
21
+ }
22
+ return null
23
+ }
24
+
25
+ export function staleMemorySession(): MemoryOperationRefusal {
26
+ return {
27
+ succeeded: false,
28
+ reason: "stale-session",
29
+ problems: ["Memory session or configuration changed; retry with a fresh session stamp"],
30
+ }
31
+ }
32
+
33
+ export function memoryAdmissionRefusal(context: MemoryOperationContext): MemoryOperationRefusal {
34
+ const interrupted = memoryOperationInterruption(context)
35
+ if (interrupted) return interrupted
36
+ return { succeeded: false, reason: "admission-refused", problems: ["Memory session is not accepting operations"] }
37
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./context.ts"
2
+ export * from "./types.ts"
@@ -0,0 +1,19 @@
1
+ import type { PathPlatform } from "#src/services"
2
+ import type { Failed } from "#src/shared"
3
+ import type { SemanticSource } from "#src/usecases/semantic-port"
4
+ import type { MemorySession, OperationStamp } from "#src/usecases/session"
5
+
6
+ export interface MemoryOperationContext {
7
+ configPath: string
8
+ workingFolder: string
9
+ indexPath: string
10
+ platform: PathPlatform
11
+ session: MemorySession
12
+ stamp: OperationStamp
13
+ signal: AbortSignal
14
+ semantic?: SemanticSource
15
+ }
16
+
17
+ export interface MemoryOperationRefusal extends Failed {
18
+ reason: "cancelled" | "stale-session" | "admission-refused"
19
+ }
@@ -0,0 +1,6 @@
1
+ import { type ReadConfigResult, readConfig } from "#src/services"
2
+ import type { MemoryContext } from "#src/usecases/add-memory"
3
+
4
+ export function checkMemoryConfig(context: MemoryContext): Promise<ReadConfigResult> {
5
+ return readConfig(context.configPath, context.platform)
6
+ }
@@ -0,0 +1,33 @@
1
+ import type { ChatModelReference, RegistrationContext, SetupCommitCaptureResult, SetupCommitRequest } from "./types.ts"
2
+
3
+ export function captureRegistrationContext(context: RegistrationContext): RegistrationContext {
4
+ return {
5
+ configPath: context.configPath,
6
+ workingFolder: context.workingFolder,
7
+ indexPath: context.indexPath,
8
+ platform: context.platform,
9
+ session: context.session,
10
+ stamp: context.stamp,
11
+ signal: context.signal,
12
+ }
13
+ }
14
+
15
+ export function captureSelectedModel(model: ChatModelReference | null): ChatModelReference | null {
16
+ if (!model) return null
17
+ return { ...model }
18
+ }
19
+
20
+ export function captureSetupCommit(request: SetupCommitRequest): SetupCommitCaptureResult {
21
+ try {
22
+ return {
23
+ succeeded: true,
24
+ output: {
25
+ config: structuredClone(request.config),
26
+ expectedHash: request.expectedHash,
27
+ replacementConfirmed: request.replacementConfirmed,
28
+ },
29
+ }
30
+ } catch (error) {
31
+ return { succeeded: false, problems: [`setup config could not be captured: ${String(error)}`] }
32
+ }
33
+ }
@@ -0,0 +1,8 @@
1
+ export * from "./check.ts"
2
+ export * from "./entry.ts"
3
+ export * from "./init.ts"
4
+ export * from "./prepare.ts"
5
+ export * from "./prepare-init.ts"
6
+ export * from "./propose.ts"
7
+ export * from "./setup.ts"
8
+ export * from "./types.ts"
@@ -0,0 +1,94 @@
1
+ import {
2
+ canonicalizeRegistration,
3
+ type MemoryConfig,
4
+ proposeInit,
5
+ readConfigSnapshot,
6
+ resolveRegistrationVault,
7
+ } from "#src/services"
8
+ import { captureRegistrationContext } from "./entry.ts"
9
+ import { publishRegistration, registrationInterruption, registrationValidationFailure } from "./publication.ts"
10
+ import type { InitCommitRequest, RegistrationContext, RegistrationResult } from "./types.ts"
11
+
12
+ export async function initProjectMemory(
13
+ input: InitCommitRequest,
14
+ callerContext: RegistrationContext,
15
+ ): Promise<RegistrationResult> {
16
+ const context = captureRegistrationContext(callerContext)
17
+ const request = { name: input.name, vault: input.vault, expectedHash: input.expectedHash }
18
+ const lease = await context.session.acquire(context.stamp, context.signal)
19
+ if (!lease) {
20
+ return registrationValidationFailure({ succeeded: false, problems: ["registration session admission refused"] })
21
+ }
22
+ try {
23
+ const interrupted = registrationInterruption(context)
24
+ if (interrupted) return registrationValidationFailure(interrupted)
25
+ return await prepareProjectRegistration(request, context)
26
+ } finally {
27
+ lease.release()
28
+ }
29
+ }
30
+
31
+ async function prepareProjectRegistration(
32
+ request: InitCommitRequest,
33
+ context: RegistrationContext,
34
+ ): Promise<RegistrationResult> {
35
+ const snapshot = await readConfigSnapshot({ path: context.configPath, platform: context.platform })
36
+ const interrupted = registrationInterruption(context)
37
+ if (interrupted) return registrationValidationFailure(interrupted)
38
+ if (!snapshot.succeeded) return registrationValidationFailure(snapshot)
39
+ if (snapshot.output.state === "missing") {
40
+ return registrationValidationFailure({
41
+ succeeded: false,
42
+ reason: "not-configured",
43
+ configPath: context.configPath,
44
+ problems: ["project registration requires a configured global vault"],
45
+ })
46
+ }
47
+ if (snapshot.output.hash !== request.expectedHash) {
48
+ return registrationValidationFailure({
49
+ succeeded: false,
50
+ reason: "conflict",
51
+ problems: ["config changed since it was read"],
52
+ warnings: [],
53
+ })
54
+ }
55
+ const parsed = snapshot.output.lexicalParse
56
+ if (!parsed.succeeded) return registrationValidationFailure(parsed)
57
+ return proposeProjectRegistration(request, context, parsed.output)
58
+ }
59
+
60
+ async function proposeProjectRegistration(
61
+ request: InitCommitRequest,
62
+ context: RegistrationContext,
63
+ config: MemoryConfig,
64
+ ): Promise<RegistrationResult> {
65
+ const valid = await canonicalizeRegistration({
66
+ config,
67
+ configPath: context.configPath,
68
+ indexPath: context.indexPath,
69
+ platform: context.platform,
70
+ })
71
+ const stale = registrationInterruption(context)
72
+ if (stale) return registrationValidationFailure(stale)
73
+ if (!valid.succeeded) return registrationValidationFailure(valid)
74
+ const vault = resolveRegistrationVault({ vault: request.vault, workingFolder: context.workingFolder })
75
+ if (!vault.succeeded) return registrationValidationFailure(vault)
76
+ const proposal = proposeInit(
77
+ { config, folder: context.workingFolder, name: request.name, vault: vault.output },
78
+ context.platform,
79
+ )
80
+ if (!proposal.succeeded) return registrationValidationFailure(proposal)
81
+ return publishRegistration(
82
+ {
83
+ scope: "project",
84
+ write: {
85
+ path: context.configPath,
86
+ platform: context.platform,
87
+ indexPath: context.indexPath,
88
+ config: proposal.output,
89
+ expectedHash: request.expectedHash,
90
+ },
91
+ },
92
+ context,
93
+ )
94
+ }
@@ -0,0 +1,43 @@
1
+ import { basename } from "node:path"
2
+
3
+ import { type ProjectEntry, readConfigSnapshot, resolveProject } from "#src/services"
4
+ import type { MemoryContext } from "#src/usecases/add-memory"
5
+ import type { InitPreparation, InitPreparationResult, ProjectNameResult } from "./types.ts"
6
+
7
+ export async function prepareProjectInit(context: MemoryContext): Promise<InitPreparationResult> {
8
+ const snapshot = await readConfigSnapshot({ path: context.configPath, platform: context.platform })
9
+ if (!snapshot.succeeded) {
10
+ return { succeeded: false, reason: "unreadable", configPath: context.configPath, problems: snapshot.problems }
11
+ }
12
+ if (snapshot.output.state === "missing") {
13
+ return {
14
+ succeeded: false,
15
+ reason: "not-configured",
16
+ configPath: context.configPath,
17
+ problems: ["memory is not configured"],
18
+ }
19
+ }
20
+ const parsed = snapshot.output.lexicalParse
21
+ if (!parsed.succeeded) {
22
+ return { succeeded: false, reason: "invalid-config", configPath: context.configPath, problems: parsed.problems }
23
+ }
24
+ const registered = resolveProject(parsed.output, context.workingFolder, context.platform)
25
+ let existing: ProjectEntry | null = null
26
+ let defaultName = basename(context.workingFolder)
27
+ if (registered.succeeded) {
28
+ existing = registered.output
29
+ defaultName = registered.output.name
30
+ }
31
+ const takenNames = parsed.output.projects.filter((project) => project !== existing).map((project) => project.name)
32
+ return { succeeded: true, output: { expectedHash: snapshot.output.hash, existing, defaultName, takenNames } }
33
+ }
34
+
35
+ export function checkProjectName(preparation: InitPreparation, answer: string): ProjectNameResult {
36
+ let name = answer.trim()
37
+ if (name === "") name = preparation.defaultName
38
+ const lowered = name.toLowerCase()
39
+ if (preparation.takenNames.some((taken) => taken.toLowerCase() === lowered)) {
40
+ return { succeeded: false, problems: [`a project named "${name}" is already registered`] }
41
+ }
42
+ return { succeeded: true, output: name }
43
+ }
@@ -0,0 +1,35 @@
1
+ import { prepareSetupDefaults, readConfigSnapshot } from "#src/services"
2
+ import { captureRegistrationContext, captureSelectedModel } from "./entry.ts"
3
+ import { registrationInterruption } from "./publication.ts"
4
+ import type { RegistrationContext, SetupPreparationRequest, SetupPreparationResult } from "./types.ts"
5
+
6
+ export async function prepareMemorySetup(
7
+ input: SetupPreparationRequest,
8
+ callerContext: RegistrationContext,
9
+ ): Promise<SetupPreparationResult> {
10
+ const context = captureRegistrationContext(callerContext)
11
+ const selectedModel = captureSelectedModel(input.selectedModel)
12
+ const lease = await context.session.acquire(context.stamp, context.signal)
13
+ if (!lease) return { succeeded: false, problems: ["registration session admission refused"] }
14
+ try {
15
+ const interrupted = registrationInterruption(context)
16
+ if (interrupted) return interrupted
17
+ const snapshot = await readConfigSnapshot({ path: context.configPath, platform: context.platform })
18
+ const stale = registrationInterruption(context)
19
+ if (stale) return stale
20
+ if (!snapshot.succeeded) return snapshot
21
+ const defaults = prepareSetupDefaults(selectedModel)
22
+ let draft = defaults
23
+ if (snapshot.output.state === "present") {
24
+ const repair = snapshot.output.repair
25
+ draft = {
26
+ ...repair,
27
+ capture: { ...repair.capture, model: { ...defaults.capture.model, ...repair.capture.model } },
28
+ memoryAgent: { model: { ...defaults.memoryAgent.model, ...repair.memoryAgent.model } },
29
+ }
30
+ }
31
+ return { succeeded: true, output: { snapshot: snapshot.output, draft, selectedModel } }
32
+ } finally {
33
+ lease.release()
34
+ }
35
+ }
@@ -0,0 +1,34 @@
1
+ import { inspectVaultFolder, proposeSetup, resolveRegistrationVault, setupDisclosures } from "#src/services"
2
+ import type { Failed } from "#src/shared"
3
+ import type { MemoryContext } from "#src/usecases/add-memory"
4
+ import type { SetupProposalRequest, SetupProposalResult, SetupVaultMode } from "./types.ts"
5
+
6
+ export async function proposeMemorySetup(
7
+ request: SetupProposalRequest,
8
+ context: MemoryContext,
9
+ ): Promise<SetupProposalResult> {
10
+ let requested = request.vault.trim()
11
+ if (requested === "" && request.draft.global.vault) requested = request.draft.global.vault
12
+ const vault = resolveRegistrationVault({ vault: requested, workingFolder: context.workingFolder })
13
+ if (!vault.succeeded) return vault
14
+ const refusal = await vaultFolderRefusal(vault.output, request.mode)
15
+ if (refusal) return refusal
16
+ const proposal = proposeSetup({ config: request.draft, vault: vault.output }, context.platform)
17
+ if (!proposal.succeeded) return proposal
18
+ return { succeeded: true, output: { config: proposal.output, disclosures: setupDisclosures(proposal.output) } }
19
+ }
20
+
21
+ async function vaultFolderRefusal(vault: string, mode: SetupVaultMode): Promise<Failed | null> {
22
+ const folder = await inspectVaultFolder(vault)
23
+ if (!folder.succeeded) return folder
24
+ if (folder.output === "not-directory") {
25
+ return { succeeded: false, problems: [`${vault} is not a folder`] }
26
+ }
27
+ if (mode === "create" && folder.output === "populated") {
28
+ return { succeeded: false, problems: [`${vault} already has files; attach it instead of creating a new vault`] }
29
+ }
30
+ if (mode === "attach" && folder.output === "missing") {
31
+ return { succeeded: false, problems: [`${vault} does not exist; create it instead of attaching`] }
32
+ }
33
+ return null
34
+ }