@soleri/core 2.4.0 → 2.6.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 (328) hide show
  1. package/dist/brain/brain.d.ts +7 -0
  2. package/dist/brain/brain.d.ts.map +1 -1
  3. package/dist/brain/brain.js +56 -9
  4. package/dist/brain/brain.js.map +1 -1
  5. package/dist/brain/intelligence.d.ts +1 -0
  6. package/dist/brain/intelligence.d.ts.map +1 -1
  7. package/dist/brain/intelligence.js +164 -148
  8. package/dist/brain/intelligence.js.map +1 -1
  9. package/dist/brain/types.d.ts +2 -2
  10. package/dist/brain/types.d.ts.map +1 -1
  11. package/dist/cognee/client.d.ts +3 -0
  12. package/dist/cognee/client.d.ts.map +1 -1
  13. package/dist/cognee/client.js +17 -0
  14. package/dist/cognee/client.js.map +1 -1
  15. package/dist/cognee/sync-manager.d.ts +94 -0
  16. package/dist/cognee/sync-manager.d.ts.map +1 -0
  17. package/dist/cognee/sync-manager.js +293 -0
  18. package/dist/cognee/sync-manager.js.map +1 -0
  19. package/dist/control/identity-manager.d.ts +3 -1
  20. package/dist/control/identity-manager.d.ts.map +1 -1
  21. package/dist/control/identity-manager.js +49 -51
  22. package/dist/control/identity-manager.js.map +1 -1
  23. package/dist/control/intent-router.d.ts +1 -0
  24. package/dist/control/intent-router.d.ts.map +1 -1
  25. package/dist/control/intent-router.js +32 -32
  26. package/dist/control/intent-router.js.map +1 -1
  27. package/dist/curator/curator.d.ts +9 -1
  28. package/dist/curator/curator.d.ts.map +1 -1
  29. package/dist/curator/curator.js +104 -92
  30. package/dist/curator/curator.js.map +1 -1
  31. package/dist/errors/classify.d.ts +13 -0
  32. package/dist/errors/classify.d.ts.map +1 -0
  33. package/dist/errors/classify.js +97 -0
  34. package/dist/errors/classify.js.map +1 -0
  35. package/dist/errors/index.d.ts +6 -0
  36. package/dist/errors/index.d.ts.map +1 -0
  37. package/dist/errors/index.js +4 -0
  38. package/dist/errors/index.js.map +1 -0
  39. package/dist/errors/retry.d.ts +40 -0
  40. package/dist/errors/retry.d.ts.map +1 -0
  41. package/dist/errors/retry.js +97 -0
  42. package/dist/errors/retry.js.map +1 -0
  43. package/dist/errors/types.d.ts +48 -0
  44. package/dist/errors/types.d.ts.map +1 -0
  45. package/dist/errors/types.js +59 -0
  46. package/dist/errors/types.js.map +1 -0
  47. package/dist/governance/governance.d.ts +1 -0
  48. package/dist/governance/governance.d.ts.map +1 -1
  49. package/dist/governance/governance.js +51 -68
  50. package/dist/governance/governance.js.map +1 -1
  51. package/dist/index.d.ts +26 -5
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +22 -3
  54. package/dist/index.js.map +1 -1
  55. package/dist/intake/content-classifier.d.ts +14 -0
  56. package/dist/intake/content-classifier.d.ts.map +1 -0
  57. package/dist/intake/content-classifier.js +125 -0
  58. package/dist/intake/content-classifier.js.map +1 -0
  59. package/dist/intake/dedup-gate.d.ts +17 -0
  60. package/dist/intake/dedup-gate.d.ts.map +1 -0
  61. package/dist/intake/dedup-gate.js +66 -0
  62. package/dist/intake/dedup-gate.js.map +1 -0
  63. package/dist/intake/intake-pipeline.d.ts +63 -0
  64. package/dist/intake/intake-pipeline.d.ts.map +1 -0
  65. package/dist/intake/intake-pipeline.js +373 -0
  66. package/dist/intake/intake-pipeline.js.map +1 -0
  67. package/dist/intake/types.d.ts +65 -0
  68. package/dist/intake/types.d.ts.map +1 -0
  69. package/dist/intake/types.js +3 -0
  70. package/dist/intake/types.js.map +1 -0
  71. package/dist/intelligence/loader.js +1 -1
  72. package/dist/intelligence/loader.js.map +1 -1
  73. package/dist/intelligence/types.d.ts +3 -1
  74. package/dist/intelligence/types.d.ts.map +1 -1
  75. package/dist/loop/loop-manager.d.ts +58 -7
  76. package/dist/loop/loop-manager.d.ts.map +1 -1
  77. package/dist/loop/loop-manager.js +280 -6
  78. package/dist/loop/loop-manager.js.map +1 -1
  79. package/dist/loop/types.d.ts +69 -1
  80. package/dist/loop/types.d.ts.map +1 -1
  81. package/dist/loop/types.js +4 -1
  82. package/dist/loop/types.js.map +1 -1
  83. package/dist/persistence/index.d.ts +4 -0
  84. package/dist/persistence/index.d.ts.map +1 -0
  85. package/dist/persistence/index.js +3 -0
  86. package/dist/persistence/index.js.map +1 -0
  87. package/dist/persistence/postgres-provider.d.ts +46 -0
  88. package/dist/persistence/postgres-provider.d.ts.map +1 -0
  89. package/dist/persistence/postgres-provider.js +115 -0
  90. package/dist/persistence/postgres-provider.js.map +1 -0
  91. package/dist/persistence/sqlite-provider.d.ts +28 -0
  92. package/dist/persistence/sqlite-provider.d.ts.map +1 -0
  93. package/dist/persistence/sqlite-provider.js +97 -0
  94. package/dist/persistence/sqlite-provider.js.map +1 -0
  95. package/dist/persistence/types.d.ts +58 -0
  96. package/dist/persistence/types.d.ts.map +1 -0
  97. package/dist/persistence/types.js +8 -0
  98. package/dist/persistence/types.js.map +1 -0
  99. package/dist/planning/gap-analysis.d.ts +47 -4
  100. package/dist/planning/gap-analysis.d.ts.map +1 -1
  101. package/dist/planning/gap-analysis.js +190 -13
  102. package/dist/planning/gap-analysis.js.map +1 -1
  103. package/dist/planning/gap-types.d.ts +1 -1
  104. package/dist/planning/gap-types.d.ts.map +1 -1
  105. package/dist/planning/gap-types.js.map +1 -1
  106. package/dist/planning/planner.d.ts +277 -9
  107. package/dist/planning/planner.d.ts.map +1 -1
  108. package/dist/planning/planner.js +611 -46
  109. package/dist/planning/planner.js.map +1 -1
  110. package/dist/playbooks/generic/brainstorming.d.ts +9 -0
  111. package/dist/playbooks/generic/brainstorming.d.ts.map +1 -0
  112. package/dist/playbooks/generic/brainstorming.js +105 -0
  113. package/dist/playbooks/generic/brainstorming.js.map +1 -0
  114. package/dist/playbooks/generic/code-review.d.ts +11 -0
  115. package/dist/playbooks/generic/code-review.d.ts.map +1 -0
  116. package/dist/playbooks/generic/code-review.js +176 -0
  117. package/dist/playbooks/generic/code-review.js.map +1 -0
  118. package/dist/playbooks/generic/subagent-execution.d.ts +9 -0
  119. package/dist/playbooks/generic/subagent-execution.d.ts.map +1 -0
  120. package/dist/playbooks/generic/subagent-execution.js +68 -0
  121. package/dist/playbooks/generic/subagent-execution.js.map +1 -0
  122. package/dist/playbooks/generic/systematic-debugging.d.ts +9 -0
  123. package/dist/playbooks/generic/systematic-debugging.d.ts.map +1 -0
  124. package/dist/playbooks/generic/systematic-debugging.js +87 -0
  125. package/dist/playbooks/generic/systematic-debugging.js.map +1 -0
  126. package/dist/playbooks/generic/tdd.d.ts +9 -0
  127. package/dist/playbooks/generic/tdd.d.ts.map +1 -0
  128. package/dist/playbooks/generic/tdd.js +70 -0
  129. package/dist/playbooks/generic/tdd.js.map +1 -0
  130. package/dist/playbooks/generic/verification.d.ts +9 -0
  131. package/dist/playbooks/generic/verification.d.ts.map +1 -0
  132. package/dist/playbooks/generic/verification.js +74 -0
  133. package/dist/playbooks/generic/verification.js.map +1 -0
  134. package/dist/playbooks/index.d.ts +4 -0
  135. package/dist/playbooks/index.d.ts.map +1 -0
  136. package/dist/playbooks/index.js +5 -0
  137. package/dist/playbooks/index.js.map +1 -0
  138. package/dist/playbooks/playbook-registry.d.ts +42 -0
  139. package/dist/playbooks/playbook-registry.d.ts.map +1 -0
  140. package/dist/playbooks/playbook-registry.js +227 -0
  141. package/dist/playbooks/playbook-registry.js.map +1 -0
  142. package/dist/playbooks/playbook-seeder.d.ts +47 -0
  143. package/dist/playbooks/playbook-seeder.d.ts.map +1 -0
  144. package/dist/playbooks/playbook-seeder.js +104 -0
  145. package/dist/playbooks/playbook-seeder.js.map +1 -0
  146. package/dist/playbooks/playbook-types.d.ts +132 -0
  147. package/dist/playbooks/playbook-types.d.ts.map +1 -0
  148. package/dist/playbooks/playbook-types.js +12 -0
  149. package/dist/playbooks/playbook-types.js.map +1 -0
  150. package/dist/project/project-registry.d.ts +4 -4
  151. package/dist/project/project-registry.d.ts.map +1 -1
  152. package/dist/project/project-registry.js +30 -57
  153. package/dist/project/project-registry.js.map +1 -1
  154. package/dist/prompts/index.d.ts +4 -0
  155. package/dist/prompts/index.d.ts.map +1 -0
  156. package/dist/prompts/index.js +3 -0
  157. package/dist/prompts/index.js.map +1 -0
  158. package/dist/prompts/parser.d.ts +17 -0
  159. package/dist/prompts/parser.d.ts.map +1 -0
  160. package/dist/prompts/parser.js +47 -0
  161. package/dist/prompts/parser.js.map +1 -0
  162. package/dist/prompts/template-manager.d.ts +25 -0
  163. package/dist/prompts/template-manager.d.ts.map +1 -0
  164. package/dist/prompts/template-manager.js +71 -0
  165. package/dist/prompts/template-manager.js.map +1 -0
  166. package/dist/prompts/types.d.ts +26 -0
  167. package/dist/prompts/types.d.ts.map +1 -0
  168. package/dist/prompts/types.js +5 -0
  169. package/dist/prompts/types.js.map +1 -0
  170. package/dist/runtime/admin-extra-ops.d.ts +5 -3
  171. package/dist/runtime/admin-extra-ops.d.ts.map +1 -1
  172. package/dist/runtime/admin-extra-ops.js +348 -11
  173. package/dist/runtime/admin-extra-ops.js.map +1 -1
  174. package/dist/runtime/admin-ops.d.ts.map +1 -1
  175. package/dist/runtime/admin-ops.js +10 -3
  176. package/dist/runtime/admin-ops.js.map +1 -1
  177. package/dist/runtime/capture-ops.d.ts.map +1 -1
  178. package/dist/runtime/capture-ops.js +20 -2
  179. package/dist/runtime/capture-ops.js.map +1 -1
  180. package/dist/runtime/cognee-sync-ops.d.ts +12 -0
  181. package/dist/runtime/cognee-sync-ops.d.ts.map +1 -0
  182. package/dist/runtime/cognee-sync-ops.js +55 -0
  183. package/dist/runtime/cognee-sync-ops.js.map +1 -0
  184. package/dist/runtime/core-ops.d.ts +8 -6
  185. package/dist/runtime/core-ops.d.ts.map +1 -1
  186. package/dist/runtime/core-ops.js +226 -9
  187. package/dist/runtime/core-ops.js.map +1 -1
  188. package/dist/runtime/curator-extra-ops.d.ts +2 -2
  189. package/dist/runtime/curator-extra-ops.d.ts.map +1 -1
  190. package/dist/runtime/curator-extra-ops.js +15 -3
  191. package/dist/runtime/curator-extra-ops.js.map +1 -1
  192. package/dist/runtime/domain-ops.js +2 -2
  193. package/dist/runtime/domain-ops.js.map +1 -1
  194. package/dist/runtime/grading-ops.d.ts.map +1 -1
  195. package/dist/runtime/grading-ops.js.map +1 -1
  196. package/dist/runtime/intake-ops.d.ts +14 -0
  197. package/dist/runtime/intake-ops.d.ts.map +1 -0
  198. package/dist/runtime/intake-ops.js +110 -0
  199. package/dist/runtime/intake-ops.js.map +1 -0
  200. package/dist/runtime/loop-ops.d.ts +5 -4
  201. package/dist/runtime/loop-ops.d.ts.map +1 -1
  202. package/dist/runtime/loop-ops.js +84 -12
  203. package/dist/runtime/loop-ops.js.map +1 -1
  204. package/dist/runtime/memory-cross-project-ops.d.ts.map +1 -1
  205. package/dist/runtime/memory-cross-project-ops.js.map +1 -1
  206. package/dist/runtime/memory-extra-ops.js +5 -5
  207. package/dist/runtime/memory-extra-ops.js.map +1 -1
  208. package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
  209. package/dist/runtime/orchestrate-ops.js +8 -2
  210. package/dist/runtime/orchestrate-ops.js.map +1 -1
  211. package/dist/runtime/planning-extra-ops.d.ts +13 -5
  212. package/dist/runtime/planning-extra-ops.d.ts.map +1 -1
  213. package/dist/runtime/planning-extra-ops.js +381 -18
  214. package/dist/runtime/planning-extra-ops.js.map +1 -1
  215. package/dist/runtime/playbook-ops.d.ts +14 -0
  216. package/dist/runtime/playbook-ops.d.ts.map +1 -0
  217. package/dist/runtime/playbook-ops.js +141 -0
  218. package/dist/runtime/playbook-ops.js.map +1 -0
  219. package/dist/runtime/project-ops.d.ts.map +1 -1
  220. package/dist/runtime/project-ops.js +7 -2
  221. package/dist/runtime/project-ops.js.map +1 -1
  222. package/dist/runtime/runtime.d.ts.map +1 -1
  223. package/dist/runtime/runtime.js +28 -9
  224. package/dist/runtime/runtime.js.map +1 -1
  225. package/dist/runtime/types.d.ts +8 -0
  226. package/dist/runtime/types.d.ts.map +1 -1
  227. package/dist/runtime/vault-extra-ops.d.ts +4 -2
  228. package/dist/runtime/vault-extra-ops.d.ts.map +1 -1
  229. package/dist/runtime/vault-extra-ops.js +383 -4
  230. package/dist/runtime/vault-extra-ops.js.map +1 -1
  231. package/dist/vault/playbook.d.ts +34 -0
  232. package/dist/vault/playbook.d.ts.map +1 -0
  233. package/dist/vault/playbook.js +60 -0
  234. package/dist/vault/playbook.js.map +1 -0
  235. package/dist/vault/vault.d.ts +52 -32
  236. package/dist/vault/vault.d.ts.map +1 -1
  237. package/dist/vault/vault.js +300 -181
  238. package/dist/vault/vault.js.map +1 -1
  239. package/package.json +9 -3
  240. package/src/__tests__/admin-extra-ops.test.ts +62 -15
  241. package/src/__tests__/admin-ops.test.ts +2 -2
  242. package/src/__tests__/brain.test.ts +3 -3
  243. package/src/__tests__/cognee-integration.test.ts +80 -0
  244. package/src/__tests__/cognee-sync-manager.test.ts +103 -0
  245. package/src/__tests__/core-ops.test.ts +36 -4
  246. package/src/__tests__/curator-extra-ops.test.ts +24 -2
  247. package/src/__tests__/errors.test.ts +388 -0
  248. package/src/__tests__/grading-ops.test.ts +28 -7
  249. package/src/__tests__/intake-pipeline.test.ts +162 -0
  250. package/src/__tests__/loop-ops.test.ts +74 -3
  251. package/src/__tests__/memory-cross-project-ops.test.ts +3 -1
  252. package/src/__tests__/orchestrate-ops.test.ts +8 -3
  253. package/src/__tests__/persistence.test.ts +291 -0
  254. package/src/__tests__/planner.test.ts +99 -21
  255. package/src/__tests__/planning-extra-ops.test.ts +168 -10
  256. package/src/__tests__/playbook-registry.test.ts +326 -0
  257. package/src/__tests__/playbook-seeder.test.ts +163 -0
  258. package/src/__tests__/playbook.test.ts +389 -0
  259. package/src/__tests__/postgres-provider.test.ts +58 -0
  260. package/src/__tests__/project-ops.test.ts +18 -4
  261. package/src/__tests__/template-manager.test.ts +222 -0
  262. package/src/__tests__/vault-extra-ops.test.ts +82 -7
  263. package/src/__tests__/vault.test.ts +184 -0
  264. package/src/brain/brain.ts +71 -9
  265. package/src/brain/intelligence.ts +258 -307
  266. package/src/brain/types.ts +2 -2
  267. package/src/cognee/client.ts +18 -0
  268. package/src/cognee/sync-manager.ts +389 -0
  269. package/src/control/identity-manager.ts +77 -75
  270. package/src/control/intent-router.ts +55 -57
  271. package/src/curator/curator.ts +199 -139
  272. package/src/errors/classify.ts +102 -0
  273. package/src/errors/index.ts +5 -0
  274. package/src/errors/retry.ts +132 -0
  275. package/src/errors/types.ts +81 -0
  276. package/src/governance/governance.ts +90 -107
  277. package/src/index.ts +116 -3
  278. package/src/intake/content-classifier.ts +146 -0
  279. package/src/intake/dedup-gate.ts +92 -0
  280. package/src/intake/intake-pipeline.ts +503 -0
  281. package/src/intake/types.ts +69 -0
  282. package/src/intelligence/loader.ts +1 -1
  283. package/src/intelligence/types.ts +3 -1
  284. package/src/loop/loop-manager.ts +325 -7
  285. package/src/loop/types.ts +72 -1
  286. package/src/persistence/index.ts +9 -0
  287. package/src/persistence/postgres-provider.ts +157 -0
  288. package/src/persistence/sqlite-provider.ts +115 -0
  289. package/src/persistence/types.ts +74 -0
  290. package/src/planning/gap-analysis.ts +286 -17
  291. package/src/planning/gap-types.ts +4 -1
  292. package/src/planning/planner.ts +828 -55
  293. package/src/playbooks/generic/brainstorming.ts +110 -0
  294. package/src/playbooks/generic/code-review.ts +181 -0
  295. package/src/playbooks/generic/subagent-execution.ts +74 -0
  296. package/src/playbooks/generic/systematic-debugging.ts +92 -0
  297. package/src/playbooks/generic/tdd.ts +75 -0
  298. package/src/playbooks/generic/verification.ts +79 -0
  299. package/src/playbooks/index.ts +27 -0
  300. package/src/playbooks/playbook-registry.ts +284 -0
  301. package/src/playbooks/playbook-seeder.ts +119 -0
  302. package/src/playbooks/playbook-types.ts +162 -0
  303. package/src/project/project-registry.ts +81 -74
  304. package/src/prompts/index.ts +3 -0
  305. package/src/prompts/parser.ts +59 -0
  306. package/src/prompts/template-manager.ts +77 -0
  307. package/src/prompts/types.ts +28 -0
  308. package/src/runtime/admin-extra-ops.ts +391 -13
  309. package/src/runtime/admin-ops.ts +17 -6
  310. package/src/runtime/capture-ops.ts +25 -6
  311. package/src/runtime/cognee-sync-ops.ts +63 -0
  312. package/src/runtime/core-ops.ts +258 -8
  313. package/src/runtime/curator-extra-ops.ts +17 -3
  314. package/src/runtime/domain-ops.ts +2 -2
  315. package/src/runtime/grading-ops.ts +11 -2
  316. package/src/runtime/intake-ops.ts +126 -0
  317. package/src/runtime/loop-ops.ts +96 -13
  318. package/src/runtime/memory-cross-project-ops.ts +1 -2
  319. package/src/runtime/memory-extra-ops.ts +5 -5
  320. package/src/runtime/orchestrate-ops.ts +8 -2
  321. package/src/runtime/planning-extra-ops.ts +414 -23
  322. package/src/runtime/playbook-ops.ts +169 -0
  323. package/src/runtime/project-ops.ts +9 -3
  324. package/src/runtime/runtime.ts +36 -10
  325. package/src/runtime/types.ts +8 -0
  326. package/src/runtime/vault-extra-ops.ts +425 -4
  327. package/src/vault/playbook.ts +87 -0
  328. package/src/vault/vault.ts +419 -235
