dual-brain 0.2.29 → 0.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/.dual-brain/docs/claude-code-extension-points.md +32 -0
- package/.dual-brain/docs/data-tools-capabilities.md +181 -0
- package/.dual-brain/docs/ecosystem-tools.md +91 -0
- package/.dual-brain/docs/panel-handoff.md +124 -0
- package/.dual-brain/docs/ruflo-analysis.md +48 -0
- package/bin/dual-brain.mjs +122 -51
- package/dist/mcp-server/index.d.ts +27 -0
- package/dist/mcp-server/index.js +359 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/src/agent-protocol.d.ts +163 -0
- package/dist/src/agent-protocol.js +368 -0
- package/dist/src/agent-protocol.js.map +1 -0
- package/dist/src/agents/registry.d.ts +52 -0
- package/dist/src/agents/registry.js +393 -0
- package/dist/src/agents/registry.js.map +1 -0
- package/dist/src/awareness.d.ts +93 -0
- package/dist/src/awareness.js +406 -0
- package/dist/src/awareness.js.map +1 -0
- package/dist/src/brief.d.ts +48 -0
- package/dist/src/brief.js +179 -0
- package/dist/src/brief.js.map +1 -0
- package/dist/src/calibration.d.ts +32 -0
- package/dist/src/calibration.js +133 -0
- package/dist/src/calibration.js.map +1 -0
- package/dist/src/checkpoint.d.ts +33 -0
- package/dist/src/checkpoint.js +99 -0
- package/dist/src/checkpoint.js.map +1 -0
- package/dist/src/ci-triage.d.ts +33 -0
- package/dist/src/ci-triage.js +193 -0
- package/dist/src/ci-triage.js.map +1 -0
- package/dist/src/cognitive-loop.d.ts +56 -0
- package/dist/src/cognitive-loop.js +495 -0
- package/dist/src/cognitive-loop.js.map +1 -0
- package/dist/src/collaboration.d.ts +147 -0
- package/dist/src/collaboration.js +438 -0
- package/dist/src/collaboration.js.map +1 -0
- package/dist/src/context-intel.d.ts +47 -0
- package/dist/src/context-intel.js +156 -0
- package/dist/src/context-intel.js.map +1 -0
- package/dist/src/context.d.ts +53 -0
- package/dist/src/context.js +332 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/continuity.d.ts +89 -0
- package/dist/src/continuity.js +230 -0
- package/dist/src/continuity.js.map +1 -0
- package/dist/src/cost-tracker.d.ts +47 -0
- package/dist/src/cost-tracker.js +170 -0
- package/dist/src/cost-tracker.js.map +1 -0
- package/dist/src/debrief.d.ts +53 -0
- package/dist/src/debrief.js +222 -0
- package/dist/src/debrief.js.map +1 -0
- package/dist/src/decide.d.ts +96 -0
- package/dist/src/decide.js +744 -0
- package/dist/src/decide.js.map +1 -0
- package/dist/src/decompose.d.ts +39 -0
- package/dist/src/decompose.js +218 -0
- package/dist/src/decompose.js.map +1 -0
- package/dist/src/detect.d.ts +91 -0
- package/dist/src/detect.js +544 -0
- package/dist/src/detect.js.map +1 -0
- package/dist/src/dispatch.d.ts +154 -0
- package/dist/src/dispatch.js +1306 -0
- package/dist/src/dispatch.js.map +1 -0
- package/dist/src/doctor.d.ts +421 -0
- package/dist/src/doctor.js +1689 -0
- package/dist/src/doctor.js.map +1 -0
- package/dist/src/engine.d.ts +70 -0
- package/dist/src/engine.js +155 -0
- package/dist/src/engine.js.map +1 -0
- package/dist/src/envelope.d.ts +36 -0
- package/dist/src/envelope.js +80 -0
- package/dist/src/envelope.js.map +1 -0
- package/dist/src/failure-memory.d.ts +55 -0
- package/dist/src/failure-memory.js +175 -0
- package/dist/src/failure-memory.js.map +1 -0
- package/dist/src/fx.d.ts +87 -0
- package/dist/src/fx.js +272 -0
- package/dist/src/fx.js.map +1 -0
- package/dist/src/governance.d.ts +93 -0
- package/dist/src/governance.js +261 -0
- package/dist/src/governance.js.map +1 -0
- package/dist/src/handoff.d.ts +11 -0
- package/dist/src/handoff.js +90 -0
- package/dist/src/handoff.js.map +1 -0
- package/dist/src/head-protocol.d.ts +76 -0
- package/dist/src/head-protocol.js +109 -0
- package/dist/src/head-protocol.js.map +1 -0
- package/dist/src/head.d.ts +222 -0
- package/dist/src/head.js +765 -0
- package/dist/src/head.js.map +1 -0
- package/dist/src/health.d.ts +132 -0
- package/dist/src/health.js +435 -0
- package/dist/src/health.js.map +1 -0
- package/dist/src/inbox.d.ts +70 -0
- package/dist/src/inbox.js +218 -0
- package/dist/src/inbox.js.map +1 -0
- package/dist/src/index.d.ts +33 -0
- package/dist/src/index.js +38 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/install-hooks.d.ts +13 -0
- package/dist/src/install-hooks.js +88 -0
- package/dist/src/install-hooks.js.map +1 -0
- package/dist/src/integrity.d.ts +59 -0
- package/dist/src/integrity.js +206 -0
- package/dist/src/integrity.js.map +1 -0
- package/dist/src/intelligence.d.ts +104 -0
- package/dist/src/intelligence.js +391 -0
- package/dist/src/intelligence.js.map +1 -0
- package/dist/src/ledger.d.ts +54 -0
- package/dist/src/ledger.js +179 -0
- package/dist/src/ledger.js.map +1 -0
- package/dist/src/living-docs.d.ts +14 -0
- package/dist/src/living-docs.js +197 -0
- package/dist/src/living-docs.js.map +1 -0
- package/dist/src/memory-tiers.d.ts +37 -0
- package/dist/src/memory-tiers.js +160 -0
- package/dist/src/memory-tiers.js.map +1 -0
- package/dist/src/model-profiles.d.ts +65 -0
- package/dist/src/model-profiles.js +568 -0
- package/dist/src/model-profiles.js.map +1 -0
- package/dist/src/models.d.ts +58 -0
- package/dist/src/models.js +327 -0
- package/dist/src/models.js.map +1 -0
- package/dist/src/narrative.d.ts +54 -0
- package/dist/src/narrative.js +163 -0
- package/dist/src/narrative.js.map +1 -0
- package/dist/src/nextstep.d.ts +16 -0
- package/dist/src/nextstep.js +103 -0
- package/dist/src/nextstep.js.map +1 -0
- package/dist/src/observer.d.ts +18 -0
- package/dist/src/observer.js +251 -0
- package/dist/src/observer.js.map +1 -0
- package/dist/src/outcome.d.ts +110 -0
- package/dist/src/outcome.js +377 -0
- package/dist/src/outcome.js.map +1 -0
- package/dist/src/pipeline.d.ts +167 -0
- package/dist/src/pipeline.js +1503 -0
- package/dist/src/pipeline.js.map +1 -0
- package/dist/src/playbook.d.ts +59 -0
- package/dist/src/playbook.js +238 -0
- package/dist/src/playbook.js.map +1 -0
- package/dist/src/pr-agent.d.ts +97 -0
- package/dist/src/pr-agent.js +195 -0
- package/dist/src/pr-agent.js.map +1 -0
- package/dist/src/predictive.d.ts +57 -0
- package/dist/src/predictive.js +230 -0
- package/dist/src/predictive.js.map +1 -0
- package/dist/src/profile.d.ts +294 -0
- package/dist/src/profile.js +1347 -0
- package/dist/src/profile.js.map +1 -0
- package/dist/src/prompt-audit.d.ts +22 -0
- package/dist/src/prompt-audit.js +194 -0
- package/dist/src/prompt-audit.js.map +1 -0
- package/dist/src/prompt-intel.d.ts +12 -0
- package/dist/src/prompt-intel.js +321 -0
- package/dist/src/prompt-intel.js.map +1 -0
- package/dist/src/provider-context.d.ts +121 -0
- package/dist/src/provider-context.js +222 -0
- package/dist/src/provider-context.js.map +1 -0
- package/dist/src/provider-manager.d.ts +92 -0
- package/dist/src/provider-manager.js +428 -0
- package/dist/src/provider-manager.js.map +1 -0
- package/dist/src/receipt.d.ts +87 -0
- package/dist/src/receipt.js +326 -0
- package/dist/src/receipt.js.map +1 -0
- package/dist/src/recommendations.d.ts +13 -0
- package/dist/src/recommendations.js +291 -0
- package/dist/src/recommendations.js.map +1 -0
- package/dist/src/redact.d.ts +15 -0
- package/dist/src/redact.js +129 -0
- package/dist/src/redact.js.map +1 -0
- package/dist/src/replit.d.ts +397 -0
- package/dist/src/replit.js +1160 -0
- package/dist/src/replit.js.map +1 -0
- package/dist/src/repo.d.ts +149 -0
- package/dist/src/repo.js +416 -0
- package/dist/src/repo.js.map +1 -0
- package/dist/src/revert.d.ts +30 -0
- package/dist/src/revert.js +166 -0
- package/dist/src/revert.js.map +1 -0
- package/dist/src/room.d.ts +102 -0
- package/dist/src/room.js +212 -0
- package/dist/src/room.js.map +1 -0
- package/dist/src/routing-advisor.d.ts +57 -0
- package/dist/src/routing-advisor.js +221 -0
- package/dist/src/routing-advisor.js.map +1 -0
- package/dist/src/self-correct.d.ts +40 -0
- package/dist/src/self-correct.js +137 -0
- package/dist/src/self-correct.js.map +1 -0
- package/dist/src/session-lock.d.ts +35 -0
- package/dist/src/session-lock.js +134 -0
- package/dist/src/session-lock.js.map +1 -0
- package/dist/src/session.d.ts +267 -0
- package/dist/src/session.js +1660 -0
- package/dist/src/session.js.map +1 -0
- package/dist/src/settings-tui.d.ts +5 -0
- package/dist/src/settings-tui.js +422 -0
- package/dist/src/settings-tui.js.map +1 -0
- package/dist/src/setup-flow.d.ts +63 -0
- package/dist/src/setup-flow.js +233 -0
- package/dist/src/setup-flow.js.map +1 -0
- package/dist/src/signal.d.ts +19 -0
- package/dist/src/signal.js +122 -0
- package/dist/src/signal.js.map +1 -0
- package/dist/src/simmer.d.ts +85 -0
- package/dist/src/simmer.js +224 -0
- package/dist/src/simmer.js.map +1 -0
- package/dist/src/state-export.d.ts +129 -0
- package/dist/src/state-export.js +233 -0
- package/dist/src/state-export.js.map +1 -0
- package/dist/src/strategy.d.ts +54 -0
- package/dist/src/strategy.js +95 -0
- package/dist/src/strategy.js.map +1 -0
- package/dist/src/subscription.d.ts +40 -0
- package/dist/src/subscription.js +189 -0
- package/dist/src/subscription.js.map +1 -0
- package/dist/src/templates.d.ts +208 -0
- package/dist/src/templates.js +238 -0
- package/dist/src/templates.js.map +1 -0
- package/dist/src/test.d.ts +9 -0
- package/dist/src/test.js +1173 -0
- package/dist/src/test.js.map +1 -0
- package/dist/src/think-engine.d.ts +67 -0
- package/dist/src/think-engine.js +412 -0
- package/dist/src/think-engine.js.map +1 -0
- package/dist/src/tui.d.ts +71 -0
- package/dist/src/tui.js +242 -0
- package/dist/src/tui.js.map +1 -0
- package/dist/src/types.d.ts +177 -0
- package/dist/src/types.js +6 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/update-check.d.ts +7 -0
- package/dist/src/update-check.js +36 -0
- package/dist/src/update-check.js.map +1 -0
- package/dist/src/wave-planner.d.ts +30 -0
- package/dist/src/wave-planner.js +281 -0
- package/dist/src/wave-planner.js.map +1 -0
- package/hooks/head-guard.sh +41 -0
- package/hooks/task-classifier.mjs +328 -0
- package/hooks/vibe-router.mjs +387 -0
- package/package.json +29 -153
- package/src/agents/registry.mjs +0 -405
- package/src/awareness.mjs +0 -425
- package/src/brief.mjs +0 -266
- package/src/calibration.mjs +0 -148
- package/src/checkpoint.mjs +0 -109
- package/src/ci-triage.mjs +0 -191
- package/src/cognitive-loop.mjs +0 -562
- package/src/collaboration.mjs +0 -545
- package/src/context-intel.mjs +0 -158
- package/src/context.mjs +0 -389
- package/src/continuity.mjs +0 -298
- package/src/cost-tracker.mjs +0 -184
- package/src/debrief.mjs +0 -228
- package/src/decide.mjs +0 -1099
- package/src/decompose.mjs +0 -331
- package/src/detect.mjs +0 -702
- package/src/dispatch.mjs +0 -1447
- package/src/doctor.mjs +0 -1607
- package/src/envelope.mjs +0 -139
- package/src/failure-memory.mjs +0 -178
- package/src/fx.mjs +0 -276
- package/src/governance.mjs +0 -279
- package/src/handoff.mjs +0 -85
- package/src/head-protocol.mjs +0 -128
- package/src/head.mjs +0 -952
- package/src/health.mjs +0 -528
- package/src/inbox.mjs +0 -195
- package/src/index.mjs +0 -44
- package/src/install-hooks.mjs +0 -100
- package/src/integrity.mjs +0 -245
- package/src/intelligence.mjs +0 -447
- package/src/ledger.mjs +0 -196
- package/src/living-docs.mjs +0 -210
- package/src/memory-tiers.mjs +0 -193
- package/src/models.mjs +0 -363
- package/src/narrative.mjs +0 -169
- package/src/nextstep.mjs +0 -100
- package/src/observer.mjs +0 -241
- package/src/outcome.mjs +0 -386
- package/src/pipeline.mjs +0 -1689
- package/src/playbook.mjs +0 -257
- package/src/pr-agent.mjs +0 -214
- package/src/predictive.mjs +0 -250
- package/src/profile.mjs +0 -1411
- package/src/prompt-audit.mjs +0 -231
- package/src/prompt-intel.mjs +0 -325
- package/src/provider-context.mjs +0 -257
- package/src/receipt.mjs +0 -344
- package/src/recommendations.mjs +0 -291
- package/src/redact.mjs +0 -192
- package/src/replit.mjs +0 -1210
- package/src/repo.mjs +0 -445
- package/src/revert.mjs +0 -149
- package/src/routing-advisor.mjs +0 -200
- package/src/self-correct.mjs +0 -146
- package/src/session-lock.mjs +0 -160
- package/src/session.mjs +0 -1655
- package/src/settings-tui.mjs +0 -373
- package/src/setup-flow.mjs +0 -215
- package/src/signal.mjs +0 -114
- package/src/simmer.mjs +0 -241
- package/src/strategy.mjs +0 -235
- package/src/subscription.mjs +0 -212
- package/src/templates.mjs +0 -260
- package/src/think-engine.mjs +0 -428
- package/src/tui.mjs +0 -276
- package/src/update-check.mjs +0 -35
- package/src/wave-planner.mjs +0 -294
package/bin/dual-brain.mjs
CHANGED
|
@@ -16,9 +16,9 @@ import {
|
|
|
16
16
|
saveSubscription, listSubscriptions,
|
|
17
17
|
autoSetup,
|
|
18
18
|
loadCredentials, saveCredentials, getCredentialSummary, detectCredentials, addCredential, removeCredential, checkCredentialHealth,
|
|
19
|
-
} from '../src/profile.
|
|
19
|
+
} from '../dist/src/profile.js';
|
|
20
20
|
|
|
21
|
-
import { detectTask, primeAgentRegistry } from '../src/detect.
|
|
21
|
+
import { detectTask, primeAgentRegistry } from '../dist/src/detect.js';
|
|
22
22
|
|
|
23
23
|
// ─── Claude launch helper ────────────────────────────────────────────────────
|
|
24
24
|
// Builds launch args respecting user's bypass preference from profile.
|
|
@@ -46,7 +46,7 @@ let _cachedSkillToTaskBrief = null;
|
|
|
46
46
|
|
|
47
47
|
async function _primeRegistryCache() {
|
|
48
48
|
try {
|
|
49
|
-
const reg = await import('../src/agents/registry.
|
|
49
|
+
const reg = await import('../dist/src/agents/registry.js');
|
|
50
50
|
_cachedMatchSkill = reg.matchSkill;
|
|
51
51
|
_cachedSkillToTaskBrief = reg.skillToTaskBrief;
|
|
52
52
|
} catch {}
|
|
@@ -54,28 +54,28 @@ async function _primeRegistryCache() {
|
|
|
54
54
|
|
|
55
55
|
import {
|
|
56
56
|
decideRoute, getAvailableModels,
|
|
57
|
-
} from '../src/decide.
|
|
57
|
+
} from '../dist/src/decide.js';
|
|
58
58
|
|
|
59
59
|
import {
|
|
60
60
|
getHealth, markHot, markHealthy, remainingCooldownMinutes, getSessionStats,
|
|
61
|
-
} from '../src/health.
|
|
61
|
+
} from '../dist/src/health.js';
|
|
62
62
|
|
|
63
|
-
import { dispatch, detectRuntime, dispatchDualBrain } from '../src/dispatch.
|
|
63
|
+
import { dispatch, detectRuntime, dispatchDualBrain } from '../dist/src/dispatch.js';
|
|
64
64
|
|
|
65
|
-
import { runPipeline, buildExecutionPlan, formatExecutionPlan } from '../src/pipeline.
|
|
65
|
+
import { runPipeline, buildExecutionPlan, formatExecutionPlan } from '../dist/src/pipeline.js';
|
|
66
66
|
|
|
67
|
-
import { loadRepoCache } from '../src/repo.
|
|
68
|
-
import { loadSession, saveSession, formatSessionCard, importReplitSessions, getSessionMeta, saveSessionMeta, renameSession, pinSession, unpinSession, categorizeSession, enrichSessions, archiveSession, getArchivedSessions } from '../src/session.
|
|
67
|
+
import { loadRepoCache } from '../dist/src/repo.js';
|
|
68
|
+
import { loadSession, saveSession, formatSessionCard, importReplitSessions, getSessionMeta, saveSessionMeta, renameSession, pinSession, unpinSession, categorizeSession, enrichSessions, archiveSession, getArchivedSessions } from '../dist/src/session.js';
|
|
69
69
|
|
|
70
|
-
import { box, bar, badge, menu, separator, panel, divider, statusChip, headerBar, prompt as tuiPrompt, signalLine } from '../src/tui.
|
|
71
|
-
import { checkBudget } from '../src/governance.
|
|
70
|
+
import { box, bar, badge, menu, separator, panel, divider, statusChip, headerBar, prompt as tuiPrompt, signalLine } from '../dist/src/tui.js';
|
|
71
|
+
import { checkBudget } from '../dist/src/governance.js';
|
|
72
72
|
|
|
73
73
|
// ─── Dynamic imports for receipts + failure memory ───────────────────────────
|
|
74
74
|
|
|
75
75
|
let _receipt = null;
|
|
76
76
|
async function getReceipt() {
|
|
77
77
|
if (!_receipt) {
|
|
78
|
-
try { _receipt = await import('../src/receipt.
|
|
78
|
+
try { _receipt = await import('../dist/src/receipt.js'); } catch { _receipt = {}; }
|
|
79
79
|
}
|
|
80
80
|
return _receipt;
|
|
81
81
|
}
|
|
@@ -83,7 +83,7 @@ async function getReceipt() {
|
|
|
83
83
|
let _failureMem = null;
|
|
84
84
|
async function getFailureMem() {
|
|
85
85
|
if (!_failureMem) {
|
|
86
|
-
try { _failureMem = await import('../src/failure-memory.
|
|
86
|
+
try { _failureMem = await import('../dist/src/failure-memory.js'); } catch { _failureMem = {}; }
|
|
87
87
|
}
|
|
88
88
|
return _failureMem;
|
|
89
89
|
}
|
|
@@ -91,7 +91,7 @@ async function getFailureMem() {
|
|
|
91
91
|
let _livingDocs = null;
|
|
92
92
|
async function getLivingDocs() {
|
|
93
93
|
if (!_livingDocs) {
|
|
94
|
-
try { _livingDocs = await import('../src/living-docs.
|
|
94
|
+
try { _livingDocs = await import('../dist/src/living-docs.js'); } catch { _livingDocs = {}; }
|
|
95
95
|
}
|
|
96
96
|
return _livingDocs;
|
|
97
97
|
}
|
|
@@ -100,7 +100,7 @@ let _cognitiveLoopCache = null;
|
|
|
100
100
|
async function _getCognitiveLoop() {
|
|
101
101
|
if (!_cognitiveLoopCache) {
|
|
102
102
|
try {
|
|
103
|
-
_cognitiveLoopCache = await import('../src/cognitive-loop.
|
|
103
|
+
_cognitiveLoopCache = await import('../dist/src/cognitive-loop.js');
|
|
104
104
|
} catch {
|
|
105
105
|
_cognitiveLoopCache = null;
|
|
106
106
|
}
|
|
@@ -112,7 +112,7 @@ let _fx = null;
|
|
|
112
112
|
async function getFx() {
|
|
113
113
|
if (_fx !== null) return _fx;
|
|
114
114
|
try {
|
|
115
|
-
_fx = await import('../src/fx.
|
|
115
|
+
_fx = await import('../dist/src/fx.js');
|
|
116
116
|
} catch {
|
|
117
117
|
// Fallback stubs when fx.mjs is not yet present
|
|
118
118
|
const _noop = () => {};
|
|
@@ -658,7 +658,7 @@ async function cmdGo(args, opts = {}) {
|
|
|
658
658
|
|
|
659
659
|
// ── Next steps suggestions (dual-brain consensus path) ──────────────────
|
|
660
660
|
try {
|
|
661
|
-
const { suggestNextSteps, formatNextSteps } = await import('../src/nextstep.
|
|
661
|
+
const { suggestNextSteps, formatNextSteps } = await import('../dist/src/nextstep.js');
|
|
662
662
|
const steps = await suggestNextSteps(
|
|
663
663
|
{ prompt, tier: plan?._decision?.tier ?? 'think', files, trigger: 'go' },
|
|
664
664
|
{ success: true, filesChanged: files, error: null, duration: null },
|
|
@@ -735,7 +735,7 @@ async function cmdGo(args, opts = {}) {
|
|
|
735
735
|
await offerAutoCommit(cwd);
|
|
736
736
|
// ── Next steps suggestions ──────────────────────────────────────────────
|
|
737
737
|
try {
|
|
738
|
-
const { suggestNextSteps, formatNextSteps } = await import('../src/nextstep.
|
|
738
|
+
const { suggestNextSteps, formatNextSteps } = await import('../dist/src/nextstep.js');
|
|
739
739
|
const steps = await suggestNextSteps(
|
|
740
740
|
{
|
|
741
741
|
prompt,
|
|
@@ -1061,7 +1061,7 @@ async function cmdStatus(args = []) {
|
|
|
1061
1061
|
|
|
1062
1062
|
// Replit section
|
|
1063
1063
|
try {
|
|
1064
|
-
const replit = await import('../src/replit.
|
|
1064
|
+
const replit = await import('../dist/src/replit.js');
|
|
1065
1065
|
const env = replit.detectReplitEnvironment(cwd);
|
|
1066
1066
|
if (env.isReplit) {
|
|
1067
1067
|
console.log('\nReplit:');
|
|
@@ -1097,7 +1097,7 @@ async function cmdStatus(args = []) {
|
|
|
1097
1097
|
|
|
1098
1098
|
// Show top recommendation if available
|
|
1099
1099
|
try {
|
|
1100
|
-
const { getTopRecommendation } = await import('../src/recommendations.
|
|
1100
|
+
const { getTopRecommendation } = await import('../dist/src/recommendations.js');
|
|
1101
1101
|
const rec = getTopRecommendation(process.cwd());
|
|
1102
1102
|
if (rec) {
|
|
1103
1103
|
console.log('');
|
|
@@ -1106,6 +1106,29 @@ async function cmdStatus(args = []) {
|
|
|
1106
1106
|
if (rec.action) console.log(` → ${rec.action}`);
|
|
1107
1107
|
}
|
|
1108
1108
|
} catch { /* non-blocking */ }
|
|
1109
|
+
|
|
1110
|
+
// Intelligence layer status
|
|
1111
|
+
try {
|
|
1112
|
+
const { getRoutingStats } = await import('../dist/src/routing-advisor.js');
|
|
1113
|
+
const { getThinkingStats } = await import('../dist/src/think-engine.js');
|
|
1114
|
+
const stats = getRoutingStats(cwd);
|
|
1115
|
+
const thinkStats = getThinkingStats(cwd);
|
|
1116
|
+
|
|
1117
|
+
if (stats.totalObservations > 0 || thinkStats.totalDecisions > 0) {
|
|
1118
|
+
console.log('');
|
|
1119
|
+
console.log(' \x1b[2m─── Intelligence ───\x1b[0m');
|
|
1120
|
+
if (stats.totalObservations > 0) {
|
|
1121
|
+
console.log(` Routing: ${stats.totalObservations} observations, learning ${stats.totalObservations >= 5 ? 'active' : 'warming up'}`);
|
|
1122
|
+
if (stats.topPerformers?.length > 0) {
|
|
1123
|
+
const top = stats.topPerformers[0];
|
|
1124
|
+
console.log(` Best: ${top.model} on ${top.cell} (${(top.ema * 100).toFixed(0)}% EMA, n=${top.observations})`);
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
if (thinkStats.totalDecisions > 0) {
|
|
1128
|
+
console.log(` Think: ${thinkStats.totalDecisions} decisions, ${(thinkStats.cacheHitRate * 100).toFixed(0)}% cache hit rate`);
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
} catch { /* non-blocking */ }
|
|
1109
1132
|
}
|
|
1110
1133
|
|
|
1111
1134
|
// ─── cmdHot / cmdCool ─────────────────────────────────────────────────────────
|
|
@@ -1144,7 +1167,7 @@ async function cmdInstall(cwd) {
|
|
|
1144
1167
|
if (result.status !== 0) { process.exit(result.status || 1); }
|
|
1145
1168
|
|
|
1146
1169
|
// Additionally merge enforcement hooks into .claude/settings.json
|
|
1147
|
-
const { installHooks } = await import('../src/install-hooks.
|
|
1170
|
+
const { installHooks } = await import('../dist/src/install-hooks.js');
|
|
1148
1171
|
const { installed, skipped } = installHooks(cwd);
|
|
1149
1172
|
|
|
1150
1173
|
if (installed.length > 0) {
|
|
@@ -1380,7 +1403,7 @@ async function cmdPR(args) {
|
|
|
1380
1403
|
// Lazy import — only loaded when 'pr' is invoked
|
|
1381
1404
|
let prAgent;
|
|
1382
1405
|
try {
|
|
1383
|
-
prAgent = await import('../src/pr-agent.
|
|
1406
|
+
prAgent = await import('../dist/src/pr-agent.js');
|
|
1384
1407
|
} catch (e) {
|
|
1385
1408
|
console.error('pr-agent module not available:', e.message);
|
|
1386
1409
|
process.exit(1);
|
|
@@ -1752,7 +1775,7 @@ async function welcomeScreen(rl, ask) {
|
|
|
1752
1775
|
saveProfile(existing, { cwd });
|
|
1753
1776
|
}
|
|
1754
1777
|
try {
|
|
1755
|
-
const { ensurePersistence } = await import('../src/session.
|
|
1778
|
+
const { ensurePersistence } = await import('../dist/src/session.js');
|
|
1756
1779
|
const persisted = ensurePersistence(cwd);
|
|
1757
1780
|
if (persisted.length > 0) {
|
|
1758
1781
|
persisted.forEach(msg => console.log(` ✅ ${msg}`));
|
|
@@ -2184,7 +2207,7 @@ let _headModuleCache = null;
|
|
|
2184
2207
|
async function _getHeadModule() {
|
|
2185
2208
|
if (!_headModuleCache) {
|
|
2186
2209
|
try {
|
|
2187
|
-
_headModuleCache = await import('../src/head.
|
|
2210
|
+
_headModuleCache = await import('../dist/src/head.js');
|
|
2188
2211
|
} catch {
|
|
2189
2212
|
_headModuleCache = null;
|
|
2190
2213
|
}
|
|
@@ -2375,7 +2398,7 @@ async function detectResumeState(cwd) {
|
|
|
2375
2398
|
|
|
2376
2399
|
// Check for recent receipt (< 24h)
|
|
2377
2400
|
try {
|
|
2378
|
-
const { getLatestReceipt } = await import('../src/receipt.
|
|
2401
|
+
const { getLatestReceipt } = await import('../dist/src/receipt.js');
|
|
2379
2402
|
const receipt = getLatestReceipt(cwd);
|
|
2380
2403
|
if (receipt) {
|
|
2381
2404
|
const ageMs = Date.now() - Date.parse(receipt.timestamp);
|
|
@@ -2400,7 +2423,7 @@ async function detectResumeState(cwd) {
|
|
|
2400
2423
|
|
|
2401
2424
|
// Check for open tasks in ledger
|
|
2402
2425
|
try {
|
|
2403
|
-
const { getOpenTasks } = await import('../src/ledger.
|
|
2426
|
+
const { getOpenTasks } = await import('../dist/src/ledger.js');
|
|
2404
2427
|
const open = getOpenTasks(cwd);
|
|
2405
2428
|
if (open.length > 0) {
|
|
2406
2429
|
result.type = 'resumable';
|
|
@@ -2475,13 +2498,13 @@ async function mainScreen(rl, ask) {
|
|
|
2475
2498
|
|
|
2476
2499
|
// Silent OAuth token auto-refresh (3s timeout — never block dashboard)
|
|
2477
2500
|
try {
|
|
2478
|
-
const { autoRefreshToken } = await import('../src/profile.
|
|
2501
|
+
const { autoRefreshToken } = await import('../dist/src/profile.js');
|
|
2479
2502
|
await Promise.race([autoRefreshToken(cwd), new Promise(r => setTimeout(r, 3000))]);
|
|
2480
2503
|
} catch {}
|
|
2481
2504
|
|
|
2482
2505
|
// Append-only session archive sync
|
|
2483
2506
|
try {
|
|
2484
|
-
const { syncSessionMirror } = await import('../src/session.
|
|
2507
|
+
const { syncSessionMirror } = await import('../dist/src/session.js');
|
|
2485
2508
|
syncSessionMirror(cwd);
|
|
2486
2509
|
} catch {}
|
|
2487
2510
|
|
|
@@ -2503,7 +2526,7 @@ async function mainScreen(rl, ask) {
|
|
|
2503
2526
|
|
|
2504
2527
|
// Build session index in background (powers search + smart resume)
|
|
2505
2528
|
try {
|
|
2506
|
-
const { buildSessionIndex } = await import('../src/session.
|
|
2529
|
+
const { buildSessionIndex } = await import('../dist/src/session.js');
|
|
2507
2530
|
buildSessionIndex(cwd);
|
|
2508
2531
|
} catch {}
|
|
2509
2532
|
|
|
@@ -2604,7 +2627,7 @@ async function mainScreen(rl, ask) {
|
|
|
2604
2627
|
// ── Environment awareness (powers Box 1 dots + Box 3) ────────────────────
|
|
2605
2628
|
let envReport = null;
|
|
2606
2629
|
try {
|
|
2607
|
-
const { scanEnvironment } = await import('../src/awareness.
|
|
2630
|
+
const { scanEnvironment } = await import('../dist/src/awareness.js');
|
|
2608
2631
|
envReport = scanEnvironment(cwd);
|
|
2609
2632
|
} catch { /* non-fatal */ }
|
|
2610
2633
|
|
|
@@ -2670,7 +2693,7 @@ async function mainScreen(rl, ask) {
|
|
|
2670
2693
|
// Line 1: observer data first; fall back to envReport-derived observations
|
|
2671
2694
|
let quickObservations = [];
|
|
2672
2695
|
try {
|
|
2673
|
-
const observerMod = await import('../src/observer.
|
|
2696
|
+
const observerMod = await import('../dist/src/observer.js');
|
|
2674
2697
|
const quickState = await observerMod.getQuickState(cwd);
|
|
2675
2698
|
if (quickState?.observations?.length > 0) {
|
|
2676
2699
|
const PRIO = { high: 0, medium: 1, low: 2 };
|
|
@@ -2727,7 +2750,7 @@ async function mainScreen(rl, ask) {
|
|
|
2727
2750
|
|
|
2728
2751
|
if (awarenessLine2 === '\x1b[2m📋 No roadmap yet\x1b[0m') {
|
|
2729
2752
|
try {
|
|
2730
|
-
const { getOpenTasks } = await import('../src/ledger.
|
|
2753
|
+
const { getOpenTasks } = await import('../dist/src/ledger.js');
|
|
2731
2754
|
const open = getOpenTasks(cwd);
|
|
2732
2755
|
if (open.length > 0) {
|
|
2733
2756
|
awarenessLine2 = '📋 Next: ' + open[0].intent.slice(0, 45);
|
|
@@ -2737,7 +2760,7 @@ async function mainScreen(rl, ask) {
|
|
|
2737
2760
|
|
|
2738
2761
|
// Line 3: model registry age warning
|
|
2739
2762
|
try {
|
|
2740
|
-
const { getRegistryAge } = await import('../src/models.
|
|
2763
|
+
const { getRegistryAge } = await import('../dist/src/models.js');
|
|
2741
2764
|
const age = getRegistryAge();
|
|
2742
2765
|
if (age > 30 && awarenessLine3 === '\x1b[32m✓\x1b[0m No risk flags') {
|
|
2743
2766
|
awarenessLine3 = `\x1b[33m⚠\x1b[0m Model registry ${age} days old`;
|
|
@@ -2747,7 +2770,7 @@ async function mainScreen(rl, ask) {
|
|
|
2747
2770
|
// Replit awareness rows (shown only when running in Replit, max 2-3 lines)
|
|
2748
2771
|
const replitAwarenessRows = [];
|
|
2749
2772
|
try {
|
|
2750
|
-
const replitMod = await import('../src/replit.
|
|
2773
|
+
const replitMod = await import('../dist/src/replit.js');
|
|
2751
2774
|
const replitEnv = replitMod.detectReplitEnvironment(cwd);
|
|
2752
2775
|
if (replitEnv.isReplit) {
|
|
2753
2776
|
const rtInfo = replitMod.inspectReplitTools(cwd);
|
|
@@ -2863,7 +2886,7 @@ async function mainScreen(rl, ask) {
|
|
|
2863
2886
|
} else if (isReturning) {
|
|
2864
2887
|
const openTasks = [];
|
|
2865
2888
|
try {
|
|
2866
|
-
const { getOpenTasks } = await import('../src/ledger.
|
|
2889
|
+
const { getOpenTasks } = await import('../dist/src/ledger.js');
|
|
2867
2890
|
const open = getOpenTasks(cwd);
|
|
2868
2891
|
if (open.length > 0) openTasks.push(`continue: ${open[0].intent.slice(0, 30)}`);
|
|
2869
2892
|
} catch {}
|
|
@@ -3220,7 +3243,7 @@ async function mainScreen(rl, ask) {
|
|
|
3220
3243
|
if (!q2) return { next: 'main' };
|
|
3221
3244
|
args.push(q2);
|
|
3222
3245
|
}
|
|
3223
|
-
const { searchSessions, buildSessionIndex } = await import('../src/session.
|
|
3246
|
+
const { searchSessions, buildSessionIndex } = await import('../dist/src/session.js');
|
|
3224
3247
|
try { buildSessionIndex(cwd); } catch {}
|
|
3225
3248
|
const results = searchSessions(args.join(' '), cwd);
|
|
3226
3249
|
if (results.length === 0) {
|
|
@@ -3395,7 +3418,7 @@ async function mainScreen(rl, ask) {
|
|
|
3395
3418
|
if (!isNaN(numChoice) && numChoice >= 1 && numChoice <= recentSessions.length) {
|
|
3396
3419
|
const sess = recentSessions[numChoice - 1];
|
|
3397
3420
|
try {
|
|
3398
|
-
const { getSessionContext } = await import('../src/session.
|
|
3421
|
+
const { getSessionContext } = await import('../dist/src/session.js');
|
|
3399
3422
|
const ctx = getSessionContext(sess.id, cwd);
|
|
3400
3423
|
if (ctx) {
|
|
3401
3424
|
if (ctx.lastPrompt) process.stdout.write(`\n Last working on: ${ctx.lastPrompt}\n`);
|
|
@@ -3417,7 +3440,7 @@ async function mainScreen(rl, ask) {
|
|
|
3417
3440
|
const query = (await ask(' Search: ')).trim();
|
|
3418
3441
|
if (!query) return { next: 'main' };
|
|
3419
3442
|
|
|
3420
|
-
const { searchSessions, buildSessionIndex } = await import('../src/session.
|
|
3443
|
+
const { searchSessions, buildSessionIndex } = await import('../dist/src/session.js');
|
|
3421
3444
|
try { buildSessionIndex(cwd); } catch {}
|
|
3422
3445
|
|
|
3423
3446
|
const results = searchSessions(query, cwd);
|
|
@@ -4230,7 +4253,7 @@ async function settingsScreen(rl, ask) {
|
|
|
4230
4253
|
// Intelligence settings (routing, think, strategies)
|
|
4231
4254
|
if (choice === 'i') {
|
|
4232
4255
|
try {
|
|
4233
|
-
const { runSettings } = await import('../src/settings-tui.
|
|
4256
|
+
const { runSettings } = await import('../dist/src/settings-tui.js');
|
|
4234
4257
|
await runSettings(cwd);
|
|
4235
4258
|
} catch (e) {
|
|
4236
4259
|
process.stdout.write(` Intelligence settings unavailable: ${e.message}\n`);
|
|
@@ -4242,7 +4265,7 @@ async function settingsScreen(rl, ask) {
|
|
|
4242
4265
|
// Revert recent changes
|
|
4243
4266
|
if (choice === 'u') {
|
|
4244
4267
|
try {
|
|
4245
|
-
const { runRevert } = await import('../src/revert.
|
|
4268
|
+
const { runRevert } = await import('../dist/src/revert.js');
|
|
4246
4269
|
await runRevert(cwd);
|
|
4247
4270
|
} catch (e) {
|
|
4248
4271
|
process.stdout.write(` Revert unavailable: ${e.message}\n`);
|
|
@@ -4276,7 +4299,7 @@ async function teamScreen(rl, ask) {
|
|
|
4276
4299
|
let sharedSessions = 0;
|
|
4277
4300
|
let teamDecisions = 0;
|
|
4278
4301
|
try {
|
|
4279
|
-
const _tmLd = await import('../src/living-docs.
|
|
4302
|
+
const _tmLd = await import('../dist/src/living-docs.js');
|
|
4280
4303
|
const _tmPs = _tmLd.getProjectState(cwd);
|
|
4281
4304
|
if (Array.isArray(_tmPs?.project?.team)) {
|
|
4282
4305
|
team = _tmPs.project.team;
|
|
@@ -4333,7 +4356,7 @@ async function teamScreen(rl, ask) {
|
|
|
4333
4356
|
const name = (await ask(' Member name: ')).trim();
|
|
4334
4357
|
if (name) {
|
|
4335
4358
|
try {
|
|
4336
|
-
const _tmLdAdd = await import('../src/living-docs.
|
|
4359
|
+
const _tmLdAdd = await import('../dist/src/living-docs.js');
|
|
4337
4360
|
const _tmCur = _tmLdAdd.getProjectState(cwd);
|
|
4338
4361
|
const _tmTeam = Array.isArray(_tmCur?.project?.team) ? [..._tmCur.project.team] : [];
|
|
4339
4362
|
_tmTeam.push({ name, role: 'member', addedAt: new Date().toISOString() });
|
|
@@ -6011,7 +6034,7 @@ async function runScreens(startScreen = 'dashboard') {
|
|
|
6011
6034
|
if (ctx.model === 'haiku') {
|
|
6012
6035
|
process.stdout.write('\n');
|
|
6013
6036
|
try {
|
|
6014
|
-
const { runPipeline: rp } = await import('../src/pipeline.
|
|
6037
|
+
const { runPipeline: rp } = await import('../dist/src/pipeline.js');
|
|
6015
6038
|
const { result } = await rp('go', prompt, { cwd: process.cwd(), dryRun, forceDepth: 'shallow' });
|
|
6016
6039
|
if (result?.output) process.stdout.write('\n' + String(result.output).trim() + '\n\n');
|
|
6017
6040
|
else process.stdout.write(' (no output)\n\n');
|
|
@@ -6510,6 +6533,12 @@ async function main() {
|
|
|
6510
6533
|
const args = process.argv.slice(2);
|
|
6511
6534
|
const cmd = args[0];
|
|
6512
6535
|
|
|
6536
|
+
// Session start marker — feeds routing advisor with cross-session timing signals
|
|
6537
|
+
try {
|
|
6538
|
+
const { markSessionStart } = await import('../dist/src/routing-advisor.js');
|
|
6539
|
+
markSessionStart(process.cwd());
|
|
6540
|
+
} catch { /* non-blocking */ }
|
|
6541
|
+
|
|
6513
6542
|
if (cmd === '--help' || cmd === '-h') { printHelp(); return; }
|
|
6514
6543
|
if (cmd === '--version' || cmd === '-v') { console.log(readVersion()); return; }
|
|
6515
6544
|
|
|
@@ -6571,7 +6600,7 @@ async function main() {
|
|
|
6571
6600
|
// init --reconfigure: run setup-flow reconfiguration
|
|
6572
6601
|
if (args.includes('--reconfigure')) {
|
|
6573
6602
|
try {
|
|
6574
|
-
const { runSetup } = await import('../src/setup-flow.
|
|
6603
|
+
const { runSetup } = await import('../dist/src/setup-flow.js');
|
|
6575
6604
|
await runSetup(process.cwd(), { reconfigure: true });
|
|
6576
6605
|
} catch (e) {
|
|
6577
6606
|
console.error('setup-flow.mjs not available — skipping reconfigure');
|
|
@@ -6609,7 +6638,7 @@ async function main() {
|
|
|
6609
6638
|
const cwd = process.cwd();
|
|
6610
6639
|
const dryRun = args.includes('--dry-run');
|
|
6611
6640
|
try {
|
|
6612
|
-
const replit = await import('../src/replit.
|
|
6641
|
+
const replit = await import('../dist/src/replit.js');
|
|
6613
6642
|
const report = await replit.initReplitIntegration({ dryRun, cwd });
|
|
6614
6643
|
console.log(replit.formatReplitReport(report));
|
|
6615
6644
|
} catch (e) {
|
|
@@ -6642,30 +6671,72 @@ async function main() {
|
|
|
6642
6671
|
}
|
|
6643
6672
|
|
|
6644
6673
|
if (cmd === 'setup') {
|
|
6645
|
-
const { runSetup } = await import('../src/setup-flow.
|
|
6674
|
+
const { runSetup } = await import('../dist/src/setup-flow.js');
|
|
6646
6675
|
await runSetup(process.cwd(), { reconfigure: args.includes('--reconfigure') });
|
|
6647
6676
|
return;
|
|
6648
6677
|
}
|
|
6649
6678
|
|
|
6650
6679
|
if (cmd === 'advice' || cmd === 'recommend') {
|
|
6651
|
-
const { generateRecommendations, formatRecommendations } = await import('../src/recommendations.
|
|
6680
|
+
const { generateRecommendations, formatRecommendations } = await import('../dist/src/recommendations.js');
|
|
6652
6681
|
const recs = generateRecommendations(process.cwd());
|
|
6653
6682
|
if (recs.length === 0) {
|
|
6654
|
-
console.log('
|
|
6683
|
+
console.log('');
|
|
6684
|
+
console.log(' \x1b[2m─── HEAD Analysis ───\x1b[0m');
|
|
6685
|
+
console.log('');
|
|
6686
|
+
const { getRoutingStats } = await import('../dist/src/routing-advisor.js');
|
|
6687
|
+
const stats = getRoutingStats(process.cwd());
|
|
6688
|
+
if (stats.totalObservations < 20) {
|
|
6689
|
+
console.log(` Need more data: ${stats.totalObservations}/20 observations before recommendations.`);
|
|
6690
|
+
console.log(` Keep dispatching — the system learns from every task.`);
|
|
6691
|
+
} else {
|
|
6692
|
+
console.log(' No recommendations — current configuration is performing well.');
|
|
6693
|
+
}
|
|
6694
|
+
console.log('');
|
|
6655
6695
|
} else {
|
|
6656
6696
|
console.log(formatRecommendations(recs));
|
|
6657
6697
|
}
|
|
6658
6698
|
return;
|
|
6659
6699
|
}
|
|
6660
6700
|
|
|
6701
|
+
if (cmd === 'stats' || cmd === 'intelligence') {
|
|
6702
|
+
const { getRoutingStats } = await import('../dist/src/routing-advisor.js');
|
|
6703
|
+
const { getThinkingStats } = await import('../dist/src/think-engine.js');
|
|
6704
|
+
const stats = getRoutingStats(process.cwd());
|
|
6705
|
+
const thinkStats = getThinkingStats(process.cwd());
|
|
6706
|
+
|
|
6707
|
+
console.log('');
|
|
6708
|
+
console.log(' \x1b[1mdual-brain intelligence report\x1b[0m');
|
|
6709
|
+
console.log('');
|
|
6710
|
+
console.log(` Routing observations: ${stats.totalObservations}`);
|
|
6711
|
+
if (stats.topPerformers?.length > 0) {
|
|
6712
|
+
console.log(' Top performers:');
|
|
6713
|
+
for (const p of stats.topPerformers.slice(0, 5)) {
|
|
6714
|
+
console.log(` ${p.cell} → ${p.model} (${(p.ema * 100).toFixed(0)}%, n=${p.observations})`);
|
|
6715
|
+
}
|
|
6716
|
+
}
|
|
6717
|
+
if (stats.worstPerformers?.length > 0) {
|
|
6718
|
+
console.log(' Underperformers:');
|
|
6719
|
+
for (const p of stats.worstPerformers.slice(0, 3)) {
|
|
6720
|
+
console.log(` ${p.cell} → ${p.model} (${(p.ema * 100).toFixed(0)}%, n=${p.observations})`);
|
|
6721
|
+
}
|
|
6722
|
+
}
|
|
6723
|
+
console.log('');
|
|
6724
|
+
console.log(` Think decisions: ${thinkStats.totalDecisions}`);
|
|
6725
|
+
console.log(` Cache hit rate: ${(thinkStats.cacheHitRate * 100).toFixed(0)}%`);
|
|
6726
|
+
console.log(` Tokens saved: ~${(thinkStats.totalTokensSaved / 1000).toFixed(0)}K`);
|
|
6727
|
+
console.log(` Tier distribution: recall=${thinkStats.tierDistribution.recall}, quick=${thinkStats.tierDistribution.quick}, standard=${thinkStats.tierDistribution.standard}, deep=${thinkStats.tierDistribution.deep}, ultra=${thinkStats.tierDistribution.ultra}`);
|
|
6728
|
+
console.log('');
|
|
6729
|
+
return;
|
|
6730
|
+
}
|
|
6731
|
+
|
|
6661
6732
|
if (cmd === 'revert' || cmd === 'undo') {
|
|
6662
|
-
const { runRevert } = await import('../src/revert.
|
|
6733
|
+
const { runRevert } = await import('../dist/src/revert.js');
|
|
6663
6734
|
await runRevert(process.cwd());
|
|
6664
6735
|
return;
|
|
6665
6736
|
}
|
|
6666
6737
|
|
|
6667
6738
|
if (cmd === 'strategies') {
|
|
6668
|
-
const { listStrategies } = await import('../src/strategy.
|
|
6739
|
+
const { listStrategies } = await import('../dist/src/strategy.js');
|
|
6669
6740
|
const strats = listStrategies();
|
|
6670
6741
|
console.log('\n Available dispatch strategies:\n');
|
|
6671
6742
|
for (const s of strats) {
|
|
@@ -6716,7 +6787,7 @@ async function main() {
|
|
|
6716
6787
|
process.exit(1);
|
|
6717
6788
|
}
|
|
6718
6789
|
|
|
6719
|
-
const { searchSessions, buildSessionIndex } = await import('../src/session.
|
|
6790
|
+
const { searchSessions, buildSessionIndex } = await import('../dist/src/session.js');
|
|
6720
6791
|
const cwd = process.cwd();
|
|
6721
6792
|
try { buildSessionIndex(cwd); } catch {}
|
|
6722
6793
|
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* mcp-server/index.ts — TypeScript MCP server for dual-brain orchestration.
|
|
4
|
+
*
|
|
5
|
+
* Exposes dual-brain orchestration as tools via JSON-RPC 2.0 over stdio
|
|
6
|
+
* using the MCP protocol (Content-Length framing).
|
|
7
|
+
*
|
|
8
|
+
* Tools:
|
|
9
|
+
* dual_brain_status — Provider health, routing stats, active rooms
|
|
10
|
+
* dual_brain_dispatch — Route a prompt to best provider/model/tier
|
|
11
|
+
* dual_brain_history — Recent routing decisions and outcomes
|
|
12
|
+
* dual_brain_health — Per-provider health scores and cooldown status
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* node dist/mcp-server/index.js
|
|
16
|
+
*
|
|
17
|
+
* MCP client config:
|
|
18
|
+
* {
|
|
19
|
+
* "mcpServers": {
|
|
20
|
+
* "dual-brain": {
|
|
21
|
+
* "command": "node",
|
|
22
|
+
* "args": ["node_modules/dual-brain/mcp-server/index.mjs"]
|
|
23
|
+
* }
|
|
24
|
+
* }
|
|
25
|
+
* }
|
|
26
|
+
*/
|
|
27
|
+
export {};
|