pi-obsidian-memory 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (572) hide show
  1. package/README.md +173 -7
  2. package/package.json +45 -7
  3. package/skills/obsidian-memory/SKILL.md +101 -0
  4. package/src/domain/capture/constants.ts +5 -0
  5. package/src/domain/capture/index.ts +6 -0
  6. package/src/domain/capture/input-problems.ts +9 -0
  7. package/src/domain/capture/schemas.ts +92 -0
  8. package/src/domain/capture/tally.ts +26 -0
  9. package/src/domain/capture/types.ts +49 -0
  10. package/src/domain/capture/validate.ts +75 -0
  11. package/src/domain/command-flags/constants.ts +141 -0
  12. package/src/domain/command-flags/index.ts +1 -0
  13. package/src/domain/config/change.ts +105 -0
  14. package/src/domain/config/constants.ts +25 -0
  15. package/src/domain/config/diagnostics.ts +35 -0
  16. package/src/domain/config/disclosures.ts +8 -0
  17. package/src/domain/config/fields.ts +7 -0
  18. package/src/domain/config/index.ts +11 -0
  19. package/src/domain/config/inspection.ts +43 -0
  20. package/src/domain/config/invariants.ts +68 -0
  21. package/src/domain/config/legacy-capture.ts +17 -0
  22. package/src/domain/config/observations.ts +109 -0
  23. package/src/domain/config/parse.ts +25 -0
  24. package/src/domain/config/paths.ts +61 -0
  25. package/src/domain/config/registration.ts +34 -0
  26. package/src/domain/config/repair.ts +36 -0
  27. package/src/domain/config/resources.ts +65 -0
  28. package/src/domain/config/rules.ts +49 -0
  29. package/src/domain/config/schemas.ts +155 -0
  30. package/src/domain/config/settings.ts +23 -0
  31. package/src/domain/config/types.ts +239 -0
  32. package/src/domain/decision-model/constants.ts +7 -0
  33. package/src/domain/decision-model/cutoffs.ts +8 -0
  34. package/src/domain/decision-model/endpoint.ts +11 -0
  35. package/src/domain/decision-model/failure-detail.ts +8 -0
  36. package/src/domain/decision-model/index.ts +6 -0
  37. package/src/domain/decision-model/rank.ts +36 -0
  38. package/src/domain/decision-model/types.ts +77 -0
  39. package/src/domain/embeddings/constants.ts +55 -0
  40. package/src/domain/embeddings/identity.ts +30 -0
  41. package/src/domain/embeddings/index.ts +5 -0
  42. package/src/domain/embeddings/schemas.ts +25 -0
  43. package/src/domain/embeddings/types.ts +52 -0
  44. package/src/domain/embeddings/vectors.ts +53 -0
  45. package/src/domain/folder-index/constants.ts +9 -0
  46. package/src/domain/folder-index/display.ts +22 -0
  47. package/src/domain/folder-index/index.ts +5 -0
  48. package/src/domain/folder-index/listing.ts +58 -0
  49. package/src/domain/folder-index/render.ts +114 -0
  50. package/src/domain/folder-index/types.ts +41 -0
  51. package/src/domain/index.ts +22 -0
  52. package/src/domain/lifecycle/index.ts +2 -0
  53. package/src/domain/lifecycle/lifecycle.ts +39 -0
  54. package/src/domain/lifecycle/types.ts +17 -0
  55. package/src/domain/loaded-memory/budget.ts +14 -0
  56. package/src/domain/loaded-memory/constants.ts +9 -0
  57. package/src/domain/loaded-memory/index.ts +4 -0
  58. package/src/domain/loaded-memory/render.ts +30 -0
  59. package/src/domain/loaded-memory/types.ts +19 -0
  60. package/src/domain/memory/draft.ts +12 -0
  61. package/src/domain/memory/index.ts +4 -0
  62. package/src/domain/memory/schemas.ts +15 -0
  63. package/src/domain/memory/target.ts +27 -0
  64. package/src/domain/memory/types.ts +20 -0
  65. package/src/domain/memory-agent/index.ts +5 -0
  66. package/src/domain/memory-agent/input-problems.ts +9 -0
  67. package/src/domain/memory-agent/refusal.ts +6 -0
  68. package/src/domain/memory-agent/schemas.ts +112 -0
  69. package/src/domain/memory-agent/types.ts +25 -0
  70. package/src/domain/memory-agent/validate.ts +67 -0
  71. package/src/domain/names/constants.ts +32 -0
  72. package/src/domain/names/index.ts +2 -0
  73. package/src/domain/names/names.ts +83 -0
  74. package/src/domain/note/check.ts +68 -0
  75. package/src/domain/note/constants.ts +15 -0
  76. package/src/domain/note/frontmatter-fields.ts +175 -0
  77. package/src/domain/note/frontmatter.ts +138 -0
  78. package/src/domain/note/index.ts +9 -0
  79. package/src/domain/note/parse.ts +41 -0
  80. package/src/domain/note/render.ts +27 -0
  81. package/src/domain/note/schema-errors.ts +41 -0
  82. package/src/domain/note/schemas.ts +38 -0
  83. package/src/domain/note/types.ts +53 -0
  84. package/src/domain/note/validate.ts +19 -0
  85. package/src/domain/path-platform/index.ts +2 -0
  86. package/src/domain/path-platform/path-module.ts +11 -0
  87. package/src/domain/path-platform/types.ts +1 -0
  88. package/src/domain/search-catalog/constants.ts +1 -0
  89. package/src/domain/search-catalog/coverage.ts +35 -0
  90. package/src/domain/search-catalog/dont-forget.ts +10 -0
  91. package/src/domain/search-catalog/fingerprint.ts +9 -0
  92. package/src/domain/search-catalog/index.ts +10 -0
  93. package/src/domain/search-catalog/inspection.ts +47 -0
  94. package/src/domain/search-catalog/plan.ts +68 -0
  95. package/src/domain/search-catalog/ranking.ts +27 -0
  96. package/src/domain/search-catalog/schemas.ts +49 -0
  97. package/src/domain/search-catalog/types.ts +103 -0
  98. package/src/domain/search-catalog/vector-refresh.ts +22 -0
  99. package/src/domain/shell-edit/command-segments.ts +28 -0
  100. package/src/domain/shell-edit/command-words.ts +22 -0
  101. package/src/domain/shell-edit/constants.ts +125 -0
  102. package/src/domain/shell-edit/executed-files.ts +154 -0
  103. package/src/domain/shell-edit/index.ts +6 -0
  104. package/src/domain/shell-edit/powershell-files.ts +38 -0
  105. package/src/domain/shell-edit/rules.ts +19 -0
  106. package/src/domain/shell-edit/types.ts +75 -0
  107. package/src/domain/tool-flags/constants.ts +178 -0
  108. package/src/domain/tool-flags/index.ts +2 -0
  109. package/src/domain/tool-flags/types.ts +7 -0
  110. package/src/domain/validation/constants.ts +1 -0
  111. package/src/domain/validation/describe.ts +137 -0
  112. package/src/domain/validation/index.ts +3 -0
  113. package/src/domain/validation/types.ts +3 -0
  114. package/src/domain/vault-access/absolute-candidate.ts +81 -0
  115. package/src/domain/vault-access/argument-tokens.ts +22 -0
  116. package/src/domain/vault-access/command-mentions-vault.ts +115 -0
  117. package/src/domain/vault-access/constants.ts +54 -0
  118. package/src/domain/vault-access/index.ts +7 -0
  119. package/src/domain/vault-access/types.ts +18 -0
  120. package/src/domain/vault-access/vault-access-refusal.ts +36 -0
  121. package/src/domain/vault-access/vault-location.ts +22 -0
  122. package/src/domain/vault-assets/index.ts +2 -0
  123. package/src/domain/vault-assets/render.ts +51 -0
  124. package/src/domain/vault-assets/types.ts +36 -0
  125. package/src/domain/vault-catalog/analyze.ts +37 -0
  126. package/src/domain/vault-catalog/classify.ts +37 -0
  127. package/src/domain/vault-catalog/dont-forget.ts +6 -0
  128. package/src/domain/vault-catalog/export-entries.ts +10 -0
  129. package/src/domain/vault-catalog/index.ts +5 -0
  130. package/src/domain/vault-catalog/types.ts +114 -0
  131. package/src/domain/vault-diagnosis/diagnose.ts +79 -0
  132. package/src/domain/vault-diagnosis/index.ts +2 -0
  133. package/src/domain/vault-diagnosis/types.ts +31 -0
  134. package/src/domain/vault-path/constants.ts +13 -0
  135. package/src/domain/vault-path/index.ts +2 -0
  136. package/src/domain/vault-path/vault-path.ts +65 -0
  137. package/src/pi/capture/cadence.ts +49 -0
  138. package/src/pi/capture/completion.ts +26 -0
  139. package/src/pi/capture/constants.ts +5 -0
  140. package/src/pi/capture/handlers.ts +30 -0
  141. package/src/pi/capture/index.ts +8 -0
  142. package/src/pi/capture/runtime.ts +83 -0
  143. package/src/pi/capture/schemas.ts +8 -0
  144. package/src/pi/capture/tool-calls.ts +6 -0
  145. package/src/pi/capture/transcript.ts +55 -0
  146. package/src/pi/capture/types.ts +46 -0
  147. package/src/pi/change-report/constants.ts +15 -0
  148. package/src/pi/change-report/index.ts +3 -0
  149. package/src/pi/change-report/report.ts +54 -0
  150. package/src/pi/change-report/types.ts +8 -0
  151. package/src/pi/context/constants.ts +5 -0
  152. package/src/pi/context/index.ts +3 -0
  153. package/src/pi/context/status.ts +15 -0
  154. package/src/pi/context/types.ts +98 -0
  155. package/src/pi/extension.ts +100 -0
  156. package/src/pi/index.ts +26 -0
  157. package/src/pi/memory-add/constants.ts +13 -0
  158. package/src/pi/memory-add/index.ts +5 -0
  159. package/src/pi/memory-add/memory-add.ts +31 -0
  160. package/src/pi/memory-add/respond.ts +55 -0
  161. package/src/pi/memory-add/schemas.ts +29 -0
  162. package/src/pi/memory-add/types.ts +15 -0
  163. package/src/pi/memory-archive/constants.ts +8 -0
  164. package/src/pi/memory-archive/index.ts +4 -0
  165. package/src/pi/memory-archive/memory-archive.ts +29 -0
  166. package/src/pi/memory-archive/schemas.ts +15 -0
  167. package/src/pi/memory-archive/types.ts +8 -0
  168. package/src/pi/memory-block/block.ts +75 -0
  169. package/src/pi/memory-block/constants.ts +24 -0
  170. package/src/pi/memory-block/index.ts +4 -0
  171. package/src/pi/memory-block/render.ts +54 -0
  172. package/src/pi/memory-block/types.ts +24 -0
  173. package/src/pi/memory-doctor/constants.ts +43 -0
  174. package/src/pi/memory-doctor/index.ts +4 -0
  175. package/src/pi/memory-doctor/memory-doctor.ts +135 -0
  176. package/src/pi/memory-doctor/report.ts +101 -0
  177. package/src/pi/memory-doctor/types.ts +13 -0
  178. package/src/pi/memory-export/constants.ts +15 -0
  179. package/src/pi/memory-export/index.ts +4 -0
  180. package/src/pi/memory-export/memory-export.ts +57 -0
  181. package/src/pi/memory-export/name.ts +9 -0
  182. package/src/pi/memory-export/types.ts +4 -0
  183. package/src/pi/memory-get/constants.ts +12 -0
  184. package/src/pi/memory-get/index.ts +5 -0
  185. package/src/pi/memory-get/memory-get.ts +23 -0
  186. package/src/pi/memory-get/respond.ts +38 -0
  187. package/src/pi/memory-get/schemas.ts +13 -0
  188. package/src/pi/memory-get/types.ts +10 -0
  189. package/src/pi/memory-init/constants.ts +17 -0
  190. package/src/pi/memory-init/index.ts +2 -0
  191. package/src/pi/memory-init/memory-init.ts +63 -0
  192. package/src/pi/memory-search/constants.ts +16 -0
  193. package/src/pi/memory-search/index.ts +5 -0
  194. package/src/pi/memory-search/memory-search.ts +22 -0
  195. package/src/pi/memory-search/respond.ts +62 -0
  196. package/src/pi/memory-search/schemas.ts +11 -0
  197. package/src/pi/memory-search/types.ts +10 -0
  198. package/src/pi/memory-session/constants.ts +7 -0
  199. package/src/pi/memory-session/index.ts +4 -0
  200. package/src/pi/memory-session/keeper.ts +101 -0
  201. package/src/pi/memory-session/respond.ts +6 -0
  202. package/src/pi/memory-session/types.ts +23 -0
  203. package/src/pi/memory-settings/constants.ts +69 -0
  204. package/src/pi/memory-settings/edits.ts +46 -0
  205. package/src/pi/memory-settings/index.ts +9 -0
  206. package/src/pi/memory-settings/lines.ts +119 -0
  207. package/src/pi/memory-settings/models.ts +81 -0
  208. package/src/pi/memory-settings/projects.ts +46 -0
  209. package/src/pi/memory-settings/providers.ts +77 -0
  210. package/src/pi/memory-settings/save.ts +16 -0
  211. package/src/pi/memory-settings/screen.ts +27 -0
  212. package/src/pi/memory-settings/types.ts +87 -0
  213. package/src/pi/memory-setup/constants.ts +33 -0
  214. package/src/pi/memory-setup/disclosure.ts +22 -0
  215. package/src/pi/memory-setup/index.ts +4 -0
  216. package/src/pi/memory-setup/memory-setup.ts +153 -0
  217. package/src/pi/memory-setup/types.ts +6 -0
  218. package/src/pi/memory-succeed/constants.ts +10 -0
  219. package/src/pi/memory-succeed/index.ts +4 -0
  220. package/src/pi/memory-succeed/memory-succeed.ts +34 -0
  221. package/src/pi/memory-succeed/schemas.ts +30 -0
  222. package/src/pi/memory-succeed/types.ts +8 -0
  223. package/src/pi/memory-update/constants.ts +8 -0
  224. package/src/pi/memory-update/index.ts +4 -0
  225. package/src/pi/memory-update/memory-update.ts +29 -0
  226. package/src/pi/memory-update/schemas.ts +24 -0
  227. package/src/pi/memory-update/types.ts +8 -0
  228. package/src/pi/paths/constants.ts +7 -0
  229. package/src/pi/paths/index.ts +2 -0
  230. package/src/pi/paths/paths.ts +15 -0
  231. package/src/pi/paths/platform.ts +7 -0
  232. package/src/pi/registrar.ts +25 -0
  233. package/src/pi/registration-report/constants.ts +13 -0
  234. package/src/pi/registration-report/index.ts +2 -0
  235. package/src/pi/registration-report/report.ts +26 -0
  236. package/src/pi/relevant-memory/constants.ts +3 -0
  237. package/src/pi/relevant-memory/index.ts +4 -0
  238. package/src/pi/relevant-memory/prompt.ts +23 -0
  239. package/src/pi/relevant-memory/runtime.ts +88 -0
  240. package/src/pi/relevant-memory/types.ts +14 -0
  241. package/src/pi/semantic/constants.ts +3 -0
  242. package/src/pi/semantic/index.ts +2 -0
  243. package/src/pi/semantic/runtime.ts +59 -0
  244. package/src/pi/session-start/constants.ts +7 -0
  245. package/src/pi/session-start/index.ts +3 -0
  246. package/src/pi/session-start/session-start.ts +48 -0
  247. package/src/pi/session-start/types.ts +5 -0
  248. package/src/pi/shell-edit-guard/guard.ts +41 -0
  249. package/src/pi/shell-edit-guard/index.ts +3 -0
  250. package/src/pi/shell-edit-guard/prompt.ts +30 -0
  251. package/src/pi/shell-edit-guard/types.ts +13 -0
  252. package/src/pi/types.ts +44 -0
  253. package/src/pi/vault-guard/constants.ts +1 -0
  254. package/src/pi/vault-guard/index.ts +4 -0
  255. package/src/pi/vault-guard/request.ts +39 -0
  256. package/src/pi/vault-guard/types.ts +5 -0
  257. package/src/pi/vault-guard/vault-guard.ts +21 -0
  258. package/src/services/capture-cadence/domain-rules.ts +8 -0
  259. package/src/services/capture-cadence/index.ts +1 -0
  260. package/src/services/clock/clock.ts +7 -0
  261. package/src/services/clock/index.ts +1 -0
  262. package/src/services/config/canonicalize.ts +163 -0
  263. package/src/services/config/constants.ts +1 -0
  264. package/src/services/config/fully-qualified-path.ts +14 -0
  265. package/src/services/config/index.ts +12 -0
  266. package/src/services/config/path-identity.ts +65 -0
  267. package/src/services/config/publication.ts +75 -0
  268. package/src/services/config/read.ts +47 -0
  269. package/src/services/config/registration.ts +26 -0
  270. package/src/services/config/resolve-input.ts +27 -0
  271. package/src/services/config/snapshot.ts +26 -0
  272. package/src/services/config/target.ts +2 -0
  273. package/src/services/config/types.ts +97 -0
  274. package/src/services/config/vault-access.ts +2 -0
  275. package/src/services/config/volume-namespace.ts +5 -0
  276. package/src/services/config/write.ts +63 -0
  277. package/src/services/decision-model/constants.ts +16 -0
  278. package/src/services/decision-model/decide.ts +42 -0
  279. package/src/services/decision-model/diagnostics.ts +6 -0
  280. package/src/services/decision-model/endpoint.ts +1 -0
  281. package/src/services/decision-model/failure-detail.ts +1 -0
  282. package/src/services/decision-model/index.ts +7 -0
  283. package/src/services/decision-model/interruption.ts +29 -0
  284. package/src/services/decision-model/jev.ts +61 -0
  285. package/src/services/decision-model/laya-batch.ts +64 -0
  286. package/src/services/decision-model/laya-http-failure.ts +41 -0
  287. package/src/services/decision-model/laya-response.ts +95 -0
  288. package/src/services/decision-model/laya.ts +35 -0
  289. package/src/services/decision-model/preflight.ts +24 -0
  290. package/src/services/decision-model/prompts.ts +36 -0
  291. package/src/services/decision-model/schemas.ts +43 -0
  292. package/src/services/decision-model/score-candidates.ts +41 -0
  293. package/src/services/decision-model/types.ts +182 -0
  294. package/src/services/embeddings/asset-download.ts +45 -0
  295. package/src/services/embeddings/asset-fetch.ts +39 -0
  296. package/src/services/embeddings/asset-inspection.ts +36 -0
  297. package/src/services/embeddings/batch.ts +32 -0
  298. package/src/services/embeddings/chunks.ts +80 -0
  299. package/src/services/embeddings/configuration.ts +8 -0
  300. package/src/services/embeddings/constants.ts +24 -0
  301. package/src/services/embeddings/errors.ts +11 -0
  302. package/src/services/embeddings/google.ts +90 -0
  303. package/src/services/embeddings/http.ts +64 -0
  304. package/src/services/embeddings/index.ts +17 -0
  305. package/src/services/embeddings/inference.ts +35 -0
  306. package/src/services/embeddings/local.ts +138 -0
  307. package/src/services/embeddings/model-asset.ts +68 -0
  308. package/src/services/embeddings/model-cache.ts +30 -0
  309. package/src/services/embeddings/openai.ts +64 -0
  310. package/src/services/embeddings/operation.ts +31 -0
  311. package/src/services/embeddings/responses.ts +41 -0
  312. package/src/services/embeddings/runtime.ts +13 -0
  313. package/src/services/embeddings/schemas.ts +53 -0
  314. package/src/services/embeddings/types.ts +116 -0
  315. package/src/services/id/id.ts +5 -0
  316. package/src/services/id/index.ts +1 -0
  317. package/src/services/index.ts +11 -0
  318. package/src/services/llm/capture.ts +19 -0
  319. package/src/services/llm/check-chat-models.ts +38 -0
  320. package/src/services/llm/complete.ts +57 -0
  321. package/src/services/llm/constants.ts +32 -0
  322. package/src/services/llm/domain-rules.ts +2 -0
  323. package/src/services/llm/index.ts +6 -0
  324. package/src/services/llm/lifetime.ts +16 -0
  325. package/src/services/llm/retrieve.ts +19 -0
  326. package/src/services/llm/schemas.ts +9 -0
  327. package/src/services/llm/types.ts +94 -0
  328. package/src/services/search-index/catalog-query.ts +34 -0
  329. package/src/services/search-index/catalog-statements.ts +33 -0
  330. package/src/services/search-index/catalog.ts +19 -0
  331. package/src/services/search-index/cleanup.ts +13 -0
  332. package/src/services/search-index/close.ts +5 -0
  333. package/src/services/search-index/constants.ts +102 -0
  334. package/src/services/search-index/dont-forget.ts +1 -0
  335. package/src/services/search-index/fingerprint.ts +17 -0
  336. package/src/services/search-index/folder-index-statements.ts +17 -0
  337. package/src/services/search-index/folder-index-storage.ts +54 -0
  338. package/src/services/search-index/folder-indexes.ts +13 -0
  339. package/src/services/search-index/index.ts +14 -0
  340. package/src/services/search-index/inspection.ts +1 -0
  341. package/src/services/search-index/inventory.ts +67 -0
  342. package/src/services/search-index/legacy.ts +64 -0
  343. package/src/services/search-index/location.ts +12 -0
  344. package/src/services/search-index/open.ts +46 -0
  345. package/src/services/search-index/query.ts +39 -0
  346. package/src/services/search-index/ranking.ts +12 -0
  347. package/src/services/search-index/reconcile.ts +93 -0
  348. package/src/services/search-index/recovery.ts +56 -0
  349. package/src/services/search-index/refusals.ts +21 -0
  350. package/src/services/search-index/schema.ts +42 -0
  351. package/src/services/search-index/schemas.ts +181 -0
  352. package/src/services/search-index/search.ts +5 -0
  353. package/src/services/search-index/statements.ts +18 -0
  354. package/src/services/search-index/storage.ts +207 -0
  355. package/src/services/search-index/types.ts +113 -0
  356. package/src/services/search-index/vector-statements.ts +18 -0
  357. package/src/services/search-index/vector-storage.ts +169 -0
  358. package/src/services/search-index/vectors.ts +18 -0
  359. package/src/services/search-index/write.ts +9 -0
  360. package/src/services/shell-edit/ask.ts +53 -0
  361. package/src/services/shell-edit/domain-rules.ts +2 -0
  362. package/src/services/shell-edit/index.ts +4 -0
  363. package/src/services/shell-edit/schemas.ts +23 -0
  364. package/src/services/shell-edit/types.ts +61 -0
  365. package/src/services/shell-scripts/constants.ts +1 -0
  366. package/src/services/shell-scripts/files.ts +16 -0
  367. package/src/services/shell-scripts/index.ts +5 -0
  368. package/src/services/shell-scripts/package-scripts.ts +74 -0
  369. package/src/services/shell-scripts/schemas.ts +3 -0
  370. package/src/services/shell-scripts/scripts.ts +27 -0
  371. package/src/services/shell-scripts/types.ts +11 -0
  372. package/src/services/vault/archive.ts +31 -0
  373. package/src/services/vault/bootstrap/ensure.ts +50 -0
  374. package/src/services/vault/bootstrap/index.ts +2 -0
  375. package/src/services/vault/bootstrap/paths.ts +57 -0
  376. package/src/services/vault/bootstrap/types.ts +17 -0
  377. package/src/services/vault/bootstrap/write.ts +47 -0
  378. package/src/services/vault/catalog/bytes.ts +51 -0
  379. package/src/services/vault/catalog/dont-forget.ts +1 -0
  380. package/src/services/vault/catalog/enumerate.ts +69 -0
  381. package/src/services/vault/catalog/export.ts +21 -0
  382. package/src/services/vault/catalog/failures.ts +16 -0
  383. package/src/services/vault/catalog/index.ts +10 -0
  384. package/src/services/vault/catalog/inspect.ts +41 -0
  385. package/src/services/vault/catalog/observe.ts +35 -0
  386. package/src/services/vault/catalog/resolve.ts +94 -0
  387. package/src/services/vault/catalog/stat.ts +23 -0
  388. package/src/services/vault/catalog/types.ts +69 -0
  389. package/src/services/vault/catalog/visit.ts +58 -0
  390. package/src/services/vault/complete-blank.ts +66 -0
  391. package/src/services/vault/constants.ts +3 -0
  392. package/src/services/vault/context/index.ts +1 -0
  393. package/src/services/vault/context/types.ts +10 -0
  394. package/src/services/vault/create.ts +19 -0
  395. package/src/services/vault/display.ts +6 -0
  396. package/src/services/vault/domain-rules.ts +10 -0
  397. package/src/services/vault/draft.ts +2 -0
  398. package/src/services/vault/filesystem/failures.ts +53 -0
  399. package/src/services/vault/filesystem/hash.ts +5 -0
  400. package/src/services/vault/filesystem/index.ts +5 -0
  401. package/src/services/vault/filesystem/read.ts +61 -0
  402. package/src/services/vault/filesystem/types.ts +36 -0
  403. package/src/services/vault/filesystem/write.ts +80 -0
  404. package/src/services/vault/find.ts +27 -0
  405. package/src/services/vault/folder-contents.ts +31 -0
  406. package/src/services/vault/folder-index/index.ts +2 -0
  407. package/src/services/vault/folder-index/read.ts +87 -0
  408. package/src/services/vault/folder-index/types.ts +19 -0
  409. package/src/services/vault/folder-listing.ts +1 -0
  410. package/src/services/vault/index.ts +21 -0
  411. package/src/services/vault/inspect-folder.ts +13 -0
  412. package/src/services/vault/list.ts +121 -0
  413. package/src/services/vault/memory-folder.ts +24 -0
  414. package/src/services/vault/paths.ts +11 -0
  415. package/src/services/vault/publish.ts +52 -0
  416. package/src/services/vault/read.ts +46 -0
  417. package/src/services/vault/refresh-folders.ts +197 -0
  418. package/src/services/vault/refresh-plan.ts +79 -0
  419. package/src/services/vault/refresh.ts +8 -0
  420. package/src/services/vault/refusals.ts +23 -0
  421. package/src/services/vault/relocate.ts +131 -0
  422. package/src/services/vault/relocation-checks.ts +89 -0
  423. package/src/services/vault/resolve-stored-file.ts +43 -0
  424. package/src/services/vault/resolve.ts +109 -0
  425. package/src/services/vault/succeed.ts +45 -0
  426. package/src/services/vault/types.ts +199 -0
  427. package/src/services/vault/update-file.ts +58 -0
  428. package/src/services/vault/update.ts +22 -0
  429. package/src/services/vault/write-new-file.ts +37 -0
  430. package/src/shared/index.ts +1 -0
  431. package/src/shared/result/index.ts +1 -0
  432. package/src/shared/result/types.ts +17 -0
  433. package/src/usecases/add-memory/add-memory.ts +83 -0
  434. package/src/usecases/add-memory/index.ts +4 -0
  435. package/src/usecases/add-memory/maintenance.ts +23 -0
  436. package/src/usecases/add-memory/schemas.ts +12 -0
  437. package/src/usecases/add-memory/types.ts +47 -0
  438. package/src/usecases/archive-memory/archive-memory.ts +27 -0
  439. package/src/usecases/archive-memory/index.ts +3 -0
  440. package/src/usecases/archive-memory/schemas.ts +11 -0
  441. package/src/usecases/archive-memory/types.ts +17 -0
  442. package/src/usecases/capture-memory/apply.ts +73 -0
  443. package/src/usecases/capture-memory/capture-memory.ts +117 -0
  444. package/src/usecases/capture-memory/constants.ts +15 -0
  445. package/src/usecases/capture-memory/index.ts +5 -0
  446. package/src/usecases/capture-memory/observe.ts +122 -0
  447. package/src/usecases/capture-memory/settings.ts +20 -0
  448. package/src/usecases/capture-memory/types.ts +103 -0
  449. package/src/usecases/check-shell-edit/check-shell-edit.ts +28 -0
  450. package/src/usecases/check-shell-edit/index.ts +2 -0
  451. package/src/usecases/check-shell-edit/types.ts +30 -0
  452. package/src/usecases/check-vault-access/check-vault-access.ts +23 -0
  453. package/src/usecases/check-vault-access/constants.ts +7 -0
  454. package/src/usecases/check-vault-access/index.ts +4 -0
  455. package/src/usecases/check-vault-access/raw-device.ts +10 -0
  456. package/src/usecases/check-vault-access/targets.ts +49 -0
  457. package/src/usecases/check-vault-access/types.ts +33 -0
  458. package/src/usecases/complete-blank-memory/complete-blank-memory.ts +48 -0
  459. package/src/usecases/complete-blank-memory/constants.ts +3 -0
  460. package/src/usecases/complete-blank-memory/index.ts +4 -0
  461. package/src/usecases/complete-blank-memory/schemas.ts +14 -0
  462. package/src/usecases/complete-blank-memory/types.ts +28 -0
  463. package/src/usecases/diagnose-memory/constants.ts +3 -0
  464. package/src/usecases/diagnose-memory/decision.ts +36 -0
  465. package/src/usecases/diagnose-memory/diagnose-memory.ts +52 -0
  466. package/src/usecases/diagnose-memory/embeddings.ts +39 -0
  467. package/src/usecases/diagnose-memory/index.ts +5 -0
  468. package/src/usecases/diagnose-memory/types.ts +86 -0
  469. package/src/usecases/diagnose-memory/vault.ts +33 -0
  470. package/src/usecases/export-memory/collect.ts +20 -0
  471. package/src/usecases/export-memory/constants.ts +3 -0
  472. package/src/usecases/export-memory/export-memory.ts +84 -0
  473. package/src/usecases/export-memory/index.ts +3 -0
  474. package/src/usecases/export-memory/types.ts +28 -0
  475. package/src/usecases/get-memory/get-memory.ts +97 -0
  476. package/src/usecases/get-memory/index.ts +2 -0
  477. package/src/usecases/get-memory/types.ts +25 -0
  478. package/src/usecases/index.ts +25 -0
  479. package/src/usecases/list-memory/index.ts +2 -0
  480. package/src/usecases/list-memory/leased/index.ts +2 -0
  481. package/src/usecases/list-memory/leased/read.ts +16 -0
  482. package/src/usecases/list-memory/leased/types.ts +21 -0
  483. package/src/usecases/list-memory/list-memory.ts +33 -0
  484. package/src/usecases/list-memory/types.ts +8 -0
  485. package/src/usecases/load-dont-forget/index.ts +2 -0
  486. package/src/usecases/load-dont-forget/load-dont-forget.ts +111 -0
  487. package/src/usecases/load-dont-forget/types.ts +26 -0
  488. package/src/usecases/memory-change/change.ts +42 -0
  489. package/src/usecases/memory-change/index.ts +5 -0
  490. package/src/usecases/memory-change/maintenance.ts +11 -0
  491. package/src/usecases/memory-change/partial.ts +18 -0
  492. package/src/usecases/memory-change/receipt.ts +40 -0
  493. package/src/usecases/memory-change/types.ts +44 -0
  494. package/src/usecases/operation-context/context.ts +37 -0
  495. package/src/usecases/operation-context/index.ts +2 -0
  496. package/src/usecases/operation-context/types.ts +19 -0
  497. package/src/usecases/registration/check.ts +6 -0
  498. package/src/usecases/registration/entry.ts +33 -0
  499. package/src/usecases/registration/index.ts +8 -0
  500. package/src/usecases/registration/init.ts +94 -0
  501. package/src/usecases/registration/prepare-init.ts +43 -0
  502. package/src/usecases/registration/prepare.ts +35 -0
  503. package/src/usecases/registration/propose.ts +34 -0
  504. package/src/usecases/registration/publication.ts +90 -0
  505. package/src/usecases/registration/setup.ts +41 -0
  506. package/src/usecases/registration/types.ts +107 -0
  507. package/src/usecases/relevant-memory/agent.ts +55 -0
  508. package/src/usecases/relevant-memory/constants.ts +28 -0
  509. package/src/usecases/relevant-memory/cutoffs.ts +29 -0
  510. package/src/usecases/relevant-memory/decision.ts +102 -0
  511. package/src/usecases/relevant-memory/index.ts +11 -0
  512. package/src/usecases/relevant-memory/loaded.ts +31 -0
  513. package/src/usecases/relevant-memory/refresh.ts +30 -0
  514. package/src/usecases/relevant-memory/retrieve-memory.ts +62 -0
  515. package/src/usecases/relevant-memory/schemas.ts +20 -0
  516. package/src/usecases/relevant-memory/session-memory.ts +53 -0
  517. package/src/usecases/relevant-memory/track-dont-forget.ts +13 -0
  518. package/src/usecases/relevant-memory/types.ts +106 -0
  519. package/src/usecases/resolve-memory/index.ts +2 -0
  520. package/src/usecases/resolve-memory/leased/index.ts +2 -0
  521. package/src/usecases/resolve-memory/leased/resolve.ts +109 -0
  522. package/src/usecases/resolve-memory/leased/types.ts +35 -0
  523. package/src/usecases/resolve-memory/resolve-memory.ts +23 -0
  524. package/src/usecases/resolve-memory/types.ts +7 -0
  525. package/src/usecases/search-memory/constants.ts +1 -0
  526. package/src/usecases/search-memory/index.ts +3 -0
  527. package/src/usecases/search-memory/search-memory.ts +132 -0
  528. package/src/usecases/search-memory/types.ts +39 -0
  529. package/src/usecases/semantic/constants.ts +7 -0
  530. package/src/usecases/semantic/index.ts +5 -0
  531. package/src/usecases/semantic/prepare.ts +30 -0
  532. package/src/usecases/semantic/rank.ts +83 -0
  533. package/src/usecases/semantic/refresh-vectors.ts +95 -0
  534. package/src/usecases/semantic/types.ts +17 -0
  535. package/src/usecases/semantic-port/index.ts +1 -0
  536. package/src/usecases/semantic-port/types.ts +20 -0
  537. package/src/usecases/semantic-provider/constants.ts +6 -0
  538. package/src/usecases/semantic-provider/index.ts +5 -0
  539. package/src/usecases/semantic-provider/local.ts +33 -0
  540. package/src/usecases/semantic-provider/remote.ts +10 -0
  541. package/src/usecases/semantic-provider/size.ts +10 -0
  542. package/src/usecases/semantic-provider/types.ts +19 -0
  543. package/src/usecases/session/index.ts +2 -0
  544. package/src/usecases/session/lease.ts +70 -0
  545. package/src/usecases/session/receipts.ts +46 -0
  546. package/src/usecases/session/state.ts +106 -0
  547. package/src/usecases/session/types.ts +45 -0
  548. package/src/usecases/settings/change.ts +142 -0
  549. package/src/usecases/settings/index.ts +3 -0
  550. package/src/usecases/settings/prepare.ts +24 -0
  551. package/src/usecases/settings/types.ts +32 -0
  552. package/src/usecases/succeed-memory/index.ts +3 -0
  553. package/src/usecases/succeed-memory/schemas.ts +13 -0
  554. package/src/usecases/succeed-memory/succeed-memory.ts +34 -0
  555. package/src/usecases/succeed-memory/types.ts +18 -0
  556. package/src/usecases/synchronize-memory/index.ts +2 -0
  557. package/src/usecases/synchronize-memory/leased/aliases.ts +55 -0
  558. package/src/usecases/synchronize-memory/leased/folder-states.ts +58 -0
  559. package/src/usecases/synchronize-memory/leased/index.ts +2 -0
  560. package/src/usecases/synchronize-memory/leased/inspection.ts +32 -0
  561. package/src/usecases/synchronize-memory/leased/maintenance.ts +41 -0
  562. package/src/usecases/synchronize-memory/leased/publication.ts +55 -0
  563. package/src/usecases/synchronize-memory/leased/scan.ts +37 -0
  564. package/src/usecases/synchronize-memory/leased/synchronize.ts +102 -0
  565. package/src/usecases/synchronize-memory/leased/types.ts +60 -0
  566. package/src/usecases/synchronize-memory/synchronize-memory.ts +26 -0
  567. package/src/usecases/synchronize-memory/types.ts +5 -0
  568. package/src/usecases/update-memory/index.ts +3 -0
  569. package/src/usecases/update-memory/schemas.ts +14 -0
  570. package/src/usecases/update-memory/types.ts +16 -0
  571. package/src/usecases/update-memory/update-memory.ts +31 -0
  572. package/CHANGELOG.md +0 -6
