dual-brain 0.2.30 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. package/.dual-brain/docs/claude-code-extension-points.md +32 -0
  2. package/.dual-brain/docs/data-tools-capabilities.md +181 -0
  3. package/.dual-brain/docs/ecosystem-tools.md +91 -0
  4. package/.dual-brain/docs/panel-handoff.md +124 -0
  5. package/.dual-brain/docs/ruflo-analysis.md +48 -0
  6. package/bin/dual-brain.mjs +56 -56
  7. package/dist/mcp-server/index.d.ts +27 -0
  8. package/dist/mcp-server/index.js +359 -0
  9. package/dist/mcp-server/index.js.map +1 -0
  10. package/dist/src/agent-protocol.d.ts +163 -0
  11. package/dist/src/agent-protocol.js +368 -0
  12. package/dist/src/agent-protocol.js.map +1 -0
  13. package/dist/src/agents/registry.d.ts +52 -0
  14. package/dist/src/agents/registry.js +393 -0
  15. package/dist/src/agents/registry.js.map +1 -0
  16. package/dist/src/awareness.d.ts +93 -0
  17. package/dist/src/awareness.js +406 -0
  18. package/dist/src/awareness.js.map +1 -0
  19. package/dist/src/brief.d.ts +48 -0
  20. package/dist/src/brief.js +179 -0
  21. package/dist/src/brief.js.map +1 -0
  22. package/dist/src/calibration.d.ts +32 -0
  23. package/dist/src/calibration.js +133 -0
  24. package/dist/src/calibration.js.map +1 -0
  25. package/dist/src/checkpoint.d.ts +33 -0
  26. package/dist/src/checkpoint.js +99 -0
  27. package/dist/src/checkpoint.js.map +1 -0
  28. package/dist/src/ci-triage.d.ts +33 -0
  29. package/dist/src/ci-triage.js +193 -0
  30. package/dist/src/ci-triage.js.map +1 -0
  31. package/dist/src/cognitive-loop.d.ts +56 -0
  32. package/dist/src/cognitive-loop.js +495 -0
  33. package/dist/src/cognitive-loop.js.map +1 -0
  34. package/dist/src/collaboration.d.ts +147 -0
  35. package/dist/src/collaboration.js +438 -0
  36. package/dist/src/collaboration.js.map +1 -0
  37. package/dist/src/context-intel.d.ts +47 -0
  38. package/dist/src/context-intel.js +156 -0
  39. package/dist/src/context-intel.js.map +1 -0
  40. package/dist/src/context.d.ts +53 -0
  41. package/dist/src/context.js +332 -0
  42. package/dist/src/context.js.map +1 -0
  43. package/dist/src/continuity.d.ts +89 -0
  44. package/dist/src/continuity.js +230 -0
  45. package/dist/src/continuity.js.map +1 -0
  46. package/dist/src/cost-tracker.d.ts +47 -0
  47. package/dist/src/cost-tracker.js +170 -0
  48. package/dist/src/cost-tracker.js.map +1 -0
  49. package/dist/src/debrief.d.ts +53 -0
  50. package/dist/src/debrief.js +222 -0
  51. package/dist/src/debrief.js.map +1 -0
  52. package/dist/src/decide.d.ts +96 -0
  53. package/dist/src/decide.js +744 -0
  54. package/dist/src/decide.js.map +1 -0
  55. package/dist/src/decompose.d.ts +39 -0
  56. package/dist/src/decompose.js +218 -0
  57. package/dist/src/decompose.js.map +1 -0
  58. package/dist/src/detect.d.ts +91 -0
  59. package/dist/src/detect.js +544 -0
  60. package/dist/src/detect.js.map +1 -0
  61. package/dist/src/dispatch.d.ts +154 -0
  62. package/dist/src/dispatch.js +1306 -0
  63. package/dist/src/dispatch.js.map +1 -0
  64. package/dist/src/doctor.d.ts +421 -0
  65. package/dist/src/doctor.js +1689 -0
  66. package/dist/src/doctor.js.map +1 -0
  67. package/dist/src/engine.d.ts +70 -0
  68. package/dist/src/engine.js +155 -0
  69. package/dist/src/engine.js.map +1 -0
  70. package/dist/src/envelope.d.ts +36 -0
  71. package/dist/src/envelope.js +80 -0
  72. package/dist/src/envelope.js.map +1 -0
  73. package/dist/src/failure-memory.d.ts +55 -0
  74. package/dist/src/failure-memory.js +175 -0
  75. package/dist/src/failure-memory.js.map +1 -0
  76. package/dist/src/fx.d.ts +87 -0
  77. package/dist/src/fx.js +272 -0
  78. package/dist/src/fx.js.map +1 -0
  79. package/dist/src/governance.d.ts +93 -0
  80. package/dist/src/governance.js +261 -0
  81. package/dist/src/governance.js.map +1 -0
  82. package/dist/src/handoff.d.ts +11 -0
  83. package/dist/src/handoff.js +90 -0
  84. package/dist/src/handoff.js.map +1 -0
  85. package/dist/src/head-protocol.d.ts +76 -0
  86. package/dist/src/head-protocol.js +109 -0
  87. package/dist/src/head-protocol.js.map +1 -0
  88. package/dist/src/head.d.ts +222 -0
  89. package/dist/src/head.js +765 -0
  90. package/dist/src/head.js.map +1 -0
  91. package/dist/src/health.d.ts +132 -0
  92. package/dist/src/health.js +435 -0
  93. package/dist/src/health.js.map +1 -0
  94. package/dist/src/inbox.d.ts +70 -0
  95. package/dist/src/inbox.js +218 -0
  96. package/dist/src/inbox.js.map +1 -0
  97. package/dist/src/index.d.ts +33 -0
  98. package/dist/src/index.js +38 -0
  99. package/dist/src/index.js.map +1 -0
  100. package/dist/src/install-hooks.d.ts +13 -0
  101. package/dist/src/install-hooks.js +88 -0
  102. package/dist/src/install-hooks.js.map +1 -0
  103. package/dist/src/integrity.d.ts +59 -0
  104. package/dist/src/integrity.js +206 -0
  105. package/dist/src/integrity.js.map +1 -0
  106. package/dist/src/intelligence.d.ts +104 -0
  107. package/dist/src/intelligence.js +391 -0
  108. package/dist/src/intelligence.js.map +1 -0
  109. package/dist/src/ledger.d.ts +54 -0
  110. package/dist/src/ledger.js +179 -0
  111. package/dist/src/ledger.js.map +1 -0
  112. package/dist/src/living-docs.d.ts +14 -0
  113. package/dist/src/living-docs.js +197 -0
  114. package/dist/src/living-docs.js.map +1 -0
  115. package/dist/src/memory-tiers.d.ts +37 -0
  116. package/dist/src/memory-tiers.js +160 -0
  117. package/dist/src/memory-tiers.js.map +1 -0
  118. package/dist/src/model-profiles.d.ts +65 -0
  119. package/dist/src/model-profiles.js +568 -0
  120. package/dist/src/model-profiles.js.map +1 -0
  121. package/dist/src/models.d.ts +58 -0
  122. package/dist/src/models.js +327 -0
  123. package/dist/src/models.js.map +1 -0
  124. package/dist/src/narrative.d.ts +54 -0
  125. package/dist/src/narrative.js +163 -0
  126. package/dist/src/narrative.js.map +1 -0
  127. package/dist/src/nextstep.d.ts +16 -0
  128. package/dist/src/nextstep.js +103 -0
  129. package/dist/src/nextstep.js.map +1 -0
  130. package/dist/src/observer.d.ts +18 -0
  131. package/dist/src/observer.js +251 -0
  132. package/dist/src/observer.js.map +1 -0
  133. package/dist/src/outcome.d.ts +110 -0
  134. package/dist/src/outcome.js +377 -0
  135. package/dist/src/outcome.js.map +1 -0
  136. package/dist/src/pipeline.d.ts +167 -0
  137. package/dist/src/pipeline.js +1503 -0
  138. package/dist/src/pipeline.js.map +1 -0
  139. package/dist/src/playbook.d.ts +59 -0
  140. package/dist/src/playbook.js +238 -0
  141. package/dist/src/playbook.js.map +1 -0
  142. package/dist/src/pr-agent.d.ts +97 -0
  143. package/dist/src/pr-agent.js +195 -0
  144. package/dist/src/pr-agent.js.map +1 -0
  145. package/dist/src/predictive.d.ts +57 -0
  146. package/dist/src/predictive.js +230 -0
  147. package/dist/src/predictive.js.map +1 -0
  148. package/dist/src/profile.d.ts +294 -0
  149. package/dist/src/profile.js +1347 -0
  150. package/dist/src/profile.js.map +1 -0
  151. package/dist/src/prompt-audit.d.ts +22 -0
  152. package/dist/src/prompt-audit.js +194 -0
  153. package/dist/src/prompt-audit.js.map +1 -0
  154. package/dist/src/prompt-intel.d.ts +12 -0
  155. package/dist/src/prompt-intel.js +321 -0
  156. package/dist/src/prompt-intel.js.map +1 -0
  157. package/dist/src/provider-context.d.ts +121 -0
  158. package/dist/src/provider-context.js +222 -0
  159. package/dist/src/provider-context.js.map +1 -0
  160. package/dist/src/provider-manager.d.ts +92 -0
  161. package/dist/src/provider-manager.js +428 -0
  162. package/dist/src/provider-manager.js.map +1 -0
  163. package/dist/src/receipt.d.ts +87 -0
  164. package/dist/src/receipt.js +326 -0
  165. package/dist/src/receipt.js.map +1 -0
  166. package/dist/src/recommendations.d.ts +13 -0
  167. package/dist/src/recommendations.js +291 -0
  168. package/dist/src/recommendations.js.map +1 -0
  169. package/dist/src/redact.d.ts +15 -0
  170. package/dist/src/redact.js +129 -0
  171. package/dist/src/redact.js.map +1 -0
  172. package/dist/src/replit.d.ts +397 -0
  173. package/dist/src/replit.js +1160 -0
  174. package/dist/src/replit.js.map +1 -0
  175. package/dist/src/repo.d.ts +149 -0
  176. package/dist/src/repo.js +416 -0
  177. package/dist/src/repo.js.map +1 -0
  178. package/dist/src/revert.d.ts +30 -0
  179. package/dist/src/revert.js +166 -0
  180. package/dist/src/revert.js.map +1 -0
  181. package/dist/src/room.d.ts +102 -0
  182. package/dist/src/room.js +212 -0
  183. package/dist/src/room.js.map +1 -0
  184. package/dist/src/routing-advisor.d.ts +57 -0
  185. package/dist/src/routing-advisor.js +221 -0
  186. package/dist/src/routing-advisor.js.map +1 -0
  187. package/dist/src/self-correct.d.ts +40 -0
  188. package/dist/src/self-correct.js +137 -0
  189. package/dist/src/self-correct.js.map +1 -0
  190. package/dist/src/session-lock.d.ts +35 -0
  191. package/dist/src/session-lock.js +134 -0
  192. package/dist/src/session-lock.js.map +1 -0
  193. package/dist/src/session.d.ts +267 -0
  194. package/dist/src/session.js +1660 -0
  195. package/dist/src/session.js.map +1 -0
  196. package/dist/src/settings-tui.d.ts +5 -0
  197. package/dist/src/settings-tui.js +422 -0
  198. package/dist/src/settings-tui.js.map +1 -0
  199. package/dist/src/setup-flow.d.ts +63 -0
  200. package/dist/src/setup-flow.js +233 -0
  201. package/dist/src/setup-flow.js.map +1 -0
  202. package/dist/src/signal.d.ts +19 -0
  203. package/dist/src/signal.js +122 -0
  204. package/dist/src/signal.js.map +1 -0
  205. package/dist/src/simmer.d.ts +85 -0
  206. package/dist/src/simmer.js +224 -0
  207. package/dist/src/simmer.js.map +1 -0
  208. package/dist/src/state-export.d.ts +129 -0
  209. package/dist/src/state-export.js +233 -0
  210. package/dist/src/state-export.js.map +1 -0
  211. package/dist/src/strategy.d.ts +54 -0
  212. package/dist/src/strategy.js +95 -0
  213. package/dist/src/strategy.js.map +1 -0
  214. package/dist/src/subscription.d.ts +40 -0
  215. package/dist/src/subscription.js +189 -0
  216. package/dist/src/subscription.js.map +1 -0
  217. package/dist/src/templates.d.ts +208 -0
  218. package/dist/src/templates.js +238 -0
  219. package/dist/src/templates.js.map +1 -0
  220. package/dist/src/test.d.ts +9 -0
  221. package/dist/src/test.js +1173 -0
  222. package/dist/src/test.js.map +1 -0
  223. package/dist/src/think-engine.d.ts +67 -0
  224. package/dist/src/think-engine.js +412 -0
  225. package/dist/src/think-engine.js.map +1 -0
  226. package/dist/src/tui.d.ts +71 -0
  227. package/dist/src/tui.js +242 -0
  228. package/dist/src/tui.js.map +1 -0
  229. package/dist/src/types.d.ts +177 -0
  230. package/dist/src/types.js +6 -0
  231. package/dist/src/types.js.map +1 -0
  232. package/dist/src/update-check.d.ts +7 -0
  233. package/dist/src/update-check.js +36 -0
  234. package/dist/src/update-check.js.map +1 -0
  235. package/dist/src/wave-planner.d.ts +30 -0
  236. package/dist/src/wave-planner.js +281 -0
  237. package/dist/src/wave-planner.js.map +1 -0
  238. package/hooks/head-guard.sh +41 -0
  239. package/hooks/precompact.mjs +3 -3
  240. package/hooks/session-end.mjs +3 -3
  241. package/hooks/task-classifier.mjs +328 -0
  242. package/hooks/vibe-router.mjs +387 -0
  243. package/install.mjs +2 -2
  244. package/package.json +29 -153
  245. package/src/agents/registry.mjs +0 -405
  246. package/src/awareness.mjs +0 -425
  247. package/src/brief.mjs +0 -266
  248. package/src/calibration.mjs +0 -148
  249. package/src/checkpoint.mjs +0 -109
  250. package/src/ci-triage.mjs +0 -191
  251. package/src/cognitive-loop.mjs +0 -562
  252. package/src/collaboration.mjs +0 -545
  253. package/src/context-intel.mjs +0 -158
  254. package/src/context.mjs +0 -389
  255. package/src/continuity.mjs +0 -298
  256. package/src/cost-tracker.mjs +0 -184
  257. package/src/debrief.mjs +0 -228
  258. package/src/decide.mjs +0 -1099
  259. package/src/decompose.mjs +0 -331
  260. package/src/detect.mjs +0 -702
  261. package/src/dispatch.mjs +0 -1447
  262. package/src/doctor.mjs +0 -1607
  263. package/src/envelope.mjs +0 -139
  264. package/src/failure-memory.mjs +0 -178
  265. package/src/fx.mjs +0 -276
  266. package/src/governance.mjs +0 -279
  267. package/src/handoff.mjs +0 -87
  268. package/src/head-protocol.mjs +0 -128
  269. package/src/head.mjs +0 -952
  270. package/src/health.mjs +0 -528
  271. package/src/inbox.mjs +0 -195
  272. package/src/index.mjs +0 -44
  273. package/src/install-hooks.mjs +0 -100
  274. package/src/integrity.mjs +0 -245
  275. package/src/intelligence.mjs +0 -447
  276. package/src/ledger.mjs +0 -196
  277. package/src/living-docs.mjs +0 -210
  278. package/src/memory-tiers.mjs +0 -193
  279. package/src/models.mjs +0 -363
  280. package/src/narrative.mjs +0 -169
  281. package/src/nextstep.mjs +0 -100
  282. package/src/observer.mjs +0 -241
  283. package/src/outcome.mjs +0 -400
  284. package/src/pipeline.mjs +0 -1711
  285. package/src/playbook.mjs +0 -257
  286. package/src/pr-agent.mjs +0 -214
  287. package/src/predictive.mjs +0 -250
  288. package/src/profile.mjs +0 -1411
  289. package/src/prompt-audit.mjs +0 -231
  290. package/src/prompt-intel.mjs +0 -325
  291. package/src/provider-context.mjs +0 -257
  292. package/src/receipt.mjs +0 -344
  293. package/src/recommendations.mjs +0 -296
  294. package/src/redact.mjs +0 -192
  295. package/src/replit.mjs +0 -1210
  296. package/src/repo.mjs +0 -445
  297. package/src/revert.mjs +0 -149
  298. package/src/routing-advisor.mjs +0 -204
  299. package/src/self-correct.mjs +0 -147
  300. package/src/session-lock.mjs +0 -160
  301. package/src/session.mjs +0 -1655
  302. package/src/settings-tui.mjs +0 -373
  303. package/src/setup-flow.mjs +0 -223
  304. package/src/signal.mjs +0 -115
  305. package/src/simmer.mjs +0 -241
  306. package/src/strategy.mjs +0 -235
  307. package/src/subscription.mjs +0 -212
  308. package/src/templates.mjs +0 -260
  309. package/src/think-engine.mjs +0 -428
  310. package/src/tui.mjs +0 -276
  311. package/src/update-check.mjs +0 -35
  312. package/src/wave-planner.mjs +0 -294
