heyio 1.13.0 → 3.0.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 (380) hide show
  1. package/README.md +162 -278
  2. package/dist/api/middleware/auth.d.ts +14 -0
  3. package/dist/api/middleware/auth.d.ts.map +1 -0
  4. package/dist/api/middleware/auth.js +66 -0
  5. package/dist/api/middleware/auth.js.map +1 -0
  6. package/dist/api/notifications.d.ts +14 -0
  7. package/dist/api/notifications.d.ts.map +1 -0
  8. package/dist/api/notifications.js +112 -0
  9. package/dist/api/notifications.js.map +1 -0
  10. package/dist/api/routes/activity.d.ts +3 -0
  11. package/dist/api/routes/activity.d.ts.map +1 -0
  12. package/dist/api/routes/activity.js +28 -0
  13. package/dist/api/routes/activity.js.map +1 -0
  14. package/dist/api/routes/attachments.d.ts +3 -0
  15. package/dist/api/routes/attachments.d.ts.map +1 -0
  16. package/dist/api/routes/attachments.js +83 -0
  17. package/dist/api/routes/attachments.js.map +1 -0
  18. package/dist/api/routes/config.d.ts +3 -0
  19. package/dist/api/routes/config.d.ts.map +1 -0
  20. package/dist/api/routes/config.js +106 -0
  21. package/dist/api/routes/config.js.map +1 -0
  22. package/dist/api/routes/conversations.d.ts +3 -0
  23. package/dist/api/routes/conversations.d.ts.map +1 -0
  24. package/dist/api/routes/conversations.js +69 -0
  25. package/dist/api/routes/conversations.js.map +1 -0
  26. package/dist/api/routes/health.d.ts +3 -0
  27. package/dist/api/routes/health.d.ts.map +1 -0
  28. package/dist/api/routes/health.js +16 -0
  29. package/dist/api/routes/health.js.map +1 -0
  30. package/dist/api/routes/inbox.d.ts +3 -0
  31. package/dist/api/routes/inbox.d.ts.map +1 -0
  32. package/dist/api/routes/inbox.js +88 -0
  33. package/dist/api/routes/inbox.js.map +1 -0
  34. package/dist/api/routes/schedules.d.ts +3 -0
  35. package/dist/api/routes/schedules.d.ts.map +1 -0
  36. package/dist/api/routes/schedules.js +96 -0
  37. package/dist/api/routes/schedules.js.map +1 -0
  38. package/dist/api/routes/skills.d.ts +2 -0
  39. package/dist/api/routes/skills.d.ts.map +1 -0
  40. package/dist/api/routes/skills.js +85 -0
  41. package/dist/api/routes/skills.js.map +1 -0
  42. package/dist/api/routes/squads.d.ts +3 -0
  43. package/dist/api/routes/squads.d.ts.map +1 -0
  44. package/dist/api/routes/squads.js +129 -0
  45. package/dist/api/routes/squads.js.map +1 -0
  46. package/dist/api/routes/usage.d.ts +3 -0
  47. package/dist/api/routes/usage.d.ts.map +1 -0
  48. package/dist/api/routes/usage.js +55 -0
  49. package/dist/api/routes/usage.js.map +1 -0
  50. package/dist/api/routes/wiki.d.ts +2 -0
  51. package/dist/api/routes/wiki.d.ts.map +1 -0
  52. package/dist/api/routes/wiki.js +43 -0
  53. package/dist/api/routes/wiki.js.map +1 -0
  54. package/dist/api/server.d.ts +7 -0
  55. package/dist/api/server.d.ts.map +1 -0
  56. package/dist/api/server.js +136 -634
  57. package/dist/api/server.js.map +1 -0
  58. package/dist/config.d.ts +3 -0
  59. package/dist/config.d.ts.map +1 -0
  60. package/dist/config.js +2 -91
  61. package/dist/config.js.map +1 -0
  62. package/dist/copilot/client.d.ts +5 -0
  63. package/dist/copilot/client.d.ts.map +1 -0
  64. package/dist/copilot/client.js +19 -11
  65. package/dist/copilot/client.js.map +1 -0
  66. package/dist/copilot/health-monitor.d.ts +14 -0
  67. package/dist/copilot/health-monitor.d.ts.map +1 -0
  68. package/dist/copilot/health-monitor.js +70 -0
  69. package/dist/copilot/health-monitor.js.map +1 -0
  70. package/dist/copilot/orchestrator.d.ts +5 -0
  71. package/dist/copilot/orchestrator.d.ts.map +1 -0
  72. package/dist/copilot/orchestrator.js +127 -123
  73. package/dist/copilot/orchestrator.js.map +1 -0
  74. package/dist/copilot/tools.d.ts +49 -0
  75. package/dist/copilot/tools.d.ts.map +1 -0
  76. package/dist/copilot/tools.js +545 -321
  77. package/dist/copilot/tools.js.map +1 -0
  78. package/dist/index.d.ts +3 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +82 -26
  81. package/dist/index.js.map +1 -0
  82. package/dist/logging/logger.d.ts +6 -0
  83. package/dist/logging/logger.d.ts.map +1 -0
  84. package/dist/logging/logger.js +21 -0
  85. package/dist/logging/logger.js.map +1 -0
  86. package/dist/models/index.d.ts +6 -0
  87. package/dist/models/index.d.ts.map +1 -0
  88. package/dist/models/index.js +4 -0
  89. package/dist/models/index.js.map +1 -0
  90. package/dist/models/pricing.d.ts +25 -0
  91. package/dist/models/pricing.d.ts.map +1 -0
  92. package/dist/models/pricing.js +96 -0
  93. package/dist/models/pricing.js.map +1 -0
  94. package/dist/models/registry.d.ts +34 -0
  95. package/dist/models/registry.d.ts.map +1 -0
  96. package/dist/models/registry.js +109 -0
  97. package/dist/models/registry.js.map +1 -0
  98. package/dist/models/token-tracker.d.ts +40 -0
  99. package/dist/models/token-tracker.d.ts.map +1 -0
  100. package/dist/models/token-tracker.js +102 -0
  101. package/dist/models/token-tracker.js.map +1 -0
  102. package/dist/scheduler/engine.d.ts +9 -0
  103. package/dist/scheduler/engine.d.ts.map +1 -0
  104. package/dist/scheduler/engine.js +127 -0
  105. package/dist/scheduler/engine.js.map +1 -0
  106. package/dist/skills/index.d.ts +3 -0
  107. package/dist/skills/index.d.ts.map +1 -0
  108. package/dist/skills/index.js +2 -0
  109. package/dist/skills/index.js.map +1 -0
  110. package/dist/skills/store.d.ts +52 -0
  111. package/dist/skills/store.d.ts.map +1 -0
  112. package/dist/skills/store.js +148 -0
  113. package/dist/skills/store.js.map +1 -0
  114. package/dist/squad/agent.d.ts +46 -0
  115. package/dist/squad/agent.d.ts.map +1 -0
  116. package/dist/squad/agent.js +261 -0
  117. package/dist/squad/agent.js.map +1 -0
  118. package/dist/squad/autonomy.d.ts +16 -0
  119. package/dist/squad/autonomy.d.ts.map +1 -0
  120. package/dist/squad/autonomy.js +63 -0
  121. package/dist/squad/autonomy.js.map +1 -0
  122. package/dist/squad/event-bus.d.ts +22 -0
  123. package/dist/squad/event-bus.d.ts.map +1 -0
  124. package/dist/squad/event-bus.js +56 -0
  125. package/dist/squad/event-bus.js.map +1 -0
  126. package/dist/squad/execution/index.d.ts +12 -0
  127. package/dist/squad/execution/index.d.ts.map +1 -0
  128. package/dist/squad/execution/index.js +7 -0
  129. package/dist/squad/execution/index.js.map +1 -0
  130. package/dist/squad/execution/instance.d.ts +40 -0
  131. package/dist/squad/execution/instance.d.ts.map +1 -0
  132. package/dist/squad/execution/instance.js +138 -0
  133. package/dist/squad/execution/instance.js.map +1 -0
  134. package/dist/squad/execution/meeting.d.ts +25 -0
  135. package/dist/squad/execution/meeting.d.ts.map +1 -0
  136. package/dist/squad/execution/meeting.js +140 -0
  137. package/dist/squad/execution/meeting.js.map +1 -0
  138. package/dist/squad/execution/pr.d.ts +15 -0
  139. package/dist/squad/execution/pr.d.ts.map +1 -0
  140. package/dist/squad/execution/pr.js +93 -0
  141. package/dist/squad/execution/pr.js.map +1 -0
  142. package/dist/squad/execution/runner.d.ts +22 -0
  143. package/dist/squad/execution/runner.d.ts.map +1 -0
  144. package/dist/squad/execution/runner.js +68 -0
  145. package/dist/squad/execution/runner.js.map +1 -0
  146. package/dist/squad/execution/tasks.d.ts +11 -0
  147. package/dist/squad/execution/tasks.d.ts.map +1 -0
  148. package/dist/squad/execution/tasks.js +85 -0
  149. package/dist/squad/execution/tasks.js.map +1 -0
  150. package/dist/squad/execution/worktree.d.ts +26 -0
  151. package/dist/squad/execution/worktree.d.ts.map +1 -0
  152. package/dist/squad/execution/worktree.js +111 -0
  153. package/dist/squad/execution/worktree.js.map +1 -0
  154. package/dist/squad/hiring.d.ts +32 -0
  155. package/dist/squad/hiring.d.ts.map +1 -0
  156. package/dist/squad/hiring.js +200 -0
  157. package/dist/squad/hiring.js.map +1 -0
  158. package/dist/squad/index.d.ts +8 -0
  159. package/dist/squad/index.d.ts.map +1 -0
  160. package/dist/squad/index.js +6 -0
  161. package/dist/squad/index.js.map +1 -0
  162. package/dist/squad/manager.d.ts +48 -0
  163. package/dist/squad/manager.d.ts.map +1 -0
  164. package/dist/squad/manager.js +274 -0
  165. package/dist/squad/manager.js.map +1 -0
  166. package/dist/squad/name-generator.d.ts +16 -0
  167. package/dist/squad/name-generator.d.ts.map +1 -0
  168. package/dist/squad/name-generator.js +113 -0
  169. package/dist/squad/name-generator.js.map +1 -0
  170. package/dist/squad/roles/templates.d.ts +5 -0
  171. package/dist/squad/roles/templates.d.ts.map +1 -0
  172. package/dist/squad/roles/templates.js +102 -0
  173. package/dist/squad/roles/templates.js.map +1 -0
  174. package/dist/squad/skill-parser.d.ts +36 -0
  175. package/dist/squad/skill-parser.d.ts.map +1 -0
  176. package/dist/squad/skill-parser.js +83 -0
  177. package/dist/squad/skill-parser.js.map +1 -0
  178. package/dist/squad/source-resolver.d.ts +20 -0
  179. package/dist/squad/source-resolver.d.ts.map +1 -0
  180. package/dist/squad/source-resolver.js +52 -0
  181. package/dist/squad/source-resolver.js.map +1 -0
  182. package/dist/store/activity.d.ts +43 -0
  183. package/dist/store/activity.d.ts.map +1 -0
  184. package/dist/store/activity.js +131 -0
  185. package/dist/store/activity.js.map +1 -0
  186. package/dist/store/db.d.ts +5 -0
  187. package/dist/store/db.d.ts.map +1 -0
  188. package/dist/store/db.js +209 -248
  189. package/dist/store/db.js.map +1 -0
  190. package/dist/store/inbox.d.ts +53 -0
  191. package/dist/store/inbox.d.ts.map +1 -0
  192. package/dist/store/inbox.js +151 -0
  193. package/dist/store/inbox.js.map +1 -0
  194. package/dist/store/schedules.d.ts +53 -0
  195. package/dist/store/schedules.d.ts.map +1 -0
  196. package/dist/store/schedules.js +149 -54
  197. package/dist/store/schedules.js.map +1 -0
  198. package/dist/wiki/index.d.ts +3 -0
  199. package/dist/wiki/index.d.ts.map +1 -0
  200. package/dist/wiki/index.js +2 -0
  201. package/dist/wiki/index.js.map +1 -0
  202. package/dist/wiki/store.d.ts +49 -0
  203. package/dist/wiki/store.d.ts.map +1 -0
  204. package/dist/wiki/store.js +115 -0
  205. package/dist/wiki/store.js.map +1 -0
  206. package/node_modules/@io/shared/dist/config.d.ts +25 -0
  207. package/node_modules/@io/shared/dist/config.d.ts.map +1 -0
  208. package/node_modules/@io/shared/dist/config.js +47 -0
  209. package/node_modules/@io/shared/dist/config.js.map +1 -0
  210. package/node_modules/@io/shared/dist/constants.d.ts +13 -0
  211. package/node_modules/@io/shared/dist/constants.d.ts.map +1 -0
  212. package/node_modules/@io/shared/dist/constants.js +34 -0
  213. package/node_modules/@io/shared/dist/constants.js.map +1 -0
  214. package/node_modules/@io/shared/dist/index.d.ts +11 -0
  215. package/node_modules/@io/shared/dist/index.d.ts.map +1 -0
  216. package/node_modules/@io/shared/dist/index.js +3 -0
  217. package/node_modules/@io/shared/dist/index.js.map +1 -0
  218. package/node_modules/@io/shared/dist/types/agents.d.ts +3 -0
  219. package/node_modules/@io/shared/dist/types/agents.d.ts.map +1 -0
  220. package/node_modules/@io/shared/dist/types/agents.js +2 -0
  221. package/node_modules/@io/shared/dist/types/agents.js.map +1 -0
  222. package/node_modules/@io/shared/dist/types/api.d.ts +33 -0
  223. package/node_modules/@io/shared/dist/types/api.d.ts.map +1 -0
  224. package/node_modules/@io/shared/dist/types/api.js +2 -0
  225. package/node_modules/@io/shared/dist/types/api.js.map +1 -0
  226. package/node_modules/@io/shared/dist/types/attachments.d.ts +10 -0
  227. package/node_modules/@io/shared/dist/types/attachments.d.ts.map +1 -0
  228. package/node_modules/@io/shared/dist/types/attachments.js +2 -0
  229. package/node_modules/@io/shared/dist/types/attachments.js.map +1 -0
  230. package/node_modules/@io/shared/dist/types/events.d.ts +44 -0
  231. package/node_modules/@io/shared/dist/types/events.d.ts.map +1 -0
  232. package/node_modules/@io/shared/dist/types/events.js +2 -0
  233. package/node_modules/@io/shared/dist/types/events.js.map +1 -0
  234. package/node_modules/@io/shared/dist/types/messages.d.ts +15 -0
  235. package/node_modules/@io/shared/dist/types/messages.d.ts.map +1 -0
  236. package/node_modules/@io/shared/dist/types/messages.js +2 -0
  237. package/node_modules/@io/shared/dist/types/messages.js.map +1 -0
  238. package/node_modules/@io/shared/dist/types/squads.d.ts +43 -0
  239. package/node_modules/@io/shared/dist/types/squads.d.ts.map +1 -0
  240. package/node_modules/@io/shared/dist/types/squads.js +2 -0
  241. package/node_modules/@io/shared/dist/types/squads.js.map +1 -0
  242. package/node_modules/@io/shared/dist/types/tokens.d.ts +19 -0
  243. package/node_modules/@io/shared/dist/types/tokens.d.ts.map +1 -0
  244. package/node_modules/@io/shared/dist/types/tokens.js +2 -0
  245. package/node_modules/@io/shared/dist/types/tokens.js.map +1 -0
  246. package/node_modules/@io/shared/package.json +18 -0
  247. package/node_modules/@io/shared/src/config.ts +74 -0
  248. package/node_modules/@io/shared/src/constants.ts +36 -0
  249. package/node_modules/@io/shared/src/index.ts +37 -0
  250. package/node_modules/@io/shared/src/types/agents.ts +3 -0
  251. package/node_modules/@io/shared/src/types/api.ts +35 -0
  252. package/node_modules/@io/shared/src/types/attachments.ts +9 -0
  253. package/node_modules/@io/shared/src/types/events.ts +81 -0
  254. package/node_modules/@io/shared/src/types/messages.ts +15 -0
  255. package/node_modules/@io/shared/src/types/squads.ts +53 -0
  256. package/node_modules/@io/shared/src/types/tokens.ts +19 -0
  257. package/node_modules/@io/shared/tsconfig.json +9 -0
  258. package/node_modules/@io/shared/tsconfig.tsbuildinfo +1 -0
  259. package/package.json +56 -59
  260. package/src/api/middleware/auth.ts +76 -0
  261. package/src/api/notifications.ts +122 -0
  262. package/src/api/routes/activity.ts +29 -0
  263. package/src/api/routes/attachments.ts +93 -0
  264. package/src/api/routes/config.ts +115 -0
  265. package/src/api/routes/conversations.ts +87 -0
  266. package/src/api/routes/health.ts +18 -0
  267. package/src/api/routes/inbox.ts +98 -0
  268. package/src/api/routes/schedules.ts +121 -0
  269. package/src/api/routes/skills.ts +105 -0
  270. package/src/api/routes/squads.ts +145 -0
  271. package/src/api/routes/usage.ts +57 -0
  272. package/src/api/routes/wiki.ts +49 -0
  273. package/src/api/server.ts +186 -0
  274. package/src/config.ts +3 -0
  275. package/src/copilot/client.ts +42 -0
  276. package/src/copilot/health-monitor.ts +85 -0
  277. package/src/copilot/orchestrator.ts +222 -0
  278. package/src/copilot/tools.ts +707 -0
  279. package/src/index.ts +112 -0
  280. package/src/logging/logger.ts +26 -0
  281. package/src/models/index.ts +11 -0
  282. package/src/models/pricing.ts +121 -0
  283. package/src/models/registry.ts +131 -0
  284. package/src/models/token-tracker.ts +151 -0
  285. package/src/scheduler/engine.ts +146 -0
  286. package/src/skills/index.ts +13 -0
  287. package/src/skills/store.ts +188 -0
  288. package/src/squad/agent.ts +326 -0
  289. package/src/squad/autonomy.ts +78 -0
  290. package/src/squad/event-bus.ts +71 -0
  291. package/src/squad/execution/index.ts +17 -0
  292. package/src/squad/execution/instance.ts +186 -0
  293. package/src/squad/execution/meeting.ts +191 -0
  294. package/src/squad/execution/pr.ts +127 -0
  295. package/src/squad/execution/runner.ts +97 -0
  296. package/src/squad/execution/tasks.ts +111 -0
  297. package/src/squad/execution/worktree.ts +138 -0
  298. package/src/squad/hiring.ts +222 -0
  299. package/src/squad/index.ts +17 -0
  300. package/src/squad/manager.ts +337 -0
  301. package/src/squad/name-generator.ts +135 -0
  302. package/src/squad/roles/templates.ts +104 -0
  303. package/src/squad/skill-parser.ts +120 -0
  304. package/src/squad/source-resolver.ts +57 -0
  305. package/src/store/activity.ts +176 -0
  306. package/src/store/db.ts +237 -0
  307. package/src/store/inbox.ts +199 -0
  308. package/src/store/schedules.ts +199 -0
  309. package/src/wiki/index.ts +12 -0
  310. package/src/wiki/store.ts +139 -0
  311. package/tsconfig.json +9 -0
  312. package/LICENSE +0 -21
  313. package/dist/api/auth.js +0 -46
  314. package/dist/chat/attachments.js +0 -112
  315. package/dist/copilot/agents.js +0 -309
  316. package/dist/copilot/ceremonies.js +0 -174
  317. package/dist/copilot/gh-token.js +0 -64
  318. package/dist/copilot/io-scheduler.js +0 -79
  319. package/dist/copilot/model-router.js +0 -114
  320. package/dist/copilot/scheduler.js +0 -88
  321. package/dist/copilot/skills.js +0 -252
  322. package/dist/copilot/specialist-runner.js +0 -191
  323. package/dist/copilot/squad-tools.js +0 -258
  324. package/dist/copilot/system-message.js +0 -86
  325. package/dist/copilot/token-tracker.js +0 -98
  326. package/dist/copilot/trigger-schedule.js +0 -33
  327. package/dist/daemon.js +0 -67
  328. package/dist/logging.js +0 -27
  329. package/dist/mcp/config.js +0 -29
  330. package/dist/mcp/index.js +0 -3
  331. package/dist/mcp/registry.js +0 -42
  332. package/dist/notify.js +0 -25
  333. package/dist/paths.js +0 -17
  334. package/dist/setup.js +0 -35
  335. package/dist/store/agent-events.js +0 -19
  336. package/dist/store/audit-log.js +0 -71
  337. package/dist/store/conversations.js +0 -164
  338. package/dist/store/feed.js +0 -44
  339. package/dist/store/instances.js +0 -75
  340. package/dist/store/squad-colors.js +0 -23
  341. package/dist/store/squads.js +0 -60
  342. package/dist/store/tasks.js +0 -78
  343. package/dist/store/token-usage.js +0 -94
  344. package/dist/telegram/bot.js +0 -41
  345. package/dist/telegram/handlers.js +0 -42
  346. package/dist/watchdog.js +0 -37
  347. package/dist/wiki/backlinks.js +0 -51
  348. package/dist/wiki/fs.js +0 -108
  349. package/dist/wiki/search.js +0 -47
  350. package/web-dist/assets/AuditLogView-BzfjNXBT.js +0 -6
  351. package/web-dist/assets/ChatView-BdMukPKG.js +0 -1
  352. package/web-dist/assets/FeedView-BfPIabGr.js +0 -6
  353. package/web-dist/assets/HistoryView-BmEEk3Rs.js +0 -1
  354. package/web-dist/assets/LoginView-D7LrkeX7.js +0 -1
  355. package/web-dist/assets/McpView-BAP_ah3T.js +0 -1
  356. package/web-dist/assets/SchedulesView-CAtsUPCZ.js +0 -6
  357. package/web-dist/assets/SettingsView-BovjWZDa.js +0 -1
  358. package/web-dist/assets/SkillsView-DQSMM5LN.js +0 -16
  359. package/web-dist/assets/SquadDetailView-DBscu0m2.js +0 -26
  360. package/web-dist/assets/SquadHealthView-D686BuQo.js +0 -11
  361. package/web-dist/assets/SquadsView-AzMht2NJ.js +0 -6
  362. package/web-dist/assets/ToggleSwitch.vue_vue_type_script_setup_true_lang-DtShZAjW.js +0 -1
  363. package/web-dist/assets/UsageView-DiVn97aI.js +0 -16
  364. package/web-dist/assets/WikiView-Cn7KipkZ.js +0 -26
  365. package/web-dist/assets/api-D4mHJ3u0.js +0 -1
  366. package/web-dist/assets/arrow-left-D_qUNUWW.js +0 -6
  367. package/web-dist/assets/git-branch-DOM-orcl.js +0 -6
  368. package/web-dist/assets/index-Bo83B1LR.css +0 -1
  369. package/web-dist/assets/index-ELvnkQjd.js +0 -273
  370. package/web-dist/assets/pencil-CFsi7ufI.js +0 -6
  371. package/web-dist/assets/plus-BAzlGFd_.js +0 -6
  372. package/web-dist/assets/save-BmgCYJ1g.js +0 -6
  373. package/web-dist/assets/search-CS9zSIeW.js +0 -6
  374. package/web-dist/assets/squad-colors-B8B_Y-lz.js +0 -1
  375. package/web-dist/assets/trash-2-DLveUEsd.js +0 -6
  376. package/web-dist/assets/triangle-alert-lj4I30rL.js +0 -6
  377. package/web-dist/assets/x-CjXR97Fa.js +0 -6
  378. package/web-dist/favicon.svg +0 -10
  379. package/web-dist/index.html +0 -14
  380. package/web-dist/logo.svg +0 -10
