pi-obsidian-memory 0.0.1 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (572) hide show
  1. package/README.md +237 -7
  2. package/package.json +41 -11
  3. package/skills/obsidian-memory/SKILL.md +101 -0
  4. package/src/domain/capture/constants.ts +5 -0
  5. package/src/domain/capture/index.ts +6 -0
  6. package/src/domain/capture/input-problems.ts +9 -0
  7. package/src/domain/capture/schemas.ts +92 -0
  8. package/src/domain/capture/tally.ts +26 -0
  9. package/src/domain/capture/types.ts +49 -0
  10. package/src/domain/capture/validate.ts +75 -0
  11. package/src/domain/command-flags/constants.ts +141 -0
  12. package/src/domain/command-flags/index.ts +1 -0
  13. package/src/domain/config/change.ts +105 -0
  14. package/src/domain/config/constants.ts +25 -0
  15. package/src/domain/config/diagnostics.ts +35 -0
  16. package/src/domain/config/disclosures.ts +8 -0
  17. package/src/domain/config/fields.ts +7 -0
  18. package/src/domain/config/index.ts +11 -0
  19. package/src/domain/config/inspection.ts +43 -0
  20. package/src/domain/config/invariants.ts +68 -0
  21. package/src/domain/config/legacy-capture.ts +17 -0
  22. package/src/domain/config/observations.ts +109 -0
  23. package/src/domain/config/parse.ts +25 -0
  24. package/src/domain/config/paths.ts +61 -0
  25. package/src/domain/config/registration.ts +34 -0
  26. package/src/domain/config/repair.ts +36 -0
  27. package/src/domain/config/resources.ts +65 -0
  28. package/src/domain/config/rules.ts +49 -0
  29. package/src/domain/config/schemas.ts +155 -0
  30. package/src/domain/config/settings.ts +23 -0
  31. package/src/domain/config/types.ts +239 -0
  32. package/src/domain/decision-model/constants.ts +7 -0
  33. package/src/domain/decision-model/cutoffs.ts +8 -0
  34. package/src/domain/decision-model/endpoint.ts +11 -0
  35. package/src/domain/decision-model/failure-detail.ts +8 -0
  36. package/src/domain/decision-model/index.ts +6 -0
  37. package/src/domain/decision-model/rank.ts +36 -0
  38. package/src/domain/decision-model/types.ts +77 -0
  39. package/src/domain/embeddings/constants.ts +55 -0
  40. package/src/domain/embeddings/identity.ts +30 -0
  41. package/src/domain/embeddings/index.ts +5 -0
  42. package/src/domain/embeddings/schemas.ts +25 -0
  43. package/src/domain/embeddings/types.ts +52 -0
  44. package/src/domain/embeddings/vectors.ts +53 -0
  45. package/src/domain/folder-index/constants.ts +9 -0
  46. package/src/domain/folder-index/display.ts +22 -0
  47. package/src/domain/folder-index/index.ts +5 -0
  48. package/src/domain/folder-index/listing.ts +58 -0
  49. package/src/domain/folder-index/render.ts +114 -0
  50. package/src/domain/folder-index/types.ts +41 -0
  51. package/src/domain/index.ts +22 -0
  52. package/src/domain/lifecycle/index.ts +2 -0
  53. package/src/domain/lifecycle/lifecycle.ts +39 -0
  54. package/src/domain/lifecycle/types.ts +17 -0
  55. package/src/domain/loaded-memory/budget.ts +14 -0
  56. package/src/domain/loaded-memory/constants.ts +9 -0
  57. package/src/domain/loaded-memory/index.ts +4 -0
  58. package/src/domain/loaded-memory/render.ts +30 -0
  59. package/src/domain/loaded-memory/types.ts +19 -0
  60. package/src/domain/memory/draft.ts +12 -0
  61. package/src/domain/memory/index.ts +4 -0
  62. package/src/domain/memory/schemas.ts +15 -0
  63. package/src/domain/memory/target.ts +27 -0
  64. package/src/domain/memory/types.ts +20 -0
  65. package/src/domain/memory-agent/index.ts +5 -0
  66. package/src/domain/memory-agent/input-problems.ts +9 -0
  67. package/src/domain/memory-agent/refusal.ts +6 -0
  68. package/src/domain/memory-agent/schemas.ts +112 -0
  69. package/src/domain/memory-agent/types.ts +25 -0
  70. package/src/domain/memory-agent/validate.ts +67 -0
  71. package/src/domain/names/constants.ts +32 -0
  72. package/src/domain/names/index.ts +2 -0
  73. package/src/domain/names/names.ts +83 -0
  74. package/src/domain/note/check.ts +68 -0
  75. package/src/domain/note/constants.ts +15 -0
  76. package/src/domain/note/frontmatter-fields.ts +175 -0
  77. package/src/domain/note/frontmatter.ts +138 -0
  78. package/src/domain/note/index.ts +9 -0
  79. package/src/domain/note/parse.ts +41 -0
  80. package/src/domain/note/render.ts +27 -0
  81. package/src/domain/note/schema-errors.ts +41 -0
  82. package/src/domain/note/schemas.ts +38 -0
  83. package/src/domain/note/types.ts +53 -0
  84. package/src/domain/note/validate.ts +19 -0
  85. package/src/domain/path-platform/index.ts +2 -0
  86. package/src/domain/path-platform/path-module.ts +11 -0
  87. package/src/domain/path-platform/types.ts +1 -0
  88. package/src/domain/search-catalog/constants.ts +1 -0
  89. package/src/domain/search-catalog/coverage.ts +35 -0
  90. package/src/domain/search-catalog/dont-forget.ts +10 -0
  91. package/src/domain/search-catalog/fingerprint.ts +9 -0
  92. package/src/domain/search-catalog/index.ts +10 -0
  93. package/src/domain/search-catalog/inspection.ts +47 -0
  94. package/src/domain/search-catalog/plan.ts +68 -0
  95. package/src/domain/search-catalog/ranking.ts +27 -0
  96. package/src/domain/search-catalog/schemas.ts +49 -0
  97. package/src/domain/search-catalog/types.ts +103 -0
  98. package/src/domain/search-catalog/vector-refresh.ts +22 -0
  99. package/src/domain/shell-edit/command-segments.ts +28 -0
  100. package/src/domain/shell-edit/command-words.ts +22 -0
  101. package/src/domain/shell-edit/constants.ts +125 -0
  102. package/src/domain/shell-edit/executed-files.ts +154 -0
  103. package/src/domain/shell-edit/index.ts +6 -0
  104. package/src/domain/shell-edit/powershell-files.ts +38 -0
  105. package/src/domain/shell-edit/rules.ts +19 -0
  106. package/src/domain/shell-edit/types.ts +75 -0
  107. package/src/domain/tool-flags/constants.ts +178 -0
  108. package/src/domain/tool-flags/index.ts +2 -0
  109. package/src/domain/tool-flags/types.ts +7 -0
  110. package/src/domain/validation/constants.ts +1 -0
  111. package/src/domain/validation/describe.ts +137 -0
  112. package/src/domain/validation/index.ts +3 -0
  113. package/src/domain/validation/types.ts +3 -0
  114. package/src/domain/vault-access/absolute-candidate.ts +81 -0
  115. package/src/domain/vault-access/argument-tokens.ts +22 -0
  116. package/src/domain/vault-access/command-mentions-vault.ts +115 -0
  117. package/src/domain/vault-access/constants.ts +54 -0
  118. package/src/domain/vault-access/index.ts +7 -0
  119. package/src/domain/vault-access/types.ts +18 -0
  120. package/src/domain/vault-access/vault-access-refusal.ts +36 -0
  121. package/src/domain/vault-access/vault-location.ts +22 -0
  122. package/src/domain/vault-assets/index.ts +2 -0
  123. package/src/domain/vault-assets/render.ts +51 -0
  124. package/src/domain/vault-assets/types.ts +36 -0
  125. package/src/domain/vault-catalog/analyze.ts +37 -0
  126. package/src/domain/vault-catalog/classify.ts +37 -0
  127. package/src/domain/vault-catalog/dont-forget.ts +6 -0
  128. package/src/domain/vault-catalog/export-entries.ts +10 -0
  129. package/src/domain/vault-catalog/index.ts +5 -0
  130. package/src/domain/vault-catalog/types.ts +114 -0
  131. package/src/domain/vault-diagnosis/diagnose.ts +79 -0
  132. package/src/domain/vault-diagnosis/index.ts +2 -0
  133. package/src/domain/vault-diagnosis/types.ts +31 -0
  134. package/src/domain/vault-path/constants.ts +13 -0
  135. package/src/domain/vault-path/index.ts +2 -0
  136. package/src/domain/vault-path/vault-path.ts +65 -0
  137. package/src/pi/capture/cadence.ts +49 -0
  138. package/src/pi/capture/completion.ts +26 -0
  139. package/src/pi/capture/constants.ts +5 -0
  140. package/src/pi/capture/handlers.ts +30 -0
  141. package/src/pi/capture/index.ts +8 -0
  142. package/src/pi/capture/runtime.ts +83 -0
  143. package/src/pi/capture/schemas.ts +8 -0
  144. package/src/pi/capture/tool-calls.ts +6 -0
  145. package/src/pi/capture/transcript.ts +55 -0
  146. package/src/pi/capture/types.ts +46 -0
  147. package/src/pi/change-report/constants.ts +15 -0
  148. package/src/pi/change-report/index.ts +3 -0
  149. package/src/pi/change-report/report.ts +54 -0
  150. package/src/pi/change-report/types.ts +8 -0
  151. package/src/pi/context/constants.ts +5 -0
  152. package/src/pi/context/index.ts +3 -0
  153. package/src/pi/context/status.ts +15 -0
  154. package/src/pi/context/types.ts +98 -0
  155. package/src/pi/extension.ts +100 -0
  156. package/src/pi/index.ts +26 -0
  157. package/src/pi/memory-add/constants.ts +13 -0
  158. package/src/pi/memory-add/index.ts +5 -0
  159. package/src/pi/memory-add/memory-add.ts +31 -0
  160. package/src/pi/memory-add/respond.ts +55 -0
  161. package/src/pi/memory-add/schemas.ts +29 -0
  162. package/src/pi/memory-add/types.ts +15 -0
  163. package/src/pi/memory-archive/constants.ts +8 -0
  164. package/src/pi/memory-archive/index.ts +4 -0
  165. package/src/pi/memory-archive/memory-archive.ts +29 -0
  166. package/src/pi/memory-archive/schemas.ts +15 -0
  167. package/src/pi/memory-archive/types.ts +8 -0
  168. package/src/pi/memory-block/block.ts +75 -0
  169. package/src/pi/memory-block/constants.ts +24 -0
  170. package/src/pi/memory-block/index.ts +4 -0
  171. package/src/pi/memory-block/render.ts +54 -0
  172. package/src/pi/memory-block/types.ts +24 -0
  173. package/src/pi/memory-doctor/constants.ts +43 -0
  174. package/src/pi/memory-doctor/index.ts +4 -0
  175. package/src/pi/memory-doctor/memory-doctor.ts +135 -0
  176. package/src/pi/memory-doctor/report.ts +101 -0
  177. package/src/pi/memory-doctor/types.ts +13 -0
  178. package/src/pi/memory-export/constants.ts +15 -0
  179. package/src/pi/memory-export/index.ts +4 -0
  180. package/src/pi/memory-export/memory-export.ts +57 -0
  181. package/src/pi/memory-export/name.ts +9 -0
  182. package/src/pi/memory-export/types.ts +4 -0
  183. package/src/pi/memory-get/constants.ts +12 -0
  184. package/src/pi/memory-get/index.ts +5 -0
  185. package/src/pi/memory-get/memory-get.ts +23 -0
  186. package/src/pi/memory-get/respond.ts +38 -0
  187. package/src/pi/memory-get/schemas.ts +13 -0
  188. package/src/pi/memory-get/types.ts +10 -0
  189. package/src/pi/memory-init/constants.ts +17 -0
  190. package/src/pi/memory-init/index.ts +2 -0
  191. package/src/pi/memory-init/memory-init.ts +63 -0
  192. package/src/pi/memory-search/constants.ts +16 -0
  193. package/src/pi/memory-search/index.ts +5 -0
  194. package/src/pi/memory-search/memory-search.ts +22 -0
  195. package/src/pi/memory-search/respond.ts +62 -0
  196. package/src/pi/memory-search/schemas.ts +11 -0
  197. package/src/pi/memory-search/types.ts +10 -0
  198. package/src/pi/memory-session/constants.ts +7 -0
  199. package/src/pi/memory-session/index.ts +4 -0
  200. package/src/pi/memory-session/keeper.ts +101 -0
  201. package/src/pi/memory-session/respond.ts +6 -0
  202. package/src/pi/memory-session/types.ts +23 -0
  203. package/src/pi/memory-settings/constants.ts +69 -0
  204. package/src/pi/memory-settings/edits.ts +46 -0
  205. package/src/pi/memory-settings/index.ts +9 -0
  206. package/src/pi/memory-settings/lines.ts +119 -0
  207. package/src/pi/memory-settings/models.ts +81 -0
  208. package/src/pi/memory-settings/projects.ts +46 -0
  209. package/src/pi/memory-settings/providers.ts +77 -0
  210. package/src/pi/memory-settings/save.ts +16 -0
  211. package/src/pi/memory-settings/screen.ts +27 -0
  212. package/src/pi/memory-settings/types.ts +87 -0
  213. package/src/pi/memory-setup/constants.ts +33 -0
  214. package/src/pi/memory-setup/disclosure.ts +22 -0
  215. package/src/pi/memory-setup/index.ts +4 -0
  216. package/src/pi/memory-setup/memory-setup.ts +153 -0
  217. package/src/pi/memory-setup/types.ts +6 -0
  218. package/src/pi/memory-succeed/constants.ts +10 -0
  219. package/src/pi/memory-succeed/index.ts +4 -0
  220. package/src/pi/memory-succeed/memory-succeed.ts +34 -0
  221. package/src/pi/memory-succeed/schemas.ts +30 -0
  222. package/src/pi/memory-succeed/types.ts +8 -0
  223. package/src/pi/memory-update/constants.ts +8 -0
  224. package/src/pi/memory-update/index.ts +4 -0
  225. package/src/pi/memory-update/memory-update.ts +29 -0
  226. package/src/pi/memory-update/schemas.ts +24 -0
  227. package/src/pi/memory-update/types.ts +8 -0
  228. package/src/pi/paths/constants.ts +7 -0
  229. package/src/pi/paths/index.ts +2 -0
  230. package/src/pi/paths/paths.ts +15 -0
  231. package/src/pi/paths/platform.ts +7 -0
  232. package/src/pi/registrar.ts +25 -0
  233. package/src/pi/registration-report/constants.ts +13 -0
  234. package/src/pi/registration-report/index.ts +2 -0
  235. package/src/pi/registration-report/report.ts +26 -0
  236. package/src/pi/relevant-memory/constants.ts +3 -0
  237. package/src/pi/relevant-memory/index.ts +4 -0
  238. package/src/pi/relevant-memory/prompt.ts +23 -0
  239. package/src/pi/relevant-memory/runtime.ts +88 -0
  240. package/src/pi/relevant-memory/types.ts +14 -0
  241. package/src/pi/semantic/constants.ts +3 -0
  242. package/src/pi/semantic/index.ts +2 -0
  243. package/src/pi/semantic/runtime.ts +59 -0
  244. package/src/pi/session-start/constants.ts +7 -0
  245. package/src/pi/session-start/index.ts +3 -0
  246. package/src/pi/session-start/session-start.ts +48 -0
  247. package/src/pi/session-start/types.ts +5 -0
  248. package/src/pi/shell-edit-guard/guard.ts +41 -0
  249. package/src/pi/shell-edit-guard/index.ts +3 -0
  250. package/src/pi/shell-edit-guard/prompt.ts +30 -0
  251. package/src/pi/shell-edit-guard/types.ts +13 -0
  252. package/src/pi/types.ts +44 -0
  253. package/src/pi/vault-guard/constants.ts +1 -0
  254. package/src/pi/vault-guard/index.ts +4 -0
  255. package/src/pi/vault-guard/request.ts +39 -0
  256. package/src/pi/vault-guard/types.ts +5 -0
  257. package/src/pi/vault-guard/vault-guard.ts +21 -0
  258. package/src/services/capture-cadence/domain-rules.ts +8 -0
  259. package/src/services/capture-cadence/index.ts +1 -0
  260. package/src/services/clock/clock.ts +7 -0
  261. package/src/services/clock/index.ts +1 -0
  262. package/src/services/config/canonicalize.ts +163 -0
  263. package/src/services/config/constants.ts +1 -0
  264. package/src/services/config/fully-qualified-path.ts +14 -0
  265. package/src/services/config/index.ts +12 -0
  266. package/src/services/config/path-identity.ts +65 -0
  267. package/src/services/config/publication.ts +75 -0
  268. package/src/services/config/read.ts +47 -0
  269. package/src/services/config/registration.ts +26 -0
  270. package/src/services/config/resolve-input.ts +27 -0
  271. package/src/services/config/snapshot.ts +26 -0
  272. package/src/services/config/target.ts +2 -0
  273. package/src/services/config/types.ts +97 -0
  274. package/src/services/config/vault-access.ts +2 -0
  275. package/src/services/config/volume-namespace.ts +5 -0
  276. package/src/services/config/write.ts +63 -0
  277. package/src/services/decision-model/constants.ts +16 -0
  278. package/src/services/decision-model/decide.ts +42 -0
  279. package/src/services/decision-model/diagnostics.ts +6 -0
  280. package/src/services/decision-model/endpoint.ts +1 -0
  281. package/src/services/decision-model/failure-detail.ts +1 -0
  282. package/src/services/decision-model/index.ts +7 -0
  283. package/src/services/decision-model/interruption.ts +29 -0
  284. package/src/services/decision-model/jev.ts +61 -0
  285. package/src/services/decision-model/laya-batch.ts +64 -0
  286. package/src/services/decision-model/laya-http-failure.ts +41 -0
  287. package/src/services/decision-model/laya-response.ts +95 -0
  288. package/src/services/decision-model/laya.ts +35 -0
  289. package/src/services/decision-model/preflight.ts +24 -0
  290. package/src/services/decision-model/prompts.ts +36 -0
  291. package/src/services/decision-model/schemas.ts +43 -0
  292. package/src/services/decision-model/score-candidates.ts +41 -0
  293. package/src/services/decision-model/types.ts +182 -0
  294. package/src/services/embeddings/asset-download.ts +45 -0
  295. package/src/services/embeddings/asset-fetch.ts +39 -0
  296. package/src/services/embeddings/asset-inspection.ts +36 -0
  297. package/src/services/embeddings/batch.ts +32 -0
  298. package/src/services/embeddings/chunks.ts +80 -0
  299. package/src/services/embeddings/configuration.ts +8 -0
  300. package/src/services/embeddings/constants.ts +24 -0
  301. package/src/services/embeddings/errors.ts +11 -0
  302. package/src/services/embeddings/google.ts +90 -0
  303. package/src/services/embeddings/http.ts +64 -0
  304. package/src/services/embeddings/index.ts +17 -0
  305. package/src/services/embeddings/inference.ts +35 -0
  306. package/src/services/embeddings/local.ts +138 -0
  307. package/src/services/embeddings/model-asset.ts +68 -0
  308. package/src/services/embeddings/model-cache.ts +30 -0
  309. package/src/services/embeddings/openai.ts +64 -0
  310. package/src/services/embeddings/operation.ts +31 -0
  311. package/src/services/embeddings/responses.ts +41 -0
  312. package/src/services/embeddings/runtime.ts +13 -0
  313. package/src/services/embeddings/schemas.ts +53 -0
  314. package/src/services/embeddings/types.ts +116 -0
  315. package/src/services/id/id.ts +5 -0
  316. package/src/services/id/index.ts +1 -0
  317. package/src/services/index.ts +11 -0
  318. package/src/services/llm/capture.ts +19 -0
  319. package/src/services/llm/check-chat-models.ts +38 -0
  320. package/src/services/llm/complete.ts +57 -0
  321. package/src/services/llm/constants.ts +32 -0
  322. package/src/services/llm/domain-rules.ts +2 -0
  323. package/src/services/llm/index.ts +6 -0
  324. package/src/services/llm/lifetime.ts +16 -0
  325. package/src/services/llm/retrieve.ts +19 -0
  326. package/src/services/llm/schemas.ts +9 -0
  327. package/src/services/llm/types.ts +94 -0
  328. package/src/services/search-index/catalog-query.ts +34 -0
  329. package/src/services/search-index/catalog-statements.ts +33 -0
  330. package/src/services/search-index/catalog.ts +19 -0
  331. package/src/services/search-index/cleanup.ts +13 -0
  332. package/src/services/search-index/close.ts +5 -0
  333. package/src/services/search-index/constants.ts +102 -0
  334. package/src/services/search-index/dont-forget.ts +1 -0
  335. package/src/services/search-index/fingerprint.ts +17 -0
  336. package/src/services/search-index/folder-index-statements.ts +17 -0
  337. package/src/services/search-index/folder-index-storage.ts +54 -0
  338. package/src/services/search-index/folder-indexes.ts +13 -0
  339. package/src/services/search-index/index.ts +14 -0
  340. package/src/services/search-index/inspection.ts +1 -0
  341. package/src/services/search-index/inventory.ts +67 -0
  342. package/src/services/search-index/legacy.ts +64 -0
  343. package/src/services/search-index/location.ts +12 -0
  344. package/src/services/search-index/open.ts +46 -0
  345. package/src/services/search-index/query.ts +39 -0
  346. package/src/services/search-index/ranking.ts +12 -0
  347. package/src/services/search-index/reconcile.ts +93 -0
  348. package/src/services/search-index/recovery.ts +56 -0
  349. package/src/services/search-index/refusals.ts +21 -0
  350. package/src/services/search-index/schema.ts +42 -0
  351. package/src/services/search-index/schemas.ts +181 -0
  352. package/src/services/search-index/search.ts +5 -0
  353. package/src/services/search-index/statements.ts +18 -0
  354. package/src/services/search-index/storage.ts +207 -0
  355. package/src/services/search-index/types.ts +113 -0
  356. package/src/services/search-index/vector-statements.ts +18 -0
  357. package/src/services/search-index/vector-storage.ts +169 -0
  358. package/src/services/search-index/vectors.ts +18 -0
  359. package/src/services/search-index/write.ts +9 -0
  360. package/src/services/shell-edit/ask.ts +53 -0
  361. package/src/services/shell-edit/domain-rules.ts +2 -0
  362. package/src/services/shell-edit/index.ts +4 -0
  363. package/src/services/shell-edit/schemas.ts +23 -0
  364. package/src/services/shell-edit/types.ts +61 -0
  365. package/src/services/shell-scripts/constants.ts +1 -0
  366. package/src/services/shell-scripts/files.ts +16 -0
  367. package/src/services/shell-scripts/index.ts +5 -0
  368. package/src/services/shell-scripts/package-scripts.ts +74 -0
  369. package/src/services/shell-scripts/schemas.ts +3 -0
  370. package/src/services/shell-scripts/scripts.ts +27 -0
  371. package/src/services/shell-scripts/types.ts +11 -0
  372. package/src/services/vault/archive.ts +31 -0
  373. package/src/services/vault/bootstrap/ensure.ts +50 -0
  374. package/src/services/vault/bootstrap/index.ts +2 -0
  375. package/src/services/vault/bootstrap/paths.ts +57 -0
  376. package/src/services/vault/bootstrap/types.ts +17 -0
  377. package/src/services/vault/bootstrap/write.ts +47 -0
  378. package/src/services/vault/catalog/bytes.ts +51 -0
  379. package/src/services/vault/catalog/dont-forget.ts +1 -0
  380. package/src/services/vault/catalog/enumerate.ts +69 -0
  381. package/src/services/vault/catalog/export.ts +21 -0
  382. package/src/services/vault/catalog/failures.ts +16 -0
  383. package/src/services/vault/catalog/index.ts +10 -0
  384. package/src/services/vault/catalog/inspect.ts +41 -0
  385. package/src/services/vault/catalog/observe.ts +35 -0
  386. package/src/services/vault/catalog/resolve.ts +94 -0
  387. package/src/services/vault/catalog/stat.ts +23 -0
  388. package/src/services/vault/catalog/types.ts +69 -0
  389. package/src/services/vault/catalog/visit.ts +58 -0
  390. package/src/services/vault/complete-blank.ts +66 -0
  391. package/src/services/vault/constants.ts +3 -0
  392. package/src/services/vault/context/index.ts +1 -0
  393. package/src/services/vault/context/types.ts +10 -0
  394. package/src/services/vault/create.ts +19 -0
  395. package/src/services/vault/display.ts +6 -0
  396. package/src/services/vault/domain-rules.ts +10 -0
  397. package/src/services/vault/draft.ts +2 -0
  398. package/src/services/vault/filesystem/failures.ts +53 -0
  399. package/src/services/vault/filesystem/hash.ts +5 -0
  400. package/src/services/vault/filesystem/index.ts +5 -0
  401. package/src/services/vault/filesystem/read.ts +61 -0
  402. package/src/services/vault/filesystem/types.ts +36 -0
  403. package/src/services/vault/filesystem/write.ts +80 -0
  404. package/src/services/vault/find.ts +27 -0
  405. package/src/services/vault/folder-contents.ts +31 -0
  406. package/src/services/vault/folder-index/index.ts +2 -0
  407. package/src/services/vault/folder-index/read.ts +87 -0
  408. package/src/services/vault/folder-index/types.ts +19 -0
  409. package/src/services/vault/folder-listing.ts +1 -0
  410. package/src/services/vault/index.ts +21 -0
  411. package/src/services/vault/inspect-folder.ts +13 -0
  412. package/src/services/vault/list.ts +121 -0
  413. package/src/services/vault/memory-folder.ts +24 -0
  414. package/src/services/vault/paths.ts +11 -0
  415. package/src/services/vault/publish.ts +52 -0
  416. package/src/services/vault/read.ts +46 -0
  417. package/src/services/vault/refresh-folders.ts +197 -0
  418. package/src/services/vault/refresh-plan.ts +79 -0
  419. package/src/services/vault/refresh.ts +8 -0
  420. package/src/services/vault/refusals.ts +23 -0
  421. package/src/services/vault/relocate.ts +131 -0
  422. package/src/services/vault/relocation-checks.ts +89 -0
  423. package/src/services/vault/resolve-stored-file.ts +43 -0
  424. package/src/services/vault/resolve.ts +109 -0
  425. package/src/services/vault/succeed.ts +45 -0
  426. package/src/services/vault/types.ts +199 -0
  427. package/src/services/vault/update-file.ts +58 -0
  428. package/src/services/vault/update.ts +22 -0
  429. package/src/services/vault/write-new-file.ts +37 -0
  430. package/src/shared/index.ts +1 -0
  431. package/src/shared/result/index.ts +1 -0
  432. package/src/shared/result/types.ts +17 -0
  433. package/src/usecases/add-memory/add-memory.ts +83 -0
  434. package/src/usecases/add-memory/index.ts +4 -0
  435. package/src/usecases/add-memory/maintenance.ts +23 -0
  436. package/src/usecases/add-memory/schemas.ts +12 -0
  437. package/src/usecases/add-memory/types.ts +47 -0
  438. package/src/usecases/archive-memory/archive-memory.ts +27 -0
  439. package/src/usecases/archive-memory/index.ts +3 -0
  440. package/src/usecases/archive-memory/schemas.ts +11 -0
  441. package/src/usecases/archive-memory/types.ts +17 -0
  442. package/src/usecases/capture-memory/apply.ts +73 -0
  443. package/src/usecases/capture-memory/capture-memory.ts +117 -0
  444. package/src/usecases/capture-memory/constants.ts +15 -0
  445. package/src/usecases/capture-memory/index.ts +5 -0
  446. package/src/usecases/capture-memory/observe.ts +122 -0
  447. package/src/usecases/capture-memory/settings.ts +20 -0
  448. package/src/usecases/capture-memory/types.ts +103 -0
  449. package/src/usecases/check-shell-edit/check-shell-edit.ts +28 -0
  450. package/src/usecases/check-shell-edit/index.ts +2 -0
  451. package/src/usecases/check-shell-edit/types.ts +30 -0
  452. package/src/usecases/check-vault-access/check-vault-access.ts +23 -0
  453. package/src/usecases/check-vault-access/constants.ts +7 -0
  454. package/src/usecases/check-vault-access/index.ts +4 -0
  455. package/src/usecases/check-vault-access/raw-device.ts +10 -0
  456. package/src/usecases/check-vault-access/targets.ts +49 -0
  457. package/src/usecases/check-vault-access/types.ts +33 -0
  458. package/src/usecases/complete-blank-memory/complete-blank-memory.ts +48 -0
  459. package/src/usecases/complete-blank-memory/constants.ts +3 -0
  460. package/src/usecases/complete-blank-memory/index.ts +4 -0
  461. package/src/usecases/complete-blank-memory/schemas.ts +14 -0
  462. package/src/usecases/complete-blank-memory/types.ts +28 -0
  463. package/src/usecases/diagnose-memory/constants.ts +3 -0
  464. package/src/usecases/diagnose-memory/decision.ts +36 -0
  465. package/src/usecases/diagnose-memory/diagnose-memory.ts +52 -0
  466. package/src/usecases/diagnose-memory/embeddings.ts +39 -0
  467. package/src/usecases/diagnose-memory/index.ts +5 -0
  468. package/src/usecases/diagnose-memory/types.ts +86 -0
  469. package/src/usecases/diagnose-memory/vault.ts +33 -0
  470. package/src/usecases/export-memory/collect.ts +20 -0
  471. package/src/usecases/export-memory/constants.ts +3 -0
  472. package/src/usecases/export-memory/export-memory.ts +84 -0
  473. package/src/usecases/export-memory/index.ts +3 -0
  474. package/src/usecases/export-memory/types.ts +28 -0
  475. package/src/usecases/get-memory/get-memory.ts +97 -0
  476. package/src/usecases/get-memory/index.ts +2 -0
  477. package/src/usecases/get-memory/types.ts +25 -0
  478. package/src/usecases/index.ts +25 -0
  479. package/src/usecases/list-memory/index.ts +2 -0
  480. package/src/usecases/list-memory/leased/index.ts +2 -0
  481. package/src/usecases/list-memory/leased/read.ts +16 -0
  482. package/src/usecases/list-memory/leased/types.ts +21 -0
  483. package/src/usecases/list-memory/list-memory.ts +33 -0
  484. package/src/usecases/list-memory/types.ts +8 -0
  485. package/src/usecases/load-dont-forget/index.ts +2 -0
  486. package/src/usecases/load-dont-forget/load-dont-forget.ts +111 -0
  487. package/src/usecases/load-dont-forget/types.ts +26 -0
  488. package/src/usecases/memory-change/change.ts +42 -0
  489. package/src/usecases/memory-change/index.ts +5 -0
  490. package/src/usecases/memory-change/maintenance.ts +11 -0
  491. package/src/usecases/memory-change/partial.ts +18 -0
  492. package/src/usecases/memory-change/receipt.ts +40 -0
  493. package/src/usecases/memory-change/types.ts +44 -0
  494. package/src/usecases/operation-context/context.ts +37 -0
  495. package/src/usecases/operation-context/index.ts +2 -0
  496. package/src/usecases/operation-context/types.ts +19 -0
  497. package/src/usecases/registration/check.ts +6 -0
  498. package/src/usecases/registration/entry.ts +33 -0
  499. package/src/usecases/registration/index.ts +8 -0
  500. package/src/usecases/registration/init.ts +94 -0
  501. package/src/usecases/registration/prepare-init.ts +43 -0
  502. package/src/usecases/registration/prepare.ts +35 -0
  503. package/src/usecases/registration/propose.ts +34 -0
  504. package/src/usecases/registration/publication.ts +90 -0
  505. package/src/usecases/registration/setup.ts +41 -0
  506. package/src/usecases/registration/types.ts +107 -0
  507. package/src/usecases/relevant-memory/agent.ts +55 -0
  508. package/src/usecases/relevant-memory/constants.ts +28 -0
  509. package/src/usecases/relevant-memory/cutoffs.ts +29 -0
  510. package/src/usecases/relevant-memory/decision.ts +102 -0
  511. package/src/usecases/relevant-memory/index.ts +11 -0
  512. package/src/usecases/relevant-memory/loaded.ts +31 -0
  513. package/src/usecases/relevant-memory/refresh.ts +30 -0
  514. package/src/usecases/relevant-memory/retrieve-memory.ts +62 -0
  515. package/src/usecases/relevant-memory/schemas.ts +20 -0
  516. package/src/usecases/relevant-memory/session-memory.ts +53 -0
  517. package/src/usecases/relevant-memory/track-dont-forget.ts +13 -0
  518. package/src/usecases/relevant-memory/types.ts +106 -0
  519. package/src/usecases/resolve-memory/index.ts +2 -0
  520. package/src/usecases/resolve-memory/leased/index.ts +2 -0
  521. package/src/usecases/resolve-memory/leased/resolve.ts +109 -0
  522. package/src/usecases/resolve-memory/leased/types.ts +35 -0
  523. package/src/usecases/resolve-memory/resolve-memory.ts +23 -0
  524. package/src/usecases/resolve-memory/types.ts +7 -0
  525. package/src/usecases/search-memory/constants.ts +1 -0
  526. package/src/usecases/search-memory/index.ts +3 -0
  527. package/src/usecases/search-memory/search-memory.ts +132 -0
  528. package/src/usecases/search-memory/types.ts +39 -0
  529. package/src/usecases/semantic/constants.ts +7 -0
  530. package/src/usecases/semantic/index.ts +5 -0
  531. package/src/usecases/semantic/prepare.ts +30 -0
  532. package/src/usecases/semantic/rank.ts +83 -0
  533. package/src/usecases/semantic/refresh-vectors.ts +95 -0
  534. package/src/usecases/semantic/types.ts +17 -0
  535. package/src/usecases/semantic-port/index.ts +1 -0
  536. package/src/usecases/semantic-port/types.ts +20 -0
  537. package/src/usecases/semantic-provider/constants.ts +6 -0
  538. package/src/usecases/semantic-provider/index.ts +5 -0
  539. package/src/usecases/semantic-provider/local.ts +33 -0
  540. package/src/usecases/semantic-provider/remote.ts +10 -0
  541. package/src/usecases/semantic-provider/size.ts +10 -0
  542. package/src/usecases/semantic-provider/types.ts +19 -0
  543. package/src/usecases/session/index.ts +2 -0
  544. package/src/usecases/session/lease.ts +70 -0
  545. package/src/usecases/session/receipts.ts +46 -0
  546. package/src/usecases/session/state.ts +106 -0
  547. package/src/usecases/session/types.ts +45 -0
  548. package/src/usecases/settings/change.ts +142 -0
  549. package/src/usecases/settings/index.ts +3 -0
  550. package/src/usecases/settings/prepare.ts +24 -0
  551. package/src/usecases/settings/types.ts +32 -0
  552. package/src/usecases/succeed-memory/index.ts +3 -0
  553. package/src/usecases/succeed-memory/schemas.ts +13 -0
  554. package/src/usecases/succeed-memory/succeed-memory.ts +34 -0
  555. package/src/usecases/succeed-memory/types.ts +18 -0
  556. package/src/usecases/synchronize-memory/index.ts +2 -0
  557. package/src/usecases/synchronize-memory/leased/aliases.ts +55 -0
  558. package/src/usecases/synchronize-memory/leased/folder-states.ts +58 -0
  559. package/src/usecases/synchronize-memory/leased/index.ts +2 -0
  560. package/src/usecases/synchronize-memory/leased/inspection.ts +32 -0
  561. package/src/usecases/synchronize-memory/leased/maintenance.ts +41 -0
  562. package/src/usecases/synchronize-memory/leased/publication.ts +55 -0
  563. package/src/usecases/synchronize-memory/leased/scan.ts +37 -0
  564. package/src/usecases/synchronize-memory/leased/synchronize.ts +102 -0
  565. package/src/usecases/synchronize-memory/leased/types.ts +60 -0
  566. package/src/usecases/synchronize-memory/synchronize-memory.ts +26 -0
  567. package/src/usecases/synchronize-memory/types.ts +5 -0
  568. package/src/usecases/update-memory/index.ts +3 -0
  569. package/src/usecases/update-memory/schemas.ts +14 -0
  570. package/src/usecases/update-memory/types.ts +16 -0
  571. package/src/usecases/update-memory/update-memory.ts +31 -0
  572. package/CHANGELOG.md +0 -21
