dual-brain 0.2.30 → 0.3.1

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 (312) 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/precompact.mjs +3 -3
  240. package/hooks/session-end.mjs +3 -3
  241. package/hooks/task-classifier.mjs +328 -0
  242. package/hooks/vibe-router.mjs +387 -0
  243. package/install.mjs +2 -2
  244. package/package.json +29 -153
  245. package/src/agents/registry.mjs +0 -405
  246. package/src/awareness.mjs +0 -425
  247. package/src/brief.mjs +0 -266
  248. package/src/calibration.mjs +0 -148
  249. package/src/checkpoint.mjs +0 -109
  250. package/src/ci-triage.mjs +0 -191
  251. package/src/cognitive-loop.mjs +0 -562
  252. package/src/collaboration.mjs +0 -545
  253. package/src/context-intel.mjs +0 -158
  254. package/src/context.mjs +0 -389
  255. package/src/continuity.mjs +0 -298
  256. package/src/cost-tracker.mjs +0 -184
  257. package/src/debrief.mjs +0 -228
  258. package/src/decide.mjs +0 -1099
  259. package/src/decompose.mjs +0 -331
  260. package/src/detect.mjs +0 -702
  261. package/src/dispatch.mjs +0 -1447
  262. package/src/doctor.mjs +0 -1607
  263. package/src/envelope.mjs +0 -139
  264. package/src/failure-memory.mjs +0 -178
  265. package/src/fx.mjs +0 -276
  266. package/src/governance.mjs +0 -279
  267. package/src/handoff.mjs +0 -87
  268. package/src/head-protocol.mjs +0 -128
  269. package/src/head.mjs +0 -952
  270. package/src/health.mjs +0 -528
  271. package/src/inbox.mjs +0 -195
  272. package/src/index.mjs +0 -44
  273. package/src/install-hooks.mjs +0 -100
  274. package/src/integrity.mjs +0 -245
  275. package/src/intelligence.mjs +0 -447
  276. package/src/ledger.mjs +0 -196
  277. package/src/living-docs.mjs +0 -210
  278. package/src/memory-tiers.mjs +0 -193
  279. package/src/models.mjs +0 -363
  280. package/src/narrative.mjs +0 -169
  281. package/src/nextstep.mjs +0 -100
  282. package/src/observer.mjs +0 -241
  283. package/src/outcome.mjs +0 -400
  284. package/src/pipeline.mjs +0 -1711
  285. package/src/playbook.mjs +0 -257
  286. package/src/pr-agent.mjs +0 -214
  287. package/src/predictive.mjs +0 -250
  288. package/src/profile.mjs +0 -1411
  289. package/src/prompt-audit.mjs +0 -231
  290. package/src/prompt-intel.mjs +0 -325
  291. package/src/provider-context.mjs +0 -257
  292. package/src/receipt.mjs +0 -344
  293. package/src/recommendations.mjs +0 -296
  294. package/src/redact.mjs +0 -192
  295. package/src/replit.mjs +0 -1210
  296. package/src/repo.mjs +0 -445
  297. package/src/revert.mjs +0 -149
  298. package/src/routing-advisor.mjs +0 -204
  299. package/src/self-correct.mjs +0 -147
  300. package/src/session-lock.mjs +0 -160
  301. package/src/session.mjs +0 -1655
  302. package/src/settings-tui.mjs +0 -373
  303. package/src/setup-flow.mjs +0 -223
  304. package/src/signal.mjs +0 -115
  305. package/src/simmer.mjs +0 -241
  306. package/src/strategy.mjs +0 -235
  307. package/src/subscription.mjs +0 -212
  308. package/src/templates.mjs +0 -260
  309. package/src/think-engine.mjs +0 -428
  310. package/src/tui.mjs +0 -276
  311. package/src/update-check.mjs +0 -35
  312. package/src/wave-planner.mjs +0 -294
