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,391 @@
1
+ /**
2
+ * intelligence.ts — Situational awareness for every pipeline run.
3
+ * Reads project reality fresh, derives task context, and detects contradictions
4
+ * between what an agent plans to do and what is actually true.
5
+ */
6
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
7
+ import { execSync } from 'node:child_process';
8
+ import { join } from 'node:path';
9
+ const PROTECTED_PATHS = [
10
+ 'src/pipeline.mjs',
11
+ 'src/dispatch.mjs',
12
+ 'src/decide.mjs',
13
+ '.claude/hooks/head-guard.mjs',
14
+ ];
15
+ // --- Git helpers ---
16
+ function safeExec(cmd, cwd) {
17
+ try {
18
+ return execSync(cmd, { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
19
+ }
20
+ catch {
21
+ return '';
22
+ }
23
+ }
24
+ function getDirtyFiles(cwd) {
25
+ const raw = safeExec('git status --porcelain', cwd);
26
+ if (!raw)
27
+ return [];
28
+ return raw
29
+ .split('\n')
30
+ .filter(l => l.trim())
31
+ .map(l => l.slice(3).trim().replace(/^"(.*)"$/, '$1'))
32
+ .filter(Boolean);
33
+ }
34
+ function getRecentCommits(cwd, n = 5) {
35
+ const raw = safeExec(`git log -${n} --pretty=format:%s`, cwd);
36
+ if (!raw)
37
+ return [];
38
+ return raw.split('\n').filter(Boolean);
39
+ }
40
+ function getAheadCount(cwd) {
41
+ const raw = safeExec('git rev-list --count @{u}..HEAD', cwd);
42
+ const n = parseInt(raw, 10);
43
+ return isNaN(n) ? 0 : n;
44
+ }
45
+ function getCurrentBranch(cwd) {
46
+ return safeExec('git branch --show-current', cwd) || 'unknown';
47
+ }
48
+ function readRecentFailures(cwd, limit = 10) {
49
+ const path = join(cwd, '.dualbrain', 'failures.jsonl');
50
+ if (!existsSync(path))
51
+ return [];
52
+ try {
53
+ const lines = readFileSync(path, 'utf8').split('\n').filter(Boolean);
54
+ return lines
55
+ .slice(-limit)
56
+ .reverse()
57
+ .map(line => {
58
+ try {
59
+ return JSON.parse(line);
60
+ }
61
+ catch {
62
+ return null;
63
+ }
64
+ })
65
+ .filter((r) => r !== null && !r.resolved)
66
+ .map(r => ({
67
+ prompt: r.prompt ?? '',
68
+ error: r.error ?? '',
69
+ approach: r.tier ? `${r.tier}/${r.model ?? 'unknown'}` : (r.model ?? 'unknown'),
70
+ timestamp: r.timestamp ?? 0,
71
+ }));
72
+ }
73
+ catch {
74
+ return [];
75
+ }
76
+ }
77
+ function readRecentOutcomes(cwd, limit = 10) {
78
+ const dir = join(cwd, '.dualbrain', 'outcomes');
79
+ if (!existsSync(dir))
80
+ return [];
81
+ try {
82
+ const files = readdirSync(dir)
83
+ .filter(f => f.endsWith('.jsonl'))
84
+ .sort()
85
+ .reverse()
86
+ .slice(0, 3);
87
+ const records = [];
88
+ for (const file of files) {
89
+ try {
90
+ const lines = readFileSync(join(dir, file), 'utf8').split('\n').filter(Boolean);
91
+ for (const line of lines) {
92
+ try {
93
+ const r = JSON.parse(line);
94
+ records.push({
95
+ task: r.prompt ?? '',
96
+ success: r.result?.success ?? false,
97
+ timestamp: r.timestamp ?? 0,
98
+ });
99
+ }
100
+ catch { /* skip bad line */ }
101
+ }
102
+ }
103
+ catch { /* skip unreadable file */ }
104
+ }
105
+ return records
106
+ .sort((a, b) => b.timestamp - a.timestamp)
107
+ .slice(0, limit);
108
+ }
109
+ catch {
110
+ return [];
111
+ }
112
+ }
113
+ function readPackageJson(cwd) {
114
+ try {
115
+ return JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8'));
116
+ }
117
+ catch {
118
+ return {};
119
+ }
120
+ }
121
+ /**
122
+ * Read project reality fresh. No cache. Returns a ProjectBrief.
123
+ */
124
+ export function deriveProjectState(cwd = process.cwd()) {
125
+ const pkg = readPackageJson(cwd);
126
+ const version = pkg.version ?? '0.0.0';
127
+ const versionMajor = parseInt(version.split('.')[0], 10) || 0;
128
+ const dirtyFiles = getDirtyFiles(cwd);
129
+ const recentCommits = getRecentCommits(cwd, 5);
130
+ const branch = getCurrentBranch(cwd);
131
+ const aheadOfRemote = getAheadCount(cwd);
132
+ const binField = pkg.bin ?? {};
133
+ const binValues = Object.values(binField);
134
+ const entryPoint = binValues[0] ?? (pkg.main ?? '');
135
+ const testCommand = pkg.scripts?.test ?? null;
136
+ const recentFailures = readRecentFailures(cwd, 10);
137
+ const recentOutcomes = readRecentOutcomes(cwd, 10);
138
+ return {
139
+ packageName: pkg.name ?? 'unknown',
140
+ version,
141
+ versionMajor,
142
+ description: pkg.description ?? '',
143
+ branch,
144
+ dirty: dirtyFiles.length > 0,
145
+ dirtyFiles,
146
+ recentCommits,
147
+ aheadOfRemote,
148
+ brandName: 'dual-brain',
149
+ cliCommand: 'dual-brain',
150
+ moduleType: pkg.type === 'module' ? 'esm' : 'cjs',
151
+ entryPoint,
152
+ testCommand,
153
+ protectedPaths: PROTECTED_PATHS,
154
+ recentFailures,
155
+ recentOutcomes,
156
+ derivedAt: Date.now(),
157
+ };
158
+ }
159
+ /**
160
+ * Derive task-scoped context from the current prompt and optional session events.
161
+ */
162
+ export function deriveTaskContext(task = '', recentEvents = []) {
163
+ const priorAttempts = [];
164
+ const filesOutOfScope = [];
165
+ const filesInScopeSet = new Set();
166
+ const FILE_RE = /(?:^|\s)((?:src|hooks|bin|scripts|\.claude)\/[\w./\-]+\.\w+)/g;
167
+ let m;
168
+ FILE_RE.lastIndex = 0;
169
+ while ((m = FILE_RE.exec(task)) !== null)
170
+ filesInScopeSet.add(m[1]);
171
+ for (const ev of (recentEvents ?? [])) {
172
+ if (!ev)
173
+ continue;
174
+ if (ev.type === 'failure' || ev.failed) {
175
+ priorAttempts.push({
176
+ approach: ev.approach ?? ev.tier ?? 'unknown',
177
+ failed: true,
178
+ reason: ev.error ?? ev.reason ?? '',
179
+ });
180
+ for (const f of (ev.files ?? ev.filesChanged ?? [])) {
181
+ filesOutOfScope.push(f);
182
+ }
183
+ }
184
+ FILE_RE.lastIndex = 0;
185
+ const evText = JSON.stringify(ev);
186
+ while ((m = FILE_RE.exec(evText)) !== null)
187
+ filesInScopeSet.add(m[1]);
188
+ }
189
+ const failureCount = priorAttempts.filter(a => a.failed).length;
190
+ const escalationLevel = failureCount >= 3 ? 'critical' :
191
+ failureCount >= 1 ? 'elevated' :
192
+ 'normal';
193
+ const constraintKeywords = [];
194
+ const CONSTRAINT_RE = /\b(must|never|always|do not|don't|only|no\s+\w+)\b[^.!?]{0,80}/gi;
195
+ let cm;
196
+ CONSTRAINT_RE.lastIndex = 0;
197
+ while ((cm = CONSTRAINT_RE.exec(task)) !== null) {
198
+ constraintKeywords.push(cm[0].trim());
199
+ }
200
+ return {
201
+ task,
202
+ priorAttempts,
203
+ activeConstraints: constraintKeywords,
204
+ filesInScope: [...filesInScopeSet],
205
+ filesOutOfScope: [...new Set(filesOutOfScope)],
206
+ escalationLevel,
207
+ };
208
+ }
209
+ /**
210
+ * Detect contradictions between project reality, task context, and a proposed plan.
211
+ * Returns an array of contradiction objects.
212
+ */
213
+ export function detectContradictions(projectBrief, taskBrief, plan = {}) {
214
+ const contradictions = [];
215
+ const planDesc = plan.description ?? '';
216
+ const planAssumptions = plan.assumptions ?? {};
217
+ const targetFiles = Array.isArray(plan.targetFiles) ? plan.targetFiles : [];
218
+ // 1. version_mismatch
219
+ const assumedVersion = typeof planAssumptions === 'string'
220
+ ? planAssumptions
221
+ : (planAssumptions.version ?? planAssumptions.packageVersion ?? '');
222
+ if (assumedVersion) {
223
+ const assumedMajor = parseInt(String(assumedVersion).split('.')[0], 10);
224
+ if (!isNaN(assumedMajor) && assumedMajor !== projectBrief.versionMajor) {
225
+ contradictions.push({
226
+ type: 'version_mismatch',
227
+ severity: 'block',
228
+ message: `Plan assumes major version ${assumedMajor} but package is v${projectBrief.versionMajor} (${projectBrief.version})`,
229
+ evidence: { expected: projectBrief.version, actual: assumedVersion },
230
+ });
231
+ }
232
+ }
233
+ // version reference in description
234
+ const versionInDesc = planDesc.match(/\bv?(\d+)\.\d+\.\d+\b/);
235
+ if (versionInDesc) {
236
+ const descMajor = parseInt(versionInDesc[1], 10);
237
+ if (!isNaN(descMajor) && descMajor !== projectBrief.versionMajor) {
238
+ contradictions.push({
239
+ type: 'version_mismatch',
240
+ severity: 'warn',
241
+ message: `Plan description references v${versionInDesc[0]} but package is v${projectBrief.version}`,
242
+ evidence: { expected: projectBrief.version, actual: versionInDesc[0] },
243
+ });
244
+ }
245
+ }
246
+ // 2. branding_error
247
+ const WRONG_NAMES = ['data-tools', 'orchestrator', 'dual_brain', 'dualbrain', 'brain-dual'];
248
+ const searchText = [planDesc, JSON.stringify(planAssumptions)].join(' ').toLowerCase();
249
+ for (const wrongName of WRONG_NAMES) {
250
+ if (searchText.includes(wrongName) && !searchText.includes('dual-brain')) {
251
+ contradictions.push({
252
+ type: 'branding_error',
253
+ severity: 'block',
254
+ message: `Plan references "${wrongName}" but correct package name is "${projectBrief.brandName}"`,
255
+ evidence: { expected: projectBrief.brandName, actual: wrongName },
256
+ });
257
+ break;
258
+ }
259
+ }
260
+ // check explicit packageName assumption
261
+ const assumedName = typeof planAssumptions === 'object' ? planAssumptions.packageName : null;
262
+ if (assumedName && assumedName !== projectBrief.packageName) {
263
+ contradictions.push({
264
+ type: 'name_mismatch',
265
+ severity: 'block',
266
+ message: `Plan assumes packageName "${assumedName}" but actual package is "${projectBrief.packageName}"`,
267
+ evidence: { expected: projectBrief.packageName, actual: assumedName },
268
+ });
269
+ }
270
+ // 3. repeated_failure
271
+ const planWords = new Set(planDesc.toLowerCase().split(/\W+/).filter(w => w.length > 3));
272
+ for (const failure of (projectBrief.recentFailures ?? [])) {
273
+ const failureWords = (failure.prompt ?? '').toLowerCase().split(/\W+/).filter(w => w.length > 3);
274
+ const overlap = failureWords.filter(w => planWords.has(w)).length;
275
+ const similarity = overlap / Math.max(planWords.size, failureWords.length, 1);
276
+ if (similarity >= 0.4) {
277
+ contradictions.push({
278
+ type: 'repeated_failure',
279
+ severity: 'warn',
280
+ message: `Plan resembles a recent failed attempt: "${failure.prompt.slice(0, 80)}"`,
281
+ evidence: { expected: 'novel approach', actual: failure.prompt.slice(0, 80) },
282
+ });
283
+ break;
284
+ }
285
+ }
286
+ // 4. scope_violation + 5. protected_file
287
+ const taskFiles = new Set(taskBrief?.filesInScope ?? []);
288
+ const protectedSet = new Set(projectBrief.protectedPaths ?? []);
289
+ for (const f of targetFiles) {
290
+ const isProtected = protectedSet.has(f) || [...protectedSet].some(p => f.endsWith(p));
291
+ const inScope = taskFiles.has(f) || taskFiles.size === 0;
292
+ if (isProtected && !inScope) {
293
+ contradictions.push({
294
+ type: 'protected_file',
295
+ severity: 'block',
296
+ message: `Plan targets protected file "${f}" without explicit scope justification`,
297
+ evidence: { expected: 'file not in plan', actual: f },
298
+ });
299
+ }
300
+ else if (!inScope && isProtected) {
301
+ contradictions.push({
302
+ type: 'scope_violation',
303
+ severity: 'warn',
304
+ message: `Plan targets "${f}" which is protected and not mentioned in task scope`,
305
+ evidence: { expected: [...taskFiles].join(', ') || 'none', actual: f },
306
+ });
307
+ }
308
+ else if (!inScope && taskFiles.size > 0) {
309
+ contradictions.push({
310
+ type: 'scope_violation',
311
+ severity: 'warn',
312
+ message: `Plan targets "${f}" which is outside the task's stated file scope`,
313
+ evidence: { expected: [...taskFiles].join(', '), actual: f },
314
+ });
315
+ }
316
+ }
317
+ return contradictions;
318
+ }
319
+ /**
320
+ * Format a compact situational awareness summary (max 15 lines) for agent prompts.
321
+ */
322
+ export function formatBrief(projectBrief, taskBrief, sessionContext = null) {
323
+ const lines = [];
324
+ const dirtyLabel = projectBrief.dirty ? 'dirty' : 'clean';
325
+ lines.push(`PROJECT: ${projectBrief.packageName} v${projectBrief.version} (${projectBrief.moduleType})`);
326
+ lines.push(`BRANCH: ${projectBrief.branch} (${dirtyLabel}) | ${projectBrief.aheadOfRemote} ahead`);
327
+ if (projectBrief.recentCommits?.length > 0) {
328
+ const preview = projectBrief.recentCommits
329
+ .slice(0, 2)
330
+ .map(c => `"${c.slice(0, 50)}"`)
331
+ .join(' · ');
332
+ lines.push(`RECENT: ${preview}`);
333
+ }
334
+ const failureCount = (projectBrief.recentFailures ?? []).length;
335
+ if (failureCount > 0) {
336
+ const dayMs = 24 * 60 * 60 * 1000;
337
+ const cutoff = Date.now() - dayMs;
338
+ const recent24 = projectBrief.recentFailures.filter(f => f.timestamp >= cutoff).length;
339
+ const categories = [...new Set(projectBrief.recentFailures.slice(0, 5).map(f => f.error?.split(':')[0]?.trim()).filter(Boolean))].slice(0, 2).join(', ');
340
+ lines.push(`FAILURES: ${recent24} in last 24h${categories ? ` (${categories})` : ''}`);
341
+ }
342
+ else {
343
+ lines.push('FAILURES: none');
344
+ }
345
+ const protectedNames = (projectBrief.protectedPaths ?? [])
346
+ .map(p => p.split('/').pop())
347
+ .join(', ');
348
+ if (protectedNames)
349
+ lines.push(`PROTECTED: ${protectedNames}`);
350
+ if (taskBrief) {
351
+ const taskPreview = (taskBrief.task ?? '').slice(0, 80);
352
+ if (taskPreview)
353
+ lines.push(`TASK: "${taskPreview}"`);
354
+ const failedAttempts = (taskBrief.priorAttempts ?? []).filter(a => a.failed);
355
+ if (failedAttempts.length > 0) {
356
+ const lastReason = failedAttempts[0].reason
357
+ ? ` (${failedAttempts[0].reason.slice(0, 40)})`
358
+ : '';
359
+ lines.push(`PRIOR ATTEMPTS: ${failedAttempts.length} failed${lastReason}`);
360
+ }
361
+ if (taskBrief.escalationLevel && taskBrief.escalationLevel !== 'normal') {
362
+ lines.push(`ESCALATION: ${taskBrief.escalationLevel}`);
363
+ }
364
+ if (taskBrief.filesInScope?.length > 0) {
365
+ lines.push(`IN SCOPE: ${taskBrief.filesInScope.slice(0, 4).join(', ')}`);
366
+ }
367
+ }
368
+ // Session context: include 1-2 lines about prior cross-session work when available
369
+ if (sessionContext) {
370
+ const priorAttempts = Array.isArray(sessionContext.priorAttempts) ? sessionContext.priorAttempts : [];
371
+ const failures = priorAttempts.filter(a => a && (a.failed || a.status === 'failed'));
372
+ const successes = priorAttempts.filter(a => a && !a.failed && a.status !== 'failed');
373
+ if (failures.length > 0) {
374
+ const lastFail = failures[failures.length - 1];
375
+ const age = lastFail.daysAgo != null ? `${lastFail.daysAgo}d ago` : (lastFail.when ?? 'recently');
376
+ const reason = lastFail.error ?? lastFail.reason ?? '';
377
+ const reasonClip = reason ? ` (${reason.slice(0, 40)})` : '';
378
+ lines.push(`PRIOR: similar task failed ${age}${reasonClip}`);
379
+ }
380
+ else if (successes.length > 0) {
381
+ const lastSuccess = successes[successes.length - 1];
382
+ const age = lastSuccess.daysAgo != null ? `${lastSuccess.daysAgo}d ago` : (lastSuccess.when ?? 'recently');
383
+ lines.push(`PRIOR: related work completed successfully ${age}`);
384
+ }
385
+ else if (Array.isArray(sessionContext.relatedSessions) && sessionContext.relatedSessions.length > 0) {
386
+ lines.push(`PRIOR: ${sessionContext.relatedSessions.length} related session(s) found`);
387
+ }
388
+ }
389
+ return lines.slice(0, 15).join('\n');
390
+ }
391
+ //# sourceMappingURL=intelligence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intelligence.js","sourceRoot":"","sources":["../../src/intelligence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ type TaskStatus = 'open' | 'in_progress' | 'blocked' | 'done' | 'failed';
2
+ interface TaskEntry {
3
+ id: string;
4
+ created: string;
5
+ updated: string;
6
+ intent: string;
7
+ status: TaskStatus;
8
+ owner: string;
9
+ priority: string;
10
+ blockers: string[];
11
+ proof: string | null;
12
+ subtasks: string[];
13
+ parentTask: string | null;
14
+ files: string[];
15
+ result: string | null;
16
+ cost: unknown;
17
+ }
18
+ interface CreateTaskInput {
19
+ intent?: string;
20
+ owner?: string;
21
+ priority?: string;
22
+ blockers?: string[];
23
+ proof?: string | null;
24
+ subtasks?: string[];
25
+ parentTask?: string | null;
26
+ files?: string[];
27
+ result?: string | null;
28
+ cost?: unknown;
29
+ }
30
+ interface TaskSummary {
31
+ open: number;
32
+ inProgress: number;
33
+ blocked: number;
34
+ done: number;
35
+ failed: number;
36
+ total: number;
37
+ }
38
+ interface SubtaskInput extends CreateTaskInput {
39
+ }
40
+ export declare function createTask(task: CreateTaskInput, cwd?: string): TaskEntry;
41
+ export declare function updateTask(taskId: string, updates: Partial<TaskEntry>, cwd?: string): TaskEntry;
42
+ export declare function failTask(taskId: string, reason: string, cwd?: string): TaskEntry;
43
+ export declare function blockTask(taskId: string, blocker: string, cwd?: string): TaskEntry;
44
+ export declare function getTask(taskId: string, cwd?: string): TaskEntry | null;
45
+ export declare function getOpenTasks(cwd?: string): TaskEntry[];
46
+ export declare function getTaskHistory(taskId: string, cwd?: string): TaskEntry[];
47
+ export declare function getTaskSummary(cwd?: string): TaskSummary;
48
+ export declare function formatTaskList(tasks: TaskEntry[]): string;
49
+ export declare function reconcile(cwd?: string): TaskEntry[];
50
+ export declare function decompose(taskId: string, subtasks: SubtaskInput[], cwd?: string): {
51
+ parent: TaskEntry;
52
+ subtasks: TaskEntry[];
53
+ };
54
+ export {};
@@ -0,0 +1,179 @@
1
+ // Task ledger: append-only accountability store for HEAD's promises. Every tracked task has a full snapshot per state change.
2
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';
3
+ import { join } from 'path';
4
+ const LEDGER_PATH = '.dualbrain/ledger.jsonl';
5
+ function ledgerPath(cwd) {
6
+ return join(cwd || process.cwd(), LEDGER_PATH);
7
+ }
8
+ function readAllEntries(cwd) {
9
+ const p = ledgerPath(cwd);
10
+ if (!existsSync(p))
11
+ return [];
12
+ const raw = readFileSync(p, 'utf8').trim();
13
+ if (!raw)
14
+ return [];
15
+ return raw.split('\n').map(line => JSON.parse(line));
16
+ }
17
+ function appendEntry(entry, cwd) {
18
+ const p = ledgerPath(cwd);
19
+ mkdirSync(join(cwd || process.cwd(), '.dualbrain'), { recursive: true });
20
+ writeFileSync(p, JSON.stringify(entry) + '\n', { flag: 'a' });
21
+ }
22
+ function getCurrentTasks(cwd) {
23
+ const entries = readAllEntries(cwd);
24
+ const map = new Map();
25
+ for (const entry of entries) {
26
+ map.set(entry.id, entry);
27
+ }
28
+ return Array.from(map.values());
29
+ }
30
+ export function createTask(task, cwd) {
31
+ const entry = {
32
+ id: `task_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,
33
+ created: new Date().toISOString(),
34
+ updated: new Date().toISOString(),
35
+ intent: task.intent || '',
36
+ status: 'open',
37
+ owner: task.owner || 'head',
38
+ priority: task.priority || 'medium',
39
+ blockers: task.blockers || [],
40
+ proof: task.proof || null,
41
+ subtasks: task.subtasks || [],
42
+ parentTask: task.parentTask || null,
43
+ files: task.files || [],
44
+ result: task.result || null,
45
+ cost: task.cost || null,
46
+ };
47
+ appendEntry(entry, cwd);
48
+ return entry;
49
+ }
50
+ export function updateTask(taskId, updates, cwd) {
51
+ const current = getTask(taskId, cwd);
52
+ if (!current)
53
+ throw new Error(`Task not found: ${taskId}`);
54
+ if (updates.status === 'done') {
55
+ const proof = updates.proof ?? current.proof;
56
+ const result = updates.result ?? current.result;
57
+ if (!proof)
58
+ throw new Error(`Cannot mark task done without proof: ${taskId}`);
59
+ if (!result)
60
+ throw new Error(`Cannot mark task done without result: ${taskId}`);
61
+ }
62
+ const updated = {
63
+ ...current,
64
+ ...updates,
65
+ id: taskId,
66
+ updated: new Date().toISOString(),
67
+ };
68
+ appendEntry(updated, cwd);
69
+ return updated;
70
+ }
71
+ export function failTask(taskId, reason, cwd) {
72
+ const current = getTask(taskId, cwd);
73
+ if (!current)
74
+ throw new Error(`Task not found: ${taskId}`);
75
+ const updated = {
76
+ ...current,
77
+ status: 'failed',
78
+ result: reason || 'failed',
79
+ updated: new Date().toISOString(),
80
+ };
81
+ appendEntry(updated, cwd);
82
+ return updated;
83
+ }
84
+ export function blockTask(taskId, blocker, cwd) {
85
+ const current = getTask(taskId, cwd);
86
+ if (!current)
87
+ throw new Error(`Task not found: ${taskId}`);
88
+ const updated = {
89
+ ...current,
90
+ status: 'blocked',
91
+ blockers: [...(current.blockers || []), blocker],
92
+ updated: new Date().toISOString(),
93
+ };
94
+ appendEntry(updated, cwd);
95
+ return updated;
96
+ }
97
+ export function getTask(taskId, cwd) {
98
+ const entries = readAllEntries(cwd);
99
+ let latest = null;
100
+ for (const entry of entries) {
101
+ if (entry.id === taskId)
102
+ latest = entry;
103
+ }
104
+ return latest;
105
+ }
106
+ export function getOpenTasks(cwd) {
107
+ return getCurrentTasks(cwd).filter(t => t.status === 'open' || t.status === 'in_progress' || t.status === 'blocked');
108
+ }
109
+ export function getTaskHistory(taskId, cwd) {
110
+ return readAllEntries(cwd).filter(e => e.id === taskId);
111
+ }
112
+ export function getTaskSummary(cwd) {
113
+ const tasks = getCurrentTasks(cwd);
114
+ const summary = { open: 0, inProgress: 0, blocked: 0, done: 0, failed: 0, total: tasks.length };
115
+ for (const t of tasks) {
116
+ if (t.status === 'open')
117
+ summary.open++;
118
+ else if (t.status === 'in_progress')
119
+ summary.inProgress++;
120
+ else if (t.status === 'blocked')
121
+ summary.blocked++;
122
+ else if (t.status === 'done')
123
+ summary.done++;
124
+ else if (t.status === 'failed')
125
+ summary.failed++;
126
+ }
127
+ return summary;
128
+ }
129
+ export function formatTaskList(tasks) {
130
+ const all = tasks;
131
+ const open = all.filter(t => t.status === 'open' || t.status === 'in_progress').length;
132
+ const blocked = all.filter(t => t.status === 'blocked').length;
133
+ const done = all.filter(t => t.status === 'done').length;
134
+ const lines = [`TASKS (${open} open, ${blocked} blocked, ${done} done)`];
135
+ for (const t of all) {
136
+ const pri = t.priority === 'critical' ? 'crit' : t.priority === 'high' ? 'high' : t.priority === 'low' ? 'low' : 'med';
137
+ const label = t.intent.length > 48 ? t.intent.slice(0, 45) + '...' : t.intent;
138
+ if (t.status === 'done') {
139
+ lines.push(` ✓ [${pri}] ${label} (done)`);
140
+ }
141
+ else if (t.status === 'failed') {
142
+ lines.push(` ✗ [${pri}] ${label} (failed)`);
143
+ }
144
+ else if (t.status === 'blocked') {
145
+ const blockerNote = t.blockers && t.blockers.length ? `: ${t.blockers[t.blockers.length - 1]}` : '';
146
+ lines.push(` ◌ [${pri}] ${label} (blocked${blockerNote})`);
147
+ }
148
+ else {
149
+ lines.push(` ● [${pri}] ${label} (${t.status})`);
150
+ }
151
+ }
152
+ return lines.join('\n');
153
+ }
154
+ export function reconcile(cwd) {
155
+ const tasks = getCurrentTasks(cwd);
156
+ const cutoff = Date.now() - 24 * 60 * 60 * 1000;
157
+ return tasks.filter(t => (t.status === 'open' || t.status === 'in_progress') &&
158
+ new Date(t.updated).getTime() < cutoff);
159
+ }
160
+ export function decompose(taskId, subtasks, cwd) {
161
+ const parent = getTask(taskId, cwd);
162
+ if (!parent)
163
+ throw new Error(`Task not found: ${taskId}`);
164
+ const created = subtasks.map(sub => createTask({
165
+ ...sub,
166
+ parentTask: taskId,
167
+ owner: sub.owner || parent.owner,
168
+ priority: sub.priority || parent.priority,
169
+ }, cwd));
170
+ const subtaskIds = created.map(s => s.id);
171
+ const updatedParent = {
172
+ ...parent,
173
+ subtasks: [...(parent.subtasks || []), ...subtaskIds],
174
+ updated: new Date().toISOString(),
175
+ };
176
+ appendEntry(updatedParent, cwd);
177
+ return { parent: updatedParent, subtasks: created };
178
+ }
179
+ //# sourceMappingURL=ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/ledger.ts"],"names":[],"mappings":"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"}