@soleri/core 9.0.3 → 9.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (701) hide show
  1. package/dist/brain/intelligence.d.ts +27 -0
  2. package/dist/brain/intelligence.d.ts.map +1 -1
  3. package/dist/brain/intelligence.js +160 -14
  4. package/dist/brain/intelligence.js.map +1 -1
  5. package/dist/brain/learning-radar.d.ts +4 -0
  6. package/dist/brain/learning-radar.d.ts.map +1 -1
  7. package/dist/brain/learning-radar.js +20 -1
  8. package/dist/brain/learning-radar.js.map +1 -1
  9. package/dist/brain/strength-scorer.d.ts +31 -0
  10. package/dist/brain/strength-scorer.d.ts.map +1 -0
  11. package/dist/brain/strength-scorer.js +264 -0
  12. package/dist/brain/strength-scorer.js.map +1 -0
  13. package/dist/chat/agent-loop.d.ts.map +1 -1
  14. package/dist/chat/agent-loop.js +2 -0
  15. package/dist/chat/agent-loop.js.map +1 -1
  16. package/dist/chat/notifications.d.ts.map +1 -1
  17. package/dist/chat/notifications.js +2 -0
  18. package/dist/chat/notifications.js.map +1 -1
  19. package/dist/claudemd/compose.js +1 -1
  20. package/dist/claudemd/compose.js.map +1 -1
  21. package/dist/control/intent-router.d.ts.map +1 -1
  22. package/dist/control/intent-router.js +12 -4
  23. package/dist/control/intent-router.js.map +1 -1
  24. package/dist/curator/contradiction-detector.d.ts +27 -0
  25. package/dist/curator/contradiction-detector.d.ts.map +1 -0
  26. package/dist/curator/contradiction-detector.js +62 -0
  27. package/dist/curator/contradiction-detector.js.map +1 -0
  28. package/dist/curator/curator.d.ts +3 -4
  29. package/dist/curator/curator.d.ts.map +1 -1
  30. package/dist/curator/curator.js +90 -525
  31. package/dist/curator/curator.js.map +1 -1
  32. package/dist/curator/duplicate-detector.d.ts +14 -0
  33. package/dist/curator/duplicate-detector.d.ts.map +1 -0
  34. package/dist/curator/duplicate-detector.js +77 -0
  35. package/dist/curator/duplicate-detector.js.map +1 -0
  36. package/dist/curator/health-audit.d.ts +15 -0
  37. package/dist/curator/health-audit.d.ts.map +1 -0
  38. package/dist/curator/health-audit.js +97 -0
  39. package/dist/curator/health-audit.js.map +1 -0
  40. package/dist/curator/metadata-enricher.d.ts +17 -0
  41. package/dist/curator/metadata-enricher.d.ts.map +1 -0
  42. package/dist/curator/metadata-enricher.js +60 -0
  43. package/dist/curator/metadata-enricher.js.map +1 -0
  44. package/dist/curator/schema.d.ts +7 -0
  45. package/dist/curator/schema.d.ts.map +1 -0
  46. package/dist/curator/schema.js +62 -0
  47. package/dist/curator/schema.js.map +1 -0
  48. package/dist/curator/tag-manager.d.ts +36 -0
  49. package/dist/curator/tag-manager.d.ts.map +1 -0
  50. package/dist/curator/tag-manager.js +78 -0
  51. package/dist/curator/tag-manager.js.map +1 -0
  52. package/dist/engine/bin/soleri-engine.js +55 -3
  53. package/dist/engine/bin/soleri-engine.js.map +1 -1
  54. package/dist/engine/core-ops.d.ts.map +1 -1
  55. package/dist/engine/core-ops.js +33 -10
  56. package/dist/engine/core-ops.js.map +1 -1
  57. package/dist/engine/module-manifest.d.ts.map +1 -1
  58. package/dist/engine/module-manifest.js +22 -2
  59. package/dist/engine/module-manifest.js.map +1 -1
  60. package/dist/engine/register-engine.d.ts.map +1 -1
  61. package/dist/engine/register-engine.js +26 -2
  62. package/dist/engine/register-engine.js.map +1 -1
  63. package/dist/errors/retry.d.ts.map +1 -1
  64. package/dist/errors/retry.js +2 -0
  65. package/dist/errors/retry.js.map +1 -1
  66. package/dist/facades/types.d.ts +1 -1
  67. package/dist/flows/chain-types.d.ts +18 -18
  68. package/dist/flows/gate-evaluator.d.ts.map +1 -1
  69. package/dist/flows/gate-evaluator.js +22 -0
  70. package/dist/flows/gate-evaluator.js.map +1 -1
  71. package/dist/flows/types.d.ts +157 -28
  72. package/dist/flows/types.d.ts.map +1 -1
  73. package/dist/flows/types.js +4 -0
  74. package/dist/flows/types.js.map +1 -1
  75. package/dist/index.d.ts +10 -2
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +9 -1
  78. package/dist/index.js.map +1 -1
  79. package/dist/intake/intake-pipeline.d.ts.map +1 -1
  80. package/dist/intake/intake-pipeline.js +1 -0
  81. package/dist/intake/intake-pipeline.js.map +1 -1
  82. package/dist/intake/text-ingester.d.ts.map +1 -1
  83. package/dist/intake/text-ingester.js +2 -0
  84. package/dist/intake/text-ingester.js.map +1 -1
  85. package/dist/llm/key-pool.d.ts +1 -1
  86. package/dist/llm/key-pool.d.ts.map +1 -1
  87. package/dist/llm/key-pool.js +3 -4
  88. package/dist/llm/key-pool.js.map +1 -1
  89. package/dist/llm/utils.d.ts.map +1 -1
  90. package/dist/llm/utils.js +2 -0
  91. package/dist/llm/utils.js.map +1 -1
  92. package/dist/migrations/migration-runner.test-helpers.d.ts +13 -0
  93. package/dist/migrations/migration-runner.test-helpers.d.ts.map +1 -0
  94. package/dist/migrations/migration-runner.test-helpers.js +47 -0
  95. package/dist/migrations/migration-runner.test-helpers.js.map +1 -0
  96. package/dist/operator/operator-profile.d.ts +44 -0
  97. package/dist/operator/operator-profile.d.ts.map +1 -0
  98. package/dist/operator/operator-profile.js +377 -0
  99. package/dist/operator/operator-profile.js.map +1 -0
  100. package/dist/operator/operator-signals.d.ts +45 -0
  101. package/dist/operator/operator-signals.d.ts.map +1 -0
  102. package/dist/operator/operator-signals.js +228 -0
  103. package/dist/operator/operator-signals.js.map +1 -0
  104. package/dist/operator/operator-types.d.ts +360 -0
  105. package/dist/operator/operator-types.d.ts.map +1 -0
  106. package/dist/operator/operator-types.js +24 -0
  107. package/dist/operator/operator-types.js.map +1 -0
  108. package/dist/packs/types.d.ts +27 -27
  109. package/dist/paths.d.ts +40 -0
  110. package/dist/paths.d.ts.map +1 -0
  111. package/dist/paths.js +98 -0
  112. package/dist/paths.js.map +1 -0
  113. package/dist/persistence/index.d.ts +1 -1
  114. package/dist/persistence/index.d.ts.map +1 -1
  115. package/dist/persistence/index.js +1 -1
  116. package/dist/persistence/index.js.map +1 -1
  117. package/dist/persistence/sqlite-provider.d.ts +2 -0
  118. package/dist/persistence/sqlite-provider.d.ts.map +1 -1
  119. package/dist/persistence/sqlite-provider.js +8 -5
  120. package/dist/persistence/sqlite-provider.js.map +1 -1
  121. package/dist/planning/evidence-collector.d.ts +13 -1
  122. package/dist/planning/evidence-collector.d.ts.map +1 -1
  123. package/dist/planning/evidence-collector.js +33 -0
  124. package/dist/planning/evidence-collector.js.map +1 -1
  125. package/dist/planning/gap-analysis.d.ts +5 -4
  126. package/dist/planning/gap-analysis.d.ts.map +1 -1
  127. package/dist/planning/gap-analysis.js +7 -341
  128. package/dist/planning/gap-analysis.js.map +1 -1
  129. package/dist/planning/gap-passes.d.ts +19 -0
  130. package/dist/planning/gap-passes.d.ts.map +1 -0
  131. package/dist/planning/gap-passes.js +157 -0
  132. package/dist/planning/gap-passes.js.map +1 -0
  133. package/dist/planning/gap-patterns.d.ts +29 -0
  134. package/dist/planning/gap-patterns.d.ts.map +1 -0
  135. package/dist/planning/gap-patterns.js +129 -0
  136. package/dist/planning/gap-patterns.js.map +1 -0
  137. package/dist/planning/gap-types.d.ts +1 -1
  138. package/dist/planning/gap-types.d.ts.map +1 -1
  139. package/dist/planning/gap-types.js +1 -0
  140. package/dist/planning/gap-types.js.map +1 -1
  141. package/dist/planning/github-projection.d.ts +122 -0
  142. package/dist/planning/github-projection.d.ts.map +1 -0
  143. package/dist/planning/github-projection.js +294 -0
  144. package/dist/planning/github-projection.js.map +1 -0
  145. package/dist/planning/impact-analyzer.d.ts +26 -0
  146. package/dist/planning/impact-analyzer.d.ts.map +1 -0
  147. package/dist/planning/impact-analyzer.js +199 -0
  148. package/dist/planning/impact-analyzer.js.map +1 -0
  149. package/dist/planning/plan-lifecycle.d.ts +136 -0
  150. package/dist/planning/plan-lifecycle.d.ts.map +1 -0
  151. package/dist/planning/plan-lifecycle.js +296 -0
  152. package/dist/planning/plan-lifecycle.js.map +1 -0
  153. package/dist/planning/planner-types.d.ts +202 -0
  154. package/dist/planning/planner-types.d.ts.map +1 -0
  155. package/dist/planning/planner-types.js +6 -0
  156. package/dist/planning/planner-types.js.map +1 -0
  157. package/dist/planning/planner.d.ts +31 -383
  158. package/dist/planning/planner.d.ts.map +1 -1
  159. package/dist/planning/planner.js +154 -878
  160. package/dist/planning/planner.js.map +1 -1
  161. package/dist/planning/rationalization-detector.d.ts +32 -0
  162. package/dist/planning/rationalization-detector.d.ts.map +1 -0
  163. package/dist/planning/rationalization-detector.js +89 -0
  164. package/dist/planning/rationalization-detector.js.map +1 -0
  165. package/dist/planning/reconciliation-engine.d.ts +47 -0
  166. package/dist/planning/reconciliation-engine.d.ts.map +1 -0
  167. package/dist/planning/reconciliation-engine.js +128 -0
  168. package/dist/planning/reconciliation-engine.js.map +1 -0
  169. package/dist/planning/task-verifier.d.ts +85 -0
  170. package/dist/planning/task-verifier.d.ts.map +1 -0
  171. package/dist/planning/task-verifier.js +227 -0
  172. package/dist/planning/task-verifier.js.map +1 -0
  173. package/dist/plugins/types.d.ts +4 -4
  174. package/dist/runtime/admin-ops.d.ts +2 -2
  175. package/dist/runtime/admin-ops.d.ts.map +1 -1
  176. package/dist/runtime/admin-ops.js +44 -17
  177. package/dist/runtime/admin-ops.js.map +1 -1
  178. package/dist/runtime/admin-setup-ops.d.ts.map +1 -1
  179. package/dist/runtime/admin-setup-ops.js +21 -46
  180. package/dist/runtime/admin-setup-ops.js.map +1 -1
  181. package/dist/runtime/archive-ops.d.ts +10 -0
  182. package/dist/runtime/archive-ops.d.ts.map +1 -0
  183. package/dist/runtime/archive-ops.js +310 -0
  184. package/dist/runtime/archive-ops.js.map +1 -0
  185. package/dist/runtime/capture-ops.d.ts.map +1 -1
  186. package/dist/runtime/capture-ops.js +42 -7
  187. package/dist/runtime/capture-ops.js.map +1 -1
  188. package/dist/runtime/claude-md-helpers.js +1 -1
  189. package/dist/runtime/claude-md-helpers.js.map +1 -1
  190. package/dist/runtime/context-health.d.ts +31 -0
  191. package/dist/runtime/context-health.d.ts.map +1 -0
  192. package/dist/runtime/context-health.js +57 -0
  193. package/dist/runtime/context-health.js.map +1 -0
  194. package/dist/runtime/facades/archive-facade.d.ts +10 -0
  195. package/dist/runtime/facades/archive-facade.d.ts.map +1 -0
  196. package/dist/runtime/facades/archive-facade.js +11 -0
  197. package/dist/runtime/facades/archive-facade.js.map +1 -0
  198. package/dist/runtime/facades/brain-facade.d.ts.map +1 -1
  199. package/dist/runtime/facades/brain-facade.js +2 -0
  200. package/dist/runtime/facades/brain-facade.js.map +1 -1
  201. package/dist/runtime/facades/chat-facade.d.ts +7 -0
  202. package/dist/runtime/facades/chat-facade.d.ts.map +1 -1
  203. package/dist/runtime/facades/chat-facade.js +15 -800
  204. package/dist/runtime/facades/chat-facade.js.map +1 -1
  205. package/dist/runtime/facades/chat-service-ops.d.ts +9 -0
  206. package/dist/runtime/facades/chat-service-ops.d.ts.map +1 -0
  207. package/dist/runtime/facades/chat-service-ops.js +330 -0
  208. package/dist/runtime/facades/chat-service-ops.js.map +1 -0
  209. package/dist/runtime/facades/chat-session-ops.d.ts +8 -0
  210. package/dist/runtime/facades/chat-session-ops.d.ts.map +1 -0
  211. package/dist/runtime/facades/chat-session-ops.js +136 -0
  212. package/dist/runtime/facades/chat-session-ops.js.map +1 -0
  213. package/dist/runtime/facades/chat-state.d.ts +31 -0
  214. package/dist/runtime/facades/chat-state.d.ts.map +1 -0
  215. package/dist/runtime/facades/chat-state.js +32 -0
  216. package/dist/runtime/facades/chat-state.js.map +1 -0
  217. package/dist/runtime/facades/chat-transport-ops.d.ts +9 -0
  218. package/dist/runtime/facades/chat-transport-ops.d.ts.map +1 -0
  219. package/dist/runtime/facades/chat-transport-ops.js +337 -0
  220. package/dist/runtime/facades/chat-transport-ops.js.map +1 -0
  221. package/dist/runtime/facades/control-facade.d.ts.map +1 -1
  222. package/dist/runtime/facades/control-facade.js +4 -1
  223. package/dist/runtime/facades/control-facade.js.map +1 -1
  224. package/dist/runtime/facades/index.d.ts.map +1 -1
  225. package/dist/runtime/facades/index.js +6 -0
  226. package/dist/runtime/facades/index.js.map +1 -1
  227. package/dist/runtime/facades/memory-facade.d.ts.map +1 -1
  228. package/dist/runtime/facades/memory-facade.js +75 -6
  229. package/dist/runtime/facades/memory-facade.js.map +1 -1
  230. package/dist/runtime/facades/operator-facade.d.ts +8 -0
  231. package/dist/runtime/facades/operator-facade.d.ts.map +1 -0
  232. package/dist/runtime/facades/operator-facade.js +220 -0
  233. package/dist/runtime/facades/operator-facade.js.map +1 -0
  234. package/dist/runtime/facades/orchestrate-facade.js +3 -3
  235. package/dist/runtime/facades/orchestrate-facade.js.map +1 -1
  236. package/dist/runtime/facades/plan-facade.d.ts.map +1 -1
  237. package/dist/runtime/facades/plan-facade.js +39 -6
  238. package/dist/runtime/facades/plan-facade.js.map +1 -1
  239. package/dist/runtime/facades/review-facade.d.ts +7 -0
  240. package/dist/runtime/facades/review-facade.d.ts.map +1 -0
  241. package/dist/runtime/facades/review-facade.js +8 -0
  242. package/dist/runtime/facades/review-facade.js.map +1 -0
  243. package/dist/runtime/facades/sync-facade.d.ts +7 -0
  244. package/dist/runtime/facades/sync-facade.d.ts.map +1 -0
  245. package/dist/runtime/facades/sync-facade.js +8 -0
  246. package/dist/runtime/facades/sync-facade.js.map +1 -0
  247. package/dist/runtime/facades/vault-facade.d.ts +4 -1
  248. package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
  249. package/dist/runtime/facades/vault-facade.js +13 -66
  250. package/dist/runtime/facades/vault-facade.js.map +1 -1
  251. package/dist/runtime/github-integration.d.ts +49 -0
  252. package/dist/runtime/github-integration.d.ts.map +1 -0
  253. package/dist/runtime/github-integration.js +113 -0
  254. package/dist/runtime/github-integration.js.map +1 -0
  255. package/dist/runtime/grading-ops.js +1 -1
  256. package/dist/runtime/grading-ops.js.map +1 -1
  257. package/dist/runtime/memory-extra-ops.d.ts.map +1 -1
  258. package/dist/runtime/memory-extra-ops.js +6 -2
  259. package/dist/runtime/memory-extra-ops.js.map +1 -1
  260. package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
  261. package/dist/runtime/orchestrate-ops.js +367 -40
  262. package/dist/runtime/orchestrate-ops.js.map +1 -1
  263. package/dist/runtime/planning-extra-ops.d.ts.map +1 -1
  264. package/dist/runtime/planning-extra-ops.js +69 -4
  265. package/dist/runtime/planning-extra-ops.js.map +1 -1
  266. package/dist/runtime/review-ops.d.ts +10 -0
  267. package/dist/runtime/review-ops.d.ts.map +1 -0
  268. package/dist/runtime/review-ops.js +97 -0
  269. package/dist/runtime/review-ops.js.map +1 -0
  270. package/dist/runtime/runtime.d.ts.map +1 -1
  271. package/dist/runtime/runtime.js +27 -12
  272. package/dist/runtime/runtime.js.map +1 -1
  273. package/dist/runtime/session-briefing.d.ts +3 -0
  274. package/dist/runtime/session-briefing.d.ts.map +1 -1
  275. package/dist/runtime/session-briefing.js +68 -1
  276. package/dist/runtime/session-briefing.js.map +1 -1
  277. package/dist/runtime/sync-ops.d.ts +12 -0
  278. package/dist/runtime/sync-ops.d.ts.map +1 -0
  279. package/dist/runtime/sync-ops.js +288 -0
  280. package/dist/runtime/sync-ops.js.map +1 -0
  281. package/dist/runtime/types.d.ts +10 -4
  282. package/dist/runtime/types.d.ts.map +1 -1
  283. package/dist/runtime/vault-extra-ops.d.ts +5 -4
  284. package/dist/runtime/vault-extra-ops.d.ts.map +1 -1
  285. package/dist/runtime/vault-extra-ops.js +5 -300
  286. package/dist/runtime/vault-extra-ops.js.map +1 -1
  287. package/dist/runtime/vault-sharing-ops.d.ts +4 -4
  288. package/dist/runtime/vault-sharing-ops.d.ts.map +1 -1
  289. package/dist/runtime/vault-sharing-ops.js +5 -300
  290. package/dist/runtime/vault-sharing-ops.js.map +1 -1
  291. package/dist/skills/sync-skills.d.ts +27 -0
  292. package/dist/skills/sync-skills.d.ts.map +1 -0
  293. package/dist/skills/sync-skills.js +81 -0
  294. package/dist/skills/sync-skills.js.map +1 -0
  295. package/dist/update-check.d.ts +14 -0
  296. package/dist/update-check.d.ts.map +1 -0
  297. package/dist/update-check.js +96 -0
  298. package/dist/update-check.js.map +1 -0
  299. package/dist/vault/linking.d.ts +10 -12
  300. package/dist/vault/linking.d.ts.map +1 -1
  301. package/dist/vault/linking.js +104 -161
  302. package/dist/vault/linking.js.map +1 -1
  303. package/dist/vault/vault-entries.d.ts +69 -0
  304. package/dist/vault/vault-entries.d.ts.map +1 -0
  305. package/dist/vault/vault-entries.js +257 -0
  306. package/dist/vault/vault-entries.js.map +1 -0
  307. package/dist/vault/vault-interfaces.d.ts +153 -0
  308. package/dist/vault/vault-interfaces.d.ts.map +1 -0
  309. package/dist/vault/vault-interfaces.js +2 -0
  310. package/dist/vault/vault-interfaces.js.map +1 -0
  311. package/dist/vault/vault-maintenance.d.ts +40 -0
  312. package/dist/vault/vault-maintenance.d.ts.map +1 -0
  313. package/dist/vault/vault-maintenance.js +142 -0
  314. package/dist/vault/vault-maintenance.js.map +1 -0
  315. package/dist/vault/vault-markdown-sync.d.ts +22 -0
  316. package/dist/vault/vault-markdown-sync.d.ts.map +1 -0
  317. package/dist/vault/vault-markdown-sync.js +143 -0
  318. package/dist/vault/vault-markdown-sync.js.map +1 -0
  319. package/dist/vault/vault-memories.d.ts +61 -0
  320. package/dist/vault/vault-memories.d.ts.map +1 -0
  321. package/dist/vault/vault-memories.js +240 -0
  322. package/dist/vault/vault-memories.js.map +1 -0
  323. package/dist/vault/vault-schema.d.ts +9 -0
  324. package/dist/vault/vault-schema.d.ts.map +1 -0
  325. package/dist/vault/vault-schema.js +179 -0
  326. package/dist/vault/vault-schema.js.map +1 -0
  327. package/dist/vault/vault.d.ts +29 -81
  328. package/dist/vault/vault.d.ts.map +1 -1
  329. package/dist/vault/vault.js +78 -931
  330. package/dist/vault/vault.js.map +1 -1
  331. package/package.json +1 -1
  332. package/src/agency/agency-manager.test.ts +600 -0
  333. package/src/agency/default-rules.test.ts +228 -0
  334. package/src/{__tests__ → brain}/brain-intelligence.test.ts +37 -14
  335. package/src/{__tests__ → brain}/brain.test.ts +1 -1
  336. package/src/brain/intelligence.ts +196 -15
  337. package/src/brain/learning-radar.ts +22 -1
  338. package/src/{__tests__ → brain}/second-brain-features.test.ts +4 -4
  339. package/src/{__tests__ → brain}/session-lifecycle.test.ts +2 -2
  340. package/src/brain/strength-scorer.ts +404 -0
  341. package/src/capabilities/chain-mapping.test.ts +66 -0
  342. package/src/capabilities/registry.test.ts +369 -0
  343. package/src/chat/agent-loop.test.ts +394 -0
  344. package/src/chat/agent-loop.ts +2 -0
  345. package/src/{__tests__ → chat}/chat-differentiators.test.ts +3 -3
  346. package/src/{__tests__ → chat}/chat-enhanced.test.ts +4 -4
  347. package/src/{__tests__ → chat}/chat-transport.test.ts +6 -6
  348. package/src/chat/mcp-bridge.test.ts +173 -0
  349. package/src/chat/notifications.ts +2 -0
  350. package/src/chat/output-compressor.test.ts +164 -0
  351. package/src/claudemd/compose.test.ts +178 -0
  352. package/src/claudemd/compose.ts +1 -1
  353. package/src/claudemd/inject.test.ts +211 -0
  354. package/src/context/context-engine.test.ts +461 -0
  355. package/src/control/identity-manager.test.ts +305 -0
  356. package/src/control/intent-router.test.ts +360 -0
  357. package/src/control/intent-router.ts +13 -4
  358. package/src/curator/classifier.test.ts +104 -0
  359. package/src/curator/contradiction-detector.test.ts +180 -0
  360. package/src/curator/contradiction-detector.ts +87 -0
  361. package/src/{__tests__ → curator}/curator-pipeline-e2e.test.ts +10 -10
  362. package/src/{__tests__ → curator}/curator.test.ts +77 -1
  363. package/src/curator/curator.ts +115 -777
  364. package/src/curator/duplicate-detector.test.ts +183 -0
  365. package/src/curator/duplicate-detector.ts +103 -0
  366. package/src/curator/health-audit.ts +126 -0
  367. package/src/curator/metadata-enricher.ts +84 -0
  368. package/src/curator/quality-gate.test.ts +135 -0
  369. package/src/curator/schema.ts +65 -0
  370. package/src/curator/tag-manager.test.ts +165 -0
  371. package/src/curator/tag-manager.ts +109 -0
  372. package/src/domain-packs/inject-rules.test.ts +117 -0
  373. package/src/domain-packs/knowledge-installer.test.ts +171 -0
  374. package/src/domain-packs/loader.test.ts +86 -0
  375. package/src/domain-packs/pack-runtime.test.ts +140 -0
  376. package/src/domain-packs/skills-installer.test.ts +135 -0
  377. package/src/domain-packs/token-resolver.test.ts +150 -0
  378. package/src/domain-packs/types.test.ts +130 -0
  379. package/src/enforcement/adapters/claude-code.test.ts +216 -0
  380. package/src/enforcement/registry.test.ts +264 -0
  381. package/src/engine/bin/soleri-engine.ts +59 -3
  382. package/src/engine/core-ops.test.ts +254 -0
  383. package/src/engine/core-ops.ts +35 -10
  384. package/src/engine/module-manifest.test.ts +124 -0
  385. package/src/engine/module-manifest.ts +22 -2
  386. package/src/engine/register-engine.test.ts +230 -0
  387. package/src/engine/register-engine.ts +26 -2
  388. package/src/errors/classify.test.ts +199 -0
  389. package/src/errors/retry.test.ts +156 -0
  390. package/src/errors/retry.ts +2 -0
  391. package/src/errors/types.test.ts +108 -0
  392. package/src/events/event-bus.test.ts +149 -0
  393. package/src/extensions/middleware.test.ts +234 -0
  394. package/src/facades/facade-factory.test.ts +424 -0
  395. package/src/flows/chain-runner.test.ts +273 -0
  396. package/src/flows/context-router.test.ts +52 -0
  397. package/src/flows/dispatch-registry.test.ts +128 -0
  398. package/src/flows/epilogue.test.ts +107 -0
  399. package/src/flows/executor.test.ts +263 -0
  400. package/src/flows/gate-evaluator.test.ts +194 -0
  401. package/src/flows/gate-evaluator.ts +25 -0
  402. package/src/flows/types.ts +4 -0
  403. package/src/governance/governance.test.ts +726 -0
  404. package/src/health/health-registry.test.ts +186 -0
  405. package/src/health/vault-integrity.test.ts +110 -0
  406. package/src/index.ts +92 -0
  407. package/src/intake/content-classifier.test.ts +209 -0
  408. package/src/intake/dedup-gate.test.ts +131 -0
  409. package/src/intake/intake-pipeline.test.ts +506 -0
  410. package/src/intake/intake-pipeline.ts +1 -0
  411. package/src/intake/text-ingester.test.ts +194 -0
  412. package/src/intake/text-ingester.ts +2 -0
  413. package/src/llm/key-pool.test.ts +236 -0
  414. package/src/llm/key-pool.ts +3 -4
  415. package/src/llm/llm-client.test.ts +345 -0
  416. package/src/llm/oauth-discovery.test.ts +180 -0
  417. package/src/llm/utils.test.ts +327 -0
  418. package/src/llm/utils.ts +2 -0
  419. package/src/{__tests__ → logging}/logger.test.ts +41 -62
  420. package/src/loop/loop-manager.test.ts +519 -0
  421. package/src/migrations/migration-runner.edge-cases.test.ts +319 -0
  422. package/src/migrations/migration-runner.test-helpers.ts +64 -0
  423. package/src/migrations/migration-runner.test.ts +385 -0
  424. package/src/operator/auto-signal-pipeline.test.ts +207 -0
  425. package/src/operator/operator-profile-extended.test.ts +320 -0
  426. package/src/operator/operator-profile.test.ts +314 -0
  427. package/src/operator/operator-profile.ts +469 -0
  428. package/src/operator/operator-signals-extended.test.ts +245 -0
  429. package/src/operator/operator-signals.test.ts +281 -0
  430. package/src/operator/operator-signals.ts +261 -0
  431. package/src/operator/operator-types.ts +444 -0
  432. package/src/operator/prompts/hook-precompact-operator-dispatch.md +94 -0
  433. package/src/operator/prompts/subagent-soft-signal-extractor.md +125 -0
  434. package/src/operator/prompts/subagent-synthesis-cognition.md +181 -0
  435. package/src/operator/prompts/subagent-synthesis-communication.md +140 -0
  436. package/src/operator/prompts/subagent-synthesis-technical.md +160 -0
  437. package/src/operator/prompts/subagent-synthesis-trust.md +143 -0
  438. package/src/{__tests__ → packs}/pack-lockfile.test.ts +3 -3
  439. package/src/{__tests__ → packs}/pack-system.test.ts +2 -2
  440. package/src/paths.ts +115 -0
  441. package/src/persistence/index.ts +1 -1
  442. package/src/persistence/sqlite-provider.test.ts +540 -0
  443. package/src/persistence/sqlite-provider.ts +8 -5
  444. package/src/persona/defaults.test.ts +59 -0
  445. package/src/persona/loader.test.ts +67 -0
  446. package/src/persona/prompt-generator.test.ts +127 -0
  447. package/src/planning/evidence-collector.test.ts +406 -0
  448. package/src/planning/evidence-collector.ts +50 -0
  449. package/src/planning/gap-analysis-alternatives.test.ts +169 -0
  450. package/src/planning/gap-analysis.ts +21 -636
  451. package/src/planning/gap-passes.test.ts +372 -0
  452. package/src/planning/gap-passes.ts +298 -0
  453. package/src/planning/gap-patterns.test.ts +320 -0
  454. package/src/planning/gap-patterns.ts +234 -0
  455. package/src/planning/gap-types.ts +4 -1
  456. package/src/planning/github-projection.test.ts +177 -0
  457. package/src/planning/github-projection.ts +425 -0
  458. package/src/planning/impact-analyzer.test.ts +180 -0
  459. package/src/planning/impact-analyzer.ts +264 -0
  460. package/src/planning/plan-lifecycle.test.ts +312 -0
  461. package/src/planning/plan-lifecycle.ts +346 -0
  462. package/src/planning/planner-types.ts +215 -0
  463. package/src/{__tests__ → planning}/planner.test.ts +169 -15
  464. package/src/planning/planner.ts +197 -1228
  465. package/src/planning/rationalization-detector.test.ts +171 -0
  466. package/src/planning/rationalization-detector.ts +138 -0
  467. package/src/planning/reconciliation-engine.test.ts +141 -0
  468. package/src/planning/reconciliation-engine.ts +162 -0
  469. package/src/planning/task-verifier.test.ts +235 -0
  470. package/src/planning/task-verifier.ts +303 -0
  471. package/src/planning/verification-protocol.test.ts +201 -0
  472. package/src/playbooks/generic/generic-playbooks.test.ts +438 -0
  473. package/src/playbooks/index.test.ts +77 -0
  474. package/src/playbooks/playbook-executor.test.ts +255 -0
  475. package/src/playbooks/playbook-registry.test.ts +232 -0
  476. package/src/playbooks/playbook-seeder.test.ts +153 -0
  477. package/src/plugins/plugin-loader.test.ts +212 -0
  478. package/src/plugins/plugin-registry.test.ts +272 -0
  479. package/src/project/project-registry.test.ts +428 -0
  480. package/src/prompts/parser.test.ts +100 -0
  481. package/src/prompts/template-manager.test.ts +109 -0
  482. package/src/{__tests__ → queue}/async-infrastructure.test.ts +3 -3
  483. package/src/queue/job-queue.test.ts +331 -0
  484. package/src/queue/pipeline-runner.test.ts +209 -0
  485. package/src/runtime/admin-extra-ops.test.ts +527 -0
  486. package/src/runtime/admin-ops.test.ts +257 -0
  487. package/src/runtime/admin-ops.ts +45 -17
  488. package/src/runtime/admin-setup-ops.test.ts +328 -0
  489. package/src/runtime/admin-setup-ops.ts +20 -43
  490. package/src/runtime/archive-ops.test.ts +269 -0
  491. package/src/runtime/archive-ops.ts +347 -0
  492. package/src/runtime/capture-ops.test.ts +433 -0
  493. package/src/runtime/capture-ops.ts +50 -8
  494. package/src/runtime/chain-ops.test.ts +149 -0
  495. package/src/runtime/claude-md-helpers.test.ts +191 -0
  496. package/src/runtime/claude-md-helpers.ts +1 -1
  497. package/src/runtime/context-health.test.ts +78 -0
  498. package/src/runtime/context-health.ts +85 -0
  499. package/src/runtime/curator-extra-ops.test.ts +202 -0
  500. package/src/runtime/deprecation.test.ts +98 -0
  501. package/src/runtime/domain-ops.test.ts +268 -0
  502. package/src/runtime/facades/admin-facade.test.ts +333 -0
  503. package/src/runtime/facades/agency-facade.test.ts +278 -0
  504. package/src/runtime/facades/archive-facade.test.ts +294 -0
  505. package/src/runtime/facades/archive-facade.ts +14 -0
  506. package/src/runtime/facades/brain-facade.test.ts +714 -0
  507. package/src/runtime/facades/brain-facade.ts +2 -0
  508. package/src/runtime/facades/chat-facade.test.ts +166 -0
  509. package/src/runtime/facades/chat-facade.ts +15 -906
  510. package/src/runtime/facades/chat-service-ops.test.ts +276 -0
  511. package/src/runtime/facades/chat-service-ops.ts +374 -0
  512. package/src/runtime/facades/chat-session-ops.test.ts +197 -0
  513. package/src/runtime/facades/chat-session-ops.ts +146 -0
  514. package/src/runtime/facades/chat-state.ts +60 -0
  515. package/src/runtime/facades/chat-transport-ops.test.ts +269 -0
  516. package/src/runtime/facades/chat-transport-ops.ts +380 -0
  517. package/src/runtime/facades/context-facade.test.ts +108 -0
  518. package/src/runtime/facades/control-facade.test.ts +436 -0
  519. package/src/runtime/facades/control-facade.ts +6 -1
  520. package/src/runtime/facades/curator-facade.test.ts +303 -0
  521. package/src/runtime/facades/index.ts +6 -0
  522. package/src/runtime/facades/loop-facade.test.ts +245 -0
  523. package/src/runtime/facades/memory-facade.test.ts +269 -0
  524. package/src/runtime/facades/memory-facade.ts +78 -6
  525. package/src/runtime/facades/operator-facade.test.ts +208 -0
  526. package/src/runtime/facades/operator-facade.ts +236 -0
  527. package/src/runtime/facades/orchestrate-facade.test.ts +185 -0
  528. package/src/runtime/facades/orchestrate-facade.ts +3 -3
  529. package/src/runtime/facades/plan-facade.test.ts +266 -0
  530. package/src/runtime/facades/plan-facade.ts +42 -6
  531. package/src/runtime/facades/review-facade.test.ts +82 -0
  532. package/src/runtime/facades/review-facade.ts +11 -0
  533. package/src/runtime/facades/sync-facade.test.ts +113 -0
  534. package/src/runtime/facades/sync-facade.ts +11 -0
  535. package/src/runtime/facades/vault-facade.test.ts +631 -0
  536. package/src/runtime/facades/vault-facade.ts +15 -70
  537. package/src/runtime/feature-flags.test.ts +140 -0
  538. package/src/runtime/github-integration.test.ts +89 -0
  539. package/src/runtime/github-integration.ts +159 -0
  540. package/src/runtime/grading-ops.test.ts +141 -0
  541. package/src/runtime/grading-ops.ts +1 -1
  542. package/src/runtime/intake-ops.test.ts +208 -0
  543. package/src/runtime/loop-ops.test.ts +238 -0
  544. package/src/runtime/memory-cross-project-ops.test.ts +177 -0
  545. package/src/runtime/memory-extra-ops.test.ts +453 -0
  546. package/src/runtime/memory-extra-ops.ts +6 -2
  547. package/src/runtime/orchestrate-ops.test.ts +302 -0
  548. package/src/runtime/orchestrate-ops.ts +435 -46
  549. package/src/runtime/pack-ops.test.ts +158 -0
  550. package/src/runtime/planning-extra-ops.test.ts +583 -0
  551. package/src/runtime/planning-extra-ops.ts +72 -4
  552. package/src/{__tests__ → runtime}/playbook-ops-execution.test.ts +3 -3
  553. package/src/runtime/playbook-ops.test.ts +262 -0
  554. package/src/runtime/plugin-ops.test.ts +201 -0
  555. package/src/runtime/project-ops.test.ts +235 -0
  556. package/src/runtime/review-ops.test.ts +142 -0
  557. package/src/runtime/review-ops.ts +99 -0
  558. package/src/runtime/runtime.test.ts +363 -0
  559. package/src/runtime/runtime.ts +39 -12
  560. package/src/runtime/session-briefing.test.ts +302 -0
  561. package/src/runtime/session-briefing.ts +80 -1
  562. package/src/runtime/sync-ops.test.ts +221 -0
  563. package/src/runtime/sync-ops.ts +325 -0
  564. package/src/runtime/telemetry-ops.test.ts +132 -0
  565. package/src/runtime/types.ts +10 -4
  566. package/src/runtime/vault-extra-ops.test.ts +246 -0
  567. package/src/runtime/vault-extra-ops.ts +5 -332
  568. package/src/runtime/vault-linking-ops.test.ts +237 -0
  569. package/src/runtime/vault-sharing-ops.test.ts +130 -0
  570. package/src/runtime/vault-sharing-ops.ts +5 -329
  571. package/src/skills/sync-skills.ts +108 -0
  572. package/src/streams/normalize.test.ts +95 -0
  573. package/src/streams/replayable-stream.test.ts +166 -0
  574. package/src/telemetry/telemetry.test.ts +143 -0
  575. package/src/transport/http-server.test.ts +394 -0
  576. package/src/transport/lsp-server.test.ts +458 -0
  577. package/src/transport/rate-limiter.test.ts +126 -0
  578. package/src/transport/session-manager.test.ts +133 -0
  579. package/src/transport/token-auth.test.ts +136 -0
  580. package/src/transport/ws-server.test.ts +294 -0
  581. package/src/update-check.ts +111 -0
  582. package/src/vault/__tests__/vault-characterization.test.ts +168 -0
  583. package/src/vault/content-hash.test.ts +78 -0
  584. package/src/vault/git-vault-sync.test.ts +234 -0
  585. package/src/vault/knowledge-review.test.ts +269 -0
  586. package/src/vault/linking.test.ts +358 -0
  587. package/src/vault/linking.ts +149 -183
  588. package/src/vault/obsidian-sync.test.ts +342 -0
  589. package/src/vault/playbook.test.ts +152 -0
  590. package/src/vault/scope-detector.test.ts +187 -0
  591. package/src/vault/vault-branching.test.ts +250 -0
  592. package/src/{__tests__ → vault}/vault-connect.test.ts +1 -1
  593. package/src/vault/vault-entries.ts +282 -0
  594. package/src/vault/vault-interfaces.ts +56 -0
  595. package/src/vault/vault-maintenance.ts +205 -0
  596. package/src/vault/vault-manager.test.ts +206 -0
  597. package/src/vault/vault-markdown-sync.test.ts +203 -0
  598. package/src/vault/vault-markdown-sync.ts +160 -0
  599. package/src/vault/vault-memories.ts +339 -0
  600. package/src/{__tests__ → vault}/vault-scaling.test.ts +1 -1
  601. package/src/vault/vault-schema.ts +181 -0
  602. package/src/{__tests__ → vault}/vault-sharing.test.ts +4 -4
  603. package/src/{__tests__ → vault}/vault.test.ts +2 -2
  604. package/src/vault/vault.ts +89 -1171
  605. package/dist/cognee/client.d.ts +0 -43
  606. package/dist/cognee/client.d.ts.map +0 -1
  607. package/dist/cognee/client.js +0 -375
  608. package/dist/cognee/client.js.map +0 -1
  609. package/dist/cognee/sync-manager.d.ts +0 -153
  610. package/dist/cognee/sync-manager.d.ts.map +0 -1
  611. package/dist/cognee/sync-manager.js +0 -390
  612. package/dist/cognee/sync-manager.js.map +0 -1
  613. package/dist/cognee/types.d.ts +0 -62
  614. package/dist/cognee/types.d.ts.map +0 -1
  615. package/dist/cognee/types.js +0 -3
  616. package/dist/cognee/types.js.map +0 -1
  617. package/dist/governance/index.d.ts +0 -3
  618. package/dist/governance/index.d.ts.map +0 -1
  619. package/dist/governance/index.js +0 -2
  620. package/dist/governance/index.js.map +0 -1
  621. package/dist/health/doctor-checks.d.ts +0 -15
  622. package/dist/health/doctor-checks.d.ts.map +0 -1
  623. package/dist/health/doctor-checks.js +0 -98
  624. package/dist/health/doctor-checks.js.map +0 -1
  625. package/dist/persistence/postgres-provider.d.ts +0 -81
  626. package/dist/persistence/postgres-provider.d.ts.map +0 -1
  627. package/dist/persistence/postgres-provider.js +0 -256
  628. package/dist/persistence/postgres-provider.js.map +0 -1
  629. package/dist/runtime/cognee-sync-ops.d.ts +0 -12
  630. package/dist/runtime/cognee-sync-ops.d.ts.map +0 -1
  631. package/dist/runtime/cognee-sync-ops.js +0 -93
  632. package/dist/runtime/cognee-sync-ops.js.map +0 -1
  633. package/dist/runtime/core-ops.d.ts +0 -23
  634. package/dist/runtime/core-ops.d.ts.map +0 -1
  635. package/dist/runtime/core-ops.js +0 -1296
  636. package/dist/runtime/core-ops.js.map +0 -1
  637. package/dist/runtime/facades/cognee-facade.d.ts +0 -8
  638. package/dist/runtime/facades/cognee-facade.d.ts.map +0 -1
  639. package/dist/runtime/facades/cognee-facade.js +0 -156
  640. package/dist/runtime/facades/cognee-facade.js.map +0 -1
  641. package/src/__tests__/admin-extra-ops.test.ts +0 -484
  642. package/src/__tests__/admin-ops.test.ts +0 -268
  643. package/src/__tests__/admin-setup-ops.test.ts +0 -355
  644. package/src/__tests__/agency-manager.test.ts +0 -374
  645. package/src/__tests__/agent-loop.test.ts +0 -256
  646. package/src/__tests__/capture-ops.test.ts +0 -784
  647. package/src/__tests__/claudemd.test.ts +0 -282
  648. package/src/__tests__/content-hash.test.ts +0 -60
  649. package/src/__tests__/context-engine.test.ts +0 -251
  650. package/src/__tests__/core-ops.test.ts +0 -550
  651. package/src/__tests__/curator-extra-ops.test.ts +0 -383
  652. package/src/__tests__/deprecation.test.ts +0 -78
  653. package/src/__tests__/domain-ops.test.ts +0 -226
  654. package/src/__tests__/domain-packs.test.ts +0 -421
  655. package/src/__tests__/enforcement.test.ts +0 -153
  656. package/src/__tests__/errors.test.ts +0 -388
  657. package/src/__tests__/extensions.test.ts +0 -233
  658. package/src/__tests__/facade-factory.test.ts +0 -271
  659. package/src/__tests__/feature-flags.test.ts +0 -137
  660. package/src/__tests__/flows.test.ts +0 -604
  661. package/src/__tests__/git-vault-sync.test.ts +0 -230
  662. package/src/__tests__/governance.test.ts +0 -522
  663. package/src/__tests__/grading-ops.test.ts +0 -361
  664. package/src/__tests__/health-registry.test.ts +0 -173
  665. package/src/__tests__/identity-manager.test.ts +0 -243
  666. package/src/__tests__/intake-pipeline.test.ts +0 -162
  667. package/src/__tests__/intent-router.test.ts +0 -222
  668. package/src/__tests__/knowledge-review.test.ts +0 -104
  669. package/src/__tests__/llm-client.test.ts +0 -69
  670. package/src/__tests__/llm.test.ts +0 -556
  671. package/src/__tests__/loader.test.ts +0 -176
  672. package/src/__tests__/loop-ops.test.ts +0 -469
  673. package/src/__tests__/lsp-transport.test.ts +0 -442
  674. package/src/__tests__/memory-cross-project-ops.test.ts +0 -248
  675. package/src/__tests__/memory-extra-ops.test.ts +0 -352
  676. package/src/__tests__/migration-runner.test.ts +0 -170
  677. package/src/__tests__/module-manifest-drift.test.ts +0 -59
  678. package/src/__tests__/normalize.test.ts +0 -85
  679. package/src/__tests__/obsidian-sync.test.ts +0 -354
  680. package/src/__tests__/orchestrate-ops.test.ts +0 -289
  681. package/src/__tests__/pack-ops.test.ts +0 -146
  682. package/src/__tests__/persistence.test.ts +0 -291
  683. package/src/__tests__/planning-extra-ops.test.ts +0 -706
  684. package/src/__tests__/playbook-executor.test.ts +0 -249
  685. package/src/__tests__/playbook-registry.test.ts +0 -326
  686. package/src/__tests__/playbook-seeder.test.ts +0 -163
  687. package/src/__tests__/playbook.test.ts +0 -389
  688. package/src/__tests__/plugin-ops.test.ts +0 -411
  689. package/src/__tests__/plugin-system.test.ts +0 -509
  690. package/src/__tests__/project-ops.test.ts +0 -381
  691. package/src/__tests__/replayable-stream.test.ts +0 -177
  692. package/src/__tests__/runtime.test.ts +0 -95
  693. package/src/__tests__/scope-detector.test.ts +0 -121
  694. package/src/__tests__/template-manager.test.ts +0 -222
  695. package/src/__tests__/token-resolver.test.ts +0 -79
  696. package/src/__tests__/transport.test.ts +0 -758
  697. package/src/__tests__/vault-branching.test.ts +0 -274
  698. package/src/__tests__/vault-extra-ops.test.ts +0 -482
  699. package/src/__tests__/vault-integrity.test.ts +0 -71
  700. package/src/__tests__/vault-manager.test.ts +0 -238
  701. package/src/__tests__/ws-transport.test.ts +0 -479