@@ -0,0 +1,117 @@
1
+ import {
2
+ type CaptureAction,
3
+ type CaptureObservation,
4
+ type CompletionPort,
5
+ captureStep,
6
+ type ReadObservation,
7
+ refusalObservation,
8
+ type TranscriptMessage,
9
+ } from "#src/services"
10
+ import { type MemoryOperationContext, memoryOperationInterruption } from "#src/usecases/operation-context"
11
+ import { resolveMemory } from "#src/usecases/resolve-memory"
12
+ import { applyWrite } from "./apply.ts"
13
+ import { INTERRUPTED } from "./constants.ts"
14
+ import { observeGet, observeList, observeRead, observeSearch } from "./observe.ts"
15
+ import type {
16
+ CaptureBase,
17
+ CaptureFailure,
18
+ CaptureMemoryResult,
19
+ CaptureReport,
20
+ CaptureRun,
21
+ NextStep,
22
+ ReviewTools,
23
+ WriteAction,
24
+ } from "./types.ts"
25
+
26
+ export async function captureMemory(
27
+ run: CaptureRun,
28
+ context: MemoryOperationContext,
29
+ complete: CompletionPort,
30
+ ): Promise<CaptureMemoryResult> {
31
+ const resolved = await resolveMemory(context)
32
+ if (!resolved.succeeded) {
33
+ if (memoryOperationInterruption(context)) {
34
+ return {
35
+ succeeded: false,
36
+ reason: "interrupted",
37
+ problems: [INTERRUPTED],
38
+ report: { reviewed: false, applied: [] },
39
+ }
40
+ }
41
+ return resolved
42
+ }
43
+ const { config, project } = resolved.output
44
+ const explicitSaves: ReadObservation[] = []
45
+ for (const save of run.explicitSaves) {
46
+ const read = await observeRead(save, context)
47
+ if (typeof read !== "string") explicitSaves.push(read)
48
+ }
49
+ let projectName: string | null = null
50
+ if (project) projectName = project.vault.name
51
+ const base: CaptureBase = {
52
+ context: { project: projectName, folder: context.workingFolder },
53
+ explicitSaves,
54
+ limits: { maxBodyChars: config.limits.maxBodyChars, maxStatementChars: config.limits.maxStatementChars },
55
+ model: config.capture.model,
56
+ signal: context.signal,
57
+ }
58
+ const report: CaptureReport = { reviewed: false, applied: [] }
59
+ const tools: ReviewTools = { context, complete, report }
60
+ if (run.messages.length > 0) {
61
+ report.reviewed = true
62
+ const failure = await reviewTranscript(run.messages, base, tools)
63
+ if (failure) return failure
64
+ }
65
+ return { succeeded: true, output: report }
66
+ }
67
+
68
+ async function reviewTranscript(
69
+ transcriptDelta: TranscriptMessage[],
70
+ base: CaptureBase,
71
+ tools: ReviewTools,
72
+ ): Promise<CaptureFailure | null> {
73
+ const observations: CaptureObservation[] = []
74
+ for (;;) {
75
+ if (memoryOperationInterruption(tools.context)) return failureOf("interrupted", [INTERRUPTED], tools)
76
+ const step = await captureStep({ ...base, transcriptDelta, observations }, tools.complete)
77
+ if (!step.succeeded && "modelCall" in step) {
78
+ if (memoryOperationInterruption(tools.context)) return failureOf("interrupted", [INTERRUPTED], tools)
79
+ return failureOf("model-failed", step.problems, tools)
80
+ }
81
+ if (!step.succeeded) {
82
+ observations.push(refusalObservation(step.problems))
83
+ continue
84
+ }
85
+ if ((await act(step.output, observations, tools)) === "stop") return endOfReview(tools)
86
+ }
87
+ }
88
+
89
+ function endOfReview(tools: ReviewTools): CaptureFailure | null {
90
+ if (memoryOperationInterruption(tools.context)) return failureOf("interrupted", [INTERRUPTED], tools)
91
+ return null
92
+ }
93
+
94
+ async function act(action: CaptureAction, observations: CaptureObservation[], tools: ReviewTools): Promise<NextStep> {
95
+ const { context } = tools
96
+ if (action.action === "finish") return "stop"
97
+ if (action.action === "search") {
98
+ observations.push(await observeSearch(action.vault, action.query, context))
99
+ } else if (action.action === "get") {
100
+ observations.push(await observeGet({ vault: action.vault, path: action.path }, context))
101
+ } else if (action.action === "list") {
102
+ observations.push(await observeList(action.vault, action.folder, context))
103
+ } else {
104
+ await write(action, observations, tools)
105
+ }
106
+ return "continue"
107
+ }
108
+
109
+ async function write(action: WriteAction, observations: CaptureObservation[], tools: ReviewTools): Promise<void> {
110
+ const applied = await applyWrite(action, tools.context)
111
+ tools.report.applied.push(applied)
112
+ observations.push({ kind: "write", ...applied })
113
+ }
114
+
115
+ function failureOf(reason: CaptureFailure["reason"], problems: string[], tools: ReviewTools): CaptureFailure {
116
+ return { succeeded: false, reason, problems, report: tools.report }
117
+ }
@@ -0,0 +1,15 @@
1
+ export const NO_DETAIL = "No further detail"
2
+
3
+ export const SOURCE_CALL = "capture"
4
+
5
+ export const DONT_FORGET_MARK = "don't forget"
6
+
7
+ export const SUBFOLDER_LINE = /^- \[\[(.+)\/index\|[^\]]*\]\]$/
8
+
9
+ export const NOTE_LINE = /^- \[\[([^|\]]+)\|([^\]]+)\]\] · ([a-z]+)(?: · (.*))?$/
10
+
11
+ export const CHANGED_SINCE_READ = "The note changed since it was read; read it again before changing it"
12
+
13
+ export const DIFFERENT_NOTE = "The note is not the one that was read (its id differs); read it again"
14
+
15
+ export const INTERRUPTED = "Capture was interrupted before it finished"
@@ -0,0 +1,5 @@
1
+ export * from "./apply.ts"
2
+ export * from "./capture-memory.ts"
3
+ export * from "./observe.ts"
4
+ export * from "./settings.ts"
5
+ export * from "./types.ts"
@@ -0,0 +1,122 @@
1
+ import type { MemoryObservation, ReadObservation } from "#src/services"
2
+ import type { Failed } from "#src/shared"
3
+ import { BLANK_NOTE_TYPES } from "#src/usecases/complete-blank-memory"
4
+ import { getMemory } from "#src/usecases/get-memory"
5
+ import { listMemory } from "#src/usecases/list-memory"
6
+ import type { MemoryOperationContext } from "#src/usecases/operation-context"
7
+ import { searchMemory } from "#src/usecases/search-memory"
8
+ import { DONT_FORGET_MARK, NO_DETAIL, NOTE_LINE, SOURCE_CALL, SUBFOLDER_LINE } from "./constants.ts"
9
+ import type { ExplicitSave, ListedNote, UnreadableNote } from "./types.ts"
10
+
11
+ export async function observeRead(
12
+ save: ExplicitSave,
13
+ context: MemoryOperationContext,
14
+ ): Promise<ReadObservation | string> {
15
+ const read = await observeLoadedNote(save, context)
16
+ if (read.kind === "unreadable") return read.detail
17
+ return read
18
+ }
19
+
20
+ export async function observeLoadedNote(
21
+ save: ExplicitSave,
22
+ context: MemoryOperationContext,
23
+ ): Promise<ReadObservation | UnreadableNote> {
24
+ const result = await getMemory({ vault: save.vault, path: save.path, sourceCallId: SOURCE_CALL }, context)
25
+ if (!result.succeeded) {
26
+ return { kind: "unreadable", existence: existenceAfterFailure(result), detail: detailOf(result.problems) }
27
+ }
28
+ if (result.output.kind !== "note") {
29
+ return { kind: "unreadable", existence: "present", detail: `${save.path} is a folder, not a note` }
30
+ }
31
+ const { file } = result.output
32
+ const { frontmatter, parsed } = file.analysis
33
+ if (!frontmatter) {
34
+ return {
35
+ kind: "unreadable",
36
+ existence: "present",
37
+ detail: `${save.path} has invalid frontmatter and cannot be changed`,
38
+ }
39
+ }
40
+ if (parsed.body.length === 0) return { kind: "unreadable", existence: "present", detail: `${save.path} has no body` }
41
+ return {
42
+ kind: "read",
43
+ vault: save.vault,
44
+ path: save.path,
45
+ id: frontmatter.id,
46
+ hash: file.rawHash,
47
+ statement: parsed.statement,
48
+ body: parsed.body,
49
+ type: frontmatter.type,
50
+ dontForget: "dontForget" in frontmatter,
51
+ }
52
+ }
53
+
54
+ function existenceAfterFailure(failure: Failed): UnreadableNote["existence"] {
55
+ if (!("reason" in failure)) return "unknown"
56
+ if (failure.reason === "not-found" || failure.reason === "not-directory") return "gone"
57
+ if (failure.reason === "unclosed-frontmatter") return "present"
58
+ return "unknown"
59
+ }
60
+
61
+ export async function observeGet(save: ExplicitSave, context: MemoryOperationContext): Promise<MemoryObservation> {
62
+ const read = await observeRead(save, context)
63
+ if (typeof read === "string") return { kind: "unavailable", operation: "get", detail: read }
64
+ return read
65
+ }
66
+
67
+ export async function observeSearch(
68
+ vault: ExplicitSave["vault"],
69
+ query: string,
70
+ context: MemoryOperationContext,
71
+ ): Promise<MemoryObservation> {
72
+ const result = await searchMemory({ query, vault }, context)
73
+ if (!result.succeeded) return { kind: "unavailable", operation: "search", detail: detailOf(result.problems) }
74
+ const found = result.output.vaults.find((entry) => entry.vault === vault)
75
+ if (!found || !("hits" in found)) {
76
+ return { kind: "unavailable", operation: "search", detail: "That vault is not available" }
77
+ }
78
+ const candidates = found.hits.map((hit) => ({
79
+ vault,
80
+ path: hit.path,
81
+ id: hit.id,
82
+ statement: hit.statement,
83
+ snippet: hit.statement,
84
+ }))
85
+ return { kind: "search", query, candidates }
86
+ }
87
+
88
+ export async function observeList(
89
+ vault: ExplicitSave["vault"],
90
+ folder: string,
91
+ context: MemoryOperationContext,
92
+ ): Promise<MemoryObservation> {
93
+ const result = await listMemory({ vault, folder }, context)
94
+ if (!result.succeeded) return { kind: "unavailable", operation: "list", detail: detailOf(result.problems) }
95
+ const lines = result.output.text.split("\n")
96
+ const folders = lines.flatMap(subfolderOf)
97
+ const notes = lines.flatMap((line) => noteOf(vault, line))
98
+ return { kind: "listing", vault, folder, folders, notes }
99
+ }
100
+
101
+ function subfolderOf(line: string): string[] {
102
+ const match = SUBFOLDER_LINE.exec(line)
103
+ if (!match?.[1]) return []
104
+ return [match[1]]
105
+ }
106
+
107
+ function noteOf(vault: ExplicitSave["vault"], line: string): ListedNote[] {
108
+ const match = NOTE_LINE.exec(line)
109
+ if (!match) return []
110
+ const [, target, statement, name, rest] = match
111
+ const type = BLANK_NOTE_TYPES.find((candidate) => candidate === name)
112
+ if (!target || !statement || !type) return []
113
+ const listed: ListedNote = { vault, path: `${target}.md`, type, statement }
114
+ if (typeof rest === "string" && rest.toLowerCase().includes(DONT_FORGET_MARK)) listed.dontForget = true
115
+ return [listed]
116
+ }
117
+
118
+ export function detailOf(problems: string[]): string {
119
+ const joined = problems.join("; ")
120
+ if (joined === "") return NO_DETAIL
121
+ return joined
122
+ }
@@ -0,0 +1,20 @@
1
+ import type { MemoryOperationContext } from "#src/usecases/operation-context"
2
+ import { resolveMemory } from "#src/usecases/resolve-memory"
3
+ import type { CaptureSettingsResult } from "./types.ts"
4
+
5
+ export async function captureSettings(context: MemoryOperationContext): Promise<CaptureSettingsResult> {
6
+ const resolved = await resolveMemory(context)
7
+ if (!resolved.succeeded) return resolved
8
+ const { capture } = resolved.output.config
9
+ return {
10
+ succeeded: true,
11
+ output: {
12
+ nudgeInterval: capture.nudgeInterval,
13
+ nudgeToolCalls: capture.nudgeToolCalls,
14
+ flushMinTurns: capture.flushMinTurns,
15
+ reviewEnabled: capture.reviewEnabled,
16
+ flushOnCompact: capture.flushOnCompact,
17
+ flushOnShutdown: capture.flushOnShutdown,
18
+ },
19
+ }
20
+ }
@@ -0,0 +1,103 @@
1
+ import type {
2
+ CaptureAction,
3
+ CaptureCadenceSettings,
4
+ CaptureInput,
5
+ CaptureObservation,
6
+ ChatModelReference,
7
+ CompletionPort,
8
+ MemoryScope,
9
+ ReadObservation,
10
+ TranscriptMessage,
11
+ } from "#src/services"
12
+ import type { Failed, Succeeded } from "#src/shared"
13
+ import type { ArchiveMemoryResult } from "#src/usecases/archive-memory"
14
+ import type { MemoryOperationContext } from "#src/usecases/operation-context"
15
+ import type { MemoryResolutionRefusal } from "#src/usecases/resolve-memory"
16
+ import type { SucceedMemoryResult } from "#src/usecases/succeed-memory"
17
+ import type { UpdateMemoryResult } from "#src/usecases/update-memory"
18
+
19
+ export type {
20
+ CaptureCadenceSettings,
21
+ CaptureTally,
22
+ CompletionPort,
23
+ CompletionRequest,
24
+ FinishedTurn,
25
+ FlushMoment,
26
+ TranscriptMessage,
27
+ TurnOutcome,
28
+ } from "#src/services"
29
+ export { EMPTY_TALLY, shouldFlush, tallyTurn, tallyUserMessage } from "#src/services"
30
+
31
+ export interface ExplicitSave {
32
+ vault: MemoryScope
33
+ path: string
34
+ }
35
+
36
+ export type CaptureSettingsResult = Succeeded<CaptureCadenceSettings> | MemoryResolutionRefusal
37
+
38
+ export interface UnreadableNote {
39
+ kind: "unreadable"
40
+ existence: "gone" | "present" | "unknown"
41
+ detail: string
42
+ }
43
+
44
+ export interface CaptureRun {
45
+ messages: TranscriptMessage[]
46
+ explicitSaves: ExplicitSave[]
47
+ }
48
+
49
+ export interface AppliedWrite {
50
+ operation: "add" | "update" | "archive" | "succeed"
51
+ status: "applied" | "conflict" | "refused"
52
+ vault: MemoryScope
53
+ path: string
54
+ detail: string
55
+ }
56
+
57
+ export interface CaptureReport {
58
+ reviewed: boolean
59
+ applied: AppliedWrite[]
60
+ }
61
+
62
+ export interface CaptureFailure extends Failed {
63
+ reason: "model-failed" | "interrupted"
64
+ report: CaptureReport
65
+ }
66
+
67
+ export type CaptureMemoryResult = Succeeded<CaptureReport> | MemoryResolutionRefusal | CaptureFailure
68
+
69
+ export interface NonWriteActions {
70
+ action: "search" | "get" | "list" | "finish"
71
+ }
72
+
73
+ export type WriteAction = Exclude<CaptureAction, NonWriteActions>
74
+
75
+ export type FinishedWrite = UpdateMemoryResult | ArchiveMemoryResult | SucceedMemoryResult
76
+
77
+ export interface CaptureBase {
78
+ context: CaptureInput["context"]
79
+ explicitSaves: ReadObservation[]
80
+ limits: CaptureInput["limits"]
81
+ model: ChatModelReference
82
+ signal: AbortSignal
83
+ }
84
+
85
+ export interface ReviewTools {
86
+ context: MemoryOperationContext
87
+ complete: CompletionPort
88
+ report: CaptureReport
89
+ }
90
+
91
+ export type NextStep = "continue" | "stop"
92
+
93
+ export interface ListingDiscriminant {
94
+ kind: "listing"
95
+ }
96
+
97
+ export type ListedNote = Extract<CaptureObservation, ListingDiscriminant>["notes"][number]
98
+
99
+ export interface ChangeDiscriminant {
100
+ action: "update" | "archive" | "succeed"
101
+ }
102
+
103
+ export type ChangeAction = Extract<WriteAction, ChangeDiscriminant>
@@ -0,0 +1,28 @@
1
+ import {
2
+ askShellEdit,
3
+ defaultJevModel,
4
+ executedFiles,
5
+ firedQuestions,
6
+ readExecutedScripts,
7
+ SHELL_EDIT_CUTOFFS,
8
+ shellEditRefusal,
9
+ shellEditUncheckable,
10
+ } from "#src/services"
11
+ import type { CheckShellEditResult, ShellEditCommand, ShellEditDeps } from "./types.ts"
12
+
13
+ export async function checkShellEdit(input: ShellEditCommand, deps: ShellEditDeps): Promise<CheckShellEditResult> {
14
+ const read = await readExecutedScripts(input.cwd, executedFiles(input.command))
15
+ if (!read.succeeded) return refused(shellEditUncheckable(read.problems.join("; ")))
16
+ const jev = await deps.jev(defaultJevModel)
17
+ if (!jev.available) return refused(shellEditUncheckable(jev.reason))
18
+ const state = { command: input.command, cwd: input.cwd, scripts: read.output.scripts, missing: read.output.missing }
19
+ const asked = await askShellEdit({ classifier: jev.classifier, state, signal: deps.signal })
20
+ if (!asked.succeeded) return refused(shellEditUncheckable(asked.problems.join("; ")))
21
+ const [first, ...rest] = firedQuestions(asked.output.scores, SHELL_EDIT_CUTOFFS)
22
+ if (first) return refused(shellEditRefusal([first, ...rest]))
23
+ return { succeeded: true }
24
+ }
25
+
26
+ function refused(problem: string): CheckShellEditResult {
27
+ return { succeeded: false, problems: [problem] }
28
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./check-shell-edit.ts"
2
+ export * from "./types.ts"
@@ -0,0 +1,30 @@
1
+ export type { ShellEditPrompt, ShellEditQuestion } from "#src/services"
2
+
3
+ import type { ShellEditClassifierPort } from "#src/services"
4
+ import type { Done, Failed } from "#src/shared"
5
+
6
+ export interface ShellEditCommand {
7
+ command: string
8
+ cwd: string
9
+ }
10
+
11
+ export interface ShellEditJevAvailable {
12
+ available: true
13
+ classifier: ShellEditClassifierPort
14
+ }
15
+
16
+ export interface ShellEditJevMissing {
17
+ available: false
18
+ reason: string
19
+ }
20
+
21
+ export type ShellEditJev = ShellEditJevAvailable | ShellEditJevMissing
22
+
23
+ export type ShellEditJevSource = (modelId: string) => Promise<ShellEditJev>
24
+
25
+ export interface ShellEditDeps {
26
+ jev: ShellEditJevSource
27
+ signal: AbortSignal
28
+ }
29
+
30
+ export type CheckShellEditResult = Done | Failed
@@ -0,0 +1,23 @@
1
+ import { readConfig, VAULT_ACCESS_REFUSAL } from "#src/services"
2
+ import { isRawDevicePath } from "./raw-device.ts"
3
+ import { guardedTargets, hitsTargets } from "./targets.ts"
4
+ import type { CheckVaultAccessInput, CheckVaultAccessResult } from "./types.ts"
5
+
6
+ export async function checkVaultAccess(input: CheckVaultAccessInput): Promise<CheckVaultAccessResult> {
7
+ const { request, cwd, home, platform } = input
8
+ const config = await readConfig(input.configPath, platform)
9
+ if (!config.succeeded) return allowed()
10
+ const written = [config.output.global.vault, ...config.output.projects.map((project) => project.vault)]
11
+ if (request.kind !== "command" && isRawDevicePath(request.path, cwd, platform)) return refusal()
12
+ const targets = await guardedTargets(written)
13
+ if (await hitsTargets({ request, cwd, home, platform, targets })) return refusal()
14
+ return allowed()
15
+ }
16
+
17
+ function refusal(): CheckVaultAccessResult {
18
+ return { succeeded: false, reason: "vault-access", problems: [VAULT_ACCESS_REFUSAL] }
19
+ }
20
+
21
+ function allowed(): CheckVaultAccessResult {
22
+ return { succeeded: true }
23
+ }
@@ -0,0 +1,7 @@
1
+ export const NO_FILE_ID = "0"
2
+
3
+ export const POSIX_PROCESS_RELATIVE_PATH = /^\/(?:proc\/(?:self\/fd|\d+\/root)|dev\/fd)(?:\/|$)/
4
+
5
+ export const NAMESPACE_PATH_START = /^\\\\[?.]\\/
6
+
7
+ export const NAMED_FILE_UNDER_ROOT = /^\\\\[?.]\\(?:[a-z]:|UNC|Volume\{[^}]+\})\\[^\\]/i
@@ -0,0 +1,4 @@
1
+ export * from "./check-vault-access.ts"
2
+ export * from "./raw-device.ts"
3
+ export * from "./targets.ts"
4
+ export * from "./types.ts"
@@ -0,0 +1,10 @@
1
+ import { posix, win32 } from "node:path"
2
+
3
+ import { NAMED_FILE_UNDER_ROOT, NAMESPACE_PATH_START, POSIX_PROCESS_RELATIVE_PATH } from "./constants.ts"
4
+ import type { PathPlatform } from "./types.ts"
5
+
6
+ export function isRawDevicePath(path: string, cwd: string, platform: PathPlatform): boolean {
7
+ if (platform !== "win32") return POSIX_PROCESS_RELATIVE_PATH.test(posix.resolve(cwd, path))
8
+ const resolved = win32.resolve(cwd, path)
9
+ return NAMESPACE_PATH_START.test(resolved) && !NAMED_FILE_UNDER_ROOT.test(resolved)
10
+ }
@@ -0,0 +1,49 @@
1
+ import {
2
+ absoluteCandidate,
3
+ canonicalizeAccessPath,
4
+ fileIdentity,
5
+ type PathIdentity,
6
+ pathIdentities,
7
+ vaultAccessRefusal,
8
+ } from "#src/services"
9
+ import { NAMESPACE_PATH_START, NO_FILE_ID } from "./constants.ts"
10
+ import type { GuardedTargets, TargetCheck } from "./types.ts"
11
+
12
+ export async function guardedTargets(written: string[]): Promise<GuardedTargets> {
13
+ const roots = [...written]
14
+ const identities: PathIdentity[] = []
15
+ for (const path of written) {
16
+ const canonical = await canonicalizeAccessPath(path)
17
+ if (canonical.succeeded) roots.push(canonical.output)
18
+ const identity = await fileIdentity(path)
19
+ if (identity.succeeded && hasFileId(identity.output)) identities.push(identity.output)
20
+ }
21
+ return { roots, identities }
22
+ }
23
+
24
+ export async function hitsTargets(check: TargetCheck): Promise<boolean> {
25
+ const { request, cwd, home, platform, targets } = check
26
+ if (vaultAccessRefusal(request, cwd, home, targets.roots, platform)) return true
27
+ if (request.kind === "command") return false
28
+ const absolute = absoluteCandidate(request.path, cwd, home, platform)
29
+ const canonical = await canonicalizeAccessPath(absolute)
30
+ if (
31
+ canonical.succeeded &&
32
+ vaultAccessRefusal({ kind: request.kind, path: canonical.output }, cwd, home, targets.roots, platform)
33
+ ) {
34
+ return true
35
+ }
36
+ return sharesIdentity(absolute, targets.identities)
37
+ }
38
+
39
+ async function sharesIdentity(absolute: string, identities: PathIdentity[]): Promise<boolean> {
40
+ const found = await pathIdentities(absolute)
41
+ if (!found.succeeded) return NAMESPACE_PATH_START.test(absolute)
42
+ return found.output
43
+ .filter(hasFileId)
44
+ .some((seen) => identities.some((target) => target.device === seen.device && target.inode === seen.inode))
45
+ }
46
+
47
+ function hasFileId(identity: PathIdentity): boolean {
48
+ return identity.inode !== NO_FILE_ID
49
+ }
@@ -0,0 +1,33 @@
1
+ export type { VaultAccessRequest } from "#src/services"
2
+
3
+ import type { PathIdentity, PathPlatform, VaultAccessRequest } from "#src/services"
4
+ import type { Done, Failed } from "#src/shared"
5
+
6
+ export type { PathPlatform } from "#src/services"
7
+
8
+ export interface CheckVaultAccessInput {
9
+ configPath: string
10
+ cwd: string
11
+ home: string
12
+ platform: PathPlatform
13
+ request: VaultAccessRequest
14
+ }
15
+
16
+ export interface VaultAccessRefusal extends Failed {
17
+ reason: "vault-access"
18
+ }
19
+
20
+ export type CheckVaultAccessResult = Done | VaultAccessRefusal
21
+
22
+ export interface GuardedTargets {
23
+ roots: string[]
24
+ identities: PathIdentity[]
25
+ }
26
+
27
+ export interface TargetCheck {
28
+ request: VaultAccessRequest
29
+ cwd: string
30
+ home: string
31
+ platform: PathPlatform
32
+ targets: GuardedTargets
33
+ }
@@ -0,0 +1,48 @@
1
+ import { completeBlankFile, type Note, newNoteId, refreshIndexes, today } from "#src/services"
2
+ import { refreshWarnings, warningsOf } from "#src/usecases/memory-change"
3
+ import {
4
+ captureMemoryOperationContext,
5
+ type MemoryOperationContext,
6
+ memoryAdmissionRefusal,
7
+ } from "#src/usecases/operation-context"
8
+ import { resolveLeasedMemory, selectMemoryVault } from "#src/usecases/resolve-memory/leased"
9
+ import type { CompleteBlankMemoryRequest, CompleteBlankMemoryResult } from "./types.ts"
10
+
11
+ export async function completeBlankMemory(
12
+ request: CompleteBlankMemoryRequest,
13
+ callerContext: MemoryOperationContext,
14
+ ): Promise<CompleteBlankMemoryResult> {
15
+ const context = captureMemoryOperationContext(callerContext)
16
+ const lease = await context.session.acquire(context.stamp, context.signal)
17
+ if (!lease) return memoryAdmissionRefusal(context)
18
+ try {
19
+ const memory = await resolveLeasedMemory(context)
20
+ if (!memory.succeeded) return memory
21
+ const target = selectMemoryVault(memory.output, request.vault)
22
+ if (!target.succeeded) return target
23
+ const day = today()
24
+ const note: Note = {
25
+ statement: statementOf(request.path),
26
+ frontmatter: { id: newNoteId(), type: request.type, created: day, updated: day },
27
+ body: request.body,
28
+ }
29
+ const completed = await completeBlankFile(target.output.vault, {
30
+ path: request.path,
31
+ expectedHash: request.expectedHash,
32
+ note,
33
+ confirmed: true,
34
+ })
35
+ if (!completed.succeeded) return completed
36
+ const folder = request.path.slice(0, Math.max(0, request.path.lastIndexOf("/")))
37
+ const refreshed = await refreshIndexes(target.output.vault, folder)
38
+ const maintenanceProblems = [...warningsOf(completed), ...refreshWarnings(refreshed)]
39
+ return { succeeded: true, output: { vault: request.vault, path: request.path, maintenanceProblems } }
40
+ } finally {
41
+ lease.release()
42
+ }
43
+ }
44
+
45
+ function statementOf(path: string): string {
46
+ const name = path.slice(path.lastIndexOf("/") + 1)
47
+ return name.slice(0, -".md".length)
48
+ }
@@ -0,0 +1,3 @@
1
+ import { CompleteBlankMemoryRequestSchema } from "./schemas.ts"
2
+
3
+ export const BLANK_NOTE_TYPES = CompleteBlankMemoryRequestSchema.properties.type.enum
@@ -0,0 +1,4 @@
1
+ export * from "./complete-blank-memory.ts"
2
+ export * from "./constants.ts"
3
+ export * from "./schemas.ts"
4
+ export * from "./types.ts"
@@ -0,0 +1,14 @@
1
+ import Type from "typebox"
2
+
3
+ import { MemoryDraftSchema, MemoryScopeSchema } from "#src/services"
4
+
5
+ export const CompleteBlankMemoryRequestSchema = Type.Object(
6
+ {
7
+ vault: MemoryScopeSchema,
8
+ path: Type.String(),
9
+ expectedHash: Type.String(),
10
+ type: MemoryDraftSchema.properties.type,
11
+ body: MemoryDraftSchema.properties.body,
12
+ },
13
+ { additionalProperties: false },
14
+ )