@@ -0,0 +1,138 @@
1
+ import { createChildLogger } from '../../logging/logger.js';
2
+ import { getDatabase } from '../../store/db.js';
3
+ import { getEventBus } from '../event-bus.js';
4
+ import { getSquadMembers, getSquadRuntime } from '../manager.js';
5
+ import { createWorktree, removeWorktree } from './worktree.js';
6
+ const logger = () => createChildLogger('instance');
7
+ const activeInstances = new Map();
8
+ /**
9
+ * Create a new instance for a squad. Enforces max 3 per squad.
10
+ */
11
+ export async function createInstance(params) {
12
+ const log = logger();
13
+ const db = getDatabase();
14
+ // Enforce instance limit
15
+ const existingResult = await db.execute({
16
+ sql: "SELECT COUNT(*) as cnt FROM squad_instances WHERE squad_id = ? AND status NOT IN ('complete', 'failed')",
17
+ args: [params.squad.id],
18
+ });
19
+ const count = existingResult.rows[0]?.cnt ?? 0;
20
+ if (count >= 3) {
21
+ throw new Error(`Squad '${params.squad.name}' already has ${count} active instances (max 3)`);
22
+ }
23
+ const id = crypto.randomUUID();
24
+ // Create worktree if project has git
25
+ let worktree = null;
26
+ try {
27
+ worktree = createWorktree({
28
+ repoPath: params.squad.projectPath,
29
+ squadName: params.squad.name,
30
+ instanceId: id,
31
+ });
32
+ }
33
+ catch (err) {
34
+ log.warn({ err }, 'Could not create worktree, proceeding without isolation');
35
+ }
36
+ // Persist to DB
37
+ await db.execute({
38
+ sql: `INSERT INTO squad_instances (id, squad_id, issue_ref, worktree_path, branch_name, status)
39
+ VALUES (?, ?, ?, ?, ?, 'planning')`,
40
+ args: [
41
+ id,
42
+ params.squad.id,
43
+ params.issueRef ?? null,
44
+ worktree?.path ?? null,
45
+ worktree?.branch ?? null,
46
+ ],
47
+ });
48
+ const instance = {
49
+ id,
50
+ squadId: params.squad.id,
51
+ issueRef: params.issueRef,
52
+ worktree,
53
+ branch: worktree?.branch ?? null,
54
+ status: 'planning',
55
+ tasks: [],
56
+ meetingLog: [],
57
+ };
58
+ activeInstances.set(id, instance);
59
+ await getEventBus().emit({
60
+ id: crypto.randomUUID(),
61
+ timestamp: new Date(),
62
+ type: 'instance:created',
63
+ squadId: params.squad.id,
64
+ instanceId: id,
65
+ data: { issueRef: params.issueRef, objective: params.objective },
66
+ });
67
+ log.info({ instanceId: id, squadId: params.squad.id }, 'Instance created');
68
+ return instance;
69
+ }
70
+ /**
71
+ * Transition instance to a new status.
72
+ */
73
+ export async function transitionInstance(instanceId, newStatus) {
74
+ const db = getDatabase();
75
+ const instance = activeInstances.get(instanceId);
76
+ if (!instance)
77
+ throw new Error(`Instance ${instanceId} not found`);
78
+ const validTransitions = {
79
+ planning: ['meeting', 'failed'],
80
+ meeting: ['working', 'failed'],
81
+ working: ['reviewing', 'failed'],
82
+ reviewing: ['complete', 'working', 'failed'],
83
+ complete: [],
84
+ failed: [],
85
+ };
86
+ const allowed = validTransitions[instance.status];
87
+ if (!allowed.includes(newStatus)) {
88
+ throw new Error(`Invalid transition: ${instance.status} → ${newStatus}`);
89
+ }
90
+ instance.status = newStatus;
91
+ const completedAt = newStatus === 'complete' || newStatus === 'failed' ? new Date().toISOString() : null;
92
+ await db.execute({
93
+ sql: 'UPDATE squad_instances SET status = ?, completed_at = COALESCE(?, completed_at) WHERE id = ?',
94
+ args: [newStatus, completedAt, instanceId],
95
+ });
96
+ const eventType = newStatus === 'meeting'
97
+ ? 'instance:meeting_started'
98
+ : newStatus === 'working'
99
+ ? 'instance:work_started'
100
+ : newStatus === 'complete'
101
+ ? 'instance:complete'
102
+ : newStatus === 'failed'
103
+ ? 'instance:failed'
104
+ : 'instance:created';
105
+ await getEventBus().emit({
106
+ id: crypto.randomUUID(),
107
+ timestamp: new Date(),
108
+ type: eventType,
109
+ squadId: instance.squadId,
110
+ instanceId,
111
+ data: { from: instance.status, to: newStatus },
112
+ });
113
+ }
114
+ /**
115
+ * Clean up a completed/failed instance (remove worktree).
116
+ */
117
+ export async function cleanupInstance(instanceId, squad) {
118
+ const instance = activeInstances.get(instanceId);
119
+ if (!instance)
120
+ return;
121
+ if (instance.worktree && instance.branch) {
122
+ removeWorktree({
123
+ repoPath: squad.projectPath,
124
+ worktreePath: instance.worktree.path,
125
+ branch: instance.branch,
126
+ });
127
+ }
128
+ activeInstances.delete(instanceId);
129
+ }
130
+ /** Get an active instance */
131
+ export function getInstance(instanceId) {
132
+ return activeInstances.get(instanceId);
133
+ }
134
+ /** Get all active instances for a squad */
135
+ export function getSquadInstances(squadId) {
136
+ return [...activeInstances.values()].filter((i) => i.squadId === squadId);
137
+ }
138
+ //# sourceMappingURL=instance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance.js","sourceRoot":"","sources":["../../../src/squad/execution/instance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { SquadRuntime } from '../manager.js';
2
+ import type { Instance, InstanceTask } from './instance.js';
3
+ export interface MeetingResult {
4
+ consensus: boolean;
5
+ tasks: InstanceTask[];
6
+ log: string[];
7
+ vetoReason?: string;
8
+ }
9
+ /**
10
+ * Run a round-table meeting for an instance.
11
+ * Protocol:
12
+ * 1. Team Lead presents context
13
+ * 2. Each agent speaks in round-robin order
14
+ * 3. Agents respond to previous speakers
15
+ * 4. Team Lead calls for consensus
16
+ * 5. Veto members can block
17
+ * 6. If blocked, discussion continues (up to MAX_ROUNDS)
18
+ * 7. On consensus, Team Lead formalizes task list
19
+ */
20
+ export declare function runMeeting(params: {
21
+ instance: Instance;
22
+ runtime: SquadRuntime;
23
+ objective: string;
24
+ }): Promise<MeetingResult>;
25
+ //# sourceMappingURL=meeting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meeting.d.ts","sourceRoot":"","sources":["../../../src/squad/execution/meeting.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAK5D,MAAM,WAAW,aAAa;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE;IACxC,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,aAAa,CAAC,CAiHzB"}
@@ -0,0 +1,140 @@
1
+ import { createChildLogger } from '../../logging/logger.js';
2
+ import { getEventBus } from '../event-bus.js';
3
+ import { transitionInstance } from './instance.js';
4
+ const logger = () => createChildLogger('meeting');
5
+ const MAX_ROUNDS = 5;
6
+ /**
7
+ * Run a round-table meeting for an instance.
8
+ * Protocol:
9
+ * 1. Team Lead presents context
10
+ * 2. Each agent speaks in round-robin order
11
+ * 3. Agents respond to previous speakers
12
+ * 4. Team Lead calls for consensus
13
+ * 5. Veto members can block
14
+ * 6. If blocked, discussion continues (up to MAX_ROUNDS)
15
+ * 7. On consensus, Team Lead formalizes task list
16
+ */
17
+ export async function runMeeting(params) {
18
+ const log = logger();
19
+ const { instance, runtime, objective } = params;
20
+ const meetingLog = [];
21
+ await transitionInstance(instance.id, 'meeting');
22
+ await getEventBus().emit({
23
+ id: crypto.randomUUID(),
24
+ timestamp: new Date(),
25
+ type: 'instance:meeting_started',
26
+ squadId: instance.squadId,
27
+ instanceId: instance.id,
28
+ data: { objective },
29
+ });
30
+ const teamLead = runtime.members.get('team-lead');
31
+ if (!teamLead)
32
+ throw new Error('No team lead available for meeting');
33
+ // Get non-lead agents for discussion
34
+ const participants = [...runtime.members.entries()].filter(([role]) => role !== 'team-lead');
35
+ // Step 1: Team lead presents the objective
36
+ const presentation = await teamLead.send(`You are starting a round-table meeting. Present the following objective to your team and ask for input:\n\nObjective: ${objective}\n\nProvide a brief summary of the work needed and what expertise is required. Then ask each team member for their perspective.`);
37
+ meetingLog.push(`[team-lead] ${presentation}`);
38
+ await emitContribution(instance, 'team-lead', presentation);
39
+ // Step 2-3: Round-robin discussion
40
+ let round = 0;
41
+ let consensusReached = false;
42
+ let vetoReason;
43
+ while (round < MAX_ROUNDS && !consensusReached) {
44
+ round++;
45
+ log.info({ instanceId: instance.id, round }, 'Meeting round');
46
+ // Each participant speaks
47
+ for (const [role, agent] of participants) {
48
+ const context = meetingLog.slice(-5).join('\n\n');
49
+ const response = await agent.send(`You are in a team meeting (round ${round}/${MAX_ROUNDS}). Here's the recent discussion:\n\n${context}\n\nProvide your professional input on the objective. Focus on your area of expertise. If you're QA, focus on testing concerns. If you have concerns, state them clearly.`);
50
+ meetingLog.push(`[${role}] ${response}`);
51
+ await emitContribution(instance, role, response);
52
+ }
53
+ // Step 4: Team lead calls for consensus
54
+ const consensusCheck = await teamLead.send(`The discussion so far:\n\n${meetingLog.slice(-participants.length - 1).join('\n\n')}\n\nBased on this discussion, do we have consensus to proceed? Consider all concerns raised. Reply with either:\n- "CONSENSUS: <brief summary of agreed plan>"\n- "NEED_DISCUSSION: <what needs to be resolved>"`);
55
+ meetingLog.push(`[team-lead] ${consensusCheck}`);
56
+ if (consensusCheck.toUpperCase().includes('CONSENSUS:')) {
57
+ // Step 5: Check veto members
58
+ const vetoMembers = [...runtime.members.entries()].filter(([role]) => {
59
+ const skill = runtime.skills.get(role);
60
+ return skill?.veto;
61
+ });
62
+ let vetoed = false;
63
+ for (const [role, agent] of vetoMembers) {
64
+ if (role === 'team-lead')
65
+ continue; // team lead already agreed
66
+ const vetoCheck = await agent.send(`The team has reached consensus on the following plan:\n\n${consensusCheck}\n\nAs a veto-holding member, do you approve this plan? Reply with:\n- "APPROVE" if you agree\n- "VETO: <reason>" if you have critical concerns that must be addressed`);
67
+ if (vetoCheck.toUpperCase().includes('VETO:')) {
68
+ vetoed = true;
69
+ vetoReason = vetoCheck;
70
+ meetingLog.push(`[${role}] VETO: ${vetoCheck}`);
71
+ await emitVeto(instance, role, vetoCheck);
72
+ break;
73
+ }
74
+ meetingLog.push(`[${role}] Approved`);
75
+ }
76
+ if (!vetoed) {
77
+ consensusReached = true;
78
+ }
79
+ }
80
+ }
81
+ // Step 7: Formalize task list
82
+ let tasks = [];
83
+ if (consensusReached) {
84
+ const taskPlan = await teamLead.send(`Consensus reached. Now formalize the work into specific tasks. For each task, specify:\n1. A brief description\n2. Which team member role should do it\n\nFormat each task as: "TASK: <description> | ASSIGN: <role>"\n\nList all tasks needed to complete the objective.`);
85
+ meetingLog.push(`[team-lead] Task plan: ${taskPlan}`);
86
+ tasks = parseTaskList(taskPlan, instance.id);
87
+ }
88
+ await getEventBus().emit({
89
+ id: crypto.randomUUID(),
90
+ timestamp: new Date(),
91
+ type: 'instance:meeting_complete',
92
+ squadId: instance.squadId,
93
+ instanceId: instance.id,
94
+ data: { consensus: consensusReached, taskCount: tasks.length, rounds: round },
95
+ });
96
+ instance.meetingLog = meetingLog;
97
+ instance.tasks = tasks;
98
+ log.info({ instanceId: instance.id, consensus: consensusReached, tasks: tasks.length }, 'Meeting complete');
99
+ return { consensus: consensusReached, tasks, log: meetingLog, vetoReason };
100
+ }
101
+ /** Parse the team lead's task list into structured tasks */
102
+ function parseTaskList(taskPlan, instanceId) {
103
+ const tasks = [];
104
+ const lines = taskPlan.split('\n');
105
+ for (const line of lines) {
106
+ const match = line.match(/TASK:\s*(.+?)\s*\|\s*ASSIGN:\s*(.+)/i);
107
+ if (match) {
108
+ tasks.push({
109
+ id: crypto.randomUUID(),
110
+ description: match[1].trim(),
111
+ assignedTo: match[2].trim().toLowerCase().replace(/\s+/g, '-'),
112
+ status: 'pending',
113
+ });
114
+ }
115
+ }
116
+ return tasks;
117
+ }
118
+ async function emitContribution(instance, role, content) {
119
+ await getEventBus().emit({
120
+ id: crypto.randomUUID(),
121
+ timestamp: new Date(),
122
+ type: 'meeting:contribution',
123
+ squadId: instance.squadId,
124
+ instanceId: instance.id,
125
+ agentRole: role,
126
+ content: content.slice(0, 500),
127
+ });
128
+ }
129
+ async function emitVeto(instance, role, reason) {
130
+ await getEventBus().emit({
131
+ id: crypto.randomUUID(),
132
+ timestamp: new Date(),
133
+ type: 'meeting:veto',
134
+ squadId: instance.squadId,
135
+ instanceId: instance.id,
136
+ agentRole: role,
137
+ content: reason,
138
+ });
139
+ }
140
+ //# sourceMappingURL=meeting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meeting.js","sourceRoot":"","sources":["../../../src/squad/execution/meeting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Instance } from './instance.js';
2
+ export interface PrResult {
3
+ url: string;
4
+ number: number;
5
+ }
6
+ /**
7
+ * Create a pull request from the instance's worktree branch.
8
+ * Commits any uncommitted changes, pushes the branch, then creates a PR.
9
+ */
10
+ export declare function createPullRequest(params: {
11
+ instance: Instance;
12
+ title: string;
13
+ squadName: string;
14
+ }): Promise<PrResult | null>;
15
+ //# sourceMappingURL=pr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../../src/squad/execution/pr.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAK9C,MAAM,WAAW,QAAQ;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC/C,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAkD3B"}
@@ -0,0 +1,93 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { createChildLogger } from '../../logging/logger.js';
3
+ import { transitionInstance } from './instance.js';
4
+ const logger = () => createChildLogger('pr');
5
+ /**
6
+ * Create a pull request from the instance's worktree branch.
7
+ * Commits any uncommitted changes, pushes the branch, then creates a PR.
8
+ */
9
+ export async function createPullRequest(params) {
10
+ const log = logger();
11
+ const { instance, title, squadName } = params;
12
+ if (!instance.worktree || !instance.branch) {
13
+ log.warn({ instanceId: instance.id }, 'No worktree/branch, skipping PR creation');
14
+ await transitionInstance(instance.id, 'complete');
15
+ return null;
16
+ }
17
+ const cwd = instance.worktree.path;
18
+ try {
19
+ // Check if there are changes to commit
20
+ const status = execSync('git status --porcelain', { cwd, encoding: 'utf-8' }).trim();
21
+ if (!status) {
22
+ log.info({ instanceId: instance.id }, 'No changes to commit');
23
+ await transitionInstance(instance.id, 'complete');
24
+ return null;
25
+ }
26
+ // Stage and commit all changes
27
+ execSync('git add -A', { cwd, stdio: 'pipe' });
28
+ const commitMessage = buildCommitMessage(title, instance, squadName);
29
+ execSync(`git commit -m "${escapeShell(commitMessage)}"`, { cwd, stdio: 'pipe' });
30
+ // Push the branch
31
+ execSync(`git push -u origin "${instance.branch}"`, { cwd, stdio: 'pipe' });
32
+ // Create the PR using gh CLI
33
+ const prBody = buildPrBody(instance, squadName);
34
+ const prOutput = execSync(`gh pr create --title "${escapeShell(title)}" --body "${escapeShell(prBody)}" --head "${instance.branch}"`, { cwd, encoding: 'utf-8', stdio: 'pipe' }).trim();
35
+ // Parse the PR URL to get the number
36
+ const prUrl = prOutput;
37
+ const prNumber = Number.parseInt(prUrl.split('/').pop() ?? '0', 10);
38
+ await transitionInstance(instance.id, 'complete');
39
+ log.info({ instanceId: instance.id, prUrl, prNumber }, 'PR created');
40
+ return { url: prUrl, number: prNumber };
41
+ }
42
+ catch (err) {
43
+ log.error({ err, instanceId: instance.id }, 'Failed to create PR');
44
+ await transitionInstance(instance.id, 'failed');
45
+ return null;
46
+ }
47
+ }
48
+ function buildCommitMessage(title, instance, squadName) {
49
+ const lines = [`feat: ${title}`, '', `Squad: ${squadName}`, `Instance: ${instance.id}`];
50
+ if (instance.issueRef) {
51
+ lines.push(`Closes ${instance.issueRef}`);
52
+ }
53
+ const completedTasks = instance.tasks.filter((t) => t.status === 'done');
54
+ if (completedTasks.length > 0) {
55
+ lines.push('', 'Tasks completed:');
56
+ for (const task of completedTasks) {
57
+ lines.push(`- ${task.description} (${task.assignedTo})`);
58
+ }
59
+ }
60
+ return lines.join('\n');
61
+ }
62
+ function buildPrBody(instance, squadName) {
63
+ const sections = [];
64
+ sections.push(`## 🤖 Generated by IO Squad: ${squadName}`);
65
+ sections.push('');
66
+ if (instance.issueRef) {
67
+ sections.push(`Closes ${instance.issueRef}`);
68
+ sections.push('');
69
+ }
70
+ // Tasks section
71
+ sections.push('### Tasks Completed');
72
+ for (const task of instance.tasks) {
73
+ const icon = task.status === 'done' ? '✅' : task.status === 'failed' ? '❌' : '⏳';
74
+ sections.push(`${icon} ${task.description} — *${task.assignedTo}*`);
75
+ }
76
+ // Meeting highlights (last few entries)
77
+ if (instance.meetingLog.length > 0) {
78
+ sections.push('');
79
+ sections.push('<details><summary>Meeting Discussion</summary>');
80
+ sections.push('');
81
+ const recentLog = instance.meetingLog.slice(-10);
82
+ for (const entry of recentLog) {
83
+ sections.push(`> ${entry.slice(0, 200)}`);
84
+ sections.push('');
85
+ }
86
+ sections.push('</details>');
87
+ }
88
+ return sections.join('\n');
89
+ }
90
+ function escapeShell(str) {
91
+ return str.replace(/"/g, '\\"').replace(/\n/g, '\\n');
92
+ }
93
+ //# sourceMappingURL=pr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr.js","sourceRoot":"","sources":["../../../src/squad/execution/pr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Squad } from '@io/shared';
2
+ import { type PrResult } from './index.js';
3
+ export interface RunResult {
4
+ instanceId: string;
5
+ success: boolean;
6
+ pr?: PrResult | null;
7
+ error?: string;
8
+ }
9
+ /**
10
+ * Run a full instance lifecycle:
11
+ * 1. Create instance (with worktree)
12
+ * 2. Hold round-table meeting
13
+ * 3. Execute tasks
14
+ * 4. Create PR
15
+ * 5. Clean up
16
+ */
17
+ export declare function runInstance(params: {
18
+ squad: Squad;
19
+ objective: string;
20
+ issueRef?: string;
21
+ }): Promise<RunResult>;
22
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/squad/execution/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGxC,OAAO,EAEN,KAAK,QAAQ,EAMb,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,SAAS;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE;IACzC,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,SAAS,CAAC,CA8DrB"}
@@ -0,0 +1,68 @@
1
+ import { createChildLogger } from '../../logging/logger.js';
2
+ import { bootSquad, getSquadRuntime } from '../manager.js';
3
+ import { cleanupInstance, createInstance, createPullRequest, executeTasks, runMeeting, } from './index.js';
4
+ const logger = () => createChildLogger('runner');
5
+ /**
6
+ * Run a full instance lifecycle:
7
+ * 1. Create instance (with worktree)
8
+ * 2. Hold round-table meeting
9
+ * 3. Execute tasks
10
+ * 4. Create PR
11
+ * 5. Clean up
12
+ */
13
+ export async function runInstance(params) {
14
+ const log = logger();
15
+ const { squad, objective, issueRef } = params;
16
+ // Ensure squad is booted
17
+ let runtime = getSquadRuntime(squad.id);
18
+ if (!runtime) {
19
+ runtime = await bootSquad(squad);
20
+ }
21
+ // 1. Create instance
22
+ const instance = await createInstance({ squad, issueRef, objective });
23
+ log.info({ instanceId: instance.id }, 'Starting instance run');
24
+ try {
25
+ // 2. Run meeting
26
+ const meetingResult = await runMeeting({ instance, runtime, objective });
27
+ if (!meetingResult.consensus) {
28
+ log.warn({ instanceId: instance.id }, 'Meeting did not reach consensus');
29
+ return {
30
+ instanceId: instance.id,
31
+ success: false,
32
+ error: `Meeting failed to reach consensus${meetingResult.vetoReason ? `: ${meetingResult.vetoReason}` : ''}`,
33
+ };
34
+ }
35
+ if (instance.tasks.length === 0) {
36
+ log.warn({ instanceId: instance.id }, 'No tasks generated from meeting');
37
+ return {
38
+ instanceId: instance.id,
39
+ success: false,
40
+ error: 'Meeting produced no actionable tasks',
41
+ };
42
+ }
43
+ // 3. Execute tasks
44
+ await executeTasks({ instance, runtime });
45
+ // 4. Create PR
46
+ const prTitle = objective.slice(0, 72);
47
+ const pr = await createPullRequest({ instance, title: prTitle, squadName: squad.name });
48
+ // 5. Cleanup (if no PR was created — otherwise keep the branch for review)
49
+ if (!pr) {
50
+ await cleanupInstance(instance.id, squad);
51
+ }
52
+ return {
53
+ instanceId: instance.id,
54
+ success: true,
55
+ pr,
56
+ };
57
+ }
58
+ catch (err) {
59
+ log.error({ err, instanceId: instance.id }, 'Instance run failed');
60
+ await cleanupInstance(instance.id, squad);
61
+ return {
62
+ instanceId: instance.id,
63
+ success: false,
64
+ error: err instanceof Error ? err.message : String(err),
65
+ };
66
+ }
67
+ }
68
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/squad/execution/runner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAqB,SAAS,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAGN,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,UAAU,GACV,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AASjD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAIjC;IACA,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAE9C,yBAAyB;IACzB,IAAI,OAAO,GAA6B,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClE,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,qBAAqB;IACrB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;IACtE,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,uBAAuB,CAAC,CAAC;IAE/D,IAAI,CAAC;QACJ,iBAAiB;QACjB,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAEzE,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;YAC9B,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,iCAAiC,CAAC,CAAC;YACzE,OAAO;gBACN,UAAU,EAAE,QAAQ,CAAC,EAAE;gBACvB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,oCAAoC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;aAC5G,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,iCAAiC,CAAC,CAAC;YACzE,OAAO;gBACN,UAAU,EAAE,QAAQ,CAAC,EAAE;gBACvB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,sCAAsC;aAC7C,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAE1C,eAAe;QACf,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,MAAM,iBAAiB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAExF,2EAA2E;QAC3E,IAAI,CAAC,EAAE,EAAE,CAAC;YACT,MAAM,eAAe,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO;YACN,UAAU,EAAE,QAAQ,CAAC,EAAE;YACvB,OAAO,EAAE,IAAI;YACb,EAAE;SACF,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,qBAAqB,CAAC,CAAC;QACnE,MAAM,eAAe,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO;YACN,UAAU,EAAE,QAAQ,CAAC,EAAE;YACvB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACvD,CAAC;IACH,CAAC;AACF,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { SquadRuntime } from '../manager.js';
2
+ import { type Instance } from './instance.js';
3
+ /**
4
+ * Execute all tasks in an instance sequentially.
5
+ * Team lead reviews each completed task before moving to the next.
6
+ */
7
+ export declare function executeTasks(params: {
8
+ instance: Instance;
9
+ runtime: SquadRuntime;
10
+ }): Promise<void>;
11
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../src/squad/execution/tasks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,KAAK,QAAQ,EAAyC,MAAM,eAAe,CAAC;AAIrF;;;GAGG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,YAAY,CAAC;CACtB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6EhB"}