@@ -2,11 +2,13 @@
2
2
  * IdentityManager — Agent identity CRUD with versioning and rollback.
3
3
  *
4
4
  * Follows the Curator/BrainIntelligence pattern: separate class, own SQLite
5
- * tables, takes Vault as constructor dep. All methods synchronous (better-sqlite3).
5
+ * tables, takes Vault as constructor dep. Uses PersistenceProvider abstraction
6
+ * for all database access.
6
7
  */
7
8
 
8
9
  import { randomUUID } from 'node:crypto';
9
10
  import type { Vault } from '../vault/vault.js';
11
+ import type { PersistenceProvider } from '../persistence/types.js';
10
12
  import type {
11
13
  AgentIdentity,
12
14
  IdentityVersion,
@@ -20,17 +22,18 @@ import type {
20
22
 
21
23
  export class IdentityManager {
22
24
  private vault: Vault;
25
+ private provider: PersistenceProvider;
23
26
 
24
27
  constructor(vault: Vault) {
25
28
  this.vault = vault;
29
+ this.provider = vault.getProvider();
26
30
  this.initializeTables();
27
31
  }
28
32
 
29
33
  // ─── Table Initialization ───────────────────────────────────────────
30
34
 
31
35
  private initializeTables(): void {
32
- const db = this.vault.getDb();
33
- db.exec(`
36
+ this.provider.execSql(`
34
37
  CREATE TABLE IF NOT EXISTS agent_identity (
35
38
  agent_id TEXT PRIMARY KEY,
36
39
  name TEXT NOT NULL,
@@ -38,7 +41,7 @@ export class IdentityManager {
38
41
  description TEXT NOT NULL DEFAULT '',
39
42
  personality TEXT NOT NULL DEFAULT '[]',
40
43
  version INTEGER NOT NULL DEFAULT 1,
41
- updated_at TEXT NOT NULL DEFAULT (datetime('now'))
44
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch())
42
45
  );
43
46
 
44
47
  CREATE TABLE IF NOT EXISTS agent_identity_versions (
@@ -48,7 +51,7 @@ export class IdentityManager {
48
51
  snapshot TEXT NOT NULL,
49
52
  changed_by TEXT NOT NULL DEFAULT 'system',
50
53
  change_reason TEXT NOT NULL DEFAULT '',
51
- created_at TEXT NOT NULL DEFAULT (datetime('now')),
54
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
52
55
  UNIQUE(agent_id, version)
53
56
  );
54
57
 
@@ -58,8 +61,8 @@ export class IdentityManager {
58
61
  category TEXT NOT NULL CHECK(category IN ('behavior', 'preference', 'restriction', 'style')),
59
62
  text TEXT NOT NULL,
60
63
  priority INTEGER NOT NULL DEFAULT 0,
61
- created_at TEXT NOT NULL DEFAULT (datetime('now')),
62
- updated_at TEXT NOT NULL DEFAULT (datetime('now'))
64
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
65
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch())
63
66
  );
64
67
 
65
68
  CREATE INDEX IF NOT EXISTS idx_guidelines_agent
@@ -72,10 +75,9 @@ export class IdentityManager {
72
75
  // ─── Identity CRUD ──────────────────────────────────────────────────
73
76
 
74
77
  getIdentity(agentId: string): AgentIdentity | null {
75
- const db = this.vault.getDb();
76
- const row = db.prepare('SELECT * FROM agent_identity WHERE agent_id = ?').get(agentId) as
77
- | IdentityRow
78
- | undefined;
78
+ const row = this.provider.get<IdentityRow>('SELECT * FROM agent_identity WHERE agent_id = ?', [
79
+ agentId,
80
+ ]);
79
81
  if (!row) return null;
80
82
 
81
83
  const guidelines = this.getGuidelines(agentId);
@@ -83,25 +85,25 @@ export class IdentityManager {
83
85
  }
84
86
 
85
87
  setIdentity(agentId: string, input: IdentityUpdateInput): AgentIdentity {
86
- const db = this.vault.getDb();
87
-
88
- db.transaction(() => {
89
- const existing = db.prepare('SELECT * FROM agent_identity WHERE agent_id = ?').get(agentId) as
90
- | IdentityRow
91
- | undefined;
88
+ this.provider.transaction(() => {
89
+ const existing = this.provider.get<IdentityRow>(
90
+ 'SELECT * FROM agent_identity WHERE agent_id = ?',
91
+ [agentId],
92
+ );
92
93
 
93
94
  if (existing) {
94
95
  // Snapshot current state before updating
95
96
  const snapshot = JSON.stringify(rowToIdentitySnapshot(existing));
96
- db.prepare(
97
+ this.provider.run(
97
98
  `INSERT INTO agent_identity_versions (agent_id, version, snapshot, changed_by, change_reason)
98
99
  VALUES (?, ?, ?, ?, ?)`,
99
- ).run(
100
- agentId,
101
- existing.version,
102
- snapshot,
103
- input.changedBy ?? 'system',
104
- input.changeReason ?? '',
100
+ [
101
+ agentId,
102
+ existing.version,
103
+ snapshot,
104
+ input.changedBy ?? 'system',
105
+ input.changeReason ?? '',
106
+ ],
105
107
  );
106
108
 
107
109
  const newVersion = existing.version + 1;
@@ -112,12 +114,13 @@ export class IdentityManager {
112
114
  ? JSON.stringify(input.personality)
113
115
  : existing.personality;
114
116
 
115
- db.prepare(
117
+ this.provider.run(
116
118
  `UPDATE agent_identity
117
119
  SET name = ?, role = ?, description = ?, personality = ?,
118
- version = ?, updated_at = datetime('now')
120
+ version = ?, updated_at = unixepoch()
119
121
  WHERE agent_id = ?`,
120
- ).run(name, role, description, personality, newVersion, agentId);
122
+ [name, role, description, personality, newVersion, agentId],
123
+ );
121
124
  } else {
122
125
  // First identity creation — version 1
123
126
  const name = input.name ?? agentId;
@@ -125,12 +128,13 @@ export class IdentityManager {
125
128
  const description = input.description ?? '';
126
129
  const personality = JSON.stringify(input.personality ?? []);
127
130
 
128
- db.prepare(
131
+ this.provider.run(
129
132
  `INSERT INTO agent_identity (agent_id, name, role, description, personality, version)
130
133
  VALUES (?, ?, ?, ?, ?, 1)`,
131
- ).run(agentId, name, role, description, personality);
134
+ [agentId, name, role, description, personality],
135
+ );
132
136
  }
133
- })();
137
+ });
134
138
 
135
139
  return this.getIdentity(agentId)!;
136
140
  }
@@ -138,94 +142,92 @@ export class IdentityManager {
138
142
  // ─── Guidelines ─────────────────────────────────────────────────────
139
143
 
140
144
  addGuideline(agentId: string, input: GuidelineInput): Guideline {
141
- const db = this.vault.getDb();
142
145
  const id = randomUUID();
143
146
  const priority = input.priority ?? 0;
144
147
 
145
- db.prepare(
148
+ this.provider.run(
146
149
  `INSERT INTO agent_guidelines (id, agent_id, category, text, priority)
147
150
  VALUES (?, ?, ?, ?, ?)`,
148
- ).run(id, agentId, input.category, input.text, priority);
151
+ [id, agentId, input.category, input.text, priority],
152
+ );
149
153
 
150
- const row = db.prepare('SELECT * FROM agent_guidelines WHERE id = ?').get(id) as GuidelineRow;
151
- return rowToGuideline(row);
154
+ const row = this.provider.get<GuidelineRow>('SELECT * FROM agent_guidelines WHERE id = ?', [
155
+ id,
156
+ ]);
157
+ return rowToGuideline(row!);
152
158
  }
153
159
 
154
160
  removeGuideline(guidelineId: string): boolean {
155
- const db = this.vault.getDb();
156
- const result = db.prepare('DELETE FROM agent_guidelines WHERE id = ?').run(guidelineId);
161
+ const result = this.provider.run('DELETE FROM agent_guidelines WHERE id = ?', [guidelineId]);
157
162
  return result.changes > 0;
158
163
  }
159
164
 
160
165
  getGuidelines(agentId: string, category?: GuidelineCategory): Guideline[] {
161
- const db = this.vault.getDb();
162
166
  if (category) {
163
- const rows = db
164
- .prepare(
165
- 'SELECT * FROM agent_guidelines WHERE agent_id = ? AND category = ? ORDER BY priority DESC, created_at ASC',
166
- )
167
- .all(agentId, category) as GuidelineRow[];
167
+ const rows = this.provider.all<GuidelineRow>(
168
+ 'SELECT * FROM agent_guidelines WHERE agent_id = ? AND category = ? ORDER BY priority DESC, created_at ASC',
169
+ [agentId, category],
170
+ );
168
171
  return rows.map(rowToGuideline);
169
172
  }
170
- const rows = db
171
- .prepare(
172
- 'SELECT * FROM agent_guidelines WHERE agent_id = ? ORDER BY priority DESC, created_at ASC',
173
- )
174
- .all(agentId) as GuidelineRow[];
173
+ const rows = this.provider.all<GuidelineRow>(
174
+ 'SELECT * FROM agent_guidelines WHERE agent_id = ? ORDER BY priority DESC, created_at ASC',
175
+ [agentId],
176
+ );
175
177
  return rows.map(rowToGuideline);
176
178
  }
177
179
 
178
180
  // ─── Versioning ─────────────────────────────────────────────────────
179
181
 
180
182
  getVersionHistory(agentId: string, limit = 20): IdentityVersion[] {
181
- const db = this.vault.getDb();
182
- const rows = db
183
- .prepare(
184
- 'SELECT * FROM agent_identity_versions WHERE agent_id = ? ORDER BY version DESC LIMIT ?',
185
- )
186
- .all(agentId, limit) as VersionRow[];
183
+ const rows = this.provider.all<VersionRow>(
184
+ 'SELECT * FROM agent_identity_versions WHERE agent_id = ? ORDER BY version DESC LIMIT ?',
185
+ [agentId, limit],
186
+ );
187
187
  return rows.map(rowToVersion);
188
188
  }
189
189
 
190
190
  rollback(agentId: string, version: number): AgentIdentity {
191
- const db = this.vault.getDb();
192
-
193
- db.transaction(() => {
194
- const versionRow = db
195
- .prepare('SELECT * FROM agent_identity_versions WHERE agent_id = ? AND version = ?')
196
- .get(agentId, version) as VersionRow | undefined;
191
+ this.provider.transaction(() => {
192
+ const versionRow = this.provider.get<VersionRow>(
193
+ 'SELECT * FROM agent_identity_versions WHERE agent_id = ? AND version = ?',
194
+ [agentId, version],
195
+ );
197
196
 
198
197
  if (!versionRow) {
199
198
  throw new Error(`Version ${version} not found for agent ${agentId}`);
200
199
  }
201
200
 
202
201
  const snapshot = JSON.parse(versionRow.snapshot) as IdentitySnapshot;
203
- const current = db
204
- .prepare('SELECT * FROM agent_identity WHERE agent_id = ?')
205
- .get(agentId) as IdentityRow;
202
+ const current = this.provider.get<IdentityRow>(
203
+ 'SELECT * FROM agent_identity WHERE agent_id = ?',
204
+ [agentId],
205
+ )!;
206
206
 
207
207
  // Snapshot current state before rollback
208
208
  const currentSnapshot = JSON.stringify(rowToIdentitySnapshot(current));
209
- db.prepare(
209
+ this.provider.run(
210
210
  `INSERT INTO agent_identity_versions (agent_id, version, snapshot, changed_by, change_reason)
211
211
  VALUES (?, ?, ?, ?, ?)`,
212
- ).run(agentId, current.version, currentSnapshot, 'system', `Before rollback to v${version}`);
212
+ [agentId, current.version, currentSnapshot, 'system', `Before rollback to v${version}`],
213
+ );
213
214
 
214
215
  const newVersion = current.version + 1;
215
- db.prepare(
216
+ this.provider.run(
216
217
  `UPDATE agent_identity
217
218
  SET name = ?, role = ?, description = ?, personality = ?,
218
- version = ?, updated_at = datetime('now')
219
+ version = ?, updated_at = unixepoch()
219
220
  WHERE agent_id = ?`,
220
- ).run(
221
- snapshot.name,
222
- snapshot.role,
223
- snapshot.description,
224
- JSON.stringify(snapshot.personality),
225
- newVersion,
226
- agentId,
221
+ [
222
+ snapshot.name,
223
+ snapshot.role,
224
+ snapshot.description,
225
+ JSON.stringify(snapshot.personality),
226
+ newVersion,
227
+ agentId,
228
+ ],
227
229
  );
228
- })();
230
+ });
229
231
 
230
232
  return this.getIdentity(agentId)!;
231
233
  }
@@ -9,6 +9,7 @@
9
9
  */
10
10
 
11
11
  import type { Vault } from '../vault/vault.js';
12
+ import type { PersistenceProvider } from '../persistence/types.js';
12
13
  import type {
13
14
  IntentType,
14
15
  OperationalMode,
@@ -96,10 +97,12 @@ const DEFAULT_MODES: ModeConfig[] = [
96
97
 
97
98
  export class IntentRouter {
98
99
  private vault: Vault;
100
+ private provider: PersistenceProvider;
99
101
  private currentMode: OperationalMode = 'GENERAL-MODE';
100
102
 
101
103
  constructor(vault: Vault) {
102
104
  this.vault = vault;
105
+ this.provider = vault.getProvider();
103
106
  this.initializeTables();
104
107
  this.seedDefaultModes();
105
108
  }
@@ -107,8 +110,7 @@ export class IntentRouter {
107
110
  // ─── Table Initialization ───────────────────────────────────────────
108
111
 
109
112
  private initializeTables(): void {
110
- const db = this.vault.getDb();
111
- db.exec(`
113
+ this.provider.execSql(`
112
114
  CREATE TABLE IF NOT EXISTS agent_modes (
113
115
  mode TEXT PRIMARY KEY,
114
116
  intent TEXT NOT NULL,
@@ -130,20 +132,21 @@ export class IntentRouter {
130
132
  }
131
133
 
132
134
  private seedDefaultModes(): void {
133
- const db = this.vault.getDb();
134
- const insert = db.prepare(
135
- `INSERT OR IGNORE INTO agent_modes (mode, intent, description, behavior_rules, keywords)
136
- VALUES (?, ?, ?, ?, ?)`,
137
- );
138
- for (const m of DEFAULT_MODES) {
139
- insert.run(
140
- m.mode,
141
- m.intent,
142
- m.description,
143
- JSON.stringify(m.behaviorRules),
144
- JSON.stringify(m.keywords),
145
- );
146
- }
135
+ this.provider.transaction(() => {
136
+ for (const m of DEFAULT_MODES) {
137
+ this.provider.run(
138
+ `INSERT OR IGNORE INTO agent_modes (mode, intent, description, behavior_rules, keywords)
139
+ VALUES (?, ?, ?, ?, ?)`,
140
+ [
141
+ m.mode,
142
+ m.intent,
143
+ m.description,
144
+ JSON.stringify(m.behaviorRules),
145
+ JSON.stringify(m.keywords),
146
+ ],
147
+ );
148
+ }
149
+ });
147
150
  }
148
151
 
149
152
  // ─── Intent Classification ──────────────────────────────────────────
@@ -194,26 +197,23 @@ export class IntentRouter {
194
197
  }
195
198
 
196
199
  private logRouting(prompt: string, classification: IntentClassification): void {
197
- const db = this.vault.getDb();
198
- db.prepare(
200
+ this.provider.run(
199
201
  `INSERT INTO agent_routing_log (prompt, intent, mode, confidence, matched_keywords)
200
202
  VALUES (?, ?, ?, ?, ?)`,
201
- ).run(
202
- prompt,
203
- classification.intent,
204
- classification.mode,
205
- classification.confidence,
206
- JSON.stringify(classification.matchedKeywords),
203
+ [
204
+ prompt,
205
+ classification.intent,
206
+ classification.mode,
207
+ classification.confidence,
208
+ JSON.stringify(classification.matchedKeywords),
209
+ ],
207
210
  );
208
211
  }
209
212
 
210
213
  // ─── Mode Management ───────────────────────────────────────────────
211
214
 
212
215
  morph(mode: OperationalMode): MorphResult {
213
- const db = this.vault.getDb();
214
- const row = db.prepare('SELECT * FROM agent_modes WHERE mode = ?').get(mode) as
215
- | ModeRow
216
- | undefined;
216
+ const row = this.provider.get<ModeRow>('SELECT * FROM agent_modes WHERE mode = ?', [mode]);
217
217
 
218
218
  if (!row) {
219
219
  throw new Error(`Unknown mode: ${mode}`);
@@ -231,41 +231,40 @@ export class IntentRouter {
231
231
  }
232
232
 
233
233
  getBehaviorRules(mode?: OperationalMode): string[] {
234
- const db = this.vault.getDb();
235
234
  const target = mode ?? this.currentMode;
236
- const row = db.prepare('SELECT behavior_rules FROM agent_modes WHERE mode = ?').get(target) as
237
- | { behavior_rules: string }
238
- | undefined;
235
+ const row = this.provider.get<{ behavior_rules: string }>(
236
+ 'SELECT behavior_rules FROM agent_modes WHERE mode = ?',
237
+ [target],
238
+ );
239
239
 
240
240
  if (!row) return [];
241
241
  return JSON.parse(row.behavior_rules) as string[];
242
242
  }
243
243
 
244
244
  getModes(): ModeConfig[] {
245
- const db = this.vault.getDb();
246
- const rows = db.prepare('SELECT * FROM agent_modes ORDER BY mode').all() as ModeRow[];
245
+ const rows = this.provider.all<ModeRow>('SELECT * FROM agent_modes ORDER BY mode');
247
246
  return rows.map(rowToModeConfig);
248
247
  }
249
248
 
250
249
  registerMode(config: ModeConfig): void {
251
- const db = this.vault.getDb();
252
- db.prepare(
250
+ this.provider.run(
253
251
  `INSERT OR REPLACE INTO agent_modes (mode, intent, description, behavior_rules, keywords)
254
252
  VALUES (?, ?, ?, ?, ?)`,
255
- ).run(
256
- config.mode,
257
- config.intent,
258
- config.description,
259
- JSON.stringify(config.behaviorRules),
260
- JSON.stringify(config.keywords),
253
+ [
254
+ config.mode,
255
+ config.intent,
256
+ config.description,
257
+ JSON.stringify(config.behaviorRules),
258
+ JSON.stringify(config.keywords),
259
+ ],
261
260
  );
262
261
  }
263
262
 
264
263
  updateModeRules(mode: OperationalMode, rules: string[]): void {
265
- const db = this.vault.getDb();
266
- const result = db
267
- .prepare('UPDATE agent_modes SET behavior_rules = ? WHERE mode = ?')
268
- .run(JSON.stringify(rules), mode);
264
+ const result = this.provider.run('UPDATE agent_modes SET behavior_rules = ? WHERE mode = ?', [
265
+ JSON.stringify(rules),
266
+ mode,
267
+ ]);
269
268
  if (result.changes === 0) {
270
269
  throw new Error(`Unknown mode: ${mode}`);
271
270
  }
@@ -278,22 +277,21 @@ export class IntentRouter {
278
277
  byIntent: Record<string, number>;
279
278
  byMode: Record<string, number>;
280
279
  } {
281
- const db = this.vault.getDb();
282
- const total = (
283
- db.prepare('SELECT COUNT(*) as count FROM agent_routing_log').get() as { count: number }
284
- ).count;
285
-
286
- const intentRows = db
287
- .prepare('SELECT intent, COUNT(*) as count FROM agent_routing_log GROUP BY intent')
288
- .all() as Array<{ intent: string; count: number }>;
280
+ const total = this.provider.get<{ count: number }>(
281
+ 'SELECT COUNT(*) as count FROM agent_routing_log',
282
+ )!.count;
283
+
284
+ const intentRows = this.provider.all<{ intent: string; count: number }>(
285
+ 'SELECT intent, COUNT(*) as count FROM agent_routing_log GROUP BY intent',
286
+ );
289
287
  const byIntent: Record<string, number> = {};
290
288
  for (const row of intentRows) {
291
289
  byIntent[row.intent] = row.count;
292
290
  }
293
291
 
294
- const modeRows = db
295
- .prepare('SELECT mode, COUNT(*) as count FROM agent_routing_log GROUP BY mode')
296
- .all() as Array<{ mode: string; count: number }>;
292
+ const modeRows = this.provider.all<{ mode: string; count: number }>(
293
+ 'SELECT mode, COUNT(*) as count FROM agent_routing_log GROUP BY mode',
294
+ );
297
295
  const byMode: Record<string, number> = {};
298
296
  for (const row of modeRows) {
299
297
  byMode[row.mode] = row.count;