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,222 @@
1
+ /**
2
+ * debrief.ts — Agent debrief parsing, integration, and wave summarization.
3
+ */
4
+ // ─── Constants ───────────────────────────────────────────────────────────────
5
+ const STATUSES = ['success', 'partial', 'blocked', 'pivoted'];
6
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
7
+ function emptyDebrief() {
8
+ return {
9
+ status: 'partial',
10
+ findings: [],
11
+ blockers: [],
12
+ scopeChange: 'same',
13
+ confidence: 0.5,
14
+ recommendations: [],
15
+ artifacts: { filesChanged: [], filesRead: [], testsRun: 0 },
16
+ pivotReason: undefined,
17
+ unexpectedFindings: [],
18
+ };
19
+ }
20
+ // ─── Parse debrief from raw agent output ─────────────────────────────────────
21
+ const FILE_PATH_RE = /(?:^|\s)([\w./-]+\.(?:mjs|js|ts|tsx|json|md|py|sh|yaml|yml|css|html))/gm;
22
+ const TEST_COUNT_RE = /(\d+)\s*(?:tests?|specs?|assertions?)\s*(?:passed|ran|run|succeeded|ok)/i;
23
+ function extractByPatterns(text, patterns, minLen, maxLen, limit) {
24
+ const results = [];
25
+ for (const re of patterns) {
26
+ for (const m of text.matchAll(re)) {
27
+ const v = m[1].trim();
28
+ if (v.length > minLen && v.length < maxLen)
29
+ results.push(v);
30
+ }
31
+ }
32
+ return [...new Set(results)].slice(0, limit);
33
+ }
34
+ const extractFindings = (t) => extractByPatterns(t, [
35
+ /(?:found|discovered|identified|noticed|see that|observed)\s+(?:that\s+)?(.+?)(?:\.|$)/gim,
36
+ /^[-•*]\s*(.+)$/gm,
37
+ ], 10, 300, 20);
38
+ const extractBlockers = (t) => extractByPatterns(t, [
39
+ /(?:blocked by|couldn't|cannot|unable to|failed to|can't)\s+(.+?)(?:\.|$)/gim,
40
+ /(?:blocker|obstacle|issue|problem):\s*(.+?)(?:\.|$)/gim,
41
+ ], 5, 200, 10);
42
+ const extractRecommendations = (t) => extractByPatterns(t, [
43
+ /(?:recommend|suggest|should|next step|consider)\s+(.+?)(?:\.|$)/gim,
44
+ /(?:TODO|ACTION):\s*(.+?)(?:\.|$)/gim,
45
+ ], 5, 200, 10);
46
+ const extractUnexpected = (t) => extractByPatterns(t, [
47
+ /(?:also noticed|unexpected|surprisingly|interestingly|aside:)\s+(.+?)(?:\.|$)/gim,
48
+ ], 10, 200, 5);
49
+ function inferStatus(text, blockers, findings) {
50
+ const lower = text.toLowerCase();
51
+ if (/pivoted|changed approach|switched to/i.test(lower))
52
+ return 'pivoted';
53
+ if (blockers.length > 0 && findings.length === 0)
54
+ return 'blocked';
55
+ if (blockers.length > 0)
56
+ return 'partial';
57
+ if (/complete|done|success|finished|all (?:tests )?pass/i.test(lower))
58
+ return 'success';
59
+ return 'partial';
60
+ }
61
+ function inferScopeChange(text) {
62
+ const lower = text.toLowerCase();
63
+ if (/scope.{0,20}(?:grew|larger|expanded|more than expected)/i.test(lower))
64
+ return 'larger';
65
+ if (/scope.{0,20}(?:smaller|reduced|simpler than)/i.test(lower))
66
+ return 'smaller';
67
+ if (/(?:different approach|completely different|pivoted to)/i.test(lower))
68
+ return 'different';
69
+ return 'same';
70
+ }
71
+ function inferConfidence(text, findings, blockers) {
72
+ if (/(?:very confident|high confidence|certain)/i.test(text))
73
+ return 0.9;
74
+ if (/(?:uncertain|not sure|low confidence|unsure)/i.test(text))
75
+ return 0.3;
76
+ if (blockers.length > 2)
77
+ return 0.3;
78
+ if (blockers.length > 0)
79
+ return 0.5;
80
+ if (findings.length > 3)
81
+ return 0.8;
82
+ return 0.6;
83
+ }
84
+ // ─── Exports ─────────────────────────────────────────────────────────────────
85
+ export function parseDebrief(rawOutput) {
86
+ if (!rawOutput || typeof rawOutput !== 'string')
87
+ return emptyDebrief();
88
+ // Try JSON-structured debrief first
89
+ const jsonMatch = rawOutput.match(/```(?:json)?\s*(\{[\s\S]*?"status"[\s\S]*?\})\s*```/);
90
+ if (jsonMatch) {
91
+ try {
92
+ const parsed = JSON.parse(jsonMatch[1]);
93
+ if (parsed.status && STATUSES.includes(parsed.status)) {
94
+ const d = emptyDebrief();
95
+ return {
96
+ ...d,
97
+ ...parsed,
98
+ artifacts: { ...d.artifacts, ...(parsed.artifacts || {}) },
99
+ };
100
+ }
101
+ }
102
+ catch { /* fall through to prose extraction */ }
103
+ }
104
+ // Best-effort extraction from prose
105
+ const findings = extractFindings(rawOutput);
106
+ const blockers = extractBlockers(rawOutput);
107
+ const recommendations = extractRecommendations(rawOutput);
108
+ const unexpectedFindings = extractUnexpected(rawOutput);
109
+ const filesAll = [...rawOutput.matchAll(FILE_PATH_RE)].map(m => m[1]);
110
+ const lower = rawOutput.toLowerCase();
111
+ const filesChanged = filesAll.filter(f => lower.includes(`wrote ${f.toLowerCase()}`) || lower.includes(`created ${f.toLowerCase()}`) || lower.includes(`modified ${f.toLowerCase()}`) || lower.includes(`edited ${f.toLowerCase()}`));
112
+ const filesRead = filesAll.filter(f => !filesChanged.includes(f));
113
+ const testMatch = rawOutput.match(TEST_COUNT_RE);
114
+ const testsRun = testMatch ? parseInt(testMatch[1], 10) : 0;
115
+ const pivotMatch = rawOutput.match(/pivoted?\s+(?:because|since|due to)\s+(.+?)(?:\.|$)/i);
116
+ return {
117
+ status: inferStatus(rawOutput, blockers, findings),
118
+ findings,
119
+ blockers,
120
+ scopeChange: inferScopeChange(rawOutput),
121
+ confidence: inferConfidence(rawOutput, findings, blockers),
122
+ recommendations,
123
+ artifacts: { filesChanged, filesRead, testsRun },
124
+ pivotReason: pivotMatch ? pivotMatch[1].trim() : undefined,
125
+ unexpectedFindings,
126
+ };
127
+ }
128
+ // ─── Generate debrief instruction for agent prompts ──────────────────────────
129
+ const TIER_EMPHASIS = {
130
+ search: 'Focus on: findings, confidence, unexpectedFindings.',
131
+ execute: 'Focus on: artifacts (filesChanged, testsRun), blockers, scopeChange.',
132
+ think: 'Focus on: recommendations, confidence, pivotReason.',
133
+ };
134
+ export function generateDebriefInstruction(tier, contract) {
135
+ const emphasis = TIER_EMPHASIS[tier] || TIER_EMPHASIS.execute;
136
+ const scope = contract?.scope ? ` Scope: ${contract.scope}.` : '';
137
+ return `\n---\nRESPONSE FORMAT: End your response with a JSON block:\n\`\`\`json\n{"status":"success|partial|blocked|pivoted","findings":[],"blockers":[],"scopeChange":"same|larger|smaller|different","confidence":0.0-1.0,"recommendations":[],"artifacts":{"filesChanged":[],"filesRead":[],"testsRun":0},"pivotReason":"...if pivoted","unexpectedFindings":[]}\n\`\`\`\n${emphasis}${scope}`;
138
+ }
139
+ // ─── Integrate debrief into HEAD's situation model ───────────────────────────
140
+ export function integrateDebrief(currentSituation, debrief) {
141
+ const sit = structuredClone(currentSituation);
142
+ // Update confidence on related ledger entries
143
+ if (!sit.ledger)
144
+ sit.ledger = [];
145
+ for (const finding of debrief.findings) {
146
+ const existing = sit.ledger.find(e => e.topic && finding.toLowerCase().includes(e.topic.toLowerCase()));
147
+ if (existing) {
148
+ existing.confidence = Math.min(1, (existing.confidence || 0.5) + 0.1);
149
+ existing.resolved = true;
150
+ }
151
+ else {
152
+ sit.ledger.push({ topic: finding.slice(0, 80), confidence: debrief.confidence, resolved: false });
153
+ }
154
+ }
155
+ // Blockers create new uncertainty entries
156
+ for (const blocker of debrief.blockers) {
157
+ sit.ledger.push({ topic: blocker.slice(0, 80), confidence: 0.3, resolved: false, isBlocker: true });
158
+ }
159
+ // Scope delta
160
+ if (debrief.scopeChange !== 'same') {
161
+ if (!sit.material)
162
+ sit.material = {};
163
+ sit.material.scopeTrend = debrief.scopeChange;
164
+ if (debrief.artifacts?.filesChanged) {
165
+ sit.material.touchedFiles = [
166
+ ...new Set([...(sit.material.touchedFiles || []), ...debrief.artifacts.filesChanged]),
167
+ ];
168
+ }
169
+ }
170
+ // Recommendations -> next wave planning
171
+ if (!sit.nextActions)
172
+ sit.nextActions = [];
173
+ sit.nextActions.push(...debrief.recommendations);
174
+ // Unexpected findings -> noticings
175
+ if (debrief.unexpectedFindings?.length) {
176
+ if (!sit.noticings)
177
+ sit.noticings = [];
178
+ sit.noticings.push(...debrief.unexpectedFindings);
179
+ }
180
+ // Overall confidence update
181
+ sit.confidence = sit.confidence
182
+ ? sit.confidence * 0.7 + debrief.confidence * 0.3
183
+ : debrief.confidence;
184
+ return sit;
185
+ }
186
+ // ─── Summarize a parallel wave of debriefs ───────────────────────────────────
187
+ export function summarizeWaveOutcome(debriefs) {
188
+ if (!debriefs || debriefs.length === 0) {
189
+ return {
190
+ overallStatus: 'blocked',
191
+ aggregateConfidence: 0,
192
+ allFindings: [],
193
+ allBlockers: [],
194
+ scopeDelta: 'same',
195
+ nextActions: [],
196
+ };
197
+ }
198
+ const statusPriority = { blocked: 0, pivoted: 1, partial: 2, success: 3 };
199
+ const worstStatus = debriefs.reduce((worst, d) => (statusPriority[d.status] ?? 2) < (statusPriority[worst] ?? 2) ? d.status : worst, 'success');
200
+ const allFindings = [...new Set(debriefs.flatMap(d => d.findings || []))];
201
+ const allBlockers = [...new Set(debriefs.flatMap(d => d.blockers || []))];
202
+ const nextActions = [...new Set(debriefs.flatMap(d => d.recommendations || []))];
203
+ const aggregateConfidence = debriefs.reduce((sum, d) => sum + (d.confidence || 0.5), 0) / debriefs.length;
204
+ // Scope: any non-same scope wins, larger beats smaller, different beats all
205
+ const scopeDeltas = debriefs.map(d => d.scopeChange || 'same').filter(s => s !== 'same');
206
+ let scopeDelta = 'same';
207
+ if (scopeDeltas.includes('different'))
208
+ scopeDelta = 'different';
209
+ else if (scopeDeltas.includes('larger'))
210
+ scopeDelta = 'larger';
211
+ else if (scopeDeltas.includes('smaller'))
212
+ scopeDelta = 'smaller';
213
+ return {
214
+ overallStatus: worstStatus,
215
+ aggregateConfidence: Math.round(aggregateConfidence * 100) / 100,
216
+ allFindings,
217
+ allBlockers,
218
+ scopeDelta,
219
+ nextActions,
220
+ };
221
+ }
222
+ //# sourceMappingURL=debrief.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debrief.js","sourceRoot":"","sources":["../../src/debrief.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * decide.ts — Routing decision module for the Dual-Brain Orchestrator.
4
+ *
5
+ * Given a task detection + user profile, decides which provider/model/effort/mode
6
+ * to use and explains why in one sentence.
7
+ *
8
+ * Exports: decideRoute, getModelCapabilities, getAvailableModels,
9
+ * WORK_STYLES, getWorkStyle, estimateBudgetPressure,
10
+ * shouldDualBrain, explainDecision, getFailoverOrder
11
+ */
12
+ export interface WorkStyleDef {
13
+ label: string;
14
+ defaultWorker: string;
15
+ complexWorker: string;
16
+ challengerPolicy: 'never' | 'high-risk' | 'medium-risk';
17
+ checkpointPolicy: 'never' | 'risky-ops' | 'all-edits';
18
+ reviewPolicy: string;
19
+ description: string;
20
+ }
21
+ export declare const WORK_STYLES: Record<string, WorkStyleDef>;
22
+ export interface WorkStyleWithKey extends WorkStyleDef {
23
+ key: string;
24
+ }
25
+ export declare function getWorkStyle(profile: {
26
+ workStyle?: string;
27
+ work_style?: string;
28
+ } | undefined): WorkStyleWithKey;
29
+ interface ModelCapability {
30
+ provider: string;
31
+ tierFit: string[];
32
+ contextWindow: number;
33
+ strengths: string[];
34
+ weaknesses: string[];
35
+ effortLevels: string[] | null;
36
+ costTier: string;
37
+ }
38
+ export declare function getModelCapabilities(model: string): ModelCapability | null;
39
+ export declare function getAvailableModels(profile: {
40
+ providers?: Record<string, {
41
+ enabled?: boolean;
42
+ models?: string[];
43
+ }>;
44
+ }): {
45
+ claude: string[];
46
+ openai: string[];
47
+ };
48
+ export declare function estimateBudgetPressure(_profile: unknown, _cwd?: string): {
49
+ claude: number;
50
+ openai: number;
51
+ };
52
+ export declare function shouldDualBrain(detection: {
53
+ intent?: string;
54
+ risk?: string;
55
+ complexity?: string;
56
+ designImpact?: boolean;
57
+ }, profile: {
58
+ dual_brain_enabled?: boolean;
59
+ providers?: Record<string, {
60
+ enabled?: boolean;
61
+ plan?: string;
62
+ }>;
63
+ }): boolean;
64
+ export declare function explainDecision(decision: Record<string, unknown>, detection: Record<string, unknown>, profile: Record<string, unknown>): string;
65
+ export interface PreferenceSignals {
66
+ biasOverride: 'cost-saver' | 'quality-first' | null;
67
+ preferProvider: 'claude' | 'openai' | null;
68
+ avoidProvider: 'claude' | 'openai' | null;
69
+ alwaysDualBrain: boolean;
70
+ neverDualBrain: boolean;
71
+ preferModel: string | null;
72
+ }
73
+ export declare function parsePreferences(preferences: Array<{
74
+ text: string;
75
+ enabled: boolean;
76
+ scope: string;
77
+ }> | undefined): PreferenceSignals;
78
+ export declare function decideRoute({ profile, detection, cwd, thinkResult, sessionContext }?: {
79
+ profile?: Record<string, unknown>;
80
+ detection?: Record<string, unknown>;
81
+ cwd?: string;
82
+ thinkResult?: {
83
+ tier?: string;
84
+ } | null;
85
+ sessionContext?: Record<string, unknown> | null;
86
+ }): Record<string, unknown>;
87
+ export declare function getFailoverOrder(decision: {
88
+ provider: string;
89
+ model: string;
90
+ tier?: string;
91
+ }, profile: Record<string, unknown>): Array<{
92
+ provider: string;
93
+ model: string;
94
+ label: string;
95
+ }>;
96
+ export {};