@@ -0,0 +1,36 @@
1
+ import type { CandidateScore } from "./types.ts"
2
+
3
+ function validateProbability(probability: number): void {
4
+ if (!Number.isFinite(probability) || probability < 0 || probability > 1) {
5
+ throw new RangeError("Decision probability must be finite and between 0 and 1")
6
+ }
7
+ }
8
+
9
+ function validateCutoff(cutoff: number): void {
10
+ if (!Number.isFinite(cutoff) || cutoff < 0 || cutoff > 1) {
11
+ throw new RangeError("Decision cutoff must be finite and between 0 and 1")
12
+ }
13
+ }
14
+
15
+ export function shouldRetrieveMemory(probability: number, cutoff: number): boolean {
16
+ validateProbability(probability)
17
+ validateCutoff(cutoff)
18
+ return probability > cutoff
19
+ }
20
+
21
+ function compareScores(left: CandidateScore, right: CandidateScore): number {
22
+ const probabilityOrder = right.probability - left.probability
23
+ if (probabilityOrder !== 0) return probabilityOrder
24
+
25
+ for (const field of ["vault", "id", "revision"] as const) {
26
+ if (left.identity[field] < right.identity[field]) return -1
27
+ if (left.identity[field] > right.identity[field]) return 1
28
+ }
29
+ return 0
30
+ }
31
+
32
+ export function rankCandidates(scores: readonly CandidateScore[], cutoff: number): CandidateScore[] {
33
+ validateCutoff(cutoff)
34
+ for (const score of scores) validateProbability(score.probability)
35
+ return scores.filter((score) => score.probability >= cutoff).sort(compareScores)
36
+ }
@@ -0,0 +1,77 @@
1
+ export interface CandidateIdentity {
2
+ vault: "global" | "project"
3
+ id: string
4
+ revision: string
5
+ }
6
+
7
+ export interface DecisionRequest {
8
+ message: string
9
+ project: string | null
10
+ folder: string
11
+ }
12
+
13
+ export interface CandidateContent {
14
+ statement: string
15
+ body: string
16
+ }
17
+
18
+ export interface CandidateDecisionRequest {
19
+ message: string
20
+ identity: CandidateIdentity
21
+ candidate: CandidateContent
22
+ }
23
+
24
+ export interface CandidateScore {
25
+ identity: CandidateIdentity
26
+ probability: number
27
+ }
28
+
29
+ export interface DecisionUsage {
30
+ inputTokens: number
31
+ outputTokens: number
32
+ }
33
+
34
+ export interface DecisionDiagnostics {
35
+ provider: "laya" | "typesafe"
36
+ requestedModel: string
37
+ reportedModel: string | null
38
+ usage: DecisionUsage | null
39
+ }
40
+
41
+ export interface RelevanceDecision {
42
+ probability: number
43
+ diagnostics: DecisionDiagnostics
44
+ }
45
+
46
+ export type DecisionFailureCode =
47
+ | "unsafe-endpoint"
48
+ | "invalid-settings"
49
+ | "unavailable"
50
+ | "http-error"
51
+ | "invalid-response"
52
+ | "routing-missing"
53
+ | "truncated"
54
+ | "collapsed-options"
55
+ | "aborted"
56
+
57
+ export interface DecisionFailure {
58
+ succeeded: false
59
+ code: DecisionFailureCode
60
+ diagnostics: DecisionDiagnostics
61
+ httpStatus?: number
62
+ detail?: string
63
+ }
64
+
65
+ export interface DecisionSuccess {
66
+ succeeded: true
67
+ output: RelevanceDecision
68
+ }
69
+
70
+ export type DecisionResult = DecisionSuccess | DecisionFailure
71
+
72
+ export type DecisionProvider = DecisionDiagnostics["provider"]
73
+
74
+ export interface DecisionCutoffs {
75
+ gate: number
76
+ relevance: number
77
+ }
@@ -0,0 +1,55 @@
1
+ import type { EmbeddingConfiguration, EmbeddingPolicy, MinimumSimilarities } from "./types.ts"
2
+
3
+ export const localEmbeddingConfiguration = {
4
+ provider: "local",
5
+ model: "Xenova/multilingual-e5-small",
6
+ } as const satisfies EmbeddingConfiguration
7
+
8
+ export const openAIEmbeddingConfiguration = {
9
+ provider: "openai",
10
+ model: "text-embedding-3-small",
11
+ } as const satisfies EmbeddingConfiguration
12
+
13
+ export const googleEmbeddingConfiguration = {
14
+ provider: "google",
15
+ model: "gemini-embedding-001",
16
+ } as const satisfies EmbeddingConfiguration
17
+
18
+ export const localEmbeddingPolicy = {
19
+ revision: "761b726dd34fb83930e26aab4e9ac3899aa1fa78",
20
+ dimensions: 384,
21
+ dtype: "cpu-q8-transformers-4.3.1",
22
+ pooling: "mean",
23
+ normalization: "l2",
24
+ queryPrefix: "query: ",
25
+ documentPrefix: "passage: ",
26
+ chunking: "v1-token-aware-512-special-prefix-inclusive-overlap32-mean-chunks-query-refuse",
27
+ } as const satisfies EmbeddingPolicy
28
+
29
+ export const openAIEmbeddingPolicy = {
30
+ revision: "provider-managed",
31
+ dimensions: 1536,
32
+ dtype: "float",
33
+ pooling: "provider",
34
+ normalization: "l2",
35
+ queryPrefix: "",
36
+ documentPrefix: "",
37
+ chunking: "v1-utf8-bytes4096-overlap128-mean-chunks-query-refuse",
38
+ } as const satisfies EmbeddingPolicy
39
+
40
+ export const googleEmbeddingPolicy = {
41
+ revision: "provider-managed",
42
+ dimensions: 768,
43
+ dtype: "float",
44
+ pooling: "provider",
45
+ normalization: "l2",
46
+ queryPrefix: "RETRIEVAL_QUERY",
47
+ documentPrefix: "RETRIEVAL_DOCUMENT",
48
+ chunking: "v1-utf8-bytes1024-overlap128-mean-chunks-query-refuse-autoTruncate-false",
49
+ } as const satisfies EmbeddingPolicy
50
+
51
+ export const MINIMUM_SIMILARITY = {
52
+ local: 0.8,
53
+ openai: null,
54
+ google: null,
55
+ } as const satisfies MinimumSimilarities
@@ -0,0 +1,30 @@
1
+ import { googleEmbeddingPolicy, localEmbeddingPolicy, openAIEmbeddingPolicy } from "./constants.ts"
2
+ import type { EmbeddingConfiguration, EmbeddingPolicy } from "./types.ts"
3
+
4
+ export function embeddingPolicy(configuration: EmbeddingConfiguration): EmbeddingPolicy {
5
+ switch (configuration.provider) {
6
+ case "local":
7
+ return localEmbeddingPolicy
8
+ case "openai":
9
+ return openAIEmbeddingPolicy
10
+ case "google":
11
+ return googleEmbeddingPolicy
12
+ }
13
+ }
14
+
15
+ export function embeddingFingerprint(configuration: EmbeddingConfiguration): string {
16
+ const policy = embeddingPolicy(configuration)
17
+ return JSON.stringify([
18
+ "embeddings-v1",
19
+ configuration.provider,
20
+ configuration.model,
21
+ policy.revision,
22
+ policy.dimensions,
23
+ policy.dtype,
24
+ policy.pooling,
25
+ policy.normalization,
26
+ policy.queryPrefix,
27
+ policy.documentPrefix,
28
+ policy.chunking,
29
+ ])
30
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./constants.ts"
2
+ export * from "./identity.ts"
3
+ export * from "./schemas.ts"
4
+ export * from "./types.ts"
5
+ export * from "./vectors.ts"
@@ -0,0 +1,25 @@
1
+ import Type from "typebox"
2
+
3
+ export const EmbeddingConfigurationSchema = Type.Union([
4
+ Type.Object(
5
+ {
6
+ provider: Type.Literal("local"),
7
+ model: Type.Literal("Xenova/multilingual-e5-small"),
8
+ },
9
+ { additionalProperties: false },
10
+ ),
11
+ Type.Object(
12
+ {
13
+ provider: Type.Literal("openai"),
14
+ model: Type.Literal("text-embedding-3-small"),
15
+ },
16
+ { additionalProperties: false },
17
+ ),
18
+ Type.Object(
19
+ {
20
+ provider: Type.Literal("google"),
21
+ model: Type.Literal("gemini-embedding-001"),
22
+ },
23
+ { additionalProperties: false },
24
+ ),
25
+ ])
@@ -0,0 +1,52 @@
1
+ import type { Static } from "typebox"
2
+
3
+ import type { Succeeded } from "#src/shared"
4
+ import type { EmbeddingConfigurationSchema } from "./schemas.ts"
5
+
6
+ export type EmbeddingConfiguration = Static<typeof EmbeddingConfigurationSchema>
7
+
8
+ export interface EmbeddingInput {
9
+ key: string
10
+ text: string
11
+ }
12
+
13
+ export interface EmbeddingBatchRequest {
14
+ purpose: "query" | "document"
15
+ inputs: readonly EmbeddingInput[]
16
+ }
17
+
18
+ export interface EmbeddedInput {
19
+ key: string
20
+ vector: readonly number[]
21
+ }
22
+
23
+ export interface EmbeddingBatch {
24
+ fingerprint: string
25
+ dimensions: number
26
+ items: readonly EmbeddedInput[]
27
+ }
28
+
29
+ export type EmbeddingFailureStatus = "unavailable" | "input-too-long" | "invalid-input" | "invalid-response" | "aborted"
30
+
31
+ export interface EmbeddingFailure {
32
+ succeeded: false
33
+ status: EmbeddingFailureStatus
34
+ cleanupFailed?: true
35
+ }
36
+
37
+ export type EmbeddingResult = Succeeded<EmbeddingBatch> | EmbeddingFailure
38
+
39
+ export interface EmbeddingPolicy {
40
+ revision: string
41
+ dimensions: number
42
+ dtype: string
43
+ pooling: string
44
+ normalization: "l2"
45
+ queryPrefix: string
46
+ documentPrefix: string
47
+ chunking: string
48
+ }
49
+
50
+ export type EmbeddingProvider = EmbeddingConfiguration["provider"]
51
+
52
+ export type MinimumSimilarities = Record<EmbeddingProvider, number | null>
@@ -0,0 +1,53 @@
1
+ export function normalizeVector(values: readonly number[], dimensions: number): number[] | null {
2
+ if (values.length !== dimensions || dimensions < 1 || values.some((value) => !Number.isFinite(value))) {
3
+ return null
4
+ }
5
+
6
+ const scale = values.reduce((largest, value) => Math.max(largest, Math.abs(value)), 0)
7
+ if (scale === 0) {
8
+ return null
9
+ }
10
+
11
+ const scaled = values.map((value) => value / scale)
12
+ const norm = Math.sqrt(scaled.reduce((sum, value) => sum + value * value, 0))
13
+ return scaled.map((value) => value / norm)
14
+ }
15
+
16
+ export function aggregateVectors(vectors: readonly (readonly number[])[], dimensions: number): number[] | null {
17
+ if (vectors.length === 0) {
18
+ return null
19
+ }
20
+
21
+ const sum = Array<number>(dimensions).fill(0)
22
+ for (const values of vectors) {
23
+ const vector = normalizeVector(values, dimensions)
24
+ if (!vector) {
25
+ return null
26
+ }
27
+ for (const [index, value] of vector.entries()) {
28
+ const previous = sum[index]
29
+ if (typeof previous !== "number") {
30
+ return null
31
+ }
32
+ sum[index] = previous + value / vectors.length
33
+ }
34
+ }
35
+ return normalizeVector(sum, dimensions)
36
+ }
37
+
38
+ export function cosine(left: readonly number[], right: readonly number[]): number {
39
+ if (left.length !== right.length) throw new RangeError("Vectors must have the same dimensions")
40
+
41
+ let dot = 0
42
+ let leftNorm = 0
43
+ let rightNorm = 0
44
+ for (const [index, value] of left.entries()) {
45
+ const other = right[index]
46
+ if (typeof other !== "number") throw new RangeError("Vectors must have the same dimensions")
47
+ dot += value * other
48
+ leftNorm += value * value
49
+ rightNorm += other * other
50
+ }
51
+ if (leftNorm === 0 || rightNorm === 0) throw new RangeError("Vectors must be nonzero")
52
+ return dot / Math.sqrt(leftNorm * rightNorm)
53
+ }
@@ -0,0 +1,9 @@
1
+ export const NOTE_LINE_SEPARATOR = " · "
2
+
3
+ export const PROBLEM_SEPARATOR = "; "
4
+
5
+ export const DONT_FORGET_LABEL = "don't forget"
6
+
7
+ export const INDEX_TEXT_COLLATOR = new Intl.Collator("en", { sensitivity: "base" })
8
+
9
+ export const FOLDER_INDEX_FORMAT = 1
@@ -0,0 +1,22 @@
1
+ export function displayIndexText(text: string): string {
2
+ if (/[<>[\]`]/.test(text)) {
3
+ return displayIndexName(text)
4
+ }
5
+
6
+ return text
7
+ }
8
+
9
+ export function displayIndexName(name: string): string {
10
+ if (name.length === 0) {
11
+ return "<code></code>"
12
+ }
13
+
14
+ const runs = [...name.matchAll(/`+/g)].map((match) => match[0].length)
15
+ const fence = "`".repeat(Math.max(0, ...runs) + 1)
16
+ const mixedEdgeSpaces = name.startsWith(" ") && name.endsWith(" ") && /[^ ]/.test(name)
17
+ if (name.startsWith("`") || name.endsWith("`") || mixedEdgeSpaces) {
18
+ return `${fence} ${name} ${fence}`
19
+ }
20
+
21
+ return `${fence}${name}${fence}`
22
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./constants.ts"
2
+ export * from "./display.ts"
3
+ export * from "./listing.ts"
4
+ export * from "./render.ts"
5
+ export * from "./types.ts"
@@ -0,0 +1,58 @@
1
+ import { createHash } from "node:crypto"
2
+
3
+ import type { VaultCatalogEntry, VaultEnumeration } from "#src/domain/vault-catalog"
4
+ import type { FolderListingFingerprint } from "./types.ts"
5
+
6
+ export function folderListingFingerprints(
7
+ enumeration: VaultEnumeration,
8
+ renderKey: string,
9
+ ): FolderListingFingerprint[] {
10
+ const entries = new Map(enumeration.entries.map((entry) => [entry.path, entry]))
11
+ return enumeration.completeDirectories.map((folder) => ({
12
+ folder,
13
+ fingerprint: fingerprintOf(enumeration, entries, folder, renderKey),
14
+ }))
15
+ }
16
+
17
+ function fingerprintOf(
18
+ enumeration: VaultEnumeration,
19
+ entries: Map<string, VaultCatalogEntry>,
20
+ folder: string,
21
+ renderKey: string,
22
+ ): string | null {
23
+ if (enumeration.failures.some((failure) => failure.path === folder || parentOf(failure.path) === folder)) {
24
+ return null
25
+ }
26
+
27
+ const children: string[] = []
28
+
29
+ for (const entry of enumeration.entries) {
30
+ if (parentOf(entry.path) !== folder) continue
31
+ if (entry.kind === "folder") children.push(JSON.stringify(["folder", nameOf(entry.path)]))
32
+ if (entry.kind === "note") children.push(JSON.stringify(["file", nameOf(entry.path), ...statOf(entry)]))
33
+ }
34
+
35
+ for (const alias of enumeration.aliases) {
36
+ if (parentOf(alias.path) !== folder) continue
37
+ const target = entries.get(alias.target)
38
+ if (!target || nameOf(alias.path).toLowerCase() === "index.md") return null
39
+ children.push(JSON.stringify(["alias", nameOf(alias.path), alias.target, ...statOf(target)]))
40
+ }
41
+
42
+ return createHash("sha256")
43
+ .update(JSON.stringify([renderKey, children.sort()]))
44
+ .digest("hex")
45
+ }
46
+
47
+ function parentOf(path: string): string {
48
+ return path.slice(0, Math.max(path.lastIndexOf("/"), 0))
49
+ }
50
+
51
+ function nameOf(path: string): string {
52
+ return path.slice(path.lastIndexOf("/") + 1)
53
+ }
54
+
55
+ function statOf(entry: VaultCatalogEntry): number[] {
56
+ const { size, mtimeMs, ctimeMs, device, inode } = entry.stat
57
+ return [size, mtimeMs, ctimeMs, device, inode]
58
+ }
@@ -0,0 +1,114 @@
1
+ import type { Note } from "#src/domain/note"
2
+ import { ARCHIVE_FOLDER, checkVaultPath, FOLDER_INDEX_NAME, joinVaultPath } from "#src/domain/vault-path"
3
+ import { DONT_FORGET_LABEL, INDEX_TEXT_COLLATOR, NOTE_LINE_SEPARATOR, PROBLEM_SEPARATOR } from "./constants.ts"
4
+ import { displayIndexName, displayIndexText } from "./display.ts"
5
+ import type { FolderContents, InvalidNote, Titled } from "./types.ts"
6
+
7
+ export function renderFolderIndex(folder: FolderContents): string {
8
+ const path = linkPathOf(folder)
9
+
10
+ const subjects = sortAlphabetically(folder.subjects).map((subject) => subjectLine(path, subject))
11
+ const notes = [...folder.notes].sort(byStatement).map((note) => noteLine(path, note))
12
+ const invalid = [...folder.invalid].sort(byStatement).map((note) => invalidLine(path, note))
13
+
14
+ const blocks = [
15
+ `# ${displayIndexText(titleOf(folder))}`,
16
+ ...section("Subjects", subjects),
17
+ ...section("Notes", notes),
18
+ ...section("Needs fixing", [...invalid, ...problemFolderLines(folder)]),
19
+ ...archiveSection(folder),
20
+ ]
21
+
22
+ return `${blocks.join("\n\n")}\n`
23
+ }
24
+
25
+ function titleOf(folder: FolderContents): string {
26
+ if (folder.kind === "root") {
27
+ return folder.vaultName
28
+ }
29
+
30
+ return folder.path
31
+ }
32
+
33
+ function linkPathOf(folder: FolderContents): string {
34
+ if (folder.kind === "root") {
35
+ return ""
36
+ }
37
+
38
+ return folder.path
39
+ }
40
+
41
+ function section(title: string, lines: string[]): string[] {
42
+ if (lines.length === 0) {
43
+ return []
44
+ }
45
+
46
+ return [`## ${title}`, lines.join("\n")]
47
+ }
48
+
49
+ function archiveSection(folder: FolderContents): string[] {
50
+ if (folder.kind === "root" && folder.hasArchive) {
51
+ return section("Archive", [subjectLine("", ARCHIVE_FOLDER)])
52
+ }
53
+
54
+ return []
55
+ }
56
+
57
+ function subjectLine(path: string, subject: string): string {
58
+ const target = joinVaultPath(path, subject, FOLDER_INDEX_NAME)
59
+ const problems = checkVaultPath(target)
60
+ if (problems.length > 0) {
61
+ return `- ${displayIndexName(subject)}${NOTE_LINE_SEPARATOR}${problems.map(displayIndexName).join(PROBLEM_SEPARATOR)}`
62
+ }
63
+
64
+ return `- [[${target}|${subject}]]`
65
+ }
66
+
67
+ function noteLine(path: string, note: Note): string {
68
+ const parts = [noteLink(path, note.statement), note.frontmatter.type]
69
+
70
+ if (note.frontmatter.dontForget) {
71
+ parts.push(DONT_FORGET_LABEL)
72
+ }
73
+
74
+ return `- ${parts.join(NOTE_LINE_SEPARATOR)}`
75
+ }
76
+
77
+ function invalidLine(path: string, note: InvalidNote): string {
78
+ const parts = [noteLink(path, note.statement), note.problems.map(displayIndexText).join(PROBLEM_SEPARATOR)]
79
+ return `- ${parts.join(NOTE_LINE_SEPARATOR)}`
80
+ }
81
+
82
+ function noteLink(path: string, statement: string): string {
83
+ const target = joinVaultPath(path, statement)
84
+ if (statement.length === 0 || checkVaultPath(target).length > 0) {
85
+ return displayIndexName(statement)
86
+ }
87
+
88
+ return `[[${target}|${statement}]]`
89
+ }
90
+
91
+ function problemFolderLines(folder: FolderContents): string[] {
92
+ if (!folder.problemFolders) {
93
+ return []
94
+ }
95
+
96
+ return [...folder.problemFolders]
97
+ .sort((first, second) => compareText(first.folder, second.folder))
98
+ .map(
99
+ (problem) =>
100
+ `- Folder ${displayIndexName(problem.folder)}${NOTE_LINE_SEPARATOR}${problem.problems.map(displayIndexText).join(PROBLEM_SEPARATOR)}`,
101
+ )
102
+ }
103
+
104
+ function sortAlphabetically(values: string[]): string[] {
105
+ return [...values].sort(compareText)
106
+ }
107
+
108
+ function byStatement(first: Titled, second: Titled): number {
109
+ return compareText(first.statement, second.statement)
110
+ }
111
+
112
+ function compareText(first: string, second: string): number {
113
+ return INDEX_TEXT_COLLATOR.compare(first, second)
114
+ }
@@ -0,0 +1,41 @@
1
+ import type { Note } from "#src/domain/note"
2
+
3
+ export interface Titled {
4
+ statement: string
5
+ }
6
+
7
+ export interface InvalidNote {
8
+ statement: string
9
+ problems: string[]
10
+ }
11
+
12
+ export interface ProblemFolder {
13
+ folder: string
14
+ problems: string[]
15
+ }
16
+
17
+ export interface SubjectFolder {
18
+ kind: "subject"
19
+ path: string
20
+ subjects: string[]
21
+ notes: Note[]
22
+ invalid: InvalidNote[]
23
+ problemFolders?: ProblemFolder[]
24
+ }
25
+
26
+ export interface RootFolder {
27
+ kind: "root"
28
+ vaultName: string
29
+ subjects: string[]
30
+ notes: Note[]
31
+ invalid: InvalidNote[]
32
+ hasArchive: boolean
33
+ problemFolders?: ProblemFolder[]
34
+ }
35
+
36
+ export type FolderContents = SubjectFolder | RootFolder
37
+
38
+ export interface FolderListingFingerprint {
39
+ folder: string
40
+ fingerprint: string | null
41
+ }
@@ -0,0 +1,22 @@
1
+ export * from "./capture/index.ts"
2
+ export * from "./command-flags/index.ts"
3
+ export * from "./config/index.ts"
4
+ export * from "./decision-model/index.ts"
5
+ export * from "./embeddings/index.ts"
6
+ export * from "./folder-index/index.ts"
7
+ export * from "./lifecycle/index.ts"
8
+ export * from "./loaded-memory/index.ts"
9
+ export * from "./memory/index.ts"
10
+ export * from "./memory-agent/index.ts"
11
+ export * from "./names/index.ts"
12
+ export * from "./note/index.ts"
13
+ export * from "./path-platform/index.ts"
14
+ export * from "./search-catalog/index.ts"
15
+ export * from "./shell-edit/index.ts"
16
+ export * from "./tool-flags/index.ts"
17
+ export * from "./validation/index.ts"
18
+ export * from "./vault-access/index.ts"
19
+ export * from "./vault-assets/index.ts"
20
+ export * from "./vault-catalog/index.ts"
21
+ export * from "./vault-diagnosis/index.ts"
22
+ export * from "./vault-path/index.ts"
@@ -0,0 +1,2 @@
1
+ export * from "./lifecycle.ts"
2
+ export * from "./types.ts"
@@ -0,0 +1,39 @@
1
+ import type { Note } from "#src/domain/note"
2
+ import { ARCHIVE_FOLDER, joinVaultPath } from "#src/domain/vault-path"
3
+ import type { NoteChange, PlacedNote, Succession } from "./types.ts"
4
+
5
+ export function updatedNote(note: Note, change: NoteChange, today: string): Note {
6
+ const { dontForget: _previous, ...kept } = note.frontmatter
7
+ const frontmatter = { ...kept, type: change.type, updated: today }
8
+ if (change.dontForget) return { ...note, frontmatter: { ...frontmatter, dontForget: true }, body: change.body }
9
+ return { ...note, frontmatter, body: change.body }
10
+ }
11
+
12
+ export function archiveNote(placed: PlacedNote, today: string): PlacedNote {
13
+ const { note } = placed
14
+
15
+ return {
16
+ folder: joinVaultPath(ARCHIVE_FOLDER, placed.folder),
17
+ note: { ...note, frontmatter: { ...note.frontmatter, archived: today } },
18
+ }
19
+ }
20
+
21
+ export function succeedNote(previous: PlacedNote, successor: PlacedNote, today: string): Succession {
22
+ const archived = archiveNote(previous, today)
23
+ const born = { ...successor.note.frontmatter, created: today, updated: today }
24
+
25
+ return {
26
+ archived: {
27
+ folder: archived.folder,
28
+ note: { ...archived.note, frontmatter: { ...archived.note.frontmatter, replacedBy: linkTo(successor) } },
29
+ },
30
+ successor: {
31
+ folder: successor.folder,
32
+ note: { ...successor.note, frontmatter: { ...born, replaces: linkTo(archived) } },
33
+ },
34
+ }
35
+ }
36
+
37
+ function linkTo(placed: PlacedNote): string {
38
+ return `[[${joinVaultPath(placed.folder, placed.note.statement)}]]`
39
+ }
@@ -0,0 +1,17 @@
1
+ import type { Note, NoteType } from "#src/domain/note"
2
+
3
+ export interface NoteChange {
4
+ body: string
5
+ type: NoteType
6
+ dontForget: boolean
7
+ }
8
+
9
+ export interface PlacedNote {
10
+ folder: string
11
+ note: Note
12
+ }
13
+
14
+ export interface Succession {
15
+ archived: PlacedNote
16
+ successor: PlacedNote
17
+ }