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,207 @@
1
+ import type { DatabaseSync } from "node:sqlite"
2
+
3
+ import type { CatalogChanges, VectorReplacement } from "#src/domain"
4
+ import { readCatalogHits } from "./catalog-query.ts"
5
+ import { prepareCatalogStatements } from "./catalog-statements.ts"
6
+ import { closeFailedIndex } from "./cleanup.ts"
7
+ import { prepareFolderIndexStatements } from "./folder-index-statements.ts"
8
+ import { readStoredFolderIndexes, writeFolderIndexStates } from "./folder-index-storage.ts"
9
+ import { readInventory } from "./inventory.ts"
10
+ import { putLegacyEntry, removeLegacyEntry } from "./legacy.ts"
11
+ import { readSearchHits } from "./query.ts"
12
+ import { writeCatalog } from "./reconcile.ts"
13
+ import { closedIndex, indexFailure } from "./refusals.ts"
14
+ import { prepareStatements } from "./statements.ts"
15
+ import type {
16
+ CatalogQuery,
17
+ CatalogSearchResult,
18
+ FolderIndexState,
19
+ FolderIndexStatesResult,
20
+ IndexEntry,
21
+ IndexWork,
22
+ IndexWriteResult,
23
+ InventoryResult,
24
+ SearchIndex,
25
+ SearchIndexRefusal,
26
+ SearchOptions,
27
+ SearchResult,
28
+ VectorCacheResult,
29
+ VectorCoverageResult,
30
+ VectorUpdate,
31
+ } from "./types.ts"
32
+ import { prepareVectorStatements } from "./vector-statements.ts"
33
+ import { readVectorCoverage, readVectors, updateVectors, writeVectors } from "./vector-storage.ts"
34
+
35
+ export class SqliteSearchIndex implements SearchIndex {
36
+ readonly #database: DatabaseSync
37
+ readonly #statements: ReturnType<typeof prepareStatements>
38
+ readonly #catalog: ReturnType<typeof prepareCatalogStatements>
39
+ readonly #vectors: ReturnType<typeof prepareVectorStatements>
40
+ readonly #folderIndexes: ReturnType<typeof prepareFolderIndexStatements>
41
+ #usable = true
42
+
43
+ constructor(database: DatabaseSync) {
44
+ this.#database = database
45
+ this.#statements = prepareStatements(database)
46
+ this.#catalog = prepareCatalogStatements(database)
47
+ this.#vectors = prepareVectorStatements(database)
48
+ this.#folderIndexes = prepareFolderIndexStatements(database)
49
+ }
50
+
51
+ put(entry: IndexEntry): IndexWriteResult {
52
+ return this.#write(() => putLegacyEntry(this.#statements, this.#catalog, entry))
53
+ }
54
+
55
+ remove(id: string): IndexWriteResult {
56
+ return this.#write(() => removeLegacyEntry(this.#statements, this.#catalog, id))
57
+ }
58
+
59
+ apply(changes: CatalogChanges): IndexWriteResult {
60
+ return this.#write(() => writeCatalog(this.#catalog, changes))
61
+ }
62
+
63
+ replaceVectors(request: VectorReplacement): IndexWriteResult {
64
+ return this.#write(() => writeVectors(this.#vectors, this.#catalog, request))
65
+ }
66
+
67
+ updateVectors(request: VectorUpdate): IndexWriteResult {
68
+ return this.#write(() => updateVectors(this.#vectors, this.#catalog, request))
69
+ }
70
+
71
+ vectorCoverage(): VectorCoverageResult {
72
+ if (!this.#usable || !this.#database.isOpen) return closedIndex()
73
+
74
+ try {
75
+ this.#database.exec("BEGIN")
76
+ const result = readVectorCoverage(this.#vectors)
77
+ this.#database.exec("COMMIT")
78
+ return result
79
+ } catch (error) {
80
+ if (!(error instanceof Error)) throw error
81
+ return this.#rollBack(indexFailure(error))
82
+ }
83
+ }
84
+
85
+ recordFolderIndexes(states: FolderIndexState[], keepFolders: string[]): IndexWriteResult {
86
+ return this.#write(() => writeFolderIndexStates(this.#folderIndexes, states, keepFolders))
87
+ }
88
+
89
+ folderIndexes(): FolderIndexStatesResult {
90
+ if (!this.#usable || !this.#database.isOpen) return closedIndex()
91
+
92
+ try {
93
+ this.#database.exec("BEGIN")
94
+ const result = readStoredFolderIndexes(this.#folderIndexes)
95
+ this.#database.exec("COMMIT")
96
+ return result
97
+ } catch (error) {
98
+ if (!(error instanceof Error)) throw error
99
+ return this.#rollBack(indexFailure(error))
100
+ }
101
+ }
102
+
103
+ inventory(): InventoryResult {
104
+ if (!this.#usable || !this.#database.isOpen) return closedIndex()
105
+
106
+ try {
107
+ this.#database.exec("BEGIN")
108
+ const result = readInventory(this.#catalog)
109
+ this.#database.exec("COMMIT")
110
+ return result
111
+ } catch (error) {
112
+ if (!(error instanceof Error)) throw error
113
+ return this.#rollBack(indexFailure(error))
114
+ }
115
+ }
116
+
117
+ vectors(): VectorCacheResult {
118
+ if (!this.#usable || !this.#database.isOpen) return closedIndex()
119
+
120
+ try {
121
+ this.#database.exec("BEGIN")
122
+ const result = readVectors(this.#vectors)
123
+ this.#database.exec("COMMIT")
124
+ return result
125
+ } catch (error) {
126
+ if (!(error instanceof Error)) throw error
127
+ if (error instanceof SyntaxError) {
128
+ return this.#rollBack({ succeeded: false, reason: "corrupted", problems: ["invalid cached vector JSON"] })
129
+ }
130
+ return this.#rollBack(indexFailure(error))
131
+ }
132
+ }
133
+
134
+ searchCatalog(request: CatalogQuery): CatalogSearchResult {
135
+ if (!this.#usable || !this.#database.isOpen) return closedIndex()
136
+
137
+ try {
138
+ return readCatalogHits(this.#catalog.search, request)
139
+ } catch (error) {
140
+ if (!(error instanceof Error)) throw error
141
+ return indexFailure(error)
142
+ }
143
+ }
144
+
145
+ search(query: string, options: SearchOptions): SearchResult {
146
+ if (!this.#usable || !this.#database.isOpen) return closedIndex()
147
+
148
+ try {
149
+ return readSearchHits(this.#statements.search, query, options)
150
+ } catch (error) {
151
+ if (!(error instanceof Error)) throw error
152
+ return indexFailure(error)
153
+ }
154
+ }
155
+
156
+ close(): IndexWriteResult {
157
+ if (!this.#database.isOpen) return { succeeded: true }
158
+
159
+ try {
160
+ this.#database.close()
161
+ return { succeeded: true }
162
+ } catch (error) {
163
+ if (!(error instanceof Error)) throw error
164
+ return indexFailure(error)
165
+ }
166
+ }
167
+
168
+ #write(work: IndexWork): IndexWriteResult {
169
+ if (!this.#usable || !this.#database.isOpen) return closedIndex()
170
+
171
+ try {
172
+ this.#database.exec("BEGIN IMMEDIATE")
173
+ } catch (error) {
174
+ if (!(error instanceof Error)) throw error
175
+ return indexFailure(error)
176
+ }
177
+
178
+ return this.#commit(work)
179
+ }
180
+
181
+ #commit(work: IndexWork): IndexWriteResult {
182
+ try {
183
+ const result = work()
184
+ if (!result.succeeded) return this.#rollBack(result)
185
+
186
+ this.#database.exec("COMMIT")
187
+ return result
188
+ } catch (error) {
189
+ if (!(error instanceof Error)) throw error
190
+ return this.#rollBack(indexFailure(error))
191
+ }
192
+ }
193
+
194
+ #rollBack(failure: SearchIndexRefusal): SearchIndexRefusal {
195
+ if (!this.#database.isTransaction) return failure
196
+
197
+ try {
198
+ this.#database.exec("ROLLBACK")
199
+ } catch (error) {
200
+ if (!(error instanceof Error)) throw error
201
+ this.#usable = false
202
+ failure.problems.push(`write rollback failed: ${error.message}`)
203
+ return closeFailedIndex(this.#database, failure)
204
+ }
205
+ return failure
206
+ }
207
+ }
@@ -0,0 +1,113 @@
1
+ import type { Static } from "typebox"
2
+
3
+ import type {
4
+ CatalogChanges,
5
+ CatalogSnapshot,
6
+ VectorCache,
7
+ VectorChunk,
8
+ VectorGeneration,
9
+ VectorReplacement,
10
+ } from "#src/domain"
11
+ import type { Done, Failed, Succeeded } from "#src/shared"
12
+ import type {
13
+ CatalogHitSchema,
14
+ CatalogRowSchema,
15
+ FolderIndexRowSchema,
16
+ FolderIndexStateSchema,
17
+ IndexEntrySchema,
18
+ SearchHitSchema,
19
+ SearchOptionsSchema,
20
+ } from "./schemas.ts"
21
+
22
+ export type {
23
+ AliasFailureClassification,
24
+ CatalogChanges,
25
+ CatalogEntry,
26
+ CatalogPlan,
27
+ CatalogScan,
28
+ CatalogSnapshot,
29
+ SemanticContent,
30
+ VectorCache,
31
+ VectorChunk,
32
+ VectorGeneration,
33
+ VectorReplacement,
34
+ } from "#src/domain"
35
+ export type CatalogHit = Static<typeof CatalogHitSchema>
36
+ export type CatalogRow = Static<typeof CatalogRowSchema>
37
+ export type FolderIndexState = Static<typeof FolderIndexStateSchema>
38
+ export type FolderIndexRow = Static<typeof FolderIndexRowSchema>
39
+ export type FolderIndexStatesResult = Succeeded<FolderIndexState[]> | SearchIndexRefusal
40
+ export type InventoryResult = Succeeded<CatalogSnapshot> | SearchIndexRefusal
41
+ export type CatalogSearchResult = Succeeded<CatalogHit[]> | SearchIndexRefusal
42
+ export type VectorCacheResult = Succeeded<VectorCache> | SearchIndexRefusal
43
+ export type VectorCoverageResult = Succeeded<VectorCoverage> | SearchIndexRefusal
44
+
45
+ export interface VectorUpdate {
46
+ expectedRevision: number
47
+ generation: VectorGeneration
48
+ add: VectorChunk[]
49
+ remove: string[]
50
+ }
51
+
52
+ export interface VectorCoverage {
53
+ generation: VectorGeneration | null
54
+ embedded: number
55
+ current: number
56
+ }
57
+
58
+ export interface IndexLocation {
59
+ path: string
60
+ }
61
+
62
+ export interface IndexReplacement {
63
+ path: string
64
+ temporaryPath: string
65
+ }
66
+
67
+ export interface CatalogQuery {
68
+ query: string
69
+ }
70
+
71
+ export interface CatalogWriteRow extends CatalogRow {
72
+ folder: string
73
+ }
74
+
75
+ export interface SearchIndex {
76
+ put(entry: IndexEntry): IndexWriteResult
77
+ remove(id: string): IndexWriteResult
78
+ search(query: string, options: SearchOptions): SearchResult
79
+ inventory(): InventoryResult
80
+ apply(changes: CatalogChanges): IndexWriteResult
81
+ searchCatalog(request: CatalogQuery): CatalogSearchResult
82
+ vectors(): VectorCacheResult
83
+ replaceVectors(request: VectorReplacement): IndexWriteResult
84
+ updateVectors(request: VectorUpdate): IndexWriteResult
85
+ vectorCoverage(): VectorCoverageResult
86
+ folderIndexes(): FolderIndexStatesResult
87
+ recordFolderIndexes(states: FolderIndexState[], keepFolders: string[]): IndexWriteResult
88
+ close(): IndexWriteResult
89
+ }
90
+
91
+ export type SearchHit = Static<typeof SearchHitSchema>
92
+
93
+ export type IndexEntry = Static<typeof IndexEntrySchema>
94
+
95
+ export type SearchOptions = Static<typeof SearchOptionsSchema>
96
+
97
+ export interface SearchIndexRefusal extends Failed {
98
+ reason: "corrupted" | "unavailable" | "closed" | "invalid" | "conflict"
99
+ }
100
+
101
+ export interface OpenedIndex extends Succeeded<SearchIndex> {
102
+ rebuilt: boolean
103
+ }
104
+
105
+ export type OpenIndexResult = OpenedIndex | SearchIndexRefusal
106
+
107
+ export type SearchResult = Succeeded<SearchHit[]> | SearchIndexRefusal
108
+
109
+ export type IndexWriteResult = Done | SearchIndexRefusal
110
+
111
+ export type SchemaResult = Succeeded<boolean> | SearchIndexRefusal
112
+
113
+ export type IndexWork = () => IndexWriteResult
@@ -0,0 +1,18 @@
1
+ import type { DatabaseSync } from "node:sqlite"
2
+
3
+ export function prepareVectorStatements(database: DatabaseSync) {
4
+ return {
5
+ generation: database.prepare("SELECT fingerprint, dimensions FROM vector_generation WHERE singleton = 1"),
6
+ chunks: database.prepare(
7
+ "SELECT content_fingerprint, chunk, vector FROM vector_chunks ORDER BY content_fingerprint, chunk",
8
+ ),
9
+ clearChunks: database.prepare("DELETE FROM vector_chunks"),
10
+ clearGeneration: database.prepare("DELETE FROM vector_generation"),
11
+ putGeneration: database.prepare("INSERT INTO vector_generation VALUES (1, ?, ?)"),
12
+ putChunk: database.prepare("INSERT INTO vector_chunks VALUES (?, ?, ?)"),
13
+ removeChunks: database.prepare("DELETE FROM vector_chunks WHERE content_fingerprint = ?"),
14
+ currentContent: database.prepare(`SELECT DISTINCT content_fingerprint FROM notes
15
+ WHERE id IS NOT NULL AND archived = 0 AND content_fingerprint IS NOT NULL`),
16
+ embeddedContent: database.prepare("SELECT COUNT(DISTINCT content_fingerprint) AS embedded FROM vector_chunks"),
17
+ }
18
+ }
@@ -0,0 +1,169 @@
1
+ import { Value } from "typebox/value"
2
+
3
+ import { type VectorChunk, type VectorGeneration, VectorGenerationSchema, type VectorReplacement } from "#src/domain"
4
+ import type { Succeeded } from "#src/shared"
5
+ import type { prepareCatalogStatements } from "./catalog-statements.ts"
6
+ import { corruptCatalog } from "./inventory.ts"
7
+ import { invalidCatalog, staleCatalog } from "./reconcile.ts"
8
+ import {
9
+ CatalogStateSchema,
10
+ VectorChunkSchema,
11
+ VectorReplacementSchema,
12
+ VectorRowSchema,
13
+ VectorUpdateSchema,
14
+ VectorValuesSchema,
15
+ } from "./schemas.ts"
16
+ import type {
17
+ IndexWriteResult,
18
+ SearchIndexRefusal,
19
+ VectorCacheResult,
20
+ VectorCoverageResult,
21
+ VectorUpdate,
22
+ } from "./types.ts"
23
+ import type { prepareVectorStatements } from "./vector-statements.ts"
24
+
25
+ export function readVectors(statements: ReturnType<typeof prepareVectorStatements>): VectorCacheResult {
26
+ const generation = statements.generation.get()
27
+ const rows = statements.chunks.all()
28
+ if (!generation) {
29
+ if (rows.length > 0) return corruptCatalog()
30
+ return { succeeded: true, output: { generation: null, chunks: [] } }
31
+ }
32
+ if (!Value.Check(VectorGenerationSchema, generation)) return corruptCatalog()
33
+ const chunks: VectorChunk[] = []
34
+ for (const row of rows) {
35
+ if (!Value.Check(VectorRowSchema, row)) return corruptCatalog()
36
+ const vector = JSON.parse(row.vector)
37
+ if (!Value.Check(VectorValuesSchema, vector)) return corruptCatalog()
38
+ const chunk = { contentFingerprint: row.content_fingerprint, chunk: row.chunk, vector }
39
+ if (!Value.Check(VectorChunkSchema, chunk) || !validVector(chunk.vector, generation.dimensions)) {
40
+ return corruptCatalog()
41
+ }
42
+ chunks.push(chunk)
43
+ }
44
+ if (!contiguousChunks(chunks)) return corruptCatalog()
45
+ return { succeeded: true, output: { generation, chunks } }
46
+ }
47
+
48
+ export function writeVectors(
49
+ statements: ReturnType<typeof prepareVectorStatements>,
50
+ catalog: ReturnType<typeof prepareCatalogStatements>,
51
+ request: VectorReplacement,
52
+ ): IndexWriteResult {
53
+ if (!Value.Check(VectorReplacementSchema, request)) return invalidCatalog("invalid vector generation")
54
+ const current = readCurrentContent(statements, catalog, request.expectedRevision)
55
+ if (!current.succeeded) return current
56
+ if (!usableChunks(request.chunks, request.generation, current.output)) {
57
+ return invalidCatalog("vectors must belong to current content with finite nonzero vectors of one dimension")
58
+ }
59
+
60
+ statements.clearChunks.run()
61
+ statements.clearGeneration.run()
62
+ statements.putGeneration.run(request.generation.fingerprint, request.generation.dimensions)
63
+ for (const chunk of request.chunks) putChunk(statements, chunk)
64
+ return { succeeded: true }
65
+ }
66
+
67
+ export function updateVectors(
68
+ statements: ReturnType<typeof prepareVectorStatements>,
69
+ catalog: ReturnType<typeof prepareCatalogStatements>,
70
+ request: VectorUpdate,
71
+ ): IndexWriteResult {
72
+ if (!Value.Check(VectorUpdateSchema, request)) return invalidCatalog("invalid vector update")
73
+ const current = readCurrentContent(statements, catalog, request.expectedRevision)
74
+ if (!current.succeeded) return current
75
+ const added = new Set(request.add.map((chunk) => chunk.contentFingerprint))
76
+ if (
77
+ !usableChunks(request.add, request.generation, current.output) ||
78
+ request.remove.some((entry) => added.has(entry))
79
+ ) {
80
+ return invalidCatalog("added vectors must belong to current content, be finite, nonzero and not also removed")
81
+ }
82
+ const stored = readGeneration(statements)
83
+ if (!stored.succeeded) return stored
84
+ if (!sameGeneration(stored.output, request.generation)) {
85
+ statements.clearChunks.run()
86
+ statements.clearGeneration.run()
87
+ statements.putGeneration.run(request.generation.fingerprint, request.generation.dimensions)
88
+ }
89
+
90
+ for (const fingerprint of [...request.remove, ...added]) statements.removeChunks.run(fingerprint)
91
+ for (const chunk of request.add) putChunk(statements, chunk)
92
+ return { succeeded: true }
93
+ }
94
+
95
+ export function readVectorCoverage(statements: ReturnType<typeof prepareVectorStatements>): VectorCoverageResult {
96
+ const generation = readGeneration(statements)
97
+ if (!generation.succeeded) return generation
98
+ const embedded = statements.embeddedContent.get()
99
+ if (!embedded || typeof embedded.embedded !== "number") return corruptCatalog()
100
+ const current = readFingerprints(statements)
101
+ if (!current.succeeded) return current
102
+ return {
103
+ succeeded: true,
104
+ output: { generation: generation.output, embedded: embedded.embedded, current: current.output.size },
105
+ }
106
+ }
107
+
108
+ function readGeneration(
109
+ statements: ReturnType<typeof prepareVectorStatements>,
110
+ ): Succeeded<VectorGeneration | null> | SearchIndexRefusal {
111
+ const row = statements.generation.get()
112
+ if (!row) return { succeeded: true, output: null }
113
+ if (!Value.Check(VectorGenerationSchema, row)) return corruptCatalog()
114
+ return { succeeded: true, output: row }
115
+ }
116
+
117
+ function readCurrentContent(
118
+ statements: ReturnType<typeof prepareVectorStatements>,
119
+ catalog: ReturnType<typeof prepareCatalogStatements>,
120
+ expectedRevision: number,
121
+ ): Succeeded<Set<string>> | SearchIndexRefusal {
122
+ const state = catalog.state.get()
123
+ if (!Value.Check(CatalogStateSchema, state)) return corruptCatalog()
124
+ if (state.revision !== expectedRevision) return staleCatalog()
125
+ return readFingerprints(statements)
126
+ }
127
+
128
+ function readFingerprints(
129
+ statements: ReturnType<typeof prepareVectorStatements>,
130
+ ): Succeeded<Set<string>> | SearchIndexRefusal {
131
+ const fingerprints = new Set<string>()
132
+ for (const row of statements.currentContent.all()) {
133
+ if (typeof row.content_fingerprint !== "string") return corruptCatalog()
134
+ fingerprints.add(row.content_fingerprint)
135
+ }
136
+ return { succeeded: true, output: fingerprints }
137
+ }
138
+
139
+ function sameGeneration(stored: VectorGeneration | null, requested: VectorGeneration): boolean {
140
+ return stored?.fingerprint === requested.fingerprint && stored.dimensions === requested.dimensions
141
+ }
142
+
143
+ function putChunk(statements: ReturnType<typeof prepareVectorStatements>, chunk: VectorChunk): void {
144
+ statements.putChunk.run(chunk.contentFingerprint, chunk.chunk, JSON.stringify(chunk.vector))
145
+ }
146
+
147
+ function usableChunks(chunks: VectorChunk[], generation: VectorGeneration, current: Set<string>): boolean {
148
+ return (
149
+ chunks.every(
150
+ (chunk) => current.has(chunk.contentFingerprint) && validVector(chunk.vector, generation.dimensions),
151
+ ) && contiguousChunks(chunks)
152
+ )
153
+ }
154
+
155
+ function contiguousChunks(chunks: VectorChunk[]): boolean {
156
+ const groups = new Map<string, number[]>()
157
+ for (const chunk of chunks) {
158
+ const group = groups.get(chunk.contentFingerprint)
159
+ if (group) group.push(chunk.chunk)
160
+ else groups.set(chunk.contentFingerprint, [chunk.chunk])
161
+ }
162
+ return [...groups.values()].every((group) =>
163
+ group.sort((left, right) => left - right).every((chunk, index) => chunk === index),
164
+ )
165
+ }
166
+
167
+ function validVector(vector: number[], dimensions: number): boolean {
168
+ return vector.length === dimensions && vector.every(Number.isFinite) && vector.some((value) => value !== 0)
169
+ }
@@ -0,0 +1,18 @@
1
+ import type { VectorReplacement } from "#src/domain"
2
+ import type { IndexWriteResult, SearchIndex, VectorCacheResult, VectorCoverageResult, VectorUpdate } from "./types.ts"
3
+
4
+ export function readVectorCache(index: SearchIndex): VectorCacheResult {
5
+ return index.vectors()
6
+ }
7
+
8
+ export function replaceVectorCache(index: SearchIndex, request: VectorReplacement): IndexWriteResult {
9
+ return index.replaceVectors(request)
10
+ }
11
+
12
+ export function updateVectorCache(index: SearchIndex, request: VectorUpdate): IndexWriteResult {
13
+ return index.updateVectors(request)
14
+ }
15
+
16
+ export function readVectorCoverage(index: SearchIndex): VectorCoverageResult {
17
+ return index.vectorCoverage()
18
+ }
@@ -0,0 +1,9 @@
1
+ import type { IndexEntry, IndexWriteResult, SearchIndex } from "./types.ts"
2
+
3
+ export function putNote(index: SearchIndex, entry: IndexEntry): IndexWriteResult {
4
+ return index.put(entry)
5
+ }
6
+
7
+ export function removeNote(index: SearchIndex, id: string): IndexWriteResult {
8
+ return index.remove(id)
9
+ }
@@ -0,0 +1,53 @@
1
+ import { Value } from "typebox/value"
2
+
3
+ import { SHELL_EDIT_QUESTIONS } from "#src/domain"
4
+ import { answeredByRequestedModel, defaultJevModel } from "#src/services/decision-model"
5
+ import { JevOutcomeSchema, ShellEditAnswersSchema } from "./schemas.ts"
6
+ import type { ShellEditAskCall, ShellEditAskResult, ShellEditClassifierResult } from "./types.ts"
7
+
8
+ export async function askShellEdit(call: ShellEditAskCall): Promise<ShellEditAskResult> {
9
+ if (call.signal.aborted) return failed("cancelled")
10
+ const outcome = await classified(call)
11
+ if (typeof outcome === "string") return failed(outcome)
12
+ if (call.signal.aborted) return failed("cancelled")
13
+ if (!Value.Check(JevOutcomeSchema, outcome)) return failed("Jev returned an answer of another shape")
14
+ if (outcome.stopReason === "aborted") return failed("cancelled")
15
+ if (outcome.stopReason === "error") return failed(errorText(outcome.errorMessage))
16
+ if (!answeredByRequestedModel(defaultJevModel, outcome.model)) {
17
+ return failed(`answered by ${outcome.model}, not ${defaultJevModel}`)
18
+ }
19
+ if (!Value.Check(ShellEditAnswersSchema, outcome)) {
20
+ return failed("Jev did not answer every question with a yes/no probability")
21
+ }
22
+ const { answers } = outcome
23
+ const scores = {
24
+ redirection: answers.redirection.probability,
25
+ in_place: answers.in_place.probability,
26
+ inline_code: answers.inline_code.probability,
27
+ script_writes: answers.script_writes.probability,
28
+ copy_download: answers.copy_download.probability,
29
+ hardlink: answers.hardlink.probability,
30
+ }
31
+ return { succeeded: true, output: { scores, reportedModel: outcome.model } }
32
+ }
33
+
34
+ async function classified(call: ShellEditAskCall): Promise<ShellEditClassifierResult | string> {
35
+ try {
36
+ return await call.classifier.classify({
37
+ model: { provider: "typesafe", id: defaultJevModel },
38
+ context: { state: call.state, questions: SHELL_EDIT_QUESTIONS },
39
+ options: { signal: call.signal, maxRetries: 0 },
40
+ })
41
+ } catch (error) {
42
+ return `the call to Jev failed: ${String(error)}`
43
+ }
44
+ }
45
+
46
+ function errorText(message: string | undefined): string {
47
+ if (typeof message === "string") return `Jev reported an error: ${message}`
48
+ return "Jev reported an error"
49
+ }
50
+
51
+ function failed(cause: string): ShellEditAskResult {
52
+ return { succeeded: false, problems: [cause] }
53
+ }
@@ -0,0 +1,2 @@
1
+ export type { ShellEditQuestion } from "#src/domain"
2
+ export { executedFiles, firedQuestions, SHELL_EDIT_CUTOFFS, shellEditRefusal, shellEditUncheckable } from "#src/domain"
@@ -0,0 +1,4 @@
1
+ export * from "./ask.ts"
2
+ export * from "./domain-rules.ts"
3
+ export * from "./schemas.ts"
4
+ export * from "./types.ts"
@@ -0,0 +1,23 @@
1
+ import Type from "typebox"
2
+
3
+ const BoolAnswerSchema = Type.Object({
4
+ type: Type.Literal("bool"),
5
+ probability: Type.Number({ minimum: 0, maximum: 1 }),
6
+ })
7
+
8
+ export const JevOutcomeSchema = Type.Object({
9
+ stopReason: Type.Union([Type.Literal("stop"), Type.Literal("error"), Type.Literal("aborted")]),
10
+ model: Type.String(),
11
+ errorMessage: Type.Optional(Type.String()),
12
+ })
13
+
14
+ export const ShellEditAnswersSchema = Type.Object({
15
+ answers: Type.Object({
16
+ redirection: BoolAnswerSchema,
17
+ in_place: BoolAnswerSchema,
18
+ inline_code: BoolAnswerSchema,
19
+ script_writes: BoolAnswerSchema,
20
+ copy_download: BoolAnswerSchema,
21
+ hardlink: BoolAnswerSchema,
22
+ }),
23
+ })
@@ -0,0 +1,61 @@
1
+ import type { ShellEditQuestions, ShellEditScores, ShellEditState } from "#src/domain"
2
+ import type { Failed, Succeeded } from "#src/shared"
3
+
4
+ export interface ShellEditPrompt {
5
+ state: ShellEditState
6
+ questions: ShellEditQuestions
7
+ }
8
+
9
+ export interface ShellEditModelReference {
10
+ provider: "typesafe"
11
+ id: string
12
+ }
13
+
14
+ export interface ShellEditClassifyOptions {
15
+ signal: AbortSignal
16
+ maxRetries: 0
17
+ }
18
+
19
+ export interface ShellEditClassifyRequest {
20
+ model: ShellEditModelReference
21
+ context: ShellEditPrompt
22
+ options: ShellEditClassifyOptions
23
+ }
24
+
25
+ export interface ShellEditJevAnswer {
26
+ type: string
27
+ probability?: number
28
+ }
29
+
30
+ export interface ShellEditJevAnswers {
31
+ redirection?: ShellEditJevAnswer
32
+ in_place?: ShellEditJevAnswer
33
+ inline_code?: ShellEditJevAnswer
34
+ script_writes?: ShellEditJevAnswer
35
+ copy_download?: ShellEditJevAnswer
36
+ hardlink?: ShellEditJevAnswer
37
+ }
38
+
39
+ export interface ShellEditClassifierResult {
40
+ model: string
41
+ answers: ShellEditJevAnswers
42
+ stopReason: "stop" | "error" | "aborted"
43
+ errorMessage?: string
44
+ }
45
+
46
+ export interface ShellEditClassifierPort {
47
+ classify(request: ShellEditClassifyRequest): Promise<ShellEditClassifierResult>
48
+ }
49
+
50
+ export interface ShellEditAskCall {
51
+ classifier: ShellEditClassifierPort
52
+ state: ShellEditState
53
+ signal: AbortSignal
54
+ }
55
+
56
+ export interface ShellEditClassification {
57
+ scores: ShellEditScores
58
+ reportedModel: string
59
+ }
60
+
61
+ export type ShellEditAskResult = Succeeded<ShellEditClassification> | Failed
@@ -0,0 +1 @@
1
+ export const PACKAGE_SCRIPT_PREFIX = "package.json#scripts."