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
@@ -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 {};