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,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;