pi-obsidian-memory 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (572) hide show
  1. package/README.md +173 -7
  2. package/package.json +45 -7
  3. package/skills/obsidian-memory/SKILL.md +101 -0
  4. package/src/domain/capture/constants.ts +5 -0
  5. package/src/domain/capture/index.ts +6 -0
  6. package/src/domain/capture/input-problems.ts +9 -0
  7. package/src/domain/capture/schemas.ts +92 -0
  8. package/src/domain/capture/tally.ts +26 -0
  9. package/src/domain/capture/types.ts +49 -0
  10. package/src/domain/capture/validate.ts +75 -0
  11. package/src/domain/command-flags/constants.ts +141 -0
  12. package/src/domain/command-flags/index.ts +1 -0
  13. package/src/domain/config/change.ts +105 -0
  14. package/src/domain/config/constants.ts +25 -0
  15. package/src/domain/config/diagnostics.ts +35 -0
  16. package/src/domain/config/disclosures.ts +8 -0
  17. package/src/domain/config/fields.ts +7 -0
  18. package/src/domain/config/index.ts +11 -0
  19. package/src/domain/config/inspection.ts +43 -0
  20. package/src/domain/config/invariants.ts +68 -0
  21. package/src/domain/config/legacy-capture.ts +17 -0
  22. package/src/domain/config/observations.ts +109 -0
  23. package/src/domain/config/parse.ts +25 -0
  24. package/src/domain/config/paths.ts +61 -0
  25. package/src/domain/config/registration.ts +34 -0
  26. package/src/domain/config/repair.ts +36 -0
  27. package/src/domain/config/resources.ts +65 -0
  28. package/src/domain/config/rules.ts +49 -0
  29. package/src/domain/config/schemas.ts +155 -0
  30. package/src/domain/config/settings.ts +23 -0
  31. package/src/domain/config/types.ts +239 -0
  32. package/src/domain/decision-model/constants.ts +7 -0
  33. package/src/domain/decision-model/cutoffs.ts +8 -0
  34. package/src/domain/decision-model/endpoint.ts +11 -0
  35. package/src/domain/decision-model/failure-detail.ts +8 -0
  36. package/src/domain/decision-model/index.ts +6 -0
  37. package/src/domain/decision-model/rank.ts +36 -0
  38. package/src/domain/decision-model/types.ts +77 -0
  39. package/src/domain/embeddings/constants.ts +55 -0
  40. package/src/domain/embeddings/identity.ts +30 -0
  41. package/src/domain/embeddings/index.ts +5 -0
  42. package/src/domain/embeddings/schemas.ts +25 -0
  43. package/src/domain/embeddings/types.ts +52 -0
  44. package/src/domain/embeddings/vectors.ts +53 -0
  45. package/src/domain/folder-index/constants.ts +9 -0
  46. package/src/domain/folder-index/display.ts +22 -0
  47. package/src/domain/folder-index/index.ts +5 -0
  48. package/src/domain/folder-index/listing.ts +58 -0
  49. package/src/domain/folder-index/render.ts +114 -0
  50. package/src/domain/folder-index/types.ts +41 -0
  51. package/src/domain/index.ts +22 -0
  52. package/src/domain/lifecycle/index.ts +2 -0
  53. package/src/domain/lifecycle/lifecycle.ts +39 -0
  54. package/src/domain/lifecycle/types.ts +17 -0
  55. package/src/domain/loaded-memory/budget.ts +14 -0
  56. package/src/domain/loaded-memory/constants.ts +9 -0
  57. package/src/domain/loaded-memory/index.ts +4 -0
  58. package/src/domain/loaded-memory/render.ts +30 -0
  59. package/src/domain/loaded-memory/types.ts +19 -0
  60. package/src/domain/memory/draft.ts +12 -0
  61. package/src/domain/memory/index.ts +4 -0
  62. package/src/domain/memory/schemas.ts +15 -0
  63. package/src/domain/memory/target.ts +27 -0
  64. package/src/domain/memory/types.ts +20 -0
  65. package/src/domain/memory-agent/index.ts +5 -0
  66. package/src/domain/memory-agent/input-problems.ts +9 -0
  67. package/src/domain/memory-agent/refusal.ts +6 -0
  68. package/src/domain/memory-agent/schemas.ts +112 -0
  69. package/src/domain/memory-agent/types.ts +25 -0
  70. package/src/domain/memory-agent/validate.ts +67 -0
  71. package/src/domain/names/constants.ts +32 -0
  72. package/src/domain/names/index.ts +2 -0
  73. package/src/domain/names/names.ts +83 -0
  74. package/src/domain/note/check.ts +68 -0
  75. package/src/domain/note/constants.ts +15 -0
  76. package/src/domain/note/frontmatter-fields.ts +175 -0
  77. package/src/domain/note/frontmatter.ts +138 -0
  78. package/src/domain/note/index.ts +9 -0
  79. package/src/domain/note/parse.ts +41 -0
  80. package/src/domain/note/render.ts +27 -0
  81. package/src/domain/note/schema-errors.ts +41 -0
  82. package/src/domain/note/schemas.ts +38 -0
  83. package/src/domain/note/types.ts +53 -0
  84. package/src/domain/note/validate.ts +19 -0
  85. package/src/domain/path-platform/index.ts +2 -0
  86. package/src/domain/path-platform/path-module.ts +11 -0
  87. package/src/domain/path-platform/types.ts +1 -0
  88. package/src/domain/search-catalog/constants.ts +1 -0
  89. package/src/domain/search-catalog/coverage.ts +35 -0
  90. package/src/domain/search-catalog/dont-forget.ts +10 -0
  91. package/src/domain/search-catalog/fingerprint.ts +9 -0
  92. package/src/domain/search-catalog/index.ts +10 -0
  93. package/src/domain/search-catalog/inspection.ts +47 -0
  94. package/src/domain/search-catalog/plan.ts +68 -0
  95. package/src/domain/search-catalog/ranking.ts +27 -0
  96. package/src/domain/search-catalog/schemas.ts +49 -0
  97. package/src/domain/search-catalog/types.ts +103 -0
  98. package/src/domain/search-catalog/vector-refresh.ts +22 -0
  99. package/src/domain/shell-edit/command-segments.ts +28 -0
  100. package/src/domain/shell-edit/command-words.ts +22 -0
  101. package/src/domain/shell-edit/constants.ts +125 -0
  102. package/src/domain/shell-edit/executed-files.ts +154 -0
  103. package/src/domain/shell-edit/index.ts +6 -0
  104. package/src/domain/shell-edit/powershell-files.ts +38 -0
  105. package/src/domain/shell-edit/rules.ts +19 -0
  106. package/src/domain/shell-edit/types.ts +75 -0
  107. package/src/domain/tool-flags/constants.ts +178 -0
  108. package/src/domain/tool-flags/index.ts +2 -0
  109. package/src/domain/tool-flags/types.ts +7 -0
  110. package/src/domain/validation/constants.ts +1 -0
  111. package/src/domain/validation/describe.ts +137 -0
  112. package/src/domain/validation/index.ts +3 -0
  113. package/src/domain/validation/types.ts +3 -0
  114. package/src/domain/vault-access/absolute-candidate.ts +81 -0
  115. package/src/domain/vault-access/argument-tokens.ts +22 -0
  116. package/src/domain/vault-access/command-mentions-vault.ts +115 -0
  117. package/src/domain/vault-access/constants.ts +54 -0
  118. package/src/domain/vault-access/index.ts +7 -0
  119. package/src/domain/vault-access/types.ts +18 -0
  120. package/src/domain/vault-access/vault-access-refusal.ts +36 -0
  121. package/src/domain/vault-access/vault-location.ts +22 -0
  122. package/src/domain/vault-assets/index.ts +2 -0
  123. package/src/domain/vault-assets/render.ts +51 -0
  124. package/src/domain/vault-assets/types.ts +36 -0
  125. package/src/domain/vault-catalog/analyze.ts +37 -0
  126. package/src/domain/vault-catalog/classify.ts +37 -0
  127. package/src/domain/vault-catalog/dont-forget.ts +6 -0
  128. package/src/domain/vault-catalog/export-entries.ts +10 -0
  129. package/src/domain/vault-catalog/index.ts +5 -0
  130. package/src/domain/vault-catalog/types.ts +114 -0
  131. package/src/domain/vault-diagnosis/diagnose.ts +79 -0
  132. package/src/domain/vault-diagnosis/index.ts +2 -0
  133. package/src/domain/vault-diagnosis/types.ts +31 -0
  134. package/src/domain/vault-path/constants.ts +13 -0
  135. package/src/domain/vault-path/index.ts +2 -0
  136. package/src/domain/vault-path/vault-path.ts +65 -0
  137. package/src/pi/capture/cadence.ts +49 -0
  138. package/src/pi/capture/completion.ts +26 -0
  139. package/src/pi/capture/constants.ts +5 -0
  140. package/src/pi/capture/handlers.ts +30 -0
  141. package/src/pi/capture/index.ts +8 -0
  142. package/src/pi/capture/runtime.ts +83 -0
  143. package/src/pi/capture/schemas.ts +8 -0
  144. package/src/pi/capture/tool-calls.ts +6 -0
  145. package/src/pi/capture/transcript.ts +55 -0
  146. package/src/pi/capture/types.ts +46 -0
  147. package/src/pi/change-report/constants.ts +15 -0
  148. package/src/pi/change-report/index.ts +3 -0
  149. package/src/pi/change-report/report.ts +54 -0
  150. package/src/pi/change-report/types.ts +8 -0
  151. package/src/pi/context/constants.ts +5 -0
  152. package/src/pi/context/index.ts +3 -0
  153. package/src/pi/context/status.ts +15 -0
  154. package/src/pi/context/types.ts +98 -0
  155. package/src/pi/extension.ts +100 -0
  156. package/src/pi/index.ts +26 -0
  157. package/src/pi/memory-add/constants.ts +13 -0
  158. package/src/pi/memory-add/index.ts +5 -0
  159. package/src/pi/memory-add/memory-add.ts +31 -0
  160. package/src/pi/memory-add/respond.ts +55 -0
  161. package/src/pi/memory-add/schemas.ts +29 -0
  162. package/src/pi/memory-add/types.ts +15 -0
  163. package/src/pi/memory-archive/constants.ts +8 -0
  164. package/src/pi/memory-archive/index.ts +4 -0
  165. package/src/pi/memory-archive/memory-archive.ts +29 -0
  166. package/src/pi/memory-archive/schemas.ts +15 -0
  167. package/src/pi/memory-archive/types.ts +8 -0
  168. package/src/pi/memory-block/block.ts +75 -0
  169. package/src/pi/memory-block/constants.ts +24 -0
  170. package/src/pi/memory-block/index.ts +4 -0
  171. package/src/pi/memory-block/render.ts +54 -0
  172. package/src/pi/memory-block/types.ts +24 -0
  173. package/src/pi/memory-doctor/constants.ts +43 -0
  174. package/src/pi/memory-doctor/index.ts +4 -0
  175. package/src/pi/memory-doctor/memory-doctor.ts +135 -0
  176. package/src/pi/memory-doctor/report.ts +101 -0
  177. package/src/pi/memory-doctor/types.ts +13 -0
  178. package/src/pi/memory-export/constants.ts +15 -0
  179. package/src/pi/memory-export/index.ts +4 -0
  180. package/src/pi/memory-export/memory-export.ts +57 -0
  181. package/src/pi/memory-export/name.ts +9 -0
  182. package/src/pi/memory-export/types.ts +4 -0
  183. package/src/pi/memory-get/constants.ts +12 -0
  184. package/src/pi/memory-get/index.ts +5 -0
  185. package/src/pi/memory-get/memory-get.ts +23 -0
  186. package/src/pi/memory-get/respond.ts +38 -0
  187. package/src/pi/memory-get/schemas.ts +13 -0
  188. package/src/pi/memory-get/types.ts +10 -0
  189. package/src/pi/memory-init/constants.ts +17 -0
  190. package/src/pi/memory-init/index.ts +2 -0
  191. package/src/pi/memory-init/memory-init.ts +63 -0
  192. package/src/pi/memory-search/constants.ts +16 -0
  193. package/src/pi/memory-search/index.ts +5 -0
  194. package/src/pi/memory-search/memory-search.ts +22 -0
  195. package/src/pi/memory-search/respond.ts +62 -0
  196. package/src/pi/memory-search/schemas.ts +11 -0
  197. package/src/pi/memory-search/types.ts +10 -0
  198. package/src/pi/memory-session/constants.ts +7 -0
  199. package/src/pi/memory-session/index.ts +4 -0
  200. package/src/pi/memory-session/keeper.ts +101 -0
  201. package/src/pi/memory-session/respond.ts +6 -0
  202. package/src/pi/memory-session/types.ts +23 -0
  203. package/src/pi/memory-settings/constants.ts +69 -0
  204. package/src/pi/memory-settings/edits.ts +46 -0
  205. package/src/pi/memory-settings/index.ts +9 -0
  206. package/src/pi/memory-settings/lines.ts +119 -0
  207. package/src/pi/memory-settings/models.ts +81 -0
  208. package/src/pi/memory-settings/projects.ts +46 -0
  209. package/src/pi/memory-settings/providers.ts +77 -0
  210. package/src/pi/memory-settings/save.ts +16 -0
  211. package/src/pi/memory-settings/screen.ts +27 -0
  212. package/src/pi/memory-settings/types.ts +87 -0
  213. package/src/pi/memory-setup/constants.ts +33 -0
  214. package/src/pi/memory-setup/disclosure.ts +22 -0
  215. package/src/pi/memory-setup/index.ts +4 -0
  216. package/src/pi/memory-setup/memory-setup.ts +153 -0
  217. package/src/pi/memory-setup/types.ts +6 -0
  218. package/src/pi/memory-succeed/constants.ts +10 -0
  219. package/src/pi/memory-succeed/index.ts +4 -0
  220. package/src/pi/memory-succeed/memory-succeed.ts +34 -0
  221. package/src/pi/memory-succeed/schemas.ts +30 -0
  222. package/src/pi/memory-succeed/types.ts +8 -0
  223. package/src/pi/memory-update/constants.ts +8 -0
  224. package/src/pi/memory-update/index.ts +4 -0
  225. package/src/pi/memory-update/memory-update.ts +29 -0
  226. package/src/pi/memory-update/schemas.ts +24 -0
  227. package/src/pi/memory-update/types.ts +8 -0
  228. package/src/pi/paths/constants.ts +7 -0
  229. package/src/pi/paths/index.ts +2 -0
  230. package/src/pi/paths/paths.ts +15 -0
  231. package/src/pi/paths/platform.ts +7 -0
  232. package/src/pi/registrar.ts +25 -0
  233. package/src/pi/registration-report/constants.ts +13 -0
  234. package/src/pi/registration-report/index.ts +2 -0
  235. package/src/pi/registration-report/report.ts +26 -0
  236. package/src/pi/relevant-memory/constants.ts +3 -0
  237. package/src/pi/relevant-memory/index.ts +4 -0
  238. package/src/pi/relevant-memory/prompt.ts +23 -0
  239. package/src/pi/relevant-memory/runtime.ts +88 -0
  240. package/src/pi/relevant-memory/types.ts +14 -0
  241. package/src/pi/semantic/constants.ts +3 -0
  242. package/src/pi/semantic/index.ts +2 -0
  243. package/src/pi/semantic/runtime.ts +59 -0
  244. package/src/pi/session-start/constants.ts +7 -0
  245. package/src/pi/session-start/index.ts +3 -0
  246. package/src/pi/session-start/session-start.ts +48 -0
  247. package/src/pi/session-start/types.ts +5 -0
  248. package/src/pi/shell-edit-guard/guard.ts +41 -0
  249. package/src/pi/shell-edit-guard/index.ts +3 -0
  250. package/src/pi/shell-edit-guard/prompt.ts +30 -0
  251. package/src/pi/shell-edit-guard/types.ts +13 -0
  252. package/src/pi/types.ts +44 -0
  253. package/src/pi/vault-guard/constants.ts +1 -0
  254. package/src/pi/vault-guard/index.ts +4 -0
  255. package/src/pi/vault-guard/request.ts +39 -0
  256. package/src/pi/vault-guard/types.ts +5 -0
  257. package/src/pi/vault-guard/vault-guard.ts +21 -0
  258. package/src/services/capture-cadence/domain-rules.ts +8 -0
  259. package/src/services/capture-cadence/index.ts +1 -0
  260. package/src/services/clock/clock.ts +7 -0
  261. package/src/services/clock/index.ts +1 -0
  262. package/src/services/config/canonicalize.ts +163 -0
  263. package/src/services/config/constants.ts +1 -0
  264. package/src/services/config/fully-qualified-path.ts +14 -0
  265. package/src/services/config/index.ts +12 -0
  266. package/src/services/config/path-identity.ts +65 -0
  267. package/src/services/config/publication.ts +75 -0
  268. package/src/services/config/read.ts +47 -0
  269. package/src/services/config/registration.ts +26 -0
  270. package/src/services/config/resolve-input.ts +27 -0
  271. package/src/services/config/snapshot.ts +26 -0
  272. package/src/services/config/target.ts +2 -0
  273. package/src/services/config/types.ts +97 -0
  274. package/src/services/config/vault-access.ts +2 -0
  275. package/src/services/config/volume-namespace.ts +5 -0
  276. package/src/services/config/write.ts +63 -0
  277. package/src/services/decision-model/constants.ts +16 -0
  278. package/src/services/decision-model/decide.ts +42 -0
  279. package/src/services/decision-model/diagnostics.ts +6 -0
  280. package/src/services/decision-model/endpoint.ts +1 -0
  281. package/src/services/decision-model/failure-detail.ts +1 -0
  282. package/src/services/decision-model/index.ts +7 -0
  283. package/src/services/decision-model/interruption.ts +29 -0
  284. package/src/services/decision-model/jev.ts +61 -0
  285. package/src/services/decision-model/laya-batch.ts +64 -0
  286. package/src/services/decision-model/laya-http-failure.ts +41 -0
  287. package/src/services/decision-model/laya-response.ts +95 -0
  288. package/src/services/decision-model/laya.ts +35 -0
  289. package/src/services/decision-model/preflight.ts +24 -0
  290. package/src/services/decision-model/prompts.ts +36 -0
  291. package/src/services/decision-model/schemas.ts +43 -0
  292. package/src/services/decision-model/score-candidates.ts +41 -0
  293. package/src/services/decision-model/types.ts +182 -0
  294. package/src/services/embeddings/asset-download.ts +45 -0
  295. package/src/services/embeddings/asset-fetch.ts +39 -0
  296. package/src/services/embeddings/asset-inspection.ts +36 -0
  297. package/src/services/embeddings/batch.ts +32 -0
  298. package/src/services/embeddings/chunks.ts +80 -0
  299. package/src/services/embeddings/configuration.ts +8 -0
  300. package/src/services/embeddings/constants.ts +24 -0
  301. package/src/services/embeddings/errors.ts +11 -0
  302. package/src/services/embeddings/google.ts +90 -0
  303. package/src/services/embeddings/http.ts +64 -0
  304. package/src/services/embeddings/index.ts +17 -0
  305. package/src/services/embeddings/inference.ts +35 -0
  306. package/src/services/embeddings/local.ts +138 -0
  307. package/src/services/embeddings/model-asset.ts +68 -0
  308. package/src/services/embeddings/model-cache.ts +30 -0
  309. package/src/services/embeddings/openai.ts +64 -0
  310. package/src/services/embeddings/operation.ts +31 -0
  311. package/src/services/embeddings/responses.ts +41 -0
  312. package/src/services/embeddings/runtime.ts +13 -0
  313. package/src/services/embeddings/schemas.ts +53 -0
  314. package/src/services/embeddings/types.ts +116 -0
  315. package/src/services/id/id.ts +5 -0
  316. package/src/services/id/index.ts +1 -0
  317. package/src/services/index.ts +11 -0
  318. package/src/services/llm/capture.ts +19 -0
  319. package/src/services/llm/check-chat-models.ts +38 -0
  320. package/src/services/llm/complete.ts +57 -0
  321. package/src/services/llm/constants.ts +32 -0
  322. package/src/services/llm/domain-rules.ts +2 -0
  323. package/src/services/llm/index.ts +6 -0
  324. package/src/services/llm/lifetime.ts +16 -0
  325. package/src/services/llm/retrieve.ts +19 -0
  326. package/src/services/llm/schemas.ts +9 -0
  327. package/src/services/llm/types.ts +94 -0
  328. package/src/services/search-index/catalog-query.ts +34 -0
  329. package/src/services/search-index/catalog-statements.ts +33 -0
  330. package/src/services/search-index/catalog.ts +19 -0
  331. package/src/services/search-index/cleanup.ts +13 -0
  332. package/src/services/search-index/close.ts +5 -0
  333. package/src/services/search-index/constants.ts +102 -0
  334. package/src/services/search-index/dont-forget.ts +1 -0
  335. package/src/services/search-index/fingerprint.ts +17 -0
  336. package/src/services/search-index/folder-index-statements.ts +17 -0
  337. package/src/services/search-index/folder-index-storage.ts +54 -0
  338. package/src/services/search-index/folder-indexes.ts +13 -0
  339. package/src/services/search-index/index.ts +14 -0
  340. package/src/services/search-index/inspection.ts +1 -0
  341. package/src/services/search-index/inventory.ts +67 -0
  342. package/src/services/search-index/legacy.ts +64 -0
  343. package/src/services/search-index/location.ts +12 -0
  344. package/src/services/search-index/open.ts +46 -0
  345. package/src/services/search-index/query.ts +39 -0
  346. package/src/services/search-index/ranking.ts +12 -0
  347. package/src/services/search-index/reconcile.ts +93 -0
  348. package/src/services/search-index/recovery.ts +56 -0
  349. package/src/services/search-index/refusals.ts +21 -0
  350. package/src/services/search-index/schema.ts +42 -0
  351. package/src/services/search-index/schemas.ts +181 -0
  352. package/src/services/search-index/search.ts +5 -0
  353. package/src/services/search-index/statements.ts +18 -0
  354. package/src/services/search-index/storage.ts +207 -0
  355. package/src/services/search-index/types.ts +113 -0
  356. package/src/services/search-index/vector-statements.ts +18 -0
  357. package/src/services/search-index/vector-storage.ts +169 -0
  358. package/src/services/search-index/vectors.ts +18 -0
  359. package/src/services/search-index/write.ts +9 -0
  360. package/src/services/shell-edit/ask.ts +53 -0
  361. package/src/services/shell-edit/domain-rules.ts +2 -0
  362. package/src/services/shell-edit/index.ts +4 -0
  363. package/src/services/shell-edit/schemas.ts +23 -0
  364. package/src/services/shell-edit/types.ts +61 -0
  365. package/src/services/shell-scripts/constants.ts +1 -0
  366. package/src/services/shell-scripts/files.ts +16 -0
  367. package/src/services/shell-scripts/index.ts +5 -0
  368. package/src/services/shell-scripts/package-scripts.ts +74 -0
  369. package/src/services/shell-scripts/schemas.ts +3 -0
  370. package/src/services/shell-scripts/scripts.ts +27 -0
  371. package/src/services/shell-scripts/types.ts +11 -0
  372. package/src/services/vault/archive.ts +31 -0
  373. package/src/services/vault/bootstrap/ensure.ts +50 -0
  374. package/src/services/vault/bootstrap/index.ts +2 -0
  375. package/src/services/vault/bootstrap/paths.ts +57 -0
  376. package/src/services/vault/bootstrap/types.ts +17 -0
  377. package/src/services/vault/bootstrap/write.ts +47 -0
  378. package/src/services/vault/catalog/bytes.ts +51 -0
  379. package/src/services/vault/catalog/dont-forget.ts +1 -0
  380. package/src/services/vault/catalog/enumerate.ts +69 -0
  381. package/src/services/vault/catalog/export.ts +21 -0
  382. package/src/services/vault/catalog/failures.ts +16 -0
  383. package/src/services/vault/catalog/index.ts +10 -0
  384. package/src/services/vault/catalog/inspect.ts +41 -0
  385. package/src/services/vault/catalog/observe.ts +35 -0
  386. package/src/services/vault/catalog/resolve.ts +94 -0
  387. package/src/services/vault/catalog/stat.ts +23 -0
  388. package/src/services/vault/catalog/types.ts +69 -0
  389. package/src/services/vault/catalog/visit.ts +58 -0
  390. package/src/services/vault/complete-blank.ts +66 -0
  391. package/src/services/vault/constants.ts +3 -0
  392. package/src/services/vault/context/index.ts +1 -0
  393. package/src/services/vault/context/types.ts +10 -0
  394. package/src/services/vault/create.ts +19 -0
  395. package/src/services/vault/display.ts +6 -0
  396. package/src/services/vault/domain-rules.ts +10 -0
  397. package/src/services/vault/draft.ts +2 -0
  398. package/src/services/vault/filesystem/failures.ts +53 -0
  399. package/src/services/vault/filesystem/hash.ts +5 -0
  400. package/src/services/vault/filesystem/index.ts +5 -0
  401. package/src/services/vault/filesystem/read.ts +61 -0
  402. package/src/services/vault/filesystem/types.ts +36 -0
  403. package/src/services/vault/filesystem/write.ts +80 -0
  404. package/src/services/vault/find.ts +27 -0
  405. package/src/services/vault/folder-contents.ts +31 -0
  406. package/src/services/vault/folder-index/index.ts +2 -0
  407. package/src/services/vault/folder-index/read.ts +87 -0
  408. package/src/services/vault/folder-index/types.ts +19 -0
  409. package/src/services/vault/folder-listing.ts +1 -0
  410. package/src/services/vault/index.ts +21 -0
  411. package/src/services/vault/inspect-folder.ts +13 -0
  412. package/src/services/vault/list.ts +121 -0
  413. package/src/services/vault/memory-folder.ts +24 -0
  414. package/src/services/vault/paths.ts +11 -0
  415. package/src/services/vault/publish.ts +52 -0
  416. package/src/services/vault/read.ts +46 -0
  417. package/src/services/vault/refresh-folders.ts +197 -0
  418. package/src/services/vault/refresh-plan.ts +79 -0
  419. package/src/services/vault/refresh.ts +8 -0
  420. package/src/services/vault/refusals.ts +23 -0
  421. package/src/services/vault/relocate.ts +131 -0
  422. package/src/services/vault/relocation-checks.ts +89 -0
  423. package/src/services/vault/resolve-stored-file.ts +43 -0
  424. package/src/services/vault/resolve.ts +109 -0
  425. package/src/services/vault/succeed.ts +45 -0
  426. package/src/services/vault/types.ts +199 -0
  427. package/src/services/vault/update-file.ts +58 -0
  428. package/src/services/vault/update.ts +22 -0
  429. package/src/services/vault/write-new-file.ts +37 -0
  430. package/src/shared/index.ts +1 -0
  431. package/src/shared/result/index.ts +1 -0
  432. package/src/shared/result/types.ts +17 -0
  433. package/src/usecases/add-memory/add-memory.ts +83 -0
  434. package/src/usecases/add-memory/index.ts +4 -0
  435. package/src/usecases/add-memory/maintenance.ts +23 -0
  436. package/src/usecases/add-memory/schemas.ts +12 -0
  437. package/src/usecases/add-memory/types.ts +47 -0
  438. package/src/usecases/archive-memory/archive-memory.ts +27 -0
  439. package/src/usecases/archive-memory/index.ts +3 -0
  440. package/src/usecases/archive-memory/schemas.ts +11 -0
  441. package/src/usecases/archive-memory/types.ts +17 -0
  442. package/src/usecases/capture-memory/apply.ts +73 -0
  443. package/src/usecases/capture-memory/capture-memory.ts +117 -0
  444. package/src/usecases/capture-memory/constants.ts +15 -0
  445. package/src/usecases/capture-memory/index.ts +5 -0
  446. package/src/usecases/capture-memory/observe.ts +122 -0
  447. package/src/usecases/capture-memory/settings.ts +20 -0
  448. package/src/usecases/capture-memory/types.ts +103 -0
  449. package/src/usecases/check-shell-edit/check-shell-edit.ts +28 -0
  450. package/src/usecases/check-shell-edit/index.ts +2 -0
  451. package/src/usecases/check-shell-edit/types.ts +30 -0
  452. package/src/usecases/check-vault-access/check-vault-access.ts +23 -0
  453. package/src/usecases/check-vault-access/constants.ts +7 -0
  454. package/src/usecases/check-vault-access/index.ts +4 -0
  455. package/src/usecases/check-vault-access/raw-device.ts +10 -0
  456. package/src/usecases/check-vault-access/targets.ts +49 -0
  457. package/src/usecases/check-vault-access/types.ts +33 -0
  458. package/src/usecases/complete-blank-memory/complete-blank-memory.ts +48 -0
  459. package/src/usecases/complete-blank-memory/constants.ts +3 -0
  460. package/src/usecases/complete-blank-memory/index.ts +4 -0
  461. package/src/usecases/complete-blank-memory/schemas.ts +14 -0
  462. package/src/usecases/complete-blank-memory/types.ts +28 -0
  463. package/src/usecases/diagnose-memory/constants.ts +3 -0
  464. package/src/usecases/diagnose-memory/decision.ts +36 -0
  465. package/src/usecases/diagnose-memory/diagnose-memory.ts +52 -0
  466. package/src/usecases/diagnose-memory/embeddings.ts +39 -0
  467. package/src/usecases/diagnose-memory/index.ts +5 -0
  468. package/src/usecases/diagnose-memory/types.ts +86 -0
  469. package/src/usecases/diagnose-memory/vault.ts +33 -0
  470. package/src/usecases/export-memory/collect.ts +20 -0
  471. package/src/usecases/export-memory/constants.ts +3 -0
  472. package/src/usecases/export-memory/export-memory.ts +84 -0
  473. package/src/usecases/export-memory/index.ts +3 -0
  474. package/src/usecases/export-memory/types.ts +28 -0
  475. package/src/usecases/get-memory/get-memory.ts +97 -0
  476. package/src/usecases/get-memory/index.ts +2 -0
  477. package/src/usecases/get-memory/types.ts +25 -0
  478. package/src/usecases/index.ts +25 -0
  479. package/src/usecases/list-memory/index.ts +2 -0
  480. package/src/usecases/list-memory/leased/index.ts +2 -0
  481. package/src/usecases/list-memory/leased/read.ts +16 -0
  482. package/src/usecases/list-memory/leased/types.ts +21 -0
  483. package/src/usecases/list-memory/list-memory.ts +33 -0
  484. package/src/usecases/list-memory/types.ts +8 -0
  485. package/src/usecases/load-dont-forget/index.ts +2 -0
  486. package/src/usecases/load-dont-forget/load-dont-forget.ts +111 -0
  487. package/src/usecases/load-dont-forget/types.ts +26 -0
  488. package/src/usecases/memory-change/change.ts +42 -0
  489. package/src/usecases/memory-change/index.ts +5 -0
  490. package/src/usecases/memory-change/maintenance.ts +11 -0
  491. package/src/usecases/memory-change/partial.ts +18 -0
  492. package/src/usecases/memory-change/receipt.ts +40 -0
  493. package/src/usecases/memory-change/types.ts +44 -0
  494. package/src/usecases/operation-context/context.ts +37 -0
  495. package/src/usecases/operation-context/index.ts +2 -0
  496. package/src/usecases/operation-context/types.ts +19 -0
  497. package/src/usecases/registration/check.ts +6 -0
  498. package/src/usecases/registration/entry.ts +33 -0
  499. package/src/usecases/registration/index.ts +8 -0
  500. package/src/usecases/registration/init.ts +94 -0
  501. package/src/usecases/registration/prepare-init.ts +43 -0
  502. package/src/usecases/registration/prepare.ts +35 -0
  503. package/src/usecases/registration/propose.ts +34 -0
  504. package/src/usecases/registration/publication.ts +90 -0
  505. package/src/usecases/registration/setup.ts +41 -0
  506. package/src/usecases/registration/types.ts +107 -0
  507. package/src/usecases/relevant-memory/agent.ts +55 -0
  508. package/src/usecases/relevant-memory/constants.ts +28 -0
  509. package/src/usecases/relevant-memory/cutoffs.ts +29 -0
  510. package/src/usecases/relevant-memory/decision.ts +102 -0
  511. package/src/usecases/relevant-memory/index.ts +11 -0
  512. package/src/usecases/relevant-memory/loaded.ts +31 -0
  513. package/src/usecases/relevant-memory/refresh.ts +30 -0
  514. package/src/usecases/relevant-memory/retrieve-memory.ts +62 -0
  515. package/src/usecases/relevant-memory/schemas.ts +20 -0
  516. package/src/usecases/relevant-memory/session-memory.ts +53 -0
  517. package/src/usecases/relevant-memory/track-dont-forget.ts +13 -0
  518. package/src/usecases/relevant-memory/types.ts +106 -0
  519. package/src/usecases/resolve-memory/index.ts +2 -0
  520. package/src/usecases/resolve-memory/leased/index.ts +2 -0
  521. package/src/usecases/resolve-memory/leased/resolve.ts +109 -0
  522. package/src/usecases/resolve-memory/leased/types.ts +35 -0
  523. package/src/usecases/resolve-memory/resolve-memory.ts +23 -0
  524. package/src/usecases/resolve-memory/types.ts +7 -0
  525. package/src/usecases/search-memory/constants.ts +1 -0
  526. package/src/usecases/search-memory/index.ts +3 -0
  527. package/src/usecases/search-memory/search-memory.ts +132 -0
  528. package/src/usecases/search-memory/types.ts +39 -0
  529. package/src/usecases/semantic/constants.ts +7 -0
  530. package/src/usecases/semantic/index.ts +5 -0
  531. package/src/usecases/semantic/prepare.ts +30 -0
  532. package/src/usecases/semantic/rank.ts +83 -0
  533. package/src/usecases/semantic/refresh-vectors.ts +95 -0
  534. package/src/usecases/semantic/types.ts +17 -0
  535. package/src/usecases/semantic-port/index.ts +1 -0
  536. package/src/usecases/semantic-port/types.ts +20 -0
  537. package/src/usecases/semantic-provider/constants.ts +6 -0
  538. package/src/usecases/semantic-provider/index.ts +5 -0
  539. package/src/usecases/semantic-provider/local.ts +33 -0
  540. package/src/usecases/semantic-provider/remote.ts +10 -0
  541. package/src/usecases/semantic-provider/size.ts +10 -0
  542. package/src/usecases/semantic-provider/types.ts +19 -0
  543. package/src/usecases/session/index.ts +2 -0
  544. package/src/usecases/session/lease.ts +70 -0
  545. package/src/usecases/session/receipts.ts +46 -0
  546. package/src/usecases/session/state.ts +106 -0
  547. package/src/usecases/session/types.ts +45 -0
  548. package/src/usecases/settings/change.ts +142 -0
  549. package/src/usecases/settings/index.ts +3 -0
  550. package/src/usecases/settings/prepare.ts +24 -0
  551. package/src/usecases/settings/types.ts +32 -0
  552. package/src/usecases/succeed-memory/index.ts +3 -0
  553. package/src/usecases/succeed-memory/schemas.ts +13 -0
  554. package/src/usecases/succeed-memory/succeed-memory.ts +34 -0
  555. package/src/usecases/succeed-memory/types.ts +18 -0
  556. package/src/usecases/synchronize-memory/index.ts +2 -0
  557. package/src/usecases/synchronize-memory/leased/aliases.ts +55 -0
  558. package/src/usecases/synchronize-memory/leased/folder-states.ts +58 -0
  559. package/src/usecases/synchronize-memory/leased/index.ts +2 -0
  560. package/src/usecases/synchronize-memory/leased/inspection.ts +32 -0
  561. package/src/usecases/synchronize-memory/leased/maintenance.ts +41 -0
  562. package/src/usecases/synchronize-memory/leased/publication.ts +55 -0
  563. package/src/usecases/synchronize-memory/leased/scan.ts +37 -0
  564. package/src/usecases/synchronize-memory/leased/synchronize.ts +102 -0
  565. package/src/usecases/synchronize-memory/leased/types.ts +60 -0
  566. package/src/usecases/synchronize-memory/synchronize-memory.ts +26 -0
  567. package/src/usecases/synchronize-memory/types.ts +5 -0
  568. package/src/usecases/update-memory/index.ts +3 -0
  569. package/src/usecases/update-memory/schemas.ts +14 -0
  570. package/src/usecases/update-memory/types.ts +16 -0
  571. package/src/usecases/update-memory/update-memory.ts +31 -0
  572. package/CHANGELOG.md +0 -6
