@intrect/openswarm 0.4.4 → 0.8.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 (259) hide show
  1. package/README.md +46 -26
  2. package/config.example.yaml +22 -10
  3. package/dist/adapters/agenticLoop.d.ts +45 -2
  4. package/dist/adapters/agenticLoop.d.ts.map +1 -1
  5. package/dist/adapters/agenticLoop.js +209 -61
  6. package/dist/adapters/agenticLoop.js.map +1 -1
  7. package/dist/adapters/chatStream.d.ts +55 -0
  8. package/dist/adapters/chatStream.d.ts.map +1 -0
  9. package/dist/adapters/chatStream.js +116 -0
  10. package/dist/adapters/chatStream.js.map +1 -0
  11. package/dist/adapters/codex.d.ts +7 -0
  12. package/dist/adapters/codex.d.ts.map +1 -1
  13. package/dist/adapters/codex.js +67 -6
  14. package/dist/adapters/codex.js.map +1 -1
  15. package/dist/adapters/codexModels.d.ts +20 -0
  16. package/dist/adapters/codexModels.d.ts.map +1 -0
  17. package/dist/adapters/codexModels.js +195 -0
  18. package/dist/adapters/codexModels.js.map +1 -0
  19. package/dist/adapters/codexResponses.d.ts +97 -0
  20. package/dist/adapters/codexResponses.d.ts.map +1 -0
  21. package/dist/adapters/codexResponses.js +302 -0
  22. package/dist/adapters/codexResponses.js.map +1 -0
  23. package/dist/adapters/gpt.d.ts.map +1 -1
  24. package/dist/adapters/gpt.js +20 -120
  25. package/dist/adapters/gpt.js.map +1 -1
  26. package/dist/adapters/index.d.ts +10 -2
  27. package/dist/adapters/index.d.ts.map +1 -1
  28. package/dist/adapters/index.js +19 -5
  29. package/dist/adapters/index.js.map +1 -1
  30. package/dist/adapters/lmstudio.d.ts +8 -0
  31. package/dist/adapters/lmstudio.d.ts.map +1 -0
  32. package/dist/adapters/lmstudio.js +41 -0
  33. package/dist/adapters/lmstudio.js.map +1 -0
  34. package/dist/adapters/local.d.ts +16 -1
  35. package/dist/adapters/local.d.ts.map +1 -1
  36. package/dist/adapters/local.js +51 -127
  37. package/dist/adapters/local.js.map +1 -1
  38. package/dist/adapters/openrouter.d.ts +37 -0
  39. package/dist/adapters/openrouter.d.ts.map +1 -0
  40. package/dist/adapters/openrouter.js +193 -0
  41. package/dist/adapters/openrouter.js.map +1 -0
  42. package/dist/adapters/resultParsing.d.ts +6 -0
  43. package/dist/adapters/resultParsing.d.ts.map +1 -0
  44. package/dist/adapters/resultParsing.js +139 -0
  45. package/dist/adapters/resultParsing.js.map +1 -0
  46. package/dist/adapters/tools.d.ts +21 -2
  47. package/dist/adapters/tools.d.ts.map +1 -1
  48. package/dist/adapters/tools.js +153 -12
  49. package/dist/adapters/tools.js.map +1 -1
  50. package/dist/adapters/types.d.ts +40 -1
  51. package/dist/adapters/types.d.ts.map +1 -1
  52. package/dist/adapters/webTools.d.ts +9 -0
  53. package/dist/adapters/webTools.d.ts.map +1 -0
  54. package/dist/adapters/webTools.js +195 -0
  55. package/dist/adapters/webTools.js.map +1 -0
  56. package/dist/agents/draftAnalyzer.d.ts +1 -1
  57. package/dist/agents/draftAnalyzer.d.ts.map +1 -1
  58. package/dist/agents/draftAnalyzer.js +3 -3
  59. package/dist/agents/draftAnalyzer.js.map +1 -1
  60. package/dist/agents/pairPipeline.d.ts +26 -1
  61. package/dist/agents/pairPipeline.d.ts.map +1 -1
  62. package/dist/agents/pairPipeline.js +184 -17
  63. package/dist/agents/pairPipeline.js.map +1 -1
  64. package/dist/agents/reflection.d.ts +56 -0
  65. package/dist/agents/reflection.d.ts.map +1 -0
  66. package/dist/agents/reflection.js +120 -0
  67. package/dist/agents/reflection.js.map +1 -0
  68. package/dist/agents/worker.d.ts +8 -0
  69. package/dist/agents/worker.d.ts.map +1 -1
  70. package/dist/agents/worker.js +23 -2
  71. package/dist/agents/worker.js.map +1 -1
  72. package/dist/auth/index.d.ts +3 -1
  73. package/dist/auth/index.d.ts.map +1 -1
  74. package/dist/auth/index.js +3 -1
  75. package/dist/auth/index.js.map +1 -1
  76. package/dist/auth/linearPkce.d.ts +22 -0
  77. package/dist/auth/linearPkce.d.ts.map +1 -0
  78. package/dist/auth/linearPkce.js +208 -0
  79. package/dist/auth/linearPkce.js.map +1 -0
  80. package/dist/auth/oauthPkce.d.ts +4 -3
  81. package/dist/auth/oauthPkce.d.ts.map +1 -1
  82. package/dist/auth/oauthPkce.js +39 -12
  83. package/dist/auth/oauthPkce.js.map +1 -1
  84. package/dist/auth/oauthStore.d.ts +11 -1
  85. package/dist/auth/oauthStore.d.ts.map +1 -1
  86. package/dist/auth/oauthStore.js +14 -2
  87. package/dist/auth/oauthStore.js.map +1 -1
  88. package/dist/auth/openrouterPkce.d.ts +29 -0
  89. package/dist/auth/openrouterPkce.d.ts.map +1 -0
  90. package/dist/auth/openrouterPkce.js +222 -0
  91. package/dist/auth/openrouterPkce.js.map +1 -0
  92. package/dist/automation/autonomousRunner.d.ts +17 -7
  93. package/dist/automation/autonomousRunner.d.ts.map +1 -1
  94. package/dist/automation/autonomousRunner.js +69 -70
  95. package/dist/automation/autonomousRunner.js.map +1 -1
  96. package/dist/automation/backlogGrooming.d.ts +21 -0
  97. package/dist/automation/backlogGrooming.d.ts.map +1 -0
  98. package/dist/automation/backlogGrooming.js +80 -0
  99. package/dist/automation/backlogGrooming.js.map +1 -0
  100. package/dist/automation/localCI.d.ts +24 -0
  101. package/dist/automation/localCI.d.ts.map +1 -0
  102. package/dist/automation/localCI.js +84 -0
  103. package/dist/automation/localCI.js.map +1 -0
  104. package/dist/automation/runnerExecution.d.ts +33 -7
  105. package/dist/automation/runnerExecution.d.ts.map +1 -1
  106. package/dist/automation/runnerExecution.js +202 -154
  107. package/dist/automation/runnerExecution.js.map +1 -1
  108. package/dist/automation/runnerTypes.d.ts +5 -1
  109. package/dist/automation/runnerTypes.d.ts.map +1 -1
  110. package/dist/automation/taskSource.d.ts +101 -0
  111. package/dist/automation/taskSource.d.ts.map +1 -0
  112. package/dist/automation/taskSource.js +136 -0
  113. package/dist/automation/taskSource.js.map +1 -0
  114. package/dist/automation/workerAuditLog.d.ts +29 -0
  115. package/dist/automation/workerAuditLog.d.ts.map +1 -0
  116. package/dist/automation/workerAuditLog.js +82 -0
  117. package/dist/automation/workerAuditLog.js.map +1 -0
  118. package/dist/cli/authHandler.d.ts +14 -5
  119. package/dist/cli/authHandler.d.ts.map +1 -1
  120. package/dist/cli/authHandler.js +131 -36
  121. package/dist/cli/authHandler.js.map +1 -1
  122. package/dist/cli/daemon.d.ts +5 -0
  123. package/dist/cli/daemon.d.ts.map +1 -1
  124. package/dist/cli/daemon.js +13 -0
  125. package/dist/cli/daemon.js.map +1 -1
  126. package/dist/cli/doctorHandler.d.ts +2 -0
  127. package/dist/cli/doctorHandler.d.ts.map +1 -0
  128. package/dist/cli/doctorHandler.js +114 -0
  129. package/dist/cli/doctorHandler.js.map +1 -0
  130. package/dist/cli/initWizard.d.ts +13 -0
  131. package/dist/cli/initWizard.d.ts.map +1 -0
  132. package/dist/cli/initWizard.js +314 -0
  133. package/dist/cli/initWizard.js.map +1 -0
  134. package/dist/cli.js +112 -38
  135. package/dist/cli.js.map +1 -1
  136. package/dist/core/config.d.ts +89 -15
  137. package/dist/core/config.d.ts.map +1 -1
  138. package/dist/core/config.js +100 -23
  139. package/dist/core/config.js.map +1 -1
  140. package/dist/core/envFile.d.ts +6 -0
  141. package/dist/core/envFile.d.ts.map +1 -1
  142. package/dist/core/envFile.js +39 -1
  143. package/dist/core/envFile.js.map +1 -1
  144. package/dist/core/eventHub.d.ts +22 -0
  145. package/dist/core/eventHub.d.ts.map +1 -1
  146. package/dist/core/eventHub.js.map +1 -1
  147. package/dist/core/providerOverride.d.ts +6 -0
  148. package/dist/core/providerOverride.d.ts.map +1 -0
  149. package/dist/core/providerOverride.js +37 -0
  150. package/dist/core/providerOverride.js.map +1 -0
  151. package/dist/core/service.d.ts.map +1 -1
  152. package/dist/core/service.js +43 -20
  153. package/dist/core/service.js.map +1 -1
  154. package/dist/core/types.d.ts +16 -2
  155. package/dist/core/types.d.ts.map +1 -1
  156. package/dist/discord/discordCore.d.ts.map +1 -1
  157. package/dist/discord/discordCore.js +16 -103
  158. package/dist/discord/discordCore.js.map +1 -1
  159. package/dist/discord/discordHandlers.d.ts.map +1 -1
  160. package/dist/discord/discordHandlers.js +15 -12
  161. package/dist/discord/discordHandlers.js.map +1 -1
  162. package/dist/index.js +12 -1
  163. package/dist/index.js.map +1 -1
  164. package/dist/issues/sqliteStore.d.ts.map +1 -1
  165. package/dist/issues/sqliteStore.js +7 -2
  166. package/dist/issues/sqliteStore.js.map +1 -1
  167. package/dist/knowledge/scanner.d.ts.map +1 -1
  168. package/dist/knowledge/scanner.js +5 -0
  169. package/dist/knowledge/scanner.js.map +1 -1
  170. package/dist/linear/linear.d.ts +45 -2
  171. package/dist/linear/linear.d.ts.map +1 -1
  172. package/dist/linear/linear.js +154 -3
  173. package/dist/linear/linear.js.map +1 -1
  174. package/dist/locale/prompts/en.d.ts.map +1 -1
  175. package/dist/locale/prompts/en.js +40 -20
  176. package/dist/locale/prompts/en.js.map +1 -1
  177. package/dist/locale/prompts/ko.d.ts.map +1 -1
  178. package/dist/locale/prompts/ko.js +39 -20
  179. package/dist/locale/prompts/ko.js.map +1 -1
  180. package/dist/locale/types.d.ts +6 -0
  181. package/dist/locale/types.d.ts.map +1 -1
  182. package/dist/mcp/mcpClient.d.ts +27 -0
  183. package/dist/mcp/mcpClient.d.ts.map +1 -0
  184. package/dist/mcp/mcpClient.js +145 -0
  185. package/dist/mcp/mcpClient.js.map +1 -0
  186. package/dist/memory/memoryCore.d.ts.map +1 -1
  187. package/dist/memory/memoryCore.js +8 -2
  188. package/dist/memory/memoryCore.js.map +1 -1
  189. package/dist/memory/repoKnowledge.d.ts +33 -0
  190. package/dist/memory/repoKnowledge.d.ts.map +1 -0
  191. package/dist/memory/repoKnowledge.js +97 -0
  192. package/dist/memory/repoKnowledge.js.map +1 -0
  193. package/dist/notify/notifier.d.ts +26 -0
  194. package/dist/notify/notifier.d.ts.map +1 -0
  195. package/dist/notify/notifier.js +131 -0
  196. package/dist/notify/notifier.js.map +1 -0
  197. package/dist/orchestration/conflictDetector.d.ts +5 -2
  198. package/dist/orchestration/conflictDetector.d.ts.map +1 -1
  199. package/dist/orchestration/conflictDetector.js +35 -6
  200. package/dist/orchestration/conflictDetector.js.map +1 -1
  201. package/dist/orchestration/decisionEngine.d.ts +20 -0
  202. package/dist/orchestration/decisionEngine.d.ts.map +1 -1
  203. package/dist/orchestration/decisionEngine.js +45 -0
  204. package/dist/orchestration/decisionEngine.js.map +1 -1
  205. package/dist/support/banner.d.ts +7 -0
  206. package/dist/support/banner.d.ts.map +1 -0
  207. package/dist/support/banner.js +32 -0
  208. package/dist/support/banner.js.map +1 -0
  209. package/dist/support/chat.js +36 -27
  210. package/dist/support/chat.js.map +1 -1
  211. package/dist/support/chatBackend.d.ts +6 -0
  212. package/dist/support/chatBackend.d.ts.map +1 -1
  213. package/dist/support/chatBackend.js +105 -83
  214. package/dist/support/chatBackend.js.map +1 -1
  215. package/dist/support/chatTui.d.ts.map +1 -1
  216. package/dist/support/chatTui.js +217 -27
  217. package/dist/support/chatTui.js.map +1 -1
  218. package/dist/support/colors.d.ts +15 -0
  219. package/dist/support/colors.d.ts.map +1 -0
  220. package/dist/support/colors.js +23 -0
  221. package/dist/support/colors.js.map +1 -0
  222. package/dist/support/dashboardHtml.d.ts +1 -1
  223. package/dist/support/dashboardHtml.d.ts.map +1 -1
  224. package/dist/support/dashboardHtml.js +318 -65
  225. package/dist/support/dashboardHtml.js.map +1 -1
  226. package/dist/support/planCommand.d.ts +17 -0
  227. package/dist/support/planCommand.d.ts.map +1 -0
  228. package/dist/support/planCommand.js +114 -0
  229. package/dist/support/planCommand.js.map +1 -0
  230. package/dist/support/planner.d.ts +9 -2
  231. package/dist/support/planner.d.ts.map +1 -1
  232. package/dist/support/planner.js +43 -111
  233. package/dist/support/planner.js.map +1 -1
  234. package/dist/support/projectMapper.d.ts.map +1 -1
  235. package/dist/support/projectMapper.js +29 -1
  236. package/dist/support/projectMapper.js.map +1 -1
  237. package/dist/support/promptHelper.d.ts +24 -0
  238. package/dist/support/promptHelper.d.ts.map +1 -0
  239. package/dist/support/promptHelper.js +94 -0
  240. package/dist/support/promptHelper.js.map +1 -0
  241. package/dist/support/rateLimiter.d.ts.map +1 -1
  242. package/dist/support/rateLimiter.js +6 -0
  243. package/dist/support/rateLimiter.js.map +1 -1
  244. package/dist/support/repoMetadata.d.ts +51 -0
  245. package/dist/support/repoMetadata.d.ts.map +1 -0
  246. package/dist/support/repoMetadata.js +91 -0
  247. package/dist/support/repoMetadata.js.map +1 -0
  248. package/dist/support/web.d.ts.map +1 -1
  249. package/dist/support/web.js +196 -71
  250. package/dist/support/web.js.map +1 -1
  251. package/dist/support/worktreeManager.d.ts +6 -1
  252. package/dist/support/worktreeManager.d.ts.map +1 -1
  253. package/dist/support/worktreeManager.js +23 -1
  254. package/dist/support/worktreeManager.js.map +1 -1
  255. package/dist/taskState/store.d.ts +1 -0
  256. package/dist/taskState/store.d.ts.map +1 -1
  257. package/dist/taskState/store.js +22 -1
  258. package/dist/taskState/store.js.map +1 -1
  259. package/package.json +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"rateLimiter.d.ts","sourceRoot":"","sources":["../../src/support/rateLimiter.ts"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AAEH,UAAU,iBAAiB;IACzB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAQD,UAAU,kBAAkB;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,cAAM,WAAW;IAQb,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IARzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,cAAc,CAAiB;gBAGpB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,iBAAiB;IAmB5C;;OAEG;IACH,OAAO,CAAC,MAAM;IAUd;;OAEG;IACH,OAAO,CAAC,YAAY;IA0BpB;;OAEG;IACH,OAAO,CAAC,UAAU;IAalB;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB9B;;OAEG;IACH,UAAU,IAAI,kBAAkB;IAKhC;;OAEG;IACH,YAAY,IAAI,IAAI;IAMpB;;OAEG;IACH,OAAO,IAAI,IAAI;CAQhB;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CA2BvC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAMnF;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAM1E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAK9C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAM1C;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,CAAC,EACnC,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EACvC,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,CAAC,CAAC,CAGZ"}
1
+ {"version":3,"file":"rateLimiter.d.ts","sourceRoot":"","sources":["../../src/support/rateLimiter.ts"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AAEH,UAAU,iBAAiB;IACzB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAQD,UAAU,kBAAkB;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,cAAM,WAAW;IAQb,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IARzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,cAAc,CAAiB;gBAGpB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,iBAAiB;IAmB5C;;OAEG;IACH,OAAO,CAAC,MAAM;IAUd;;OAEG;IACH,OAAO,CAAC,YAAY;IA0BpB;;OAEG;IACH,OAAO,CAAC,UAAU;IAalB;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB9B;;OAEG;IACH,UAAU,IAAI,kBAAkB;IAKhC;;OAEG;IACH,YAAY,IAAI,IAAI;IAMpB;;OAEG;IACH,OAAO,IAAI,IAAI;CAQhB;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CA2BvC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAMnF;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAM1E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAK9C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAM1C;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,CAAC,EACnC,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EACvC,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,CAAC,CAAC,CASZ"}
@@ -213,6 +213,12 @@ export function destroyRateLimiters() {
213
213
  * @returns Result of the operation
214
214
  */
215
215
  export async function withRateLimit(service, operation) {
216
+ // Limiters are set up by the daemon (initRateLimiters). One-off CLI commands
217
+ // (init, auth) never call that, so fall back to running the operation directly
218
+ // instead of throwing "No limiter configured".
219
+ if (!limiters.has(service)) {
220
+ return operation();
221
+ }
216
222
  await acquireRateLimit(service);
217
223
  return operation();
218
224
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rateLimiter.js","sourceRoot":"","sources":["../../src/support/rateLimiter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rateLimiter.js","sourceRoot":"","sources":["../../src/support/rateLimiter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { z } from 'zod';
2
+ declare const LinearMappingSchema: z.ZodObject<{
3
+ teamId: z.ZodOptional<z.ZodString>;
4
+ teamKey: z.ZodOptional<z.ZodString>;
5
+ projectId: z.ZodString;
6
+ projectName: z.ZodOptional<z.ZodString>;
7
+ }, z.core.$strip>;
8
+ declare const RepoMetadataSchema: z.ZodObject<{
9
+ schemaVersion: z.ZodLiteral<1>;
10
+ projectName: z.ZodOptional<z.ZodString>;
11
+ description: z.ZodOptional<z.ZodString>;
12
+ linear: z.ZodOptional<z.ZodObject<{
13
+ teamId: z.ZodOptional<z.ZodString>;
14
+ teamKey: z.ZodOptional<z.ZodString>;
15
+ projectId: z.ZodString;
16
+ projectName: z.ZodOptional<z.ZodString>;
17
+ }, z.core.$strip>>;
18
+ github: z.ZodOptional<z.ZodObject<{
19
+ repo: z.ZodString;
20
+ }, z.core.$strip>>;
21
+ notes: z.ZodOptional<z.ZodString>;
22
+ }, z.core.$strip>;
23
+ export type RepoMetadata = z.infer<typeof RepoMetadataSchema>;
24
+ export type LinearRepoMapping = z.infer<typeof LinearMappingSchema>;
25
+ export declare const REPO_METADATA_FILENAME = "openswarm.json";
26
+ /**
27
+ * Load `${repoPath}/openswarm.json` if it exists.
28
+ *
29
+ * Returns:
30
+ * - parsed metadata when the file is present and valid
31
+ * - `null` when the file does not exist
32
+ * - throws `RepoMetadataError` when the file exists but is malformed
33
+ *
34
+ * The caller is expected to treat a `null` return as "no explicit mapping" —
35
+ * downstream code may then fall back to fuzzy matching or whatever default it
36
+ * already had.
37
+ */
38
+ export declare function loadRepoMetadata(repoPath: string): Promise<RepoMetadata | null>;
39
+ /**
40
+ * Write `${repoPath}/openswarm.json`. Validates against the schema first so we
41
+ * never persist a malformed mapping. Returns the written file path.
42
+ * Used by `openswarm init` to record the repo ↔ Linear team/project mapping the
43
+ * user picked, so the daemon resolves this repo without fuzzy name matching.
44
+ */
45
+ export declare function saveRepoMetadata(repoPath: string, meta: RepoMetadata): Promise<string>;
46
+ export declare class RepoMetadataError extends Error {
47
+ readonly filePath: string;
48
+ constructor(message: string, filePath: string);
49
+ }
50
+ export {};
51
+ //# sourceMappingURL=repoMetadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repoMetadata.d.ts","sourceRoot":"","sources":["../../src/support/repoMetadata.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,mBAAmB;;;;;iBAKvB,CAAC;AAMH,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;iBAStB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEpE,eAAO,MAAM,sBAAsB,mBAAmB,CAAC;AAEvD;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAgCrF;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAK5F;AAED,qBAAa,iBAAkB,SAAQ,KAAK;aACG,QAAQ,EAAE,MAAM;gBAAjD,OAAO,EAAE,MAAM,EAAkB,QAAQ,EAAE,MAAM;CAI9D"}
@@ -0,0 +1,91 @@
1
+ // ============================================
2
+ // OpenSwarm - Per-repo metadata (`openswarm.json`)
3
+ // ============================================
4
+ //
5
+ // Each managed repository may ship an `openswarm.json` at its root.
6
+ // The file is the source of truth for repo ↔ external-tracker mapping
7
+ // (Linear today, GitHub/etc later) and removes the need for fuzzy
8
+ // name matching, which silently breaks on renames or ambiguous names.
9
+ import { readFile, writeFile } from 'node:fs/promises';
10
+ import { join } from 'node:path';
11
+ import { z } from 'zod';
12
+ const LinearMappingSchema = z.object({
13
+ teamId: z.string().uuid().optional(),
14
+ teamKey: z.string().optional(),
15
+ projectId: z.string().uuid(),
16
+ projectName: z.string().optional(),
17
+ });
18
+ const GithubMappingSchema = z.object({
19
+ repo: z.string(),
20
+ });
21
+ const RepoMetadataSchema = z.object({
22
+ schemaVersion: z.literal(1),
23
+ /** Human-friendly project name. Falls back to the directory basename if absent. */
24
+ projectName: z.string().optional(),
25
+ description: z.string().optional(),
26
+ linear: LinearMappingSchema.optional(),
27
+ github: GithubMappingSchema.optional(),
28
+ /** Free-form notes the swarm should keep in mind. */
29
+ notes: z.string().optional(),
30
+ });
31
+ export const REPO_METADATA_FILENAME = 'openswarm.json';
32
+ /**
33
+ * Load `${repoPath}/openswarm.json` if it exists.
34
+ *
35
+ * Returns:
36
+ * - parsed metadata when the file is present and valid
37
+ * - `null` when the file does not exist
38
+ * - throws `RepoMetadataError` when the file exists but is malformed
39
+ *
40
+ * The caller is expected to treat a `null` return as "no explicit mapping" —
41
+ * downstream code may then fall back to fuzzy matching or whatever default it
42
+ * already had.
43
+ */
44
+ export async function loadRepoMetadata(repoPath) {
45
+ const filePath = join(repoPath, REPO_METADATA_FILENAME);
46
+ let raw;
47
+ try {
48
+ raw = await readFile(filePath, 'utf-8');
49
+ }
50
+ catch (err) {
51
+ if (err.code === 'ENOENT') {
52
+ return null;
53
+ }
54
+ throw new RepoMetadataError(`Failed to read ${filePath}: ${err.message}`, filePath);
55
+ }
56
+ let parsed;
57
+ try {
58
+ parsed = JSON.parse(raw);
59
+ }
60
+ catch (err) {
61
+ throw new RepoMetadataError(`Invalid JSON in ${filePath}: ${err.message}`, filePath);
62
+ }
63
+ const result = RepoMetadataSchema.safeParse(parsed);
64
+ if (!result.success) {
65
+ throw new RepoMetadataError(`Invalid schema in ${filePath}: ${result.error.issues
66
+ .map((i) => `${i.path.join('.')}: ${i.message}`)
67
+ .join('; ')}`, filePath);
68
+ }
69
+ return result.data;
70
+ }
71
+ /**
72
+ * Write `${repoPath}/openswarm.json`. Validates against the schema first so we
73
+ * never persist a malformed mapping. Returns the written file path.
74
+ * Used by `openswarm init` to record the repo ↔ Linear team/project mapping the
75
+ * user picked, so the daemon resolves this repo without fuzzy name matching.
76
+ */
77
+ export async function saveRepoMetadata(repoPath, meta) {
78
+ const validated = RepoMetadataSchema.parse(meta);
79
+ const filePath = join(repoPath, REPO_METADATA_FILENAME);
80
+ await writeFile(filePath, `${JSON.stringify(validated, null, 2)}\n`, 'utf-8');
81
+ return filePath;
82
+ }
83
+ export class RepoMetadataError extends Error {
84
+ filePath;
85
+ constructor(message, filePath) {
86
+ super(message);
87
+ this.filePath = filePath;
88
+ this.name = 'RepoMetadataError';
89
+ }
90
+ }
91
+ //# sourceMappingURL=repoMetadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repoMetadata.js","sourceRoot":"","sources":["../../src/support/repoMetadata.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/support/web.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAmH1E;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAoB3D;AAYD,wBAAsB,cAAc,CAAC,IAAI,GAAE,MAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAy1BvE;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAKnD"}
1
+ {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/support/web.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAgM1E;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAuB3D;AAYD,wBAAsB,cAAc,CAAC,IAAI,GAAE,MAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAi6BvE;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAKnD"}
@@ -3,7 +3,8 @@
3
3
  // ============================================
4
4
  import { createServer } from 'node:http';
5
5
  import { writeFileSync, readFileSync, existsSync } from 'node:fs';
6
- import { join } from 'node:path';
6
+ import { readdir, stat } from 'node:fs/promises';
7
+ import { join, resolve as resolvePath, dirname, basename } from 'node:path';
7
8
  import { homedir } from 'node:os';
8
9
  import { execFile } from 'node:child_process';
9
10
  import { getChatHistory } from '../discord/index.js';
@@ -24,6 +25,7 @@ import { initLocale } from '../locale/index.js';
24
25
  import { runChatCompletion, getDefaultChatModel } from './chatBackend.js';
25
26
  import { handleGraphQL, isGraphQLRequest } from '../issues/graphql/server.js';
26
27
  import { ISSUE_BOARD_HTML } from '../issues/issueBoardHtml.js';
28
+ import { createSubIssuesWithDependencies, getTaskSource } from '../automation/runnerExecution.js';
27
29
  let server = null;
28
30
  let runnerRef;
29
31
  // CORS origin allowlist — hostname-strict match (no substring/prefix pitfalls)
@@ -64,6 +66,71 @@ const execTasks = new Map();
64
66
  function cleanupExecTask(taskId) {
65
67
  setTimeout(() => { execTasks.delete(taskId); }, 3600000); // 1 hour
66
68
  }
69
+ /**
70
+ * Create an in-memory exec task and run it through PairPipeline asynchronously.
71
+ * Shared by `POST /api/exec` and the `/api/plan/dispatch` fallback (Path B) so a
72
+ * fix to the exec lifecycle applies to both. Returns the taskId immediately;
73
+ * status is pollable via GET /api/exec/:taskId.
74
+ */
75
+ function startExecTask(prompt, opts = {}) {
76
+ const taskId = `exec-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
77
+ const resolvedPath = opts.projectPath ?? process.cwd();
78
+ const entry = { taskId, status: 'queued', createdAt: Date.now() };
79
+ execTasks.set(taskId, entry);
80
+ // Run pipeline asynchronously
81
+ (async () => {
82
+ try {
83
+ initLocale('en');
84
+ entry.status = 'running';
85
+ let stages;
86
+ if (opts.workerOnly) {
87
+ stages = ['worker'];
88
+ }
89
+ else if (opts.pipeline) {
90
+ stages = ['worker', 'reviewer', 'tester', 'documenter'];
91
+ }
92
+ else {
93
+ stages = ['worker', 'reviewer'];
94
+ }
95
+ const roles = {};
96
+ if (opts.model) {
97
+ roles.worker = { enabled: true, model: opts.model, timeoutMs: 0 };
98
+ }
99
+ const task = {
100
+ id: taskId,
101
+ source: 'local',
102
+ title: prompt,
103
+ description: prompt,
104
+ priority: 3,
105
+ projectPath: resolvedPath,
106
+ createdAt: Date.now(),
107
+ };
108
+ const pipelineInstance = new PairPipeline({
109
+ stages,
110
+ maxIterations: 3,
111
+ roles: Object.keys(roles).length > 0 ? roles : undefined,
112
+ });
113
+ pipelineInstance.on('stage:start', ({ stage }) => {
114
+ entry.currentStage = stage;
115
+ });
116
+ const result = await pipelineInstance.run(task, resolvedPath);
117
+ entry.status = 'completed';
118
+ entry.result = {
119
+ success: result.success,
120
+ summary: result.workerResult?.summary,
121
+ finalStatus: result.finalStatus,
122
+ };
123
+ }
124
+ catch (err) {
125
+ entry.status = 'failed';
126
+ entry.error = err instanceof Error ? err.message : String(err);
127
+ }
128
+ finally {
129
+ cleanupExecTask(taskId);
130
+ }
131
+ })();
132
+ return taskId;
133
+ }
67
134
  // Pinned + enabled repos persistence
68
135
  const REPOS_FILE = join(homedir(), '.claude', 'openswarm-repos.json');
69
136
  function loadReposConfig() {
@@ -100,8 +167,12 @@ const removedConfigPaths = new Set(_reposCfg.removedConfigPaths ?? []);
100
167
  */
101
168
  export function setWebRunner(runner) {
102
169
  runnerRef = runner;
103
- // Restore persisted enabled state
170
+ // Restore persisted enabled state. INT-1810 R6: removedConfigPaths is a HARD denylist —
171
+ // never re-enable a removed/isolated repo, even if it lingers in the persisted enabled list
172
+ // (auto-rediscovery used to re-add isolated repos and silently un-isolate them).
104
173
  for (const path of _reposCfg.enabled) {
174
+ if (removedConfigPaths.has(path))
175
+ continue;
105
176
  runner.enableProject(path);
106
177
  }
107
178
  // 대시보드에서 제거된 config 경로를 runner의 allowedProjects에서도 제거
@@ -272,6 +343,9 @@ export async function startWebServer(port = 3847) {
272
343
  const { projectPath } = JSON.parse(body);
273
344
  if (typeof projectPath === 'string' && projectPath) {
274
345
  pinnedProjects.add(projectPath);
346
+ // R6: an explicit pin is a deliberate re-enable — clear the denylist so it isn't
347
+ // skipped again by setWebRunner on the next restart.
348
+ removedConfigPaths.delete(projectPath);
275
349
  saveReposConfig();
276
350
  // Seed path cache so Linear project name matches immediately
277
351
  const name = projectPath.split('/').pop();
@@ -309,10 +383,13 @@ export async function startWebServer(port = 3847) {
309
383
  try {
310
384
  const { projectPath, enabled } = JSON.parse(body);
311
385
  if (typeof projectPath === 'string' && typeof enabled === 'boolean') {
312
- if (enabled)
386
+ if (enabled) {
387
+ removedConfigPaths.delete(projectPath); // R6: explicit enable clears the denylist
313
388
  runnerRef?.enableProject(projectPath);
314
- else
389
+ }
390
+ else {
315
391
  runnerRef?.disableProject(projectPath);
392
+ }
316
393
  saveReposConfig();
317
394
  broadcastEvent({ type: 'project:toggled', data: { projectPath, enabled } });
318
395
  }
@@ -358,13 +435,15 @@ export async function startWebServer(port = 3847) {
358
435
  const body = await readBody(req);
359
436
  try {
360
437
  const { provider } = JSON.parse(body);
361
- if (provider !== 'claude' && provider !== 'codex') {
438
+ const VALID_PROVIDERS = ['codex', 'gpt', 'local', 'lmstudio', 'openrouter'];
439
+ if (!VALID_PROVIDERS.includes(provider)) {
362
440
  res.writeHead(400, { 'Content-Type': 'application/json' });
363
- res.end(JSON.stringify({ error: 'Invalid provider' }));
441
+ res.end(JSON.stringify({ error: `Invalid provider. Valid: ${VALID_PROVIDERS.join(', ')}` }));
364
442
  return;
365
443
  }
366
- setDefaultAdapter(provider);
367
- runnerRef?.switchProvider(provider);
444
+ const validProvider = provider;
445
+ setDefaultAdapter(validProvider);
446
+ runnerRef?.switchProvider(validProvider);
368
447
  broadcastEvent({
369
448
  type: 'log',
370
449
  data: { taskId: 'system', stage: 'provider', line: `Provider switched to ${provider}` },
@@ -528,7 +607,7 @@ export async function startWebServer(port = 3847) {
528
607
  const memoryContext = memories.length > 0
529
608
  ? '## Relevant Past Discussions\n' + memories.map(m => `- ${m.content.replace(/^Q: |^A: /g, '')}`).join('\n')
530
609
  : '';
531
- const provider = runnerRef?.getAdapterSummary().defaultAdapter ?? 'claude';
610
+ const provider = runnerRef?.getAdapterSummary().defaultAdapter ?? 'codex';
532
611
  const model = runnerRef?.getAdapterSummary().worker?.model ?? getDefaultChatModel(provider);
533
612
  const contextPrompt = [
534
613
  'You are OpenSwarm, an autonomous code development supervisor.',
@@ -838,6 +917,50 @@ export async function startWebServer(port = 3847) {
838
917
  saveReposConfig();
839
918
  res.writeHead(200, { 'Content-Type': 'application/json' });
840
919
  res.end(JSON.stringify({ ok: true }));
920
+ // ---- Filesystem browse (folder picker) ----
921
+ // GET /api/fs/list?path=<absolute or ~/...>
922
+ // Returns: { path, parent, entries: [{name, isDir}] } — dotfiles excluded, dirs first.
923
+ }
924
+ else if (url.startsWith('/api/fs/list') && req.method === 'GET') {
925
+ try {
926
+ const qs = url.split('?')[1] ?? '';
927
+ const params = new URLSearchParams(qs);
928
+ const requested = params.get('path')?.trim();
929
+ const startPath = requested && requested.length > 0
930
+ ? requested
931
+ : homedir();
932
+ const expanded = startPath.startsWith('~')
933
+ ? join(homedir(), startPath.slice(1))
934
+ : startPath;
935
+ const absolute = resolvePath(expanded);
936
+ const st = await stat(absolute);
937
+ if (!st.isDirectory()) {
938
+ res.writeHead(400, { 'Content-Type': 'application/json' });
939
+ res.end(JSON.stringify({ error: 'Not a directory', path: absolute }));
940
+ return;
941
+ }
942
+ const raw = await readdir(absolute, { withFileTypes: true });
943
+ const entries = raw
944
+ .filter((d) => !d.name.startsWith('.'))
945
+ .map((d) => ({ name: d.name, isDir: d.isDirectory() }))
946
+ .sort((a, b) => {
947
+ if (a.isDir !== b.isDir)
948
+ return a.isDir ? -1 : 1;
949
+ return a.name.localeCompare(b.name);
950
+ });
951
+ const parent = dirname(absolute);
952
+ res.writeHead(200, { 'Content-Type': 'application/json' });
953
+ res.end(JSON.stringify({
954
+ path: absolute,
955
+ parent: parent === absolute ? null : parent,
956
+ name: basename(absolute) || absolute,
957
+ entries,
958
+ }));
959
+ }
960
+ catch (e) {
961
+ res.writeHead(500, { 'Content-Type': 'application/json' });
962
+ res.end(JSON.stringify({ error: safeErrorMessage(e) }));
963
+ }
841
964
  // ---- Claude Code Quota ----
842
965
  }
843
966
  else if (url === '/api/quota' && req.method === 'GET') {
@@ -861,75 +984,77 @@ export async function startWebServer(port = 3847) {
861
984
  res.end(JSON.stringify({ error: 'Missing prompt' }));
862
985
  return;
863
986
  }
864
- const taskId = `exec-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
865
- const resolvedPath = projectPath ?? process.cwd();
866
- const entry = {
867
- taskId,
868
- status: 'queued',
869
- createdAt: Date.now(),
870
- };
871
- execTasks.set(taskId, entry);
987
+ const taskId = startExecTask(prompt, { projectPath, pipeline, workerOnly, model });
872
988
  res.writeHead(202, { 'Content-Type': 'application/json' });
873
989
  res.end(JSON.stringify({ taskId, status: 'queued' }));
874
- // Run pipeline asynchronously
875
- (async () => {
876
- try {
877
- initLocale('en');
878
- entry.status = 'running';
879
- // Determine stages
880
- let stages;
881
- if (workerOnly) {
882
- stages = ['worker'];
883
- }
884
- else if (pipeline) {
885
- stages = ['worker', 'reviewer', 'tester', 'documenter'];
886
- }
887
- else {
888
- stages = ['worker', 'reviewer'];
889
- }
890
- // Build role config
891
- const roles = {};
892
- if (model) {
893
- roles.worker = { enabled: true, model, timeoutMs: 0 };
894
- }
895
- const task = {
896
- id: taskId,
897
- source: 'local',
898
- title: prompt,
899
- description: prompt,
900
- priority: 3,
901
- projectPath: resolvedPath,
902
- createdAt: Date.now(),
903
- };
904
- const pipelineInstance = new PairPipeline({
905
- stages,
906
- maxIterations: 3,
907
- roles: Object.keys(roles).length > 0 ? roles : undefined,
908
- });
909
- pipelineInstance.on('stage:start', ({ stage }) => {
910
- entry.currentStage = stage;
911
- });
912
- const result = await pipelineInstance.run(task, resolvedPath);
913
- entry.status = 'completed';
914
- entry.result = {
915
- success: result.success,
916
- summary: result.workerResult?.summary,
917
- finalStatus: result.finalStatus,
918
- };
919
- }
920
- catch (err) {
921
- entry.status = 'failed';
922
- entry.error = err instanceof Error ? err.message : String(err);
923
- }
924
- finally {
925
- cleanupExecTask(taskId);
926
- }
927
- })();
928
990
  }
929
991
  catch {
930
992
  res.writeHead(400, { 'Content-Type': 'application/json' });
931
993
  res.end(JSON.stringify({ error: 'Invalid JSON' }));
932
994
  }
995
+ // ---- Plan dispatch: TUI /plan cockpit → daemon loop ----
996
+ }
997
+ else if (url === '/api/plan/dispatch' && req.method === 'POST') {
998
+ const body = await readBody(req);
999
+ try {
1000
+ const { goal, projectPath, subTasks } = JSON.parse(body);
1001
+ if (!goal?.trim()) {
1002
+ res.writeHead(400, { 'Content-Type': 'application/json' });
1003
+ res.end(JSON.stringify({ error: 'Missing goal' }));
1004
+ return;
1005
+ }
1006
+ const resolvedPath = projectPath ?? process.cwd();
1007
+ const tasks = Array.isArray(subTasks) ? subTasks : [];
1008
+ const triggerHeartbeat = () => {
1009
+ runnerRef?.heartbeat().catch((e) => console.error('[Web] plan heartbeat error:', e));
1010
+ };
1011
+ // Path A — a task source is registered (Linear OR local SQLite): create a
1012
+ // parent issue + dependency-wired sub-issues (reusing the autonomous
1013
+ // engine, which routes through the same source), then heartbeat.
1014
+ const source = getTaskSource();
1015
+ if (source) {
1016
+ const parent = await source.createTask(goal, `Planned via the \`/plan\` cockpit.\n\n${tasks.length} sub-task(s) dispatched.`);
1017
+ if ('error' in parent) {
1018
+ res.writeHead(502, { 'Content-Type': 'application/json' });
1019
+ res.end(JSON.stringify({ error: `Task source: ${parent.error}` }));
1020
+ return;
1021
+ }
1022
+ if (tasks.length === 0) {
1023
+ // Planner saw no decomposition — run the goal itself as one task.
1024
+ await source.updateState(parent.id, 'Todo').catch(() => { });
1025
+ triggerHeartbeat();
1026
+ res.writeHead(200, { 'Content-Type': 'application/json' });
1027
+ res.end(JSON.stringify({
1028
+ mode: source.kind,
1029
+ parentIssue: { id: parent.id, identifier: parent.identifier },
1030
+ subIssues: [],
1031
+ }));
1032
+ return;
1033
+ }
1034
+ const totalMinutes = tasks.reduce((sum, t) => sum + (t.estimatedMinutes || 0), 0);
1035
+ await createSubIssuesWithDependencies(parent.id, { title: goal }, tasks, totalMinutes, { reportToDiscord: () => { }, scheduleNextHeartbeat: triggerHeartbeat }, parent.id, 20);
1036
+ res.writeHead(200, { 'Content-Type': 'application/json' });
1037
+ res.end(JSON.stringify({
1038
+ mode: source.kind,
1039
+ parentIssue: { id: parent.id, identifier: parent.identifier },
1040
+ }));
1041
+ return;
1042
+ }
1043
+ // Path B (fallback) — no Linear: run each sub-task via the exec pipeline.
1044
+ const items = tasks.length > 0
1045
+ ? tasks
1046
+ : [{ title: goal, description: goal, estimatedMinutes: 0, priority: 3 }];
1047
+ const taskIds = items.map((st) => startExecTask(`${st.title}\n\n${st.description ?? ''}`.trim(), {
1048
+ projectPath: resolvedPath,
1049
+ pipeline: true,
1050
+ }));
1051
+ res.writeHead(202, { 'Content-Type': 'application/json' });
1052
+ res.end(JSON.stringify({ mode: 'exec', taskIds }));
1053
+ }
1054
+ catch (err) {
1055
+ res.writeHead(400, { 'Content-Type': 'application/json' });
1056
+ res.end(JSON.stringify({ error: err instanceof Error ? err.message : 'Invalid JSON' }));
1057
+ }
933
1058
  // ---- Exec: task status ----
934
1059
  }
935
1060
  else if (url.startsWith('/api/exec/') && req.method === 'GET') {