@soleri/core 9.0.4 → 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 +24 -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 +23 -8
  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 +28 -4
  382. package/src/engine/core-ops.test.ts +254 -0
  383. package/src/engine/core-ops.ts +25 -8
  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
@@ -1,918 +1,27 @@
1
1
  /**
2
2
  * Chat facade — session management, response chunking, auth for chat transports.
3
+ *
4
+ * Delegates to:
5
+ * - chat-session-ops.ts — session lifecycle (init, get, append, clear, delete, list)
6
+ * - chat-transport-ops.ts — chunking, auth, bridge, compression
7
+ * - chat-service-ops.ts — cancellation, self-update, files, notifications,
8
+ * voice, queue, browser
9
+ * - chat-state.ts — shared state and lazy initializers
3
10
  */
4
11
 
5
- import { z } from 'zod';
6
12
  import type { OpDefinition } from '../../facades/types.js';
7
13
  import type { AgentRuntime } from '../types.js';
8
- import { ChatSessionManager } from '../../chat/chat-session.js';
9
- import { ChatAuthManager } from '../../chat/auth-manager.js';
10
- import { TaskCancellationManager } from '../../chat/cancellation.js';
11
- import { SelfUpdateManager } from '../../chat/self-update.js';
12
- import { NotificationEngine } from '../../chat/notifications.js';
13
- import {
14
- detectFileIntent,
15
- buildMultimodalContent,
16
- cleanupTempFiles,
17
- } from '../../chat/file-handler.js';
18
- import type { FileInfo } from '../../chat/file-handler.js';
19
- import { transcribeAudio, synthesizeSpeech } from '../../chat/voice.js';
20
- import { MessageQueue } from '../../chat/queue.js';
21
- import { BrowserSessionManager } from '../../chat/browser-session.js';
22
- import { chunkResponse } from '../../chat/response-chunker.js';
23
- import { McpToolBridge } from '../../chat/mcp-bridge.js';
24
- import { createOutputCompressor } from '../../chat/output-compressor.js';
25
- import type { ChatSessionConfig, ChatAuthConfig, ChunkConfig } from '../../chat/types.js';
26
-
27
- /**
28
- * Chat transport state — lazily initialized on first use.
29
- * Config comes from runtime flags or op params.
30
- */
31
- interface ChatState {
32
- sessions: ChatSessionManager | null;
33
- auth: ChatAuthManager | null;
34
- bridge: McpToolBridge | null;
35
- cancellation: TaskCancellationManager | null;
36
- updater: SelfUpdateManager | null;
37
- notifications: NotificationEngine | null;
38
- queue: MessageQueue | null;
39
- browser: BrowserSessionManager | null;
40
- }
41
-
42
- function getOrCreateSessions(state: ChatState, config: ChatSessionConfig): ChatSessionManager {
43
- if (!state.sessions) {
44
- state.sessions = new ChatSessionManager(config);
45
- state.sessions.startReaper();
46
- }
47
- return state.sessions;
48
- }
49
-
50
- function getOrCreateAuth(state: ChatState, config: ChatAuthConfig): ChatAuthManager {
51
- if (!state.auth) {
52
- state.auth = new ChatAuthManager(config);
53
- }
54
- return state.auth;
55
- }
14
+ import { createChatState } from './chat-state.js';
15
+ import { createChatSessionOps } from './chat-session-ops.js';
16
+ import { createChatTransportOps } from './chat-transport-ops.js';
17
+ import { createChatServiceOps } from './chat-service-ops.js';
56
18
 