@@ -0,0 +1,94 @@
1
+ import {
2
+ canonicalizeRegistration,
3
+ type MemoryConfig,
4
+ proposeInit,
5
+ readConfigSnapshot,
6
+ resolveRegistrationVault,
7
+ } from "#src/services"
8
+ import { captureRegistrationContext } from "./entry.ts"
9
+ import { publishRegistration, registrationInterruption, registrationValidationFailure } from "./publication.ts"
10
+ import type { InitCommitRequest, RegistrationContext, RegistrationResult } from "./types.ts"
11
+
12
+ export async function initProjectMemory(
13
+ input: InitCommitRequest,
14
+ callerContext: RegistrationContext,
15
+ ): Promise<RegistrationResult> {
16
+ const context = captureRegistrationContext(callerContext)
17
+ const request = { name: input.name, vault: input.vault, expectedHash: input.expectedHash }
18
+ const lease = await context.session.acquire(context.stamp, context.signal)
19
+ if (!lease) {
20
+ return registrationValidationFailure({ succeeded: false, problems: ["registration session admission refused"] })
21
+ }
22
+ try {
23
+ const interrupted = registrationInterruption(context)
24
+ if (interrupted) return registrationValidationFailure(interrupted)
25
+ return await prepareProjectRegistration(request, context)
26
+ } finally {
27
+ lease.release()
28
+ }
29
+ }
30
+
31
+ async function prepareProjectRegistration(
32
+ request: InitCommitRequest,
33
+ context: RegistrationContext,
34
+ ): Promise<RegistrationResult> {
35
+ const snapshot = await readConfigSnapshot({ path: context.configPath, platform: context.platform })
36
+ const interrupted = registrationInterruption(context)
37
+ if (interrupted) return registrationValidationFailure(interrupted)
38
+ if (!snapshot.succeeded) return registrationValidationFailure(snapshot)
39
+ if (snapshot.output.state === "missing") {
40
+ return registrationValidationFailure({
41
+ succeeded: false,
42
+ reason: "not-configured",
43
+ configPath: context.configPath,
44
+ problems: ["project registration requires a configured global vault"],
45
+ })
46
+ }
47
+ if (snapshot.output.hash !== request.expectedHash) {
48
+ return registrationValidationFailure({
49
+ succeeded: false,
50
+ reason: "conflict",
51
+ problems: ["config changed since it was read"],
52
+ warnings: [],
53
+ })
54
+ }
55
+ const parsed = snapshot.output.lexicalParse
56
+ if (!parsed.succeeded) return registrationValidationFailure(parsed)
57
+ return proposeProjectRegistration(request, context, parsed.output)
58
+ }
59
+
60
+ async function proposeProjectRegistration(
61
+ request: InitCommitRequest,
62
+ context: RegistrationContext,
63
+ config: MemoryConfig,
64
+ ): Promise<RegistrationResult> {
65
+ const valid = await canonicalizeRegistration({
66
+ config,
67
+ configPath: context.configPath,
68
+ indexPath: context.indexPath,
69
+ platform: context.platform,
70
+ })
71
+ const stale = registrationInterruption(context)
72
+ if (stale) return registrationValidationFailure(stale)
73
+ if (!valid.succeeded) return registrationValidationFailure(valid)
74
+ const vault = resolveRegistrationVault({ vault: request.vault, workingFolder: context.workingFolder })
75
+ if (!vault.succeeded) return registrationValidationFailure(vault)
76
+ const proposal = proposeInit(
77
+ { config, folder: context.workingFolder, name: request.name, vault: vault.output },
78
+ context.platform,
79
+ )
80
+ if (!proposal.succeeded) return registrationValidationFailure(proposal)
81
+ return publishRegistration(
82
+ {
83
+ scope: "project",
84
+ write: {
85
+ path: context.configPath,
86
+ platform: context.platform,
87
+ indexPath: context.indexPath,
88
+ config: proposal.output,
89
+ expectedHash: request.expectedHash,
90
+ },
91
+ },
92
+ context,
93
+ )
94
+ }
@@ -0,0 +1,43 @@
1
+ import { basename } from "node:path"
2
+
3
+ import { type ProjectEntry, readConfigSnapshot, resolveProject } from "#src/services"
4
+ import type { MemoryContext } from "#src/usecases/add-memory"
5
+ import type { InitPreparation, InitPreparationResult, ProjectNameResult } from "./types.ts"
6
+
7
+ export async function prepareProjectInit(context: MemoryContext): Promise<InitPreparationResult> {
8
+ const snapshot = await readConfigSnapshot({ path: context.configPath, platform: context.platform })
9
+ if (!snapshot.succeeded) {
10
+ return { succeeded: false, reason: "unreadable", configPath: context.configPath, problems: snapshot.problems }
11
+ }
12
+ if (snapshot.output.state === "missing") {
13
+ return {
14
+ succeeded: false,
15
+ reason: "not-configured",
16
+ configPath: context.configPath,
17
+ problems: ["memory is not configured"],
18
+ }
19
+ }
20
+ const parsed = snapshot.output.lexicalParse
21
+ if (!parsed.succeeded) {
22
+ return { succeeded: false, reason: "invalid-config", configPath: context.configPath, problems: parsed.problems }
23
+ }
24
+ const registered = resolveProject(parsed.output, context.workingFolder, context.platform)
25
+ let existing: ProjectEntry | null = null
26
+ let defaultName = basename(context.workingFolder)
27
+ if (registered.succeeded) {
28
+ existing = registered.output
29
+ defaultName = registered.output.name
30
+ }
31
+ const takenNames = parsed.output.projects.filter((project) => project !== existing).map((project) => project.name)
32
+ return { succeeded: true, output: { expectedHash: snapshot.output.hash, existing, defaultName, takenNames } }
33
+ }
34
+
35
+ export function checkProjectName(preparation: InitPreparation, answer: string): ProjectNameResult {
36
+ let name = answer.trim()
37
+ if (name === "") name = preparation.defaultName
38
+ const lowered = name.toLowerCase()
39
+ if (preparation.takenNames.some((taken) => taken.toLowerCase() === lowered)) {
40
+ return { succeeded: false, problems: [`a project named "${name}" is already registered`] }
41
+ }
42
+ return { succeeded: true, output: name }
43
+ }
@@ -0,0 +1,35 @@
1
+ import { prepareSetupDefaults, readConfigSnapshot } from "#src/services"
2
+ import { captureRegistrationContext, captureSelectedModel } from "./entry.ts"
3
+ import { registrationInterruption } from "./publication.ts"
4
+ import type { RegistrationContext, SetupPreparationRequest, SetupPreparationResult } from "./types.ts"
5
+
6
+ export async function prepareMemorySetup(
7
+ input: SetupPreparationRequest,
8
+ callerContext: RegistrationContext,
9
+ ): Promise<SetupPreparationResult> {
10
+ const context = captureRegistrationContext(callerContext)
11
+ const selectedModel = captureSelectedModel(input.selectedModel)
12
+ const lease = await context.session.acquire(context.stamp, context.signal)
13
+ if (!lease) return { succeeded: false, problems: ["registration session admission refused"] }
14
+ try {
15
+ const interrupted = registrationInterruption(context)
16
+ if (interrupted) return interrupted
17
+ const snapshot = await readConfigSnapshot({ path: context.configPath, platform: context.platform })
18
+ const stale = registrationInterruption(context)
19
+ if (stale) return stale
20
+ if (!snapshot.succeeded) return snapshot
21
+ const defaults = prepareSetupDefaults(selectedModel)
22
+ let draft = defaults
23
+ if (snapshot.output.state === "present") {
24
+ const repair = snapshot.output.repair
25
+ draft = {
26
+ ...repair,
27
+ capture: { ...repair.capture, model: { ...defaults.capture.model, ...repair.capture.model } },
28
+ memoryAgent: { model: { ...defaults.memoryAgent.model, ...repair.memoryAgent.model } },
29
+ }
30
+ }
31
+ return { succeeded: true, output: { snapshot: snapshot.output, draft, selectedModel } }
32
+ } finally {
33
+ lease.release()
34
+ }
35
+ }
@@ -0,0 +1,34 @@
1
+ import { inspectVaultFolder, proposeSetup, resolveRegistrationVault, setupDisclosures } from "#src/services"
2
+ import type { Failed } from "#src/shared"
3
+ import type { MemoryContext } from "#src/usecases/add-memory"
4
+ import type { SetupProposalRequest, SetupProposalResult, SetupVaultMode } from "./types.ts"
5
+
6
+ export async function proposeMemorySetup(
7
+ request: SetupProposalRequest,
8
+ context: MemoryContext,
9
+ ): Promise<SetupProposalResult> {
10
+ let requested = request.vault.trim()
11
+ if (requested === "" && request.draft.global.vault) requested = request.draft.global.vault
12
+ const vault = resolveRegistrationVault({ vault: requested, workingFolder: context.workingFolder })
13
+ if (!vault.succeeded) return vault
14
+ const refusal = await vaultFolderRefusal(vault.output, request.mode)
15
+ if (refusal) return refusal
16
+ const proposal = proposeSetup({ config: request.draft, vault: vault.output }, context.platform)
17
+ if (!proposal.succeeded) return proposal
18
+ return { succeeded: true, output: { config: proposal.output, disclosures: setupDisclosures(proposal.output) } }
19
+ }
20
+
21
+ async function vaultFolderRefusal(vault: string, mode: SetupVaultMode): Promise<Failed | null> {
22
+ const folder = await inspectVaultFolder(vault)
23
+ if (!folder.succeeded) return folder
24
+ if (folder.output === "not-directory") {
25
+ return { succeeded: false, problems: [`${vault} is not a folder`] }
26
+ }
27
+ if (mode === "create" && folder.output === "populated") {
28
+ return { succeeded: false, problems: [`${vault} already has files; attach it instead of creating a new vault`] }
29
+ }
30
+ if (mode === "attach" && folder.output === "missing") {
31
+ return { succeeded: false, problems: [`${vault} does not exist; create it instead of attaching`] }
32
+ }
33
+ return null
34
+ }
@@ -0,0 +1,90 @@
1
+ import {
2
+ canonicalizeRegistration,
3
+ checkConfigSnapshot,
4
+ ensureVaultAssets,
5
+ targetVault,
6
+ type VaultBootstrapProgress,
7
+ writeConfig,
8
+ } from "#src/services"
9
+ import type { Failed } from "#src/shared"
10
+ import type {
11
+ RegistrationCause,
12
+ RegistrationContext,
13
+ RegistrationFailure,
14
+ RegistrationPublication,
15
+ RegistrationResult,
16
+ RegistrationStage,
17
+ } from "./types.ts"
18
+
19
+ export function registrationInterruption(context: RegistrationContext): Failed | null {
20
+ if (context.signal.aborted || !context.session.isCurrent(context.stamp)) {
21
+ return { succeeded: false, problems: ["registration cancelled or session authority changed"] }
22
+ }
23
+ return null
24
+ }
25
+
26
+ export function registrationFailure(
27
+ stage: RegistrationStage,
28
+ cause: RegistrationCause,
29
+ assets: VaultBootstrapProgress,
30
+ ): RegistrationFailure {
31
+ return { succeeded: false, stage, cause, assets, problems: cause.problems }
32
+ }
33
+
34
+ export function registrationValidationFailure(cause: RegistrationCause): RegistrationFailure {
35
+ return registrationFailure("validation", cause, {
36
+ createdRoot: false,
37
+ created: [],
38
+ preserved: [],
39
+ maintenanceProblems: [],
40
+ })
41
+ }
42
+
43
+ export async function publishRegistration(
44
+ publication: RegistrationPublication,
45
+ context: RegistrationContext,
46
+ ): Promise<RegistrationResult> {
47
+ const { write, scope } = publication
48
+ const canonical = await canonicalizeRegistration({
49
+ config: write.config,
50
+ configPath: write.path,
51
+ indexPath: write.indexPath,
52
+ platform: context.platform,
53
+ })
54
+ const interrupted = registrationInterruption(context)
55
+ if (interrupted) return registrationValidationFailure(interrupted)
56
+ if (!canonical.succeeded) return registrationValidationFailure(canonical)
57
+ const snapshot = await checkConfigSnapshot(write)
58
+ const stale = registrationInterruption(context)
59
+ if (stale) return registrationValidationFailure(stale)
60
+ if (!snapshot.succeeded) return registrationValidationFailure(snapshot)
61
+ const target = targetVault(write.config, scope, context.workingFolder, context.platform)
62
+ if (!target.succeeded) return registrationValidationFailure(target)
63
+ const assets = await ensureVaultAssets({ ...target.output, limits: write.config.limits })
64
+ if (!assets.succeeded) return registrationFailure("bootstrap", assets, assets)
65
+ return commitRegistration(publication, context, assets.output)
66
+ }
67
+
68
+ async function commitRegistration(
69
+ publication: RegistrationPublication,
70
+ context: RegistrationContext,
71
+ assets: VaultBootstrapProgress,
72
+ ): Promise<RegistrationResult> {
73
+ const interrupted = registrationInterruption(context)
74
+ if (interrupted) return registrationFailure("config", interrupted, assets)
75
+ const snapshot = await checkConfigSnapshot(publication.write)
76
+ const stale = registrationInterruption(context)
77
+ if (stale) return registrationFailure("config", stale, assets)
78
+ if (!snapshot.succeeded) return registrationFailure("config", snapshot, assets)
79
+ const written = await writeConfig(publication.write)
80
+ if (!written.succeeded) return registrationFailure("config", written, assets)
81
+ if (context.session.isCurrent(context.stamp)) context.session.invalidate(context.stamp)
82
+ return {
83
+ succeeded: true,
84
+ output: {
85
+ configHash: written.output.hash,
86
+ assets,
87
+ warnings: [...assets.maintenanceProblems, ...written.warnings],
88
+ },
89
+ }
90
+ }
@@ -0,0 +1,41 @@
1
+ import { resolveRegistrationVault, type WriteConfigRequest } from "#src/services"
2
+ import { captureRegistrationContext, captureSetupCommit } from "./entry.ts"
3
+ import { publishRegistration, registrationInterruption, registrationValidationFailure } from "./publication.ts"
4
+ import type { RegistrationContext, RegistrationResult, SetupCommitRequest } from "./types.ts"
5
+
6
+ export async function setupMemory(
7
+ input: SetupCommitRequest,
8
+ callerContext: RegistrationContext,
9
+ ): Promise<RegistrationResult> {
10
+ const context = captureRegistrationContext(callerContext)
11
+ const captured = captureSetupCommit(input)
12
+ if (!captured.succeeded) return registrationValidationFailure(captured)
13
+ const lease = await context.session.acquire(context.stamp, context.signal)
14
+ if (!lease) {
15
+ return registrationValidationFailure({ succeeded: false, problems: ["registration session admission refused"] })
16
+ }
17
+ try {
18
+ const interrupted = registrationInterruption(context)
19
+ if (interrupted) return registrationValidationFailure(interrupted)
20
+ return await prepareGlobalRegistration(captured.output, context)
21
+ } finally {
22
+ lease.release()
23
+ }
24
+ }
25
+
26
+ async function prepareGlobalRegistration(
27
+ request: SetupCommitRequest,
28
+ context: RegistrationContext,
29
+ ): Promise<RegistrationResult> {
30
+ const vault = resolveRegistrationVault({ vault: request.config.global.vault, workingFolder: context.workingFolder })
31
+ if (!vault.succeeded) return registrationValidationFailure(vault)
32
+ const write: WriteConfigRequest = {
33
+ path: context.configPath,
34
+ platform: context.platform,
35
+ indexPath: context.indexPath,
36
+ config: { ...request.config, global: { ...request.config.global, vault: vault.output } },
37
+ expectedHash: request.expectedHash,
38
+ }
39
+ if (request.replacementConfirmed) write.replacementConfirmed = true
40
+ return publishRegistration({ write, scope: "global" }, context)
41
+ }
@@ -0,0 +1,107 @@
1
+ import type {
2
+ ChatModelReference,
3
+ ConfigRefusal,
4
+ ConfigRepairDraft,
5
+ ConfigSnapshot,
6
+ ConfigWriteRefusal,
7
+ MemoryConfig,
8
+ MemoryScope,
9
+ ProjectEntry,
10
+ SetupDisclosure,
11
+ VaultBootstrapFailure,
12
+ VaultBootstrapProgress,
13
+ WriteConfigRequest,
14
+ } from "#src/services"
15
+ import type { Failed, Succeeded } from "#src/shared"
16
+ import type { MemoryContext } from "#src/usecases/add-memory"
17
+ import type { MemorySession, OperationStamp } from "#src/usecases/session"
18
+
19
+ export type {
20
+ ChatModelReference,
21
+ ConfigRepairDraft,
22
+ ConfigSnapshot,
23
+ MemoryConfig,
24
+ SetupDisclosure,
25
+ VaultBootstrapProgress,
26
+ } from "#src/services"
27
+
28
+ export interface RegistrationContext extends MemoryContext {
29
+ indexPath: string
30
+ session: MemorySession
31
+ stamp: OperationStamp
32
+ signal: AbortSignal
33
+ }
34
+
35
+ export interface SetupPreparationRequest {
36
+ selectedModel: ChatModelReference | null
37
+ }
38
+
39
+ export interface SetupPreparation {
40
+ snapshot: ConfigSnapshot
41
+ draft: ConfigRepairDraft
42
+ selectedModel: ChatModelReference | null
43
+ }
44
+
45
+ export type SetupPreparationResult = Succeeded<SetupPreparation> | Failed
46
+
47
+ export interface SetupCommitRequest {
48
+ config: MemoryConfig
49
+ expectedHash: string | null
50
+ replacementConfirmed: boolean
51
+ }
52
+
53
+ export type SetupCommitCaptureResult = Succeeded<SetupCommitRequest> | Failed
54
+
55
+ export interface InitCommitRequest {
56
+ name: string
57
+ vault: string
58
+ expectedHash: string
59
+ }
60
+
61
+ export interface RegistrationOutcome {
62
+ configHash: string
63
+ assets: VaultBootstrapProgress
64
+ warnings: string[]
65
+ }
66
+
67
+ export type RegistrationStage = "validation" | "bootstrap" | "config"
68
+ export type RegistrationCause = ConfigRefusal | ConfigWriteRefusal | VaultBootstrapFailure | Failed
69
+
70
+ export interface RegistrationFailure extends Failed {
71
+ stage: RegistrationStage
72
+ assets: VaultBootstrapProgress
73
+ cause: RegistrationCause
74
+ }
75
+
76
+ export type RegistrationResult = Succeeded<RegistrationOutcome> | RegistrationFailure
77
+
78
+ export interface RegistrationPublication {
79
+ write: WriteConfigRequest
80
+ scope: MemoryScope
81
+ }
82
+
83
+ export type SetupVaultMode = "create" | "attach"
84
+
85
+ export interface SetupProposalRequest {
86
+ draft: ConfigRepairDraft
87
+ vault: string
88
+ mode: SetupVaultMode
89
+ }
90
+
91
+ export interface ProposedSetup {
92
+ config: MemoryConfig
93
+ disclosures: SetupDisclosure[]
94
+ }
95
+
96
+ export type SetupProposalResult = Succeeded<ProposedSetup> | Failed
97
+
98
+ export interface InitPreparation {
99
+ expectedHash: string
100
+ existing: ProjectEntry | null
101
+ defaultName: string
102
+ takenNames: string[]
103
+ }
104
+
105
+ export type InitPreparationResult = Succeeded<InitPreparation> | ConfigRefusal
106
+
107
+ export type ProjectNameResult = Succeeded<string> | Failed
@@ -0,0 +1,55 @@
1
+ import {
2
+ type CompletionPort,
3
+ type MemoryIdentity,
4
+ type MemoryObservation,
5
+ type ReadObservation,
6
+ type RetrievalObservation,
7
+ refusalObservation,
8
+ retrieveStep,
9
+ } from "#src/services"
10
+ import { detailOf, observeGet, observeList, observeSearch } from "#src/usecases/capture-memory"
11
+ import { type MemoryOperationContext, memoryOperationInterruption } from "#src/usecases/operation-context"
12
+ import { AGENT_FAILED } from "./constants.ts"
13
+ import type { AgentOutcome, AgentRequest, ReadStep } from "./types.ts"
14
+
15
+ export async function findNotes(
16
+ request: AgentRequest,
17
+ context: MemoryOperationContext,
18
+ complete: CompletionPort,
19
+ ): Promise<AgentOutcome> {
20
+ const observations: RetrievalObservation[] = []
21
+ for (;;) {
22
+ if (memoryOperationInterruption(context)) return { succeeded: false, notice: null }
23
+ const { agent, query, model } = request
24
+ const step = await retrieveStep({ context: agent, query, observations, model, signal: context.signal }, complete)
25
+ if (!step.succeeded && "modelCall" in step) {
26
+ if (memoryOperationInterruption(context)) return { succeeded: false, notice: null }
27
+ return { succeeded: false, notice: `${AGENT_FAILED} ${detailOf(step.problems)}` }
28
+ }
29
+ if (!step.succeeded) {
30
+ observations.push(refusalObservation(step.problems))
31
+ continue
32
+ }
33
+ if (step.output.action === "finish") return { succeeded: true, output: chosen(step.output.notes, observations) }
34
+ observations.push(await observe(step.output, context))
35
+ }
36
+ }
37
+
38
+ function observe(action: ReadStep, context: MemoryOperationContext): Promise<MemoryObservation> {
39
+ if (action.action === "search") return observeSearch(action.vault, action.query, context)
40
+ if (action.action === "get") return observeGet({ vault: action.vault, path: action.path }, context)
41
+ return observeList(action.vault, action.folder, context)
42
+ }
43
+
44
+ function chosen(identities: MemoryIdentity[], observations: RetrievalObservation[]): ReadObservation[] {
45
+ const reads = observations.filter((observation) => observation.kind === "read")
46
+ return identities.flatMap((identity) =>
47
+ reads.filter(
48
+ (read) =>
49
+ read.vault === identity.vault &&
50
+ read.path === identity.path &&
51
+ read.id === identity.id &&
52
+ read.hash === identity.hash,
53
+ ),
54
+ )
55
+ }
@@ -0,0 +1,28 @@
1
+ export const RELEVANT_INTRO =
2
+ "Relevant long-term memory for this message. This is only part of your memory; use memory_search to find more, and memory_get to read a note in full."
3
+
4
+ export const SESSION_INTRO =
5
+ "Relevant long-term memory for this work. This is only part of your memory; use memory_search to find more, and memory_get to read a note in full."
6
+
7
+ export const NO_CHANGES = { loaded: [], forgotten: [] }
8
+
9
+ export const BLOCK_SEPARATOR = "\n\n"
10
+
11
+ export const SESSION_QUERY_PREFIX = "Memory relevant to starting work on"
12
+
13
+ export const NO_PROJECT = "no registered project"
14
+
15
+ export const ROUTING_MISSING_HELP =
16
+ "the Laya server did not say which model answered (it runs with LAYA_JEV_STRICT); run laya-serve without LAYA_JEV_STRICT and bound to 127.0.0.1 with LAYA_HOST"
17
+
18
+ export const CUTOFFS_MISSING = "Per-message memory is off: the decision model has no cutoff for"
19
+
20
+ export const CUTOFFS_HELP = "set it with /memory-setup; nothing was added"
21
+
22
+ export const COULD_NOT_SCORE = "The decision model could not score"
23
+
24
+ export const AGENT_FAILED = "The memory agent could not find memory:"
25
+
26
+ export const DECISION_UNAVAILABLE = "The decision model is unavailable, so no memory was added:"
27
+
28
+ export const SESSION_LOAD_FAILED = "Relevant notes could not be loaded:"
@@ -0,0 +1,29 @@
1
+ import { type DecisionCutoffs, defaultCutoffs, type MemoryConfig } from "#src/services"
2
+ import { CUTOFFS_HELP, CUTOFFS_MISSING } from "./constants.ts"
3
+ import type { CutoffReport, CutoffValue } from "./types.ts"
4
+
5
+ function cutoffOf(configured: number | undefined, fallback: number | undefined): CutoffValue {
6
+ if (typeof configured === "number") return { value: configured, source: "config" }
7
+ if (typeof fallback === "number") return { value: fallback, source: "typesafe" }
8
+ return { value: null, source: "missing" }
9
+ }
10
+
11
+ export function resolveCutoffs(config: MemoryConfig["decisionModel"]): CutoffReport {
12
+ const defaults = defaultCutoffs(config.provider)
13
+ return {
14
+ gate: cutoffOf(config.gateThreshold, defaults.gate),
15
+ relevance: cutoffOf(config.relevanceThreshold, defaults.relevance),
16
+ }
17
+ }
18
+
19
+ export function decidingCutoffs(report: CutoffReport): DecisionCutoffs | null {
20
+ if (typeof report.gate.value !== "number" || typeof report.relevance.value !== "number") return null
21
+ return { gate: report.gate.value, relevance: report.relevance.value }
22
+ }
23
+
24
+ export function cutoffsMissingNotice(report: CutoffReport): string {
25
+ const names: string[] = []
26
+ if (report.gate.source === "missing") names.push("gateThreshold")
27
+ if (report.relevance.source === "missing") names.push("relevanceThreshold")
28
+ return `${CUTOFFS_MISSING} ${names.join(" and ")}; ${CUTOFFS_HELP}`
29
+ }
@@ -0,0 +1,102 @@
1
+ import {
2
+ type CandidateScore,
3
+ type DecisionContext,
4
+ type DecisionFailure,
5
+ type DecisionLimits,
6
+ type DecisionResult,
7
+ decideMemory,
8
+ type MemoryConfig,
9
+ type ReadObservation,
10
+ rankCandidates,
11
+ scoreCandidates,
12
+ } from "#src/services"
13
+ import { COULD_NOT_SCORE, DECISION_UNAVAILABLE, ROUTING_MISSING_HELP } from "./constants.ts"
14
+ import type { JevSource, RankedNotes } from "./types.ts"
15
+
16
+ export async function decisionContextOf(
17
+ config: MemoryConfig["decisionModel"],
18
+ limits: DecisionLimits,
19
+ jev: JevSource,
20
+ ): Promise<DecisionContext | string> {
21
+ if (config.provider === "laya") {
22
+ return {
23
+ provider: "laya",
24
+ endpoint: config.endpoint,
25
+ model: config.model,
26
+ maxTokens: config.maxTokens,
27
+ headMaxTokens: config.headMaxTokens,
28
+ ...limits,
29
+ }
30
+ }
31
+ const access = await jev(config.model)
32
+ if (!access.available) return `${DECISION_UNAVAILABLE} ${access.reason}`
33
+ return {
34
+ provider: "typesafe",
35
+ model: config.model,
36
+ classifier: access.classifier,
37
+ ...limits,
38
+ }
39
+ }
40
+
41
+ export function decisionNotice(result: DecisionResult): string | null {
42
+ if (result.succeeded) return null
43
+ return `${DECISION_UNAVAILABLE} ${describeDecisionFailure(result)}`
44
+ }
45
+
46
+ export function describeDecisionFailure(failure: DecisionFailure): string {
47
+ if (failure.code === "routing-missing") return ROUTING_MISSING_HELP
48
+ if (failure.code !== "http-error" || typeof failure.httpStatus !== "number") return failure.code
49
+ let text = `${failure.code} (HTTP ${failure.httpStatus})`
50
+ if (typeof failure.detail === "string") text = `${text}: ${failure.detail}`
51
+ return text
52
+ }
53
+
54
+ export function needsMemory(
55
+ context: DecisionContext,
56
+ message: string,
57
+ project: string | null,
58
+ folder: string,
59
+ ): Promise<DecisionResult> {
60
+ return decideMemory({ context, request: { message, project, folder } })
61
+ }
62
+
63
+ export async function rankNotes(
64
+ context: DecisionContext,
65
+ message: string,
66
+ notes: ReadObservation[],
67
+ cutoff: number,
68
+ ): Promise<RankedNotes> {
69
+ const results = await scoreCandidates(
70
+ context,
71
+ notes.map((note) => ({
72
+ message,
73
+ identity: identityOf(note),
74
+ candidate: { statement: note.statement, body: note.body },
75
+ })),
76
+ )
77
+ const scores: CandidateScore[] = []
78
+ let failure: DecisionFailure | null = null
79
+ let failed = 0
80
+ results.forEach((result, index) => {
81
+ const note = notes[index]
82
+ if (result.succeeded && note) scores.push({ identity: identityOf(note), probability: result.output.probability })
83
+ else if (!result.succeeded) {
84
+ failed += 1
85
+ failure = result
86
+ }
87
+ })
88
+ if (failure && failed === notes.length) return { notes: [], notice: decisionNotice(failure) }
89
+ const ranked = rankCandidates(scores, cutoff)
90
+ let notice: string | null = null
91
+ if (failed > 0) notice = `${COULD_NOT_SCORE} ${failed} of ${notes.length} notes`
92
+ return { notes: ranked.flatMap((score) => notes.filter((note) => matches(note, score))), notice }
93
+ }
94
+
95
+ function identityOf(note: ReadObservation): CandidateScore["identity"] {
96
+ return { vault: note.vault, id: note.id, revision: note.hash }
97
+ }
98
+
99
+ function matches(note: ReadObservation, score: CandidateScore): boolean {
100
+ const { identity } = score
101
+ return note.vault === identity.vault && note.id === identity.id && note.hash === identity.revision
102
+ }
@@ -0,0 +1,11 @@
1
+ export * from "./agent.ts"
2
+ export * from "./constants.ts"
3
+ export * from "./cutoffs.ts"
4
+ export * from "./decision.ts"
5
+ export * from "./loaded.ts"
6
+ export * from "./refresh.ts"
7
+ export * from "./retrieve-memory.ts"
8
+ export * from "./schemas.ts"
9
+ export * from "./session-memory.ts"
10
+ export * from "./track-dont-forget.ts"
11
+ export * from "./types.ts"