@@ -0,0 +1,540 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import { existsSync, mkdirSync, writeFileSync, rmSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { SQLitePersistenceProvider, applyPerformancePragmas } from './sqlite-provider.js';
6
+ import Database from 'better-sqlite3';
7
+
8
+ // ─── Test Factories ──────────────────────────────────────────────────
9
+
10
+ function createProvider(path = ':memory:'): SQLitePersistenceProvider {
11
+ return new SQLitePersistenceProvider(path);
12
+ }
13
+
14
+ function createProviderWithTable(
15
+ tableDdl = 'CREATE TABLE t (id TEXT PRIMARY KEY, val TEXT)',
16
+ ): SQLitePersistenceProvider {
17
+ const p = createProvider();
18
+ p.execSql(tableDdl);
19
+ return p;
20
+ }
21
+
22
+ function createFtsProvider(): SQLitePersistenceProvider {
23
+ const p = createProvider();
24
+ p.execSql(`
25
+ CREATE TABLE docs (rowid INTEGER PRIMARY KEY, title TEXT, body TEXT);
26
+ CREATE VIRTUAL TABLE docs_fts USING fts5(title, body, content=docs, content_rowid=rowid);
27
+ `);
28
+ return p;
29
+ }
30
+
31
+ function seedFtsRows(
32
+ p: SQLitePersistenceProvider,
33
+ rows: Array<{ rowid: number; title: string; body: string }>,
34
+ ): void {
35
+ for (const row of rows) {
36
+ p.run('INSERT INTO docs (rowid, title, body) VALUES (?, ?, ?)', [
37
+ row.rowid,
38
+ row.title,
39
+ row.body,
40
+ ]);
41
+ p.run('INSERT INTO docs_fts (rowid, title, body) VALUES (?, ?, ?)', [
42
+ row.rowid,
43
+ row.title,
44
+ row.body,
45
+ ]);
46
+ }
47
+ }
48
+
49
+ // ─── applyPerformancePragmas() ───────────────────────────────────────
50
+
51
+ describe('applyPerformancePragmas', () => {
52
+ it('sets cache_size to 64MB', () => {
53
+ // Arrange
54
+ const db = new Database(':memory:');
55
+
56
+ // Act
57
+ applyPerformancePragmas(db);
58
+
59
+ // Assert
60
+ const cacheSize = db.pragma('cache_size', { simple: true });
61
+ expect(cacheSize).toBe(-64000);
62
+ db.close();
63
+ });
64
+
65
+ it('sets temp_store to MEMORY', () => {
66
+ // Arrange
67
+ const db = new Database(':memory:');
68
+
69
+ // Act
70
+ applyPerformancePragmas(db);
71
+
72
+ // Assert — temp_store: 0=DEFAULT, 1=FILE, 2=MEMORY
73
+ const tempStore = db.pragma('temp_store', { simple: true });
74
+ expect(tempStore).toBe(2);
75
+ db.close();
76
+ });
77
+
78
+ it('sets mmap_size to 256MB on file-backed databases', () => {
79
+ // Arrange — mmap_size only takes effect on file-backed DBs
80
+ const tmpPath = join(tmpdir(), `soleri-mmap-test-${Date.now()}.db`);
81
+ const db = new Database(tmpPath);
82
+
83
+ // Act
84
+ applyPerformancePragmas(db);
85
+
86
+ // Assert
87
+ const mmapSize = db.pragma('mmap_size', { simple: true });
88
+ expect(mmapSize).toBe(268435456);
89
+ db.close();
90
+ rmSync(tmpPath, { force: true });
91
+ });
92
+ });
93
+
94
+ // ─── SQLitePersistenceProvider ────────────────────────────────────────
95
+
96
+ describe('SQLitePersistenceProvider', () => {
97
+ describe('execSql', () => {
98
+ it('creates tables from DDL', () => {
99
+ // Arrange
100
+ const p = createProvider();
101
+
102
+ // Act
103
+ p.execSql('CREATE TABLE test (id TEXT PRIMARY KEY, val TEXT)');
104
+ p.run('INSERT INTO test (id, val) VALUES (?, ?)', ['a', 'hello']);
105
+ const row = p.get<{ id: string; val: string }>('SELECT * FROM test WHERE id = ?', ['a']);
106
+
107
+ // Assert
108
+ expect(row).toEqual({ id: 'a', val: 'hello' });
109
+ p.close();
110
+ });
111
+ });
112
+
113
+ describe('run', () => {
114
+ it('inserts with named params and returns changes count', () => {
115
+ // Arrange
116
+ const p = createProviderWithTable('CREATE TABLE t (id TEXT PRIMARY KEY, name TEXT)');
117
+
118
+ // Act
119
+ const result = p.run('INSERT INTO t (id, name) VALUES (@id, @name)', {
120
+ id: '1',
121
+ name: 'test',
122
+ });
123
+
124
+ // Assert
125
+ expect(result.changes).toBe(1);
126
+ p.close();
127
+ });
128
+
129
+ it('inserts with positional params and returns changes count', () => {
130
+ // Arrange
131
+ const p = createProviderWithTable('CREATE TABLE t (id TEXT PRIMARY KEY)');
132
+
133
+ // Act
134
+ const result = p.run('INSERT INTO t (id) VALUES (?)', ['x']);
135
+
136
+ // Assert
137
+ expect(result.changes).toBe(1);
138
+ p.close();
139
+ });
140
+
141
+ it('inserts with no params and returns lastInsertRowid', () => {
142
+ // Arrange
143
+ const p = createProviderWithTable('CREATE TABLE t (id INTEGER PRIMARY KEY AUTOINCREMENT)');
144
+
145
+ // Act
146
+ const result = p.run('INSERT INTO t DEFAULT VALUES');
147
+
148
+ // Assert
149
+ expect(result.changes).toBe(1);
150
+ expect(result.lastInsertRowid).toBe(1);
151
+ p.close();
152
+ });
153
+ });
154
+
155
+ describe('get', () => {
156
+ it('returns undefined when no row matches', () => {
157
+ // Arrange
158
+ const p = createProviderWithTable();
159
+
160
+ // Act
161
+ const row = p.get('SELECT * FROM t WHERE id = ?', ['nonexistent']);
162
+
163
+ // Assert
164
+ expect(row).toBeUndefined();
165
+ p.close();
166
+ });
167
+
168
+ it('returns the matching row with correct types', () => {
169
+ // Arrange
170
+ const p = createProviderWithTable('CREATE TABLE t (id TEXT PRIMARY KEY, num INTEGER)');
171
+ p.run('INSERT INTO t VALUES (?, ?)', ['x', 42]);
172
+
173
+ // Act
174
+ const row = p.get<{ id: string; num: number }>('SELECT * FROM t WHERE id = ?', ['x']);
175
+
176
+ // Assert
177
+ expect(row).toEqual({ id: 'x', num: 42 });
178
+ p.close();
179
+ });
180
+ });
181
+
182
+ describe('all', () => {
183
+ it('returns empty array when no rows match', () => {
184
+ // Arrange
185
+ const p = createProviderWithTable();
186
+
187
+ // Act
188
+ const rows = p.all('SELECT * FROM t');
189
+
190
+ // Assert
191
+ expect(rows).toEqual([]);
192
+ p.close();
193
+ });
194
+
195
+ it('returns all rows in order', () => {
196
+ // Arrange
197
+ const p = createProviderWithTable('CREATE TABLE t (id TEXT PRIMARY KEY, val INTEGER)');
198
+ p.run('INSERT INTO t VALUES (?, ?)', ['a', 1]);
199
+ p.run('INSERT INTO t VALUES (?, ?)', ['b', 2]);
200
+ p.run('INSERT INTO t VALUES (?, ?)', ['c', 3]);
201
+
202
+ // Act
203
+ const rows = p.all<{ id: string; val: number }>('SELECT * FROM t ORDER BY id');
204
+
205
+ // Assert
206
+ expect(rows).toHaveLength(3);
207
+ expect(rows[0]).toEqual({ id: 'a', val: 1 });
208
+ expect(rows[2]).toEqual({ id: 'c', val: 3 });
209
+ p.close();
210
+ });
211
+ });
212
+
213
+ describe('transaction', () => {
214
+ it('commits all operations on success', () => {
215
+ // Arrange
216
+ const p = createProviderWithTable();
217
+
218
+ // Act
219
+ p.transaction(() => {
220
+ p.run("INSERT INTO t VALUES ('a', 'x')");
221
+ p.run("INSERT INTO t VALUES ('b', 'y')");
222
+ });
223
+
224
+ // Assert
225
+ const rows = p.all('SELECT * FROM t');
226
+ expect(rows).toHaveLength(2);
227
+ p.close();
228
+ });
229
+
230
+ it('rolls back all operations on error', () => {
231
+ // Arrange
232
+ const p = createProviderWithTable();
233
+
234
+ // Act & Assert
235
+ expect(() =>
236
+ p.transaction(() => {
237
+ p.run("INSERT INTO t VALUES ('a', 'x')");
238
+ throw new Error('rollback');
239
+ }),
240
+ ).toThrow('rollback');
241
+ const rows = p.all('SELECT * FROM t');
242
+ expect(rows).toHaveLength(0);
243
+ p.close();
244
+ });
245
+
246
+ it('returns the value from the transaction function', () => {
247
+ // Arrange
248
+ const p = createProviderWithTable();
249
+
250
+ // Act
251
+ const result = p.transaction(() => {
252
+ p.run("INSERT INTO t VALUES ('a', 'x')");
253
+ return 42;
254
+ });
255
+
256
+ // Assert
257
+ expect(result).toBe(42);
258
+ p.close();
259
+ });
260
+ });
261
+
262
+ describe('getDatabase', () => {
263
+ it('returns a better-sqlite3 Database instance with prepare method', () => {
264
+ // Arrange
265
+ const p = createProvider();
266
+
267
+ // Act
268
+ const db = p.getDatabase();
269
+
270
+ // Assert
271
+ expect(db).toBeInstanceOf(Database);
272
+ expect(typeof db.prepare).toBe('function');
273
+ p.close();
274
+ });
275
+ });
276
+
277
+ describe('backend', () => {
278
+ it('returns "sqlite"', () => {
279
+ // Arrange & Act
280
+ const p = createProvider();
281
+
282
+ // Assert
283
+ expect(p.backend).toBe('sqlite');
284
+ p.close();
285
+ });
286
+ });
287
+
288
+ describe('close', () => {
289
+ it('prevents further operations after close', () => {
290
+ // Arrange
291
+ const p = createProvider();
292
+
293
+ // Act
294
+ p.close();
295
+
296
+ // Assert
297
+ expect(() => p.run('SELECT 1')).toThrow();
298
+ });
299
+ });
300
+
301
+ describe('ftsSearch', () => {
302
+ it('returns matching rows by FTS query', () => {
303
+ // Arrange
304
+ const p = createFtsProvider();
305
+ seedFtsRows(p, [
306
+ { rowid: 1, title: 'Hello World', body: 'This is a test document' },
307
+ { rowid: 2, title: 'Goodbye', body: 'Another test here' },
308
+ ]);
309
+
310
+ // Act
311
+ const results = p.ftsSearch<{ title: string; body: string }>('docs', 'hello');
312
+
313
+ // Assert
314
+ expect(results).toHaveLength(1);
315
+ expect(results[0].title).toBe('Hello World');
316
+ p.close();
317
+ });
318
+
319
+ it('respects limit option', () => {
320
+ // Arrange
321
+ const p = createFtsProvider();
322
+ seedFtsRows(p, [
323
+ { rowid: 1, title: 'test alpha', body: 'a' },
324
+ { rowid: 2, title: 'test beta', body: 'b' },
325
+ { rowid: 3, title: 'test gamma', body: 'c' },
326
+ ]);
327
+
328
+ // Act
329
+ const results = p.ftsSearch<{ title: string }>('docs', 'test', { limit: 2 });
330
+
331
+ // Assert
332
+ expect(results).toHaveLength(2);
333
+ p.close();
334
+ });
335
+
336
+ it('respects offset option', () => {
337
+ // Arrange
338
+ const p = createFtsProvider();
339
+ seedFtsRows(p, [
340
+ { rowid: 1, title: 'test alpha', body: 'a' },
341
+ { rowid: 2, title: 'test beta', body: 'b' },
342
+ { rowid: 3, title: 'test gamma', body: 'c' },
343
+ ]);
344
+
345
+ // Act
346
+ const results = p.ftsSearch<{ title: string }>('docs', 'test', { limit: 1, offset: 2 });
347
+
348
+ // Assert
349
+ expect(results).toHaveLength(1);
350
+ p.close();
351
+ });
352
+
353
+ it('applies column filters on the base table', () => {
354
+ // Arrange
355
+ const p = createProvider();
356
+ p.execSql(`
357
+ CREATE TABLE notes (rowid INTEGER PRIMARY KEY, title TEXT, category TEXT);
358
+ CREATE VIRTUAL TABLE notes_fts USING fts5(title, content=notes, content_rowid=rowid);
359
+ INSERT INTO notes (rowid, title, category) VALUES (1, 'design pattern', 'arch');
360
+ INSERT INTO notes (rowid, title, category) VALUES (2, 'design review', 'process');
361
+ INSERT INTO notes_fts (rowid, title) VALUES (1, 'design pattern');
362
+ INSERT INTO notes_fts (rowid, title) VALUES (2, 'design review');
363
+ `);
364
+
365
+ // Act
366
+ const filtered = p.ftsSearch<{ title: string; category: string }>('notes', 'design', {
367
+ filters: { category: 'arch' },
368
+ });
369
+
370
+ // Assert
371
+ expect(filtered).toHaveLength(1);
372
+ expect(filtered[0].category).toBe('arch');
373
+ p.close();
374
+ });
375
+
376
+ it('returns empty array when no FTS matches', () => {
377
+ // Arrange
378
+ const p = createFtsProvider();
379
+ seedFtsRows(p, [{ rowid: 1, title: 'Hello', body: 'world' }]);
380
+
381
+ // Act
382
+ const results = p.ftsSearch('docs', 'nonexistent');
383
+
384
+ // Assert
385
+ expect(results).toEqual([]);
386
+ p.close();
387
+ });
388
+ });
389
+
390
+ describe('ftsRebuild', () => {
391
+ it('does not throw when FTS table does not exist', () => {
392
+ // Arrange
393
+ const p = createProvider();
394
+
395
+ // Act & Assert
396
+ expect(() => p.ftsRebuild('nonexistent')).not.toThrow();
397
+ p.close();
398
+ });
399
+
400
+ it('rebuilds an existing FTS index without error', () => {
401
+ // Arrange
402
+ const p = createFtsProvider();
403
+ seedFtsRows(p, [{ rowid: 1, title: 'test', body: 'content' }]);
404
+
405
+ // Act & Assert
406
+ expect(() => p.ftsRebuild('docs')).not.toThrow();
407
+ p.close();
408
+ });
409
+ });
410
+
411
+ // ─── Edge Cases ──────────────────────────────────────────────────────
412
+
413
+ describe('edge cases', () => {
414
+ const tmpBase = join(tmpdir(), 'soleri-persistence-test');
415
+
416
+ afterEach(() => {
417
+ try {
418
+ rmSync(tmpBase, { recursive: true, force: true });
419
+ } catch {
420
+ // cleanup best-effort
421
+ }
422
+ });
423
+
424
+ it('creates parent directories for file-backed databases', () => {
425
+ // Arrange
426
+ const nested = join(tmpBase, 'deep', 'nested', 'test.db');
427
+
428
+ // Act
429
+ const p = new SQLitePersistenceProvider(nested);
430
+
431
+ // Assert
432
+ expect(existsSync(nested)).toBe(true);
433
+ p.close();
434
+ });
435
+
436
+ it('applies performance pragmas for file-backed databases', () => {
437
+ // Arrange
438
+ mkdirSync(tmpBase, { recursive: true });
439
+ const dbPath = join(tmpBase, 'pragmas.db');
440
+
441
+ // Act
442
+ const p = new SQLitePersistenceProvider(dbPath);
443
+ const db = p.getDatabase();
444
+
445
+ // Assert
446
+ const cacheSize = db.pragma('cache_size', { simple: true });
447
+ expect(cacheSize).toBe(-64000);
448
+ p.close();
449
+ });
450
+
451
+ it('does NOT apply performance pragmas for in-memory databases', () => {
452
+ // Arrange & Act
453
+ const p = createProvider();
454
+ const db = p.getDatabase();
455
+
456
+ // Assert — in-memory default cache_size is NOT -64000
457
+ const cacheSize = db.pragma('cache_size', { simple: true });
458
+ expect(cacheSize).not.toBe(-64000);
459
+ p.close();
460
+ });
461
+
462
+ it('recovers from corrupt database by throwing on open', () => {
463
+ // Arrange — write garbage bytes to a file
464
+ mkdirSync(tmpBase, { recursive: true });
465
+ const dbPath = join(tmpBase, 'corrupt.db');
466
+ writeFileSync(dbPath, 'this is not a valid sqlite database');
467
+
468
+ // Act & Assert — better-sqlite3 throws on open for corrupt files
469
+ expect(() => new SQLitePersistenceProvider(dbPath)).toThrow();
470
+ });
471
+
472
+ it('WAL mode can be enabled on file-backed databases', () => {
473
+ // Arrange
474
+ mkdirSync(tmpBase, { recursive: true });
475
+ const dbPath = join(tmpBase, 'wal-test.db');
476
+ const p = new SQLitePersistenceProvider(dbPath);
477
+
478
+ // Act
479
+ p.run('PRAGMA journal_mode = WAL');
480
+
481
+ // Assert
482
+ const db = p.getDatabase();
483
+ const mode = db.pragma('journal_mode', { simple: true });
484
+ expect(mode).toBe('wal');
485
+ p.close();
486
+ });
487
+
488
+ it('handles concurrent read-after-write within same provider', () => {
489
+ // Arrange
490
+ const p = createProviderWithTable('CREATE TABLE t (id TEXT PRIMARY KEY, val INTEGER)');
491
+
492
+ // Act — write then immediately read
493
+ p.run('INSERT INTO t VALUES (?, ?)', ['k1', 100]);
494
+ const row = p.get<{ id: string; val: number }>('SELECT * FROM t WHERE id = ?', ['k1']);
495
+
496
+ // Assert
497
+ expect(row).toEqual({ id: 'k1', val: 100 });
498
+ p.close();
499
+ });
500
+
501
+ it('handles multiple sequential transactions', () => {
502
+ // Arrange
503
+ const p = createProviderWithTable('CREATE TABLE t (id TEXT PRIMARY KEY, val INTEGER)');
504
+
505
+ // Act
506
+ p.transaction(() => p.run('INSERT INTO t VALUES (?, ?)', ['a', 1]));
507
+ p.transaction(() => p.run('INSERT INTO t VALUES (?, ?)', ['b', 2]));
508
+ p.transaction(() => {
509
+ p.run('UPDATE t SET val = ? WHERE id = ?', [10, 'a']);
510
+ });
511
+
512
+ // Assert
513
+ const rows = p.all<{ id: string; val: number }>('SELECT * FROM t ORDER BY id');
514
+ expect(rows).toEqual([
515
+ { id: 'a', val: 10 },
516
+ { id: 'b', val: 2 },
517
+ ]);
518
+ p.close();
519
+ });
520
+
521
+ it('two providers can read/write same file-backed database sequentially', () => {
522
+ // Arrange
523
+ mkdirSync(tmpBase, { recursive: true });
524
+ const dbPath = join(tmpBase, 'concurrent.db');
525
+ const p1 = new SQLitePersistenceProvider(dbPath);
526
+ p1.run('PRAGMA journal_mode = WAL');
527
+ p1.execSql('CREATE TABLE t (id TEXT PRIMARY KEY)');
528
+ p1.run('INSERT INTO t VALUES (?)', ['from-p1']);
529
+ p1.close();
530
+
531
+ // Act — second provider opens the same file
532
+ const p2 = new SQLitePersistenceProvider(dbPath);
533
+ const rows = p2.all<{ id: string }>('SELECT * FROM t');
534
+
535
+ // Assert
536
+ expect(rows).toEqual([{ id: 'from-p1' }]);
537
+ p2.close();
538
+ });
539
+ });
540
+ });
@@ -15,6 +15,13 @@ import type {
15
15
  FtsSearchOptions,
16
16
  } from './types.js';
17
17
 
18
+ /** Apply performance-tuning PRAGMAs for file-backed SQLite databases. */
19
+ export function applyPerformancePragmas(db: Database.Database): void {
20
+ db.pragma('cache_size = -64000'); // 64MB
21
+ db.pragma('temp_store = MEMORY');
22
+ db.pragma('mmap_size = 268435456'); // 256MB
23
+ }
24
+
18
25
  export class SQLitePersistenceProvider implements PersistenceProvider {
19
26
  readonly backend = 'sqlite' as const;
20
27
  private db: Database.Database;
@@ -22,11 +29,7 @@ export class SQLitePersistenceProvider implements PersistenceProvider {
22
29
  constructor(path: string = ':memory:') {
23
30
  if (path !== ':memory:') mkdirSync(dirname(path), { recursive: true });
24
31
  this.db = new Database(path);
25
- if (path !== ':memory:') {
26
- this.db.pragma('cache_size = -64000'); // 64MB
27
- this.db.pragma('temp_store = MEMORY');
28
- this.db.pragma('mmap_size = 268435456'); // 256MB
29
- }
32
+ if (path !== ':memory:') applyPerformancePragmas(this.db);
30
33
  }
31
34
 
32
35
  execSql(sql: string): void {
@@ -0,0 +1,59 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import {
3
+ ITALIAN_CRAFTSPERSON,
4
+ PERSONA_TEMPLATES,
5
+ createDefaultPersona,
6
+ } from './defaults.js';
7
+
8
+ describe('ITALIAN_CRAFTSPERSON', () => {
9
+ it('uses italian-craftsperson template id', () => {
10
+ expect(ITALIAN_CRAFTSPERSON.template).toBe('italian-craftsperson');
11
+ });
12
+
13
+ it('has non-empty voice, culture, and inspiration', () => {
14
+ expect(ITALIAN_CRAFTSPERSON.voice.length).toBeGreaterThan(0);
15
+ expect(ITALIAN_CRAFTSPERSON.culture).toBe('Italian');
16
+ expect(ITALIAN_CRAFTSPERSON.inspiration.length).toBeGreaterThan(0);
17
+ });
18
+
19
+ it('provides greetings and signoffs pools', () => {
20
+ expect(ITALIAN_CRAFTSPERSON.greetings.length).toBeGreaterThan(0);
21
+ expect(ITALIAN_CRAFTSPERSON.signoffs.length).toBeGreaterThan(0);
22
+ });
23
+
24
+ it('includes expected trait and quirk arrays', () => {
25
+ expect(ITALIAN_CRAFTSPERSON.traits.length).toBeGreaterThan(0);
26
+ expect(ITALIAN_CRAFTSPERSON.quirks.length).toBeGreaterThan(0);
27
+ expect(ITALIAN_CRAFTSPERSON.metaphors.length).toBeGreaterThan(0);
28
+ expect(ITALIAN_CRAFTSPERSON.opinions.length).toBeGreaterThan(0);
29
+ });
30
+ });
31
+
32
+ describe('PERSONA_TEMPLATES', () => {
33
+ it('contains italian-craftsperson entry', () => {
34
+ expect(PERSONA_TEMPLATES['italian-craftsperson']).toBe(ITALIAN_CRAFTSPERSON);
35
+ });
36
+
37
+ it('does not include name or history in template entries', () => {
38
+ for (const tmpl of Object.values(PERSONA_TEMPLATES)) {
39
+ expect(tmpl).not.toHaveProperty('name');
40
+ expect(tmpl).not.toHaveProperty('history');
41
+ }
42
+ });
43
+ });
44
+
45
+ describe('createDefaultPersona', () => {
46
+ it('creates a full PersonaConfig with given name', () => {
47
+ const p = createDefaultPersona('TestAgent');
48
+ expect(p.name).toBe('TestAgent');
49
+ expect(p.template).toBe('italian-craftsperson');
50
+ expect(p.voice).toBe(ITALIAN_CRAFTSPERSON.voice);
51
+ });
52
+
53
+ it('spreads all template fields into the result', () => {
54
+ const p = createDefaultPersona('A');
55
+ expect(p.traits).toEqual(ITALIAN_CRAFTSPERSON.traits);
56
+ expect(p.greetings).toEqual(ITALIAN_CRAFTSPERSON.greetings);
57
+ expect(p.culture).toBe(ITALIAN_CRAFTSPERSON.culture);
58
+ });
59
+ });
@@ -0,0 +1,67 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { loadPersona } from './loader.js';
3
+ import { ITALIAN_CRAFTSPERSON } from './defaults.js';
4
+
5
+ describe('loadPersona', () => {
6
+ it('returns blank persona when no config provided', () => {
7
+ const p = loadPersona('MyAgent');
8
+ expect(p.name).toBe('MyAgent');
9
+ expect(p.template).toBe('none');
10
+ expect(p.voice).toBe('');
11
+ expect(p.traits).toEqual([]);
12
+ expect(p.greetings).toEqual([]);
13
+ });
14
+
15
+ it('expands built-in template when template id matches', () => {
16
+ const p = loadPersona('Atlas', { template: 'italian-craftsperson' });
17
+ expect(p.name).toBe('Atlas');
18
+ expect(p.template).toBe('italian-craftsperson');
19
+ expect(p.voice).toBe(ITALIAN_CRAFTSPERSON.voice);
20
+ expect(p.traits).toEqual(ITALIAN_CRAFTSPERSON.traits);
21
+ });
22
+
23
+ it('uses rawPersona.name over agentName when provided', () => {
24
+ const p = loadPersona('FallbackName', { name: 'Custom', template: 'italian-craftsperson' });
25
+ expect(p.name).toBe('Custom');
26
+ });
27
+
28
+ it('falls back to agentName when rawPersona.name is missing', () => {
29
+ const p = loadPersona('AgentX', { template: 'italian-craftsperson' });
30
+ expect(p.name).toBe('AgentX');
31
+ });
32
+
33
+ it('allows overriding specific template fields', () => {
34
+ const p = loadPersona('Agent', {
35
+ template: 'italian-craftsperson',
36
+ voice: 'Custom voice',
37
+ });
38
+ expect(p.voice).toBe('Custom voice');
39
+ expect(p.traits).toEqual(ITALIAN_CRAFTSPERSON.traits);
40
+ });
41
+
42
+ it('uses blank persona base for unknown template', () => {
43
+ const p = loadPersona('Agent', { template: 'unknown-template', voice: 'My voice' });
44
+ expect(p.template).toBe('unknown-template');
45
+ expect(p.voice).toBe('My voice');
46
+ expect(p.traits).toEqual([]);
47
+ });
48
+
49
+ it('initializes history to empty array when not provided', () => {
50
+ const p = loadPersona('Agent', { template: 'italian-craftsperson' });
51
+ expect(p.history).toEqual([]);
52
+ });
53
+
54
+ it('preserves provided history', () => {
55
+ const history = [{ archivedAt: '2024-01-01', config: { name: 'Old' } as never }];
56
+ const p = loadPersona('Agent', { template: 'italian-craftsperson', history });
57
+ expect(p.history).toBe(history);
58
+ });
59
+
60
+ it('does not override template with undefined rawPersona fields', () => {
61
+ const p = loadPersona('Agent', {
62
+ template: 'italian-craftsperson',
63
+ culture: undefined,
64
+ });
65
+ expect(p.culture).toBe('Italian');
66
+ });
67
+ });