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,544 @@
1
+ #!/usr/bin/env node
2
+ // detect.ts — Task detection for dual-brain. Self-contained, no internal imports.
3
+ // Exports: detectTask, classifyIntent, classifyRisk, estimateComplexity, inferTier, extractPaths, classifySpecialist
4
+ import { readFileSync } from 'fs';
5
+ import { resolve, dirname } from 'path';
6
+ import { fileURLToPath } from 'url';
7
+ import { execSync } from 'child_process';
8
+ const __dirname = dirname(fileURLToPath(import.meta.url));
9
+ // ─── Intent definitions ────────────────────────────────────────────────────────
10
+ const INTENTS = {
11
+ search: /\b(grep|find|locate|where is|where are|list|explore|read|look up|look for|check|what is|show me|display)\b/i,
12
+ explain: /\b(explain|walk me through|what does|how does|describe|summarize|understand|clarify)\b/i,
13
+ compare: /\b(compare|contrast|difference|versus|vs\.?|trade.?off|which is better|pros and cons|benchmark|performance)\b/i,
14
+ document: /\b(document|docs?|readme|jsdoc|typedoc|api docs|write docs|add docs|update docs)\b/i,
15
+ format: /\b(format|lint|prettier|style|indent|whitespace|typo|typos|comment[s]?|reformat)\b/i,
16
+ planning: /\b(plan|roadmap|strategy|prioritize|break down|decompose|prioritise)\b/i,
17
+ architecture: /\b(design|architect|architecture|propose|how should we|system design|system architecture)\b/i,
18
+ security: /\b(auth(?:enticat\w*)?|credential|secret|token|password|encrypt|permission[s]?|vulnerability|vulnerabilities|CVE|oauth|jwt|api.?key)\b/i,
19
+ review: /\b(review|audit|check for issues|evaluate|assess|inspect code|code review)\b/i,
20
+ debug: /\b(debug|investigate|why (is|does|isn't|doesn't)|trace|diagnose|figure out|broken|not working|failing|regression)\b/i,
21
+ test: /\b(test[s]?|spec[s]?|add test|fix test|test coverage|unit test|e2e|integration test|jest|vitest|mocha)\b/i,
22
+ refactor: /\b(refactor|restructure|reorganize|reorganise|extract|split|consolidate|clean up|cleanup|dedupe|dedup)\b/i,
23
+ edit: /\b(fix|add|update|modify|change|rename|move|replace|write|implement|create|remove|delete|insert)\b/i,
24
+ };
25
+ const INTENT_PRIORITY = [
26
+ 'security', 'architecture', 'planning', 'compare', 'review',
27
+ 'debug', 'refactor', 'test', 'explain', 'document', 'format', 'search', 'edit',
28
+ ];
29
+ const RISK_PATTERNS = [
30
+ { level: 'critical', regex: /\b(auth|credential|secret|\.env|key[s]?|token[s]?|password|encrypt|certificate|cert[s]?|\.pem|\.key)\b/i, label: 'security-sensitive' },
31
+ { level: 'high', regex: /\b(billing|payment|migration|deploy|ci[-/]cd|\.github\/workflows|security|permission|policy|schema\.prisma|schema\.sql|api[-_]?contract|openapi|swagger)\b/i, label: 'high-impact infrastructure' },
32
+ { level: 'medium', regex: /\b(test|spec|\.test\.|\.spec\.|shared|util[s]?|lib\/|public[-_]?api|integrat|config|\.config\.)\b/i, label: 'shared/tested code' },
33
+ { level: 'low', regex: /\b(readme|\.md$|docs?\/|comment|format|lint|\.prettierrc|local[-_]?script|internal[-_]?only|changelog)\b/i, label: 'docs/formatting' },
34
+ ];
35
+ const RISK_KEYWORDS = [
36
+ { level: 'critical', regex: /\b(auth|secret|credential|token|password|encrypt|certificate|oauth|jwt|api.?key|vulnerability|CVE)\b/i },
37
+ { level: 'high', regex: /\b(billing|payment|migration|deploy|ci.?cd|security|permission|policy|schema|openapi|swagger|production|prod)\b/i },
38
+ { level: 'medium', regex: /\b(test|spec|config|shared|util|lib|integration|public.?api)\b/i },
39
+ { level: 'low', regex: /\b(readme|docs?|comment|format|lint|changelog|typo|whitespace)\b/i },
40
+ ];
41
+ const DESIGN_IMPACT_PATTERNS = [
42
+ /\bbin\/dual-brain\.mjs\b/,
43
+ /\bsrc\/(?:tui|profile|detect|decide|dispatch|session|health|index)\.mjs\b/,
44
+ /\bhooks\/(?:head-guard|enforce-tier|budget-balancer|dual-brain-think|dual-brain-review|wave-orchestrator)\.mjs\b/,
45
+ /\bVISION\.md\b/,
46
+ ];
47
+ const LEVEL_ORDER = { critical: 3, high: 2, medium: 1, low: 0 };
48
+ // ─── Helpers / Exported functions ─────────────────────────────────────────────
49
+ function higherRisk(a, b) {
50
+ return (LEVEL_ORDER[a] >= LEVEL_ORDER[b] ? a : b);
51
+ }
52
+ /** Extract file paths from free-form text. */
53
+ export function extractPaths(text) {
54
+ if (!text)
55
+ return [];
56
+ const matches = text.match(/(?:^|\s|["'`])([./~]?(?:[\w@.-]+\/)+[\w@.*-]+(?:\.\w+)?)/g);
57
+ if (!matches)
58
+ return [];
59
+ return matches.map(m => m.trim().replace(/^["'`]/, ''));
60
+ }
61
+ /** Classify risk from an array of file paths. Returns { level, riskyFiles }. */
62
+ export function classifyRisk(paths) {
63
+ if (!paths || paths.length === 0) {
64
+ return { level: 'low', riskyFiles: [] };
65
+ }
66
+ let highestLevel = 'low';
67
+ const riskyFiles = [];
68
+ for (const p of paths) {
69
+ for (const pattern of RISK_PATTERNS) {
70
+ if (pattern.regex.test(p)) {
71
+ if (LEVEL_ORDER[pattern.level] > LEVEL_ORDER['low']) {
72
+ riskyFiles.push({ path: p, risk: pattern.level, reason: pattern.label });
73
+ }
74
+ if (LEVEL_ORDER[pattern.level] > LEVEL_ORDER[highestLevel]) {
75
+ highestLevel = pattern.level;
76
+ if (highestLevel === 'critical')
77
+ break;
78
+ }
79
+ break; // use highest-priority match for this path
80
+ }
81
+ }
82
+ if (highestLevel === 'critical')
83
+ break;
84
+ }
85
+ return { level: highestLevel, riskyFiles };
86
+ }
87
+ /** Extract the dominant intent from a task description. */
88
+ export function classifyIntent(prompt) {
89
+ for (const key of INTENT_PRIORITY) {
90
+ if (INTENTS[key].test(prompt))
91
+ return key;
92
+ }
93
+ return 'edit';
94
+ }
95
+ /** Determine complexity from description, file count, risk, intent, prior failures. */
96
+ export function estimateComplexity({ prompt, fileCount = 0, risk = 'low', intent = 'edit', priorFailures = 0 }) {
97
+ const isAmbiguous = prompt.length > 120 || /\b(and also|as well as|plus|additionally|also)\b/i.test(prompt);
98
+ if (priorFailures >= 2 || intent === 'architecture' || risk === 'critical' || fileCount >= 6) {
99
+ return 'complex';
100
+ }
101
+ if (fileCount >= 3 || intent === 'refactor' || intent === 'debug' || risk === 'high' || isAmbiguous) {
102
+ return 'moderate';
103
+ }
104
+ if (fileCount <= 2 && (risk === 'low' || risk === 'medium')) {
105
+ if (intent === 'format' || (fileCount <= 1 && risk === 'low'))
106
+ return 'trivial';
107
+ return 'simple';
108
+ }
109
+ return 'moderate';
110
+ }
111
+ /** Map intent + risk + complexity → tier (think / search / execute). */
112
+ export function inferTier({ intent, risk, complexity, effort, specialistTierBias }) {
113
+ const thinkIntents = ['architecture', 'security', 'planning', 'compare', 'review'];
114
+ if (thinkIntents.includes(intent) || risk === 'critical')
115
+ return 'think';
116
+ // Specialist tier_bias can elevate to think before general tier logic
117
+ if (specialistTierBias === 'think')
118
+ return 'think';
119
+ const searchIntents = ['search', 'explain', 'format'];
120
+ if (searchIntents.includes(intent) && effort === 'low')
121
+ return 'search';
122
+ return 'execute';
123
+ }
124
+ /** Whether this task likely requires writing/editing files. */
125
+ function requiresWrite(intent) {
126
+ const readOnly = ['search', 'explain', 'compare', 'review'];
127
+ return !readOnly.includes(intent);
128
+ }
129
+ /** Build a one-sentence explanation of the classification. */
130
+ function buildExplanation({ intent, risk, complexity, fileCount, priorFailures }) {
131
+ const parts = [];
132
+ const complexityWord = { trivial: 'Trivial', simple: 'Simple', moderate: 'Moderate', complex: 'Complex' }[complexity];
133
+ const riskWord = risk === 'low' ? 'low-risk' : `${risk}-risk`;
134
+ parts.push(`${complexityWord} ${riskWord} ${intent}`);
135
+ if (fileCount > 0)
136
+ parts.push(`touching ${fileCount} file${fileCount === 1 ? '' : 's'}`);
137
+ if (priorFailures > 0)
138
+ parts.push(`with ${priorFailures} prior failure${priorFailures === 1 ? '' : 's'} — elevated effort`);
139
+ return parts.join(' ') + '.';
140
+ }
141
+ // ─── Reasoning depth classification ───────────────────────────────────────────
142
+ const ULTRA_UNCERTAINTY = /\b(not sure|maybe|should we|architect|design|trade-?off|approach)\b/i;
143
+ const ULTRA_DEEP_ANALYSIS = /\b(think about|analyze|analyse|evaluate|compare options)\b/i;
144
+ const HIGH_CROSS_CUTTING = /\b(refactor|rename across|update all|migration)\b/i;
145
+ const LOW_SIMPLE = /\b(grep|find|search|list|show|what is|where is)\b/i;
146
+ /**
147
+ * Classify the reasoning depth needed for a task.
148
+ */
149
+ export function classifyReasoningDepth(prompt, files = [], priorOutcomes = []) {
150
+ const signals = [];
151
+ // Gather prior failure count from priorOutcomes array
152
+ const failures = priorOutcomes.filter(o => o && (o.failed || o.status === 'failed' || o.outcome === 'failed' || o.success === false)).length;
153
+ // File-based risk (reuse classifyRisk)
154
+ const { level: fileRisk } = classifyRisk(files);
155
+ // Keyword risk from prompt (reuse RISK_KEYWORDS)
156
+ let keywordRisk = 'low';
157
+ for (const { level, regex } of RISK_KEYWORDS) {
158
+ if (regex.test(prompt)) {
159
+ keywordRisk = level;
160
+ break;
161
+ }
162
+ }
163
+ const risk = higherRisk(fileRisk, keywordRisk);
164
+ // Directory spread from files
165
+ const dirs = new Set(files.map(f => {
166
+ const parts = f.replace(/^\//, '').split('/');
167
+ return parts.length > 1 ? parts[0] : '.';
168
+ }));
169
+ const dirCount = dirs.size;
170
+ // ── Ultra signals ──────────────────────────────────────────────────────────
171
+ const ultraSignals = [];
172
+ if (ULTRA_UNCERTAINTY.test(prompt)) {
173
+ const match = prompt.match(ULTRA_UNCERTAINTY);
174
+ ultraSignals.push(`prompt contains '${match[0]}'`);
175
+ }
176
+ if (ULTRA_DEEP_ANALYSIS.test(prompt)) {
177
+ const match = prompt.match(ULTRA_DEEP_ANALYSIS);
178
+ ultraSignals.push(`prompt requests deep analysis ('${match[0]}')`);
179
+ }
180
+ if (risk === 'critical') {
181
+ ultraSignals.push('risk classified as critical');
182
+ }
183
+ if (failures >= 2) {
184
+ ultraSignals.push(`${failures} prior failures on similar task`);
185
+ }
186
+ if (fileRisk === 'critical') {
187
+ ultraSignals.push('files include auth/security/billing/migration patterns');
188
+ }
189
+ if (ultraSignals.length > 0) {
190
+ return { depth: 'ultra', signals: ultraSignals };
191
+ }
192
+ // ── High signals ───────────────────────────────────────────────────────────
193
+ const highSignals = [];
194
+ if (risk === 'high') {
195
+ highSignals.push('risk classified as high');
196
+ }
197
+ if (files.length > 5) {
198
+ highSignals.push(`${files.length} files provided`);
199
+ }
200
+ if (failures === 1) {
201
+ highSignals.push('1 prior failure on similar task');
202
+ }
203
+ if (HIGH_CROSS_CUTTING.test(prompt)) {
204
+ const match = prompt.match(HIGH_CROSS_CUTTING);
205
+ highSignals.push(`prompt mentions cross-cutting concern ('${match[0]}')`);
206
+ }
207
+ if (dirCount >= 3) {
208
+ highSignals.push(`files span ${dirCount} directories`);
209
+ }
210
+ if (highSignals.length > 0) {
211
+ return { depth: 'high', signals: highSignals };
212
+ }
213
+ // ── Medium signals ─────────────────────────────────────────────────────────
214
+ const MEDIUM_IMPL = /\b(add|implement|build|create|fix|update)\b/i;
215
+ const mediumSignals = [];
216
+ if (risk === 'medium') {
217
+ mediumSignals.push('risk classified as medium');
218
+ }
219
+ if (files.length >= 2 && files.length <= 5) {
220
+ mediumSignals.push(`${files.length} files provided`);
221
+ }
222
+ if (MEDIUM_IMPL.test(prompt)) {
223
+ const match = prompt.match(MEDIUM_IMPL);
224
+ mediumSignals.push(`prompt contains implementation keyword ('${match[0]}')`);
225
+ }
226
+ if (mediumSignals.length > 0) {
227
+ return { depth: 'medium', signals: mediumSignals };
228
+ }
229
+ // ── Low signals ────────────────────────────────────────────────────────────
230
+ const lowSignals = [];
231
+ if (risk === 'low') {
232
+ lowSignals.push('risk classified as low');
233
+ }
234
+ if (files.length <= 1) {
235
+ lowSignals.push(files.length === 0 ? 'no files provided' : '1 file provided');
236
+ }
237
+ if (LOW_SIMPLE.test(prompt)) {
238
+ const match = prompt.match(LOW_SIMPLE);
239
+ lowSignals.push(`prompt is a simple lookup ('${match[0]}')`);
240
+ }
241
+ if (failures === 0) {
242
+ lowSignals.push('no prior failures');
243
+ }
244
+ return { depth: 'low', signals: lowSignals.length > 0 ? lowSignals : ['no elevated signals detected'] };
245
+ }
246
+ // ─── Plugin-aware detection helpers ───────────────────────────────────────────
247
+ const PLUGIN_KEYWORD_MAP = {
248
+ stripe: 'stripe', payment: 'stripe', checkout: 'stripe', subscription: 'stripe', webhook: 'stripe',
249
+ slack: 'slack', teams: 'teams',
250
+ supabase: 'supabase', neondb: 'neon-postgres',
251
+ github: 'github', 'pull request': 'github', linear: 'linear',
252
+ jira: 'atlassian-rovo', atlassian: 'atlassian-rovo',
253
+ gmail: 'gmail', outlook: 'outlook-email', notion: 'notion',
254
+ 'google calendar': 'google-calendar', 'google drive': 'google-drive',
255
+ sentry: 'sentry', vercel: 'vercel', netlify: 'netlify', cloudflare: 'cloudflare',
256
+ amplitude: 'amplitude', figma: 'figma', canva: 'canva',
257
+ hubspot: 'hubspot', pipedrive: 'pipedrive',
258
+ sendgrid: 'sendgrid', twilio: 'twilio-developer-kit',
259
+ sharepoint: 'sharepoint', box: 'box',
260
+ openai: 'openai-developers', 'hugging face': 'hugging-face',
261
+ razorpay: 'razorpay', render: 'render',
262
+ monday: 'monday-com', asana: 'asana', clickup: 'clickup',
263
+ };
264
+ /**
265
+ * Detect Codex plugin IDs that match keywords in the prompt.
266
+ */
267
+ export function detectSuggestedPlugins(prompt) {
268
+ if (!prompt)
269
+ return [];
270
+ const lower = prompt.toLowerCase();
271
+ const matched = new Set();
272
+ const sortedEntries = Object.entries(PLUGIN_KEYWORD_MAP).sort((a, b) => b[0].length - a[0].length);
273
+ for (const [keyword, pluginId] of sortedEntries) {
274
+ if (lower.includes(keyword)) {
275
+ matched.add(pluginId);
276
+ if (matched.size >= 5)
277
+ break;
278
+ }
279
+ }
280
+ return [...matched];
281
+ }
282
+ function checkCIRisk(cwd) {
283
+ try {
284
+ const currentBranch = execSync('git rev-parse --abbrev-ref HEAD', {
285
+ cwd, encoding: 'utf8', timeout: 3000, stdio: ['ignore', 'pipe', 'ignore'],
286
+ }).trim();
287
+ const json = execSync('gh run list --limit 5 --json conclusion,headBranch 2>/dev/null', { cwd, encoding: 'utf8', timeout: 8000 });
288
+ const runs = JSON.parse(json);
289
+ const branchFailure = runs.find(r => r.conclusion === 'failure' && r.headBranch === currentBranch);
290
+ return {
291
+ hasCIFailure: Boolean(branchFailure),
292
+ failedBranch: branchFailure ? currentBranch : null,
293
+ };
294
+ }
295
+ catch {
296
+ return { hasCIFailure: false, failedBranch: null };
297
+ }
298
+ }
299
+ // ─── Specialist registry ──────────────────────────────────────────────────────
300
+ const SPECIALIST_REGISTRY_PATH = resolve(__dirname, '../agents/specialists/registry.json');
301
+ const DEFAULT_SPECIALISTS = {
302
+ python: { triggers: { extensions: ['.py', '.pyx', '.pyi'], keywords: ['python', 'pip', 'pytest', 'django', 'flask', 'asyncio'] } },
303
+ typescript: { triggers: { extensions: ['.ts', '.tsx', '.mts'], keywords: ['typescript', 'tsc', 'generics', 'react', 'next', 'node'] } },
304
+ html: { triggers: { extensions: ['.html', '.css', '.scss', '.svg'], keywords: ['html', 'css', 'accessibility', 'a11y', 'aria', 'responsive', 'tailwind'] } },
305
+ linux: { triggers: { extensions: ['.sh', '.bash', '.conf', '.service', '.dockerfile'], keywords: ['linux', 'bash', 'shell', 'systemd', 'nginx', 'docker', 'ssh', 'deploy'] } },
306
+ security: { triggers: { extensions: [], keywords: ['auth', 'oauth', 'jwt', 'credential', 'secret', 'encrypt', 'vulnerability', 'vulnerabilities', 'audit', 'owasp', 'xss', 'csrf'] }, tier_bias: 'think' },
307
+ doctor: { triggers: { extensions: [], keywords: ['doctor', 'health', 'diagnose', 'diagnosis', 'checkup', 'drift', 'completeness', 'broken', 'regression', 'audit health', 'package health', 'health check', 'health report', 'health-manifest'] }, tier_bias: 'think' },
308
+ };
309
+ function loadSpecialistRegistry() {
310
+ try {
311
+ const raw = readFileSync(SPECIALIST_REGISTRY_PATH, 'utf8');
312
+ const parsed = JSON.parse(raw);
313
+ return parsed.specialists || DEFAULT_SPECIALISTS;
314
+ }
315
+ catch {
316
+ return DEFAULT_SPECIALISTS;
317
+ }
318
+ }
319
+ const SPECIALIST_DEFS = loadSpecialistRegistry();
320
+ /**
321
+ * Classify which specialist domain best matches the prompt and file list.
322
+ */
323
+ export function classifySpecialist(prompt = '', files = []) {
324
+ const promptLower = prompt.toLowerCase();
325
+ const scores = {};
326
+ const matchedTriggers = {};
327
+ for (const [name, def] of Object.entries(SPECIALIST_DEFS)) {
328
+ const { extensions = [], keywords = [] } = def.triggers || {};
329
+ let score = 0;
330
+ const hits = [];
331
+ for (const file of files) {
332
+ for (const ext of extensions) {
333
+ if (file.endsWith(ext)) {
334
+ score += 2;
335
+ hits.push(ext);
336
+ break;
337
+ }
338
+ }
339
+ }
340
+ for (const kw of keywords) {
341
+ const re = new RegExp(`\\b${kw.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\b`, 'i');
342
+ if (re.test(promptLower)) {
343
+ score += 1;
344
+ hits.push(kw);
345
+ }
346
+ }
347
+ scores[name] = score;
348
+ matchedTriggers[name] = hits;
349
+ }
350
+ let best = null;
351
+ let bestScore = 0;
352
+ let bestExtCount = 0;
353
+ for (const [name, score] of Object.entries(scores)) {
354
+ if (score < 2)
355
+ continue;
356
+ const extCount = matchedTriggers[name].filter(t => t.startsWith('.')).length;
357
+ if (score > bestScore ||
358
+ (score === bestScore && extCount > bestExtCount)) {
359
+ best = name;
360
+ bestScore = score;
361
+ bestExtCount = extCount;
362
+ }
363
+ }
364
+ if (!best) {
365
+ return { specialist: 'generic', confidence: 'low', triggers: [] };
366
+ }
367
+ const confidence = bestScore >= 4 ? 'high' : 'medium';
368
+ return { specialist: best, confidence, triggers: matchedTriggers[best] };
369
+ }
370
+ let _matchAgentFn = null;
371
+ /**
372
+ * Prime the agent registry so detectTask can match agents synchronously.
373
+ */
374
+ export async function primeAgentRegistry() {
375
+ try {
376
+ // @ts-ignore — registry.mjs not yet migrated
377
+ const { matchAgent } = await import('./agents/registry.js');
378
+ _matchAgentFn = matchAgent;
379
+ }
380
+ catch {
381
+ // Registry unavailable — detectTask continues without agent matching
382
+ }
383
+ }
384
+ function _matchAgentSync(intent, risk, taskType) {
385
+ try {
386
+ if (typeof _matchAgentFn !== 'function')
387
+ return null;
388
+ const matches = _matchAgentFn(intent, risk, taskType);
389
+ return matches.length > 0 ? matches[0] : null;
390
+ }
391
+ catch {
392
+ return null;
393
+ }
394
+ }
395
+ /** Main detection function. */
396
+ export function detectTask(input) {
397
+ const { prompt = '', files = [], sessionContext = null, headJudgment = null } = input;
398
+ let { priorFailures = 0 } = input;
399
+ // Session context: bump priorFailures if session history shows failures on similar tasks
400
+ let repeatedFailure = false;
401
+ if (sessionContext) {
402
+ const sessionFailures = Array.isArray(sessionContext.priorAttempts)
403
+ ? sessionContext.priorAttempts.filter(a => a && (a.failed || a.status === 'failed')).length
404
+ : 0;
405
+ if (sessionFailures > 0) {
406
+ priorFailures = Math.max(priorFailures, sessionFailures);
407
+ }
408
+ const riskSignals = sessionContext.riskSignals ?? [];
409
+ if (riskSignals.some(s => s && (typeof s === 'object' && (s.type === 'failure' || s.failed)) || (typeof s === 'string' && /fail/i.test(s)))) {
410
+ repeatedFailure = true;
411
+ }
412
+ if (sessionFailures >= 2)
413
+ repeatedFailure = true;
414
+ }
415
+ // 1. Intent
416
+ const intent = classifyIntent(prompt);
417
+ // 2. Paths and risk
418
+ const extractedPaths = extractPaths(prompt);
419
+ const allPaths = [...files, ...extractedPaths];
420
+ const { level: pathRiskLevel, riskyFiles } = classifyRisk(allPaths);
421
+ const designImpact = allPaths.some(p => DESIGN_IMPACT_PATTERNS.some(re => re.test(p)));
422
+ // 3. Keyword risk from description
423
+ let keywordRisk = 'low';
424
+ for (const { level, regex } of RISK_KEYWORDS) {
425
+ if (regex.test(prompt)) {
426
+ keywordRisk = level;
427
+ break;
428
+ }
429
+ }
430
+ let risk = higherRisk(pathRiskLevel, keywordRisk);
431
+ // Session context: bump risk one level if prior session attempts failed on similar tasks
432
+ if (repeatedFailure && LEVEL_ORDER[risk] < LEVEL_ORDER['high']) {
433
+ const riskLevels = ['low', 'medium', 'high', 'critical'];
434
+ const currentIdx = riskLevels.indexOf(risk);
435
+ risk = riskLevels[Math.min(currentIdx + 1, riskLevels.length - 1)];
436
+ }
437
+ const fileCount = files.length;
438
+ // 4. Complexity
439
+ const complexity = estimateComplexity({ prompt, fileCount, risk, intent, priorFailures });
440
+ // 5. Effort
441
+ const effortOrder = ['low', 'medium', 'high', 'xhigh'];
442
+ function bumpEffort(e, n = 1) {
443
+ return effortOrder[Math.min(effortOrder.indexOf(e) + n, effortOrder.length - 1)];
444
+ }
445
+ let effort = { trivial: 'low', simple: 'medium', moderate: 'high', complex: 'high' }[complexity];
446
+ if (risk === 'critical' && LEVEL_ORDER[effort] < LEVEL_ORDER['high'])
447
+ effort = 'high';
448
+ if (priorFailures >= 2) {
449
+ effort = 'xhigh';
450
+ }
451
+ else if (priorFailures === 1) {
452
+ effort = bumpEffort(effort, 1);
453
+ }
454
+ if (intent === 'format' || intent === 'search') {
455
+ if (LEVEL_ORDER[effort] > LEVEL_ORDER['medium'])
456
+ effort = 'medium';
457
+ }
458
+ if ((intent === 'architecture' || intent === 'security') && LEVEL_ORDER[effort] < LEVEL_ORDER['high']) {
459
+ effort = 'high';
460
+ }
461
+ // 6. Specialist
462
+ const specialistResult = classifySpecialist(prompt, files);
463
+ const specialistDef = SPECIALIST_DEFS[specialistResult.specialist] || null;
464
+ const specialistTierBias = specialistDef?.tier_bias || null;
465
+ // 7. Tier
466
+ const tier = inferTier({ intent, risk, complexity, effort, specialistTierBias });
467
+ // 8. Explanation
468
+ const explanation = buildExplanation({ intent, risk, complexity, fileCount, priorFailures });
469
+ // 9. Reasoning depth
470
+ const priorOutcomes = priorFailures > 0
471
+ ? Array.from({ length: priorFailures }, () => ({ failed: true }))
472
+ : [];
473
+ let { depth: reasoningDepth, signals: reasoningSignals } = classifyReasoningDepth(prompt, files, priorOutcomes);
474
+ // 10. Suggested Codex plugins
475
+ const suggestedPlugins = detectSuggestedPlugins(prompt);
476
+ // 11. CI risk
477
+ const ciRiskResult = checkCIRisk(input.cwd || process.cwd());
478
+ // 12. Match specialized agent
479
+ const suggestedAgent = _matchAgentSync(intent, risk, specialistResult.specialist || '');
480
+ // HEAD judgment override
481
+ const headOverrides = {};
482
+ if (headJudgment?.situation) {
483
+ const hj = headJudgment.situation;
484
+ const headRisk = hj.taskShape?.risk;
485
+ const headAmbiguity = hj.taskShape?.ambiguity;
486
+ if (headRisk && LEVEL_ORDER[headRisk] > LEVEL_ORDER[risk]) {
487
+ risk = headRisk;
488
+ headOverrides.riskElevatedBy = 'head-judgment';
489
+ }
490
+ const headDepthMap = { reflexive: 'low', light: 'medium', full: 'high', deep: 'ultra' };
491
+ const headDepth = headJudgment.depth ? headDepthMap[headJudgment.depth] : undefined;
492
+ if (headDepth) {
493
+ const depthOrder = { low: 0, medium: 1, high: 2, ultra: 3 };
494
+ if (depthOrder[headDepth] > depthOrder[reasoningDepth]) {
495
+ reasoningDepth = headDepth;
496
+ reasoningSignals.push(`HEAD assessed depth as ${headJudgment.depth}`);
497
+ headOverrides.depthElevatedBy = 'head-judgment';
498
+ }
499
+ }
500
+ if (headAmbiguity === 'high' && complexity !== 'complex') {
501
+ headOverrides.ambiguityWarning = 'HEAD detected high ambiguity';
502
+ }
503
+ }
504
+ return {
505
+ intent,
506
+ risk,
507
+ complexity,
508
+ effort,
509
+ tier,
510
+ fileCount,
511
+ riskyFiles,
512
+ designImpact,
513
+ requiresWrite: requiresWrite(intent),
514
+ explanation,
515
+ specialist: specialistResult,
516
+ reasoningDepth,
517
+ reasoningSignals,
518
+ suggestedPlugins,
519
+ ciRisk: ciRiskResult,
520
+ suggestedAgent,
521
+ ...(repeatedFailure && { repeatedFailure: true }),
522
+ ...(Object.keys(headOverrides).length > 0 && { headOverrides }),
523
+ };
524
+ }
525
+ // ─── CLI ──────────────────────────────────────────────────────────────────────
526
+ if (process.argv[1] && new URL(import.meta.url).pathname === process.argv[1]) {
527
+ const args = process.argv.slice(2);
528
+ const prompt = args.find(a => !a.startsWith('--')) || '';
529
+ if (!prompt) {
530
+ console.error('Usage: node src/detect.ts "task description" [--files a,b]');
531
+ process.exit(1);
532
+ }
533
+ const filesFlag = args.find(a => a.startsWith('--files=')) ||
534
+ (args.includes('--files') ? args[args.indexOf('--files') + 1] : null);
535
+ const files = filesFlag
536
+ ? filesFlag.replace(/^--files=/, '').split(',').map(f => f.trim()).filter(Boolean)
537
+ : [];
538
+ const failuresFlag = args.find(a => a.startsWith('--failures=')) ||
539
+ (args.includes('--failures') ? args[args.indexOf('--failures') + 1] : null);
540
+ const priorFailures = failuresFlag ? parseInt(failuresFlag.replace(/^--failures=/, ''), 10) : 0;
541
+ const result = detectTask({ prompt, files, priorFailures });
542
+ console.log(JSON.stringify(result, null, 2));
543
+ }
544
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/detect.ts"],"names":[],"mappings":"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"}