@soleri/core 9.2.0 → 9.3.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 (298) hide show
  1. package/data/flows/build.flow.yaml +8 -9
  2. package/data/flows/deliver.flow.yaml +9 -10
  3. package/data/flows/design.flow.yaml +3 -4
  4. package/data/flows/enhance.flow.yaml +5 -6
  5. package/data/flows/explore.flow.yaml +3 -4
  6. package/data/flows/fix.flow.yaml +5 -6
  7. package/data/flows/plan.flow.yaml +4 -5
  8. package/data/flows/review.flow.yaml +3 -4
  9. package/dist/curator/curator.d.ts.map +1 -1
  10. package/dist/curator/curator.js +98 -22
  11. package/dist/curator/curator.js.map +1 -1
  12. package/dist/engine/bin/soleri-engine.js.map +1 -1
  13. package/dist/engine/module-manifest.d.ts.map +1 -1
  14. package/dist/engine/module-manifest.js +21 -1
  15. package/dist/engine/module-manifest.js.map +1 -1
  16. package/dist/engine/register-engine.d.ts.map +1 -1
  17. package/dist/engine/register-engine.js +25 -1
  18. package/dist/engine/register-engine.js.map +1 -1
  19. package/dist/flows/gate-evaluator.js.map +1 -1
  20. package/dist/operator/operator-profile.d.ts.map +1 -1
  21. package/dist/operator/operator-profile.js +11 -5
  22. package/dist/operator/operator-profile.js.map +1 -1
  23. package/dist/operator/operator-signals.d.ts.map +1 -1
  24. package/dist/operator/operator-signals.js.map +1 -1
  25. package/dist/planning/evidence-collector.js.map +1 -1
  26. package/dist/planning/gap-passes.d.ts.map +1 -1
  27. package/dist/planning/gap-passes.js +23 -6
  28. package/dist/planning/gap-passes.js.map +1 -1
  29. package/dist/planning/gap-patterns.d.ts.map +1 -1
  30. package/dist/planning/gap-patterns.js +57 -11
  31. package/dist/planning/gap-patterns.js.map +1 -1
  32. package/dist/planning/github-projection.d.ts.map +1 -1
  33. package/dist/planning/github-projection.js +39 -20
  34. package/dist/planning/github-projection.js.map +1 -1
  35. package/dist/planning/impact-analyzer.d.ts.map +1 -1
  36. package/dist/planning/impact-analyzer.js +20 -18
  37. package/dist/planning/impact-analyzer.js.map +1 -1
  38. package/dist/planning/plan-lifecycle.d.ts.map +1 -1
  39. package/dist/planning/plan-lifecycle.js +22 -9
  40. package/dist/planning/plan-lifecycle.js.map +1 -1
  41. package/dist/planning/planner.d.ts.map +1 -1
  42. package/dist/planning/planner.js +60 -17
  43. package/dist/planning/planner.js.map +1 -1
  44. package/dist/planning/rationalization-detector.d.ts.map +1 -1
  45. package/dist/planning/rationalization-detector.js.map +1 -1
  46. package/dist/planning/reconciliation-engine.d.ts.map +1 -1
  47. package/dist/planning/reconciliation-engine.js.map +1 -1
  48. package/dist/planning/task-verifier.d.ts.map +1 -1
  49. package/dist/planning/task-verifier.js +14 -6
  50. package/dist/planning/task-verifier.js.map +1 -1
  51. package/dist/runtime/admin-setup-ops.d.ts.map +1 -1
  52. package/dist/runtime/admin-setup-ops.js +2 -1
  53. package/dist/runtime/admin-setup-ops.js.map +1 -1
  54. package/dist/runtime/branching-ops.d.ts +12 -0
  55. package/dist/runtime/branching-ops.d.ts.map +1 -0
  56. package/dist/runtime/branching-ops.js +100 -0
  57. package/dist/runtime/branching-ops.js.map +1 -0
  58. package/dist/runtime/context-health.d.ts.map +1 -1
  59. package/dist/runtime/context-health.js.map +1 -1
  60. package/dist/runtime/facades/branching-facade.d.ts +7 -0
  61. package/dist/runtime/facades/branching-facade.d.ts.map +1 -0
  62. package/dist/runtime/facades/branching-facade.js +8 -0
  63. package/dist/runtime/facades/branching-facade.js.map +1 -0
  64. package/dist/runtime/facades/chat-service-ops.d.ts.map +1 -1
  65. package/dist/runtime/facades/chat-service-ops.js +3 -1
  66. package/dist/runtime/facades/chat-service-ops.js.map +1 -1
  67. package/dist/runtime/facades/chat-transport-ops.d.ts.map +1 -1
  68. package/dist/runtime/facades/chat-transport-ops.js.map +1 -1
  69. package/dist/runtime/facades/index.d.ts.map +1 -1
  70. package/dist/runtime/facades/index.js +42 -0
  71. package/dist/runtime/facades/index.js.map +1 -1
  72. package/dist/runtime/facades/intake-facade.d.ts +9 -0
  73. package/dist/runtime/facades/intake-facade.d.ts.map +1 -0
  74. package/dist/runtime/facades/intake-facade.js +11 -0
  75. package/dist/runtime/facades/intake-facade.js.map +1 -0
  76. package/dist/runtime/facades/links-facade.d.ts +9 -0
  77. package/dist/runtime/facades/links-facade.d.ts.map +1 -0
  78. package/dist/runtime/facades/links-facade.js +10 -0
  79. package/dist/runtime/facades/links-facade.js.map +1 -0
  80. package/dist/runtime/facades/operator-facade.d.ts.map +1 -1
  81. package/dist/runtime/facades/operator-facade.js.map +1 -1
  82. package/dist/runtime/facades/plan-facade.d.ts.map +1 -1
  83. package/dist/runtime/facades/plan-facade.js +4 -1
  84. package/dist/runtime/facades/plan-facade.js.map +1 -1
  85. package/dist/runtime/facades/tier-facade.d.ts +7 -0
  86. package/dist/runtime/facades/tier-facade.d.ts.map +1 -0
  87. package/dist/runtime/facades/tier-facade.js +8 -0
  88. package/dist/runtime/facades/tier-facade.js.map +1 -0
  89. package/dist/runtime/facades/vault-facade.d.ts +9 -1
  90. package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
  91. package/dist/runtime/facades/vault-facade.js +44 -187
  92. package/dist/runtime/facades/vault-facade.js.map +1 -1
  93. package/dist/runtime/github-integration.d.ts.map +1 -1
  94. package/dist/runtime/github-integration.js +11 -4
  95. package/dist/runtime/github-integration.js.map +1 -1
  96. package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
  97. package/dist/runtime/orchestrate-ops.js +32 -10
  98. package/dist/runtime/orchestrate-ops.js.map +1 -1
  99. package/dist/runtime/planning-extra-ops.d.ts.map +1 -1
  100. package/dist/runtime/planning-extra-ops.js.map +1 -1
  101. package/dist/runtime/runtime.d.ts.map +1 -1
  102. package/dist/runtime/runtime.js +3 -1
  103. package/dist/runtime/runtime.js.map +1 -1
  104. package/dist/runtime/session-briefing.d.ts.map +1 -1
  105. package/dist/runtime/session-briefing.js +5 -1
  106. package/dist/runtime/session-briefing.js.map +1 -1
  107. package/dist/runtime/tier-ops.d.ts +13 -0
  108. package/dist/runtime/tier-ops.d.ts.map +1 -0
  109. package/dist/runtime/tier-ops.js +110 -0
  110. package/dist/runtime/tier-ops.js.map +1 -0
  111. package/dist/skills/sync-skills.d.ts.map +1 -1
  112. package/dist/skills/sync-skills.js +1 -1
  113. package/dist/skills/sync-skills.js.map +1 -1
  114. package/dist/vault/linking.d.ts.map +1 -1
  115. package/dist/vault/linking.js +41 -5
  116. package/dist/vault/linking.js.map +1 -1
  117. package/dist/vault/vault-entries.d.ts.map +1 -1
  118. package/dist/vault/vault-entries.js +68 -26
  119. package/dist/vault/vault-entries.js.map +1 -1
  120. package/dist/vault/vault-maintenance.d.ts.map +1 -1
  121. package/dist/vault/vault-maintenance.js +6 -2
  122. package/dist/vault/vault-maintenance.js.map +1 -1
  123. package/dist/vault/vault-markdown-sync.d.ts.map +1 -1
  124. package/dist/vault/vault-markdown-sync.js.map +1 -1
  125. package/dist/vault/vault-memories.d.ts.map +1 -1
  126. package/dist/vault/vault-memories.js +3 -1
  127. package/dist/vault/vault-memories.js.map +1 -1
  128. package/dist/vault/vault-schema.js +36 -10
  129. package/dist/vault/vault-schema.js.map +1 -1
  130. package/dist/vault/vault.d.ts.map +1 -1
  131. package/dist/vault/vault.js +5 -1
  132. package/dist/vault/vault.js.map +1 -1
  133. package/package.json +7 -7
  134. package/src/agency/agency-manager.test.ts +60 -40
  135. package/src/agency/default-rules.test.ts +17 -9
  136. package/src/capabilities/registry.test.ts +2 -12
  137. package/src/chat/agent-loop.test.ts +33 -43
  138. package/src/chat/mcp-bridge.test.ts +7 -2
  139. package/src/claudemd/inject.test.ts +2 -12
  140. package/src/context/context-engine.test.ts +96 -51
  141. package/src/control/intent-router.test.ts +3 -3
  142. package/src/curator/classifier.test.ts +14 -8
  143. package/src/curator/contradiction-detector.test.ts +30 -5
  144. package/src/curator/curator.ts +278 -56
  145. package/src/curator/duplicate-detector.test.ts +77 -15
  146. package/src/curator/quality-gate.test.ts +71 -31
  147. package/src/curator/tag-manager.test.ts +12 -4
  148. package/src/domain-packs/knowledge-installer.test.ts +2 -10
  149. package/src/domain-packs/token-resolver.test.ts +1 -3
  150. package/src/domain-packs/types.test.ts +16 -2
  151. package/src/enforcement/registry.test.ts +2 -8
  152. package/src/engine/bin/soleri-engine.ts +3 -1
  153. package/src/engine/module-manifest.test.ts +5 -4
  154. package/src/engine/module-manifest.ts +21 -1
  155. package/src/engine/register-engine.test.ts +6 -1
  156. package/src/engine/register-engine.ts +26 -3
  157. package/src/errors/classify.test.ts +6 -2
  158. package/src/errors/retry.test.ts +1 -4
  159. package/src/facades/facade-factory.test.ts +110 -64
  160. package/src/flows/epilogue.test.ts +16 -10
  161. package/src/flows/gate-evaluator.test.ts +12 -6
  162. package/src/flows/gate-evaluator.ts +1 -3
  163. package/src/governance/governance.test.ts +137 -21
  164. package/src/health/health-registry.test.ts +8 -1
  165. package/src/intake/content-classifier.test.ts +121 -51
  166. package/src/intake/dedup-gate.test.ts +38 -22
  167. package/src/intake/intake-pipeline.test.ts +5 -3
  168. package/src/intake/text-ingester.test.ts +26 -20
  169. package/src/llm/key-pool.test.ts +1 -3
  170. package/src/llm/llm-client.test.ts +1 -4
  171. package/src/llm/oauth-discovery.test.ts +16 -16
  172. package/src/llm/utils.test.ts +62 -18
  173. package/src/logging/logger.test.ts +4 -1
  174. package/src/loop/loop-manager.test.ts +2 -6
  175. package/src/migrations/migration-runner.edge-cases.test.ts +2 -7
  176. package/src/operator/operator-profile-extended.test.ts +15 -5
  177. package/src/operator/operator-profile.test.ts +26 -8
  178. package/src/operator/operator-profile.ts +38 -22
  179. package/src/operator/operator-signals-extended.test.ts +35 -23
  180. package/src/operator/operator-signals.test.ts +6 -10
  181. package/src/operator/operator-signals.ts +2 -1
  182. package/src/operator/prompts/hook-precompact-operator-dispatch.md +10 -6
  183. package/src/operator/prompts/subagent-soft-signal-extractor.md +5 -0
  184. package/src/operator/prompts/subagent-synthesis-cognition.md +19 -10
  185. package/src/operator/prompts/subagent-synthesis-communication.md +13 -7
  186. package/src/operator/prompts/subagent-synthesis-technical.md +19 -9
  187. package/src/operator/prompts/subagent-synthesis-trust.md +27 -21
  188. package/src/persona/defaults.test.ts +1 -5
  189. package/src/planning/evidence-collector.test.ts +147 -38
  190. package/src/planning/evidence-collector.ts +1 -4
  191. package/src/planning/gap-analysis-alternatives.test.ts +41 -11
  192. package/src/planning/gap-passes.test.ts +215 -33
  193. package/src/planning/gap-passes.ts +115 -46
  194. package/src/planning/gap-patterns.test.ts +87 -13
  195. package/src/planning/gap-patterns.ts +114 -31
  196. package/src/planning/github-projection.test.ts +6 -1
  197. package/src/planning/github-projection.ts +41 -20
  198. package/src/planning/impact-analyzer.test.ts +10 -23
  199. package/src/planning/impact-analyzer.ts +33 -46
  200. package/src/planning/plan-lifecycle.test.ts +103 -36
  201. package/src/planning/plan-lifecycle.ts +49 -18
  202. package/src/planning/planner.test.ts +12 -2
  203. package/src/planning/planner.ts +198 -58
  204. package/src/planning/rationalization-detector.test.ts +5 -20
  205. package/src/planning/rationalization-detector.ts +14 -16
  206. package/src/planning/reconciliation-engine.test.ts +20 -3
  207. package/src/planning/reconciliation-engine.ts +1 -2
  208. package/src/planning/task-verifier.test.ts +59 -27
  209. package/src/planning/task-verifier.ts +15 -9
  210. package/src/playbooks/playbook-executor.test.ts +1 -3
  211. package/src/plugins/plugin-loader.test.ts +19 -14
  212. package/src/plugins/plugin-registry.test.ts +45 -33
  213. package/src/project/project-registry.test.ts +23 -12
  214. package/src/prompts/template-manager.test.ts +4 -1
  215. package/src/queue/job-queue.test.ts +10 -14
  216. package/src/runtime/admin-extra-ops.test.ts +5 -19
  217. package/src/runtime/admin-ops.test.ts +1 -3
  218. package/src/runtime/admin-setup-ops.test.ts +3 -4
  219. package/src/runtime/admin-setup-ops.ts +9 -2
  220. package/src/runtime/archive-ops.test.ts +4 -1
  221. package/src/runtime/branching-ops.test.ts +144 -0
  222. package/src/runtime/branching-ops.ts +107 -0
  223. package/src/runtime/capture-ops.test.ts +7 -21
  224. package/src/runtime/chain-ops.test.ts +16 -6
  225. package/src/runtime/claude-md-helpers.test.ts +1 -3
  226. package/src/runtime/context-health.test.ts +1 -3
  227. package/src/runtime/context-health.ts +1 -3
  228. package/src/runtime/curator-extra-ops.test.ts +3 -1
  229. package/src/runtime/domain-ops.test.ts +46 -36
  230. package/src/runtime/facades/admin-facade.test.ts +1 -4
  231. package/src/runtime/facades/archive-facade.test.ts +21 -7
  232. package/src/runtime/facades/brain-facade.test.ts +176 -72
  233. package/src/runtime/facades/branching-facade.test.ts +43 -0
  234. package/src/runtime/facades/branching-facade.ts +11 -0
  235. package/src/runtime/facades/chat-facade.test.ts +81 -28
  236. package/src/runtime/facades/chat-service-ops.test.ts +178 -73
  237. package/src/runtime/facades/chat-service-ops.ts +3 -1
  238. package/src/runtime/facades/chat-session-ops.test.ts +25 -10
  239. package/src/runtime/facades/chat-transport-ops.test.ts +101 -34
  240. package/src/runtime/facades/chat-transport-ops.ts +0 -1
  241. package/src/runtime/facades/context-facade.test.ts +19 -4
  242. package/src/runtime/facades/control-facade.test.ts +3 -3
  243. package/src/runtime/facades/index.ts +42 -0
  244. package/src/runtime/facades/intake-facade.test.ts +215 -0
  245. package/src/runtime/facades/intake-facade.ts +14 -0
  246. package/src/runtime/facades/links-facade.test.ts +203 -0
  247. package/src/runtime/facades/links-facade.ts +13 -0
  248. package/src/runtime/facades/loop-facade.test.ts +22 -5
  249. package/src/runtime/facades/memory-facade.test.ts +19 -5
  250. package/src/runtime/facades/operator-facade.test.ts +17 -4
  251. package/src/runtime/facades/operator-facade.ts +11 -3
  252. package/src/runtime/facades/orchestrate-facade.test.ts +7 -1
  253. package/src/runtime/facades/plan-facade.test.ts +29 -12
  254. package/src/runtime/facades/plan-facade.ts +7 -2
  255. package/src/runtime/facades/tier-facade.test.ts +47 -0
  256. package/src/runtime/facades/tier-facade.ts +11 -0
  257. package/src/runtime/facades/vault-facade.test.ts +174 -242
  258. package/src/runtime/facades/vault-facade.ts +55 -199
  259. package/src/runtime/github-integration.ts +11 -8
  260. package/src/runtime/grading-ops.test.ts +39 -8
  261. package/src/runtime/intake-ops.test.ts +69 -16
  262. package/src/runtime/loop-ops.test.ts +16 -6
  263. package/src/runtime/memory-cross-project-ops.test.ts +25 -14
  264. package/src/runtime/orchestrate-ops.ts +54 -27
  265. package/src/runtime/pack-ops.test.ts +23 -6
  266. package/src/runtime/planning-extra-ops.test.ts +17 -7
  267. package/src/runtime/planning-extra-ops.ts +3 -1
  268. package/src/runtime/playbook-ops.test.ts +26 -3
  269. package/src/runtime/plugin-ops.test.ts +83 -25
  270. package/src/runtime/project-ops.test.ts +26 -6
  271. package/src/runtime/runtime.ts +3 -1
  272. package/src/runtime/session-briefing.test.ts +183 -54
  273. package/src/runtime/session-briefing.ts +8 -2
  274. package/src/runtime/sync-ops.test.ts +3 -12
  275. package/src/runtime/telemetry-ops.test.ts +31 -6
  276. package/src/runtime/tier-ops.test.ts +159 -0
  277. package/src/runtime/tier-ops.ts +119 -0
  278. package/src/runtime/vault-extra-ops.test.ts +32 -8
  279. package/src/runtime/vault-sharing-ops.test.ts +1 -4
  280. package/src/skills/sync-skills.ts +2 -12
  281. package/src/transport/ws-server.test.ts +7 -4
  282. package/src/vault/__tests__/vault-characterization.test.ts +492 -81
  283. package/src/vault/linking.test.ts +50 -17
  284. package/src/vault/linking.ts +48 -7
  285. package/src/vault/obsidian-sync.test.ts +6 -3
  286. package/src/vault/scope-detector.test.ts +1 -3
  287. package/src/vault/vault-branching.test.ts +9 -7
  288. package/src/vault/vault-entries.ts +209 -65
  289. package/src/vault/vault-maintenance.ts +7 -12
  290. package/src/vault/vault-manager.test.ts +10 -10
  291. package/src/vault/vault-markdown-sync.ts +4 -1
  292. package/src/vault/vault-memories.ts +7 -7
  293. package/src/vault/vault-schema.ts +72 -15
  294. package/src/vault/vault.ts +55 -9
  295. package/src/brain/strength-scorer.ts +0 -404
  296. package/src/engine/index.ts +0 -21
  297. package/src/persona/index.ts +0 -9
  298. package/src/vault/vault-interfaces.ts +0 -56
