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,54 @@
1
+ export const VAULT_ACCESS_REFUSAL =
2
+ "Vault files are reachable only through memory_search and memory_get, never with file tools or the shell."
3
+
4
+ export const UNICODE_SPACES = /[\u00A0\u2000-\u200A\u202F\u205F\u3000]/g
5
+
6
+ export const WINDOWS_SHELL_DRIVE_PREFIX = /^\/(?:mnt\/|cygdrive\/)?([a-z])(?:\/|$)/i
7
+
8
+ export const NAMESPACE_UNC_PREFIX = /^\\\\[?.]\\UNC\\/i
9
+
10
+ export const TRAILING_NAMESPACE_SEPARATOR = /^(\\\\[?.]\\.+)\\$/
11
+
12
+ export const FILE_URL_PREFIX = /(?<=^|[\s=(,;|&<>])file:\/\//g
13
+
14
+ export const WINDOWS_FILE_URL_PREFIX = /(?<=^|[\s=(,;|&<>])file:\/\/\/(?=[a-z]:)/gi
15
+
16
+ export const NAMESPACE_PREFIX = /^\\\\[?.]\\/
17
+
18
+ export const LOCAL_ADMIN_SHARE = /^\\\\(?:localhost|127\.0\.0\.1)\\([a-z])\$(?:\\|$)/i
19
+
20
+ export const DRIVE_OR_UNC_START = /^(?:[a-z]:|\\\\)/i
21
+
22
+ export const COMPARABLE_NAMESPACE_UNC = /(?<=^|[\s=(,;|&<>])\/\/[?.]\/unc\//g
23
+
24
+ export const COMPARABLE_NAMESPACE = /(?<=^|[\s=(,;|&<>])\/\/[?.]\//g
25
+
26
+ export const COMPARABLE_ADMIN_SHARE = /(?<=^|[\s=(,;|&<>])\/\/(?:localhost|127\.0\.0\.1)\/([a-z])\$(?=\/|$)/g
27
+
28
+ export const PATH_TOKEN_START = /(?:^|[\s=(,;|&<>])$/
29
+
30
+ export const PATH_TOKEN_END = /^(?:$|[\s/|;&)<>,]|\.(?:$|[\s/]))/
31
+
32
+ export const PATH_FOLLOWS = /^\.?\//
33
+
34
+ export const QUOTE_CHARACTERS = ['"', "'", "`"]
35
+
36
+ export const TOKEN_SEPARATOR = /[\s=|;&()<>,]/
37
+
38
+ export const WINDOWS_DRIVE_START = /^[a-z]:\//
39
+
40
+ export const DRIVE_PATH_PREFIXES = ["/", "/mnt/", "/cygdrive/"]
41
+
42
+ export const VARIABLE_REFERENCE = /\$(?:env:)?\{?\w+\}?|%\w+%/gi
43
+
44
+ export const PARENT_FOLDER_START = /^\.\.(\/|$)/
45
+
46
+ export const HOME_PREFIXES = [
47
+ "~/",
48
+ "$home/",
49
+ "\u0024{home}/",
50
+ "$env:home/",
51
+ "%userprofile%/",
52
+ "$env:userprofile/",
53
+ "%homedrive%%homepath%/",
54
+ ]
@@ -0,0 +1,7 @@
1
+ export * from "./absolute-candidate.ts"
2
+ export * from "./argument-tokens.ts"
3
+ export * from "./command-mentions-vault.ts"
4
+ export * from "./constants.ts"
5
+ export * from "./types.ts"
6
+ export * from "./vault-access-refusal.ts"
7
+ export * from "./vault-location.ts"
@@ -0,0 +1,18 @@
1
+ export type PathAccessKind = "file" | "tree" | "listing"
2
+
3
+ export interface PathAccessRequest {
4
+ kind: PathAccessKind
5
+ path: string
6
+ }
7
+
8
+ export interface CommandAccessRequest {
9
+ kind: "command"
10
+ command: string
11
+ }
12
+
13
+ export type VaultAccessRequest = PathAccessRequest | CommandAccessRequest
14
+
15
+ export interface VaultForms {
16
+ anywhere: string[]
17
+ relative: string[]
18
+ }
@@ -0,0 +1,36 @@
1
+ import type { PathPlatform } from "#src/domain/path-platform"
2
+ import { absoluteCandidate } from "./absolute-candidate.ts"
3
+ import { commandMentionsVault } from "./command-mentions-vault.ts"
4
+ import type { PathAccessRequest, VaultAccessRequest } from "./types.ts"
5
+ import { vaultBelow, vaultContaining } from "./vault-location.ts"
6
+
7
+ export function vaultAccessRefusal(
8
+ request: VaultAccessRequest,
9
+ cwd: string,
10
+ home: string,
11
+ vaults: string[],
12
+ platform: PathPlatform,
13
+ ): string | null {
14
+ if (request.kind === "command") {
15
+ return commandMentionsVault(request.command, cwd, home, vaults, platform)
16
+ }
17
+
18
+ return pathVaultHit(request, absoluteCandidate(request.path, cwd, home, platform), vaults, platform)
19
+ }
20
+
21
+ function pathVaultHit(
22
+ request: PathAccessRequest,
23
+ path: string,
24
+ vaults: string[],
25
+ platform: PathPlatform,
26
+ ): string | null {
27
+ const containing = vaultContaining(path, vaults, platform)
28
+ if (containing) {
29
+ return containing
30
+ }
31
+ if (request.kind === "tree") {
32
+ return vaultBelow(path, vaults, platform)
33
+ }
34
+
35
+ return null
36
+ }
@@ -0,0 +1,22 @@
1
+ import { isInside } from "#src/domain/config"
2
+ import type { PathPlatform } from "#src/domain/path-platform"
3
+
4
+ export function vaultContaining(path: string, vaults: string[], platform: PathPlatform): string | null {
5
+ for (const vault of vaults) {
6
+ if (isInside(path, vault, platform)) {
7
+ return vault
8
+ }
9
+ }
10
+
11
+ return null
12
+ }
13
+
14
+ export function vaultBelow(path: string, vaults: string[], platform: PathPlatform): string | null {
15
+ for (const vault of vaults) {
16
+ if (isInside(vault, path, platform)) {
17
+ return vault
18
+ }
19
+ }
20
+
21
+ return null
22
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./render.ts"
2
+ export * from "./types.ts"
@@ -0,0 +1,51 @@
1
+ import { stringify } from "yaml"
2
+
3
+ import { type NoteType, NoteTypeSchema } from "#src/domain/note"
4
+ import type { DashboardView, VaultAsset, VaultDashboard } from "./types.ts"
5
+
6
+ export function renderVaultAssets(): VaultAsset[] {
7
+ return [...NoteTypeSchema.enum.map(renderHandTemplate), { path: "Memory.base", content: stringify(dashboard()) }]
8
+ }
9
+
10
+ function renderHandTemplate(type: NoteType): VaultAsset {
11
+ return {
12
+ path: `_templates/${type}.md`,
13
+ content: [
14
+ "---",
15
+ "id: REPLACE_WITH_NEW_ULID",
16
+ `type: ${type}`,
17
+ 'created: "{{date:YYYY-MM-DD}}"',
18
+ 'updated: "{{date:YYYY-MM-DD}}"',
19
+ "---",
20
+ "",
21
+ "{{title}}",
22
+ "",
23
+ ].join("\n"),
24
+ }
25
+ }
26
+
27
+ function dashboard(): VaultDashboard {
28
+ return {
29
+ filters: {
30
+ and: [
31
+ 'file.ext.lower() == "md"',
32
+ 'file.basename.lower() != "index"',
33
+ '!file.path.lower().startsWith("_templates/")',
34
+ ],
35
+ },
36
+ views: [
37
+ view("All notes", ['!file.path.lower().startsWith("archive/")']),
38
+ view("Don't forget", ['!file.path.lower().startsWith("archive/")', "note.dontForget == true"]),
39
+ view("Archive", ['file.path.lower().startsWith("archive/")']),
40
+ ],
41
+ }
42
+ }
43
+
44
+ function view(name: string, filters: string[]): DashboardView {
45
+ return {
46
+ type: "table",
47
+ name,
48
+ filters: { and: filters },
49
+ order: ["file.name", "file.folder", "note.type", "note.dontForget", "note.updated"],
50
+ }
51
+ }
@@ -0,0 +1,36 @@
1
+ import type { VaultCatalogFailure } from "#src/domain/vault-catalog"
2
+ import type { Failed, Succeeded } from "#src/shared"
3
+
4
+ export interface VaultAsset {
5
+ path: string
6
+ content: string
7
+ }
8
+
9
+ export interface DashboardFilters {
10
+ and: string[]
11
+ }
12
+
13
+ export interface DashboardView {
14
+ type: "table"
15
+ name: string
16
+ filters: DashboardFilters
17
+ order: string[]
18
+ }
19
+
20
+ export interface VaultDashboard {
21
+ filters: DashboardFilters
22
+ views: DashboardView[]
23
+ }
24
+
25
+ export interface VaultBootstrapProgress {
26
+ createdRoot: boolean
27
+ created: string[]
28
+ preserved: string[]
29
+ maintenanceProblems: string[]
30
+ }
31
+
32
+ export interface VaultBootstrapFailure extends Failed, VaultBootstrapProgress {
33
+ failure: VaultCatalogFailure
34
+ }
35
+
36
+ export type VaultBootstrapResult = Succeeded<VaultBootstrapProgress> | VaultBootstrapFailure
@@ -0,0 +1,37 @@
1
+ import { checkNoteText, parseNote, readFrontmatter } from "#src/domain/note"
2
+ import type { AnalyzeVaultNoteRequest, ParsedVaultNote, VaultNoteAnalysis, VaultNoteProblems } from "./types.ts"
3
+
4
+ export function analyzeVaultNote(request: AnalyzeVaultNoteRequest): VaultNoteAnalysis {
5
+ const parsed = parseNote(request.statement, request.text)
6
+ if (!parsed.succeeded) {
7
+ const text = textProblems(request, request.text)
8
+ return { status: "unclosed", searchable: false, needsFixing: true, ...text, frontmatterProblems: parsed.problems }
9
+ }
10
+
11
+ const result: ParsedVaultNote = {
12
+ status: "parsed",
13
+ parsed: parsed.output,
14
+ frontmatter: null,
15
+ searchable: false,
16
+ needsFixing: true,
17
+ ...textProblems(request, parsed.output.body),
18
+ }
19
+ const frontmatter = readFrontmatter(parsed.output.frontmatter)
20
+ if (!frontmatter.succeeded) return { ...result, frontmatterProblems: frontmatter.problems }
21
+
22
+ return {
23
+ ...result,
24
+ frontmatter: frontmatter.output,
25
+ searchable: !request.archived && !("archived" in frontmatter.output),
26
+ needsFixing: result.nameProblems.length + result.bodyProblems.length > 0,
27
+ }
28
+ }
29
+
30
+ function textProblems(request: AnalyzeVaultNoteRequest, body: string): VaultNoteProblems {
31
+ const problems = checkNoteText(request.statement, body, request.limits)
32
+ return {
33
+ frontmatterProblems: [],
34
+ nameProblems: problems.filter((problem) => problem.startsWith("statement:")),
35
+ bodyProblems: problems.filter((problem) => problem.startsWith("body:")),
36
+ }
37
+ }
@@ -0,0 +1,37 @@
1
+ import type { VaultEntryKind } from "./types.ts"
2
+
3
+ export function isRootArchive(path: string): boolean {
4
+ return path.split("/")[0]?.toLowerCase() === "archive"
5
+ }
6
+
7
+ export function isRootTemplate(path: string): boolean {
8
+ return path.split("/")[0]?.toLowerCase() === "_templates"
9
+ }
10
+
11
+ export function isCatalogHidden(path: string): boolean {
12
+ return path.split("/").some((part) => part.startsWith("."))
13
+ }
14
+
15
+ export function catalogFileKind(path: string): Exclude<VaultEntryKind, "folder"> {
16
+ const lower = path.toLowerCase()
17
+ const name = lower.split("/").at(-1)
18
+ if (/\.md\.tmp-[^/]+$/i.test(path) || /^\.memory\.base\.tmp-[^/]+$/.test(lower)) return "temporary"
19
+ if (isRootTemplate(path)) return "template"
20
+ if (name === "index.md") return "index"
21
+ if (lower === "memory.base") return "dashboard"
22
+ if (lower.endsWith(".md")) return "note"
23
+ return "other"
24
+ }
25
+
26
+ export function isCatalogNotePath(path: string): boolean {
27
+ const parent = path.slice(0, path.lastIndexOf("/") + 1)
28
+ return !isCatalogHidden(parent) && catalogFileKind(path) === "note"
29
+ }
30
+
31
+ export function isSafeCatalogPath(path: string): boolean {
32
+ return path.length > 0 && path.split("/").every(isSafeCatalogPart)
33
+ }
34
+
35
+ function isSafeCatalogPart(part: string): boolean {
36
+ return part.length > 0 && part !== "." && part !== ".." && !/[\\:]/.test(part) && !part.includes("\u0000")
37
+ }
@@ -0,0 +1,6 @@
1
+ import type { VaultNoteAnalysis } from "./types.ts"
2
+
3
+ export function isLoadedDontForget(analysis: VaultNoteAnalysis): boolean {
4
+ if (analysis.status !== "parsed" || !analysis.frontmatter) return false
5
+ return analysis.searchable && "dontForget" in analysis.frontmatter
6
+ }
@@ -0,0 +1,10 @@
1
+ import type { VaultExportEntry, VaultExportFile } from "./types.ts"
2
+
3
+ export function exportEntries(
4
+ global: readonly VaultExportFile[],
5
+ project: readonly VaultExportFile[] | null,
6
+ ): VaultExportEntry[] {
7
+ const entries = global.map((file) => ({ path: `global/${file.path}`, bytes: file.bytes }))
8
+ if (!project) return entries
9
+ return [...entries, ...project.map((file) => ({ path: `project/${file.path}`, bytes: file.bytes }))]
10
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./analyze.ts"
2
+ export * from "./classify.ts"
3
+ export * from "./dont-forget.ts"
4
+ export * from "./export-entries.ts"
5
+ export * from "./types.ts"
@@ -0,0 +1,114 @@
1
+ import type { NoteFrontmatter, NoteLimits, ParsedNote } from "#src/domain/note"
2
+ import type { Failed, Succeeded } from "#src/shared"
3
+
4
+ export type VaultEntryKind = "note" | "folder" | "index" | "template" | "dashboard" | "temporary" | "other"
5
+
6
+ export interface VaultFileStat {
7
+ size: number
8
+ mtimeMs: number
9
+ ctimeMs: number
10
+ device: number
11
+ inode: number
12
+ }
13
+
14
+ export interface VaultCatalogEntry {
15
+ path: string
16
+ kind: VaultEntryKind
17
+ archived: boolean
18
+ stat: VaultFileStat
19
+ }
20
+
21
+ export interface VaultCatalogFailure extends Failed {
22
+ path: string
23
+ scope: "file" | "directory" | "entry"
24
+ reason:
25
+ | "invalid-path"
26
+ | "outside-vault"
27
+ | "not-found"
28
+ | "not-directory"
29
+ | "not-file"
30
+ | "unreadable"
31
+ | "not-writable"
32
+ | "cycle"
33
+ | "excluded"
34
+ | "changed"
35
+ | "io-error"
36
+ }
37
+
38
+ export interface VaultAlias {
39
+ path: string
40
+ target: string
41
+ }
42
+
43
+ export interface VaultEnumeration {
44
+ entries: VaultCatalogEntry[]
45
+ observedPaths: string[]
46
+ completeDirectories: string[]
47
+ failures: VaultCatalogFailure[]
48
+ aliases: VaultAlias[]
49
+ }
50
+
51
+ export type VaultEnumerationResult = Succeeded<VaultEnumeration> | VaultCatalogFailure
52
+
53
+ export interface AnalyzeVaultNoteRequest {
54
+ statement: string
55
+ text: string
56
+ archived: boolean
57
+ limits: NoteLimits
58
+ }
59
+
60
+ export interface VaultNoteProblems {
61
+ frontmatterProblems: string[]
62
+ nameProblems: string[]
63
+ bodyProblems: string[]
64
+ }
65
+
66
+ export interface ParsedVaultNote extends VaultNoteProblems {
67
+ status: "parsed"
68
+ parsed: ParsedNote
69
+ frontmatter: NoteFrontmatter | null
70
+ searchable: boolean
71
+ needsFixing: boolean
72
+ }
73
+
74
+ export interface UnclosedVaultNote extends VaultNoteProblems {
75
+ status: "unclosed"
76
+ searchable: false
77
+ needsFixing: true
78
+ }
79
+
80
+ export type VaultNoteAnalysis = ParsedVaultNote | UnclosedVaultNote
81
+
82
+ export interface VaultFileRequest {
83
+ path: string
84
+ }
85
+
86
+ export interface InspectedVaultFile {
87
+ path: string
88
+ canonicalPath: string
89
+ text: string
90
+ rawHash: string
91
+ stat: VaultFileStat
92
+ archived: boolean
93
+ analysis: VaultNoteAnalysis
94
+ }
95
+
96
+ export type VaultInspectionResult = Succeeded<InspectedVaultFile> | VaultCatalogFailure
97
+
98
+ export interface VaultExportFile {
99
+ path: string
100
+ bytes: Uint8Array
101
+ rawHash: string
102
+ stat: VaultFileStat
103
+ }
104
+
105
+ export interface VaultExportEntry {
106
+ path: string
107
+ bytes: Uint8Array
108
+ }
109
+
110
+ export interface VaultExportFailure extends Failed {
111
+ failures: VaultCatalogFailure[]
112
+ }
113
+
114
+ export type VaultExportResult = Succeeded<VaultExportFile[]> | VaultExportFailure
@@ -0,0 +1,79 @@
1
+ import { catalogFolder } from "#src/domain/search-catalog"
2
+ import { isRootArchive, type VaultCatalogEntry } from "#src/domain/vault-catalog"
3
+ import type {
4
+ CrowdedFolder,
5
+ DuplicateNoteId,
6
+ InvalidVaultNote,
7
+ VaultDiagnosis,
8
+ VaultDiagnosisRequest,
9
+ } from "./types.ts"
10
+
11
+ export function diagnoseVault(request: VaultDiagnosisRequest): VaultDiagnosis {
12
+ return {
13
+ invalid: invalidNotes(request),
14
+ blank: request.inspected
15
+ .filter((file) => file.analysis.status === "unclosed")
16
+ .map((file) => file.path)
17
+ .sort(compareText),
18
+ duplicateIds: duplicateIds(request),
19
+ temporaries: request.entries
20
+ .filter((entry) => entry.kind === "temporary")
21
+ .map((entry) => entry.path)
22
+ .sort(compareText),
23
+ crowdedFolders: crowdedFolders(request),
24
+ }
25
+ }
26
+
27
+ function invalidNotes(request: VaultDiagnosisRequest): InvalidVaultNote[] {
28
+ const invalid: InvalidVaultNote[] = []
29
+ for (const file of request.inspected) {
30
+ const { analysis } = file
31
+ if (analysis.status === "parsed" && analysis.needsFixing) {
32
+ invalid.push({
33
+ path: file.path,
34
+ problems: [...analysis.frontmatterProblems, ...analysis.nameProblems, ...analysis.bodyProblems],
35
+ })
36
+ }
37
+ }
38
+ return invalid.sort((left, right) => compareText(left.path, right.path))
39
+ }
40
+
41
+ function duplicateIds(request: VaultDiagnosisRequest): DuplicateNoteId[] {
42
+ const groups = new Map<string, string[]>()
43
+ for (const file of request.inspected) {
44
+ const { analysis } = file
45
+ if (analysis.status !== "parsed" || !analysis.frontmatter) continue
46
+ const group = groups.get(analysis.frontmatter.id)
47
+ if (group) group.push(file.path)
48
+ else groups.set(analysis.frontmatter.id, [file.path])
49
+ }
50
+ return [...groups]
51
+ .filter(([, paths]) => paths.length > 1)
52
+ .map(([id, paths]) => ({ id, paths: paths.sort(compareText) }))
53
+ .sort((left, right) => compareText(left.id, right.id))
54
+ }
55
+
56
+ function crowdedFolders(request: VaultDiagnosisRequest): CrowdedFolder[] {
57
+ const counts = new Map<string, number>()
58
+ for (const entry of request.entries) {
59
+ if (!isLiveNote(entry)) continue
60
+ const folder = catalogFolder(entry.path)
61
+ const count = counts.get(folder)
62
+ if (count) counts.set(folder, count + 1)
63
+ else counts.set(folder, 1)
64
+ }
65
+ return [...counts]
66
+ .filter(([, count]) => count > request.limits.maxNotesPerFolder)
67
+ .map(([folder, count]) => ({ folder, count }))
68
+ .sort((left, right) => compareText(left.folder, right.folder))
69
+ }
70
+
71
+ function isLiveNote(entry: VaultCatalogEntry): boolean {
72
+ return entry.kind === "note" && !entry.archived && !isRootArchive(entry.path)
73
+ }
74
+
75
+ function compareText(left: string, right: string): number {
76
+ if (left < right) return -1
77
+ if (left > right) return 1
78
+ return 0
79
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./diagnose.ts"
2
+ export * from "./types.ts"
@@ -0,0 +1,31 @@
1
+ import type { MemoryConfig } from "#src/domain/config"
2
+ import type { InspectedVaultFile, VaultCatalogEntry } from "#src/domain/vault-catalog"
3
+
4
+ export interface VaultDiagnosisRequest {
5
+ entries: readonly VaultCatalogEntry[]
6
+ inspected: readonly InspectedVaultFile[]
7
+ limits: MemoryConfig["limits"]
8
+ }
9
+
10
+ export interface InvalidVaultNote {
11
+ path: string
12
+ problems: string[]
13
+ }
14
+
15
+ export interface DuplicateNoteId {
16
+ id: string
17
+ paths: string[]
18
+ }
19
+
20
+ export interface CrowdedFolder {
21
+ folder: string
22
+ count: number
23
+ }
24
+
25
+ export interface VaultDiagnosis {
26
+ invalid: InvalidVaultNote[]
27
+ blank: string[]
28
+ duplicateIds: DuplicateNoteId[]
29
+ temporaries: string[]
30
+ crowdedFolders: CrowdedFolder[]
31
+ }
@@ -0,0 +1,13 @@
1
+ export const FOLDER_INDEX_NAME = "index"
2
+
3
+ export const ARCHIVE_FOLDER = "archive"
4
+
5
+ export const TEMPLATES_FOLDER = "_templates"
6
+
7
+ export const RESERVED_ROOT_FOLDERS = [ARCHIVE_FOLDER, TEMPLATES_FOLDER]
8
+
9
+ export const VAULT_PATH_SEPARATOR = "/"
10
+
11
+ export const DRIVE_LETTER = /^[A-Za-z]:/
12
+
13
+ export const HIDDEN_NAME_PREFIX = "."
@@ -0,0 +1,2 @@
1
+ export * from "./constants.ts"
2
+ export * from "./vault-path.ts"
@@ -0,0 +1,65 @@
1
+ import { checkEdges, checkFileSystemName, checkLinkCharacters, RELATIVE_NAMES } from "#src/domain/names"
2
+ import { DRIVE_LETTER, HIDDEN_NAME_PREFIX, RESERVED_ROOT_FOLDERS, VAULT_PATH_SEPARATOR } from "./constants.ts"
3
+
4
+ export function joinVaultPath(...parts: string[]): string {
5
+ return parts.filter((part) => part.length > 0).join(VAULT_PATH_SEPARATOR)
6
+ }
7
+
8
+ export function ancestorFolders(folder: string): string[] {
9
+ const parts = folder.split(VAULT_PATH_SEPARATOR).filter((part) => part.length > 0)
10
+ const nested = parts.map((_part, depth) => parts.slice(0, parts.length - depth).join(VAULT_PATH_SEPARATOR))
11
+
12
+ return [...nested, ""]
13
+ }
14
+
15
+ export function checkVaultPath(folder: string): string[] {
16
+ if (folder.includes("\\")) {
17
+ return ['folder: use "/" between folders']
18
+ }
19
+
20
+ if (folder.startsWith(VAULT_PATH_SEPARATOR) || DRIVE_LETTER.test(folder)) {
21
+ return ["folder: must be relative to the vault"]
22
+ }
23
+
24
+ if (folder.length === 0) {
25
+ return []
26
+ }
27
+
28
+ const problems = folder.split(VAULT_PATH_SEPARATOR).flatMap(checkFolderPart)
29
+ return [...new Set(problems)]
30
+ }
31
+
32
+ export function checkMemoryFolder(folder: string): string[] {
33
+ const problems = checkVaultPath(folder)
34
+ if (problems.length > 0 || folder.length === 0) {
35
+ return problems
36
+ }
37
+
38
+ return folder.split(VAULT_PATH_SEPARATOR).flatMap(checkMemoryFolderPart)
39
+ }
40
+
41
+ function checkFolderPart(part: string): string[] {
42
+ if (part.length === 0) {
43
+ return ["folder: has an empty part"]
44
+ }
45
+
46
+ if (RELATIVE_NAMES.includes(part)) {
47
+ return [`folder: "${part}" is not allowed`]
48
+ }
49
+
50
+ const label = `folder "${part}"`
51
+ return [...checkFileSystemName(label, part), ...checkLinkCharacters(label, part), ...checkEdges(label, part)]
52
+ }
53
+
54
+ function checkMemoryFolderPart(part: string, depth: number): string[] {
55
+ const isReservedRoot = depth === 0 && RESERVED_ROOT_FOLDERS.includes(part.toLowerCase())
56
+ if (isReservedRoot) {
57
+ return [`folder "${part}": is reserved for the vault`]
58
+ }
59
+
60
+ if (part.startsWith(HIDDEN_NAME_PREFIX)) {
61
+ return [`folder "${part}": is hidden (starts with ".")`]
62
+ }
63
+
64
+ return []
65
+ }