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,406 @@
1
+ /**
2
+ * awareness.ts — Environment awareness layer for dual-brain.
3
+ * Scans runtime environment once on startup and caches results with TTL.
4
+ */
5
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
6
+ import { execSync } from 'node:child_process';
7
+ import { join, resolve } from 'node:path';
8
+ import { homedir } from 'node:os';
9
+ // ─── Cache ───────────────────────────────────────────────────────────────────
10
+ let _cache = null;
11
+ let _cacheTime = 0;
12
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
13
+ function safeExec(cmd, timeoutMs = 2000) {
14
+ try {
15
+ return execSync(cmd, {
16
+ encoding: 'utf8',
17
+ stdio: ['ignore', 'pipe', 'ignore'],
18
+ timeout: timeoutMs,
19
+ }).trim();
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ function extractVersion(output) {
26
+ if (!output)
27
+ return null;
28
+ const m = output.match(/(\d+\.\d+[\.\d]*)/);
29
+ return m ? m[1] : null;
30
+ }
31
+ function probeToolAvailability(name) {
32
+ const path = safeExec(`which ${name}`);
33
+ if (!path)
34
+ return { available: false, version: null };
35
+ if (name === 'rg' || name === 'replit' || name === 'gh') {
36
+ return { available: true };
37
+ }
38
+ const versionOutput = safeExec(`${name} --version`);
39
+ return { available: true, version: extractVersion(versionOutput) };
40
+ }
41
+ function detectContainerType() {
42
+ const env = process.env;
43
+ if (env.REPL_ID || env.REPL_SLUG)
44
+ return 'replit';
45
+ if (env.CODESPACES)
46
+ return 'codespace';
47
+ if (env.CI || env.GITHUB_ACTIONS || env.GITLAB_CI || env.JENKINS_URL)
48
+ return 'ci';
49
+ return 'local';
50
+ }
51
+ function scanSecrets() {
52
+ const keys = [
53
+ 'NPM_TOKEN',
54
+ 'DATABASE_URL',
55
+ 'GITHUB_TOKEN',
56
+ 'REPLIT_DB_URL',
57
+ ];
58
+ const result = {};
59
+ for (const key of keys) {
60
+ result[key] = Boolean(process.env[key]);
61
+ }
62
+ return result;
63
+ }
64
+ function scanReplitTools() {
65
+ const home = homedir();
66
+ const candidates = [
67
+ join(home, '.replit-tools'),
68
+ join('/home/runner/workspace', '.replit-tools'),
69
+ join(process.cwd(), '.replit-tools'),
70
+ ];
71
+ let toolsDir = null;
72
+ for (const c of candidates) {
73
+ if (existsSync(c)) {
74
+ toolsDir = c;
75
+ break;
76
+ }
77
+ }
78
+ if (!toolsDir) {
79
+ return { installed: false, version: null, sessionArchivePath: null, capabilities: [] };
80
+ }
81
+ let version = null;
82
+ const versionFile = join(toolsDir, '.version');
83
+ if (existsSync(versionFile)) {
84
+ try {
85
+ version = readFileSync(versionFile, 'utf8').trim() || null;
86
+ }
87
+ catch { /* skip */ }
88
+ }
89
+ const persistentBase = join(toolsDir, '.claude-persistent');
90
+ const projectDir = join(persistentBase, 'projects');
91
+ let sessionArchivePath = null;
92
+ if (existsSync(projectDir)) {
93
+ sessionArchivePath = projectDir;
94
+ }
95
+ else if (existsSync(persistentBase)) {
96
+ sessionArchivePath = persistentBase;
97
+ }
98
+ const capabilities = [];
99
+ if (existsSync(join(toolsDir, '.claude-persistent')))
100
+ capabilities.push('sessions');
101
+ const hasSearch = existsSync(join(toolsDir, 'search')) || existsSync(join(toolsDir, 'search.mjs'));
102
+ if (hasSearch)
103
+ capabilities.push('search');
104
+ const hasContext = existsSync(join(toolsDir, 'context')) || existsSync(join(toolsDir, 'context.mjs'));
105
+ if (hasContext)
106
+ capabilities.push('context');
107
+ const hasMcp = existsSync(join(toolsDir, 'mcp-server')) || existsSync(join(toolsDir, 'mcp'));
108
+ if (hasMcp)
109
+ capabilities.push('mcp');
110
+ return { installed: true, version, sessionArchivePath, capabilities };
111
+ }
112
+ /**
113
+ * Basic Replit environment scan used for the awareness report.
114
+ *
115
+ * NOTE: Detailed Replit integration (auth status, replit-tools capabilities,
116
+ * session archive, secrets listing, config planning, init flow) lives in
117
+ * src/replit.ts. When that module is available, prefer its
118
+ * detectReplitEnvironment() over duplicating detection logic here.
119
+ *
120
+ * Usage (fail-safe):
121
+ * try {
122
+ * const { detectReplitEnvironment } = await import('./replit.js');
123
+ * const rich = detectReplitEnvironment(cwd);
124
+ * // rich has .isReplit, .replId, .version, .authStatus, .capabilities ...
125
+ * } catch {
126
+ * // fall back to this scanReplit() result from scanEnvironment()
127
+ * }
128
+ */
129
+ function scanReplit(cwd) {
130
+ const env = process.env;
131
+ const isReplit = Boolean(env.REPL_ID || env.REPL_SLUG);
132
+ let hasDeployments = false;
133
+ const replitConfigPath = join(cwd, '.replit');
134
+ if (existsSync(replitConfigPath)) {
135
+ try {
136
+ const content = readFileSync(replitConfigPath, 'utf8');
137
+ hasDeployments = content.includes('[deployment]');
138
+ }
139
+ catch { /* skip */ }
140
+ }
141
+ return {
142
+ isReplit,
143
+ replId: env.REPL_ID || null,
144
+ replSlug: env.REPL_SLUG || null,
145
+ hasDatabase: Boolean(env.DATABASE_URL),
146
+ hasKV: Boolean(env.REPLIT_DB_URL),
147
+ hasObjectStorage: Boolean(env.REPLIT_BUCKET_URL || env.OBJECT_STORAGE_URL),
148
+ hasAuth: existsSync(join(cwd, '.replit-auth')) || Boolean(env.REPLIT_AUTH),
149
+ hasDeployments,
150
+ };
151
+ }
152
+ function scanClaudeCode(cwd) {
153
+ const claudeDir = join(cwd, '.claude');
154
+ const homeClaudeDir = join(homedir(), '.claude');
155
+ const isInsideClaude = Boolean(process.env.CLAUDE_CODE || process.env.CLAUDE_AGENT || process.env.ANTHROPIC_CLAUDE_CODE);
156
+ let hooksDir = null;
157
+ const localHooks = join(claudeDir, 'hooks');
158
+ const rootHooks = join(cwd, 'hooks');
159
+ if (existsSync(localHooks)) {
160
+ hooksDir = localHooks;
161
+ }
162
+ else if (existsSync(rootHooks)) {
163
+ hooksDir = rootHooks;
164
+ }
165
+ let mcpConfigured = false;
166
+ const mcpPaths = [
167
+ join(claudeDir, 'mcp.json'),
168
+ join(claudeDir, 'mcp_servers.json'),
169
+ join(homeClaudeDir, 'mcp.json'),
170
+ ];
171
+ for (const p of mcpPaths) {
172
+ if (existsSync(p)) {
173
+ mcpConfigured = true;
174
+ break;
175
+ }
176
+ }
177
+ let settingsPath = null;
178
+ const settingsCandidates = [
179
+ join(claudeDir, 'settings.json'),
180
+ join(homeClaudeDir, 'settings.json'),
181
+ ];
182
+ for (const p of settingsCandidates) {
183
+ if (existsSync(p)) {
184
+ settingsPath = p;
185
+ break;
186
+ }
187
+ }
188
+ return { isInsideClaude, hooksDir, mcpConfigured, settingsPath };
189
+ }
190
+ function scanDualBrain(cwd) {
191
+ let version = '0.0.0';
192
+ try {
193
+ const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8'));
194
+ version = pkg.version ?? '0.0.0';
195
+ }
196
+ catch { /* skip */ }
197
+ const livingDocsDir = join(cwd, '.dual-brain');
198
+ const livingDocsInit = existsSync(livingDocsDir);
199
+ let sessionCount = 0;
200
+ const sessionDir = join(cwd, '.dualbrain', 'sessions');
201
+ if (existsSync(sessionDir)) {
202
+ try {
203
+ sessionCount = readdirSync(sessionDir).filter(f => f.endsWith('.jsonl')).length;
204
+ }
205
+ catch { /* skip */ }
206
+ }
207
+ const hasLedger = existsSync(join(cwd, '.dualbrain', 'ledger.jsonl'));
208
+ const hasFailureMemory = existsSync(join(cwd, '.dualbrain', 'failures.jsonl'));
209
+ return { version, livingDocsInit, sessionCount, hasLedger, hasFailureMemory };
210
+ }
211
+ // ─── Exports ─────────────────────────────────────────────────────────────────
212
+ export function scanEnvironment(cwd, options = {}) {
213
+ const ttl = options.ttl ?? 300000;
214
+ if (_cache && Date.now() - _cacheTime < ttl && !options.force)
215
+ return _cache;
216
+ const resolvedCwd = resolve(cwd || process.cwd());
217
+ const container = {
218
+ type: detectContainerType(),
219
+ hostname: process.env.HOSTNAME || process.env.REPL_ID || 'unknown',
220
+ nodeVersion: process.version,
221
+ platform: process.platform,
222
+ arch: process.arch,
223
+ };
224
+ const toolNames = ['git', 'node', 'npm', 'codex', 'claude'];
225
+ const flagOnlyTools = ['rg', 'replit', 'gh'];
226
+ const tools = {};
227
+ for (const name of toolNames) {
228
+ tools[name] = probeToolAvailability(name);
229
+ }
230
+ for (const name of flagOnlyTools) {
231
+ const path = safeExec(`which ${name}`);
232
+ tools[name] = { available: Boolean(path) };
233
+ }
234
+ const secrets = scanSecrets();
235
+ const replitTools = scanReplitTools();
236
+ const replit = scanReplit(resolvedCwd);
237
+ const claudeCode = scanClaudeCode(resolvedCwd);
238
+ const dualBrain = scanDualBrain(resolvedCwd);
239
+ const report = {
240
+ scannedAt: Date.now(),
241
+ ttl,
242
+ container,
243
+ tools,
244
+ secrets,
245
+ replitTools,
246
+ replit,
247
+ claudeCode,
248
+ dualBrain,
249
+ };
250
+ _cache = report;
251
+ _cacheTime = Date.now();
252
+ return report;
253
+ }
254
+ export function formatEnvironment(report) {
255
+ const { container, tools, secrets, replitTools, replit, dualBrain } = report;
256
+ const nodeShort = container.nodeVersion.replace(/^v/, '').split('.')[0];
257
+ const containerLabel = container.type === 'replit'
258
+ ? 'Replit'
259
+ : container.type.charAt(0).toUpperCase() + container.type.slice(1);
260
+ const lines = [];
261
+ lines.push(`Environment: ${containerLabel} (node ${nodeShort}.x)`);
262
+ const toolEntries = [];
263
+ for (const [name, info] of Object.entries(tools)) {
264
+ if (info.available)
265
+ toolEntries.push(`${name} ✓`);
266
+ }
267
+ if (toolEntries.length)
268
+ lines.push(`Tools: ${toolEntries.join(' ')}`);
269
+ const secretMap = {
270
+ NPM_TOKEN: 'npm',
271
+ GITHUB_TOKEN: 'GitHub',
272
+ DATABASE_URL: 'PostgreSQL',
273
+ REPLIT_DB_URL: 'KV',
274
+ };
275
+ const secretEntries = [];
276
+ for (const [key, label] of Object.entries(secretMap)) {
277
+ if (secrets[key])
278
+ secretEntries.push(`${label} ✓`);
279
+ }
280
+ if (secretEntries.length)
281
+ lines.push(`Secrets: ${secretEntries.join(' ')}`);
282
+ const platformParts = [];
283
+ if (replit.hasDatabase)
284
+ platformParts.push('PostgreSQL ✓');
285
+ if (replit.hasKV)
286
+ platformParts.push('KV ✓');
287
+ if (replit.hasObjectStorage)
288
+ platformParts.push('ObjectStorage ✓');
289
+ if (replit.hasAuth)
290
+ platformParts.push('Auth ✓');
291
+ if (replit.hasDeployments)
292
+ platformParts.push('Deployments ✓');
293
+ if (platformParts.length)
294
+ lines.push(`Platform: ${platformParts.join(' ')}`);
295
+ if (replitTools.installed) {
296
+ const ver = replitTools.version ? `v${replitTools.version}` : 'installed';
297
+ const caps = replitTools.capabilities.join(', ');
298
+ lines.push(`replit-tools: ${ver}${caps ? ` (${caps})` : ''}`);
299
+ }
300
+ const dbFlag = dualBrain.hasLedger ? ', ledger ✓' : '';
301
+ const docsFlag = dualBrain.livingDocsInit ? 'living docs ✓' : 'living docs ✗';
302
+ lines.push(`dual-brain: v${dualBrain.version} (${docsFlag}${dbFlag})`);
303
+ return lines.join('\n');
304
+ }
305
+ export function getCapabilitySummary(report) {
306
+ const caps = [];
307
+ if (report.container.type !== 'unknown') {
308
+ caps.push(`${report.container.type}-container`);
309
+ }
310
+ if (report.replit.hasDatabase)
311
+ caps.push('postgresql');
312
+ if (report.replit.hasKV)
313
+ caps.push('replit-kv');
314
+ if (report.replit.hasObjectStorage)
315
+ caps.push('object-storage');
316
+ if (report.replit.hasAuth)
317
+ caps.push('replit-auth');
318
+ if (report.replit.hasDeployments)
319
+ caps.push('replit-deployments');
320
+ if (report.tools.codex?.available)
321
+ caps.push('codex-cli');
322
+ if (report.tools.claude?.available)
323
+ caps.push('claude-cli');
324
+ if (report.tools.git?.available)
325
+ caps.push('git');
326
+ if (report.tools.gh?.available)
327
+ caps.push('github-cli');
328
+ if (report.tools.rg?.available)
329
+ caps.push('ripgrep');
330
+ if (report.replitTools.installed) {
331
+ for (const c of report.replitTools.capabilities) {
332
+ caps.push(`replit-tools-${c}`);
333
+ }
334
+ }
335
+ if (report.claudeCode.mcpConfigured)
336
+ caps.push('mcp-configured');
337
+ if (report.claudeCode.hooksDir)
338
+ caps.push('claude-hooks');
339
+ if (report.dualBrain.hasLedger)
340
+ caps.push('dual-brain-ledger');
341
+ if (report.dualBrain.hasFailureMemory)
342
+ caps.push('dual-brain-failure-memory');
343
+ if (report.dualBrain.livingDocsInit)
344
+ caps.push('dual-brain-living-docs');
345
+ return caps;
346
+ }
347
+ export function invalidateCache() {
348
+ _cache = null;
349
+ _cacheTime = 0;
350
+ }
351
+ // ─── Ambiguity Detection ──────────────────────────────────────────────────────
352
+ const TECHNICAL_TERMS = /\b(fix|bug|error|test|deploy|refactor|import|export|function|class|module|api|endpoint|auth|token|database|query|schema|migration|build|lint|type|interface|component|route|handler|middleware|config|env|secret|key|file|path|directory|repo|branch|commit|merge|pull|push|install|upgrade|package|dependency|version|release|publish|log|trace|debug|stack|exception|undefined|null|async|await|promise|fetch|request|response|status|server|client|socket|cache|session)\b/i;
353
+ /**
354
+ * Detect whether a prompt is ambiguous and needs clarification before dispatch.
355
+ *
356
+ * A prompt is considered ambiguous when ALL of the following are true:
357
+ * 1. It is very short (under 4 words)
358
+ * 2. No file context is provided
359
+ * 3. It lacks specific technical terms that narrow the intent
360
+ */
361
+ export function detectAmbiguity(prompt, context = {}) {
362
+ if (!prompt || typeof prompt !== 'string') {
363
+ return { isAmbiguous: true, reason: 'missing context: empty prompt' };
364
+ }
365
+ const words = prompt.trim().split(/\s+/).filter(Boolean);
366
+ const isTooShort = words.length < 4;
367
+ const hasFileContext = Array.isArray(context?.files) && context.files.length > 0;
368
+ const hasTechnicalTerms = TECHNICAL_TERMS.test(prompt);
369
+ if (isTooShort && !hasFileContext && !hasTechnicalTerms) {
370
+ return {
371
+ isAmbiguous: true,
372
+ reason: `unclear: prompt is vague ("${prompt.trim()}") — missing context about what to change and where`,
373
+ };
374
+ }
375
+ return { isAmbiguous: false, reason: null };
376
+ }
377
+ /**
378
+ * Detect whether a user prompt is too vague to act on confidently.
379
+ *
380
+ * Checks for:
381
+ * - Very short prompts (under 10 chars)
382
+ * - No file paths, function names, or specific identifiers
383
+ * - Pronoun-only references without antecedents ("fix that thing", "change it")
384
+ */
385
+ export function isAmbiguous(prompt) {
386
+ if (!prompt || typeof prompt !== 'string')
387
+ return { ambiguous: true, reason: 'empty-prompt', confidence: 1.0 };
388
+ const trimmed = prompt.trim();
389
+ if (trimmed.length < 10)
390
+ return { ambiguous: true, reason: 'too-short', confidence: 0.9 };
391
+ // Check for file paths, function names, specific identifiers
392
+ const hasSpecifics = /[a-zA-Z_]\w*\.(mjs|js|ts|tsx|jsx|py|go|rs|java|rb|css|html|json|yaml|yml|md|sh)/.test(trimmed)
393
+ || /[a-zA-Z_]\w*\(\)/.test(trimmed) // function calls
394
+ || /`[^`]+`/.test(trimmed) // backtick-quoted identifiers
395
+ || /"[^"]{3,}"/.test(trimmed) // quoted strings
396
+ || /\b(line|function|class|method|variable|module|component|endpoint|route|table|column)\s+\w+/i.test(trimmed);
397
+ // Vague pronoun patterns
398
+ const vaguePatterns = /^(fix|change|update|do|make|help|look at|check)\s+(this|that|it|the thing|stuff|things?)$/i;
399
+ if (vaguePatterns.test(trimmed))
400
+ return { ambiguous: true, reason: 'vague-reference', confidence: 0.85 };
401
+ if (!hasSpecifics && trimmed.split(/\s+/).length < 5) {
402
+ return { ambiguous: true, reason: 'lacks-specifics', confidence: 0.7 };
403
+ }
404
+ return { ambiguous: false, reason: null, confidence: 0.1 };
405
+ }
406
+ //# sourceMappingURL=awareness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"awareness.js","sourceRoot":"","sources":["../../src/awareness.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAY,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AA8ElC,gFAAgF;AAEhF,IAAI,MAAM,GAA6B,IAAI,CAAC;AAC5C,IAAI,UAAU,GAAG,CAAC,CAAC;AAEnB,gFAAgF;AAEhF,SAAS,QAAQ,CAAC,GAAW,EAAE,YAAoB,IAAI;IACrD,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,GAAG,EAAE;YACnB,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;YACnC,OAAO,EAAE,SAAS;SACnB,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,MAAqB;IAC3C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC5C,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACzB,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY;IACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACtD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QACxD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IACD,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,IAAI,YAAY,CAAC,CAAC;IACpD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;AACrE,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,SAAS;QAAE,OAAO,QAAQ,CAAC;IAClD,IAAI,GAAG,CAAC,UAAU;QAAE,OAAO,WAAW,CAAC;IACvC,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAClF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,IAAI,GAAG;QACX,WAAW;QACX,cAAc;QACd,cAAc;QACd,eAAe;KAChB,CAAC;IACF,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC;QAC3B,IAAI,CAAC,wBAAwB,EAAE,eAAe,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC;KACrC,CAAC;IAEF,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,QAAQ,GAAG,CAAC,CAAC;YACb,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IACzF,CAAC;IAED,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC/C,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YAAC,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IACpD,IAAI,kBAAkB,GAAkB,IAAI,CAAC;IAC7C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,kBAAkB,GAAG,UAAU,CAAC;IAClC,CAAC;SAAM,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACtC,kBAAkB,GAAG,cAAc,CAAC;IACtC,CAAC;IAED,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;QAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpF,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IACnG,IAAI,SAAS;QAAE,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;IACtG,IAAI,UAAU;QAAE,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7F,IAAI,MAAM;QAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAErC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;AACxE,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,UAAU,CAAC,GAAW;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAEvD,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC9C,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;YACvD,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC;IAED,OAAO;QACL,QAAQ;QACR,MAAM,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI;QAC3B,QAAQ,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI;QAC/B,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QACtC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QACjC,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,GAAG,CAAC,kBAAkB,CAAC;QAC1E,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;QAC1E,cAAc;KACf,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACjD,MAAM,cAAc,GAAG,OAAO,CAC5B,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CACzF,CAAC;IAEF,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,QAAQ,GAAG,UAAU,CAAC;IACxB,CAAC;SAAM,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,QAAQ,GAAG,SAAS,CAAC;IACvB,CAAC;IAED,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,MAAM,QAAQ,GAAG;QACf,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;QAC3B,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC;QACnC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;KAChC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAAC,aAAa,GAAG,IAAI,CAAC;YAAC,MAAM;QAAC,CAAC;IACrD,CAAC;IAED,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,MAAM,kBAAkB,GAAG;QACzB,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC;QAChC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC;KACrC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,kBAAkB,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAAC,YAAY,GAAG,CAAC,CAAC;YAAC,MAAM;QAAC,CAAC;IACjD,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;AACnE,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,OAAO,GAAG,OAAO,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACxE,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;IAEtB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAEjD,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IACvD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QAClF,CAAC;QAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC;IACtE,MAAM,gBAAgB,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAE/E,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;AAChF,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,eAAe,CAAC,GAAuB,EAAE,UAAuB,EAAE;IAChF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC;IAClC,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC;IAE7E,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAElD,MAAM,SAAS,GAAkB;QAC/B,IAAI,EAAE,mBAAmB,EAAE;QAC3B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,SAAS;QAClE,WAAW,EAAE,OAAO,CAAC,OAAO;QAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC7C,MAAM,KAAK,GAA6B,EAAE,CAAC;IAE3C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAsB;QAChC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,GAAG;QACH,SAAS;QACT,KAAK;QACL,OAAO;QACP,WAAW;QACX,MAAM;QACN,UAAU;QACV,SAAS;KACV,CAAC;IAEF,MAAM,GAAG,MAAM,CAAC;IAChB,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACxB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACzD,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAE7E,MAAM,SAAS,GAAG,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,KAAK,QAAQ;QAChD,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAErE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,gBAAgB,cAAc,UAAU,SAAS,KAAK,CAAC,CAAC;IAEnE,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,IAAI,CAAC,SAAS;YAAE,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,WAAW,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEvE,MAAM,SAAS,GAA2B;QACxC,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,QAAQ;QACtB,YAAY,EAAE,YAAY;QAC1B,aAAa,EAAE,IAAI;KACpB,CAAC;IACF,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,IAAI,OAAO,CAAC,GAAG,CAAC;YAAE,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,aAAa,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE7E,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,IAAI,MAAM,CAAC,WAAW;QAAE,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,KAAK;QAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,MAAM,CAAC,gBAAgB;QAAE,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACnE,IAAI,MAAM,CAAC,OAAO;QAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,cAAc;QAAE,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC/D,IAAI,aAAa,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE9E,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;QAC1E,MAAM,IAAI,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,MAAM,QAAQ,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC;IAC9E,KAAK,CAAC,IAAI,CAAC,gBAAgB,SAAS,CAAC,OAAO,KAAK,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC;IAEvE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAyB;IAC5D,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW;QAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChD,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB;QAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChE,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO;QAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACpD,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc;QAAE,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAElE,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5D,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACxD,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAGrD,IAAI,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,CAAC,aAAa;QAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACjE,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ;QAAE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAE1D,IAAI,MAAM,CAAC,SAAS,CAAC,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC/D,IAAI,MAAM,CAAC,SAAS,CAAC,gBAAgB;QAAE,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC9E,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc;QAAE,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAEzE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,IAAI,CAAC;IACd,UAAU,GAAG,CAAC,CAAC;AACjB,CAAC;AAED,iFAAiF;AAEjF,MAAM,eAAe,GAAG,gdAAgd,CAAC;AAEze;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,MAAe,EAAE,UAAgC,EAAE;IACjF,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,+BAA+B,EAAE,CAAC;IACxE,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACpC,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACjF,MAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEvD,IAAI,UAAU,IAAI,CAAC,cAAc,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACxD,OAAO;YACL,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,8BAA8B,MAAM,CAAC,IAAI,EAAE,qDAAqD;SACzG,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,MAAe;IACzC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;IAE/G,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;IAE1F,6DAA6D;IAC7D,MAAM,YAAY,GAAG,iFAAiF,CAAC,IAAI,CAAC,OAAO,CAAC;WAC/G,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAE,iBAAiB;WACnD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAY,8BAA8B;WACjE,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAS,iBAAiB;WACpD,6FAA6F,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEjH,yBAAyB;IACzB,MAAM,aAAa,GAAG,4FAA4F,CAAC;IACnH,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAEzG,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;IACzE,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * brief.ts — Delegation brief generator for the Dual-Brain Orchestrator HEAD.
3
+ *
4
+ * Generates typed delegation prompts from role-based templates. The HEAD's
5
+ * primary skill is writing great agent briefs. Pure string construction —
6
+ * no imports from sibling modules.
7
+ *
8
+ * Exports: generateBrief, compressPriorResults, listRoles
9
+ */
10
+ type Role = 'researcher' | 'implementer' | 'reviewer' | 'verifier';
11
+ interface TaskInput {
12
+ id?: string;
13
+ title: string;
14
+ goal: string;
15
+ tier?: string;
16
+ role?: Role;
17
+ owns?: string[];
18
+ consensus?: boolean;
19
+ risk?: string;
20
+ }
21
+ interface BriefContext {
22
+ prompt?: string;
23
+ priorResults?: PriorResult[];
24
+ repo?: {
25
+ projectType?: string;
26
+ branch?: string;
27
+ testCmd?: string;
28
+ lintCmd?: string;
29
+ };
30
+ cwd?: string;
31
+ }
32
+ interface PriorResult {
33
+ stepId?: string;
34
+ taskId?: string;
35
+ summary?: string;
36
+ output?: string;
37
+ filesChanged?: string[];
38
+ decisions?: string[];
39
+ findings?: string;
40
+ }
41
+ interface RoleDescription {
42
+ role: string;
43
+ description: string;
44
+ }
45
+ export declare function listRoles(): RoleDescription[];
46
+ export declare function compressPriorResults(results: PriorResult[] | undefined): string;
47
+ export declare function generateBrief(task: TaskInput, context?: BriefContext): string;
48
+ export {};
@@ -0,0 +1,179 @@
1
+ /**
2
+ * brief.ts — Delegation brief generator for the Dual-Brain Orchestrator HEAD.
3
+ *
4
+ * Generates typed delegation prompts from role-based templates. The HEAD's
5
+ * primary skill is writing great agent briefs. Pure string construction —
6
+ * no imports from sibling modules.
7
+ *
8
+ * Exports: generateBrief, compressPriorResults, listRoles
9
+ */
10
+ const TEMPLATES = {
11
+ researcher: {
12
+ prefix: 'You are a code researcher. READ ONLY — do NOT edit any files.',
13
+ outputFormat: 'Return: { findings: string, files: string[], lineRefs: string[], confidence: "high"|"medium"|"low" }',
14
+ constraints: 'Max 50 lines of quoted code. Focus on structure and relationships, not implementation details.',
15
+ },
16
+ implementer: {
17
+ prefix: 'You are a code implementer. Edit ONLY files in your ownership list.',
18
+ outputFormat: 'Return: { filesChanged: string[], testsRun: string[], decisions: string[], risks: string[] }',
19
+ constraints: 'Run tests after changes. Make minimal edits. Do not refactor beyond scope.',
20
+ },
21
+ reviewer: {
22
+ prefix: 'You are a code reviewer. READ ONLY — do NOT edit any files.',
23
+ outputFormat: 'Return: { issues: { severity: string, file: string, line: number, description: string }[], approved: boolean, risks: string[] }',
24
+ constraints: 'Focus on correctness, security, and behavior preservation. Ignore style.',
25
+ },
26
+ verifier: {
27
+ prefix: 'You are a test verifier. Run the test suite and report results.',
28
+ outputFormat: 'Return: { passed: boolean, failCount: number, failures: string[], rootCause: string | null }',
29
+ constraints: 'If tests fail, identify root cause but DO NOT fix. Report only.',
30
+ },
31
+ };
32
+ // --- Exported: listRoles ---
33
+ export function listRoles() {
34
+ return [
35
+ { role: 'researcher', description: 'Read-only exploration and mapping. Returns findings, file refs, and confidence.' },
36
+ { role: 'implementer', description: 'Makes edits within ownership scope. Returns changed files, test results, and decisions.' },
37
+ { role: 'reviewer', description: 'Read-only code review. Returns issues by severity and an approval verdict.' },
38
+ { role: 'verifier', description: 'Runs the test suite and identifies failures. Does not fix anything.' },
39
+ ];
40
+ }
41
+ // --- Exported: compressPriorResults ---
42
+ export function compressPriorResults(results) {
43
+ if (!results || results.length === 0)
44
+ return '';
45
+ const lines = [];
46
+ for (const r of results) {
47
+ const id = r.stepId ?? r.taskId ?? '?';
48
+ const parts = [];
49
+ // Extract summary or findings
50
+ const rawSummary = r.summary ?? r.findings ?? r.output ?? '';
51
+ if (rawSummary) {
52
+ // Strip code blocks
53
+ const cleaned = String(rawSummary)
54
+ .replace(/```[\s\S]*?```/g, '[code block]')
55
+ .replace(/`[^`]+`/g, (m) => m.replace(/\n/g, ' '))
56
+ .replace(/\n{3,}/g, '\n\n')
57
+ .trim();
58
+ // Keep only first 200 chars of text
59
+ const snippet = cleaned.length > 200 ? cleaned.slice(0, 197) + '...' : cleaned;
60
+ if (snippet)
61
+ parts.push(snippet);
62
+ }
63
+ // Append file lists compactly
64
+ if (Array.isArray(r.filesChanged) && r.filesChanged.length > 0) {
65
+ parts.push(`files: ${r.filesChanged.join(', ')}`);
66
+ }
67
+ // Append key decisions
68
+ if (Array.isArray(r.decisions) && r.decisions.length > 0) {
69
+ parts.push(`decisions: ${r.decisions.slice(0, 3).join('; ')}`);
70
+ }
71
+ if (parts.length > 0) {
72
+ lines.push(`[${id}] ${parts.join(' | ')}`);
73
+ }
74
+ }
75
+ return lines.join('\n');
76
+ }
77
+ // --- Section builders ---
78
+ function buildOwnershipSection(owns) {
79
+ if (!owns || owns.length === 0)
80
+ return null;
81
+ return `File ownership (ONLY edit these):\n ${owns.join('\n ')}`;
82
+ }
83
+ function buildPriorResultsSection(priorResults) {
84
+ const compressed = compressPriorResults(priorResults);
85
+ if (!compressed)
86
+ return null;
87
+ return `Prior wave results (context only — do not repeat this work):\n${compressed}`;
88
+ }
89
+ function buildAcceptanceCriteria(task) {
90
+ const lines = [];
91
+ if (task.role === 'researcher') {
92
+ lines.push('- Return a structured findings object with file paths and line references');
93
+ lines.push('- Report confidence level based on coverage of the codebase you explored');
94
+ }
95
+ else if (task.role === 'implementer') {
96
+ lines.push('- All edits must stay within the ownership list above');
97
+ lines.push('- Run existing tests; report any failures');
98
+ lines.push('- Document decisions made during implementation');
99
+ }
100
+ else if (task.role === 'reviewer') {
101
+ lines.push('- Report every issue with severity (critical / high / medium / low)');
102
+ lines.push('- Provide a clear approved: true/false verdict');
103
+ lines.push('- Do not edit any files');
104
+ }
105
+ else if (task.role === 'verifier') {
106
+ lines.push('- Run the full test suite');
107
+ lines.push('- If tests fail, identify root cause but do NOT fix');
108
+ lines.push('- Return pass/fail with failure details');
109
+ }
110
+ if (task.consensus) {
111
+ lines.push('- This task requires dual-brain consensus — be thorough and explicit in your reasoning');
112
+ }
113
+ return lines.length > 0 ? `Acceptance criteria:\n${lines.join('\n')}` : null;
114
+ }
115
+ // --- Exported: generateBrief ---
116
+ export function generateBrief(task, context = {}) {
117
+ const { prompt = '', priorResults = [], repo = {} } = context;
118
+ const role = task.role ?? 'implementer';
119
+ const template = TEMPLATES[role] ?? TEMPLATES.implementer;
120
+ const sections = [];
121
+ // 1. Role header
122
+ sections.push(template.prefix);
123
+ sections.push('');
124
+ // 2. Task identity
125
+ sections.push(`Task: ${task.title}`);
126
+ if (task.id)
127
+ sections.push(`Task ID: ${task.id}`);
128
+ if (task.tier)
129
+ sections.push(`Tier: ${task.tier}`);
130
+ sections.push('');
131
+ // 3. Goal
132
+ sections.push(`Goal:\n${task.goal}`);
133
+ sections.push('');
134
+ // 4. Original user request (for context)
135
+ if (prompt && prompt !== task.goal) {
136
+ const snippet = prompt.length > 300 ? prompt.slice(0, 297) + '...' : prompt;
137
+ sections.push(`Original request (for context):\n${snippet}`);
138
+ sections.push('');
139
+ }
140
+ // 5. File ownership
141
+ const ownershipSection = buildOwnershipSection(task.owns);
142
+ if (ownershipSection) {
143
+ sections.push(ownershipSection);
144
+ sections.push('');
145
+ }
146
+ // 6. Repository context (if available)
147
+ const repoLines = [];
148
+ if (repo.projectType)
149
+ repoLines.push(`Project type: ${repo.projectType}`);
150
+ if (repo.branch)
151
+ repoLines.push(`Branch: ${repo.branch}`);
152
+ if (repo.testCmd)
153
+ repoLines.push(`Test command: ${repo.testCmd}`);
154
+ if (repo.lintCmd)
155
+ repoLines.push(`Lint command: ${repo.lintCmd}`);
156
+ if (repoLines.length > 0) {
157
+ sections.push(`Repository context:\n ${repoLines.join('\n ')}`);
158
+ sections.push('');
159
+ }
160
+ // 7. Prior results
161
+ const priorSection = buildPriorResultsSection(priorResults);
162
+ if (priorSection) {
163
+ sections.push(priorSection);
164
+ sections.push('');
165
+ }
166
+ // 8. Acceptance criteria
167
+ const criteriaSection = buildAcceptanceCriteria(task);
168
+ if (criteriaSection) {
169
+ sections.push(criteriaSection);
170
+ sections.push('');
171
+ }
172
+ // 9. Constraints
173
+ sections.push(`Constraints:\n${template.constraints}`);
174
+ sections.push('');
175
+ // 10. Output format requirement
176
+ sections.push(`Required output format:\n${template.outputFormat}`);
177
+ return sections.join('\n').trimEnd();
178
+ }
179
+ //# sourceMappingURL=brief.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brief.js","sourceRoot":"","sources":["../../src/brief.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkDH,MAAM,SAAS,GAA2B;IACxC,UAAU,EAAE;QACV,MAAM,EAAQ,+DAA+D;QAC7E,YAAY,EAAE,sGAAsG;QACpH,WAAW,EAAG,gGAAgG;KAC/G;IACD,WAAW,EAAE;QACX,MAAM,EAAQ,qEAAqE;QACnF,YAAY,EAAE,8FAA8F;QAC5G,WAAW,EAAG,4EAA4E;KAC3F;IACD,QAAQ,EAAE;QACR,MAAM,EAAQ,6DAA6D;QAC3E,YAAY,EAAE,iIAAiI;QAC/I,WAAW,EAAG,0EAA0E;KACzF;IACD,QAAQ,EAAE;QACR,MAAM,EAAQ,iEAAiE;QAC/E,YAAY,EAAE,8FAA8F;QAC5G,WAAW,EAAG,iEAAiE;KAChF;CACF,CAAC;AAEF,8BAA8B;AAE9B,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,EAAE,IAAI,EAAE,YAAY,EAAG,WAAW,EAAE,iFAAiF,EAAE;QACvH,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,yFAAyF,EAAE;QAC/H,EAAE,IAAI,EAAE,UAAU,EAAK,WAAW,EAAE,4EAA4E,EAAE;QAClH,EAAE,IAAI,EAAE,UAAU,EAAK,WAAW,EAAE,qEAAqE,EAAE;KAC5G,CAAC;AACJ,CAAC;AAED,yCAAyC;AAEzC,MAAM,UAAU,oBAAoB,CAAC,OAAkC;IACrE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEhD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC;QACvC,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,8BAA8B;QAC9B,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;QAC7D,IAAI,UAAU,EAAE,CAAC;YACf,oBAAoB;YACpB,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;iBAC/B,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC;iBAC1C,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;iBACjD,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;iBAC1B,IAAI,EAAE,CAAC;YACV,oCAAoC;YACpC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;YAC/E,IAAI,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QAED,8BAA8B;QAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/D,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,uBAAuB;QACvB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,2BAA2B;AAE3B,SAAS,qBAAqB,CAAC,IAA0B;IACvD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,wCAAwC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACrE,CAAC;AAED,SAAS,wBAAwB,CAAC,YAAuC;IACvE,MAAM,UAAU,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7B,OAAO,iEAAiE,UAAU,EAAE,CAAC;AACvF,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAe;IAC9C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;QACxF,KAAK,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;IACzF,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAChE,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;QAClF,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACxC,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,wFAAwF,CAAC,CAAC;IACvG,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,yBAAyB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/E,CAAC;AAED,kCAAkC;AAElC,MAAM,UAAU,aAAa,CAAC,IAAe,EAAE,UAAwB,EAAE;IACvE,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,YAAY,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAC9D,MAAM,IAAI,GAAS,IAAI,CAAC,IAAI,IAAI,aAAa,CAAC;IAC9C,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,WAAW,CAAC;IAE1D,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,iBAAiB;IACjB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAElB,mBAAmB;IACnB,QAAQ,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,IAAI;QAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAElB,UAAU;IACV,QAAQ,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAElB,yCAAyC;IACzC,IAAI,MAAM,IAAI,MAAM,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAC5E,QAAQ,CAAC,IAAI,CAAC,oCAAoC,OAAO,EAAE,CAAC,CAAC;QAC7D,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,oBAAoB;IACpB,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,gBAAgB,EAAE,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,uCAAuC;IACvC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,IAAI,CAAC,WAAW;QAAE,SAAS,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1E,IAAI,IAAI,CAAC,MAAM;QAAO,SAAS,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/D,IAAI,IAAI,CAAC,OAAO;QAAM,SAAS,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACtE,IAAI,IAAI,CAAC,OAAO;QAAM,SAAS,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACtE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,0BAA0B,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,mBAAmB;IACnB,MAAM,YAAY,GAAG,wBAAwB,CAAC,YAAY,CAAC,CAAC;IAC5D,IAAI,YAAY,EAAE,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,yBAAyB;IACzB,MAAM,eAAe,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,eAAe,EAAE,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,iBAAiB;IACjB,QAAQ,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAElB,gCAAgC;IAChC,QAAQ,CAAC,IAAI,CAAC,4BAA4B,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;IAEnE,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AACvC,CAAC"}