@@ -0,0 +1,281 @@
1
+ // Wave Planner — Layer 2 cognitive loop
2
+ // Takes HEAD's deliberation output and produces structured wave-based execution plans.
3
+ const TIER_COST = {
4
+ search: { tokens: 5000, time: '~10s' },
5
+ execute: { tokens: 20000, time: '~45s' },
6
+ think: { tokens: 15000, time: '~30s' },
7
+ review: { tokens: 10000, time: '~20s' },
8
+ };
9
+ let waveCounter = 0;
10
+ function nextWaveId() { return `w-${Date.now().toString(36)}-${++waveCounter}`; }
11
+ /** Plan waves from HEAD's deliberation output. */
12
+ export function planWaves(deliberation, context = {}) {
13
+ const { situation = {}, uncertainties = [], result = {} } = deliberation;
14
+ const { files = [], priorDebriefs = [], diagnosticPatterns = [] } = context;
15
+ const depth = result.depth || 'light';
16
+ const blockers = uncertainties.filter((u) => u.confidence < 0.3);
17
+ const hasFragile = situation.risk === 'high' || situation.risk === 'critical';
18
+ const largeScope = situation.scope === 'large';
19
+ const priorBlockers = priorDebriefs.filter((d) => d.blockers?.length);
20
+ const waves = [];
21
+ const contingencies = [];
22
+ // Determine wave structure based on depth
23
+ if (depth === 'reflexive' || depth === 'light') {
24
+ waves.push(makeSingleWave(result, situation, files));
25
+ }
26
+ else if (depth === 'full') {
27
+ if (blockers.length) {
28
+ waves.push(makeReconWave(blockers, situation, files, priorBlockers));
29
+ }
30
+ waves.push(makeImplementWave(result, situation, files, largeScope, waves));
31
+ if (hasFragile) {
32
+ waves.push(makeVerifyWave(situation, files, waves));
33
+ }
34
+ }
35
+ else if (depth === 'deep') {
36
+ // Always start with recon for deep
37
+ waves.push(makeReconWave(blockers.length ? blockers : uncertainties, situation, files, priorBlockers));
38
+ // Plan wave
39
+ waves.push({
40
+ id: nextWaveId(),
41
+ phase: 'synthesize',
42
+ agents: [{
43
+ tier: 'think',
44
+ objective: `Synthesize recon findings into implementation plan for: ${result.action || situation.taskShape || 'task'}`,
45
+ scope: files.slice(0, 10),
46
+ }],
47
+ dependsOn: [waves[0].id],
48
+ gateCondition: 'recon wave completed without escalation',
49
+ parallel: false,
50
+ });
51
+ // Implement wave
52
+ waves.push(makeImplementWave(result, situation, files, largeScope, waves));
53
+ // Verify wave
54
+ waves.push(makeVerifyWave(situation, files, waves));
55
+ }
56
+ // Force recon-first if blockers exist and first wave isn't recon
57
+ if (blockers.length && waves.length && waves[0].phase !== 'recon') {
58
+ const reconWave = makeReconWave(blockers, situation, files, priorBlockers);
59
+ waves.forEach(w => { if (!w.dependsOn.length)
60
+ w.dependsOn.push(reconWave.id); });
61
+ waves.unshift(reconWave);
62
+ }
63
+ // Build contingencies
64
+ if (largeScope) {
65
+ contingencies.push({
66
+ trigger: 'if wave 1 finds scope is larger than expected',
67
+ response: 'add-wave',
68
+ details: 'Split implementation into additional parallel waves by file group',
69
+ });
70
+ }
71
+ if (hasFragile) {
72
+ contingencies.push({
73
+ trigger: 'if implementation wave introduces regressions',
74
+ response: 'retry-different',
75
+ details: 'Re-approach with smaller incremental changes',
76
+ });
77
+ }
78
+ if (blockers.length) {
79
+ contingencies.push({
80
+ trigger: 'if recon cannot resolve uncertainty',
81
+ response: 'escalate',
82
+ details: 'Ask user for clarification before proceeding',
83
+ });
84
+ }
85
+ const agentCount = waves.reduce((n, w) => n + w.agents.length, 0);
86
+ const dominantTier = agentCount <= 1 ? (waves[0]?.agents[0]?.tier || 'search')
87
+ : waves.flatMap((w) => w.agents.map((a) => a.tier))
88
+ .sort((a, b) => (TIER_COST[b]?.tokens ?? 0) - (TIER_COST[a]?.tokens ?? 0))[0];
89
+ return {
90
+ waves,
91
+ rationale: buildRationale(depth, blockers, hasFragile, largeScope),
92
+ estimatedCost: { waves: waves.length, agents: agentCount, tier: dominantTier },
93
+ contingencies,
94
+ };
95
+ }
96
+ /** Decide if the remaining plan is still valid after a wave debrief. */
97
+ export function shouldReplan(currentPlan, newDebrief) {
98
+ if (!newDebrief)
99
+ return false;
100
+ if (newDebrief.scopeChange === 'larger' || newDebrief.scopeChange === 'different')
101
+ return true;
102
+ if (newDebrief.pivotReason)
103
+ return true;
104
+ if (newDebrief.confidence !== undefined && newDebrief.confidence < 0.4)
105
+ return true;
106
+ // Check if blockers intersect with upcoming wave objectives
107
+ const blockersList = newDebrief.blockers;
108
+ if (blockersList?.length) {
109
+ const planWaves = currentPlan.waves;
110
+ const remaining = (planWaves ?? []).filter((w) => !w.completed);
111
+ for (const w of remaining) {
112
+ for (const agent of w.agents) {
113
+ for (const blocker of blockersList) {
114
+ const bLower = (typeof blocker === 'string' ? blocker : blocker.description || '').toLowerCase();
115
+ if (bLower && agent.objective.toLowerCase().includes(bLower.split(' ')[0]))
116
+ return true;
117
+ }
118
+ }
119
+ }
120
+ }
121
+ return false;
122
+ }
123
+ /** Produce a new plan incorporating what was learned. Preserves completed waves. */
124
+ export function replan(currentPlan, waveSummary, originalDeliberation) {
125
+ const planWavesArr = (currentPlan.waves ?? []);
126
+ const completed = planWavesArr.filter((w) => w.completed);
127
+ const context = {
128
+ files: waveSummary.filesDiscovered || [],
129
+ priorDebriefs: [waveSummary],
130
+ diagnosticPatterns: waveSummary.patterns || [],
131
+ };
132
+ // Merge learning into deliberation
133
+ const updated = { ...originalDeliberation };
134
+ if (waveSummary.scopeChange === 'larger') {
135
+ updated.situation = { ...updated.situation, scope: 'large' };
136
+ }
137
+ if (waveSummary.confidence !== undefined) {
138
+ updated.result = { ...updated.result, confidence: waveSummary.confidence };
139
+ }
140
+ if (waveSummary.newUncertainties) {
141
+ updated.uncertainties = [
142
+ ...(updated.uncertainties || []),
143
+ ...waveSummary.newUncertainties,
144
+ ];
145
+ }
146
+ const newPlan = planWaves(updated, context);
147
+ // Preserve completed waves at the front
148
+ newPlan.waves = [...completed, ...newPlan.waves];
149
+ newPlan.rationale = `Replanned after wave debrief: ${waveSummary.pivotReason || waveSummary.scopeChange || 'confidence drop'}. ${newPlan.rationale}`;
150
+ return newPlan;
151
+ }
152
+ /** Rough cost estimate for a single wave. */
153
+ export function estimateWaveCost(wave) {
154
+ let tokens = 0;
155
+ for (const agent of wave.agents) {
156
+ tokens += TIER_COST[agent.tier]?.tokens || 10000;
157
+ }
158
+ // Time: parallel agents overlap, sequential add up
159
+ const times = wave.agents.map((a) => parseInt(TIER_COST[a.tier]?.time) || 20);
160
+ const seconds = wave.parallel ? Math.max(...times) : times.reduce((s, t) => s + t, 0);
161
+ return { tokens, time: `~${seconds}s` };
162
+ }
163
+ function makeSingleWave(result, situation, files) {
164
+ const tier = mapActionToTier(result.action);
165
+ return {
166
+ id: nextWaveId(),
167
+ phase: tier === 'search' ? 'recon' : 'implement',
168
+ agents: [{
169
+ tier,
170
+ objective: situation.explicitAsk || situation.raw || (typeof result.action === 'string' ? result.action : result.action?.mode) || 'execute task',
171
+ scope: files.slice(0, 5),
172
+ }],
173
+ dependsOn: [],
174
+ parallel: false,
175
+ };
176
+ }
177
+ function makeReconWave(uncertainties, situation, files, priorBlockers) {
178
+ const avoidApproaches = priorBlockers.flatMap((d) => d.blockers?.map((b) => typeof b === 'string' ? b : b.approach) || []);
179
+ const agents = uncertainties.slice(0, 3).map((u) => {
180
+ const spec = {
181
+ tier: 'search',
182
+ objective: `Resolve uncertainty: ${u.claim || u.description || 'unknown'}`,
183
+ scope: files.slice(0, 5),
184
+ };
185
+ if (u.wouldChangeIf) {
186
+ spec.conditionalPivot = { if: u.wouldChangeIf, then: 'report finding and stop' };
187
+ }
188
+ return spec;
189
+ });
190
+ // If no uncertainties provided, add a general recon agent
191
+ if (!agents.length) {
192
+ agents.push({
193
+ tier: 'search',
194
+ objective: `Explore scope and structure for: ${situation.taskShape || 'task'}`,
195
+ scope: files.slice(0, 5),
196
+ });
197
+ }
198
+ // Annotate agents to avoid prior failed approaches
199
+ if (avoidApproaches.length) {
200
+ for (const agent of agents) {
201
+ agent.objective += ` (avoid: ${avoidApproaches.join(', ')})`;
202
+ }
203
+ }
204
+ return {
205
+ id: nextWaveId(),
206
+ phase: 'recon',
207
+ agents,
208
+ dependsOn: [],
209
+ gateCondition: undefined,
210
+ parallel: agents.length > 1,
211
+ };
212
+ }
213
+ function makeImplementWave(result, situation, files, largeScope, existingWaves) {
214
+ const dependsOn = existingWaves.length ? [existingWaves[existingWaves.length - 1].id] : [];
215
+ const agents = [];
216
+ if (largeScope && files.length > 3) {
217
+ // Split into parallel agents by file group
218
+ const groupSize = Math.ceil(files.length / 3);
219
+ for (let i = 0; i < files.length; i += groupSize) {
220
+ agents.push({
221
+ tier: 'execute',
222
+ objective: result.action || `Implement changes in file group ${Math.floor(i / groupSize) + 1}`,
223
+ scope: files.slice(i, i + groupSize),
224
+ });
225
+ }
226
+ }
227
+ else {
228
+ agents.push({
229
+ tier: 'execute',
230
+ objective: result.action || situation.taskShape || 'implement changes',
231
+ scope: files.slice(0, 10),
232
+ });
233
+ }
234
+ return {
235
+ id: nextWaveId(),
236
+ phase: 'implement',
237
+ agents,
238
+ dependsOn,
239
+ gateCondition: existingWaves.length ? 'prior wave completed successfully' : undefined,
240
+ parallel: agents.length > 1,
241
+ };
242
+ }
243
+ function makeVerifyWave(situation, files, existingWaves) {
244
+ const dependsOn = existingWaves.length ? [existingWaves[existingWaves.length - 1].id] : [];
245
+ return {
246
+ id: nextWaveId(),
247
+ phase: 'verify',
248
+ agents: [{
249
+ tier: 'review',
250
+ objective: `Verify changes are correct and safe${situation.risk === 'critical' ? ' — critical risk area' : ''}`,
251
+ scope: files.slice(0, 10),
252
+ }],
253
+ dependsOn,
254
+ gateCondition: 'implementation wave completed',
255
+ parallel: false,
256
+ };
257
+ }
258
+ function mapActionToTier(action) {
259
+ if (!action)
260
+ return 'execute';
261
+ const actionObj = action;
262
+ const a = (typeof action === 'string' ? action : `${actionObj.type || ''} ${actionObj.mode || ''}`).toLowerCase();
263
+ if (a.includes('search') || a.includes('find') || a.includes('look') || a.includes('explore'))
264
+ return 'search';
265
+ if (a.includes('review') || a.includes('check') || a.includes('verify'))
266
+ return 'review';
267
+ if (a.includes('think') || a.includes('plan') || a.includes('design') || a.includes('architect'))
268
+ return 'think';
269
+ return 'execute';
270
+ }
271
+ function buildRationale(depth, blockers, hasFragile, largeScope) {
272
+ const parts = [`Depth: ${depth}.`];
273
+ if (blockers.length)
274
+ parts.push(`${blockers.length} blocker(s) require recon first.`);
275
+ if (hasFragile)
276
+ parts.push('High-risk area — verification wave added.');
277
+ if (largeScope)
278
+ parts.push('Large scope — parallel agents where possible.');
279
+ return parts.join(' ');
280
+ }
281
+ //# sourceMappingURL=wave-planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wave-planner.js","sourceRoot":"","sources":["../../src/wave-planner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env bash
2
+ # head-guard.sh — DEPRECATED. Replaced by head-guard.mjs.
3
+ #
4
+ # This file is kept for reference only. It never worked correctly because it
5
+ # reads CLAUDE_TOOL_NAME from the environment, but Claude Code delivers tool
6
+ # info via stdin JSON, not environment variables.
7
+ #
8
+ # The replacement (head-guard.mjs) reads stdin JSON, detects HEAD vs subagent
9
+ # via `agent_id`, and returns the correct permissionDecision block format.
10
+ #
11
+ # Do not use this file. See hooks/head-guard.mjs instead.
12
+
13
+ BLOCK_MSG='[dual-brain] HEAD cannot use this tool directly. Dispatch via: dual-brain go "task description"'
14
+
15
+ # ── 1. Role check ────────────────────────────────────────────────────────────
16
+ # Only enforce when the session has been explicitly marked as the HEAD agent.
17
+ # If the env var is unset we allow everything (backward compat for non-dual-brain usage).
18
+
19
+ if [[ -z "${DUAL_BRAIN_ROLE}" ]]; then
20
+ exit 0
21
+ fi
22
+
23
+ if [[ "${DUAL_BRAIN_ROLE}" != "head" ]]; then
24
+ # Work-agent session — no restrictions.
25
+ exit 0
26
+ fi
27
+
28
+ # ── 2. Tool name check ───────────────────────────────────────────────────────
29
+ TOOL="${CLAUDE_TOOL_NAME:-}"
30
+
31
+ # Block direct file-editing tools and Bash unconditionally for HEAD.
32
+ # HEAD should use Read tool for reading and Agent (via dual-brain go) for all other work.
33
+ case "${TOOL}" in
34
+ Edit|Write|NotebookEdit|Bash)
35
+ echo "${BLOCK_MSG}" >&2
36
+ exit 2
37
+ ;;
38
+ esac
39
+
40
+ # ── 3. Default: allow ────────────────────────────────────────────────────────
41
+ exit 0
@@ -3,9 +3,9 @@
3
3
  // Ensures HEAD's running narrative, simmer buffer, and loop state survive
