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.
Files changed (309) hide show
  1. package/.dual-brain/docs/claude-code-extension-points.md +32 -0
  2. package/.dual-brain/docs/data-tools-capabilities.md +181 -0
  3. package/.dual-brain/docs/ecosystem-tools.md +91 -0
  4. package/.dual-brain/docs/panel-handoff.md +124 -0
  5. package/.dual-brain/docs/ruflo-analysis.md +48 -0
  6. package/bin/dual-brain.mjs +122 -51
  7. package/dist/mcp-server/index.d.ts +27 -0
  8. package/dist/mcp-server/index.js +359 -0
  9. package/dist/mcp-server/index.js.map +1 -0
  10. package/dist/src/agent-protocol.d.ts +163 -0
  11. package/dist/src/agent-protocol.js +368 -0
  12. package/dist/src/agent-protocol.js.map +1 -0
  13. package/dist/src/agents/registry.d.ts +52 -0
  14. package/dist/src/agents/registry.js +393 -0
  15. package/dist/src/agents/registry.js.map +1 -0
  16. package/dist/src/awareness.d.ts +93 -0
  17. package/dist/src/awareness.js +406 -0
  18. package/dist/src/awareness.js.map +1 -0
  19. package/dist/src/brief.d.ts +48 -0
  20. package/dist/src/brief.js +179 -0
  21. package/dist/src/brief.js.map +1 -0
  22. package/dist/src/calibration.d.ts +32 -0
  23. package/dist/src/calibration.js +133 -0
  24. package/dist/src/calibration.js.map +1 -0
  25. package/dist/src/checkpoint.d.ts +33 -0
  26. package/dist/src/checkpoint.js +99 -0
  27. package/dist/src/checkpoint.js.map +1 -0
  28. package/dist/src/ci-triage.d.ts +33 -0
  29. package/dist/src/ci-triage.js +193 -0
  30. package/dist/src/ci-triage.js.map +1 -0
  31. package/dist/src/cognitive-loop.d.ts +56 -0
  32. package/dist/src/cognitive-loop.js +495 -0
  33. package/dist/src/cognitive-loop.js.map +1 -0
  34. package/dist/src/collaboration.d.ts +147 -0
  35. package/dist/src/collaboration.js +438 -0
  36. package/dist/src/collaboration.js.map +1 -0
  37. package/dist/src/context-intel.d.ts +47 -0
  38. package/dist/src/context-intel.js +156 -0
  39. package/dist/src/context-intel.js.map +1 -0
  40. package/dist/src/context.d.ts +53 -0
  41. package/dist/src/context.js +332 -0
  42. package/dist/src/context.js.map +1 -0
  43. package/dist/src/continuity.d.ts +89 -0
  44. package/dist/src/continuity.js +230 -0
  45. package/dist/src/continuity.js.map +1 -0
  46. package/dist/src/cost-tracker.d.ts +47 -0
  47. package/dist/src/cost-tracker.js +170 -0
  48. package/dist/src/cost-tracker.js.map +1 -0
  49. package/dist/src/debrief.d.ts +53 -0
  50. package/dist/src/debrief.js +222 -0
  51. package/dist/src/debrief.js.map +1 -0
  52. package/dist/src/decide.d.ts +96 -0
  53. package/dist/src/decide.js +744 -0
  54. package/dist/src/decide.js.map +1 -0
  55. package/dist/src/decompose.d.ts +39 -0
  56. package/dist/src/decompose.js +218 -0
  57. package/dist/src/decompose.js.map +1 -0
  58. package/dist/src/detect.d.ts +91 -0
  59. package/dist/src/detect.js +544 -0
  60. package/dist/src/detect.js.map +1 -0
  61. package/dist/src/dispatch.d.ts +154 -0
  62. package/dist/src/dispatch.js +1306 -0
  63. package/dist/src/dispatch.js.map +1 -0
  64. package/dist/src/doctor.d.ts +421 -0
  65. package/dist/src/doctor.js +1689 -0
  66. package/dist/src/doctor.js.map +1 -0
  67. package/dist/src/engine.d.ts +70 -0
  68. package/dist/src/engine.js +155 -0
  69. package/dist/src/engine.js.map +1 -0
  70. package/dist/src/envelope.d.ts +36 -0
  71. package/dist/src/envelope.js +80 -0
  72. package/dist/src/envelope.js.map +1 -0
  73. package/dist/src/failure-memory.d.ts +55 -0
  74. package/dist/src/failure-memory.js +175 -0
  75. package/dist/src/failure-memory.js.map +1 -0
  76. package/dist/src/fx.d.ts +87 -0
  77. package/dist/src/fx.js +272 -0
  78. package/dist/src/fx.js.map +1 -0
  79. package/dist/src/governance.d.ts +93 -0
  80. package/dist/src/governance.js +261 -0
  81. package/dist/src/governance.js.map +1 -0
  82. package/dist/src/handoff.d.ts +11 -0
  83. package/dist/src/handoff.js +90 -0
  84. package/dist/src/handoff.js.map +1 -0
  85. package/dist/src/head-protocol.d.ts +76 -0
  86. package/dist/src/head-protocol.js +109 -0
  87. package/dist/src/head-protocol.js.map +1 -0
  88. package/dist/src/head.d.ts +222 -0
  89. package/dist/src/head.js +765 -0
  90. package/dist/src/head.js.map +1 -0
  91. package/dist/src/health.d.ts +132 -0
  92. package/dist/src/health.js +435 -0
  93. package/dist/src/health.js.map +1 -0
  94. package/dist/src/inbox.d.ts +70 -0
  95. package/dist/src/inbox.js +218 -0
  96. package/dist/src/inbox.js.map +1 -0
  97. package/dist/src/index.d.ts +33 -0
  98. package/dist/src/index.js +38 -0
  99. package/dist/src/index.js.map +1 -0
  100. package/dist/src/install-hooks.d.ts +13 -0
  101. package/dist/src/install-hooks.js +88 -0
  102. package/dist/src/install-hooks.js.map +1 -0
  103. package/dist/src/integrity.d.ts +59 -0
  104. package/dist/src/integrity.js +206 -0
  105. package/dist/src/integrity.js.map +1 -0
  106. package/dist/src/intelligence.d.ts +104 -0
  107. package/dist/src/intelligence.js +391 -0
  108. package/dist/src/intelligence.js.map +1 -0
  109. package/dist/src/ledger.d.ts +54 -0
  110. package/dist/src/ledger.js +179 -0
  111. package/dist/src/ledger.js.map +1 -0
  112. package/dist/src/living-docs.d.ts +14 -0
  113. package/dist/src/living-docs.js +197 -0
  114. package/dist/src/living-docs.js.map +1 -0
  115. package/dist/src/memory-tiers.d.ts +37 -0
  116. package/dist/src/memory-tiers.js +160 -0
  117. package/dist/src/memory-tiers.js.map +1 -0
  118. package/dist/src/model-profiles.d.ts +65 -0
  119. package/dist/src/model-profiles.js +568 -0
  120. package/dist/src/model-profiles.js.map +1 -0
  121. package/dist/src/models.d.ts +58 -0
  122. package/dist/src/models.js +327 -0
  123. package/dist/src/models.js.map +1 -0
  124. package/dist/src/narrative.d.ts +54 -0
  125. package/dist/src/narrative.js +163 -0
  126. package/dist/src/narrative.js.map +1 -0
  127. package/dist/src/nextstep.d.ts +16 -0
  128. package/dist/src/nextstep.js +103 -0
  129. package/dist/src/nextstep.js.map +1 -0
  130. package/dist/src/observer.d.ts +18 -0
  131. package/dist/src/observer.js +251 -0
  132. package/dist/src/observer.js.map +1 -0
  133. package/dist/src/outcome.d.ts +110 -0
  134. package/dist/src/outcome.js +377 -0
  135. package/dist/src/outcome.js.map +1 -0
  136. package/dist/src/pipeline.d.ts +167 -0
  137. package/dist/src/pipeline.js +1503 -0
  138. package/dist/src/pipeline.js.map +1 -0
  139. package/dist/src/playbook.d.ts +59 -0
  140. package/dist/src/playbook.js +238 -0
  141. package/dist/src/playbook.js.map +1 -0
  142. package/dist/src/pr-agent.d.ts +97 -0
  143. package/dist/src/pr-agent.js +195 -0
  144. package/dist/src/pr-agent.js.map +1 -0
  145. package/dist/src/predictive.d.ts +57 -0
  146. package/dist/src/predictive.js +230 -0
  147. package/dist/src/predictive.js.map +1 -0
  148. package/dist/src/profile.d.ts +294 -0
  149. package/dist/src/profile.js +1347 -0
  150. package/dist/src/profile.js.map +1 -0
  151. package/dist/src/prompt-audit.d.ts +22 -0
  152. package/dist/src/prompt-audit.js +194 -0
  153. package/dist/src/prompt-audit.js.map +1 -0
  154. package/dist/src/prompt-intel.d.ts +12 -0
  155. package/dist/src/prompt-intel.js +321 -0
  156. package/dist/src/prompt-intel.js.map +1 -0
  157. package/dist/src/provider-context.d.ts +121 -0
  158. package/dist/src/provider-context.js +222 -0
  159. package/dist/src/provider-context.js.map +1 -0
  160. package/dist/src/provider-manager.d.ts +92 -0
  161. package/dist/src/provider-manager.js +428 -0
  162. package/dist/src/provider-manager.js.map +1 -0
  163. package/dist/src/receipt.d.ts +87 -0
  164. package/dist/src/receipt.js +326 -0
  165. package/dist/src/receipt.js.map +1 -0
  166. package/dist/src/recommendations.d.ts +13 -0
  167. package/dist/src/recommendations.js +291 -0
  168. package/dist/src/recommendations.js.map +1 -0
  169. package/dist/src/redact.d.ts +15 -0
  170. package/dist/src/redact.js +129 -0
  171. package/dist/src/redact.js.map +1 -0
  172. package/dist/src/replit.d.ts +397 -0
  173. package/dist/src/replit.js +1160 -0
  174. package/dist/src/replit.js.map +1 -0
  175. package/dist/src/repo.d.ts +149 -0
  176. package/dist/src/repo.js +416 -0
  177. package/dist/src/repo.js.map +1 -0
  178. package/dist/src/revert.d.ts +30 -0
  179. package/dist/src/revert.js +166 -0
  180. package/dist/src/revert.js.map +1 -0
  181. package/dist/src/room.d.ts +102 -0
  182. package/dist/src/room.js +212 -0
  183. package/dist/src/room.js.map +1 -0
  184. package/dist/src/routing-advisor.d.ts +57 -0
  185. package/dist/src/routing-advisor.js +221 -0
  186. package/dist/src/routing-advisor.js.map +1 -0
  187. package/dist/src/self-correct.d.ts +40 -0
  188. package/dist/src/self-correct.js +137 -0
  189. package/dist/src/self-correct.js.map +1 -0
  190. package/dist/src/session-lock.d.ts +35 -0
  191. package/dist/src/session-lock.js +134 -0
  192. package/dist/src/session-lock.js.map +1 -0
  193. package/dist/src/session.d.ts +267 -0
  194. package/dist/src/session.js +1660 -0
  195. package/dist/src/session.js.map +1 -0
  196. package/dist/src/settings-tui.d.ts +5 -0
  197. package/dist/src/settings-tui.js +422 -0
  198. package/dist/src/settings-tui.js.map +1 -0
  199. package/dist/src/setup-flow.d.ts +63 -0
  200. package/dist/src/setup-flow.js +233 -0
  201. package/dist/src/setup-flow.js.map +1 -0
  202. package/dist/src/signal.d.ts +19 -0
  203. package/dist/src/signal.js +122 -0
  204. package/dist/src/signal.js.map +1 -0
  205. package/dist/src/simmer.d.ts +85 -0
  206. package/dist/src/simmer.js +224 -0
  207. package/dist/src/simmer.js.map +1 -0
  208. package/dist/src/state-export.d.ts +129 -0
  209. package/dist/src/state-export.js +233 -0
  210. package/dist/src/state-export.js.map +1 -0
  211. package/dist/src/strategy.d.ts +54 -0
  212. package/dist/src/strategy.js +95 -0
  213. package/dist/src/strategy.js.map +1 -0
  214. package/dist/src/subscription.d.ts +40 -0
  215. package/dist/src/subscription.js +189 -0
  216. package/dist/src/subscription.js.map +1 -0
  217. package/dist/src/templates.d.ts +208 -0
  218. package/dist/src/templates.js +238 -0
  219. package/dist/src/templates.js.map +1 -0
  220. package/dist/src/test.d.ts +9 -0
  221. package/dist/src/test.js +1173 -0
  222. package/dist/src/test.js.map +1 -0
  223. package/dist/src/think-engine.d.ts +67 -0
  224. package/dist/src/think-engine.js +412 -0
  225. package/dist/src/think-engine.js.map +1 -0
  226. package/dist/src/tui.d.ts +71 -0
  227. package/dist/src/tui.js +242 -0
  228. package/dist/src/tui.js.map +1 -0
  229. package/dist/src/types.d.ts +177 -0
  230. package/dist/src/types.js +6 -0
  231. package/dist/src/types.js.map +1 -0
  232. package/dist/src/update-check.d.ts +7 -0
  233. package/dist/src/update-check.js +36 -0
  234. package/dist/src/update-check.js.map +1 -0
  235. package/dist/src/wave-planner.d.ts +30 -0
  236. package/dist/src/wave-planner.js +281 -0
  237. package/dist/src/wave-planner.js.map +1 -0
  238. package/hooks/head-guard.sh +41 -0
  239. package/hooks/task-classifier.mjs +328 -0
  240. package/hooks/vibe-router.mjs +387 -0
  241. package/package.json +29 -153
  242. package/src/agents/registry.mjs +0 -405
  243. package/src/awareness.mjs +0 -425
  244. package/src/brief.mjs +0 -266
  245. package/src/calibration.mjs +0 -148
  246. package/src/checkpoint.mjs +0 -109
  247. package/src/ci-triage.mjs +0 -191
  248. package/src/cognitive-loop.mjs +0 -562
  249. package/src/collaboration.mjs +0 -545
  250. package/src/context-intel.mjs +0 -158
  251. package/src/context.mjs +0 -389
  252. package/src/continuity.mjs +0 -298
  253. package/src/cost-tracker.mjs +0 -184
  254. package/src/debrief.mjs +0 -228
  255. package/src/decide.mjs +0 -1099
  256. package/src/decompose.mjs +0 -331
  257. package/src/detect.mjs +0 -702
  258. package/src/dispatch.mjs +0 -1447
  259. package/src/doctor.mjs +0 -1607
  260. package/src/envelope.mjs +0 -139
  261. package/src/failure-memory.mjs +0 -178
  262. package/src/fx.mjs +0 -276
  263. package/src/governance.mjs +0 -279
  264. package/src/handoff.mjs +0 -85
  265. package/src/head-protocol.mjs +0 -128
  266. package/src/head.mjs +0 -952
  267. package/src/health.mjs +0 -528
  268. package/src/inbox.mjs +0 -195
  269. package/src/index.mjs +0 -44
  270. package/src/install-hooks.mjs +0 -100
  271. package/src/integrity.mjs +0 -245
  272. package/src/intelligence.mjs +0 -447
  273. package/src/ledger.mjs +0 -196
  274. package/src/living-docs.mjs +0 -210
  275. package/src/memory-tiers.mjs +0 -193
  276. package/src/models.mjs +0 -363
  277. package/src/narrative.mjs +0 -169
  278. package/src/nextstep.mjs +0 -100
  279. package/src/observer.mjs +0 -241
  280. package/src/outcome.mjs +0 -386
  281. package/src/pipeline.mjs +0 -1689
  282. package/src/playbook.mjs +0 -257
  283. package/src/pr-agent.mjs +0 -214
  284. package/src/predictive.mjs +0 -250
  285. package/src/profile.mjs +0 -1411
  286. package/src/prompt-audit.mjs +0 -231
  287. package/src/prompt-intel.mjs +0 -325
  288. package/src/provider-context.mjs +0 -257
  289. package/src/receipt.mjs +0 -344
  290. package/src/recommendations.mjs +0 -291
  291. package/src/redact.mjs +0 -192
  292. package/src/replit.mjs +0 -1210
  293. package/src/repo.mjs +0 -445
  294. package/src/revert.mjs +0 -149
  295. package/src/routing-advisor.mjs +0 -200
  296. package/src/self-correct.mjs +0 -146
  297. package/src/session-lock.mjs +0 -160
  298. package/src/session.mjs +0 -1655
  299. package/src/settings-tui.mjs +0 -373
  300. package/src/setup-flow.mjs +0 -215
  301. package/src/signal.mjs +0 -114
  302. package/src/simmer.mjs +0 -241
  303. package/src/strategy.mjs +0 -235
  304. package/src/subscription.mjs +0 -212
  305. package/src/templates.mjs +0 -260
  306. package/src/think-engine.mjs +0 -428
  307. package/src/tui.mjs +0 -276
  308. package/src/update-check.mjs +0 -35
  309. package/src/wave-planner.mjs +0 -294
