pi-obsidian-memory 0.0.1 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (572) hide show
  1. package/README.md +237 -7
  2. package/package.json +41 -11
  3. package/skills/obsidian-memory/SKILL.md +101 -0
  4. package/src/domain/capture/constants.ts +5 -0
  5. package/src/domain/capture/index.ts +6 -0
  6. package/src/domain/capture/input-problems.ts +9 -0
  7. package/src/domain/capture/schemas.ts +92 -0
  8. package/src/domain/capture/tally.ts +26 -0
  9. package/src/domain/capture/types.ts +49 -0
  10. package/src/domain/capture/validate.ts +75 -0
  11. package/src/domain/command-flags/constants.ts +141 -0
  12. package/src/domain/command-flags/index.ts +1 -0
  13. package/src/domain/config/change.ts +105 -0
  14. package/src/domain/config/constants.ts +25 -0
  15. package/src/domain/config/diagnostics.ts +35 -0
  16. package/src/domain/config/disclosures.ts +8 -0
  17. package/src/domain/config/fields.ts +7 -0
  18. package/src/domain/config/index.ts +11 -0
  19. package/src/domain/config/inspection.ts +43 -0
  20. package/src/domain/config/invariants.ts +68 -0
  21. package/src/domain/config/legacy-capture.ts +17 -0
  22. package/src/domain/config/observations.ts +109 -0
  23. package/src/domain/config/parse.ts +25 -0
  24. package/src/domain/config/paths.ts +61 -0
  25. package/src/domain/config/registration.ts +34 -0
  26. package/src/domain/config/repair.ts +36 -0
  27. package/src/domain/config/resources.ts +65 -0
  28. package/src/domain/config/rules.ts +49 -0
  29. package/src/domain/config/schemas.ts +155 -0
  30. package/src/domain/config/settings.ts +23 -0
  31. package/src/domain/config/types.ts +239 -0
  32. package/src/domain/decision-model/constants.ts +7 -0
  33. package/src/domain/decision-model/cutoffs.ts +8 -0
  34. package/src/domain/decision-model/endpoint.ts +11 -0
  35. package/src/domain/decision-model/failure-detail.ts +8 -0
  36. package/src/domain/decision-model/index.ts +6 -0
  37. package/src/domain/decision-model/rank.ts +36 -0
  38. package/src/domain/decision-model/types.ts +77 -0
  39. package/src/domain/embeddings/constants.ts +55 -0
  40. package/src/domain/embeddings/identity.ts +30 -0
  41. package/src/domain/embeddings/index.ts +5 -0
  42. package/src/domain/embeddings/schemas.ts +25 -0
  43. package/src/domain/embeddings/types.ts +52 -0
  44. package/src/domain/embeddings/vectors.ts +53 -0
  45. package/src/domain/folder-index/constants.ts +9 -0
  46. package/src/domain/folder-index/display.ts +22 -0
  47. package/src/domain/folder-index/index.ts +5 -0
  48. package/src/domain/folder-index/listing.ts +58 -0
  49. package/src/domain/folder-index/render.ts +114 -0
  50. package/src/domain/folder-index/types.ts +41 -0
  51. package/src/domain/index.ts +22 -0
  52. package/src/domain/lifecycle/index.ts +2 -0
  53. package/src/domain/lifecycle/lifecycle.ts +39 -0
  54. package/src/domain/lifecycle/types.ts +17 -0
  55. package/src/domain/loaded-memory/budget.ts +14 -0
  56. package/src/domain/loaded-memory/constants.ts +9 -0
  57. package/src/domain/loaded-memory/index.ts +4 -0
  58. package/src/domain/loaded-memory/render.ts +30 -0
  59. package/src/domain/loaded-memory/types.ts +19 -0
  60. package/src/domain/memory/draft.ts +12 -0
  61. package/src/domain/memory/index.ts +4 -0
  62. package/src/domain/memory/schemas.ts +15 -0
  63. package/src/domain/memory/target.ts +27 -0
  64. package/src/domain/memory/types.ts +20 -0
  65. package/src/domain/memory-agent/index.ts +5 -0
  66. package/src/domain/memory-agent/input-problems.ts +9 -0
  67. package/src/domain/memory-agent/refusal.ts +6 -0
  68. package/src/domain/memory-agent/schemas.ts +112 -0
  69. package/src/domain/memory-agent/types.ts +25 -0
  70. package/src/domain/memory-agent/validate.ts +67 -0
  71. package/src/domain/names/constants.ts +32 -0
  72. package/src/domain/names/index.ts +2 -0
  73. package/src/domain/names/names.ts +83 -0
  74. package/src/domain/note/check.ts +68 -0
  75. package/src/domain/note/constants.ts +15 -0
  76. package/src/domain/note/frontmatter-fields.ts +175 -0
  77. package/src/domain/note/frontmatter.ts +138 -0
  78. package/src/domain/note/index.ts +9 -0
  79. package/src/domain/note/parse.ts +41 -0
  80. package/src/domain/note/render.ts +27 -0
  81. package/src/domain/note/schema-errors.ts +41 -0
  82. package/src/domain/note/schemas.ts +38 -0
  83. package/src/domain/note/types.ts +53 -0
  84. package/src/domain/note/validate.ts +19 -0
  85. package/src/domain/path-platform/index.ts +2 -0
  86. package/src/domain/path-platform/path-module.ts +11 -0
  87. package/src/domain/path-platform/types.ts +1 -0
  88. package/src/domain/search-catalog/constants.ts +1 -0
  89. package/src/domain/search-catalog/coverage.ts +35 -0
  90. package/src/domain/search-catalog/dont-forget.ts +10 -0
  91. package/src/domain/search-catalog/fingerprint.ts +9 -0
  92. package/src/domain/search-catalog/index.ts +10 -0
  93. package/src/domain/search-catalog/inspection.ts +47 -0
  94. package/src/domain/search-catalog/plan.ts +68 -0
  95. package/src/domain/search-catalog/ranking.ts +27 -0
  96. package/src/domain/search-catalog/schemas.ts +49 -0
  97. package/src/domain/search-catalog/types.ts +103 -0
  98. package/src/domain/search-catalog/vector-refresh.ts +22 -0
  99. package/src/domain/shell-edit/command-segments.ts +28 -0
  100. package/src/domain/shell-edit/command-words.ts +22 -0
  101. package/src/domain/shell-edit/constants.ts +125 -0
  102. package/src/domain/shell-edit/executed-files.ts +154 -0
  103. package/src/domain/shell-edit/index.ts +6 -0
  104. package/src/domain/shell-edit/powershell-files.ts +38 -0
  105. package/src/domain/shell-edit/rules.ts +19 -0
  106. package/src/domain/shell-edit/types.ts +75 -0
  107. package/src/domain/tool-flags/constants.ts +178 -0
  108. package/src/domain/tool-flags/index.ts +2 -0
  109. package/src/domain/tool-flags/types.ts +7 -0
  110. package/src/domain/validation/constants.ts +1 -0
  111. package/src/domain/validation/describe.ts +137 -0
  112. package/src/domain/validation/index.ts +3 -0
  113. package/src/domain/validation/types.ts +3 -0
  114. package/src/domain/vault-access/absolute-candidate.ts +81 -0
  115. package/src/domain/vault-access/argument-tokens.ts +22 -0
  116. package/src/domain/vault-access/command-mentions-vault.ts +115 -0
  117. package/src/domain/vault-access/constants.ts +54 -0
  118. package/src/domain/vault-access/index.ts +7 -0
  119. package/src/domain/vault-access/types.ts +18 -0
  120. package/src/domain/vault-access/vault-access-refusal.ts +36 -0
  121. package/src/domain/vault-access/vault-location.ts +22 -0
  122. package/src/domain/vault-assets/index.ts +2 -0
  123. package/src/domain/vault-assets/render.ts +51 -0
  124. package/src/domain/vault-assets/types.ts +36 -0
  125. package/src/domain/vault-catalog/analyze.ts +37 -0
  126. package/src/domain/vault-catalog/classify.ts +37 -0
  127. package/src/domain/vault-catalog/dont-forget.ts +6 -0
  128. package/src/domain/vault-catalog/export-entries.ts +10 -0
  129. package/src/domain/vault-catalog/index.ts +5 -0
  130. package/src/domain/vault-catalog/types.ts +114 -0
  131. package/src/domain/vault-diagnosis/diagnose.ts +79 -0
  132. package/src/domain/vault-diagnosis/index.ts +2 -0
  133. package/src/domain/vault-diagnosis/types.ts +31 -0
  134. package/src/domain/vault-path/constants.ts +13 -0
  135. package/src/domain/vault-path/index.ts +2 -0
  136. package/src/domain/vault-path/vault-path.ts +65 -0
  137. package/src/pi/capture/cadence.ts +49 -0
  138. package/src/pi/capture/completion.ts +26 -0
  139. package/src/pi/capture/constants.ts +5 -0
  140. package/src/pi/capture/handlers.ts +30 -0
  141. package/src/pi/capture/index.ts +8 -0
  142. package/src/pi/capture/runtime.ts +83 -0
  143. package/src/pi/capture/schemas.ts +8 -0
  144. package/src/pi/capture/tool-calls.ts +6 -0
  145. package/src/pi/capture/transcript.ts +55 -0
  146. package/src/pi/capture/types.ts +46 -0
  147. package/src/pi/change-report/constants.ts +15 -0
  148. package/src/pi/change-report/index.ts +3 -0
  149. package/src/pi/change-report/report.ts +54 -0
  150. package/src/pi/change-report/types.ts +8 -0
  151. package/src/pi/context/constants.ts +5 -0
  152. package/src/pi/context/index.ts +3 -0
  153. package/src/pi/context/status.ts +15 -0
  154. package/src/pi/context/types.ts +98 -0
  155. package/src/pi/extension.ts +100 -0
  156. package/src/pi/index.ts +26 -0
  157. package/src/pi/memory-add/constants.ts +13 -0
  158. package/src/pi/memory-add/index.ts +5 -0
  159. package/src/pi/memory-add/memory-add.ts +31 -0
  160. package/src/pi/memory-add/respond.ts +55 -0
  161. package/src/pi/memory-add/schemas.ts +29 -0
  162. package/src/pi/memory-add/types.ts +15 -0
  163. package/src/pi/memory-archive/constants.ts +8 -0
  164. package/src/pi/memory-archive/index.ts +4 -0
  165. package/src/pi/memory-archive/memory-archive.ts +29 -0
  166. package/src/pi/memory-archive/schemas.ts +15 -0
  167. package/src/pi/memory-archive/types.ts +8 -0
  168. package/src/pi/memory-block/block.ts +75 -0
  169. package/src/pi/memory-block/constants.ts +24 -0
  170. package/src/pi/memory-block/index.ts +4 -0
  171. package/src/pi/memory-block/render.ts +54 -0
  172. package/src/pi/memory-block/types.ts +24 -0
  173. package/src/pi/memory-doctor/constants.ts +43 -0
  174. package/src/pi/memory-doctor/index.ts +4 -0
  175. package/src/pi/memory-doctor/memory-doctor.ts +135 -0
  176. package/src/pi/memory-doctor/report.ts +101 -0
  177. package/src/pi/memory-doctor/types.ts +13 -0
  178. package/src/pi/memory-export/constants.ts +15 -0
  179. package/src/pi/memory-export/index.ts +4 -0
  180. package/src/pi/memory-export/memory-export.ts +57 -0
  181. package/src/pi/memory-export/name.ts +9 -0
  182. package/src/pi/memory-export/types.ts +4 -0
  183. package/src/pi/memory-get/constants.ts +12 -0
  184. package/src/pi/memory-get/index.ts +5 -0
  185. package/src/pi/memory-get/memory-get.ts +23 -0
  186. package/src/pi/memory-get/respond.ts +38 -0
  187. package/src/pi/memory-get/schemas.ts +13 -0
  188. package/src/pi/memory-get/types.ts +10 -0
  189. package/src/pi/memory-init/constants.ts +17 -0
  190. package/src/pi/memory-init/index.ts +2 -0
  191. package/src/pi/memory-init/memory-init.ts +63 -0
  192. package/src/pi/memory-search/constants.ts +16 -0
  193. package/src/pi/memory-search/index.ts +5 -0
  194. package/src/pi/memory-search/memory-search.ts +22 -0
  195. package/src/pi/memory-search/respond.ts +62 -0
  196. package/src/pi/memory-search/schemas.ts +11 -0
  197. package/src/pi/memory-search/types.ts +10 -0
  198. package/src/pi/memory-session/constants.ts +7 -0
  199. package/src/pi/memory-session/index.ts +4 -0
  200. package/src/pi/memory-session/keeper.ts +101 -0
  201. package/src/pi/memory-session/respond.ts +6 -0
  202. package/src/pi/memory-session/types.ts +23 -0
  203. package/src/pi/memory-settings/constants.ts +69 -0
  204. package/src/pi/memory-settings/edits.ts +46 -0
  205. package/src/pi/memory-settings/index.ts +9 -0
  206. package/src/pi/memory-settings/lines.ts +119 -0
  207. package/src/pi/memory-settings/models.ts +81 -0
  208. package/src/pi/memory-settings/projects.ts +46 -0
  209. package/src/pi/memory-settings/providers.ts +77 -0
  210. package/src/pi/memory-settings/save.ts +16 -0
  211. package/src/pi/memory-settings/screen.ts +27 -0
  212. package/src/pi/memory-settings/types.ts +87 -0
  213. package/src/pi/memory-setup/constants.ts +33 -0
  214. package/src/pi/memory-setup/disclosure.ts +22 -0
  215. package/src/pi/memory-setup/index.ts +4 -0
  216. package/src/pi/memory-setup/memory-setup.ts +153 -0
  217. package/src/pi/memory-setup/types.ts +6 -0
  218. package/src/pi/memory-succeed/constants.ts +10 -0
  219. package/src/pi/memory-succeed/index.ts +4 -0
  220. package/src/pi/memory-succeed/memory-succeed.ts +34 -0
  221. package/src/pi/memory-succeed/schemas.ts +30 -0
  222. package/src/pi/memory-succeed/types.ts +8 -0
  223. package/src/pi/memory-update/constants.ts +8 -0
  224. package/src/pi/memory-update/index.ts +4 -0
  225. package/src/pi/memory-update/memory-update.ts +29 -0
  226. package/src/pi/memory-update/schemas.ts +24 -0
  227. package/src/pi/memory-update/types.ts +8 -0
  228. package/src/pi/paths/constants.ts +7 -0
  229. package/src/pi/paths/index.ts +2 -0
  230. package/src/pi/paths/paths.ts +15 -0
  231. package/src/pi/paths/platform.ts +7 -0
  232. package/src/pi/registrar.ts +25 -0
  233. package/src/pi/registration-report/constants.ts +13 -0
  234. package/src/pi/registration-report/index.ts +2 -0
  235. package/src/pi/registration-report/report.ts +26 -0
  236. package/src/pi/relevant-memory/constants.ts +3 -0
  237. package/src/pi/relevant-memory/index.ts +4 -0
  238. package/src/pi/relevant-memory/prompt.ts +23 -0
  239. package/src/pi/relevant-memory/runtime.ts +88 -0
  240. package/src/pi/relevant-memory/types.ts +14 -0
  241. package/src/pi/semantic/constants.ts +3 -0
  242. package/src/pi/semantic/index.ts +2 -0
  243. package/src/pi/semantic/runtime.ts +59 -0
  244. package/src/pi/session-start/constants.ts +7 -0
  245. package/src/pi/session-start/index.ts +3 -0
  246. package/src/pi/session-start/session-start.ts +48 -0
  247. package/src/pi/session-start/types.ts +5 -0
  248. package/src/pi/shell-edit-guard/guard.ts +41 -0
  249. package/src/pi/shell-edit-guard/index.ts +3 -0
  250. package/src/pi/shell-edit-guard/prompt.ts +30 -0
  251. package/src/pi/shell-edit-guard/types.ts +13 -0
  252. package/src/pi/types.ts +44 -0
  253. package/src/pi/vault-guard/constants.ts +1 -0
  254. package/src/pi/vault-guard/index.ts +4 -0
  255. package/src/pi/vault-guard/request.ts +39 -0
  256. package/src/pi/vault-guard/types.ts +5 -0
  257. package/src/pi/vault-guard/vault-guard.ts +21 -0
  258. package/src/services/capture-cadence/domain-rules.ts +8 -0
  259. package/src/services/capture-cadence/index.ts +1 -0
  260. package/src/services/clock/clock.ts +7 -0
  261. package/src/services/clock/index.ts +1 -0
  262. package/src/services/config/canonicalize.ts +163 -0
  263. package/src/services/config/constants.ts +1 -0
  264. package/src/services/config/fully-qualified-path.ts +14 -0
  265. package/src/services/config/index.ts +12 -0
  266. package/src/services/config/path-identity.ts +65 -0
  267. package/src/services/config/publication.ts +75 -0
  268. package/src/services/config/read.ts +47 -0
  269. package/src/services/config/registration.ts +26 -0
  270. package/src/services/config/resolve-input.ts +27 -0
  271. package/src/services/config/snapshot.ts +26 -0
  272. package/src/services/config/target.ts +2 -0
  273. package/src/services/config/types.ts +97 -0
  274. package/src/services/config/vault-access.ts +2 -0
  275. package/src/services/config/volume-namespace.ts +5 -0
  276. package/src/services/config/write.ts +63 -0
  277. package/src/services/decision-model/constants.ts +16 -0
  278. package/src/services/decision-model/decide.ts +42 -0
  279. package/src/services/decision-model/diagnostics.ts +6 -0
  280. package/src/services/decision-model/endpoint.ts +1 -0
  281. package/src/services/decision-model/failure-detail.ts +1 -0
  282. package/src/services/decision-model/index.ts +7 -0
  283. package/src/services/decision-model/interruption.ts +29 -0
  284. package/src/services/decision-model/jev.ts +61 -0
  285. package/src/services/decision-model/laya-batch.ts +64 -0
  286. package/src/services/decision-model/laya-http-failure.ts +41 -0
  287. package/src/services/decision-model/laya-response.ts +95 -0
  288. package/src/services/decision-model/laya.ts +35 -0
  289. package/src/services/decision-model/preflight.ts +24 -0
  290. package/src/services/decision-model/prompts.ts +36 -0
  291. package/src/services/decision-model/schemas.ts +43 -0
  292. package/src/services/decision-model/score-candidates.ts +41 -0
  293. package/src/services/decision-model/types.ts +182 -0
  294. package/src/services/embeddings/asset-download.ts +45 -0
  295. package/src/services/embeddings/asset-fetch.ts +39 -0
  296. package/src/services/embeddings/asset-inspection.ts +36 -0
  297. package/src/services/embeddings/batch.ts +32 -0
  298. package/src/services/embeddings/chunks.ts +80 -0
  299. package/src/services/embeddings/configuration.ts +8 -0
  300. package/src/services/embeddings/constants.ts +24 -0
  301. package/src/services/embeddings/errors.ts +11 -0
  302. package/src/services/embeddings/google.ts +90 -0
  303. package/src/services/embeddings/http.ts +64 -0
  304. package/src/services/embeddings/index.ts +17 -0
  305. package/src/services/embeddings/inference.ts +35 -0
  306. package/src/services/embeddings/local.ts +138 -0
  307. package/src/services/embeddings/model-asset.ts +68 -0
  308. package/src/services/embeddings/model-cache.ts +30 -0
  309. package/src/services/embeddings/openai.ts +64 -0
  310. package/src/services/embeddings/operation.ts +31 -0
  311. package/src/services/embeddings/responses.ts +41 -0
  312. package/src/services/embeddings/runtime.ts +13 -0
  313. package/src/services/embeddings/schemas.ts +53 -0
  314. package/src/services/embeddings/types.ts +116 -0
  315. package/src/services/id/id.ts +5 -0
  316. package/src/services/id/index.ts +1 -0
  317. package/src/services/index.ts +11 -0
  318. package/src/services/llm/capture.ts +19 -0
  319. package/src/services/llm/check-chat-models.ts +38 -0
  320. package/src/services/llm/complete.ts +57 -0
  321. package/src/services/llm/constants.ts +32 -0
  322. package/src/services/llm/domain-rules.ts +2 -0
  323. package/src/services/llm/index.ts +6 -0
  324. package/src/services/llm/lifetime.ts +16 -0
  325. package/src/services/llm/retrieve.ts +19 -0
  326. package/src/services/llm/schemas.ts +9 -0
  327. package/src/services/llm/types.ts +94 -0
  328. package/src/services/search-index/catalog-query.ts +34 -0
  329. package/src/services/search-index/catalog-statements.ts +33 -0
  330. package/src/services/search-index/catalog.ts +19 -0
  331. package/src/services/search-index/cleanup.ts +13 -0
  332. package/src/services/search-index/close.ts +5 -0
  333. package/src/services/search-index/constants.ts +102 -0
  334. package/src/services/search-index/dont-forget.ts +1 -0
  335. package/src/services/search-index/fingerprint.ts +17 -0
  336. package/src/services/search-index/folder-index-statements.ts +17 -0
  337. package/src/services/search-index/folder-index-storage.ts +54 -0
  338. package/src/services/search-index/folder-indexes.ts +13 -0
  339. package/src/services/search-index/index.ts +14 -0
  340. package/src/services/search-index/inspection.ts +1 -0
  341. package/src/services/search-index/inventory.ts +67 -0
  342. package/src/services/search-index/legacy.ts +64 -0
  343. package/src/services/search-index/location.ts +12 -0
  344. package/src/services/search-index/open.ts +46 -0
  345. package/src/services/search-index/query.ts +39 -0
  346. package/src/services/search-index/ranking.ts +12 -0
  347. package/src/services/search-index/reconcile.ts +93 -0
  348. package/src/services/search-index/recovery.ts +56 -0
  349. package/src/services/search-index/refusals.ts +21 -0
  350. package/src/services/search-index/schema.ts +42 -0
  351. package/src/services/search-index/schemas.ts +181 -0
  352. package/src/services/search-index/search.ts +5 -0
  353. package/src/services/search-index/statements.ts +18 -0
  354. package/src/services/search-index/storage.ts +207 -0
  355. package/src/services/search-index/types.ts +113 -0
  356. package/src/services/search-index/vector-statements.ts +18 -0
  357. package/src/services/search-index/vector-storage.ts +169 -0
  358. package/src/services/search-index/vectors.ts +18 -0
  359. package/src/services/search-index/write.ts +9 -0
  360. package/src/services/shell-edit/ask.ts +53 -0
  361. package/src/services/shell-edit/domain-rules.ts +2 -0
  362. package/src/services/shell-edit/index.ts +4 -0
  363. package/src/services/shell-edit/schemas.ts +23 -0
  364. package/src/services/shell-edit/types.ts +61 -0
  365. package/src/services/shell-scripts/constants.ts +1 -0
  366. package/src/services/shell-scripts/files.ts +16 -0
  367. package/src/services/shell-scripts/index.ts +5 -0
  368. package/src/services/shell-scripts/package-scripts.ts +74 -0
  369. package/src/services/shell-scripts/schemas.ts +3 -0
  370. package/src/services/shell-scripts/scripts.ts +27 -0
  371. package/src/services/shell-scripts/types.ts +11 -0
  372. package/src/services/vault/archive.ts +31 -0
  373. package/src/services/vault/bootstrap/ensure.ts +50 -0
  374. package/src/services/vault/bootstrap/index.ts +2 -0
  375. package/src/services/vault/bootstrap/paths.ts +57 -0
  376. package/src/services/vault/bootstrap/types.ts +17 -0
  377. package/src/services/vault/bootstrap/write.ts +47 -0
  378. package/src/services/vault/catalog/bytes.ts +51 -0
  379. package/src/services/vault/catalog/dont-forget.ts +1 -0
  380. package/src/services/vault/catalog/enumerate.ts +69 -0
  381. package/src/services/vault/catalog/export.ts +21 -0
  382. package/src/services/vault/catalog/failures.ts +16 -0
  383. package/src/services/vault/catalog/index.ts +10 -0
  384. package/src/services/vault/catalog/inspect.ts +41 -0
  385. package/src/services/vault/catalog/observe.ts +35 -0
  386. package/src/services/vault/catalog/resolve.ts +94 -0
  387. package/src/services/vault/catalog/stat.ts +23 -0
  388. package/src/services/vault/catalog/types.ts +69 -0
  389. package/src/services/vault/catalog/visit.ts +58 -0
  390. package/src/services/vault/complete-blank.ts +66 -0
  391. package/src/services/vault/constants.ts +3 -0
  392. package/src/services/vault/context/index.ts +1 -0
  393. package/src/services/vault/context/types.ts +10 -0
  394. package/src/services/vault/create.ts +19 -0
  395. package/src/services/vault/display.ts +6 -0
  396. package/src/services/vault/domain-rules.ts +10 -0
  397. package/src/services/vault/draft.ts +2 -0
  398. package/src/services/vault/filesystem/failures.ts +53 -0
  399. package/src/services/vault/filesystem/hash.ts +5 -0
  400. package/src/services/vault/filesystem/index.ts +5 -0
  401. package/src/services/vault/filesystem/read.ts +61 -0
  402. package/src/services/vault/filesystem/types.ts +36 -0
  403. package/src/services/vault/filesystem/write.ts +80 -0
  404. package/src/services/vault/find.ts +27 -0
  405. package/src/services/vault/folder-contents.ts +31 -0
  406. package/src/services/vault/folder-index/index.ts +2 -0
  407. package/src/services/vault/folder-index/read.ts +87 -0
  408. package/src/services/vault/folder-index/types.ts +19 -0
  409. package/src/services/vault/folder-listing.ts +1 -0
  410. package/src/services/vault/index.ts +21 -0
  411. package/src/services/vault/inspect-folder.ts +13 -0
  412. package/src/services/vault/list.ts +121 -0
  413. package/src/services/vault/memory-folder.ts +24 -0
  414. package/src/services/vault/paths.ts +11 -0
  415. package/src/services/vault/publish.ts +52 -0
  416. package/src/services/vault/read.ts +46 -0
  417. package/src/services/vault/refresh-folders.ts +197 -0
  418. package/src/services/vault/refresh-plan.ts +79 -0
  419. package/src/services/vault/refresh.ts +8 -0
  420. package/src/services/vault/refusals.ts +23 -0
  421. package/src/services/vault/relocate.ts +131 -0
  422. package/src/services/vault/relocation-checks.ts +89 -0
  423. package/src/services/vault/resolve-stored-file.ts +43 -0
  424. package/src/services/vault/resolve.ts +109 -0
  425. package/src/services/vault/succeed.ts +45 -0
  426. package/src/services/vault/types.ts +199 -0
  427. package/src/services/vault/update-file.ts +58 -0
  428. package/src/services/vault/update.ts +22 -0
  429. package/src/services/vault/write-new-file.ts +37 -0
  430. package/src/shared/index.ts +1 -0
  431. package/src/shared/result/index.ts +1 -0
  432. package/src/shared/result/types.ts +17 -0
  433. package/src/usecases/add-memory/add-memory.ts +83 -0
  434. package/src/usecases/add-memory/index.ts +4 -0
  435. package/src/usecases/add-memory/maintenance.ts +23 -0
  436. package/src/usecases/add-memory/schemas.ts +12 -0
  437. package/src/usecases/add-memory/types.ts +47 -0
  438. package/src/usecases/archive-memory/archive-memory.ts +27 -0
  439. package/src/usecases/archive-memory/index.ts +3 -0
  440. package/src/usecases/archive-memory/schemas.ts +11 -0
  441. package/src/usecases/archive-memory/types.ts +17 -0
  442. package/src/usecases/capture-memory/apply.ts +73 -0
  443. package/src/usecases/capture-memory/capture-memory.ts +117 -0
  444. package/src/usecases/capture-memory/constants.ts +15 -0
  445. package/src/usecases/capture-memory/index.ts +5 -0
  446. package/src/usecases/capture-memory/observe.ts +122 -0
  447. package/src/usecases/capture-memory/settings.ts +20 -0
  448. package/src/usecases/capture-memory/types.ts +103 -0
  449. package/src/usecases/check-shell-edit/check-shell-edit.ts +28 -0
  450. package/src/usecases/check-shell-edit/index.ts +2 -0
  451. package/src/usecases/check-shell-edit/types.ts +30 -0
  452. package/src/usecases/check-vault-access/check-vault-access.ts +23 -0
  453. package/src/usecases/check-vault-access/constants.ts +7 -0
  454. package/src/usecases/check-vault-access/index.ts +4 -0
  455. package/src/usecases/check-vault-access/raw-device.ts +10 -0
  456. package/src/usecases/check-vault-access/targets.ts +49 -0
  457. package/src/usecases/check-vault-access/types.ts +33 -0
  458. package/src/usecases/complete-blank-memory/complete-blank-memory.ts +48 -0
  459. package/src/usecases/complete-blank-memory/constants.ts +3 -0
  460. package/src/usecases/complete-blank-memory/index.ts +4 -0
  461. package/src/usecases/complete-blank-memory/schemas.ts +14 -0
  462. package/src/usecases/complete-blank-memory/types.ts +28 -0
  463. package/src/usecases/diagnose-memory/constants.ts +3 -0
  464. package/src/usecases/diagnose-memory/decision.ts +36 -0
  465. package/src/usecases/diagnose-memory/diagnose-memory.ts +52 -0
  466. package/src/usecases/diagnose-memory/embeddings.ts +39 -0
  467. package/src/usecases/diagnose-memory/index.ts +5 -0
  468. package/src/usecases/diagnose-memory/types.ts +86 -0
  469. package/src/usecases/diagnose-memory/vault.ts +33 -0
  470. package/src/usecases/export-memory/collect.ts +20 -0
  471. package/src/usecases/export-memory/constants.ts +3 -0
  472. package/src/usecases/export-memory/export-memory.ts +84 -0
  473. package/src/usecases/export-memory/index.ts +3 -0
  474. package/src/usecases/export-memory/types.ts +28 -0
  475. package/src/usecases/get-memory/get-memory.ts +97 -0
  476. package/src/usecases/get-memory/index.ts +2 -0
  477. package/src/usecases/get-memory/types.ts +25 -0
  478. package/src/usecases/index.ts +25 -0
  479. package/src/usecases/list-memory/index.ts +2 -0
  480. package/src/usecases/list-memory/leased/index.ts +2 -0
  481. package/src/usecases/list-memory/leased/read.ts +16 -0
  482. package/src/usecases/list-memory/leased/types.ts +21 -0
  483. package/src/usecases/list-memory/list-memory.ts +33 -0
  484. package/src/usecases/list-memory/types.ts +8 -0
  485. package/src/usecases/load-dont-forget/index.ts +2 -0
  486. package/src/usecases/load-dont-forget/load-dont-forget.ts +111 -0
  487. package/src/usecases/load-dont-forget/types.ts +26 -0
  488. package/src/usecases/memory-change/change.ts +42 -0
  489. package/src/usecases/memory-change/index.ts +5 -0
  490. package/src/usecases/memory-change/maintenance.ts +11 -0
  491. package/src/usecases/memory-change/partial.ts +18 -0
  492. package/src/usecases/memory-change/receipt.ts +40 -0
  493. package/src/usecases/memory-change/types.ts +44 -0
  494. package/src/usecases/operation-context/context.ts +37 -0
  495. package/src/usecases/operation-context/index.ts +2 -0
  496. package/src/usecases/operation-context/types.ts +19 -0
  497. package/src/usecases/registration/check.ts +6 -0
  498. package/src/usecases/registration/entry.ts +33 -0
  499. package/src/usecases/registration/index.ts +8 -0
  500. package/src/usecases/registration/init.ts +94 -0
  501. package/src/usecases/registration/prepare-init.ts +43 -0
  502. package/src/usecases/registration/prepare.ts +35 -0
  503. package/src/usecases/registration/propose.ts +34 -0
  504. package/src/usecases/registration/publication.ts +90 -0
  505. package/src/usecases/registration/setup.ts +41 -0
  506. package/src/usecases/registration/types.ts +107 -0
  507. package/src/usecases/relevant-memory/agent.ts +55 -0
  508. package/src/usecases/relevant-memory/constants.ts +28 -0
  509. package/src/usecases/relevant-memory/cutoffs.ts +29 -0
  510. package/src/usecases/relevant-memory/decision.ts +102 -0
  511. package/src/usecases/relevant-memory/index.ts +11 -0
  512. package/src/usecases/relevant-memory/loaded.ts +31 -0
  513. package/src/usecases/relevant-memory/refresh.ts +30 -0
  514. package/src/usecases/relevant-memory/retrieve-memory.ts +62 -0
  515. package/src/usecases/relevant-memory/schemas.ts +20 -0
  516. package/src/usecases/relevant-memory/session-memory.ts +53 -0
  517. package/src/usecases/relevant-memory/track-dont-forget.ts +13 -0
  518. package/src/usecases/relevant-memory/types.ts +106 -0
  519. package/src/usecases/resolve-memory/index.ts +2 -0
  520. package/src/usecases/resolve-memory/leased/index.ts +2 -0
  521. package/src/usecases/resolve-memory/leased/resolve.ts +109 -0
  522. package/src/usecases/resolve-memory/leased/types.ts +35 -0
  523. package/src/usecases/resolve-memory/resolve-memory.ts +23 -0
  524. package/src/usecases/resolve-memory/types.ts +7 -0
  525. package/src/usecases/search-memory/constants.ts +1 -0
  526. package/src/usecases/search-memory/index.ts +3 -0
  527. package/src/usecases/search-memory/search-memory.ts +132 -0
  528. package/src/usecases/search-memory/types.ts +39 -0
  529. package/src/usecases/semantic/constants.ts +7 -0
  530. package/src/usecases/semantic/index.ts +5 -0
  531. package/src/usecases/semantic/prepare.ts +30 -0
  532. package/src/usecases/semantic/rank.ts +83 -0
  533. package/src/usecases/semantic/refresh-vectors.ts +95 -0
  534. package/src/usecases/semantic/types.ts +17 -0
  535. package/src/usecases/semantic-port/index.ts +1 -0
  536. package/src/usecases/semantic-port/types.ts +20 -0
  537. package/src/usecases/semantic-provider/constants.ts +6 -0
  538. package/src/usecases/semantic-provider/index.ts +5 -0
  539. package/src/usecases/semantic-provider/local.ts +33 -0
  540. package/src/usecases/semantic-provider/remote.ts +10 -0
  541. package/src/usecases/semantic-provider/size.ts +10 -0
  542. package/src/usecases/semantic-provider/types.ts +19 -0
  543. package/src/usecases/session/index.ts +2 -0
  544. package/src/usecases/session/lease.ts +70 -0
  545. package/src/usecases/session/receipts.ts +46 -0
  546. package/src/usecases/session/state.ts +106 -0
  547. package/src/usecases/session/types.ts +45 -0
  548. package/src/usecases/settings/change.ts +142 -0
  549. package/src/usecases/settings/index.ts +3 -0
  550. package/src/usecases/settings/prepare.ts +24 -0
  551. package/src/usecases/settings/types.ts +32 -0
  552. package/src/usecases/succeed-memory/index.ts +3 -0
  553. package/src/usecases/succeed-memory/schemas.ts +13 -0
  554. package/src/usecases/succeed-memory/succeed-memory.ts +34 -0
  555. package/src/usecases/succeed-memory/types.ts +18 -0
  556. package/src/usecases/synchronize-memory/index.ts +2 -0
  557. package/src/usecases/synchronize-memory/leased/aliases.ts +55 -0
  558. package/src/usecases/synchronize-memory/leased/folder-states.ts +58 -0
  559. package/src/usecases/synchronize-memory/leased/index.ts +2 -0
  560. package/src/usecases/synchronize-memory/leased/inspection.ts +32 -0
  561. package/src/usecases/synchronize-memory/leased/maintenance.ts +41 -0
  562. package/src/usecases/synchronize-memory/leased/publication.ts +55 -0
  563. package/src/usecases/synchronize-memory/leased/scan.ts +37 -0
  564. package/src/usecases/synchronize-memory/leased/synchronize.ts +102 -0
  565. package/src/usecases/synchronize-memory/leased/types.ts +60 -0
  566. package/src/usecases/synchronize-memory/synchronize-memory.ts +26 -0
  567. package/src/usecases/synchronize-memory/types.ts +5 -0
  568. package/src/usecases/update-memory/index.ts +3 -0
  569. package/src/usecases/update-memory/schemas.ts +14 -0
  570. package/src/usecases/update-memory/types.ts +16 -0
  571. package/src/usecases/update-memory/update-memory.ts +31 -0
  572. package/CHANGELOG.md +0 -21