4
4
  // context window compression without loss.
5
5
 
6
- import { persist as persistNarrative, load as loadNarrative } from '../src/narrative.mjs';
7
- import { active as activeSimmer, prune as pruneSimmer } from '../src/simmer.mjs';
8
- import { getLoopStatus } from '../src/cognitive-loop.mjs';
6
+ import { persist as persistNarrative, load as loadNarrative } from '../dist/src/narrative.js';
7
+ import { active as activeSimmer, prune as pruneSimmer } from '../dist/src/simmer.js';
8
+ import { getLoopStatus } from '../dist/src/cognitive-loop.js';
9
9
  import { existsSync, writeFileSync, mkdirSync } from 'node:fs';
10
10
  import { join } from 'node:path';
11
11
 
@@ -95,9 +95,9 @@ async function run() {
95
95
 
96
96
  // 6. Persist immersion state and release session lock
97
97
  try {
98
- const { persist } = await import('../src/narrative.mjs');
99
- const { prune } = await import('../src/simmer.mjs');
100
- const { release } = await import('../src/session-lock.mjs');
98
+ const { persist } = await import('../dist/src/narrative.js');
99
+ const { prune } = await import('../dist/src/simmer.js');
100
+ const { release } = await import('../dist/src/session-lock.js');
101
101
  persist();
102
102
  prune();
103
103
  release();