@@ -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.mjs';
19
+ } from '../dist/src/profile.js';
20
20
 
21
- import { detectTask, primeAgentRegistry } from '../src/detect.mjs';
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.mjs');
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.mjs';
57
+ } from '../dist/src/decide.js';
58
58
 
59
59
  import {
60
60
  getHealth, markHot, markHealthy, remainingCooldownMinutes, getSessionStats,
61
- } from '../src/health.mjs';
61
+ } from '../dist/src/health.js';
62
62
 
63
- import { dispatch, detectRuntime, dispatchDualBrain } from '../src/dispatch.mjs';
63
+ import { dispatch, detectRuntime, dispatchDualBrain } from '../dist/src/dispatch.js';
64
64
 
65
- import { runPipeline, buildExecutionPlan, formatExecutionPlan } from '../src/pipeline.mjs';
65
+ import { runPipeline, buildExecutionPlan, formatExecutionPlan } from '../dist/src/pipeline.js';
66
66
 
67
- import { loadRepoCache } from '../src/repo.mjs';
68
- import { loadSession, saveSession, formatSessionCard, importReplitSessions, getSessionMeta, saveSessionMeta, renameSession, pinSession, unpinSession, categorizeSession, enrichSessions, archiveSession, getArchivedSessions } from '../src/session.mjs';
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.mjs';
71
- import { checkBudget } from '../src/governance.mjs';
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.mjs'); } catch { _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.mjs'); } catch { _failureMem = {}; }
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.mjs'); } catch { _livingDocs = {}; }
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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.mjs');
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(' No recommendations yet. Need 20+ dispatches to generate advice.');
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.mjs');
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.mjs');
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.mjs');
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 {};