57
19
  export function createChatFacadeOps(_runtime: AgentRuntime): OpDefinition[] {
58
- const state: ChatState = {
59
- sessions: null,
60
- auth: null,
61
- bridge: null,
62
- cancellation: null,
63
- updater: null,
64
- notifications: null,
65
- queue: null,
66
- browser: null,
67
- };
20
+ const state = createChatState();
68
21
 
69
22
  return [
70
- // ─── Session Ops ──────────────────────────────────────────────
71
-
72
- {
73
- name: 'chat_session_init',
74
- description:
75
- 'Initialize chat session management. Must be called before other session ops. Provide the storage directory path.',
76
- auth: 'write',
77
- schema: z.object({
78
- storageDir: z.string().describe('Directory for session persistence.'),
79
- ttlMs: z.number().optional().describe('Session TTL in ms. Default: 7200000 (2 hours).'),
80
- compactionThreshold: z
81
- .number()
82
- .optional()
83
- .describe('Messages before compaction. Default: 100.'),
84
- compactionKeep: z
85
- .number()
86
- .optional()
87
- .describe('Messages to keep after compaction. Default: 40.'),
88
- }),
89
- handler: async (params) => {
90
- const config: ChatSessionConfig = {
91
- storageDir: params.storageDir as string,
92
- ttlMs: params.ttlMs as number | undefined,
93
- compactionThreshold: params.compactionThreshold as number | undefined,
94
- compactionKeep: params.compactionKeep as number | undefined,
95
- };
96
- const sessions = getOrCreateSessions(state, config);
97
- return {
98
- initialized: true,
99
- activeSessions: sessions.size,
100
- storageDir: config.storageDir,
101
- };
102
- },
103
- },
104
-
105
- {
106
- name: 'chat_session_get',
107
- description: 'Get or create a chat session by ID. Returns session with message history.',
108
- auth: 'read',
109
- schema: z.object({
110
- sessionId: z.string().describe('Session/chat ID.'),
111
- storageDir: z.string().describe('Storage directory (auto-initializes if needed).'),
112
- }),
113
- handler: async (params) => {
114
- const sessions = getOrCreateSessions(state, {
115
- storageDir: params.storageDir as string,
116
- });
117
- const session = sessions.getOrCreate(params.sessionId as string);
118
- return {
119
- id: session.id,
120
- messageCount: session.messages.length,
121
- createdAt: session.createdAt,
122
- lastActiveAt: session.lastActiveAt,
123
- meta: session.meta,
124
- };
125
- },
126
- },
127
-
128
- {
129
- name: 'chat_session_append',
130
- description: 'Append a message to a chat session.',
131
- auth: 'write',
132
- schema: z.object({
133
- sessionId: z.string().describe('Session/chat ID.'),
134
- storageDir: z.string().describe('Storage directory.'),
135
- role: z.enum(['user', 'assistant', 'system', 'tool']).describe('Message role.'),
136
- content: z.string().describe('Message content.'),
137
- }),
138
- handler: async (params) => {
139
- const sessions = getOrCreateSessions(state, {
140
- storageDir: params.storageDir as string,
141
- });
142
- sessions.appendMessage(params.sessionId as string, {
143
- role: params.role as 'user' | 'assistant' | 'system' | 'tool',
144
- content: params.content as string,
145
- timestamp: Date.now(),
146
- });
147
- return {
148
- sessionId: params.sessionId,
149
- messageCount: sessions.messageCount(params.sessionId as string),
150
- };
151
- },
152
- },
153
-
154
- {
155
- name: 'chat_session_clear',
156
- description: 'Clear message history for a session (keeps session alive).',
157
- auth: 'write',
158
- schema: z.object({
159
- sessionId: z.string().describe('Session/chat ID.'),
160
- storageDir: z.string().describe('Storage directory.'),
161
- }),
162
- handler: async (params) => {
163
- const sessions = getOrCreateSessions(state, {
164
- storageDir: params.storageDir as string,
165
- });
166
- sessions.clear(params.sessionId as string);
167
- return { cleared: true, sessionId: params.sessionId };
168
- },
169
- },
170
-
171
- {
172
- name: 'chat_session_delete',
173
- description: 'Delete a session entirely (memory + disk).',
174
- auth: 'write',
175
- schema: z.object({
176
- sessionId: z.string().describe('Session/chat ID.'),
177
- storageDir: z.string().describe('Storage directory.'),
178
- }),
179
- handler: async (params) => {
180
- const sessions = getOrCreateSessions(state, {
181
- storageDir: params.storageDir as string,
182
- });
183
- sessions.delete(params.sessionId as string);
184
- return { deleted: true, sessionId: params.sessionId };
185
- },
186
- },
187
-
188
- {
189
- name: 'chat_session_list',
190
- description: 'List all session IDs (active + persisted).',
191
- auth: 'read',
192
- schema: z.object({
193
- storageDir: z.string().describe('Storage directory.'),
194
- }),
195
- handler: async (params) => {
196
- const sessions = getOrCreateSessions(state, {
197
- storageDir: params.storageDir as string,
198
- });
199
- const ids = sessions.listAll();
200
- return { sessions: ids, count: ids.length, active: sessions.size };
201
- },
202
- },
203
-
204
- // ─── Response Chunking ────────────────────────────────────────
205
-
206
- {
207
- name: 'chat_chunk_response',
208
- description:
209
- 'Split a long response into chunks for chat platforms. Converts Markdown to HTML by default.',
210
- auth: 'read',
211
- schema: z.object({
212
- text: z.string().describe('The response text to chunk.'),
213
- maxChunkSize: z.number().optional().describe('Max characters per chunk. Default: 4000.'),
214
- format: z
215
- .enum(['html', 'markdown', 'plain'])
216
- .optional()
217
- .describe('Output format. Default: html.'),
218
- }),
219
- handler: async (params) => {
220
- const config: ChunkConfig = {
221
- maxChunkSize: params.maxChunkSize as number | undefined,
222
- format: params.format as 'html' | 'markdown' | 'plain' | undefined,
223
- };
224
- const chunks = chunkResponse(params.text as string, config);
225
- return { chunks, count: chunks.length };
226
- },
227
- },
228
-
229
- // ─── Authentication ───────────────────────────────────────────
230
-
231
- {
232
- name: 'chat_auth_init',
233
- description: 'Initialize chat authentication. Provide passphrase and optional allowlist.',
234
- auth: 'write',
235
- schema: z.object({
236
- storagePath: z.string().describe('Path to auth persistence file.'),
237
- passphrase: z.string().optional().describe('Auth passphrase. If unset, auth is disabled.'),
238
- allowedUsers: z
239
- .array(z.union([z.string(), z.number()]))
240
- .optional()
241
- .describe('Allowed user IDs. Empty = any user.'),
242
- }),
243
- handler: async (params) => {
244
- const config: ChatAuthConfig = {
245
- storagePath: params.storagePath as string,
246
- passphrase: params.passphrase as string | undefined,
247
- allowedUsers: params.allowedUsers as (string | number)[] | undefined,
248
- };
249
- const auth = getOrCreateAuth(state, config);
250
- return {
251
- initialized: true,
252
- enabled: auth.enabled,
253
- authenticatedCount: auth.authenticatedCount,
254
- };
255
- },
256
- },
257
-
258
- {
259
- name: 'chat_auth_check',
260
- description: 'Check if a user is authenticated.',
261
- auth: 'read',
262
- schema: z.object({
263
- userId: z.union([z.string(), z.number()]).describe('User ID to check.'),
264
- storagePath: z.string().describe('Auth storage path (auto-initializes if needed).'),
265
- }),
266
- handler: async (params) => {
267
- const auth = getOrCreateAuth(state, {
268
- storagePath: params.storagePath as string,
269
- });
270
- const userId = params.userId as string | number;
271
- return {
272
- userId,
273
- authenticated: auth.isAuthenticated(userId),
274
- lockedOut: auth.isLockedOut(userId),
275
- };
276
- },
277
- },
278
-
279
- {
280
- name: 'chat_auth_authenticate',
281
- description: 'Attempt to authenticate a user with a passphrase.',
282
- auth: 'write',
283
- schema: z.object({
284
- userId: z.union([z.string(), z.number()]).describe('User ID.'),
285
- passphrase: z.string().describe('Passphrase to verify.'),
286
- storagePath: z.string().describe('Auth storage path.'),
287
- }),
288
- handler: async (params) => {
289
- const auth = getOrCreateAuth(state, {
290
- storagePath: params.storagePath as string,
291
- });
292
- const success = auth.authenticate(
293
- params.userId as string | number,
294
- params.passphrase as string,
295
- );
296
- return {
297
- userId: params.userId,
298
- success,
299
- lockedOut: auth.isLockedOut(params.userId as string | number),
300
- };
301
- },
302
- },
303
-
304
- {
305
- name: 'chat_auth_revoke',
306
- description: 'Revoke authentication for a user.',
307
- auth: 'write',
308
- schema: z.object({
309
- userId: z.union([z.string(), z.number()]).describe('User ID to revoke.'),
310
- storagePath: z.string().describe('Auth storage path.'),
311
- }),
312
- handler: async (params) => {
313
- const auth = getOrCreateAuth(state, {
314
- storagePath: params.storagePath as string,
315
- });
316
- auth.revoke(params.userId as string | number);
317
- return { revoked: true, userId: params.userId };
318
- },
319
- },
320
-
321
- {
322
- name: 'chat_auth_status',
323
- description: 'Get authentication status — enabled, user count, list.',
324
- auth: 'read',
325
- schema: z.object({
326
- storagePath: z.string().describe('Auth storage path.'),
327
- }),
328
- handler: async (params) => {
329
- const auth = getOrCreateAuth(state, {
330
- storagePath: params.storagePath as string,
331
- });
332
- return {
333
- enabled: auth.enabled,
334
- authenticatedCount: auth.authenticatedCount,
335
- authenticatedUsers: auth.listAuthenticated(),
336
- };
337
- },
338
- },
339
-
340
- // ─── MCP Bridge Ops ─────────────────────────────────────────────
341
-
342
- {
343
- name: 'chat_bridge_init',
344
- description:
345
- 'Initialize the MCP tool bridge for local tool execution. Optional allowlist filters which tools are registered.',
346
- auth: 'write',
347
- schema: z.object({
348
- allowlist: z
349
- .array(z.string())
350
- .optional()
351
- .describe('Tool name allowlist. If unset, all tools are allowed.'),
352
- maxOutput: z
353
- .number()
354
- .optional()
355
- .describe('Max output length per tool call. Default: 10000.'),
356
- }),
357
- handler: async (params) => {
358
- state.bridge = new McpToolBridge({
359
- allowlist: params.allowlist as string[] | undefined,
360
- compressor: createOutputCompressor(),
361
- maxOutput: params.maxOutput as number | undefined,
362
- });
363
- return { initialized: true, toolCount: 0 };
364
- },
365
- },
366
-
367
- {
368
- name: 'chat_bridge_register',
369
- description: 'Register a tool with the MCP bridge.',
370
- auth: 'write',
371
- schema: z.object({
372
- name: z.string().describe('Tool name.'),
373
- description: z.string().describe('Tool description.'),
374
- inputSchema: z.record(z.unknown()).describe('JSON Schema for tool input.'),
375
- }),
376
- handler: async (params) => {
377
- if (!state.bridge) {
378
- state.bridge = new McpToolBridge({ compressor: createOutputCompressor() });
379
- }
380
- // Handler is a no-op since we can't pass functions through JSON
381
- // Real handler registration happens in code, not via ops
382
- state.bridge.register({
383
- name: params.name as string,
384
- description: params.description as string,
385
- inputSchema: params.inputSchema as Record<string, unknown>,
386
- handler: async () => ({ message: 'Registered via op — handler is a placeholder' }),
387
- });
388
- return { registered: true, name: params.name, totalTools: state.bridge.size };
389
- },
390
- },
391
-
392
- {
393
- name: 'chat_bridge_list',
394
- description: 'List all tools registered with the MCP bridge.',
395
- auth: 'read',
396
- handler: async () => {
397
- if (!state.bridge) return { tools: [], count: 0 };
398
- const tools = state.bridge.listTools();
399
- return { tools, count: tools.length };
400
- },
401
- },
402
-
403
- {
404
- name: 'chat_bridge_execute',
405
- description: 'Execute a registered tool via the MCP bridge.',
406
- auth: 'write',
407
- schema: z.object({
408
- name: z.string().describe('Tool name to execute.'),
409
- input: z.record(z.unknown()).optional().describe('Tool input parameters.'),
410
- }),
411
- handler: async (params) => {
412
- if (!state.bridge) return { output: 'Bridge not initialized', isError: true };
413
- const result = await state.bridge.execute(
414
- params.name as string,
415
- (params.input as Record<string, unknown>) ?? {},
416
- );
417
- return result;
418
- },
419
- },
420
-
421
- {
422
- name: 'chat_compress_output',
423
- description: 'Compress verbose tool output for chat display. Uses JSON-aware truncation.',
424
- auth: 'read',
425
- schema: z.object({
426
- toolName: z.string().describe('Tool name (for compressor lookup).'),
427
- output: z.string().describe('Raw tool output to compress.'),
428
- maxLength: z.number().optional().describe('Max output length. Default: 4000.'),
429
- }),
430
- handler: async (params) => {
431
- const compressor = createOutputCompressor();
432
- const compressed = compressor(
433
- params.toolName as string,
434
- params.output as string,
435
- params.maxLength as number | undefined,
436
- );
437
- return {
438
- compressed,
439
- originalLength: (params.output as string).length,
440
- compressedLength: compressed.length,
441
- };
442
- },
443
- },
444
-
445
- // ─── Task Cancellation Ops ─────────────────────────────────────
446
-
447
- {
448
- name: 'chat_cancel_create',
449
- description:
450
- 'Create an AbortSignal for a chat task. If a task is already running for this chat, it is cancelled first. Returns signal status.',
451
- auth: 'write',
452
- schema: z.object({
453
- chatId: z.string().describe('Chat/session ID.'),
454
- description: z.string().optional().describe('Description of what is running.'),
455
- }),
456
- handler: async (params) => {
457
- if (!state.cancellation) {
458
- state.cancellation = new TaskCancellationManager();
459
- }
460
- const signal = state.cancellation.create(
461
- params.chatId as string,
462
- params.description as string | undefined,
463
- );
464
- return {
465
- chatId: params.chatId,
466
- created: true,
467
- aborted: signal.aborted,
468
- activeTasks: state.cancellation.size,
469
- };
470
- },
471
- },
472
-
473
- {
474
- name: 'chat_cancel_stop',
475
- description: 'Cancel the running task for a chat. Aborts the associated AbortController.',
476
- auth: 'write',
477
- schema: z.object({
478
- chatId: z.string().describe('Chat/session ID to cancel.'),
479
- }),
480
- handler: async (params) => {
481
- if (!state.cancellation) {
482
- return { cancelled: false, reason: 'No cancellation manager initialized.' };
483
- }
484
- const info = state.cancellation.cancel(params.chatId as string);
485
- if (!info) {
486
- return { cancelled: false, reason: 'No running task for this chat.' };
487
- }
488
- return {
489
- cancelled: true,
490
- chatId: params.chatId,
491
- description: info.description ?? null,
492
- ranForMs: Date.now() - info.startedAt,
493
- activeTasks: state.cancellation.size,
494
- };
495
- },
496
- },
497
-
498
- {
499
- name: 'chat_cancel_status',
500
- description: 'Get cancellation status — running tasks, per-chat info.',
501
- auth: 'read',
502
- schema: z.object({
503
- chatId: z.string().optional().describe('Specific chat to check. Omit for all.'),
504
- }),
505
- handler: async (params) => {
506
- if (!state.cancellation) {
507
- return { activeTasks: 0, running: [] };
508
- }
509
- if (params.chatId) {
510
- const info = state.cancellation.getInfo(params.chatId as string);
511
- return {
512
- chatId: params.chatId,
513
- running: !!info,
514
- description: info?.description ?? null,
515
- startedAt: info?.startedAt ?? null,
516
- ranForMs: info ? Date.now() - info.startedAt : null,
517
- };
518
- }
519
- const running = state.cancellation.listRunning();
520
- return {
521
- activeTasks: state.cancellation.size,
522
- running: running.map((id) => {
523
- const info = state.cancellation!.getInfo(id);
524
- return {
525
- chatId: id,
526
- description: info?.description ?? null,
527
- startedAt: info?.startedAt ?? null,
528
- };
529
- }),
530
- };
531
- },
532
- },
533
-
534
- // ─── Self-Update Ops ───────────────────────────────────────────
535
-
536
- {
537
- name: 'chat_update_init',
538
- description: 'Initialize self-update manager. Provide path for restart context persistence.',
539
- auth: 'write',
540
- schema: z.object({
541
- contextPath: z.string().describe('Path for restart context JSON file.'),
542
- }),
543
- handler: async (params) => {
544
- state.updater = new SelfUpdateManager(params.contextPath as string);
545
- const pending = state.updater.loadContext();
546
- return {
547
- initialized: true,
548
- hasPendingRestart: !!pending,
549
- pendingContext: pending,
550
- };
551
- },
552
- },
553
-
554
- {
555
- name: 'chat_update_request',
556
- description: 'Request a restart. Saves context for post-restart confirmation.',
557
- auth: 'write',
558
- schema: z.object({
559
- chatId: z.string().describe('Chat ID for post-restart confirmation.'),
560
- reason: z
561
- .enum(['self-update', 'rebuild', 'manual'])
562
- .optional()
563
- .describe('Restart reason. Default: manual.'),
564
- commitSha: z.string().optional().describe('Git commit SHA if self-update.'),
565
- contextPath: z.string().describe('Path for restart context.'),
566
- }),
567
- handler: async (params) => {
568
- if (!state.updater) {
569
- state.updater = new SelfUpdateManager(params.contextPath as string);
570
- }
571
- return state.updater.requestRestart(
572
- params.chatId as string,
573
- (params.reason as 'self-update' | 'rebuild' | 'manual') ?? 'manual',
574
- params.commitSha as string | undefined,
575
- );
576
- },
577
- },
578
-
579
- {
580
- name: 'chat_update_confirm',
581
- description: 'Clear restart context after successful startup.',
582
- auth: 'write',
583
- schema: z.object({
584
- contextPath: z.string().describe('Path for restart context.'),
585
- }),
586
- handler: async (params) => {
587
- if (!state.updater) {
588
- state.updater = new SelfUpdateManager(params.contextPath as string);
589
- }
590
- const context = state.updater.loadContext();
591
- state.updater.clearContext();
592
- return { confirmed: true, previousContext: context };
593
- },
594
- },
595
-
596
- // ─── File Handling Ops ─────────────────────────────────────────
597
-
598
- {
599
- name: 'chat_file_detect_intent',
600
- description: 'Detect user intent for a file — vision, text, or intake.',
601
- auth: 'read',
602
- schema: z.object({
603
- filename: z.string().describe('Original filename.'),
604
- mimeType: z.string().describe('MIME type.'),
605
- userText: z.string().optional().describe('Accompanying user message text.'),
606
- }),
607
- handler: async (params) => {
608
- const intent = detectFileIntent(
609
- params.filename as string,
610
- params.mimeType as string,
611
- params.userText as string | undefined,
612
- );
613
- return { filename: params.filename, mimeType: params.mimeType, intent };
614
- },
615
- },
616
-
617
- {
618
- name: 'chat_file_build_content',
619
- description: 'Build multimodal content from a file for the Anthropic API.',
620
- auth: 'read',
621
- schema: z.object({
622
- filename: z.string().describe('Original filename.'),
623
- mimeType: z.string().describe('MIME type.'),
624
- dataBase64: z.string().describe('File content as base64.'),
625
- intent: z.enum(['vision', 'text', 'intake']).describe('Detected intent.'),
626
- }),
627
- handler: async (params) => {
628
- const file: FileInfo = {
629
- name: params.filename as string,
630
- mimeType: params.mimeType as string,
631
- size: Buffer.byteLength(params.dataBase64 as string, 'base64'),
632
- data: Buffer.from(params.dataBase64 as string, 'base64'),
633
- };
634
- return buildMultimodalContent(file, params.intent as 'vision' | 'text' | 'intake');
635
- },
636
- },
637
-
638
- {
639
- name: 'chat_file_cleanup',
640
- description: 'Clean up temp files older than maxAgeMs.',
641
- auth: 'write',
642
- schema: z.object({
643
- uploadDir: z.string().describe('Temp upload directory.'),
644
- maxAgeMs: z.number().optional().describe('Max age in ms. Default: 1 hour.'),
645
- }),
646
- handler: async (params) => {
647
- const removed = cleanupTempFiles(
648
- params.uploadDir as string,
649
- params.maxAgeMs as number | undefined,
650
- );
651
- return { removed, uploadDir: params.uploadDir };
652
- },
653
- },
654
-
655
- // ─── Notification Ops ──────────────────────────────────────────
656
-
657
- {
658
- name: 'chat_notify_init',
659
- description:
660
- 'Initialize the notification engine. Notifications are delivered via the provided callback pattern.',
661
- auth: 'write',
662
- schema: z.object({
663
- intervalMs: z.number().optional().describe('Polling interval in ms. Default: 30 minutes.'),
664
- defaultCooldownMs: z
665
- .number()
666
- .optional()
667
- .describe('Default cooldown between notifications. Default: 4 hours.'),
668
- }),
669
- handler: async (params) => {
670
- // The onNotify callback can't be passed via JSON — it's set up in code.
671
- // This op initializes with a no-op that logs to console.
672
- state.notifications = new NotificationEngine({
673
- intervalMs: params.intervalMs as number | undefined,
674
- defaultCooldownMs: params.defaultCooldownMs as number | undefined,
675
- onNotify: async (checkId, message) => {
676
- console.log(`[notification] ${checkId}: ${message}`);
677
- },
678
- });
679
- return { initialized: true };
680
- },
681
- },
682
-
683
- {
684
- name: 'chat_notify_start',
685
- description: 'Start the notification polling loop.',
686
- auth: 'write',
687
- handler: async () => {
688
- if (!state.notifications) {
689
- return { started: false, reason: 'Notification engine not initialized.' };
690
- }
691
- state.notifications.start();
692
- return { started: true, ...state.notifications.stats() };
693
- },
694
- },
695
-
696
- {
697
- name: 'chat_notify_stop',
698
- description: 'Stop the notification polling loop.',
699
- auth: 'write',
700
- handler: async () => {
701
- if (!state.notifications) {
702
- return { stopped: false, reason: 'Notification engine not initialized.' };
703
- }
704
- state.notifications.stop();
705
- return { stopped: true, ...state.notifications.stats() };
706
- },
707
- },
708
-
709
- {
710
- name: 'chat_notify_poll',
711
- description: 'Run all notification checks once (manual trigger).',
712
- auth: 'write',
713
- handler: async () => {
714
- if (!state.notifications) {
715
- return { polled: false, reason: 'Notification engine not initialized.' };
716
- }
717
- const notified = await state.notifications.poll();
718
- return { polled: true, notified, ...state.notifications.stats() };
719
- },
720
- },
721
-
722
- {
723
- name: 'chat_notify_status',
724
- description: 'Get notification engine status.',
725
- auth: 'read',
726
- handler: async () => {
727
- if (!state.notifications) {
728
- return { initialized: false, checks: 0, running: false, sent: 0, lastPollAt: null };
729
- }
730
- return { initialized: true, ...state.notifications.stats() };
731
- },
732
- },
733
-
734
- // ─── Voice Ops ─────────────────────────────────────────────────
735
-
736
- {
737
- name: 'chat_voice_transcribe',
738
- description: 'Transcribe audio using OpenAI Whisper. Provide base64-encoded audio.',
739
- auth: 'write',
740
- schema: z.object({
741
- audioBase64: z.string().describe('Base64-encoded audio data.'),
742
- openaiApiKey: z.string().describe('OpenAI API key.'),
743
- filename: z.string().optional().describe('Audio filename. Default: audio.ogg.'),
744
- }),
745
- handler: async (params) => {
746
- const buffer = Buffer.from(params.audioBase64 as string, 'base64');
747
- return transcribeAudio(
748
- buffer,
749
- {
750
- openaiApiKey: params.openaiApiKey as string,
751
- },
752
- params.filename as string | undefined,
753
- );
754
- },
755
- },
756
-
757
- {
758
- name: 'chat_voice_synthesize',
759
- description: 'Synthesize speech from text using OpenAI TTS. Returns base64 MP3.',
760
- auth: 'write',
761
- schema: z.object({
762
- text: z.string().describe('Text to synthesize.'),
763
- openaiApiKey: z.string().describe('OpenAI API key.'),
764
- voice: z.string().optional().describe('Voice ID. Default: onyx.'),
765
- }),
766
- handler: async (params) => {
767
- const result = await synthesizeSpeech(params.text as string, {
768
- openaiApiKey: params.openaiApiKey as string,
769
- ttsVoice: params.voice as string | undefined,
770
- });
771
- if (!result) return { success: false, reason: 'No API key.' };
772
- return {
773
- success: result.success,
774
- audioBase64: result.audio.toString('base64'),
775
- audioSize: result.audio.length,
776
- };
777
- },
778
- },
779
-
780
- // ─── Queue Ops ─────────────────────────────────────────────────
781
-
782
- {
783
- name: 'chat_queue_init',
784
- description: 'Initialize the message queue for disk-based chat relay.',
785
- auth: 'write',
786
- schema: z.object({
787
- queueDir: z.string().describe('Base directory for inbox/outbox.'),
788
- }),
789
- handler: async (params) => {
790
- state.queue = new MessageQueue({ queueDir: params.queueDir as string });
791
- return {
792
- initialized: true,
793
- inbox: state.queue.inboxCount(),
794
- outbox: state.queue.outboxCount(),
795
- };
796
- },
797
- },
798
-
799
- {
800
- name: 'chat_queue_inbox',
801
- description: 'Read pending messages from the queue inbox.',
802
- auth: 'read',
803
- schema: z.object({
804
- queueDir: z.string().describe('Queue directory (auto-initializes).'),
805
- }),
806
- handler: async (params) => {
807
- if (!state.queue) {
808
- state.queue = new MessageQueue({ queueDir: params.queueDir as string });
809
- }
810
- const messages = state.queue.readInbox();
811
- return { messages, count: messages.length, formatted: state.queue.formatInbox() };
812
- },
813
- },
814
-
815
- {
816
- name: 'chat_queue_reply',
817
- description: 'Send a reply to a queued message. Removes from inbox, writes to outbox.',
818
- auth: 'write',
819
- schema: z.object({
820
- messageId: z.string().describe('Original message ID.'),
821
- chatId: z.string().describe('Target chat ID.'),
822
- text: z.string().describe('Response text.'),
823
- queueDir: z.string().describe('Queue directory.'),
824
- }),
825
- handler: async (params) => {
826
- if (!state.queue) {
827
- state.queue = new MessageQueue({ queueDir: params.queueDir as string });
828
- }
829
- const response = state.queue.sendResponse(
830
- params.messageId as string,
831
- params.chatId as string,
832
- params.text as string,
833
- );
834
- return { sent: true, response };
835
- },
836
- },
837
-
838
- {
839
- name: 'chat_queue_drain',
840
- description: 'Drain outbox — read and remove all pending responses.',
841
- auth: 'write',
842
- schema: z.object({
843
- queueDir: z.string().describe('Queue directory.'),
844
- }),
845
- handler: async (params) => {
846
- if (!state.queue) {
847
- state.queue = new MessageQueue({ queueDir: params.queueDir as string });
848
- }
849
- const responses = state.queue.drainOutbox();
850
- return { responses, count: responses.length };
851
- },
852
- },
853
-
854
- // ─── Browser Session Ops ───────────────────────────────────────
855
-
856
- {
857
- name: 'chat_browser_init',
858
- description: 'Initialize the browser session manager for per-chat Playwright isolation.',
859
- auth: 'write',
860
- schema: z.object({
861
- maxSessions: z.number().optional().describe('Max concurrent sessions. Default: 3.'),
862
- idleTimeoutMs: z.number().optional().describe('Idle timeout in ms. Default: 5 minutes.'),
863
- }),
864
- handler: async (params) => {
865
- state.browser = new BrowserSessionManager({
866
- maxSessions: params.maxSessions as number | undefined,
867
- idleTimeoutMs: params.idleTimeoutMs as number | undefined,
868
- });
869
- return { initialized: true, maxSessions: params.maxSessions ?? 3 };
870
- },
871
- },
872
-
873
- {
874
- name: 'chat_browser_acquire',
875
- description: 'Get or create a browser session for a chat. Spawns Playwright if needed.',
876
- auth: 'write',
877
- schema: z.object({
878
- chatId: z.string().describe('Chat ID for isolation.'),
879
- }),
880
- handler: async (params) => {
881
- if (!state.browser) {
882
- state.browser = new BrowserSessionManager();
883
- }
884
- const session = state.browser.acquire(params.chatId as string);
885
- return {
886
- chatId: params.chatId,
887
- pid: session.process.pid ?? null,
888
- activeSessions: state.browser.size,
889
- };
890
- },
891
- },
892
-
893
- {
894
- name: 'chat_browser_release',
895
- description: 'Release a browser session for a chat.',
896
- auth: 'write',
897
- schema: z.object({
898
- chatId: z.string().describe('Chat ID to release.'),
899
- }),
900
- handler: async (params) => {
901
- if (!state.browser) return { released: false, reason: 'No browser manager.' };
902
- const released = state.browser.release(params.chatId as string);
903
- return { released, activeSessions: state.browser.size };
904
- },
905
- },
906
-
907
- {
908
- name: 'chat_browser_status',
909
- description: 'Get browser session status — active sessions, per-chat info.',
910
- auth: 'read',
911
- handler: async () => {
912
- if (!state.browser) return { initialized: false, activeSessions: 0, sessions: [] };
913
- const sessions = state.browser.listSessions().map((id) => (Object.assign({chatId:id}, state.browser! .getInfo(id))));
914
- return { initialized: true, activeSessions: state.browser.size, sessions };
915
- },
916
- },
23
+ ...createChatSessionOps(state),
24
+ ...createChatTransportOps(state),
25
+ ...createChatServiceOps(state),
917
26
  ];
918
27
  }