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,31 @@
1
+ import type { ReadObservation } from "#src/services"
2
+ import type { LoadedChanges } from "./types.ts"
3
+
4
+ export class LoadedMemory {
5
+ #notes = new Map<string, ReadObservation>()
6
+
7
+ all(): ReadObservation[] {
8
+ return [...this.#notes.values()]
9
+ }
10
+
11
+ apply(changes: LoadedChanges): void {
12
+ for (const note of changes.forgotten) this.forget(note)
13
+ for (const note of changes.loaded) this.remember(note)
14
+ }
15
+
16
+ has(note: ReadObservation): boolean {
17
+ return this.#notes.get(keyOf(note))?.hash === note.hash
18
+ }
19
+
20
+ remember(note: ReadObservation): void {
21
+ this.#notes.set(keyOf(note), note)
22
+ }
23
+
24
+ forget(note: ReadObservation): void {
25
+ this.#notes.delete(keyOf(note))
26
+ }
27
+ }
28
+
29
+ function keyOf(note: ReadObservation): string {
30
+ return `${note.vault}:${note.path}`
31
+ }
@@ -0,0 +1,30 @@
1
+ import { type InvalidReason, invalidatedBlock, type ReadObservation, replacementBlock } from "#src/services"
2
+ import { observeLoadedNote, type UnreadableNote } from "#src/usecases/capture-memory"
3
+ import { type MemoryOperationContext, memoryOperationInterruption } from "#src/usecases/operation-context"
4
+ import type { LoadedStore, Refreshed } from "./types.ts"
5
+
6
+ export async function refreshLoaded(loaded: LoadedStore, context: MemoryOperationContext): Promise<Refreshed> {
7
+ const blocks: string[] = []
8
+ const replaced: ReadObservation[] = []
9
+ const forgotten: ReadObservation[] = []
10
+ for (const previous of loaded.all()) {
11
+ const current = await observeLoadedNote(previous, context)
12
+ if (memoryOperationInterruption(context)) break
13
+ if (current.kind === "unreadable") {
14
+ loaded.forget(previous)
15
+ forgotten.push(previous)
16
+ blocks.push(invalidatedBlock(previous, invalidReason(current)))
17
+ } else if (current.hash !== previous.hash) {
18
+ loaded.remember(current)
19
+ replaced.push(current)
20
+ blocks.push(replacementBlock(previous, current))
21
+ }
22
+ }
23
+ return { blocks, changes: { loaded: replaced, forgotten } }
24
+ }
25
+
26
+ function invalidReason(unreadable: UnreadableNote): InvalidReason {
27
+ if (unreadable.existence === "gone") return { kind: "gone" }
28
+ if (unreadable.existence === "present") return { kind: "unusable", problem: unreadable.detail }
29
+ return { kind: "unreadable", problem: unreadable.detail }
30
+ }
@@ -0,0 +1,62 @@
1
+ import { fitBudget, loadedNoteBlock, shouldRetrieveMemory } from "#src/services"
2
+ import type { MemoryOperationContext } from "#src/usecases/operation-context"
3
+ import { type ResolvedMemory, resolveMemory } from "#src/usecases/resolve-memory"
4
+ import { findNotes } from "./agent.ts"
5
+ import { BLOCK_SEPARATOR, RELEVANT_INTRO } from "./constants.ts"
6
+ import { cutoffsMissingNotice, decidingCutoffs, resolveCutoffs } from "./cutoffs.ts"
7
+ import { decisionContextOf, decisionNotice, needsMemory, rankNotes } from "./decision.ts"
8
+ import { refreshLoaded } from "./refresh.ts"
9
+ import type { RankedNotes, RetrieveDeps, RetrieveMemoryResult, RetrieveRequest } from "./types.ts"
10
+
11
+ export async function retrieveMemory(
12
+ request: RetrieveRequest,
13
+ context: MemoryOperationContext,
14
+ deps: RetrieveDeps,
15
+ ): Promise<RetrieveMemoryResult> {
16
+ const resolved = await resolveMemory(context)
17
+ if (!resolved.succeeded) return resolved
18
+ const refreshed = await refreshLoaded(deps.loaded, context)
19
+ const blocks = refreshed.blocks
20
+ let found: RankedNotes = { notes: [], notice: null }
21
+ if (request.message.trim() !== "") found = await relevantNotes(request.message, resolved.output, context, deps)
22
+ const fitted = fitBudget(found.notes, resolved.output.config.context.budgetChars)
23
+ for (const note of fitted) deps.loaded.remember(note)
24
+ blocks.push(...fitted.map(loadedNoteBlock))
25
+ let text: string | null = null
26
+ if (blocks.length > 0) text = [RELEVANT_INTRO, ...blocks].join(BLOCK_SEPARATOR)
27
+ const notices: string[] = []
28
+ if (found.notice) notices.push(found.notice)
29
+ const changes = { loaded: [...refreshed.changes.loaded, ...fitted], forgotten: refreshed.changes.forgotten }
30
+ return { succeeded: true, output: { text, notices, changes } }
31
+ }
32
+
33
+ async function relevantNotes(
34
+ message: string,
35
+ memory: ResolvedMemory,
36
+ context: MemoryOperationContext,
37
+ deps: RetrieveDeps,
38
+ ): Promise<RankedNotes> {
39
+ const report = resolveCutoffs(memory.config.decisionModel)
40
+ const cutoffs = decidingCutoffs(report)
41
+ if (!cutoffs) return { notes: [], notice: cutoffsMissingNotice(report) }
42
+ const decision = await decisionContextOf(memory.config.decisionModel, { signal: context.signal }, deps.jev)
43
+ if (typeof decision === "string") return { notes: [], notice: decision }
44
+ let project: string | null = null
45
+ if (memory.project) project = memory.project.vault.name
46
+ const folder = context.workingFolder
47
+ const needed = await needsMemory(decision, message, project, folder)
48
+ if (!needed.succeeded) return { notes: [], notice: decisionNotice(needed) }
49
+ if (!shouldRetrieveMemory(needed.output.probability, cutoffs.gate)) return { notes: [], notice: null }
50
+ const agent = await findNotes(
51
+ {
52
+ agent: { project, folder },
53
+ query: message,
54
+ model: memory.config.memoryAgent.model,
55
+ },
56
+ context,
57
+ deps.complete,
58
+ )
59
+ if (!agent.succeeded) return { notes: [], notice: agent.notice }
60
+ const fresh = agent.output.filter((note) => !note.dontForget && !deps.loaded.has(note))
61
+ return rankNotes(decision, message, fresh, cutoffs.relevance)
62
+ }
@@ -0,0 +1,20 @@
1
+ import Type from "typebox"
2
+
3
+ import { BLANK_NOTE_TYPES } from "#src/usecases/complete-blank-memory"
4
+
5
+ export const StoredNoteSchema = Type.Object({
6
+ kind: Type.Literal("read"),
7
+ vault: Type.Enum(["global", "project"]),
8
+ path: Type.String(),
9
+ id: Type.String(),
10
+ hash: Type.String(),
11
+ statement: Type.String(),
12
+ body: Type.String(),
13
+ type: Type.Enum(BLANK_NOTE_TYPES),
14
+ dontForget: Type.Boolean(),
15
+ })
16
+
17
+ export const LoadedChangesSchema = Type.Object({
18
+ loaded: Type.Array(StoredNoteSchema),
19
+ forgotten: Type.Array(StoredNoteSchema),
20
+ })
@@ -0,0 +1,53 @@
1
+ import { fitBudget, loadedNoteBlock } from "#src/services"
2
+ import type { MemoryOperationContext } from "#src/usecases/operation-context"
3
+ import { resolveMemory } from "#src/usecases/resolve-memory"
4
+ import { findNotes } from "./agent.ts"
5
+ import {
6
+ BLOCK_SEPARATOR,
7
+ NO_CHANGES,
8
+ NO_PROJECT,
9
+ SESSION_INTRO,
10
+ SESSION_LOAD_FAILED,
11
+ SESSION_QUERY_PREFIX,
12
+ } from "./constants.ts"
13
+ import type { RetrievedMemory, RetrieveMemoryResult, SessionMemoryDeps } from "./types.ts"
14
+
15
+ export async function loadSessionMemory(
16
+ context: MemoryOperationContext,
17
+ deps: SessionMemoryDeps,
18
+ ): Promise<RetrieveMemoryResult> {
19
+ const resolved = await resolveMemory(context)
20
+ if (!resolved.succeeded) return resolved
21
+ const { config, project } = resolved.output
22
+ const { workingFolder } = context
23
+ let name: string | null = null
24
+ let label = NO_PROJECT
25
+ if (project) {
26
+ name = project.vault.name
27
+ label = name
28
+ }
29
+ const found = await findNotes(
30
+ {
31
+ agent: { project: name, folder: workingFolder },
32
+ query: `${SESSION_QUERY_PREFIX} ${label} in ${workingFolder}`,
33
+ model: config.memoryAgent.model,
34
+ },
35
+ context,
36
+ deps.complete,
37
+ )
38
+ if (!found.succeeded) return { succeeded: true, output: failedLoad(found.notice) }
39
+ const fitted = fitBudget(
40
+ found.output.filter((note) => !note.dontForget),
41
+ config.context.budgetChars,
42
+ )
43
+ for (const note of fitted) deps.loaded.remember(note)
44
+ if (fitted.length === 0) return { succeeded: true, output: { text: null, notices: [], changes: NO_CHANGES } }
45
+ const text = [SESSION_INTRO, ...fitted.map(loadedNoteBlock)].join(BLOCK_SEPARATOR)
46
+ return { succeeded: true, output: { text, notices: [], changes: NO_CHANGES } }
47
+ }
48
+
49
+ function failedLoad(notice: string | null): RetrievedMemory {
50
+ if (typeof notice !== "string") return { text: null, notices: [], changes: NO_CHANGES }
51
+ const text = `${SESSION_LOAD_FAILED} ${notice}`
52
+ return { text, notices: [text], changes: NO_CHANGES }
53
+ }
@@ -0,0 +1,13 @@
1
+ import type { LoadDontForgetResult } from "#src/usecases/load-dont-forget"
2
+ import type { LoadedMemory } from "./loaded.ts"
3
+
4
+ export function trackDontForget(loaded: LoadedMemory, result: LoadDontForgetResult): void {
5
+ if (!result.succeeded) return
6
+ for (const vault of result.output.vaults) {
7
+ for (const note of vault.notes) {
8
+ if (note.body.length === 0) continue
9
+ const { vault: scope, path, id, hash, statement, body, type } = note
10
+ loaded.remember({ kind: "read", vault: scope, path, id, hash, statement, body, type, dontForget: true })
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,106 @@
1
+ import type { Static } from "typebox"
2
+
3
+ import type {
4
+ AgentContext,
5
+ ChatModelReference,
6
+ CompletionPort,
7
+ JevClassifierPort,
8
+ ReadObservation,
9
+ RetrievalAction,
10
+ } from "#src/services"
11
+ import type { Succeeded } from "#src/shared"
12
+ import type { MemoryResolutionRefusal } from "#src/usecases/resolve-memory"
13
+ import type { LoadedChangesSchema } from "./schemas.ts"
14
+
15
+ export type { BoolQuestion, DecisionPrompt } from "#src/services"
16
+
17
+ export interface JevAccess {
18
+ available: true
19
+ classifier: JevClassifierPort
20
+ }
21
+
22
+ export interface JevRefusal {
23
+ available: false
24
+ reason: string
25
+ }
26
+
27
+ export type JevSource = (model: string) => Promise<JevAccess | JevRefusal>
28
+
29
+ export interface LoadedStore {
30
+ all(): ReadObservation[]
31
+ has(note: ReadObservation): boolean
32
+ remember(note: ReadObservation): void
33
+ forget(note: ReadObservation): void
34
+ apply(changes: LoadedChanges): void
35
+ }
36
+
37
+ export interface RetrieveDeps {
38
+ complete: CompletionPort
39
+ jev: JevSource
40
+ loaded: LoadedStore
41
+ }
42
+
43
+ export interface SessionMemoryDeps {
44
+ complete: CompletionPort
45
+ loaded: LoadedStore
46
+ }
47
+
48
+ export interface RetrieveRequest {
49
+ message: string
50
+ }
51
+
52
+ export type LoadedChanges = Static<typeof LoadedChangesSchema>
53
+
54
+ export interface RetrievedMemory {
55
+ text: string | null
56
+ notices: string[]
57
+ changes: LoadedChanges
58
+ }
59
+
60
+ export type CutoffSource = "config" | "typesafe" | "missing"
61
+
62
+ export interface CutoffValue {
63
+ value: number | null
64
+ source: CutoffSource
65
+ }
66
+
67
+ export interface CutoffReport {
68
+ gate: CutoffValue
69
+ relevance: CutoffValue
70
+ }
71
+
72
+ export interface Refreshed {
73
+ blocks: string[]
74
+ changes: LoadedChanges
75
+ }
76
+
77
+ export type RetrieveMemoryResult = Succeeded<RetrievedMemory> | MemoryResolutionRefusal
78
+
79
+ export interface AgentFound {
80
+ succeeded: true
81
+ output: ReadObservation[]
82
+ }
83
+
84
+ export interface AgentFailed {
85
+ succeeded: false
86
+ notice: string | null
87
+ }
88
+
89
+ export type AgentOutcome = AgentFound | AgentFailed
90
+
91
+ export interface AgentRequest {
92
+ agent: AgentContext
93
+ query: string
94
+ model: ChatModelReference
95
+ }
96
+
97
+ export interface FinishDiscriminant {
98
+ action: "finish"
99
+ }
100
+
101
+ export type ReadStep = Exclude<RetrievalAction, FinishDiscriminant>
102
+
103
+ export interface RankedNotes {
104
+ notes: ReadObservation[]
105
+ notice: string | null
106
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./resolve-memory.ts"
2
+ export * from "./types.ts"
@@ -0,0 +1,2 @@
1
+ export * from "./resolve.ts"
2
+ export * from "./types.ts"
@@ -0,0 +1,109 @@
1
+ import {
2
+ type ConfigRefusal,
3
+ canonicalizeRegistration,
4
+ canonicalizeWorkingFolder,
5
+ type MemoryConfig,
6
+ type MemoryScope,
7
+ type PathPlatform,
8
+ readConfigSnapshot,
9
+ targetVault,
10
+ } from "#src/services"
11
+ import {
12
+ type MemoryOperationContext,
13
+ memoryOperationInterruption,
14
+ staleMemorySession,
15
+ } from "#src/usecases/operation-context"
16
+ import type { ResolvedMemory, ResolveMemoryResult, SelectMemoryVaultResult } from "./types.ts"
17
+
18
+ export async function resolveLeasedMemory(context: MemoryOperationContext): Promise<ResolveMemoryResult> {
19
+ const interrupted = memoryOperationInterruption(context)
20
+ if (interrupted) return interrupted
21
+ const snapshot = await readConfigSnapshot({ path: context.configPath, platform: context.platform })
22
+ const stale = memoryOperationInterruption(context)
23
+ if (stale) return stale
24
+ if (!snapshot.succeeded) {
25
+ context.session.invalidate(context.stamp)
26
+ return { ...snapshot, reason: "config-unavailable", configPath: context.configPath }
27
+ }
28
+ if (snapshot.output.state === "missing") {
29
+ context.session.invalidate(context.stamp)
30
+ return {
31
+ succeeded: false,
32
+ reason: "not-configured",
33
+ configPath: context.configPath,
34
+ problems: ["Memory is not configured; provide a complete config file"],
35
+ }
36
+ }
37
+ if (!context.session.acceptConfiguration(context.stamp, snapshot.output.hash)) return staleMemorySession()
38
+ const parsed = snapshot.output.lexicalParse
39
+ if (!parsed.succeeded) return invalidMemoryConfiguration(context, parsed.problems)
40
+ return validateMemoryLocations(context, parsed.output, snapshot.output.hash)
41
+ }
42
+
43
+ async function validateMemoryLocations(
44
+ context: MemoryOperationContext,
45
+ config: MemoryConfig,
46
+ hash: string,
47
+ ): Promise<ResolveMemoryResult> {
48
+ const canonical = await canonicalizeRegistration({
49
+ config,
50
+ configPath: context.configPath,
51
+ indexPath: context.indexPath,
52
+ platform: context.platform,
53
+ })
54
+ const interrupted = memoryOperationInterruption(context)
55
+ if (interrupted) return interrupted
56
+ if (!canonical.succeeded) return invalidMemoryConfiguration(context, canonical.problems)
57
+ const workingFolder = await canonicalizeWorkingFolder(context.workingFolder)
58
+ const stale = memoryOperationInterruption(context)
59
+ if (stale) return stale
60
+ if (!workingFolder.succeeded) return invalidMemoryConfiguration(context, workingFolder.problems)
61
+ return resolvedMemory(
62
+ canonical.output.config,
63
+ hash,
64
+ workingFolder.output,
65
+ canonical.output.indexPath,
66
+ context.platform,
67
+ )
68
+ }
69
+
70
+ function resolvedMemory(
71
+ config: MemoryConfig,
72
+ configHash: string,
73
+ workingFolder: string,
74
+ indexPath: string,
75
+ platform: PathPlatform,
76
+ ): ResolveMemoryResult {
77
+ const global = targetVault(config, "global", workingFolder, platform)
78
+ if (!global.succeeded) throw new Error("Global target requires no project selection")
79
+ const projectTarget = targetVault(config, "project", workingFolder, platform)
80
+ const output: ResolvedMemory = {
81
+ config,
82
+ configHash,
83
+ workingFolder,
84
+ indexPath,
85
+ platform,
86
+ global: { scope: "global", vault: { ...global.output, limits: { ...config.limits } } },
87
+ project: null,
88
+ protectedRoots: [config.global.vault, ...config.projects.map((project) => project.vault)],
89
+ }
90
+ if (projectTarget.succeeded) {
91
+ output.project = { scope: "project", vault: { ...projectTarget.output, limits: { ...config.limits } } }
92
+ }
93
+ return { succeeded: true, output }
94
+ }
95
+
96
+ function invalidMemoryConfiguration(context: MemoryOperationContext, problems: string[]): ConfigRefusal {
97
+ return { succeeded: false, reason: "invalid-config", configPath: context.configPath, problems }
98
+ }
99
+
100
+ export function selectMemoryVault(memory: ResolvedMemory, scope: MemoryScope): SelectMemoryVaultResult {
101
+ if (scope === "global") return { succeeded: true, output: memory.global }
102
+ if (memory.project) return { succeeded: true, output: memory.project }
103
+ return {
104
+ succeeded: false,
105
+ reason: "no-project",
106
+ workingFolder: memory.workingFolder,
107
+ problems: ["The current folder has no registered project; use global memory instead"],
108
+ }
109
+ }
@@ -0,0 +1,35 @@
1
+ import type {
2
+ ConfigRefusal,
3
+ MemoryConfig,
4
+ MemoryScope,
5
+ NamedVaultContext,
6
+ NoProjectRefusal,
7
+ PathPlatform,
8
+ } from "#src/services"
9
+ import type { Failed, Succeeded } from "#src/shared"
10
+ import type { MemoryOperationRefusal } from "#src/usecases/operation-context"
11
+
12
+ export interface ResolvedVault {
13
+ scope: MemoryScope
14
+ vault: NamedVaultContext
15
+ }
16
+
17
+ export interface ResolvedMemory {
18
+ config: MemoryConfig
19
+ configHash: string
20
+ global: ResolvedVault
21
+ project: ResolvedVault | null
22
+ protectedRoots: string[]
23
+ workingFolder: string
24
+ indexPath: string
25
+ platform: PathPlatform
26
+ }
27
+
28
+ export interface MemoryConfigurationUnavailable extends Failed {
29
+ reason: "config-unavailable"
30
+ configPath: string
31
+ }
32
+
33
+ export type MemoryResolutionRefusal = ConfigRefusal | MemoryConfigurationUnavailable | MemoryOperationRefusal
34
+ export type ResolveMemoryResult = Succeeded<ResolvedMemory> | MemoryResolutionRefusal
35
+ export type SelectMemoryVaultResult = Succeeded<ResolvedVault> | NoProjectRefusal
@@ -0,0 +1,23 @@
1
+ import {
2
+ captureMemoryOperationContext,
3
+ type MemoryOperationContext,
4
+ memoryAdmissionRefusal,
5
+ memoryOperationInterruption,
6
+ } from "#src/usecases/operation-context"
7
+ import { resolveLeasedMemory } from "#src/usecases/resolve-memory/leased"
8
+ import type { ResolveMemoryResult } from "./types.ts"
9
+
10
+ export async function resolveMemory(callerContext: MemoryOperationContext): Promise<ResolveMemoryResult> {
11
+ const context = captureMemoryOperationContext(callerContext)
12
+ const lease = await context.session.acquire(context.stamp, context.signal)
13
+ if (!lease) return memoryAdmissionRefusal(context)
14
+ try {
15
+ const result = await resolveLeasedMemory(context)
16
+ if (!result.succeeded) return result
17
+ const interrupted = memoryOperationInterruption(context)
18
+ if (interrupted) return interrupted
19
+ return result
20
+ } finally {
21
+ lease.release()
22
+ }
23
+ }
@@ -0,0 +1,7 @@
1
+ export type {
2
+ MemoryConfigurationUnavailable,
3
+ MemoryResolutionRefusal,
4
+ ResolvedMemory,
5
+ ResolvedVault,
6
+ ResolveMemoryResult,
7
+ } from "#src/usecases/resolve-memory/leased"
@@ -0,0 +1 @@
1
+ export const SEMANTIC_PARTIAL_LINE = "notes are not embedded yet, so semantic results may be incomplete"
@@ -0,0 +1,3 @@
1
+ export * from "./constants.ts"
2
+ export * from "./search-memory.ts"
3
+ export * from "./types.ts"
@@ -0,0 +1,132 @@
1
+ import {
2
+ closeIndex,
3
+ embeddingFingerprint,
4
+ type MemoryScope,
5
+ type OpenedIndex,
6
+ readVectorCoverage,
7
+ searchCatalog,
8
+ } from "#src/services"
9
+ import {
10
+ captureMemoryOperationContext,
11
+ type MemoryOperationContext,
12
+ memoryAdmissionRefusal,
13
+ memoryOperationInterruption,
14
+ } from "#src/usecases/operation-context"
15
+ import {
16
+ type ResolvedMemory,
17
+ type ResolvedVault,
18
+ resolveLeasedMemory,
19
+ selectMemoryVault,
20
+ } from "#src/usecases/resolve-memory/leased"
21
+ import { fuseSearchHits, prepareSemanticSearch, rankSemantically, semanticPortOf } from "#src/usecases/semantic"
22
+ import { openVaultIndex, synchronizeOpenedMemory } from "#src/usecases/synchronize-memory/leased"
23
+ import { SEMANTIC_PARTIAL_LINE } from "./constants.ts"
24
+ import type {
25
+ SearchedMemory,
26
+ SearchMemoryRequest,
27
+ SearchMemoryResult,
28
+ VaultSearchFailure,
29
+ VaultSearchHits,
30
+ VaultSemantic,
31
+ } from "./types.ts"
32
+
33
+ export async function searchMemory(
34
+ input: SearchMemoryRequest,
35
+ callerContext: MemoryOperationContext,
36
+ ): Promise<SearchMemoryResult> {
37
+ const context = captureMemoryOperationContext(callerContext)
38
+ const request = { query: input.query, vault: input.vault }
39
+ const lease = await context.session.acquire(context.stamp, context.signal)
40
+ if (!lease) return memoryAdmissionRefusal(context)
41
+ try {
42
+ const memory = await resolveLeasedMemory(context)
43
+ if (!memory.succeeded) return memory
44
+ return await searchResolvedMemory(request, memory.output, context)
45
+ } finally {
46
+ lease.release()
47
+ }
48
+ }
49
+
50
+ async function searchResolvedMemory(
51
+ request: SearchMemoryRequest,
52
+ memory: ResolvedMemory,
53
+ context: MemoryOperationContext,
54
+ ): Promise<SearchMemoryResult> {
55
+ const port = await semanticPortOf(context, memory)
56
+ const prepared = await prepareSemanticSearch(port, request.query, context)
57
+ const semantic: VaultSemantic = { port, query: prepared.query }
58
+ const problems = [...prepared.problems]
59
+ const output: SearchedMemory = { vaults: [], projectMissing: false, semantic: { mode: "text-only", problems } }
60
+ if (prepared.query) output.semantic.mode = "fused"
61
+ for (const scope of scopesOf(request.vault)) {
62
+ const interrupted = memoryOperationInterruption(context)
63
+ if (interrupted) return interrupted
64
+ const target = selectMemoryVault(memory, scope)
65
+ if (!target.succeeded) {
66
+ output.projectMissing = true
67
+ continue
68
+ }
69
+ output.vaults.push(await searchLeasedVault(request.query, memory, target.output, context, semantic, problems))
70
+ }
71
+ const stale = memoryOperationInterruption(context)
72
+ if (stale) return stale
73
+ return { succeeded: true, output }
74
+ }
75
+
76
+ function scopesOf(vault: SearchMemoryRequest["vault"]): MemoryScope[] {
77
+ if (vault === "both") return ["global", "project"]
78
+ return [vault]
79
+ }
80
+
81
+ async function searchLeasedVault(
82
+ query: string,
83
+ memory: ResolvedMemory,
84
+ target: ResolvedVault,
85
+ context: MemoryOperationContext,
86
+ semantic: VaultSemantic,
87
+ problems: string[],
88
+ ): Promise<VaultSearchHits | VaultSearchFailure> {
89
+ const opened = openVaultIndex(memory, target)
90
+ if (!opened.succeeded) return { vault: target.scope, problems: opened.problems }
91
+ const warnings: string[] = []
92
+ let result: VaultSearchHits | VaultSearchFailure
93
+ try {
94
+ result = await searchSynchronizedVault(query, opened, memory, target, context, semantic, problems)
95
+ } finally {
96
+ const closed = closeIndex(opened.output)
97
+ if (!closed.succeeded) warnings.push(...closed.problems)
98
+ }
99
+ if ("hits" in result) result.warnings.push(...warnings)
100
+ else result.problems.push(...warnings)
101
+ return result
102
+ }
103
+
104
+ async function searchSynchronizedVault(
105
+ query: string,
106
+ opened: OpenedIndex,
107
+ memory: ResolvedMemory,
108
+ target: ResolvedVault,
109
+ context: MemoryOperationContext,
110
+ semantic: VaultSemantic,
111
+ problems: string[],
112
+ ): Promise<VaultSearchHits | VaultSearchFailure> {
113
+ const synchronized = await synchronizeOpenedMemory(opened, memory, target, context, semantic.port)
114
+ if (!synchronized.succeeded) return { vault: target.scope, problems: synchronized.problems }
115
+ const found = searchCatalog(opened.output, { query })
116
+ if (!found.succeeded) return { vault: target.scope, problems: found.problems }
117
+ const warnings = [...synchronized.output.warnings]
118
+ if (!semantic.query) return { vault: target.scope, hits: found.output, warnings }
119
+ const ranked = rankSemantically(opened.output, semantic.query, memory.config.embeddings.provider)
120
+ warnings.push(...ranked.problems)
121
+ const missing = missingVectors(opened, memory)
122
+ if (missing > 0) problems.push(`${target.scope}: ${missing} ${SEMANTIC_PARTIAL_LINE}`)
123
+ return { vault: target.scope, hits: fuseSearchHits(found.output, ranked), warnings }
124
+ }
125
+
126
+ function missingVectors(opened: OpenedIndex, memory: ResolvedMemory): number {
127
+ const coverage = readVectorCoverage(opened.output)
128
+ if (!coverage.succeeded) return 0
129
+ const { generation, embedded, current } = coverage.output
130
+ if (generation?.fingerprint !== embeddingFingerprint(memory.config.embeddings)) return current
131
+ return Math.max(0, current - embedded)
132
+ }