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,28 @@
1
+ import type { Static } from "typebox"
2
+
3
+ import type {
4
+ BlankCompletionRefusal,
5
+ MemoryScope,
6
+ NoProjectRefusal,
7
+ UpdateRefusal,
8
+ VaultCatalogFailure,
9
+ } from "#src/services"
10
+ import type { Succeeded } from "#src/shared"
11
+ import type { MemoryResolutionRefusal } from "#src/usecases/resolve-memory"
12
+ import type { CompleteBlankMemoryRequestSchema } from "./schemas.ts"
13
+
14
+ export type CompleteBlankMemoryRequest = Static<typeof CompleteBlankMemoryRequestSchema>
15
+
16
+ export interface CompletedBlank {
17
+ vault: MemoryScope
18
+ path: string
19
+ maintenanceProblems: string[]
20
+ }
21
+
22
+ export type CompleteBlankMemoryResult =
23
+ | Succeeded<CompletedBlank>
24
+ | BlankCompletionRefusal
25
+ | UpdateRefusal
26
+ | VaultCatalogFailure
27
+ | MemoryResolutionRefusal
28
+ | NoProjectRefusal
@@ -0,0 +1,3 @@
1
+ export const PROBE_MESSAGE = "Doctor check: does this message need long-term memory?"
2
+
3
+ export const PROBE_FOLDER = "doctor"
@@ -0,0 +1,36 @@
1
+ import { decideMemory, type MemoryConfig } from "#src/services"
2
+ import { describeDecisionFailure } from "#src/usecases/relevant-memory"
3
+ import { PROBE_FOLDER, PROBE_MESSAGE } from "./constants.ts"
4
+ import type { DecisionProbe, DecisionReport } from "./types.ts"
5
+
6
+ export async function checkDecision(
7
+ configuration: MemoryConfig["decisionModel"],
8
+ probe: DecisionProbe,
9
+ signal: AbortSignal,
10
+ ): Promise<DecisionReport> {
11
+ const { provider, model } = configuration
12
+ if (configuration.provider === "laya") {
13
+ const { endpoint, maxTokens, headMaxTokens } = configuration
14
+ const answer = await decideMemory({
15
+ context: {
16
+ provider: "laya",
17
+ endpoint,
18
+ model: configuration.model,
19
+ maxTokens,
20
+ headMaxTokens,
21
+ signal,
22
+ },
23
+ request: { message: PROBE_MESSAGE, project: null, folder: PROBE_FOLDER },
24
+ })
25
+ if (answer.succeeded) return { provider, model, status: "ready", detail: `answered at ${endpoint}` }
26
+ const cause = describeDecisionFailure(answer)
27
+ return { provider, model, status: "not-answering", problem: `${endpoint} is not answering: ${cause}` }
28
+ }
29
+ if (!probe.hasClassifier(provider, model)) {
30
+ return { provider, model, status: "model-missing", problem: `pi has no ${provider} ${model} classifier model` }
31
+ }
32
+ if (!(await probe.hasCredentials(provider))) {
33
+ return { provider, model, status: "no-credentials", problem: `No API key for ${provider}` }
34
+ }
35
+ return { provider, model, status: "ready", detail: "model and API key found" }
36
+ }
@@ -0,0 +1,52 @@
1
+ import { checkChatModels } from "#src/services"
2
+ import {
3
+ captureMemoryOperationContext,
4
+ type MemoryOperationContext,
5
+ memoryAdmissionRefusal,
6
+ memoryOperationInterruption,
7
+ } from "#src/usecases/operation-context"
8
+ import { resolveCutoffs } from "#src/usecases/relevant-memory"
9
+ import { resolveLeasedMemory } from "#src/usecases/resolve-memory/leased"
10
+ import { checkDecision } from "./decision.ts"
11
+ import { checkEmbeddings } from "./embeddings.ts"
12
+ import type { DiagnosedMemory, DiagnoseMemoryRequest, DiagnoseMemoryResult, ModelReport } from "./types.ts"
13
+ import { reportVault } from "./vault.ts"
14
+
15
+ export async function diagnoseMemory<TModel>(
16
+ request: DiagnoseMemoryRequest<TModel>,
17
+ callerContext: MemoryOperationContext,
18
+ ): Promise<DiagnoseMemoryResult> {
19
+ const context = captureMemoryOperationContext(callerContext)
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
+ const targets = [memory.output.global]
26
+ let projectMissing = true
27
+ if (memory.output.project) {
28
+ targets.push(memory.output.project)
29
+ projectMissing = false
30
+ }
31
+ const vaults: DiagnosedMemory["vaults"] = []
32
+ for (const target of targets) vaults.push(await reportVault(memory.output, target, context))
33
+ const { capture, memoryAgent } = memory.output.config
34
+ const checks = await checkChatModels([capture.model, memoryAgent.model], request.port)
35
+ const models: ModelReport[] = []
36
+ const [captureCheck, agentCheck] = checks
37
+ if (captureCheck) models.push({ role: "capture", check: captureCheck })
38
+ if (agentCheck) models.push({ role: "memory agent", check: agentCheck })
39
+ const embeddings = await checkEmbeddings(memory.output.config.embeddings, request.embeddings, context.signal)
40
+ const decision = await checkDecision(memory.output.config.decisionModel, request.decision, context.signal)
41
+ const cutoffs = resolveCutoffs(memory.output.config.decisionModel)
42
+ const interrupted = memoryOperationInterruption(context)
43
+ if (interrupted) return interrupted
44
+ const { maxNotesPerFolder } = memory.output.config.limits
45
+ return {
46
+ succeeded: true,
47
+ output: { vaults, projectMissing, maxNotesPerFolder, models, embeddings, decision, cutoffs },
48
+ }
49
+ } finally {
50
+ lease.release()
51
+ }
52
+ }
@@ -0,0 +1,39 @@
1
+ import type { EmbeddingConfiguration } from "#src/services"
2
+ import { checkLocalModel, localModelDownloadMegabytes } from "#src/usecases/semantic-provider"
3
+ import type { EmbeddingProbe, EmbeddingReport } from "./types.ts"
4
+
5
+ export async function checkEmbeddings(
6
+ configuration: EmbeddingConfiguration,
7
+ probe: EmbeddingProbe,
8
+ signal: AbortSignal,
9
+ ): Promise<EmbeddingReport> {
10
+ const { provider, model } = configuration
11
+ if (provider === "local") return checkLocal(configuration, probe, signal)
12
+ if (await probe.hasCredentials(provider)) return { provider, model, status: "ready" }
13
+ return { provider, model, status: "no-credentials", problem: `No API key for ${provider}` }
14
+ }
15
+
16
+ async function checkLocal(
17
+ configuration: EmbeddingConfiguration,
18
+ probe: EmbeddingProbe,
19
+ signal: AbortSignal,
20
+ ): Promise<EmbeddingReport> {
21
+ const { provider, model } = configuration
22
+ const status = await checkLocalModel(probe.modelCachePath, signal)
23
+ if (status === "cached") return { provider, model, status: "ready" }
24
+ if (status === "invalid") {
25
+ return {
26
+ provider,
27
+ model,
28
+ status: "model-damaged",
29
+ problem: "The downloaded local model is damaged; remove its folder to download it again",
30
+ }
31
+ }
32
+ const megabytes = localModelDownloadMegabytes()
33
+ return {
34
+ provider,
35
+ model,
36
+ status: "model-not-downloaded",
37
+ problem: `The local model is not downloaded yet (about ${megabytes} MB); it is downloaded on the first semantic search`,
38
+ }
39
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./decision.ts"
2
+ export * from "./diagnose-memory.ts"
3
+ export * from "./embeddings.ts"
4
+ export * from "./types.ts"
5
+ export * from "./vault.ts"
@@ -0,0 +1,86 @@
1
+ import type { ChatModelCheck, ChatModelPort, MemoryScope, VaultDiagnosis } from "#src/services"
2
+ import type { Succeeded } from "#src/shared"
3
+ import type { CutoffReport } from "#src/usecases/relevant-memory"
4
+ import type { MemoryResolutionRefusal } from "#src/usecases/resolve-memory"
5
+
6
+ export interface DiagnoseMemoryRequest<TModel> {
7
+ port: ChatModelPort<TModel>
8
+ embeddings: EmbeddingProbe
9
+ decision: DecisionProbe
10
+ }
11
+
12
+ export interface BlankFile {
13
+ path: string
14
+ rawHash: string
15
+ empty: boolean
16
+ }
17
+
18
+ export interface VaultReport {
19
+ vault: MemoryScope
20
+ diagnosis: VaultDiagnosis
21
+ blanks: BlankFile[]
22
+ unreadable: string[]
23
+ }
24
+
25
+ export interface VaultReportFailure {
26
+ vault: MemoryScope
27
+ problems: string[]
28
+ }
29
+
30
+ export interface ModelReport {
31
+ role: "capture" | "memory agent"
32
+ check: ChatModelCheck
33
+ }
34
+
35
+ export interface DiagnosedMemory {
36
+ vaults: (VaultReport | VaultReportFailure)[]
37
+ projectMissing: boolean
38
+ maxNotesPerFolder: number
39
+ models: ModelReport[]
40
+ embeddings: EmbeddingReport
41
+ decision: DecisionReport
42
+ cutoffs: CutoffReport
43
+ }
44
+
45
+ export type DiagnoseMemoryResult = Succeeded<DiagnosedMemory> | MemoryResolutionRefusal
46
+
47
+ export interface EmbeddingProbe {
48
+ modelCachePath: string
49
+ hasCredentials(provider: string): Promise<boolean>
50
+ }
51
+
52
+ export interface EmbeddingReady {
53
+ provider: string
54
+ model: string
55
+ status: "ready"
56
+ }
57
+
58
+ export interface EmbeddingProblem {
59
+ provider: string
60
+ model: string
61
+ status: "model-not-downloaded" | "model-damaged" | "no-credentials"
62
+ problem: string
63
+ }
64
+
65
+ export type EmbeddingReport = EmbeddingReady | EmbeddingProblem
66
+
67
+ export interface DecisionProbe {
68
+ hasClassifier(provider: string, model: string): boolean
69
+ hasCredentials(provider: string): Promise<boolean>
70
+ }
71
+
72
+ export interface DecisionReady {
73
+ provider: string
74
+ model: string
75
+ status: "ready"
76
+ detail: string
77
+ }
78
+
79
+ export interface DecisionProblem {
80
+ provider: string
81
+ model: string
82
+ status: "model-missing" | "no-credentials" | "not-answering"
83
+ problem: string
84
+ }
85
+
86
+ export type DecisionReport = DecisionReady | DecisionProblem
@@ -0,0 +1,33 @@
1
+ import { diagnoseVault, enumerateVault, type InspectedVaultFile, inspectVaultFile } from "#src/services"
2
+ import type { MemoryOperationContext } from "#src/usecases/operation-context"
3
+ import { memoryOperationInterruption } from "#src/usecases/operation-context"
4
+ import type { ResolvedMemory, ResolvedVault } from "#src/usecases/resolve-memory"
5
+ import type { BlankFile, VaultReport, VaultReportFailure } from "./types.ts"
6
+
7
+ export async function reportVault(
8
+ memory: ResolvedMemory,
9
+ target: ResolvedVault,
10
+ context: MemoryOperationContext,
11
+ ): Promise<VaultReport | VaultReportFailure> {
12
+ const enumerated = await enumerateVault(target.vault)
13
+ if (!enumerated.succeeded) return { vault: target.scope, problems: enumerated.problems }
14
+ const { entries } = enumerated.output
15
+ const unreadable = enumerated.output.failures.map((failure) => `${failure.path}: ${failure.problems.join("; ")}`)
16
+ const inspected: InspectedVaultFile[] = []
17
+ for (const entry of entries) {
18
+ if (entry.kind !== "note") continue
19
+ if (memoryOperationInterruption(context)) break
20
+ const file = await inspectVaultFile(target.vault, { path: entry.path })
21
+ if (file.succeeded) inspected.push(file.output)
22
+ else unreadable.push(`${entry.path}: ${file.problems.join("; ")}`)
23
+ }
24
+ const diagnosis = diagnoseVault({ entries, inspected, limits: memory.config.limits })
25
+ return { vault: target.scope, diagnosis, blanks: blankFiles(inspected), unreadable }
26
+ }
27
+
28
+ function blankFiles(inspected: InspectedVaultFile[]): BlankFile[] {
29
+ return inspected
30
+ .filter((file) => file.analysis.status === "unclosed")
31
+ .map((file) => ({ path: file.path, rawHash: file.rawHash, empty: file.text.trim() === "" }))
32
+ .sort((left, right) => left.path.localeCompare(right.path))
33
+ }
@@ -0,0 +1,20 @@
1
+ import { collectExportFiles, type VaultExportFile } from "#src/services"
2
+ import type { ResolvedMemory, ResolvedVault } from "#src/usecases/resolve-memory"
3
+ import type { CollectedVaults } from "./types.ts"
4
+
5
+ export async function collectVaults(memory: ResolvedMemory): Promise<CollectedVaults> {
6
+ const problems: string[] = []
7
+ const global = await collectVault(memory.global, problems)
8
+ let project: VaultExportFile[] | null = null
9
+ if (memory.project) project = await collectVault(memory.project, problems)
10
+ return { global, project, problems }
11
+ }
12
+
13
+ async function collectVault(target: ResolvedVault, problems: string[]): Promise<VaultExportFile[]> {
14
+ const collected = await collectExportFiles(target.vault)
15
+ if (collected.succeeded) return collected.output
16
+ for (const failure of collected.failures) {
17
+ problems.push(`${target.scope}: ${failure.path}: ${failure.problems.join("; ")}`)
18
+ }
19
+ return []
20
+ }
@@ -0,0 +1,3 @@
1
+ export const EXPORT_EXTENSION = ".zip"
2
+
3
+ export const FILE_NAME_SEPARATORS = /[\\/]/
@@ -0,0 +1,84 @@
1
+ import { join, resolve } from "node:path"
2
+
3
+ import { zipSync } from "fflate"
4
+
5
+ import { canonicalizeAccessPath, exportEntries, vaultAccessRefusal, writeNewFile } from "#src/services"
6
+ import type { PathPlatform } from "#src/usecases/check-vault-access"
7
+ import {
8
+ captureMemoryOperationContext,
9
+ type MemoryOperationContext,
10
+ memoryAdmissionRefusal,
11
+ memoryOperationInterruption,
12
+ } from "#src/usecases/operation-context"
13
+ import { resolveLeasedMemory } from "#src/usecases/resolve-memory/leased"
14
+ import { collectVaults } from "./collect.ts"
15
+ import { EXPORT_EXTENSION, FILE_NAME_SEPARATORS } from "./constants.ts"
16
+ import type { ExportMemoryRequest, ExportMemoryResult } from "./types.ts"
17
+
18
+ export async function exportMemory(
19
+ input: ExportMemoryRequest,
20
+ callerContext: MemoryOperationContext,
21
+ ): Promise<ExportMemoryResult> {
22
+ const request = { folder: input.folder, fileName: input.fileName, platform: input.platform }
23
+ const invalid = checkFileName(request.fileName)
24
+ if (invalid) return { succeeded: false, reason: "invalid", problems: [invalid] }
25
+ const context = captureMemoryOperationContext(callerContext)
26
+ const lease = await context.session.acquire(context.stamp, context.signal)
27
+ if (!lease) return memoryAdmissionRefusal(context)
28
+ try {
29
+ return await exportLeasedMemory(request, context)
30
+ } finally {
31
+ lease.release()
32
+ }
33
+ }
34
+
35
+ async function exportLeasedMemory(
36
+ request: ExportMemoryRequest,
37
+ context: MemoryOperationContext,
38
+ ): Promise<ExportMemoryResult> {
39
+ const memory = await resolveLeasedMemory(context)
40
+ if (!memory.succeeded) return memory
41
+ const folder = resolve(context.workingFolder, request.folder)
42
+ if (await isInsideVault(folder, memory.output.protectedRoots, request.platform)) {
43
+ return {
44
+ succeeded: false,
45
+ reason: "inside-vault",
46
+ problems: [`${folder} is inside a vault; choose another folder`],
47
+ }
48
+ }
49
+ const collected = await collectVaults(memory.output)
50
+ if (collected.problems.length > 0) {
51
+ return { succeeded: false, reason: "unreadable-files", problems: collected.problems }
52
+ }
53
+ const interrupted = memoryOperationInterruption(context)
54
+ if (interrupted) return interrupted
55
+ const entries = exportEntries(collected.global, collected.project)
56
+ const archive = zipSync(Object.fromEntries(entries.map((entry) => [entry.path, entry.bytes])))
57
+ const path = join(folder, request.fileName)
58
+ const written = await writeNewFile(path, archive)
59
+ if (!written.succeeded) return written
60
+ const vaults = [memory.output.global.scope]
61
+ if (collected.project) vaults.push("project")
62
+ return { succeeded: true, output: { path, files: entries.length, vaults } }
63
+ }
64
+
65
+ async function isInsideVault(folder: string, vaults: string[], platform: PathPlatform): Promise<boolean> {
66
+ if (isInside(folder, vaults, platform)) return true
67
+ const canonical = await canonicalizeAccessPath(folder)
68
+ if (!canonical.succeeded) return false
69
+ return isInside(canonical.output, vaults, platform)
70
+ }
71
+
72
+ function isInside(folder: string, vaults: string[], platform: PathPlatform): boolean {
73
+ return typeof vaultAccessRefusal({ kind: "file", path: folder }, folder, folder, vaults, platform) === "string"
74
+ }
75
+
76
+ function checkFileName(fileName: string): string | null {
77
+ if (fileName === "" || FILE_NAME_SEPARATORS.test(fileName)) {
78
+ return "The file name must be a plain name with no folders"
79
+ }
80
+ if (!fileName.toLowerCase().endsWith(EXPORT_EXTENSION) || fileName.length === EXPORT_EXTENSION.length) {
81
+ return `The file name must end with ${EXPORT_EXTENSION}`
82
+ }
83
+ return null
84
+ }
@@ -0,0 +1,3 @@
1
+ export * from "./collect.ts"
2
+ export * from "./export-memory.ts"
3
+ export * from "./types.ts"
@@ -0,0 +1,28 @@
1
+ import type { MemoryScope, NewFileRefusal, VaultExportFile } from "#src/services"
2
+ import type { Failed, Succeeded } from "#src/shared"
3
+ import type { PathPlatform } from "#src/usecases/check-vault-access"
4
+ import type { MemoryResolutionRefusal } from "#src/usecases/resolve-memory"
5
+
6
+ export interface ExportMemoryRequest {
7
+ folder: string
8
+ fileName: string
9
+ platform: PathPlatform
10
+ }
11
+
12
+ export interface ExportedMemory {
13
+ path: string
14
+ files: number
15
+ vaults: MemoryScope[]
16
+ }
17
+
18
+ export interface ExportRefusal extends Failed {
19
+ reason: "invalid" | "inside-vault" | "unreadable-files"
20
+ }
21
+
22
+ export type ExportMemoryResult = Succeeded<ExportedMemory> | MemoryResolutionRefusal | ExportRefusal | NewFileRefusal
23
+
24
+ export interface CollectedVaults {
25
+ global: VaultExportFile[]
26
+ project: VaultExportFile[] | null
27
+ problems: string[]
28
+ }
@@ -0,0 +1,97 @@
1
+ import { inspectVaultFile, observeVaultPath } from "#src/services"
2
+ import { readLeasedFolder } from "#src/usecases/list-memory/leased"
3
+ import {
4
+ captureMemoryOperationContext,
5
+ type MemoryOperationContext,
6
+ memoryAdmissionRefusal,
7
+ memoryOperationInterruption,
8
+ staleMemorySession,
9
+ } from "#src/usecases/operation-context"
10
+ import type { ResolvedVault } from "#src/usecases/resolve-memory"
11
+ import { resolveLeasedMemory, selectMemoryVault } from "#src/usecases/resolve-memory/leased"
12
+ import type { GetMemoryRequest, GetMemoryResult } from "./types.ts"
13
+
14
+ export async function getMemory(
15
+ input: GetMemoryRequest,
16
+ callerContext: MemoryOperationContext,
17
+ ): Promise<GetMemoryResult> {
18
+ const context = captureMemoryOperationContext(callerContext)
19
+ const request = { vault: input.vault, path: input.path, sourceCallId: input.sourceCallId }
20
+ const lease = await context.session.acquire(context.stamp, context.signal)
21
+ if (!lease) return memoryAdmissionRefusal(context)
22
+ try {
23
+ const interrupted = memoryOperationInterruption(context)
24
+ if (interrupted) return interrupted
25
+ context.session.consumeReceipt(context.stamp, request)
26
+ const memory = await resolveLeasedMemory(context)
27
+ const stale = memoryOperationInterruption(context)
28
+ if (!memory.succeeded) return memory
29
+ if (stale) return stale
30
+ const target = selectMemoryVault(memory.output, request.vault)
31
+ if (!target.succeeded) return target
32
+ const result = await getLeasedMemory(request, target.output, context)
33
+ return deliverMemory(result, request, target.output, context)
34
+ } finally {
35
+ lease.release()
36
+ }
37
+ }
38
+
39
+ async function getLeasedMemory(
40
+ request: GetMemoryRequest,
41
+ target: ResolvedVault,
42
+ context: MemoryOperationContext,
43
+ ): Promise<GetMemoryResult> {
44
+ const entry = await observeVaultPath(target.vault, { path: request.path })
45
+ const interrupted = memoryOperationInterruption(context)
46
+ if (interrupted) return interrupted
47
+ if (!entry.succeeded) return entry
48
+ if (entry.output.kind === "directory") return readLeasedFolder(target, request.path, context)
49
+ return getLeasedNote(request, target, context)
50
+ }
51
+
52
+ async function getLeasedNote(
53
+ request: GetMemoryRequest,
54
+ target: ResolvedVault,
55
+ context: MemoryOperationContext,
56
+ ): Promise<GetMemoryResult> {
57
+ const inspected = await inspectVaultFile(target.vault, { path: request.path })
58
+ const interrupted = memoryOperationInterruption(context)
59
+ if (interrupted) return interrupted
60
+ if (!inspected.succeeded) return inspected
61
+ const file = inspected.output
62
+ const analysis = file.analysis
63
+ if (analysis.status === "unclosed") {
64
+ return {
65
+ succeeded: false,
66
+ reason: "unclosed-frontmatter",
67
+ file,
68
+ problems: [...analysis.frontmatterProblems, ...analysis.nameProblems, ...analysis.bodyProblems],
69
+ }
70
+ }
71
+ return { succeeded: true, output: { kind: "note", vault: request.vault, file: { ...file, analysis } } }
72
+ }
73
+
74
+ function deliverMemory(
75
+ result: GetMemoryResult,
76
+ request: GetMemoryRequest,
77
+ target: ResolvedVault,
78
+ context: MemoryOperationContext,
79
+ ): GetMemoryResult {
80
+ const interrupted = memoryOperationInterruption(context)
81
+ if (interrupted) return interrupted
82
+ if (!result.succeeded || result.output.kind !== "note") return result
83
+ const file = result.output.file
84
+ const analysis = file.analysis
85
+ let id: string | null = null
86
+ if (analysis.frontmatter) id = analysis.frontmatter.id
87
+ const remembered = context.session.rememberGet(context.stamp, {
88
+ ...file,
89
+ analysis,
90
+ id,
91
+ vault: request.vault,
92
+ canonicalVault: target.vault.path,
93
+ sourceCallId: request.sourceCallId,
94
+ })
95
+ if (!remembered) return staleMemorySession()
96
+ return result
97
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./get-memory.ts"
2
+ export * from "./types.ts"
@@ -0,0 +1,25 @@
1
+ import type { InspectedVaultFile, MemoryScope, ParsedVaultNote } from "#src/services"
2
+ import type { Failed, Succeeded } from "#src/shared"
3
+ import type { ListMemoryResult } from "#src/usecases/list-memory"
4
+ import type { MemoryAddress } from "#src/usecases/session"
5
+
6
+ export interface GetMemoryRequest extends MemoryAddress {
7
+ sourceCallId: string
8
+ }
9
+
10
+ export interface CompleteMemoryFile extends InspectedVaultFile {
11
+ analysis: ParsedVaultNote
12
+ }
13
+
14
+ export interface NoteRead {
15
+ kind: "note"
16
+ vault: MemoryScope
17
+ file: CompleteMemoryFile
18
+ }
19
+
20
+ export interface UnclosedMemoryRefusal extends Failed {
21
+ reason: "unclosed-frontmatter"
22
+ file: InspectedVaultFile
23
+ }
24
+
25
+ export type GetMemoryResult = Succeeded<NoteRead> | ListMemoryResult | UnclosedMemoryRefusal
@@ -0,0 +1,25 @@
1
+ export * from "./add-memory/index.ts"
2
+ export * from "./archive-memory/index.ts"
3
+ export * from "./capture-memory/index.ts"
4
+ export * from "./check-shell-edit/index.ts"
5
+ export * from "./check-vault-access/index.ts"
6
+ export * from "./complete-blank-memory/index.ts"
7
+ export * from "./diagnose-memory/index.ts"
8
+ export * from "./export-memory/index.ts"
9
+ export * from "./get-memory/index.ts"
10
+ export * from "./list-memory/index.ts"
11
+ export * from "./load-dont-forget/index.ts"
12
+ export * from "./memory-change/index.ts"
13
+ export * from "./operation-context/index.ts"
14
+ export * from "./registration/index.ts"
15
+ export * from "./relevant-memory/index.ts"
16
+ export * from "./resolve-memory/index.ts"
17
+ export * from "./search-memory/index.ts"
18
+ export * from "./semantic/index.ts"
19
+ export * from "./semantic-port/index.ts"
20
+ export * from "./semantic-provider/index.ts"
21
+ export * from "./session/index.ts"
22
+ export * from "./settings/index.ts"
23
+ export * from "./succeed-memory/index.ts"
24
+ export * from "./synchronize-memory/index.ts"
25
+ export * from "./update-memory/index.ts"
@@ -0,0 +1,2 @@
1
+ export * from "./list-memory.ts"
2
+ export * from "./types.ts"
@@ -0,0 +1,2 @@
1
+ export * from "./read.ts"
2
+ export * from "./types.ts"
@@ -0,0 +1,16 @@
1
+ import { readFolderIndex } from "#src/services"
2
+ import { type MemoryOperationContext, memoryOperationInterruption } from "#src/usecases/operation-context"
3
+ import type { ResolvedVault } from "#src/usecases/resolve-memory"
4
+ import type { ListMemoryResult } from "./types.ts"
5
+
6
+ export async function readLeasedFolder(
7
+ target: ResolvedVault,
8
+ folder: string,
9
+ context: MemoryOperationContext,
10
+ ): Promise<ListMemoryResult> {
11
+ const result = await readFolderIndex(target.vault, { folder })
12
+ const interrupted = memoryOperationInterruption(context)
13
+ if (interrupted) return interrupted
14
+ if (!result.succeeded) return result
15
+ return { succeeded: true, output: { kind: "folder", vault: target.scope, ...result.output } }
16
+ }
@@ -0,0 +1,21 @@
1
+ import type {
2
+ AmbiguousFolderIndex,
3
+ FolderIndex,
4
+ MemoryScope,
5
+ NoProjectRefusal,
6
+ VaultCatalogFailure,
7
+ } from "#src/services"
8
+ import type { Succeeded } from "#src/shared"
9
+ import type { MemoryResolutionRefusal } from "#src/usecases/resolve-memory"
10
+
11
+ export interface FolderRead extends FolderIndex {
12
+ kind: "folder"
13
+ vault: MemoryScope
14
+ }
15
+
16
+ export type ListMemoryResult =
17
+ | Succeeded<FolderRead>
18
+ | MemoryResolutionRefusal
19
+ | NoProjectRefusal
20
+ | VaultCatalogFailure
21
+ | AmbiguousFolderIndex
@@ -0,0 +1,33 @@
1
+ import { readLeasedFolder } from "#src/usecases/list-memory/leased"
2
+ import {
3
+ captureMemoryOperationContext,
4
+ type MemoryOperationContext,
5
+ memoryAdmissionRefusal,
6
+ memoryOperationInterruption,
7
+ } from "#src/usecases/operation-context"
8
+ import { resolveLeasedMemory, selectMemoryVault } from "#src/usecases/resolve-memory/leased"
9
+ import type { ListMemoryRequest, ListMemoryResult } from "./types.ts"
10
+
11
+ export async function listMemory(
12
+ input: ListMemoryRequest,
13
+ callerContext: MemoryOperationContext,
14
+ ): Promise<ListMemoryResult> {
15
+ const context = captureMemoryOperationContext(callerContext)
16
+ const request = { vault: input.vault, folder: input.folder }
17
+ const lease = await context.session.acquire(context.stamp, context.signal)
18
+ if (!lease) return memoryAdmissionRefusal(context)
19
+ try {
20
+ const memory = await resolveLeasedMemory(context)
21
+ const interrupted = memoryOperationInterruption(context)
22
+ if (!memory.succeeded) return memory
23
+ if (interrupted) return interrupted
24
+ const target = selectMemoryVault(memory.output, request.vault)
25
+ if (!target.succeeded) return target
26
+ const result = await readLeasedFolder(target.output, request.folder, context)
27
+ const stale = memoryOperationInterruption(context)
28
+ if (stale) return stale
29
+ return result
30
+ } finally {
31
+ lease.release()
32
+ }
33
+ }