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,368 @@
1
+ /**
2
+ * agent-protocol.ts — Typed contract system for the dual-brain agent hierarchy.
3
+ *
4
+ * Defines how HEAD, Managers, Supervisors, and Workers communicate:
5
+ * what they receive, what they produce, how they escalate, and how they report.
6
+ *
7
+ * Hierarchy:
8
+ * HEAD (user's session, lightest context)
9
+ * → Manager (project-level, persistent across sessions)
10
+ * → Supervisor (wave-level, deploys and monitors workers)
11
+ * → Worker (task-level, executes and reports)
12
+ */
13
+ import { listRooms, readInsights, readPlan, readDecision, readWorkerAssignment, readWorkerResult, getWorkerStatuses, readUserInput, getRoom, } from './room.js';
14
+ // ─── Depth Classification ─────────────────────────────────────────────────
15
+ const WORKER_KEYWORDS = [
16
+ 'fix typo', 'rename', 'update version', 'bump', 'add comment',
17
+ 'format', 'lint', 'delete', 'remove unused', 'change string',
18
+ 'update import', 'toggle', 'flip', 'swap',
19
+ ];
20
+ const SUPERVISOR_KEYWORDS = [
21
+ 'implement', 'add feature', 'create', 'build', 'write',
22
+ 'refactor', 'test', 'migrate', 'convert', 'extract',
23
+ 'move', 'split', 'merge files', 'update module',
24
+ ];
25
+ const MANAGER_KEYWORDS = [
26
+ 'architect', 'redesign', 'overhaul', 'rewrite', 'multi-module',
27
+ 'cross-cutting', 'system', 'platform', 'framework', 'migration plan',
28
+ 'full rewrite', 'new system', 'integrate', 'multi-service',
29
+ ];
30
+ /**
31
+ * Determine how deep the hierarchy should go for this task.
32
+ * Simple tasks return 'worker' (HEAD dispatches directly).
33
+ * Medium returns 'supervisor'. Complex returns 'manager'.
34
+ */
35
+ export function classifyDepth(taskDescription, complexity) {
36
+ const lower = taskDescription.toLowerCase();
37
+ // If explicit complexity score is provided, use thresholds
38
+ if (complexity !== undefined) {
39
+ if (complexity <= 0.2)
40
+ return 'worker';
41
+ if (complexity <= 0.5)
42
+ return 'supervisor';
43
+ return 'manager';
44
+ }
45
+ // Keyword matching — check from most complex to simplest
46
+ for (const kw of MANAGER_KEYWORDS) {
47
+ if (lower.includes(kw))
48
+ return 'manager';
49
+ }
50
+ for (const kw of SUPERVISOR_KEYWORDS) {
51
+ if (lower.includes(kw))
52
+ return 'supervisor';
53
+ }
54
+ for (const kw of WORKER_KEYWORDS) {
55
+ if (lower.includes(kw))
56
+ return 'worker';
57
+ }
58
+ // Heuristic: longer descriptions tend to be more complex
59
+ const wordCount = taskDescription.trim().split(/\s+/).length;
60
+ if (wordCount <= 8)
61
+ return 'worker';
62
+ if (wordCount <= 30)
63
+ return 'supervisor';
64
+ return 'manager';
65
+ }
66
+ // ─── Build Functions ──────────────────────────────────────────────────────
67
+ /**
68
+ * Assemble HEAD's input from room files and provider state.
69
+ */
70
+ export function buildHeadInput(cwd) {
71
+ const roomSummaries = listRooms(cwd);
72
+ // Gather recent insights from all active rooms
73
+ const recentInsights = [];
74
+ for (const room of roomSummaries) {
75
+ if (room.status !== 'active')
76
+ continue;
77
+ const insights = readInsights(room.id, cwd);
78
+ recentInsights.push(...insights);
79
+ }
80
+ // Sort insights by timestamp descending, keep most recent
81
+ recentInsights.sort((a, b) => {
82
+ return new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime();
83
+ });
84
+ const trimmedInsights = recentInsights.slice(0, 10);
85
+ return {
86
+ userMessage: '', // Caller fills this in
87
+ roomSummaries,
88
+ providerHealth: [], // Caller fills from health module
89
+ recentInsights: trimmedInsights,
90
+ };
91
+ }
92
+ /**
93
+ * Assemble Manager's input from room files.
94
+ */
95
+ export function buildManagerInput(roomId, cwd) {
96
+ const room = getRoom(roomId, cwd);
97
+ const taskDescription = room?.meta?.taskDescription || '';
98
+ // Gather user inputs
99
+ const userInput = readUserInput(roomId, cwd);
100
+ const userInputs = userInput ? [userInput] : [];
101
+ // Gather decisions
102
+ const decision = readDecision(roomId, cwd);
103
+ const decisions = decision ? [decision] : [];
104
+ // Gather wave results from completed workers
105
+ const plan = readPlan(roomId, cwd);
106
+ const waveResults = [];
107
+ if (plan?.waves) {
108
+ for (const wave of plan.waves) {
109
+ if (wave.status !== 'completed' && wave.status !== 'failed')
110
+ continue;
111
+ const workerStatuses = getWorkerStatuses(roomId, cwd);
112
+ const workerResults = [];
113
+ for (const [workerId, status] of Object.entries(workerStatuses)) {
114
+ if (status === 'completed' || status === 'failed') {
115
+ const result = readWorkerResult(roomId, workerId, cwd);
116
+ if (result)
117
+ workerResults.push(result);
118
+ }
119
+ }
120
+ const successCount = workerResults.filter(r => r.status === 'success').length;
121
+ const qualityScore = workerResults.length > 0
122
+ ? successCount / workerResults.length
123
+ : 0;
124
+ waveResults.push({
125
+ waveId: wave.id,
126
+ status: wave.status === 'completed' ? 'completed'
127
+ : successCount > 0 ? 'partial' : 'failed',
128
+ workerResults,
129
+ qualityScore,
130
+ });
131
+ }
132
+ }
133
+ return {
134
+ roomId,
135
+ taskDescription,
136
+ userInputs,
137
+ decisions,
138
+ waveResults,
139
+ modelProfiles: [], // Caller fills from model-profiles module
140
+ providerHealth: [], // Caller fills from health module
141
+ };
142
+ }
143
+ /**
144
+ * Assemble Supervisor's input for a specific wave.
145
+ */
146
+ export function buildSupervisorInput(roomId, waveId, cwd) {
147
+ const plan = readPlan(roomId, cwd);
148
+ let tasks = [];
149
+ if (plan?.waves) {
150
+ const wave = plan.waves.find(w => w.id === waveId);
151
+ if (wave) {
152
+ tasks = wave.tasks;
153
+ }
154
+ }
155
+ return {
156
+ roomId,
157
+ waveId,
158
+ tasks,
159
+ modelProfiles: [], // Caller fills
160
+ budget: buildBudget('balanced', tasks.length),
161
+ providerHealth: [], // Caller fills
162
+ };
163
+ }
164
+ /**
165
+ * Assemble Worker's input with file contents.
166
+ */
167
+ export function buildWorkerInput(roomId, taskId, cwd) {
168
+ // Try to find the worker assignment by scanning workers
169
+ const workerStatuses = getWorkerStatuses(roomId, cwd);
170
+ let assignment = null;
171
+ for (const workerId of Object.keys(workerStatuses)) {
172
+ const wa = readWorkerAssignment(roomId, workerId, cwd);
173
+ if (wa && wa.taskId === taskId) {
174
+ assignment = wa;
175
+ break;
176
+ }
177
+ }
178
+ // Fallback: build a minimal assignment from the plan
179
+ if (!assignment) {
180
+ const plan = readPlan(roomId, cwd);
181
+ if (plan?.waves) {
182
+ for (const wave of plan.waves) {
183
+ const task = wave.tasks.find(t => t.id === taskId);
184
+ if (task) {
185
+ assignment = {
186
+ taskId: task.id,
187
+ description: task.description,
188
+ model: task.assignedModel || '',
189
+ tier: task.tier,
190
+ files: task.files,
191
+ acceptanceCriteria: [],
192
+ constraints: [],
193
+ };
194
+ break;
195
+ }
196
+ }
197
+ }
198
+ }
199
+ if (!assignment) {
200
+ assignment = {
201
+ taskId,
202
+ description: '',
203
+ model: '',
204
+ tier: 1,
205
+ files: [],
206
+ acceptanceCriteria: [],
207
+ constraints: [],
208
+ };
209
+ }
210
+ // Read file contents for context — actual I/O delegated to caller
211
+ // We provide the structure; caller populates contextFiles with real content
212
+ const contextFiles = {};
213
+ return {
214
+ roomId,
215
+ taskId,
216
+ assignment,
217
+ contextFiles,
218
+ };
219
+ }
220
+ // ─── Validation ───────────────────────────────────────────────────────────
221
+ /**
222
+ * Type-check agent output before accepting.
223
+ * Returns true if the output matches the expected shape for the given level.
224
+ */
225
+ export function validateOutput(level, output) {
226
+ if (!output || typeof output !== 'object')
227
+ return false;
228
+ const o = output;
229
+ switch (level) {
230
+ case 'head':
231
+ return (typeof o.userResponse === 'string' &&
232
+ Array.isArray(o.roomActions) &&
233
+ typeof o.escalationNeeded === 'boolean');
234
+ case 'manager':
235
+ return (Array.isArray(o.insights) &&
236
+ Array.isArray(o.supervisorDeployments) &&
237
+ typeof o.status === 'string' &&
238
+ ['planning', 'executing', 'reviewing', 'completed', 'blocked'].includes(o.status));
239
+ case 'supervisor':
240
+ return (Array.isArray(o.workerDeployments) &&
241
+ Array.isArray(o.qualityChecks) &&
242
+ typeof o.waveStatus === 'string' &&
243
+ ['running', 'completed', 'failed', 'needs-replan'].includes(o.waveStatus));
244
+ case 'worker':
245
+ return (o.result !== null &&
246
+ typeof o.result === 'object' &&
247
+ typeof o.selfAssessment === 'number' &&
248
+ o.selfAssessment >= 0 && o.selfAssessment <= 1 &&
249
+ Array.isArray(o.issues));
250
+ default:
251
+ return false;
252
+ }
253
+ }
254
+ // ─── Cost Estimation ──────────────────────────────────────────────────────
255
+ // Average tokens per tier (rough heuristic)
256
+ const TIER_TOKEN_ESTIMATES = {
257
+ 1: 5000, // search/simple
258
+ 2: 15000, // moderate
259
+ 3: 30000, // complex/think
260
+ };
261
+ /**
262
+ * Estimate token cost for a set of worker deployments.
263
+ * Returns estimated total tokens.
264
+ */
265
+ export function estimateCost(deployments, profiles) {
266
+ let total = 0;
267
+ for (const dep of deployments) {
268
+ const profile = profiles.find(p => p.id === dep.model);
269
+ const tier = profile?.tier || 2;
270
+ const baseTokens = TIER_TOKEN_ESTIMATES[tier] || 15000;
271
+ // Adjust by file count in assignment
272
+ const fileMultiplier = Math.max(1, dep.assignment.files.length * 0.5);
273
+ total += Math.round(baseTokens * fileMultiplier);
274
+ }
275
+ return total;
276
+ }
277
+ // ─── Model Selection ──────────────────────────────────────────────────────
278
+ /**
279
+ * Pick the best available model for a task given budget constraints.
280
+ * Matches task tier to model tier, filtered by availability and budget.
281
+ */
282
+ export function selectModel(task, profiles, budget) {
283
+ // Filter to available models only
284
+ const available = profiles.filter(p => p.available);
285
+ if (available.length === 0) {
286
+ // Fallback: return first profile regardless of availability
287
+ return profiles.length > 0 ? profiles[0].id : '';
288
+ }
289
+ // Determine max tier based on budget
290
+ const maxTier = budget.costTier === 'frugal' ? 1
291
+ : budget.costTier === 'balanced' ? 2
292
+ : budget.costTier === 'quality' ? 3
293
+ : 4; // maximum
294
+ // Filter by budget tier constraint
295
+ const withinBudget = available.filter(p => p.tier <= maxTier);
296
+ const candidates = withinBudget.length > 0 ? withinBudget : available;
297
+ // Score candidates: prefer tier closest to task tier
298
+ const taskTier = task.tier;
299
+ const scored = candidates.map(p => ({
300
+ profile: p,
301
+ distance: Math.abs(p.tier - taskTier),
302
+ }));
303
+ // Sort by distance (closest tier match), then by tier descending (prefer stronger)
304
+ scored.sort((a, b) => {
305
+ if (a.distance !== b.distance)
306
+ return a.distance - b.distance;
307
+ return b.profile.tier - a.profile.tier;
308
+ });
309
+ return scored[0].profile.id;
310
+ }
311
+ // ─── Escalation ───────────────────────────────────────────────────────────
312
+ /**
313
+ * Determine if results are bad enough to escalate to a higher level.
314
+ * Checks failure rate and quality against threshold.
315
+ */
316
+ export function shouldEscalate(results, qualityThreshold = 0.6) {
317
+ if (results.length === 0)
318
+ return false;
319
+ const successCount = results.filter(r => r.status === 'success').length;
320
+ const successRate = successCount / results.length;
321
+ // Escalate if more than half failed
322
+ if (successRate < qualityThreshold)
323
+ return true;
324
+ // Escalate if all results are partial (none fully succeeded)
325
+ if (successCount === 0 && results.some(r => r.status === 'partial'))
326
+ return true;
327
+ return false;
328
+ }
329
+ // ─── Budget Builder ───────────────────────────────────────────────────────
330
+ const BUDGET_PRESETS = {
331
+ frugal: {
332
+ maxTotalTokens: 50_000,
333
+ maxRetries: 1,
334
+ costTier: 'frugal',
335
+ },
336
+ balanced: {
337
+ maxTotalTokens: 200_000,
338
+ maxRetries: 2,
339
+ costTier: 'balanced',
340
+ },
341
+ quality: {
342
+ maxTotalTokens: 500_000,
343
+ maxRetries: 3,
344
+ costTier: 'quality',
345
+ },
346
+ maximum: {
347
+ maxTotalTokens: 1_000_000,
348
+ maxRetries: 5,
349
+ costTier: 'maximum',
350
+ },
351
+ };
352
+ /**
353
+ * Create budget constraints from the user's dial setting and task count.
354
+ */
355
+ export function buildBudget(costTier, taskCount) {
356
+ const preset = BUDGET_PRESETS[costTier] || BUDGET_PRESETS.balanced;
357
+ const maxWorkers = costTier === 'frugal' ? Math.min(taskCount, 2)
358
+ : costTier === 'balanced' ? Math.min(taskCount, 4)
359
+ : costTier === 'quality' ? Math.min(taskCount, 6)
360
+ : Math.min(taskCount, 10);
361
+ return {
362
+ maxWorkers: Math.max(1, maxWorkers),
363
+ maxTotalTokens: preset.maxTotalTokens,
364
+ maxRetries: preset.maxRetries,
365
+ costTier: preset.costTier,
366
+ };
367
+ }
368
+ //# sourceMappingURL=agent-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-protocol.js","sourceRoot":"","sources":["../../src/agent-protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ interface AgentDef {
2
+ id: string;
3
+ name: string;
4
+ tier: string;
5
+ model: string;
6
+ cost?: string;
7
+ intents?: string[];
8
+ taskTypes?: string[];
9
+ minRisk?: string;
10
+ contract?: Record<string, unknown>;
11
+ prompt: string;
12
+ score?: number;
13
+ }
14
+ interface SkillDef {
15
+ command: string;
16
+ agent: string | null;
17
+ tier: string;
18
+ model?: string;
19
+ cost?: string;
20
+ risk?: string;
21
+ description: string;
22
+ objective: (args: string) => string;
23
+ acceptanceCriteria?: string[];
24
+ scope?: string[];
25
+ }
26
+ export declare function getAgents(): Map<string, AgentDef>;
27
+ export declare function getSkills(): Map<string, SkillDef>;
28
+ export declare function matchAgent(intent: string, risk: string, taskType: string): {
29
+ score: number;
30
+ id: string;
31
+ name: string;
32
+ tier: string;
33
+ model: string;
34
+ cost?: string;
35
+ intents?: string[];
36
+ taskTypes?: string[];
37
+ minRisk?: string;
38
+ contract?: Record<string, unknown>;
39
+ prompt: string;
40
+ }[];
41
+ export declare function matchSkill(command: string): SkillDef | null;
42
+ export declare function skillToTaskBrief(command: string, args: string): {
43
+ objective: string;
44
+ scope: string[];
45
+ tier: string;
46
+ model: string | undefined;
47
+ risk: string;
48
+ acceptanceCriteria: string[];
49
+ agentId: string | null;
50
+ cost: string | undefined;
51
+ } | null;
52
+ export {};