pi-obsidian-memory 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (572) hide show
  1. package/README.md +173 -7
  2. package/package.json +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,49 @@
1
+ import {
2
+ absoluteCandidate,
3
+ canonicalizeAccessPath,
4
+ fileIdentity,
5
+ type PathIdentity,
6
+ pathIdentities,
7
+ vaultAccessRefusal,
8
+ } from "#src/services"
9
+ import { NAMESPACE_PATH_START, NO_FILE_ID } from "./constants.ts"
10
+ import type { GuardedTargets, TargetCheck } from "./types.ts"
11
+
12
+ export async function guardedTargets(written: string[]): Promise<GuardedTargets> {
13
+ const roots = [...written]
14
+ const identities: PathIdentity[] = []
15
+ for (const path of written) {
16
+ const canonical = await canonicalizeAccessPath(path)
17
+ if (canonical.succeeded) roots.push(canonical.output)
18
+ const identity = await fileIdentity(path)
19
+ if (identity.succeeded && hasFileId(identity.output)) identities.push(identity.output)
20
+ }
21
+ return { roots, identities }
22
+ }
23
+
24
+ export async function hitsTargets(check: TargetCheck): Promise<boolean> {
25
+ const { request, cwd, home, platform, targets } = check
26
+ if (vaultAccessRefusal(request, cwd, home, targets.roots, platform)) return true
27
+ if (request.kind === "command") return false
28
+ const absolute = absoluteCandidate(request.path, cwd, home, platform)
29
+ const canonical = await canonicalizeAccessPath(absolute)
30
+ if (
31
+ canonical.succeeded &&
32
+ vaultAccessRefusal({ kind: request.kind, path: canonical.output }, cwd, home, targets.roots, platform)
33
+ ) {
34
+ return true
35
+ }
36
+ return sharesIdentity(absolute, targets.identities)
37
+ }
38
+
39
+ async function sharesIdentity(absolute: string, identities: PathIdentity[]): Promise<boolean> {
40
+ const found = await pathIdentities(absolute)
41
+ if (!found.succeeded) return NAMESPACE_PATH_START.test(absolute)
42
+ return found.output
43
+ .filter(hasFileId)
44
+ .some((seen) => identities.some((target) => target.device === seen.device && target.inode === seen.inode))
45
+ }
46
+
47
+ function hasFileId(identity: PathIdentity): boolean {
48
+ return identity.inode !== NO_FILE_ID
49
+ }
@@ -0,0 +1,33 @@
1
+ export type { VaultAccessRequest } from "#src/services"
2
+
3
+ import type { PathIdentity, PathPlatform, VaultAccessRequest } from "#src/services"
4
+ import type { Done, Failed } from "#src/shared"
5
+
6
+ export type { PathPlatform } from "#src/services"
7
+
8
+ export interface CheckVaultAccessInput {
9
+ configPath: string
10
+ cwd: string
11
+ home: string
12
+ platform: PathPlatform
13
+ request: VaultAccessRequest
14
+ }
15
+
16
+ export interface VaultAccessRefusal extends Failed {
17
+ reason: "vault-access"
18
+ }
19
+
20
+ export type CheckVaultAccessResult = Done | VaultAccessRefusal
21
+
22
+ export interface GuardedTargets {
23
+ roots: string[]
24
+ identities: PathIdentity[]
25
+ }
26
+
27
+ export interface TargetCheck {
28
+ request: VaultAccessRequest
29
+ cwd: string
30
+ home: string
31
+ platform: PathPlatform
32
+ targets: GuardedTargets
33
+ }
@@ -0,0 +1,48 @@
1
+ import { completeBlankFile, type Note, newNoteId, refreshIndexes, today } from "#src/services"
2
+ import { refreshWarnings, warningsOf } from "#src/usecases/memory-change"
3
+ import {
4
+ captureMemoryOperationContext,
5
+ type MemoryOperationContext,
6
+ memoryAdmissionRefusal,
7
+ } from "#src/usecases/operation-context"
8
+ import { resolveLeasedMemory, selectMemoryVault } from "#src/usecases/resolve-memory/leased"
9
+ import type { CompleteBlankMemoryRequest, CompleteBlankMemoryResult } from "./types.ts"
10
+
11
+ export async function completeBlankMemory(
12
+ request: CompleteBlankMemoryRequest,
13
+ callerContext: MemoryOperationContext,
14
+ ): Promise<CompleteBlankMemoryResult> {
15
+ const context = captureMemoryOperationContext(callerContext)
16
+ const lease = await context.session.acquire(context.stamp, context.signal)
17
+ if (!lease) return memoryAdmissionRefusal(context)
18
+ try {
19
+ const memory = await resolveLeasedMemory(context)
20
+ if (!memory.succeeded) return memory
21
+ const target = selectMemoryVault(memory.output, request.vault)
22
+ if (!target.succeeded) return target
23
+ const day = today()
24
+ const note: Note = {
25
+ statement: statementOf(request.path),
26
+ frontmatter: { id: newNoteId(), type: request.type, created: day, updated: day },
27
+ body: request.body,
28
+ }
29
+ const completed = await completeBlankFile(target.output.vault, {
30
+ path: request.path,
31
+ expectedHash: request.expectedHash,
32
+ note,
33
+ confirmed: true,
34
+ })
35
+ if (!completed.succeeded) return completed
36
+ const folder = request.path.slice(0, Math.max(0, request.path.lastIndexOf("/")))
37
+ const refreshed = await refreshIndexes(target.output.vault, folder)
38
+ const maintenanceProblems = [...warningsOf(completed), ...refreshWarnings(refreshed)]
39
+ return { succeeded: true, output: { vault: request.vault, path: request.path, maintenanceProblems } }
40
+ } finally {
41
+ lease.release()
42
+ }
43
+ }
44
+
45
+ function statementOf(path: string): string {
46
+ const name = path.slice(path.lastIndexOf("/") + 1)
47
+ return name.slice(0, -".md".length)
48
+ }
@@ -0,0 +1,3 @@
1
+ import { CompleteBlankMemoryRequestSchema } from "./schemas.ts"
2
+
3
+ export const BLANK_NOTE_TYPES = CompleteBlankMemoryRequestSchema.properties.type.enum
@@ -0,0 +1,4 @@
1
+ export * from "./complete-blank-memory.ts"
2
+ export * from "./constants.ts"
3
+ export * from "./schemas.ts"
4
+ export * from "./types.ts"
@@ -0,0 +1,14 @@
1
+ import Type from "typebox"
2
+
3
+ import { MemoryDraftSchema, MemoryScopeSchema } from "#src/services"
4
+
5
+ export const CompleteBlankMemoryRequestSchema = Type.Object(
6
+ {
7
+ vault: MemoryScopeSchema,
8
+ path: Type.String(),
9
+ expectedHash: Type.String(),
10
+ type: MemoryDraftSchema.properties.type,
11
+ body: MemoryDraftSchema.properties.body,
12
+ },
13
+ { additionalProperties: false },
14
+ )
@@ -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
+ }