@@ -0,0 +1,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
+ }
@@ -0,0 +1,39 @@
1
+ import type { CatalogHit, MemoryScope } from "#src/services"
2
+ import type { Succeeded } from "#src/shared"
3
+ import type { MemoryResolutionRefusal } from "#src/usecases/resolve-memory"
4
+ import type { QueryVector } from "#src/usecases/semantic"
5
+ import type { SemanticPort } from "#src/usecases/semantic-port"
6
+
7
+ export interface SearchMemoryRequest {
8
+ query: string
9
+ vault: MemoryScope | "both"
10
+ }
11
+
12
+ export interface VaultSearchHits {
13
+ vault: MemoryScope
14
+ hits: CatalogHit[]
15
+ warnings: string[]
16
+ }
17
+
18
+ export interface VaultSearchFailure {
19
+ vault: MemoryScope
20
+ problems: string[]
21
+ }
22
+
23
+ export interface SemanticSummary {
24
+ mode: "fused" | "text-only"
25
+ problems: string[]
26
+ }
27
+
28
+ export interface SearchedMemory {
29
+ vaults: (VaultSearchHits | VaultSearchFailure)[]
30
+ projectMissing: boolean
31
+ semantic: SemanticSummary
32
+ }
33
+
34
+ export interface VaultSemantic {
35
+ port: SemanticPort | null
36
+ query: QueryVector | null
37
+ }
38
+
39
+ export type SearchMemoryResult = Succeeded<SearchedMemory> | MemoryResolutionRefusal
@@ -0,0 +1,7 @@
1
+ export const EMBED_BATCH_SIZE = 32
2
+
3
+ export const QUERY_KEY = "query"
4
+
5
+ export const QUERY_NOT_EMBEDDED = "Semantic search is off: the query could not be embedded, so results use words only"
6
+
7
+ export const OTHER_PROVIDER = "The embedder produced vectors for another provider; they were not stored"
@@ -0,0 +1,5 @@
1
+ export * from "./constants.ts"
2
+ export * from "./prepare.ts"
3
+ export * from "./rank.ts"
4
+ export * from "./refresh-vectors.ts"
5
+ export * from "./types.ts"
@@ -0,0 +1,30 @@
1
+ import type { MemoryOperationContext } from "#src/usecases/operation-context"
2
+ import type { ResolvedMemory } from "#src/usecases/resolve-memory"
3
+ import type { SemanticPort } from "#src/usecases/semantic-port"
4
+ import { QUERY_KEY, QUERY_NOT_EMBEDDED } from "./constants.ts"
5
+ import type { SemanticSearch } from "./types.ts"
6
+
7
+ export async function semanticPortOf(
8
+ context: MemoryOperationContext,
9
+ memory: ResolvedMemory,
10
+ ): Promise<SemanticPort | null> {
11
+ if (!context.semantic) return null
12
+ return context.semantic(memory.config.embeddings)
13
+ }
14
+
15
+ export async function prepareSemanticSearch(
16
+ port: SemanticPort | null,
17
+ text: string,
18
+ context: MemoryOperationContext,
19
+ ): Promise<SemanticSearch> {
20
+ if (!port) return { query: null, problems: [] }
21
+ if (!port.available) return { query: null, problems: [`Semantic search is off: ${port.reason}`] }
22
+ const embedded = await port.embed(
23
+ { purpose: "query", inputs: [{ key: QUERY_KEY, text }] },
24
+ { signal: context.signal },
25
+ )
26
+ if (!embedded.succeeded) return { query: null, problems: [QUERY_NOT_EMBEDDED] }
27
+ const [item] = embedded.output.items
28
+ if (!item) return { query: null, problems: [QUERY_NOT_EMBEDDED] }
29
+ return { query: { fingerprint: embedded.output.fingerprint, vector: [...item.vector] }, problems: [] }
30
+ }
@@ -0,0 +1,83 @@
1
+ import {
2
+ type CatalogEntry,
3
+ type CatalogHit,
4
+ cosine,
5
+ fuseRankings,
6
+ type MemoryConfig,
7
+ MINIMUM_SIMILARITY,
8
+ readIndexInventory,
9
+ readVectorCache,
10
+ type ScoredPath,
11
+ type SearchIndex,
12
+ semanticRanking,
13
+ type VectorChunk,
14
+ } from "#src/services"
15
+ import type { QueryVector, SemanticRanked } from "./types.ts"
16
+
17
+ export function rankSemantically(
18
+ index: SearchIndex,
19
+ query: QueryVector,
20
+ provider: MemoryConfig["embeddings"]["provider"],
21
+ ): SemanticRanked {
22
+ const inventory = readIndexInventory(index)
23
+ const cache = readVectorCache(index)
24
+ if (!inventory.succeeded) return { paths: [], hits: [], problems: inventory.problems }
25
+ if (!cache.succeeded) return { paths: [], hits: [], problems: cache.problems }
26
+ if (cache.output.generation?.fingerprint !== query.fingerprint) return { paths: [], hits: [], problems: [] }
27
+ const similarity = similarityByContent(query, cache.output.chunks)
28
+ const scored: ScoredPath[] = []
29
+ const hits = new Map<string, CatalogHit>()
30
+ for (const entry of inventory.output.entries) {
31
+ const hit = hitOf(entry, similarity)
32
+ if (!hit) continue
33
+ scored.push({ path: entry.path, similarity: hit.score })
34
+ hits.set(entry.path, hit)
35
+ }
36
+ const paths = semanticRanking(scored, MINIMUM_SIMILARITY[provider])
37
+ return { paths, hits: paths.flatMap((path) => listed(hits.get(path))), problems: [] }
38
+ }
39
+
40
+ function similarityByContent(query: QueryVector, chunks: VectorChunk[]): Map<string, number> {
41
+ const similarity = new Map<string, number>()
42
+ for (const chunk of chunks) {
43
+ const score = cosine(query.vector, chunk.vector)
44
+ const best = similarity.get(chunk.contentFingerprint)
45
+ if (typeof best !== "number" || score > best) similarity.set(chunk.contentFingerprint, score)
46
+ }
47
+ return similarity
48
+ }
49
+
50
+ function hitOf(entry: CatalogEntry, similarity: Map<string, number>): CatalogHit | null {
51
+ const { note } = entry
52
+ if (!note || note.archived || !entry.contentFingerprint) return null
53
+ const score = similarity.get(entry.contentFingerprint)
54
+ if (typeof score !== "number") return null
55
+ return {
56
+ path: entry.path,
57
+ id: note.id,
58
+ statement: note.statement,
59
+ type: note.type,
60
+ dontForget: note.dontForget,
61
+ needsFixing: entry.needsFixing,
62
+ score,
63
+ }
64
+ }
65
+
66
+ function listed(hit: CatalogHit | undefined): CatalogHit[] {
67
+ if (!hit) return []
68
+ return [hit]
69
+ }
70
+
71
+ export function fuseSearchHits(text: CatalogHit[], semantic: SemanticRanked): CatalogHit[] {
72
+ const byPath = new Map<string, CatalogHit>()
73
+ for (const hit of [...semantic.hits, ...text]) byPath.set(hit.path, hit)
74
+ const fused = fuseRankings(
75
+ text.map((hit) => hit.path),
76
+ semantic.paths,
77
+ )
78
+ return fused.flatMap((item) => {
79
+ const hit = byPath.get(item.path)
80
+ if (!hit) return []
81
+ return [{ ...hit, score: item.score }]
82
+ })
83
+ }