@@ -0,0 +1,327 @@
1
+ /**
2
+ * models.ts — Static model intelligence registry for the Dual-Brain Orchestrator.
3
+ *
4
+ * Pure in-memory registry of AI model capabilities used by routing modules.
5
+ * No file I/O, no API calls. Updated with each package release.
6
+ */
7
+ export const REGISTRY_VERSION = '2026-05-15';
8
+ export const REGISTRY_UPDATED = '2026-05-15';
9
+ export const MODEL_REGISTRY = Object.freeze({
10
+ 'claude-opus-4-6': {
11
+ provider: 'anthropic',
12
+ name: 'Claude Opus 4.6',
13
+ tier: 'frontier',
14
+ contextWindow: 200000,
15
+ maxOutput: 32000,
16
+ strengths: ['complex reasoning', 'architecture', 'code review', 'long context', 'multi-step planning'],
17
+ weaknesses: ['speed', 'cost'],
18
+ costTier: 'high',
19
+ bestFor: ['think', 'review', 'architecture', 'complex debugging'],
20
+ speed: 'slow',
21
+ reasoning: true,
22
+ vision: true,
23
+ tools: true,
24
+ agentCapable: true,
25
+ },
26
+ 'claude-sonnet-4-6': {
27
+ provider: 'anthropic',
28
+ name: 'Claude Sonnet 4.6',
29
+ tier: 'workhorse',
30
+ contextWindow: 200000,
31
+ maxOutput: 16000,
32
+ strengths: ['balanced speed/quality', 'code generation', 'editing', 'testing'],
33
+ weaknesses: ['less depth on architecture decisions'],
34
+ costTier: 'medium',
35
+ bestFor: ['execute', 'implement', 'test', 'fix'],
36
+ speed: 'medium',
37
+ reasoning: true,
38
+ vision: true,
39
+ tools: true,
40
+ agentCapable: true,
41
+ },
42
+ 'claude-haiku-4-5-20251001': {
43
+ provider: 'anthropic',
44
+ name: 'Claude Haiku 4.5',
45
+ tier: 'fast',
46
+ contextWindow: 200000,
47
+ maxOutput: 8192,
48
+ strengths: ['speed', 'low cost', 'simple tasks', 'search', 'classification'],
49
+ weaknesses: ['complex reasoning', 'multi-step tasks'],
50
+ costTier: 'low',
51
+ bestFor: ['search', 'classify', 'simple edits', 'grep'],
52
+ speed: 'fast',
53
+ reasoning: false,
54
+ vision: true,
55
+ tools: true,
56
+ agentCapable: true,
57
+ },
58
+ 'gpt-5.5': {
59
+ provider: 'openai',
60
+ name: 'GPT-5.5',
61
+ tier: 'frontier',
62
+ contextWindow: 1050000,
63
+ maxOutput: 128000,
64
+ strengths: ['massive context', 'complex professional work', 'reasoning', 'web search', 'code interpreter'],
65
+ weaknesses: ['cost', 'latency on complex reasoning'],
66
+ costTier: 'premium',
67
+ bestFor: ['think', 'review', 'research', 'long-context analysis'],
68
+ speed: 'medium',
69
+ reasoning: true,
70
+ vision: true,
71
+ tools: true,
72
+ agentCapable: true,
73
+ },
74
+ 'o3': {
75
+ provider: 'openai',
76
+ name: 'o3',
77
+ tier: 'reasoning',
78
+ contextWindow: 200000,
79
+ maxOutput: 100000,
80
+ strengths: ['deep reasoning', 'math', 'code', 'science', 'multi-step logic'],
81
+ weaknesses: ['speed', 'cost', 'simple tasks overkill'],
82
+ costTier: 'premium',
83
+ bestFor: ['think', 'complex debugging', 'algorithm design', 'security analysis'],
84
+ speed: 'slow',
85
+ reasoning: true,
86
+ vision: true,
87
+ tools: true,
88
+ agentCapable: true,
89
+ },
90
+ 'gpt-4o': {
91
+ provider: 'openai',
92
+ name: 'GPT-4o',
93
+ tier: 'workhorse',
94
+ contextWindow: 128000,
95
+ maxOutput: 16384,
96
+ strengths: ['balanced', 'fast', 'multimodal', 'tool use'],
97
+ weaknesses: ['less depth than frontier models'],
98
+ costTier: 'medium',
99
+ bestFor: ['execute', 'implement', 'chat', 'multimodal'],
100
+ speed: 'fast',
101
+ reasoning: false,
102
+ vision: true,
103
+ tools: true,
104
+ agentCapable: true,
105
+ },
106
+ 'gpt-4o-mini': {
107
+ provider: 'openai',
108
+ name: 'GPT-4o Mini',
109
+ tier: 'fast',
110
+ contextWindow: 128000,
111
+ maxOutput: 16384,
112
+ strengths: ['very fast', 'very cheap', 'good enough for simple tasks'],
113
+ weaknesses: ['complex reasoning', 'nuanced code review'],
114
+ costTier: 'low',
115
+ bestFor: ['search', 'classify', 'simple tasks', 'formatting'],
116
+ speed: 'fast',
117
+ reasoning: false,
118
+ vision: true,
119
+ tools: true,
120
+ agentCapable: false,
121
+ },
122
+ });
123
+ const COST_TIER_ORDER = ['low', 'medium', 'high', 'premium'];
124
+ const SPEED_ORDER = ['fast', 'medium', 'slow'];
125
+ const TIER_ORDER = ['fast', 'workhorse', 'reasoning', 'frontier'];
126
+ const MODEL_QUIRKS = {
127
+ 'claude-opus-4-6': [
128
+ 'Best for architecture decisions',
129
+ 'Use for code review when quality matters',
130
+ 'Expensive — reserve for high-value tasks',
131
+ ],
132
+ 'claude-sonnet-4-6': [
133
+ 'Best general-purpose worker',
134
+ 'Good balance of speed and quality',
135
+ 'Use Agent(model: "sonnet") for work dispatch',
136
+ ],
137
+ 'claude-haiku-4-5-20251001': [
138
+ 'Best for fast search and classification',
139
+ 'Not reliable for multi-step edits',
140
+ 'Use for disposable search agents',
141
+ ],
142
+ 'gpt-5.5': [
143
+ 'Massive 1M+ context window',
144
+ 'Good challenger for dual-brain think',
145
+ 'Web search and code interpreter available',
146
+ ],
147
+ 'o3': [
148
+ 'Purpose-built for deep reasoning chains',
149
+ 'Strong challenger for security analysis',
150
+ 'Slow — avoid for quick tasks',
151
+ ],
152
+ 'gpt-4o': [
153
+ 'Fast and multimodal',
154
+ 'Solid fallback for execute-tier GPT work',
155
+ 'Native tool use support',
156
+ ],
157
+ 'gpt-4o-mini': [
158
+ 'Cheapest GPT option for simple tasks',
159
+ 'Not agent-capable — single-shot only',
160
+ 'Good for classification and formatting',
161
+ ],
162
+ };
163
+ export function getModel(modelId) {
164
+ return MODEL_REGISTRY[modelId] ?? null;
165
+ }
166
+ export function getModelsForTask(taskType, provider = null) {
167
+ const entries = Object.entries(MODEL_REGISTRY);
168
+ const filtered = entries.filter(([, m]) => {
169
+ if (provider && m.provider !== provider)
170
+ return false;
171
+ return true;
172
+ });
173
+ filtered.sort(([, a], [, b]) => {
174
+ const aMatch = a.bestFor.includes(taskType) ? 1 : 0;
175
+ const bMatch = b.bestFor.includes(taskType) ? 1 : 0;
176
+ if (bMatch !== aMatch)
177
+ return bMatch - aMatch;
178
+ const aTier = TIER_ORDER.indexOf(a.tier);
179
+ const bTier = TIER_ORDER.indexOf(b.tier);
180
+ if (bTier !== aTier)
181
+ return bTier - aTier;
182
+ return SPEED_ORDER.indexOf(a.speed) - SPEED_ORDER.indexOf(b.speed);
183
+ });
184
+ return filtered.map(([id, m]) => ({ id, ...m }));
185
+ }
186
+ export function getBestModel(taskType, constraints = {}) {
187
+ const { provider = null, maxCost = null, preferSpeed = false, requireReasoning = false, minContext = 0 } = constraints;
188
+ let candidates = getModelsForTask(taskType, provider);
189
+ if (requireReasoning) {
190
+ candidates = candidates.filter(m => m.reasoning);
191
+ }
192
+ if (minContext > 0) {
193
+ candidates = candidates.filter(m => m.contextWindow >= minContext);
194
+ }
195
+ if (maxCost) {
196
+ const maxIdx = COST_TIER_ORDER.indexOf(maxCost);
197
+ if (maxIdx !== -1) {
198
+ candidates = candidates.filter(m => COST_TIER_ORDER.indexOf(m.costTier) <= maxIdx);
199
+ }
200
+ }
201
+ if (preferSpeed) {
202
+ candidates.sort((a, b) => SPEED_ORDER.indexOf(a.speed) - SPEED_ORDER.indexOf(b.speed));
203
+ }
204
+ return candidates[0] ?? null;
205
+ }
206
+ export function compareModels(modelA, modelB) {
207
+ const a = MODEL_REGISTRY[modelA];
208
+ const b = MODEL_REGISTRY[modelB];
209
+ if (!a || !b) {
210
+ return {
211
+ contextAdvantage: 'tie',
212
+ speedAdvantage: 'tie',
213
+ costAdvantage: 'tie',
214
+ reasoningAdvantage: 'tie',
215
+ recommendation: 'One or both model IDs are unknown.',
216
+ };
217
+ }
218
+ const ctxAdv = a.contextWindow > b.contextWindow ? 'a'
219
+ : b.contextWindow > a.contextWindow ? 'b'
220
+ : 'tie';
221
+ const spdA = SPEED_ORDER.indexOf(a.speed);
222
+ const spdB = SPEED_ORDER.indexOf(b.speed);
223
+ const spdAdv = spdA < spdB ? 'a' : spdB < spdA ? 'b' : 'tie';
224
+ const costA = COST_TIER_ORDER.indexOf(a.costTier);
225
+ const costB = COST_TIER_ORDER.indexOf(b.costTier);
226
+ const costAdv = costA < costB ? 'a' : costB < costA ? 'b' : 'tie';
227
+ const rsnAdv = (a.reasoning && !b.reasoning) ? 'a'
228
+ : (b.reasoning && !a.reasoning) ? 'b'
229
+ : 'tie';
230
+ const aAdvantages = [ctxAdv, spdAdv, costAdv, rsnAdv].filter(v => v === 'a').length;
231
+ const bAdvantages = [ctxAdv, spdAdv, costAdv, rsnAdv].filter(v => v === 'b').length;
232
+ let recommendation;
233
+ if (aAdvantages > bAdvantages) {
234
+ recommendation = `Use ${a.name} for ${a.bestFor.slice(0, 2).join('/')}; ${b.name} as a lighter alternative.`;
235
+ }
236
+ else if (bAdvantages > aAdvantages) {
237
+ recommendation = `Use ${b.name} for ${b.bestFor.slice(0, 2).join('/')}; ${a.name} as a lighter alternative.`;
238
+ }
239
+ else {
240
+ recommendation = `${a.name} and ${b.name} are comparable — choose based on provider availability.`;
241
+ }
242
+ return { contextAdvantage: ctxAdv, speedAdvantage: spdAdv, costAdvantage: costAdv, reasoningAdvantage: rsnAdv, recommendation };
243
+ }
244
+ export function getRegistryAge() {
245
+ const updated = new Date(REGISTRY_UPDATED);
246
+ const now = new Date();
247
+ return Math.floor((now.getTime() - updated.getTime()) / (1000 * 60 * 60 * 24));
248
+ }
249
+ const COST_SYMBOL = { low: '$', medium: '$$', high: '$$$', premium: '$$$$' };
250
+ function fmtCtx(n) {
251
+ if (n >= 1000000)
252
+ return `${(n / 1000000).toFixed(2)}M ctx`;
253
+ return `${Math.round(n / 1000)}K ctx`;
254
+ }
255
+ export function formatModelTable(provider = null) {
256
+ const groups = {};
257
+ for (const [id, m] of Object.entries(MODEL_REGISTRY)) {
258
+ if (provider && m.provider !== provider)
259
+ continue;
260
+ if (!groups[m.provider])
261
+ groups[m.provider] = [];
262
+ groups[m.provider].push({ id, ...m });
263
+ }
264
+ const lines = [];
265
+ const providerLabels = { anthropic: 'Claude Models', openai: 'OpenAI Models' };
266
+ const providerOrder = ['anthropic', 'openai'];
267
+ for (const prov of providerOrder) {
268
+ if (!groups[prov])
269
+ continue;
270
+ lines.push(`${providerLabels[prov] ?? prov}:`);
271
+ for (const m of groups[prov]) {
272
+ const displayName = m.provider === 'anthropic' ? m.name.replace(/^Claude /, '') : m.name;
273
+ const name = displayName.padEnd(12);
274
+ const tier = m.tier.padEnd(10);
275
+ const ctx = fmtCtx(m.contextWindow).padEnd(10);
276
+ const speed = m.speed.padEnd(8);
277
+ const cost = (COST_SYMBOL[m.costTier] ?? '?').padEnd(6);
278
+ const tasks = m.bestFor.slice(0, 2).join('/');
279
+ lines.push(` ${name}${tier}${ctx}${speed}${cost}${tasks}`);
280
+ }
281
+ lines.push('');
282
+ }
283
+ return lines.join('\n').trimEnd();
284
+ }
285
+ export function getModelQuirks(modelId) {
286
+ return MODEL_QUIRKS[modelId] ?? [];
287
+ }
288
+ export function suggestModel(intent, risk, complexity, availableProviders = ['anthropic', 'openai']) {
289
+ const intentLower = (intent || '').toLowerCase();
290
+ const TASK_MAP = {
291
+ think: ['architect', 'design', 'plan', 'review', 'security', 'audit', 'analysis', 'analyze'],
292
+ execute: ['implement', 'edit', 'fix', 'refactor', 'test', 'build', 'write', 'update', 'create'],
293
+ search: ['search', 'find', 'grep', 'look', 'explore', 'classify', 'format', 'list'],
294
+ };
295
+ let taskType = 'execute';
296
+ for (const [type, keywords] of Object.entries(TASK_MAP)) {
297
+ if (keywords.some(kw => intentLower.includes(kw))) {
298
+ taskType = type;
299
+ break;
300
+ }
301
+ }
302
+ if ((risk === 'critical' || risk === 'high') && taskType !== 'think') {
303
+ taskType = 'think';
304
+ }
305
+ const requireReasoning = complexity === 'complex' || risk === 'critical';
306
+ const preferSpeed = risk === 'low' && complexity === 'simple';
307
+ const maxCost = risk === 'low' && complexity !== 'complex' ? 'medium' : null;
308
+ const candidates = getModelsForTask(taskType)
309
+ .filter(m => availableProviders.includes(m.provider))
310
+ .filter(m => !requireReasoning || m.reasoning)
311
+ .filter(m => !maxCost || COST_TIER_ORDER.indexOf(m.costTier) <= COST_TIER_ORDER.indexOf(maxCost));
312
+ if (preferSpeed) {
313
+ candidates.sort((a, b) => SPEED_ORDER.indexOf(a.speed) - SPEED_ORDER.indexOf(b.speed));
314
+ }
315
+ const best = candidates[0] ?? null;
316
+ if (!best) {
317
+ return { model: null, reason: 'No suitable model found for the given constraints.', alternatives: [] };
318
+ }
319
+ const reason = [
320
+ `Selected ${best.name} for ${taskType}-tier work`,
321
+ risk !== 'low' ? `(${risk} risk)` : null,
322
+ requireReasoning ? '— reasoning required' : null,
323
+ ].filter(Boolean).join(' ');
324
+ const alternatives = candidates.slice(1, 3).map(m => ({ id: m.id, name: m.name }));
325
+ return { model: best.id, reason, alternatives };
326
+ }
327
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Load the current running narrative. Returns empty string if none exists.
3
+ * This is meant to be injected at the top of HEAD's context each turn.
4
+ */
5
+ export declare function load(): string;
6
+ /**
7
+ * Write a new narrative, replacing the old one.
8
+ * The old narrative is archived to history before overwrite.
9
+ *
10
+ * @param {string} prose - HEAD's current understanding in prose form.
11
+ * Should answer: Where are we? What just happened? What's brewing?
12
+ * What did the user care about? What should I not forget?
13
+ */
14
+ export declare function write(prose: string): void;
15
+ /**
16
+ * Evolve the narrative — append new observations without replacing everything.
17
+ * Used after dispatches return, after user says something illuminating,
18
+ * or after a wave completes.
19
+ *
20
+ * @param {string} addition - New prose to weave into the narrative.
21
+ * @param {object} opts
22
+ * @param {boolean} opts.replace - If true, replace entirely instead of appending.
23
+ */
24
+ export declare function evolve(addition: string, { replace }?: {
25
+ replace?: boolean;
26
+ }): void;
27
+ /**
28
+ * Generate a narrative excerpt suitable for a dispatch envelope.
29
+ * Shorter than the full narrative — just enough context for a worker
30
+ * to understand the "why" without the full stream of consciousness.
31
+ *
32
+ * @param {number} maxLength - Max chars for the excerpt (default 500)
33
+ * @returns {string}
34
+ */
35
+ export declare function excerpt(maxLength?: number): string;
36
+ /**
37
+ * Get recent narrative history entries (for warm memory tier).
38
+ * @param {number} n - Number of recent entries to retrieve
39
+ * @returns {Array<{ts: number, text: string}>}
40
+ */
41
+ export declare function recentHistory(n?: number): Array<{
42
+ ts: number;
43
+ text: string;
44
+ }>;
45
+ /**
46
+ * Persist the current narrative for precompact survival.
47
+ * Called by the precompact hook before context compression.
48
+ * Returns the narrative that was persisted (for confirmation).
49
+ */
50
+ export declare function persist(): string;
51
+ /**
52
+ * Clear the narrative (used in testing or session reset).
53
+ */
54
+ export declare function clear(): void;
@@ -0,0 +1,163 @@
1
+ // narrative.ts — HEAD's running narrative: prose it writes to itself between turns.
2
+ // Not structured data. A paragraph or two that captures where we are, what just
3
+ // happened, what's brewing. Loaded at the top of each turn so HEAD is immediately
4
+ // "in the song" without reconstructing from scattered JSON.
5
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ const STATE_DIR = join(process.cwd(), '.dualbrain');
8
+ const NARRATIVE_FILE = join(STATE_DIR, 'narrative.md');
9
+ const NARRATIVE_HISTORY = join(STATE_DIR, 'narrative-history.jsonl');
10
+ const MAX_NARRATIVE_LENGTH = 2000;
11
+ const MAX_HISTORY_ENTRIES = 20;
12
+ /**
13
+ * Load the current running narrative. Returns empty string if none exists.
14
+ * This is meant to be injected at the top of HEAD's context each turn.
15
+ */
16
+ export function load() {
17
+ try {
18
+ if (existsSync(NARRATIVE_FILE)) {
19
+ return readFileSync(NARRATIVE_FILE, 'utf8').trim();
20
+ }
21
+ }
22
+ catch { }
23
+ return '';
24
+ }
25
+ /**
26
+ * Write a new narrative, replacing the old one.
27
+ * The old narrative is archived to history before overwrite.
28
+ *
29
+ * @param {string} prose - HEAD's current understanding in prose form.
30
+ * Should answer: Where are we? What just happened? What's brewing?
31
+ * What did the user care about? What should I not forget?
32
+ */
33
+ export function write(prose) {
34
+ if (!prose || typeof prose !== 'string')
35
+ return;
36
+ const trimmed = prose.slice(0, MAX_NARRATIVE_LENGTH).trim();
37
+ if (!trimmed)
38
+ return;
39
+ mkdirSync(STATE_DIR, { recursive: true });
40
+ // Archive current before overwriting
41
+ const current = load();
42
+ if (current) {
43
+ _appendHistory(current);
44
+ }
45
+ writeFileSync(NARRATIVE_FILE, trimmed + '\n');
46
+ }
47
+ /**
48
+ * Evolve the narrative — append new observations without replacing everything.
49
+ * Used after dispatches return, after user says something illuminating,
50
+ * or after a wave completes.
51
+ *
52
+ * @param {string} addition - New prose to weave into the narrative.
53
+ * @param {object} opts
54
+ * @param {boolean} opts.replace - If true, replace entirely instead of appending.
55
+ */
56
+ export function evolve(addition, { replace = false } = {}) {
57
+ if (!addition || typeof addition !== 'string')
58
+ return;
59
+ if (replace) {
60
+ write(addition);
61
+ return;
62
+ }
63
+ const current = load();
64
+ const combined = current
65
+ ? current + '\n\n' + addition.trim()
66
+ : addition.trim();
67
+ // If too long, keep the newest portion (recency bias for immersion)
68
+ const final = combined.length > MAX_NARRATIVE_LENGTH
69
+ ? combined.slice(-MAX_NARRATIVE_LENGTH)
70
+ : combined;
71
+ mkdirSync(STATE_DIR, { recursive: true });
72
+ writeFileSync(NARRATIVE_FILE, final.trim() + '\n');
73
+ }
74
+ /**
75
+ * Generate a narrative excerpt suitable for a dispatch envelope.
76
+ * Shorter than the full narrative — just enough context for a worker
77
+ * to understand the "why" without the full stream of consciousness.
78
+ *
79
+ * @param {number} maxLength - Max chars for the excerpt (default 500)
80
+ * @returns {string}
81
+ */
82
+ export function excerpt(maxLength = 500) {
83
+ const full = load();
84
+ if (!full)
85
+ return '';
86
+ if (full.length <= maxLength)
87
+ return full;
88
+ // Take the last N chars — most recent context is most relevant for workers
89
+ const trimmed = full.slice(-maxLength);
90
+ // Find the first sentence boundary to avoid mid-thought cuts
91
+ const firstPeriod = trimmed.indexOf('. ');
92
+ if (firstPeriod > 0 && firstPeriod < maxLength * 0.4) {
93
+ return trimmed.slice(firstPeriod + 2);
94
+ }
95
+ return trimmed;
96
+ }
97
+ /**
98
+ * Get recent narrative history entries (for warm memory tier).
99
+ * @param {number} n - Number of recent entries to retrieve
100
+ * @returns {Array<{ts: number, text: string}>}
101
+ */
102
+ export function recentHistory(n = 5) {
103
+ try {
104
+ if (!existsSync(NARRATIVE_HISTORY))
105
+ return [];
106
+ const lines = readFileSync(NARRATIVE_HISTORY, 'utf8').trim().split('\n').filter(Boolean);
107
+ return lines.slice(-n).map(line => {
108
+ try {
109
+ return JSON.parse(line);
110
+ }
111
+ catch {
112
+ return null;
113
+ }
114
+ }).filter(Boolean);
115
+ }
116
+ catch {
117
+ return [];
118
+ }
119
+ }
120
+ /**
121
+ * Persist the current narrative for precompact survival.
122
+ * Called by the precompact hook before context compression.
123
+ * Returns the narrative that was persisted (for confirmation).
124
+ */
125
+ export function persist() {
126
+ const current = load();
127
+ if (!current)
128
+ return '';
129
+ // Narrative is already on disk — this just ensures it's fresh
130
+ // and archives a snapshot with explicit "precompact" marker
131
+ _appendHistory(current, { reason: 'precompact' });
132
+ return current;
133
+ }
134
+ /**
135
+ * Clear the narrative (used in testing or session reset).
136
+ */
137
+ export function clear() {
138
+ try {
139
+ if (existsSync(NARRATIVE_FILE)) {
140
+ writeFileSync(NARRATIVE_FILE, '');
141
+ }
142
+ }
143
+ catch { }
144
+ }
145
+ // ── Internal ──────────────────────────────────────────────────────────────────
146
+ function _appendHistory(text, meta = {}) {
147
+ try {
148
+ const entry = JSON.stringify({ ts: Date.now(), text: text.slice(0, 800), ...meta });
149
+ mkdirSync(STATE_DIR, { recursive: true });
150
+ // Cap history file
151
+ let existing = '';
152
+ if (existsSync(NARRATIVE_HISTORY)) {
153
+ existing = readFileSync(NARRATIVE_HISTORY, 'utf8');
154
+ const lines = existing.trim().split('\n').filter(Boolean);
155
+ if (lines.length >= MAX_HISTORY_ENTRIES) {
156
+ existing = lines.slice(-MAX_HISTORY_ENTRIES + 1).join('\n') + '\n';
157
+ }
158
+ }
159
+ writeFileSync(NARRATIVE_HISTORY, existing + entry + '\n');
160
+ }
161
+ catch { }
162
+ }
163
+ //# sourceMappingURL=narrative.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"narrative.js","sourceRoot":"","sources":["../../src/narrative.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare function suggestNextSteps(completedTask?: Record<string, unknown>, outcome?: Record<string, unknown>, cwd?: string): Promise<{
2
+ steps: {
3
+ priority: number;
4
+ type: string;
5
+ message: string;
6
+ command: string | null;
7
+ reason: string;
8
+ }[];
9
+ topSuggestion: string;
10
+ }>;
11
+ export declare function formatNextSteps(steps: Array<{
12
+ message: string;
13
+ }> | undefined, limit?: number): string;
14
+ export declare function getTopSuggestion(steps: Array<{
15
+ message: string;
16
+ }> | undefined): string;