@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.
- package/data/flows/build.flow.yaml +8 -9
- package/data/flows/deliver.flow.yaml +9 -10
- package/data/flows/design.flow.yaml +3 -4
- package/data/flows/enhance.flow.yaml +5 -6
- package/data/flows/explore.flow.yaml +3 -4
- package/data/flows/fix.flow.yaml +5 -6
- package/data/flows/plan.flow.yaml +4 -5
- package/data/flows/review.flow.yaml +3 -4
- package/dist/curator/curator.d.ts.map +1 -1
- package/dist/curator/curator.js +98 -22
- package/dist/curator/curator.js.map +1 -1
- package/dist/engine/bin/soleri-engine.js.map +1 -1
- package/dist/engine/module-manifest.d.ts.map +1 -1
- package/dist/engine/module-manifest.js +21 -1
- package/dist/engine/module-manifest.js.map +1 -1
- package/dist/engine/register-engine.d.ts.map +1 -1
- package/dist/engine/register-engine.js +25 -1
- package/dist/engine/register-engine.js.map +1 -1
- package/dist/flows/gate-evaluator.js.map +1 -1
- package/dist/operator/operator-profile.d.ts.map +1 -1
- package/dist/operator/operator-profile.js +11 -5
- package/dist/operator/operator-profile.js.map +1 -1
- package/dist/operator/operator-signals.d.ts.map +1 -1
- package/dist/operator/operator-signals.js.map +1 -1
- package/dist/planning/evidence-collector.js.map +1 -1
- package/dist/planning/gap-passes.d.ts.map +1 -1
- package/dist/planning/gap-passes.js +23 -6
- package/dist/planning/gap-passes.js.map +1 -1
- package/dist/planning/gap-patterns.d.ts.map +1 -1
- package/dist/planning/gap-patterns.js +57 -11
- package/dist/planning/gap-patterns.js.map +1 -1
- package/dist/planning/github-projection.d.ts.map +1 -1
- package/dist/planning/github-projection.js +39 -20
- package/dist/planning/github-projection.js.map +1 -1
- package/dist/planning/impact-analyzer.d.ts.map +1 -1
- package/dist/planning/impact-analyzer.js +20 -18
- package/dist/planning/impact-analyzer.js.map +1 -1
- package/dist/planning/plan-lifecycle.d.ts.map +1 -1
- package/dist/planning/plan-lifecycle.js +22 -9
- package/dist/planning/plan-lifecycle.js.map +1 -1
- package/dist/planning/planner.d.ts.map +1 -1
- package/dist/planning/planner.js +60 -17
- package/dist/planning/planner.js.map +1 -1
- package/dist/planning/rationalization-detector.d.ts.map +1 -1
- package/dist/planning/rationalization-detector.js.map +1 -1
- package/dist/planning/reconciliation-engine.d.ts.map +1 -1
- package/dist/planning/reconciliation-engine.js.map +1 -1
- package/dist/planning/task-verifier.d.ts.map +1 -1
- package/dist/planning/task-verifier.js +14 -6
- package/dist/planning/task-verifier.js.map +1 -1
- package/dist/runtime/admin-setup-ops.d.ts.map +1 -1
- package/dist/runtime/admin-setup-ops.js +2 -1
- package/dist/runtime/admin-setup-ops.js.map +1 -1
- package/dist/runtime/branching-ops.d.ts +12 -0
- package/dist/runtime/branching-ops.d.ts.map +1 -0
- package/dist/runtime/branching-ops.js +100 -0
- package/dist/runtime/branching-ops.js.map +1 -0
- package/dist/runtime/context-health.d.ts.map +1 -1
- package/dist/runtime/context-health.js.map +1 -1
- package/dist/runtime/facades/branching-facade.d.ts +7 -0
- package/dist/runtime/facades/branching-facade.d.ts.map +1 -0
- package/dist/runtime/facades/branching-facade.js +8 -0
- package/dist/runtime/facades/branching-facade.js.map +1 -0
- package/dist/runtime/facades/chat-service-ops.d.ts.map +1 -1
- package/dist/runtime/facades/chat-service-ops.js +3 -1
- package/dist/runtime/facades/chat-service-ops.js.map +1 -1
- package/dist/runtime/facades/chat-transport-ops.d.ts.map +1 -1
- package/dist/runtime/facades/chat-transport-ops.js.map +1 -1
- package/dist/runtime/facades/index.d.ts.map +1 -1
- package/dist/runtime/facades/index.js +42 -0
- package/dist/runtime/facades/index.js.map +1 -1
- package/dist/runtime/facades/intake-facade.d.ts +9 -0
- package/dist/runtime/facades/intake-facade.d.ts.map +1 -0
- package/dist/runtime/facades/intake-facade.js +11 -0
- package/dist/runtime/facades/intake-facade.js.map +1 -0
- package/dist/runtime/facades/links-facade.d.ts +9 -0
- package/dist/runtime/facades/links-facade.d.ts.map +1 -0
- package/dist/runtime/facades/links-facade.js +10 -0
- package/dist/runtime/facades/links-facade.js.map +1 -0
- package/dist/runtime/facades/operator-facade.d.ts.map +1 -1
- package/dist/runtime/facades/operator-facade.js.map +1 -1
- package/dist/runtime/facades/plan-facade.d.ts.map +1 -1
- package/dist/runtime/facades/plan-facade.js +4 -1
- package/dist/runtime/facades/plan-facade.js.map +1 -1
- package/dist/runtime/facades/tier-facade.d.ts +7 -0
- package/dist/runtime/facades/tier-facade.d.ts.map +1 -0
- package/dist/runtime/facades/tier-facade.js +8 -0
- package/dist/runtime/facades/tier-facade.js.map +1 -0
- package/dist/runtime/facades/vault-facade.d.ts +9 -1
- package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
- package/dist/runtime/facades/vault-facade.js +44 -187
- package/dist/runtime/facades/vault-facade.js.map +1 -1
- package/dist/runtime/github-integration.d.ts.map +1 -1
- package/dist/runtime/github-integration.js +11 -4
- package/dist/runtime/github-integration.js.map +1 -1
- package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
- package/dist/runtime/orchestrate-ops.js +32 -10
- package/dist/runtime/orchestrate-ops.js.map +1 -1
- package/dist/runtime/planning-extra-ops.d.ts.map +1 -1
- package/dist/runtime/planning-extra-ops.js.map +1 -1
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +3 -1
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/session-briefing.d.ts.map +1 -1
- package/dist/runtime/session-briefing.js +5 -1
- package/dist/runtime/session-briefing.js.map +1 -1
- package/dist/runtime/tier-ops.d.ts +13 -0
- package/dist/runtime/tier-ops.d.ts.map +1 -0
- package/dist/runtime/tier-ops.js +110 -0
- package/dist/runtime/tier-ops.js.map +1 -0
- package/dist/skills/sync-skills.d.ts.map +1 -1
- package/dist/skills/sync-skills.js +1 -1
- package/dist/skills/sync-skills.js.map +1 -1
- package/dist/vault/linking.d.ts.map +1 -1
- package/dist/vault/linking.js +41 -5
- package/dist/vault/linking.js.map +1 -1
- package/dist/vault/vault-entries.d.ts.map +1 -1
- package/dist/vault/vault-entries.js +68 -26
- package/dist/vault/vault-entries.js.map +1 -1
- package/dist/vault/vault-maintenance.d.ts.map +1 -1
- package/dist/vault/vault-maintenance.js +6 -2
- package/dist/vault/vault-maintenance.js.map +1 -1
- package/dist/vault/vault-markdown-sync.d.ts.map +1 -1
- package/dist/vault/vault-markdown-sync.js.map +1 -1
- package/dist/vault/vault-memories.d.ts.map +1 -1
- package/dist/vault/vault-memories.js +3 -1
- package/dist/vault/vault-memories.js.map +1 -1
- package/dist/vault/vault-schema.js +36 -10
- package/dist/vault/vault-schema.js.map +1 -1
- package/dist/vault/vault.d.ts.map +1 -1
- package/dist/vault/vault.js +5 -1
- package/dist/vault/vault.js.map +1 -1
- package/package.json +7 -7
- package/src/agency/agency-manager.test.ts +60 -40
- package/src/agency/default-rules.test.ts +17 -9
- package/src/capabilities/registry.test.ts +2 -12
- package/src/chat/agent-loop.test.ts +33 -43
- package/src/chat/mcp-bridge.test.ts +7 -2
- package/src/claudemd/inject.test.ts +2 -12
- package/src/context/context-engine.test.ts +96 -51
- package/src/control/intent-router.test.ts +3 -3
- package/src/curator/classifier.test.ts +14 -8
- package/src/curator/contradiction-detector.test.ts +30 -5
- package/src/curator/curator.ts +278 -56
- package/src/curator/duplicate-detector.test.ts +77 -15
- package/src/curator/quality-gate.test.ts +71 -31
- package/src/curator/tag-manager.test.ts +12 -4
- package/src/domain-packs/knowledge-installer.test.ts +2 -10
- package/src/domain-packs/token-resolver.test.ts +1 -3
- package/src/domain-packs/types.test.ts +16 -2
- package/src/enforcement/registry.test.ts +2 -8
- package/src/engine/bin/soleri-engine.ts +3 -1
- package/src/engine/module-manifest.test.ts +5 -4
- package/src/engine/module-manifest.ts +21 -1
- package/src/engine/register-engine.test.ts +6 -1
- package/src/engine/register-engine.ts +26 -3
- package/src/errors/classify.test.ts +6 -2
- package/src/errors/retry.test.ts +1 -4
- package/src/facades/facade-factory.test.ts +110 -64
- package/src/flows/epilogue.test.ts +16 -10
- package/src/flows/gate-evaluator.test.ts +12 -6
- package/src/flows/gate-evaluator.ts +1 -3
- package/src/governance/governance.test.ts +137 -21
- package/src/health/health-registry.test.ts +8 -1
- package/src/intake/content-classifier.test.ts +121 -51
- package/src/intake/dedup-gate.test.ts +38 -22
- package/src/intake/intake-pipeline.test.ts +5 -3
- package/src/intake/text-ingester.test.ts +26 -20
- package/src/llm/key-pool.test.ts +1 -3
- package/src/llm/llm-client.test.ts +1 -4
- package/src/llm/oauth-discovery.test.ts +16 -16
- package/src/llm/utils.test.ts +62 -18
- package/src/logging/logger.test.ts +4 -1
- package/src/loop/loop-manager.test.ts +2 -6
- package/src/migrations/migration-runner.edge-cases.test.ts +2 -7
- package/src/operator/operator-profile-extended.test.ts +15 -5
- package/src/operator/operator-profile.test.ts +26 -8
- package/src/operator/operator-profile.ts +38 -22
- package/src/operator/operator-signals-extended.test.ts +35 -23
- package/src/operator/operator-signals.test.ts +6 -10
- package/src/operator/operator-signals.ts +2 -1
- package/src/operator/prompts/hook-precompact-operator-dispatch.md +10 -6
- package/src/operator/prompts/subagent-soft-signal-extractor.md +5 -0
- package/src/operator/prompts/subagent-synthesis-cognition.md +19 -10
- package/src/operator/prompts/subagent-synthesis-communication.md +13 -7
- package/src/operator/prompts/subagent-synthesis-technical.md +19 -9
- package/src/operator/prompts/subagent-synthesis-trust.md +27 -21
- package/src/persona/defaults.test.ts +1 -5
- package/src/planning/evidence-collector.test.ts +147 -38
- package/src/planning/evidence-collector.ts +1 -4
- package/src/planning/gap-analysis-alternatives.test.ts +41 -11
- package/src/planning/gap-passes.test.ts +215 -33
- package/src/planning/gap-passes.ts +115 -46
- package/src/planning/gap-patterns.test.ts +87 -13
- package/src/planning/gap-patterns.ts +114 -31
- package/src/planning/github-projection.test.ts +6 -1
- package/src/planning/github-projection.ts +41 -20
- package/src/planning/impact-analyzer.test.ts +10 -23
- package/src/planning/impact-analyzer.ts +33 -46
- package/src/planning/plan-lifecycle.test.ts +103 -36
- package/src/planning/plan-lifecycle.ts +49 -18
- package/src/planning/planner.test.ts +12 -2
- package/src/planning/planner.ts +198 -58
- package/src/planning/rationalization-detector.test.ts +5 -20
- package/src/planning/rationalization-detector.ts +14 -16
- package/src/planning/reconciliation-engine.test.ts +20 -3
- package/src/planning/reconciliation-engine.ts +1 -2
- package/src/planning/task-verifier.test.ts +59 -27
- package/src/planning/task-verifier.ts +15 -9
- package/src/playbooks/playbook-executor.test.ts +1 -3
- package/src/plugins/plugin-loader.test.ts +19 -14
- package/src/plugins/plugin-registry.test.ts +45 -33
- package/src/project/project-registry.test.ts +23 -12
- package/src/prompts/template-manager.test.ts +4 -1
- package/src/queue/job-queue.test.ts +10 -14
- package/src/runtime/admin-extra-ops.test.ts +5 -19
- package/src/runtime/admin-ops.test.ts +1 -3
- package/src/runtime/admin-setup-ops.test.ts +3 -4
- package/src/runtime/admin-setup-ops.ts +9 -2
- package/src/runtime/archive-ops.test.ts +4 -1
- package/src/runtime/branching-ops.test.ts +144 -0
- package/src/runtime/branching-ops.ts +107 -0
- package/src/runtime/capture-ops.test.ts +7 -21
- package/src/runtime/chain-ops.test.ts +16 -6
- package/src/runtime/claude-md-helpers.test.ts +1 -3
- package/src/runtime/context-health.test.ts +1 -3
- package/src/runtime/context-health.ts +1 -3
- package/src/runtime/curator-extra-ops.test.ts +3 -1
- package/src/runtime/domain-ops.test.ts +46 -36
- package/src/runtime/facades/admin-facade.test.ts +1 -4
- package/src/runtime/facades/archive-facade.test.ts +21 -7
- package/src/runtime/facades/brain-facade.test.ts +176 -72
- package/src/runtime/facades/branching-facade.test.ts +43 -0
- package/src/runtime/facades/branching-facade.ts +11 -0
- package/src/runtime/facades/chat-facade.test.ts +81 -28
- package/src/runtime/facades/chat-service-ops.test.ts +178 -73
- package/src/runtime/facades/chat-service-ops.ts +3 -1
- package/src/runtime/facades/chat-session-ops.test.ts +25 -10
- package/src/runtime/facades/chat-transport-ops.test.ts +101 -34
- package/src/runtime/facades/chat-transport-ops.ts +0 -1
- package/src/runtime/facades/context-facade.test.ts +19 -4
- package/src/runtime/facades/control-facade.test.ts +3 -3
- package/src/runtime/facades/index.ts +42 -0
- package/src/runtime/facades/intake-facade.test.ts +215 -0
- package/src/runtime/facades/intake-facade.ts +14 -0
- package/src/runtime/facades/links-facade.test.ts +203 -0
- package/src/runtime/facades/links-facade.ts +13 -0
- package/src/runtime/facades/loop-facade.test.ts +22 -5
- package/src/runtime/facades/memory-facade.test.ts +19 -5
- package/src/runtime/facades/operator-facade.test.ts +17 -4
- package/src/runtime/facades/operator-facade.ts +11 -3
- package/src/runtime/facades/orchestrate-facade.test.ts +7 -1
- package/src/runtime/facades/plan-facade.test.ts +29 -12
- package/src/runtime/facades/plan-facade.ts +7 -2
- package/src/runtime/facades/tier-facade.test.ts +47 -0
- package/src/runtime/facades/tier-facade.ts +11 -0
- package/src/runtime/facades/vault-facade.test.ts +174 -242
- package/src/runtime/facades/vault-facade.ts +55 -199
- package/src/runtime/github-integration.ts +11 -8
- package/src/runtime/grading-ops.test.ts +39 -8
- package/src/runtime/intake-ops.test.ts +69 -16
- package/src/runtime/loop-ops.test.ts +16 -6
- package/src/runtime/memory-cross-project-ops.test.ts +25 -14
- package/src/runtime/orchestrate-ops.ts +54 -27
- package/src/runtime/pack-ops.test.ts +23 -6
- package/src/runtime/planning-extra-ops.test.ts +17 -7
- package/src/runtime/planning-extra-ops.ts +3 -1
- package/src/runtime/playbook-ops.test.ts +26 -3
- package/src/runtime/plugin-ops.test.ts +83 -25
- package/src/runtime/project-ops.test.ts +26 -6
- package/src/runtime/runtime.ts +3 -1
- package/src/runtime/session-briefing.test.ts +183 -54
- package/src/runtime/session-briefing.ts +8 -2
- package/src/runtime/sync-ops.test.ts +3 -12
- package/src/runtime/telemetry-ops.test.ts +31 -6
- package/src/runtime/tier-ops.test.ts +159 -0
- package/src/runtime/tier-ops.ts +119 -0
- package/src/runtime/vault-extra-ops.test.ts +32 -8
- package/src/runtime/vault-sharing-ops.test.ts +1 -4
- package/src/skills/sync-skills.ts +2 -12
- package/src/transport/ws-server.test.ts +7 -4
- package/src/vault/__tests__/vault-characterization.test.ts +492 -81
- package/src/vault/linking.test.ts +50 -17
- package/src/vault/linking.ts +48 -7
- package/src/vault/obsidian-sync.test.ts +6 -3
- package/src/vault/scope-detector.test.ts +1 -3
- package/src/vault/vault-branching.test.ts +9 -7
- package/src/vault/vault-entries.ts +209 -65
- package/src/vault/vault-maintenance.ts +7 -12
- package/src/vault/vault-manager.test.ts +10 -10
- package/src/vault/vault-markdown-sync.ts +4 -1
- package/src/vault/vault-memories.ts +7 -7
- package/src/vault/vault-schema.ts +72 -15
- package/src/vault/vault.ts +55 -9
- package/src/brain/strength-scorer.ts +0 -404
- package/src/engine/index.ts +0 -21
- package/src/persona/index.ts +0 -9
- 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
|
|
23
|
-
|
|
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',
|
|
129
|
-
'
|
|
130
|
-
'
|
|
131
|
-
'
|
|
132
|
-
'
|
|
133
|
-
'
|
|
134
|
-
'
|
|
135
|
-
'
|
|
136
|
-
'
|
|
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',
|
|
149
|
-
'
|
|
150
|
-
'
|
|
151
|
-
'
|
|
152
|
-
'
|
|
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',
|
|
162
|
-
'
|
|
163
|
-
'
|
|
164
|
-
'
|
|
165
|
-
'
|
|
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 {
|
|
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',
|
|
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',
|
|
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',
|
|
212
|
-
|
|
213
|
-
|
|
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',
|
|
219
|
-
|
|
220
|
-
|
|
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',
|
|
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',
|
|
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 {
|
|
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,
|
|
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',
|
|
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',
|
|
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',
|
|
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',
|
|
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'],
|
|
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',
|
|
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',
|
|
499
|
-
|
|
500
|
-
|
|
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',
|
|
505
|
-
|
|
506
|
-
|
|
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',
|
|
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',
|
|
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',
|
|
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,
|
|
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',
|
|
612
|
-
|
|
613
|
-
|
|
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',
|
|
618
|
-
|
|
619
|
-
|
|
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',
|
|
688
|
-
|
|
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',
|
|
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',
|
|
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',
|
|
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',
|
|
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,
|
|
29
|
-
|
|
30
|
-
|
|
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(),
|
|
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(),
|
|
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(),
|
|
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(),
|
|
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(),
|
|
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),
|
|
68
|
-
|
|
69
|
-
|
|
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(),
|
|
76
|
-
|
|
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,
|
|
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',
|
|
144
|
-
'
|
|
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',
|
|
148
|
-
'
|
|
149
|
-
'
|
|
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',
|
|
152
|
-
'
|
|
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',
|
|
155
|
-
'
|
|
156
|
-
'
|
|
157
|
-
'
|
|
158
|
-
'
|
|
159
|
-
'
|
|
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);
|