dual-brain 0.2.30 → 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 +56 -56
  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 -87
  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 -400
  281. package/src/pipeline.mjs +0 -1711
  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 -296
  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 -204
  296. package/src/self-correct.mjs +0 -147
  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 -223
  301. package/src/signal.mjs +0 -115
  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('');
@@ -1109,8 +1109,8 @@ async function cmdStatus(args = []) {
1109
1109
 
1110
1110
  // Intelligence layer status
1111
1111
  try {
1112
- const { getRoutingStats } = await import('../src/routing-advisor.mjs');
1113
- const { getThinkingStats } = await import('../src/think-engine.mjs');
1112
+ const { getRoutingStats } = await import('../dist/src/routing-advisor.js');
1113
+ const { getThinkingStats } = await import('../dist/src/think-engine.js');
1114
1114
  const stats = getRoutingStats(cwd);
1115
1115
  const thinkStats = getThinkingStats(cwd);
1116
1116
 
@@ -1167,7 +1167,7 @@ async function cmdInstall(cwd) {
1167
1167
  if (result.status !== 0) { process.exit(result.status || 1); }
1168
1168
 
1169
1169
  // Additionally merge enforcement hooks into .claude/settings.json
1170
- const { installHooks } = await import('../src/install-hooks.mjs');
1170
+ const { installHooks } = await import('../dist/src/install-hooks.js');
1171
1171
  const { installed, skipped } = installHooks(cwd);
1172
1172
 
1173
1173
  if (installed.length > 0) {
@@ -1403,7 +1403,7 @@ async function cmdPR(args) {
1403
1403
  // Lazy import — only loaded when 'pr' is invoked
1404
1404
  let prAgent;
1405
1405
  try {
1406
- prAgent = await import('../src/pr-agent.mjs');
1406
+ prAgent = await import('../dist/src/pr-agent.js');
1407
1407
  } catch (e) {
1408
1408
  console.error('pr-agent module not available:', e.message);
1409
1409
  process.exit(1);
@@ -1775,7 +1775,7 @@ async function welcomeScreen(rl, ask) {
1775
1775
  saveProfile(existing, { cwd });
1776
1776
  }
1777
1777
  try {
1778
- const { ensurePersistence } = await import('../src/session.mjs');
1778
+ const { ensurePersistence } = await import('../dist/src/session.js');
1779
1779
  const persisted = ensurePersistence(cwd);
1780
1780
  if (persisted.length > 0) {
1781
1781
  persisted.forEach(msg => console.log(` ✅ ${msg}`));
@@ -2207,7 +2207,7 @@ let _headModuleCache = null;
2207
2207
  async function _getHeadModule() {
2208
2208
  if (!_headModuleCache) {
2209
2209
  try {
2210
- _headModuleCache = await import('../src/head.mjs');
2210
+ _headModuleCache = await import('../dist/src/head.js');
2211
2211
  } catch {
2212
2212
  _headModuleCache = null;
2213
2213
  }
@@ -2398,7 +2398,7 @@ async function detectResumeState(cwd) {
2398
2398
 
2399
2399
  // Check for recent receipt (< 24h)
2400
2400
  try {
2401
- const { getLatestReceipt } = await import('../src/receipt.mjs');
2401
+ const { getLatestReceipt } = await import('../dist/src/receipt.js');
2402
2402
  const receipt = getLatestReceipt(cwd);
2403
2403
  if (receipt) {
2404
2404
  const ageMs = Date.now() - Date.parse(receipt.timestamp);
@@ -2423,7 +2423,7 @@ async function detectResumeState(cwd) {
2423
2423
 
2424
2424
  // Check for open tasks in ledger
2425
2425
  try {
2426
- const { getOpenTasks } = await import('../src/ledger.mjs');
2426
+ const { getOpenTasks } = await import('../dist/src/ledger.js');
2427
2427
  const open = getOpenTasks(cwd);
2428
2428
  if (open.length > 0) {
2429
2429
  result.type = 'resumable';
@@ -2498,13 +2498,13 @@ async function mainScreen(rl, ask) {
2498
2498
 
2499
2499
  // Silent OAuth token auto-refresh (3s timeout — never block dashboard)
2500
2500
  try {
2501
- const { autoRefreshToken } = await import('../src/profile.mjs');
2501
+ const { autoRefreshToken } = await import('../dist/src/profile.js');
2502
2502
  await Promise.race([autoRefreshToken(cwd), new Promise(r => setTimeout(r, 3000))]);
2503
2503
  } catch {}
2504
2504
 
2505
2505
  // Append-only session archive sync
2506
2506
  try {
2507
- const { syncSessionMirror } = await import('../src/session.mjs');
2507
+ const { syncSessionMirror } = await import('../dist/src/session.js');
2508
2508
  syncSessionMirror(cwd);
2509
2509
  } catch {}
2510
2510
 
@@ -2526,7 +2526,7 @@ async function mainScreen(rl, ask) {
2526
2526
 
2527
2527
  // Build session index in background (powers search + smart resume)
2528
2528
  try {
2529
- const { buildSessionIndex } = await import('../src/session.mjs');
2529
+ const { buildSessionIndex } = await import('../dist/src/session.js');
2530
2530
  buildSessionIndex(cwd);
2531
2531
  } catch {}
2532
2532
 
@@ -2627,7 +2627,7 @@ async function mainScreen(rl, ask) {
2627
2627
  // ── Environment awareness (powers Box 1 dots + Box 3) ────────────────────
2628
2628
  let envReport = null;
2629
2629
  try {
2630
- const { scanEnvironment } = await import('../src/awareness.mjs');
2630
+ const { scanEnvironment } = await import('../dist/src/awareness.js');
2631
2631
  envReport = scanEnvironment(cwd);
2632
2632
  } catch { /* non-fatal */ }
2633
2633
 
@@ -2693,7 +2693,7 @@ async function mainScreen(rl, ask) {
2693
2693
  // Line 1: observer data first; fall back to envReport-derived observations
2694
2694
  let quickObservations = [];
2695
2695
  try {
2696
- const observerMod = await import('../src/observer.mjs');
2696
+ const observerMod = await import('../dist/src/observer.js');
2697
2697
  const quickState = await observerMod.getQuickState(cwd);
2698
2698
  if (quickState?.observations?.length > 0) {
2699
2699
  const PRIO = { high: 0, medium: 1, low: 2 };
@@ -2750,7 +2750,7 @@ async function mainScreen(rl, ask) {
2750
2750
 
2751
2751
  if (awarenessLine2 === '\x1b[2m📋 No roadmap yet\x1b[0m') {
2752
2752
  try {
2753
- const { getOpenTasks } = await import('../src/ledger.mjs');
2753
+ const { getOpenTasks } = await import('../dist/src/ledger.js');
2754
2754
  const open = getOpenTasks(cwd);
2755
2755
  if (open.length > 0) {
2756
2756
  awarenessLine2 = '📋 Next: ' + open[0].intent.slice(0, 45);
@@ -2760,7 +2760,7 @@ async function mainScreen(rl, ask) {
2760
2760
 
2761
2761
  // Line 3: model registry age warning
2762
2762
  try {
2763
- const { getRegistryAge } = await import('../src/models.mjs');
2763
+ const { getRegistryAge } = await import('../dist/src/models.js');
2764
2764
  const age = getRegistryAge();
2765
2765
  if (age > 30 && awarenessLine3 === '\x1b[32m✓\x1b[0m No risk flags') {
2766
2766
  awarenessLine3 = `\x1b[33m⚠\x1b[0m Model registry ${age} days old`;
@@ -2770,7 +2770,7 @@ async function mainScreen(rl, ask) {
2770
2770
  // Replit awareness rows (shown only when running in Replit, max 2-3 lines)
2771
2771
  const replitAwarenessRows = [];
2772
2772
  try {
2773
- const replitMod = await import('../src/replit.mjs');
2773
+ const replitMod = await import('../dist/src/replit.js');
2774
2774
  const replitEnv = replitMod.detectReplitEnvironment(cwd);
2775
2775
  if (replitEnv.isReplit) {
2776
2776
  const rtInfo = replitMod.inspectReplitTools(cwd);
@@ -2886,7 +2886,7 @@ async function mainScreen(rl, ask) {
2886
2886
  } else if (isReturning) {
2887
2887
  const openTasks = [];
2888
2888
  try {
2889
- const { getOpenTasks } = await import('../src/ledger.mjs');
2889
+ const { getOpenTasks } = await import('../dist/src/ledger.js');
2890
2890
  const open = getOpenTasks(cwd);
2891
2891
  if (open.length > 0) openTasks.push(`continue: ${open[0].intent.slice(0, 30)}`);
2892
2892
  } catch {}
@@ -3243,7 +3243,7 @@ async function mainScreen(rl, ask) {
3243
3243
  if (!q2) return { next: 'main' };
3244
3244
  args.push(q2);
3245
3245
  }
3246
- const { searchSessions, buildSessionIndex } = await import('../src/session.mjs');
3246
+ const { searchSessions, buildSessionIndex } = await import('../dist/src/session.js');
3247
3247
  try { buildSessionIndex(cwd); } catch {}
3248
3248
  const results = searchSessions(args.join(' '), cwd);
3249
3249
  if (results.length === 0) {
@@ -3418,7 +3418,7 @@ async function mainScreen(rl, ask) {
3418
3418
  if (!isNaN(numChoice) && numChoice >= 1 && numChoice <= recentSessions.length) {
3419
3419
  const sess = recentSessions[numChoice - 1];
3420
3420
  try {
3421
- const { getSessionContext } = await import('../src/session.mjs');
3421
+ const { getSessionContext } = await import('../dist/src/session.js');
3422
3422
  const ctx = getSessionContext(sess.id, cwd);
3423
3423
  if (ctx) {
3424
3424
  if (ctx.lastPrompt) process.stdout.write(`\n Last working on: ${ctx.lastPrompt}\n`);
@@ -3440,7 +3440,7 @@ async function mainScreen(rl, ask) {
3440
3440
  const query = (await ask(' Search: ')).trim();
3441
3441
  if (!query) return { next: 'main' };
3442
3442
 
3443
- const { searchSessions, buildSessionIndex } = await import('../src/session.mjs');
3443
+ const { searchSessions, buildSessionIndex } = await import('../dist/src/session.js');
3444
3444
  try { buildSessionIndex(cwd); } catch {}
3445
3445
 
3446
3446
  const results = searchSessions(query, cwd);
@@ -4253,7 +4253,7 @@ async function settingsScreen(rl, ask) {
4253
4253
  // Intelligence settings (routing, think, strategies)
4254
4254
  if (choice === 'i') {
4255
4255
  try {
4256
- const { runSettings } = await import('../src/settings-tui.mjs');
4256
+ const { runSettings } = await import('../dist/src/settings-tui.js');
4257
4257
  await runSettings(cwd);
4258
4258
  } catch (e) {
4259
4259
  process.stdout.write(` Intelligence settings unavailable: ${e.message}\n`);
@@ -4265,7 +4265,7 @@ async function settingsScreen(rl, ask) {
4265
4265
  // Revert recent changes
4266
4266
  if (choice === 'u') {
4267
4267
  try {
4268
- const { runRevert } = await import('../src/revert.mjs');
4268
+ const { runRevert } = await import('../dist/src/revert.js');
4269
4269
  await runRevert(cwd);
4270
4270
  } catch (e) {
4271
4271
  process.stdout.write(` Revert unavailable: ${e.message}\n`);
@@ -4299,7 +4299,7 @@ async function teamScreen(rl, ask) {
4299
4299
  let sharedSessions = 0;
4300
4300
  let teamDecisions = 0;
4301
4301
  try {
4302
- const _tmLd = await import('../src/living-docs.mjs');
4302
+ const _tmLd = await import('../dist/src/living-docs.js');
4303
4303
  const _tmPs = _tmLd.getProjectState(cwd);
4304
4304
  if (Array.isArray(_tmPs?.project?.team)) {
4305
4305
  team = _tmPs.project.team;
@@ -4356,7 +4356,7 @@ async function teamScreen(rl, ask) {
4356
4356
  const name = (await ask(' Member name: ')).trim();
4357
4357
  if (name) {
4358
4358
  try {
4359
- const _tmLdAdd = await import('../src/living-docs.mjs');
4359
+ const _tmLdAdd = await import('../dist/src/living-docs.js');
4360
4360
  const _tmCur = _tmLdAdd.getProjectState(cwd);
4361
4361
  const _tmTeam = Array.isArray(_tmCur?.project?.team) ? [..._tmCur.project.team] : [];
4362
4362
  _tmTeam.push({ name, role: 'member', addedAt: new Date().toISOString() });
@@ -6034,7 +6034,7 @@ async function runScreens(startScreen = 'dashboard') {
6034
6034
  if (ctx.model === 'haiku') {
6035
6035
  process.stdout.write('\n');
6036
6036
  try {
6037
- const { runPipeline: rp } = await import('../src/pipeline.mjs');
6037
+ const { runPipeline: rp } = await import('../dist/src/pipeline.js');
6038
6038
  const { result } = await rp('go', prompt, { cwd: process.cwd(), dryRun, forceDepth: 'shallow' });
6039
6039
  if (result?.output) process.stdout.write('\n' + String(result.output).trim() + '\n\n');
6040
6040
  else process.stdout.write(' (no output)\n\n');
@@ -6535,7 +6535,7 @@ async function main() {
6535
6535
 
6536
6536
  // Session start marker — feeds routing advisor with cross-session timing signals
6537
6537
  try {
6538
- const { markSessionStart } = await import('../src/routing-advisor.mjs');
6538
+ const { markSessionStart } = await import('../dist/src/routing-advisor.js');
6539
6539
  markSessionStart(process.cwd());
6540
6540
  } catch { /* non-blocking */ }
6541
6541
 
@@ -6600,7 +6600,7 @@ async function main() {
6600
6600
  // init --reconfigure: run setup-flow reconfiguration
6601
6601
  if (args.includes('--reconfigure')) {
6602
6602
  try {
6603
- const { runSetup } = await import('../src/setup-flow.mjs');
6603
+ const { runSetup } = await import('../dist/src/setup-flow.js');
6604
6604
  await runSetup(process.cwd(), { reconfigure: true });
6605
6605
  } catch (e) {
6606
6606
  console.error('setup-flow.mjs not available — skipping reconfigure');
@@ -6638,7 +6638,7 @@ async function main() {
6638
6638
  const cwd = process.cwd();
6639
6639
  const dryRun = args.includes('--dry-run');
6640
6640
  try {
6641
- const replit = await import('../src/replit.mjs');
6641
+ const replit = await import('../dist/src/replit.js');
6642
6642
  const report = await replit.initReplitIntegration({ dryRun, cwd });
6643
6643
  console.log(replit.formatReplitReport(report));
6644
6644
  } catch (e) {
@@ -6671,19 +6671,19 @@ async function main() {
6671
6671
  }
6672
6672
 
6673
6673
  if (cmd === 'setup') {
6674
- const { runSetup } = await import('../src/setup-flow.mjs');
6674
+ const { runSetup } = await import('../dist/src/setup-flow.js');
6675
6675
  await runSetup(process.cwd(), { reconfigure: args.includes('--reconfigure') });
6676
6676
  return;
6677
6677
  }
6678
6678
 
6679
6679
  if (cmd === 'advice' || cmd === 'recommend') {
6680
- const { generateRecommendations, formatRecommendations } = await import('../src/recommendations.mjs');
6680
+ const { generateRecommendations, formatRecommendations } = await import('../dist/src/recommendations.js');
6681
6681
  const recs = generateRecommendations(process.cwd());
6682
6682
  if (recs.length === 0) {
6683
6683
  console.log('');
6684
6684
  console.log(' \x1b[2m─── HEAD Analysis ───\x1b[0m');
6685
6685
  console.log('');
6686
- const { getRoutingStats } = await import('../src/routing-advisor.mjs');
6686
+ const { getRoutingStats } = await import('../dist/src/routing-advisor.js');
6687
6687
  const stats = getRoutingStats(process.cwd());
6688
6688
  if (stats.totalObservations < 20) {
6689
6689
  console.log(` Need more data: ${stats.totalObservations}/20 observations before recommendations.`);
@@ -6699,8 +6699,8 @@ async function main() {
6699
6699
  }
6700
6700
 
6701
6701
  if (cmd === 'stats' || cmd === 'intelligence') {
6702
- const { getRoutingStats } = await import('../src/routing-advisor.mjs');
6703
- const { getThinkingStats } = await import('../src/think-engine.mjs');
6702
+ const { getRoutingStats } = await import('../dist/src/routing-advisor.js');
6703
+ const { getThinkingStats } = await import('../dist/src/think-engine.js');
6704
6704
  const stats = getRoutingStats(process.cwd());
6705
6705
  const thinkStats = getThinkingStats(process.cwd());
6706
6706
 
@@ -6730,13 +6730,13 @@ async function main() {
6730
6730
  }
6731
6731
 
6732
6732
  if (cmd === 'revert' || cmd === 'undo') {
6733
- const { runRevert } = await import('../src/revert.mjs');
6733
+ const { runRevert } = await import('../dist/src/revert.js');
6734
6734
  await runRevert(process.cwd());
6735
6735
  return;
6736
6736
  }
6737
6737
 
6738
6738
  if (cmd === 'strategies') {
6739
- const { listStrategies } = await import('../src/strategy.mjs');
6739
+ const { listStrategies } = await import('../dist/src/strategy.js');
6740
6740
  const strats = listStrategies();
6741
6741
  console.log('\n Available dispatch strategies:\n');
6742
6742
  for (const s of strats) {
@@ -6787,7 +6787,7 @@ async function main() {
6787
6787
  process.exit(1);
6788
6788
  }
6789
6789
 
6790
- const { searchSessions, buildSessionIndex } = await import('../src/session.mjs');
6790
+ const { searchSessions, buildSessionIndex } = await import('../dist/src/session.js');
6791
6791
  const cwd = process.cwd();
6792
6792
  try { buildSessionIndex(cwd); } catch {}
6793
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 {};