@@ -19,9 +19,9 @@ function makeMockBrain() {
19
19
  rebuildVocabulary: vi.fn(),
20
20
  getVocabularySize: vi.fn().mockReturnValue(42),
21
21
  getStats: vi.fn().mockReturnValue({ vocabularySize: 42, feedbackCount: 5 }),
22
- getDecayReport: vi.fn().mockResolvedValue([
23
- { id: 'e1', title: 'Test', decayScore: 0.8, status: 'active' },
24
- ]),
22
+ getDecayReport: vi
23
+ .fn()
24
+ .mockResolvedValue([{ id: 'e1', title: 'Test', decayScore: 0.8, status: 'active' }]),
25
25
  intelligentSearch: vi.fn().mockResolvedValue([]),
26
26
  scanSearch: vi.fn().mockResolvedValue([]),
27
27
  enrichAndCapture: vi.fn().mockReturnValue({ captured: true, id: 'cap-1', autoTags: [] }),
@@ -125,15 +125,35 @@ describe('brain-facade', () => {
125
125
 
126
126
  it('includes all expected op names', () => {
127
127
  const expected = [
128
- 'record_feedback', 'brain_feedback', 'brain_feedback_stats',
129
- 'rebuild_vocabulary', 'brain_stats', 'brain_decay_report',
130
- 'llm_status', 'brain_session_context', 'brain_strengths',
131
- 'brain_global_patterns', 'brain_recommend', 'brain_build_intelligence',
132
- 'brain_export', 'brain_import', 'brain_extract_knowledge',
133
- 'brain_archive_sessions', 'brain_promote_proposals', 'brain_lifecycle',
134
- 'session_list', 'session_get', 'session_quality', 'session_replay',
135
- 'brain_reset_extracted', 'radar_analyze', 'radar_candidates',
136
- 'radar_approve', 'radar_dismiss', 'radar_flush', 'radar_stats',
128
+ 'record_feedback',
129
+ 'brain_feedback',
130
+ 'brain_feedback_stats',
131
+ 'rebuild_vocabulary',
132
+ 'brain_stats',
133
+ 'brain_decay_report',
134
+ 'llm_status',
135
+ 'brain_session_context',
136
+ 'brain_strengths',
137
+ 'brain_global_patterns',
138
+ 'brain_recommend',
139
+ 'brain_build_intelligence',
140
+ 'brain_export',
141
+ 'brain_import',
142
+ 'brain_extract_knowledge',
143
+ 'brain_archive_sessions',
144
+ 'brain_promote_proposals',
145
+ 'brain_lifecycle',
146
+ 'session_list',
147
+ 'session_get',
148
+ 'session_quality',
149
+ 'session_replay',
150
+ 'brain_reset_extracted',
151
+ 'radar_analyze',
152
+ 'radar_candidates',
153
+ 'radar_approve',
154
+ 'radar_dismiss',
155
+ 'radar_flush',
156
+ 'radar_stats',
137
157
  'synthesize',
138
158
  ];
139
159
  for (const name of expected) {
@@ -145,11 +165,22 @@ describe('brain-facade', () => {
145
165
 
146
166
  it('has correct auth levels for read ops', () => {
147
167
  const readOps = [
148
- 'brain_feedback_stats', 'brain_stats', 'brain_decay_report',
149
- 'llm_status', 'brain_session_context', 'brain_strengths',
150
- 'brain_global_patterns', 'brain_recommend', 'brain_export',
151
- 'session_list', 'session_get', 'session_quality', 'session_replay',
152
- 'radar_candidates', 'radar_stats', 'synthesize',
168
+ 'brain_feedback_stats',
169
+ 'brain_stats',
170
+ 'brain_decay_report',
171
+ 'llm_status',
172
+ 'brain_session_context',
173
+ 'brain_strengths',
174
+ 'brain_global_patterns',
175
+ 'brain_recommend',
176
+ 'brain_export',
177
+ 'session_list',
178
+ 'session_get',
179
+ 'session_quality',
180
+ 'session_replay',
181
+ 'radar_candidates',
182
+ 'radar_stats',
183
+ 'synthesize',
153
184
  ];
154
185
  for (const name of readOps) {
155
186
  expect(ops.get(name)!.auth, `${name} should be read`).toBe('read');
@@ -158,11 +189,20 @@ describe('brain-facade', () => {
158
189
 
159
190
  it('has correct auth levels for write ops', () => {
160
191
  const writeOps = [
161
- 'record_feedback', 'brain_feedback', 'rebuild_vocabulary',
162
- 'brain_build_intelligence', 'brain_import', 'brain_extract_knowledge',
163
- 'brain_archive_sessions', 'brain_promote_proposals', 'brain_lifecycle',
164
- 'brain_reset_extracted', 'radar_analyze', 'radar_approve',
165
- 'radar_dismiss', 'radar_flush',
192
+ 'record_feedback',
193
+ 'brain_feedback',
194
+ 'rebuild_vocabulary',
195
+ 'brain_build_intelligence',
196
+ 'brain_import',
197
+ 'brain_extract_knowledge',
198
+ 'brain_archive_sessions',
199
+ 'brain_promote_proposals',
200
+ 'brain_lifecycle',
201
+ 'brain_reset_extracted',
202
+ 'radar_analyze',
203
+ 'radar_approve',
204
+ 'radar_dismiss',
205
+ 'radar_flush',
166
206
  ];
167
207
  for (const name of writeOps) {
168
208
  expect(ops.get(name)!.auth, `${name} should be write`).toBe('write');
@@ -179,7 +219,12 @@ describe('brain-facade', () => {
179
219
  action: 'accepted',
180
220
  });
181
221
  expect(result.success).toBe(true);
182
- const data = result.data as { recorded: boolean; query: string; entryId: string; action: string };
222
+ const data = result.data as {
223
+ recorded: boolean;
224
+ query: string;
225
+ entryId: string;
226
+ action: string;
227
+ };
183
228
  expect(data.recorded).toBe(true);
184
229
  expect(data.query).toBe('test query');
185
230
  expect(data.entryId).toBe('e-1');
@@ -188,7 +233,9 @@ describe('brain-facade', () => {
188
233
 
189
234
  it('calls brain.recordFeedback with positional args', async () => {
190
235
  await executeOp(ops, 'record_feedback', {
191
- query: 'q', entryId: 'e', action: 'dismissed',
236
+ query: 'q',
237
+ entryId: 'e',
238
+ action: 'dismissed',
192
239
  });
193
240
  const brain = runtime.brain as ReturnType<typeof makeMockBrain>;
194
241
  expect(brain.recordFeedback).toHaveBeenCalledWith('q', 'e', 'dismissed');
@@ -196,7 +243,9 @@ describe('brain-facade', () => {
196
243
 
197
244
  it('rejects invalid action enum', async () => {
198
245
  const result = await executeOp(ops, 'record_feedback', {
199
- query: 'q', entryId: 'e', action: 'invalid',
246
+ query: 'q',
247
+ entryId: 'e',
248
+ action: 'invalid',
200
249
  });
201
250
  expect(result.success).toBe(false);
202
251
  expect(result.error).toContain('Invalid params');
@@ -208,22 +257,34 @@ describe('brain-facade', () => {
208
257
  describe('brain_feedback', () => {
209
258
  it('records enhanced feedback with all fields', async () => {
210
259
  const result = await executeOp(ops, 'brain_feedback', {
211
- query: 'design tokens', entryId: 'e-2', action: 'modified',
212
- source: 'search', confidence: 0.9, duration: 1200,
213
- context: '{}', reason: 'too verbose',
260
+ query: 'design tokens',
261
+ entryId: 'e-2',
262
+ action: 'modified',
263
+ source: 'search',
264
+ confidence: 0.9,
265
+ duration: 1200,
266
+ context: '{}',
267
+ reason: 'too verbose',
214
268
  });
215
269
  expect(result.success).toBe(true);
216
270
  const brain = runtime.brain as ReturnType<typeof makeMockBrain>;
217
271
  expect(brain.recordFeedback).toHaveBeenCalledWith({
218
- query: 'design tokens', entryId: 'e-2', action: 'modified',
219
- source: 'search', confidence: 0.9, duration: 1200,
220
- context: '{}', reason: 'too verbose',
272
+ query: 'design tokens',
273
+ entryId: 'e-2',
274
+ action: 'modified',
275
+ source: 'search',
276
+ confidence: 0.9,
277
+ duration: 1200,
278
+ context: '{}',
279
+ reason: 'too verbose',
221
280
  });
222
281
  });
223
282
 
224
283
  it('works with minimal required fields', async () => {
225
284
  const result = await executeOp(ops, 'brain_feedback', {
226
- query: 'q', entryId: 'e', action: 'failed',
285
+ query: 'q',
286
+ entryId: 'e',
287
+ action: 'failed',
227
288
  });
228
289
  expect(result.success).toBe(true);
229
290
  });
@@ -231,7 +292,9 @@ describe('brain-facade', () => {
231
292
  it('accepts all 4 action types', async () => {
232
293
  for (const action of ['accepted', 'dismissed', 'modified', 'failed']) {
233
294
  const result = await executeOp(ops, 'brain_feedback', {
234
- query: 'q', entryId: 'e', action,
295
+ query: 'q',
296
+ entryId: 'e',
297
+ action,
235
298
  });
236
299
  expect(result.success, `action ${action} should succeed`).toBe(true);
237
300
  }
@@ -274,7 +337,10 @@ describe('brain-facade', () => {
274
337
  it('merges brain and intelligence stats', async () => {
275
338
  const result = await executeOp(ops, 'brain_stats', {});
276
339
  expect(result.success).toBe(true);
277
- const data = result.data as { vocabularySize: number; intelligence: { pipelineRuns: number } };
340
+ const data = result.data as {
341
+ vocabularySize: number;
342
+ intelligence: { pipelineRuns: number };
343
+ };
278
344
  expect(data.vocabularySize).toBe(42);
279
345
  expect(data.intelligence.pipelineRuns).toBe(3);
280
346
  });
@@ -344,17 +410,23 @@ describe('brain-facade', () => {
344
410
  expect(result.success).toBe(true);
345
411
  const bi = runtime.brainIntelligence as ReturnType<typeof makeMockBrainIntelligence>;
346
412
  expect(bi.getStrengths).toHaveBeenCalledWith({
347
- domain: undefined, minStrength: undefined, limit: 50,
413
+ domain: undefined,
414
+ minStrength: undefined,
415
+ limit: 50,
348
416
  });
349
417
  });
350
418
 
351
419
  it('passes all filter params', async () => {
352
420
  await executeOp(ops, 'brain_strengths', {
353
- domain: 'design', minStrength: 60, limit: 10,
421
+ domain: 'design',
422
+ minStrength: 60,
423
+ limit: 10,
354
424
  });
355
425
  const bi = runtime.brainIntelligence as ReturnType<typeof makeMockBrainIntelligence>;
356
426
  expect(bi.getStrengths).toHaveBeenCalledWith({
357
- domain: 'design', minStrength: 60, limit: 10,
427
+ domain: 'design',
428
+ minStrength: 60,
429
+ limit: 10,
358
430
  });
359
431
  });
360
432
  });
@@ -380,12 +452,16 @@ describe('brain-facade', () => {
380
452
  describe('brain_recommend', () => {
381
453
  it('passes all params with defaults', async () => {
382
454
  const result = await executeOp(ops, 'brain_recommend', {
383
- domain: 'css', task: 'build button',
455
+ domain: 'css',
456
+ task: 'build button',
384
457
  });
385
458
  expect(result.success).toBe(true);
386
459
  const bi = runtime.brainIntelligence as ReturnType<typeof makeMockBrainIntelligence>;
387
460
  expect(bi.recommend).toHaveBeenCalledWith({
388
- domain: 'css', task: 'build button', source: undefined, limit: 5,
461
+ domain: 'css',
462
+ task: 'build button',
463
+ source: undefined,
464
+ limit: 5,
389
465
  });
390
466
  });
391
467
  });
@@ -459,23 +535,16 @@ describe('brain-facade', () => {
459
535
  });
460
536
  expect(result.success).toBe(true);
461
537
  const bi = runtime.brainIntelligence as ReturnType<typeof makeMockBrainIntelligence>;
462
- expect(bi.promoteProposals).toHaveBeenCalledWith(
463
- ['p1', 'p2'],
464
- runtime.governance,
465
- '.',
466
- );
538
+ expect(bi.promoteProposals).toHaveBeenCalledWith(['p1', 'p2'], runtime.governance, '.');
467
539
  });
468
540
 
469
541
  it('uses custom project path', async () => {
470
542
  await executeOp(ops, 'brain_promote_proposals', {
471
- proposalIds: ['p1'], projectPath: '/my/project',
543
+ proposalIds: ['p1'],
544
+ projectPath: '/my/project',
472
545
  });
473
546
  const bi = runtime.brainIntelligence as ReturnType<typeof makeMockBrainIntelligence>;
474
- expect(bi.promoteProposals).toHaveBeenCalledWith(
475
- ['p1'],
476
- runtime.governance,
477
- '/my/project',
478
- );
547
+ expect(bi.promoteProposals).toHaveBeenCalledWith(['p1'], runtime.governance, '/my/project');
479
548
  });
480
549
  });
481
550
 
@@ -484,7 +553,8 @@ describe('brain-facade', () => {
484
553
  describe('brain_lifecycle', () => {
485
554
  it('starts a session', async () => {
486
555
  const result = await executeOp(ops, 'brain_lifecycle', {
487
- action: 'start', domain: 'test',
556
+ action: 'start',
557
+ domain: 'test',
488
558
  });
489
559
  expect(result.success).toBe(true);
490
560
  const bi = runtime.brainIntelligence as ReturnType<typeof makeMockBrainIntelligence>;
@@ -495,15 +565,23 @@ describe('brain-facade', () => {
495
565
 
496
566
  it('ends a session with all metadata', async () => {
497
567
  await executeOp(ops, 'brain_lifecycle', {
498
- action: 'end', sessionId: 's1',
499
- toolsUsed: ['search', 'capture'], filesModified: ['a.ts'],
500
- planId: 'plan-1', planOutcome: 'success',
568
+ action: 'end',
569
+ sessionId: 's1',
570
+ toolsUsed: ['search', 'capture'],
571
+ filesModified: ['a.ts'],
572
+ planId: 'plan-1',
573
+ planOutcome: 'success',
501
574
  });
502
575
  const bi = runtime.brainIntelligence as ReturnType<typeof makeMockBrainIntelligence>;
503
576
  expect(bi.lifecycle).toHaveBeenCalledWith({
504
- action: 'end', sessionId: 's1', domain: undefined, context: undefined,
505
- toolsUsed: ['search', 'capture'], filesModified: ['a.ts'],
506
- planId: 'plan-1', planOutcome: 'success',
577
+ action: 'end',
578
+ sessionId: 's1',
579
+ domain: undefined,
580
+ context: undefined,
581
+ toolsUsed: ['search', 'capture'],
582
+ filesModified: ['a.ts'],
583
+ planId: 'plan-1',
584
+ planOutcome: 'success',
507
585
  });
508
586
  });
509
587
  });
@@ -524,11 +602,19 @@ describe('brain-facade', () => {
524
602
 
525
603
  it('passes all filter params', async () => {
526
604
  await executeOp(ops, 'session_list', {
527
- domain: 'design', active: true, extracted: false, limit: 10, offset: 5,
605
+ domain: 'design',
606
+ active: true,
607
+ extracted: false,
608
+ limit: 10,
609
+ offset: 5,
528
610
  });
529
611
  const bi = runtime.brainIntelligence as ReturnType<typeof makeMockBrainIntelligence>;
530
612
  expect(bi.listSessions).toHaveBeenCalledWith({
531
- domain: 'design', active: true, extracted: false, limit: 10, offset: 5,
613
+ domain: 'design',
614
+ active: true,
615
+ extracted: false,
616
+ limit: 10,
617
+ offset: 5,
532
618
  });
533
619
  });
534
620
  });
@@ -578,7 +664,9 @@ describe('brain-facade', () => {
578
664
  await executeOp(ops, 'brain_reset_extracted', { sessionId: 'sess-1' });
579
665
  const bi = runtime.brainIntelligence as ReturnType<typeof makeMockBrainIntelligence>;
580
666
  expect(bi.resetExtracted).toHaveBeenCalledWith({
581
- sessionId: 'sess-1', since: undefined, all: undefined,
667
+ sessionId: 'sess-1',
668
+ since: undefined,
669
+ all: undefined,
582
670
  });
583
671
  });
584
672
 
@@ -586,7 +674,9 @@ describe('brain-facade', () => {
586
674
  await executeOp(ops, 'brain_reset_extracted', { all: true });
587
675
  const bi = runtime.brainIntelligence as ReturnType<typeof makeMockBrainIntelligence>;
588
676
  expect(bi.resetExtracted).toHaveBeenCalledWith({
589
- sessionId: undefined, since: undefined, all: true,
677
+ sessionId: undefined,
678
+ since: undefined,
679
+ all: true,
590
680
  });
591
681
  });
592
682
  });
@@ -608,15 +698,23 @@ describe('brain-facade', () => {
608
698
 
609
699
  it('passes all optional fields', async () => {
610
700
  await executeOp(ops, 'radar_analyze', {
611
- type: 'search_miss', title: 't', description: 'd',
612
- suggestedType: 'anti-pattern', confidence: 0.95,
613
- sourceQuery: 'tokens', context: 'extra',
701
+ type: 'search_miss',
702
+ title: 't',
703
+ description: 'd',
704
+ suggestedType: 'anti-pattern',
705
+ confidence: 0.95,
706
+ sourceQuery: 'tokens',
707
+ context: 'extra',
614
708
  });
615
709
  const radar = runtime.learningRadar as ReturnType<typeof makeMockLearningRadar>;
616
710
  expect(radar.analyze).toHaveBeenCalledWith({
617
- type: 'search_miss', title: 't', description: 'd',
618
- suggestedType: 'anti-pattern', confidence: 0.95,
619
- sourceQuery: 'tokens', context: 'extra',
711
+ type: 'search_miss',
712
+ title: 't',
713
+ description: 'd',
714
+ suggestedType: 'anti-pattern',
715
+ confidence: 0.95,
716
+ sourceQuery: 'tokens',
717
+ context: 'extra',
620
718
  });
621
719
  });
622
720
  });
@@ -684,8 +782,10 @@ describe('brain-facade', () => {
684
782
  describe('synthesize', () => {
685
783
  it('synthesizes with all params', async () => {
686
784
  const result = await executeOp(ops, 'synthesize', {
687
- query: 'design tokens', format: 'brief',
688
- maxEntries: 5, audience: 'technical',
785
+ query: 'design tokens',
786
+ format: 'brief',
787
+ maxEntries: 5,
788
+ audience: 'technical',
689
789
  });
690
790
  expect(result.success).toBe(true);
691
791
  const data = result.data as { content: string; coverageScore: number };
@@ -695,17 +795,21 @@ describe('brain-facade', () => {
695
795
 
696
796
  it('uses default audience and maxEntries', async () => {
697
797
  await executeOp(ops, 'synthesize', {
698
- query: 'test', format: 'outline',
798
+ query: 'test',
799
+ format: 'outline',
699
800
  });
700
801
  const synth = runtime.knowledgeSynthesizer as ReturnType<typeof makeMockKnowledgeSynthesizer>;
701
802
  expect(synth.synthesize).toHaveBeenCalledWith('test', {
702
- format: 'outline', maxEntries: 10, audience: 'general',
803
+ format: 'outline',
804
+ maxEntries: 10,
805
+ audience: 'general',
703
806
  });
704
807
  });
705
808
 
706
809
  it('rejects invalid format', async () => {
707
810
  const result = await executeOp(ops, 'synthesize', {
708
- query: 'test', format: 'invalid',
811
+ query: 'test',
812
+ format: 'invalid',
709
813
  });
710
814
  expect(result.success).toBe(false);
711
815
  expect(result.error).toContain('Invalid params');
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Colocated contract tests for branching-facade.ts.
3
+ * Verifies the facade wrapper delegates to branching-ops.
4
+ */
5
+
6
+ import { describe, it, expect, vi } from 'vitest';
7
+ import { createBranchingFacadeOps } from './branching-facade.js';
8
+ import type { AgentRuntime } from '../types.js';
9
+
10
+ function makeRuntime(): AgentRuntime {
11
+ return {
12
+ vaultBranching: {
13
+ branch: vi.fn(),
14
+ addOperation: vi.fn(),
15
+ listBranches: vi.fn().mockReturnValue([]),
16
+ merge: vi.fn().mockReturnValue({ merged: true, applied: 0 }),
17
+ deleteBranch: vi.fn().mockReturnValue(true),
18
+ },
19
+ config: { agentId: 'test-agent' },
20
+ } as unknown as AgentRuntime;
21
+ }
22
+
23
+ describe('branching-facade', () => {
24
+ it('returns all 5 branching ops', () => {
25
+ const ops = createBranchingFacadeOps(makeRuntime());
26
+ expect(ops).toHaveLength(5);
27
+ const names = ops.map((o) => o.name);
28
+ expect(names).toContain('vault_branch');
29
+ expect(names).toContain('vault_branch_add');
30
+ expect(names).toContain('vault_branch_list');
31
+ expect(names).toContain('vault_merge_branch');
32
+ expect(names).toContain('vault_delete_branch');
33
+ });
34
+
35
+ it('every op has name, handler, and auth', () => {
36
+ const ops = createBranchingFacadeOps(makeRuntime());
37
+ for (const op of ops) {
38
+ expect(typeof op.name).toBe('string');
39
+ expect(typeof op.handler).toBe('function');
40
+ expect(typeof op.auth).toBe('string');
41
+ }
42
+ });
43
+ });
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Branching facade — vault branch lifecycle operations.
3
+ */
4
+
5
+ import type { OpDefinition } from '../../facades/types.js';
6
+ import type { AgentRuntime } from '../types.js';
7
+ import { createBranchingOps } from '../branching-ops.js';
8
+
9
+ export function createBranchingFacadeOps(runtime: AgentRuntime): OpDefinition[] {
10
+ return [...createBranchingOps(runtime)];
11
+ }
@@ -13,7 +13,11 @@ vi.mock('../../chat/chat-session.js', () => ({
13
13
  size: 0,
14
14
  startReaper: vi.fn(),
15
15
  getOrCreate: vi.fn().mockReturnValue({
16
- id: 'x', messages: [], createdAt: 0, lastActiveAt: 0, meta: {},
16
+ id: 'x',
17
+ messages: [],
18
+ createdAt: 0,
19
+ lastActiveAt: 0,
20
+ meta: {},
17
21
  }),
18
22
  appendMessage: vi.fn(),
19
23
  messageCount: vi.fn().mockReturnValue(0),
@@ -25,9 +29,13 @@ vi.mock('../../chat/chat-session.js', () => ({
25
29
 
26
30
  vi.mock('../../chat/auth-manager.js', () => ({
27
31
  ChatAuthManager: vi.fn().mockImplementation(() => ({
28
- enabled: false, authenticatedCount: 0,
29
- isAuthenticated: vi.fn(), isLockedOut: vi.fn(),
30
- authenticate: vi.fn(), revoke: vi.fn(), listAuthenticated: vi.fn().mockReturnValue([]),
32
+ enabled: false,
33
+ authenticatedCount: 0,
34
+ isAuthenticated: vi.fn(),
35
+ isLockedOut: vi.fn(),
36
+ authenticate: vi.fn(),
37
+ revoke: vi.fn(),
38
+ listAuthenticated: vi.fn().mockReturnValue([]),
31
39
  })),
32
40
  }));
33
41
 
@@ -38,48 +46,67 @@ vi.mock('../../chat/response-chunker.js', () => ({
38
46
  vi.mock('../../chat/cancellation.js', () => ({
39
47
  TaskCancellationManager: vi.fn().mockImplementation(() => ({
40
48
  create: vi.fn().mockReturnValue({ aborted: false }),
41
- cancel: vi.fn(), getInfo: vi.fn(), listRunning: vi.fn().mockReturnValue([]), size: 0,
49
+ cancel: vi.fn(),
50
+ getInfo: vi.fn(),
51
+ listRunning: vi.fn().mockReturnValue([]),
52
+ size: 0,
42
53
  })),
43
54
  }));
44
55
 
45
56
  vi.mock('../../chat/self-update.js', () => ({
46
57
  SelfUpdateManager: vi.fn().mockImplementation(() => ({
47
- loadContext: vi.fn(), clearContext: vi.fn(), requestRestart: vi.fn(),
58
+ loadContext: vi.fn(),
59
+ clearContext: vi.fn(),
60
+ requestRestart: vi.fn(),
48
61
  })),
49
62
  }));
50
63
 
51
64
  vi.mock('../../chat/file-handler.js', () => ({
52
- detectFileIntent: vi.fn(), buildMultimodalContent: vi.fn(), cleanupTempFiles: vi.fn(),
65
+ detectFileIntent: vi.fn(),
66
+ buildMultimodalContent: vi.fn(),
67
+ cleanupTempFiles: vi.fn(),
53
68
  }));
54
69
 
55
70
  vi.mock('../../chat/voice.js', () => ({
56
- transcribeAudio: vi.fn(), synthesizeSpeech: vi.fn(),
71
+ transcribeAudio: vi.fn(),
72
+ synthesizeSpeech: vi.fn(),
57
73
  }));
58
74
 
59
75
  vi.mock('../../chat/notifications.js', () => ({
60
76
  NotificationEngine: vi.fn().mockImplementation(() => ({
61
- start: vi.fn(), stop: vi.fn(), poll: vi.fn(), stats: vi.fn().mockReturnValue({}),
77
+ start: vi.fn(),
78
+ stop: vi.fn(),
79
+ poll: vi.fn(),
80
+ stats: vi.fn().mockReturnValue({}),
62
81
  })),
63
82
  }));
64
83
 
65
84
  vi.mock('../../chat/queue.js', () => ({
66
85
  MessageQueue: vi.fn().mockImplementation(() => ({
67
- inboxCount: vi.fn().mockReturnValue(0), outboxCount: vi.fn().mockReturnValue(0),
68
- readInbox: vi.fn().mockReturnValue([]), formatInbox: vi.fn().mockReturnValue(''),
69
- sendResponse: vi.fn(), drainOutbox: vi.fn().mockReturnValue([]),
86
+ inboxCount: vi.fn().mockReturnValue(0),
87
+ outboxCount: vi.fn().mockReturnValue(0),
88
+ readInbox: vi.fn().mockReturnValue([]),
89
+ formatInbox: vi.fn().mockReturnValue(''),
90
+ sendResponse: vi.fn(),
91
+ drainOutbox: vi.fn().mockReturnValue([]),
70
92
  })),
71
93
  }));
72
94
 
73
95
  vi.mock('../../chat/browser-session.js', () => ({
74
96
  BrowserSessionManager: vi.fn().mockImplementation(() => ({
75
- acquire: vi.fn(), release: vi.fn(), size: 0,
76
- listSessions: vi.fn().mockReturnValue([]), getInfo: vi.fn(),
97
+ acquire: vi.fn(),
98
+ release: vi.fn(),
99
+ size: 0,
100
+ listSessions: vi.fn().mockReturnValue([]),
101
+ getInfo: vi.fn(),
77
102
  })),
78
103
  }));
79
104
 
80
105
  vi.mock('../../chat/mcp-bridge.js', () => ({
81
106
  McpToolBridge: vi.fn().mockImplementation(() => ({
82
- size: 0, register: vi.fn(), listTools: vi.fn().mockReturnValue([]),
107
+ size: 0,
108
+ register: vi.fn(),
109
+ listTools: vi.fn().mockReturnValue([]),
83
110
  execute: vi.fn(),
84
111
  })),
85
112
  }));
@@ -140,23 +167,49 @@ describe('createChatFacadeOps', () => {
140
167
  const names = new Set(ops.map((o) => o.name));
141
168
  const expectedOps = [
142
169
  // Session ops (6)
143
- 'chat_session_init', 'chat_session_get', 'chat_session_append',
144
- 'chat_session_clear', 'chat_session_delete', 'chat_session_list',
170
+ 'chat_session_init',
171
+ 'chat_session_get',
172
+ 'chat_session_append',
173
+ 'chat_session_clear',
174
+ 'chat_session_delete',
175
+ 'chat_session_list',
145
176
  // Transport ops (17)
146
177
  'chat_chunk_response',
147
- 'chat_auth_init', 'chat_auth_check', 'chat_auth_authenticate',
148
- 'chat_auth_revoke', 'chat_auth_status',
149
- 'chat_bridge_init', 'chat_bridge_register', 'chat_bridge_list', 'chat_bridge_execute',
178
+ 'chat_auth_init',
179
+ 'chat_auth_check',
180
+ 'chat_auth_authenticate',
181
+ 'chat_auth_revoke',
182
+ 'chat_auth_status',
183
+ 'chat_bridge_init',
184
+ 'chat_bridge_register',
185
+ 'chat_bridge_list',
186
+ 'chat_bridge_execute',
150
187
  'chat_compress_output',
151
- 'chat_voice_transcribe', 'chat_voice_synthesize',
152
- 'chat_queue_init', 'chat_queue_inbox', 'chat_queue_reply', 'chat_queue_drain',
188
+ 'chat_voice_transcribe',
189
+ 'chat_voice_synthesize',
190
+ 'chat_queue_init',
191
+ 'chat_queue_inbox',
192
+ 'chat_queue_reply',
193
+ 'chat_queue_drain',
153
194
  // Service ops (18)
154
- 'chat_cancel_create', 'chat_cancel_stop', 'chat_cancel_status',
155
- 'chat_update_init', 'chat_update_request', 'chat_update_confirm',
156
- 'chat_file_detect_intent', 'chat_file_build_content', 'chat_file_cleanup',
157
- 'chat_notify_init', 'chat_notify_start', 'chat_notify_stop',
158
- 'chat_notify_poll', 'chat_notify_status',
159
- 'chat_browser_init', 'chat_browser_acquire', 'chat_browser_release', 'chat_browser_status',
195
+ 'chat_cancel_create',
196
+ 'chat_cancel_stop',
197
+ 'chat_cancel_status',
198
+ 'chat_update_init',
199
+ 'chat_update_request',
200
+ 'chat_update_confirm',
201
+ 'chat_file_detect_intent',
202
+ 'chat_file_build_content',
203
+ 'chat_file_cleanup',
204
+ 'chat_notify_init',
205
+ 'chat_notify_start',
206
+ 'chat_notify_stop',
207
+ 'chat_notify_poll',
208
+ 'chat_notify_status',
209
+ 'chat_browser_init',
210
+ 'chat_browser_acquire',
211
+ 'chat_browser_release',
212
+ 'chat_browser_status',
160
213
  ];
161
214
  for (const name of expectedOps) {
162
215
  expect(names.has(name)).toBe(true);