agor-live 0.21.2 → 0.22.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 (431) hide show
  1. package/dist/cli/commands/branch/env/restart.js +1 -1
  2. package/dist/cli/commands/branch/env/start.js +1 -1
  3. package/dist/cli/commands/branch/env/stop.js +1 -1
  4. package/dist/core/api/index.cjs +5 -1
  5. package/dist/core/api/index.d.ts +6 -1
  6. package/dist/core/api/index.d.ts.map +1 -1
  7. package/dist/core/api/index.js +5 -1
  8. package/dist/core/claude/index.cjs +162 -14
  9. package/dist/core/claude/index.js +166 -18
  10. package/dist/core/client/index.cjs +43 -3
  11. package/dist/core/client/index.js +37 -3
  12. package/dist/core/config/browser.cjs +2 -2
  13. package/dist/core/config/browser.js +2 -2
  14. package/dist/core/config/config-manager.d.ts.map +1 -1
  15. package/dist/core/config/constants.d.ts +1 -1
  16. package/dist/core/config/index.cjs +174 -20
  17. package/dist/core/config/index.js +178 -24
  18. package/dist/core/config/types.d.ts +8 -0
  19. package/dist/core/config/types.d.ts.map +1 -1
  20. package/dist/core/db/index.cjs +495 -86
  21. package/dist/core/db/index.js +482 -75
  22. package/dist/core/db/repositories/artifacts.d.ts.map +1 -1
  23. package/dist/core/db/repositories/branches.d.ts +13 -1
  24. package/dist/core/db/repositories/branches.d.ts.map +1 -1
  25. package/dist/core/db/repositories/gateway-channels.d.ts.map +1 -1
  26. package/dist/core/db/repositories/index.d.ts +1 -0
  27. package/dist/core/db/repositories/index.d.ts.map +1 -1
  28. package/dist/core/db/repositories/session-relationships.d.ts +30 -0
  29. package/dist/core/db/repositories/session-relationships.d.ts.map +1 -0
  30. package/dist/core/db/repositories/users.d.ts +11 -0
  31. package/dist/core/db/repositories/users.d.ts.map +1 -1
  32. package/dist/core/db/schema.d.ts +421 -4
  33. package/dist/core/db/schema.d.ts.map +1 -1
  34. package/dist/core/db/schema.postgres.d.ts +226 -2
  35. package/dist/core/db/schema.postgres.d.ts.map +1 -1
  36. package/dist/core/db/schema.sqlite.d.ts +228 -2
  37. package/dist/core/db/schema.sqlite.d.ts.map +1 -1
  38. package/dist/core/drizzle/postgres/0050_artifact_source_session.sql +3 -0
  39. package/dist/core/drizzle/postgres/0051_session_relationships.sql +26 -0
  40. package/dist/core/drizzle/postgres/meta/_journal.json +14 -0
  41. package/dist/core/drizzle/sqlite/0059_artifact_source_session.sql +2 -0
  42. package/dist/core/drizzle/sqlite/0060_session_relationships.sql +23 -0
  43. package/dist/core/drizzle/sqlite/meta/_journal.json +14 -0
  44. package/dist/core/gateway/connector-registry.d.ts.map +1 -1
  45. package/dist/core/gateway/connector.d.ts +22 -0
  46. package/dist/core/gateway/connector.d.ts.map +1 -1
  47. package/dist/core/gateway/connectors/slack.d.ts +35 -3
  48. package/dist/core/gateway/connectors/slack.d.ts.map +1 -1
  49. package/dist/core/gateway/connectors/teams.d.ts +107 -0
  50. package/dist/core/gateway/connectors/teams.d.ts.map +1 -0
  51. package/dist/core/gateway/context.d.ts.map +1 -1
  52. package/dist/core/gateway/index.cjs +552 -52
  53. package/dist/core/gateway/index.d.ts +3 -2
  54. package/dist/core/gateway/index.d.ts.map +1 -1
  55. package/dist/core/gateway/index.js +544 -52
  56. package/dist/core/gateway/system-message.d.ts +21 -0
  57. package/dist/core/gateway/system-message.d.ts.map +1 -1
  58. package/dist/core/index.cjs +616 -127
  59. package/dist/core/index.js +597 -116
  60. package/dist/core/mcp/index.cjs +146 -9
  61. package/dist/core/mcp/index.js +146 -9
  62. package/dist/core/mcp/template-resolver.d.ts.map +1 -1
  63. package/dist/core/seed/index.cjs +375 -59
  64. package/dist/core/seed/index.js +378 -62
  65. package/dist/core/sessions/index.cjs +19 -0
  66. package/dist/core/sessions/index.js +19 -0
  67. package/dist/core/templates/agor-system-prompt.md +21 -53
  68. package/dist/core/templates/session-context.cjs +2 -73
  69. package/dist/core/templates/session-context.d.ts +9 -53
  70. package/dist/core/templates/session-context.d.ts.map +1 -1
  71. package/dist/core/templates/session-context.js +2 -72
  72. package/dist/core/tools/mcp/jwt-auth.cjs +2 -20
  73. package/dist/core/tools/mcp/jwt-auth.d.ts.map +1 -1
  74. package/dist/core/tools/mcp/jwt-auth.js +2 -20
  75. package/dist/core/tools/mcp/oauth-mcp-transport.cjs +2 -15
  76. package/dist/core/tools/mcp/oauth-mcp-transport.d.ts.map +1 -1
  77. package/dist/core/tools/mcp/oauth-mcp-transport.js +2 -15
  78. package/dist/core/tools/mcp/oauth-refresh.cjs +167 -19
  79. package/dist/core/tools/mcp/oauth-refresh.js +167 -19
  80. package/dist/core/types/artifact.d.ts +5 -1
  81. package/dist/core/types/artifact.d.ts.map +1 -1
  82. package/dist/core/types/branch.d.ts +14 -0
  83. package/dist/core/types/branch.d.ts.map +1 -1
  84. package/dist/core/types/gateway.d.ts +1 -1
  85. package/dist/core/types/gateway.d.ts.map +1 -1
  86. package/dist/core/types/id.d.ts +1 -0
  87. package/dist/core/types/id.d.ts.map +1 -1
  88. package/dist/core/types/index.cjs +36 -0
  89. package/dist/core/types/index.js +30 -0
  90. package/dist/core/types/session.d.ts +65 -1
  91. package/dist/core/types/session.d.ts.map +1 -1
  92. package/dist/core/types/task.d.ts +9 -0
  93. package/dist/core/types/task.d.ts.map +1 -1
  94. package/dist/core/unix/index.cjs +371 -55
  95. package/dist/core/unix/index.js +374 -58
  96. package/dist/core/unix/unix-integration-service.d.ts +10 -7
  97. package/dist/core/unix/unix-integration-service.d.ts.map +1 -1
  98. package/dist/core/utils/permission-mode-mapper.cjs +19 -0
  99. package/dist/core/utils/permission-mode-mapper.js +19 -0
  100. package/dist/daemon/declarations.d.ts +7 -0
  101. package/dist/daemon/declarations.d.ts.map +1 -1
  102. package/dist/daemon/hooks/gateway-route.d.ts.map +1 -1
  103. package/dist/daemon/hooks/gateway-route.js +53 -1
  104. package/dist/daemon/index.js +3760 -2107
  105. package/dist/daemon/main.js +3760 -2107
  106. package/dist/daemon/mcp/server.js +155 -17
  107. package/dist/daemon/mcp/tools/analytics.js +6 -7
  108. package/dist/daemon/mcp/tools/artifacts.d.ts.map +1 -1
  109. package/dist/daemon/mcp/tools/artifacts.js +7 -7
  110. package/dist/daemon/mcp/tools/boards.js +6 -7
  111. package/dist/daemon/mcp/tools/branches.js +6 -7
  112. package/dist/daemon/mcp/tools/card-types.js +6 -7
  113. package/dist/daemon/mcp/tools/cards.js +6 -7
  114. package/dist/daemon/mcp/tools/environment.d.ts.map +1 -1
  115. package/dist/daemon/mcp/tools/environment.js +19 -12
  116. package/dist/daemon/mcp/tools/knowledge.js +6 -7
  117. package/dist/daemon/mcp/tools/mcp-servers.js +6 -7
  118. package/dist/daemon/mcp/tools/messages.js +6 -7
  119. package/dist/daemon/mcp/tools/proxies.js +6 -7
  120. package/dist/daemon/mcp/tools/repos.js +6 -7
  121. package/dist/daemon/mcp/tools/schedules.js +6 -7
  122. package/dist/daemon/mcp/tools/search.js +6 -7
  123. package/dist/daemon/mcp/tools/sessions.d.ts.map +1 -1
  124. package/dist/daemon/mcp/tools/sessions.js +140 -11
  125. package/dist/daemon/mcp/tools/tasks.js +6 -7
  126. package/dist/daemon/mcp/tools/users.js +6 -7
  127. package/dist/daemon/mcp/tools/widgets.js +7 -8
  128. package/dist/daemon/register-hooks.d.ts +5 -1
  129. package/dist/daemon/register-hooks.d.ts.map +1 -1
  130. package/dist/daemon/register-hooks.js +404 -179
  131. package/dist/daemon/register-routes.d.ts.map +1 -1
  132. package/dist/daemon/register-routes.js +360 -162
  133. package/dist/daemon/register-services.d.ts.map +1 -1
  134. package/dist/daemon/register-services.js +1928 -671
  135. package/dist/daemon/services/artifacts.d.ts +10 -1
  136. package/dist/daemon/services/artifacts.d.ts.map +1 -1
  137. package/dist/daemon/services/artifacts.js +25 -1
  138. package/dist/daemon/services/branches.d.ts +11 -1
  139. package/dist/daemon/services/branches.d.ts.map +1 -1
  140. package/dist/daemon/services/branches.js +470 -184
  141. package/dist/daemon/services/claude-models.js +879 -339
  142. package/dist/daemon/services/gateway.d.ts +58 -2
  143. package/dist/daemon/services/gateway.d.ts.map +1 -1
  144. package/dist/daemon/services/gateway.js +590 -47
  145. package/dist/daemon/services/groups.d.ts +2 -0
  146. package/dist/daemon/services/groups.d.ts.map +1 -1
  147. package/dist/daemon/services/groups.js +56 -0
  148. package/dist/daemon/services/mcp-servers.d.ts.map +1 -1
  149. package/dist/daemon/services/mcp-servers.js +0 -6
  150. package/dist/daemon/services/scheduler.d.ts.map +1 -1
  151. package/dist/daemon/services/scheduler.js +6 -2
  152. package/dist/daemon/services/sessions.d.ts +11 -3
  153. package/dist/daemon/services/sessions.d.ts.map +1 -1
  154. package/dist/daemon/services/sessions.js +68 -7
  155. package/dist/daemon/services/tasks.d.ts +13 -2
  156. package/dist/daemon/services/tasks.d.ts.map +1 -1
  157. package/dist/daemon/services/tasks.js +42 -26
  158. package/dist/daemon/startup.js +6 -2
  159. package/dist/daemon/utils/session-stop.d.ts +43 -0
  160. package/dist/daemon/utils/session-stop.d.ts.map +1 -0
  161. package/dist/daemon/utils/session-stop.js +102 -0
  162. package/dist/daemon/utils/session-task-state.d.ts +7 -2
  163. package/dist/daemon/utils/session-task-state.d.ts.map +1 -1
  164. package/dist/daemon/utils/session-task-state.js +9 -3
  165. package/dist/daemon/utils/session-tasks.d.ts +4 -4
  166. package/dist/daemon/utils/session-tasks.d.ts.map +1 -1
  167. package/dist/daemon/utils/session-tasks.js +4 -8
  168. package/dist/executor/commands/environment.d.ts +13 -0
  169. package/dist/executor/commands/environment.d.ts.map +1 -0
  170. package/dist/executor/commands/environment.js +287 -0
  171. package/dist/executor/commands/index.d.ts.map +1 -1
  172. package/dist/executor/commands/index.js +5 -1
  173. package/dist/executor/commands/unix.d.ts +8 -1
  174. package/dist/executor/commands/unix.d.ts.map +1 -1
  175. package/dist/executor/commands/unix.js +157 -2
  176. package/dist/executor/payload-types.d.ts +201 -5
  177. package/dist/executor/payload-types.d.ts.map +1 -1
  178. package/dist/executor/payload-types.js +98 -0
  179. package/dist/executor/sdk-handlers/base/mcp-scoping.d.ts.map +1 -1
  180. package/dist/executor/sdk-handlers/base/mcp-scoping.js +14 -0
  181. package/dist/executor/sdk-handlers/claude/message-processor.d.ts.map +1 -1
  182. package/dist/executor/sdk-handlers/claude/message-processor.js +0 -1
  183. package/dist/executor/sdk-handlers/claude/query-builder.d.ts +1 -0
  184. package/dist/executor/sdk-handlers/claude/query-builder.d.ts.map +1 -1
  185. package/dist/executor/sdk-handlers/claude/query-builder.js +91 -39
  186. package/dist/executor/sdk-handlers/codex/prompt-service.d.ts +12 -5
  187. package/dist/executor/sdk-handlers/codex/prompt-service.d.ts.map +1 -1
  188. package/dist/executor/sdk-handlers/codex/prompt-service.js +72 -30
  189. package/dist/executor/sdk-handlers/copilot/prompt-service.d.ts +2 -4
  190. package/dist/executor/sdk-handlers/copilot/prompt-service.d.ts.map +1 -1
  191. package/dist/executor/sdk-handlers/copilot/prompt-service.js +4 -13
  192. package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts +2 -4
  193. package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts.map +1 -1
  194. package/dist/executor/sdk-handlers/gemini/prompt-service.js +4 -13
  195. package/dist/ui/assets/App-DcEY8Ota.js +3 -0
  196. package/dist/ui/assets/App-DcEY8Ota.js.gz +0 -0
  197. package/dist/ui/assets/{ArtifactConsentModal-ParNk5kW.js → ArtifactConsentModal-CiCbK9iv.js} +1 -1
  198. package/dist/ui/assets/ArtifactConsentModal-CiCbK9iv.js.gz +0 -0
  199. package/dist/ui/assets/ArtifactFullscreenPage-CfsTEGKd.js +9 -0
  200. package/dist/ui/assets/ArtifactFullscreenPage-CfsTEGKd.js.gz +0 -0
  201. package/dist/ui/assets/AutocompleteTextarea-BAFFH_5e.js +18 -0
  202. package/dist/ui/assets/AutocompleteTextarea-BAFFH_5e.js.gz +0 -0
  203. package/dist/ui/assets/BoardObjectNodes-D-O6bZIG.js +34 -0
  204. package/dist/ui/assets/BoardObjectNodes-D-O6bZIG.js.gz +0 -0
  205. package/dist/ui/assets/{CodeEditor.inner-D51Z_CLQ.js → CodeEditor.inner-DBgsP4tn.js} +2 -2
  206. package/dist/ui/assets/CodeEditor.inner-DBgsP4tn.js.gz +0 -0
  207. package/dist/ui/assets/ConversationView-CUWR0gR6.js +1 -0
  208. package/dist/ui/assets/ConversationView-CUWR0gR6.js.gz +0 -0
  209. package/dist/ui/assets/KnowledgePage-B2bzlXfn.js +24 -0
  210. package/dist/ui/assets/KnowledgePage-B2bzlXfn.js.gz +0 -0
  211. package/dist/ui/assets/MarketingScreenshotPage-9Qd7eZsm.css +1 -0
  212. package/dist/ui/assets/MarketingScreenshotPage-zv5RUCuV.js +143 -0
  213. package/dist/ui/assets/MarketingScreenshotPage-zv5RUCuV.js.gz +0 -0
  214. package/dist/ui/assets/MobileApp-VgVnsnsN.js +1 -0
  215. package/dist/ui/assets/MobileApp-VgVnsnsN.js.gz +0 -0
  216. package/dist/ui/assets/SessionCanvas-f1-1Gbcw.js +20 -0
  217. package/dist/ui/assets/SessionCanvas-f1-1Gbcw.js.gz +0 -0
  218. package/dist/ui/assets/{App-BAdBsEnV.css → SessionCanvas-mEmYGZhC.css} +1 -1
  219. package/dist/ui/assets/SessionCanvas-mEmYGZhC.css.gz +0 -0
  220. package/dist/ui/assets/{StreamdownDemoPage-B9wbgp2s.js → StreamdownDemoPage-wzWaqWwr.js} +1 -1
  221. package/dist/ui/assets/StreamdownDemoPage-wzWaqWwr.js.gz +0 -0
  222. package/dist/ui/assets/{ThemeSwitcher-ubn6IOz9.js → ThemeSwitcher-Dly2y9pi.js} +1 -1
  223. package/dist/ui/assets/ThemeSwitcher-Dly2y9pi.js.gz +0 -0
  224. package/dist/ui/assets/antd-CfbbHJOz.js +401 -0
  225. package/dist/ui/assets/antd-CfbbHJOz.js.gz +0 -0
  226. package/dist/ui/assets/architecture-U656AL7Q-CykGFbQU.js +1 -0
  227. package/dist/ui/assets/{architectureDiagram-VXUJARFQ-ChmZt3zk.js → architectureDiagram-VXUJARFQ-C8HXAenz.js} +1 -1
  228. package/dist/ui/assets/architectureDiagram-VXUJARFQ-C8HXAenz.js.gz +0 -0
  229. package/dist/ui/assets/{blockDiagram-VD42YOAC-CzGHAHao.js → blockDiagram-VD42YOAC-BhZaEN19.js} +1 -1
  230. package/dist/ui/assets/blockDiagram-VD42YOAC-BhZaEN19.js.gz +0 -0
  231. package/dist/ui/assets/{c4Diagram-YG6GDRKO-DscJyaWN.js → c4Diagram-YG6GDRKO-Dk_UH-sY.js} +1 -1
  232. package/dist/ui/assets/c4Diagram-YG6GDRKO-Dk_UH-sY.js.gz +0 -0
  233. package/dist/ui/assets/channel-D6_nUWlW.js +1 -0
  234. package/dist/ui/assets/{chunk-4BX2VUAB-DoWpTvP8.js → chunk-4BX2VUAB-XprbG2TG.js} +1 -1
  235. package/dist/ui/assets/chunk-55IACEB6-ByzqIgSb.js +1 -0
  236. package/dist/ui/assets/{chunk-ABZYJK2D-RzDCrjE6.js → chunk-ABZYJK2D-BJcrryHK.js} +1 -1
  237. package/dist/ui/assets/chunk-ABZYJK2D-BJcrryHK.js.gz +0 -0
  238. package/dist/ui/assets/{chunk-AGHRB4JF-jidCS5Of.js → chunk-AGHRB4JF-DvxmfbM0.js} +1 -1
  239. package/dist/ui/assets/chunk-AGHRB4JF-DvxmfbM0.js.gz +0 -0
  240. package/dist/ui/assets/{chunk-ATLVNIR6-BEIIfJtC.js → chunk-ATLVNIR6-DbeJ0OrR.js} +1 -1
  241. package/dist/ui/assets/chunk-ATLVNIR6-DbeJ0OrR.js.gz +0 -0
  242. package/dist/ui/assets/{chunk-B4BG7PRW-B8b6dQQ2.js → chunk-B4BG7PRW-C53q2ggf.js} +1 -1
  243. package/dist/ui/assets/chunk-B4BG7PRW-C53q2ggf.js.gz +0 -0
  244. package/dist/ui/assets/{chunk-CVBHYZKI-D-mQAfrk.js → chunk-CVBHYZKI-B3EBSlb3.js} +1 -1
  245. package/dist/ui/assets/{chunk-DI55MBZ5-BfATX3V8.js → chunk-DI55MBZ5-vIyNEQN-.js} +1 -1
  246. package/dist/ui/assets/chunk-DI55MBZ5-vIyNEQN-.js.gz +0 -0
  247. package/dist/ui/assets/chunk-EXTU4WIE-B3ObkuOm.js +1 -0
  248. package/dist/ui/assets/{chunk-FMBD7UC4-fqXscNvc.js → chunk-FMBD7UC4-rddmfK-Z.js} +1 -1
  249. package/dist/ui/assets/{chunk-HN2XXSSU-BCHvD80g.js → chunk-HN2XXSSU-Dttqcg3b.js} +1 -1
  250. package/dist/ui/assets/chunk-HN2XXSSU-Dttqcg3b.js.gz +0 -0
  251. package/dist/ui/assets/{chunk-JA3XYJ7Z-Cp6dqHnY.js → chunk-JA3XYJ7Z-DbNDev3D.js} +1 -1
  252. package/dist/ui/assets/chunk-JA3XYJ7Z-DbNDev3D.js.gz +0 -0
  253. package/dist/ui/assets/{chunk-JZLCHNYA-cKMooY3y.js → chunk-JZLCHNYA-EUmx2y4H.js} +1 -1
  254. package/dist/ui/assets/chunk-JZLCHNYA-EUmx2y4H.js.gz +0 -0
  255. package/dist/ui/assets/{chunk-MI3HLSF2-BlzO5wOE.js → chunk-MI3HLSF2-65n9Mkyc.js} +1 -1
  256. package/dist/ui/assets/chunk-MI3HLSF2-65n9Mkyc.js.gz +0 -0
  257. package/dist/ui/assets/chunk-N4CR4FBY-mv5koXqW.js +2 -0
  258. package/dist/ui/assets/chunk-N4CR4FBY-mv5koXqW.js.gz +0 -0
  259. package/dist/ui/assets/{chunk-QN33PNHL-DIHGQ_pd.js → chunk-QN33PNHL-DsRKK6NR.js} +1 -1
  260. package/dist/ui/assets/{chunk-QXUST7PY-C9l0muI0.js → chunk-QXUST7PY-BCYnMiS3.js} +1 -1
  261. package/dist/ui/assets/chunk-QXUST7PY-BCYnMiS3.js.gz +0 -0
  262. package/dist/ui/assets/chunk-QZHKN3VN-HucAw4xW.js +1 -0
  263. package/dist/ui/assets/{chunk-S3R3BYOJ-VJiLzt2o.js → chunk-S3R3BYOJ-CWMEa9Dc.js} +1 -1
  264. package/dist/ui/assets/chunk-S3R3BYOJ-CWMEa9Dc.js.gz +0 -0
  265. package/dist/ui/assets/{chunk-TZMSLE5B-DZwI0C_2.js → chunk-TZMSLE5B-BuQUQcTr.js} +1 -1
  266. package/dist/ui/assets/chunk-TZMSLE5B-BuQUQcTr.js.gz +0 -0
  267. package/dist/ui/assets/classDiagram-2ON5EDUG-CUT3rPTB.js +1 -0
  268. package/dist/ui/assets/classDiagram-v2-WZHVMYZB-CUT3rPTB.js +1 -0
  269. package/dist/ui/assets/{cose-bilkent-S5V4N54A-Ipik-oSD.js → cose-bilkent-S5V4N54A-CnPB3ARO.js} +1 -1
  270. package/dist/ui/assets/cose-bilkent-S5V4N54A-CnPB3ARO.js.gz +0 -0
  271. package/dist/ui/assets/cursor-QEb7m-rN.png +0 -0
  272. package/dist/ui/assets/{dagre-6UL2VRFP-BDpyWQnh.js → dagre-6UL2VRFP-DhS-k_Se.js} +1 -1
  273. package/dist/ui/assets/dagre-6UL2VRFP-DhS-k_Se.js.gz +0 -0
  274. package/dist/ui/assets/{dagre-CgA4KhUX.js → dagre-KgLoHEuy.js} +1 -1
  275. package/dist/ui/assets/dagre-KgLoHEuy.js.gz +0 -0
  276. package/dist/ui/assets/{diagram-PSM6KHXK-B4GRzxLJ.js → diagram-PSM6KHXK-BZg3MJmb.js} +1 -1
  277. package/dist/ui/assets/diagram-PSM6KHXK-BZg3MJmb.js.gz +0 -0
  278. package/dist/ui/assets/{diagram-QEK2KX5R-BWPW28XI.js → diagram-QEK2KX5R-BPCitvbo.js} +1 -1
  279. package/dist/ui/assets/diagram-QEK2KX5R-BPCitvbo.js.gz +0 -0
  280. package/dist/ui/assets/{diagram-S2PKOQOG-BIHhcGoV.js → diagram-S2PKOQOG-NW4uK6sx.js} +1 -1
  281. package/dist/ui/assets/diagram-S2PKOQOG-NW4uK6sx.js.gz +0 -0
  282. package/dist/ui/assets/{editor-C-HJ7Yw0.js → editor-CzFWIUw2.js} +1 -1
  283. package/dist/ui/assets/editor-CzFWIUw2.js.gz +0 -0
  284. package/dist/ui/assets/{emoji-D8F6B62m.js → emoji-Dkz4Zzv_.js} +1 -1
  285. package/dist/ui/assets/emoji-Dkz4Zzv_.js.gz +0 -0
  286. package/dist/ui/assets/{erDiagram-Q2GNP2WA-ubTaAFcK.js → erDiagram-Q2GNP2WA-me1fboaf.js} +1 -1
  287. package/dist/ui/assets/erDiagram-Q2GNP2WA-me1fboaf.js.gz +0 -0
  288. package/dist/ui/assets/{flowDiagram-NV44I4VS-BHLCTYjI.js → flowDiagram-NV44I4VS-DzE8dGsh.js} +1 -1
  289. package/dist/ui/assets/flowDiagram-NV44I4VS-DzE8dGsh.js.gz +0 -0
  290. package/dist/ui/assets/{ganttDiagram-LVOFAZNH-ClC3pay1.js → ganttDiagram-LVOFAZNH-CFQD09Mi.js} +2 -2
  291. package/dist/ui/assets/ganttDiagram-LVOFAZNH-CFQD09Mi.js.gz +0 -0
  292. package/dist/ui/assets/{gitGraph-F6HP7TQM-DghoobE6.js → gitGraph-F6HP7TQM-CfFE_uAC.js} +1 -1
  293. package/dist/ui/assets/{gitGraphDiagram-NY62KEGX-Clqpiswu.js → gitGraphDiagram-NY62KEGX-CaVoxU4C.js} +1 -1
  294. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-CaVoxU4C.js.gz +0 -0
  295. package/dist/ui/assets/index-BN5_Qq7R.js +324 -0
  296. package/dist/ui/assets/index-BN5_Qq7R.js.gz +0 -0
  297. package/dist/ui/assets/index-DxuPq13l.css +1 -0
  298. package/dist/ui/assets/index-DxuPq13l.css.gz +0 -0
  299. package/dist/ui/assets/{info-NVLQJR56-0ZldEXPQ.js → info-NVLQJR56-i_xHYg3f.js} +1 -1
  300. package/dist/ui/assets/{infoDiagram-ER5ION4S-DMmPX-il.js → infoDiagram-ER5ION4S-2NL93b78.js} +1 -1
  301. package/dist/ui/assets/{journeyDiagram-XKPGCS4Q-CrVickA2.js → journeyDiagram-XKPGCS4Q-CZF-2DHU.js} +1 -1
  302. package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CZF-2DHU.js.gz +0 -0
  303. package/dist/ui/assets/{kanban-definition-3W4ZIXB7-C_BsdHYL.js → kanban-definition-3W4ZIXB7-CfvJIOny.js} +1 -1
  304. package/dist/ui/assets/kanban-definition-3W4ZIXB7-CfvJIOny.js.gz +0 -0
  305. package/dist/ui/assets/{line-CfBP7Yic.js → line-DDv8kOJk.js} +1 -1
  306. package/dist/ui/assets/{linear-BsjageUB.js → linear-Daef-l29.js} +1 -1
  307. package/dist/ui/assets/linear-Daef-l29.js.gz +0 -0
  308. package/dist/ui/assets/{mermaid-parser.core-DZdP-NFq.js → mermaid-parser.core-CdK9QgYV.js} +2 -2
  309. package/dist/ui/assets/mermaid-parser.core-CdK9QgYV.js.gz +0 -0
  310. package/dist/ui/assets/{mermaid.core-TNrI0pHG.js → mermaid.core-D6GS9mU-.js} +3 -3
  311. package/dist/ui/assets/mermaid.core-D6GS9mU-.js.gz +0 -0
  312. package/dist/ui/assets/message-SqLqNYcv.js +36 -0
  313. package/dist/ui/assets/message-SqLqNYcv.js.gz +0 -0
  314. package/dist/ui/assets/{mindmap-definition-VGOIOE7T-BbmaUjMY.js → mindmap-definition-VGOIOE7T-Cb3QMflX.js} +1 -1
  315. package/dist/ui/assets/mindmap-definition-VGOIOE7T-Cb3QMflX.js.gz +0 -0
  316. package/dist/ui/assets/{packet-BFZMPI3H-D_ZhkXuT.js → packet-BFZMPI3H-Bm2uwz4i.js} +1 -1
  317. package/dist/ui/assets/{particles-Dv28pjOd.js → particles-DsJFOarW.js} +1 -1
  318. package/dist/ui/assets/particles-DsJFOarW.js.gz +0 -0
  319. package/dist/ui/assets/{pie-7BOR55EZ-Dn0Q3qNx.js → pie-7BOR55EZ-5i17tVnF.js} +1 -1
  320. package/dist/ui/assets/{pieDiagram-ADFJNKIX-BbyjfYu8.js → pieDiagram-ADFJNKIX-BxIwQWvw.js} +1 -1
  321. package/dist/ui/assets/pieDiagram-ADFJNKIX-BxIwQWvw.js.gz +0 -0
  322. package/dist/ui/assets/{quadrantDiagram-AYHSOK5B-Bc3GqMKz.js → quadrantDiagram-AYHSOK5B-B5HPe4ga.js} +1 -1
  323. package/dist/ui/assets/quadrantDiagram-AYHSOK5B-B5HPe4ga.js.gz +0 -0
  324. package/dist/ui/assets/{radar-NHE76QYJ-BHwoAy1q.js → radar-NHE76QYJ-BTn-tq0k.js} +1 -1
  325. package/dist/ui/assets/{reactflow-BVYPxNhc.js → reactflow-Bf74ngoo.js} +2 -2
  326. package/dist/ui/assets/reactflow-Bf74ngoo.js.gz +0 -0
  327. package/dist/ui/assets/{requirementDiagram-UZGBJVZJ-BQaKKL09.js → requirementDiagram-UZGBJVZJ-YfI6llkX.js} +1 -1
  328. package/dist/ui/assets/requirementDiagram-UZGBJVZJ-YfI6llkX.js.gz +0 -0
  329. package/dist/ui/assets/{sandpack-BQW_FQ7G.js → sandpack-D7koO5op.js} +1 -1
  330. package/dist/ui/assets/sandpack-D7koO5op.js.gz +0 -0
  331. package/dist/ui/assets/{sankeyDiagram-TZEHDZUN-DiJvDvhb.js → sankeyDiagram-TZEHDZUN-DOk_B10B.js} +1 -1
  332. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-DOk_B10B.js.gz +0 -0
  333. package/dist/ui/assets/{sequenceDiagram-WL72ISMW-Dw32824o.js → sequenceDiagram-WL72ISMW-DAe4Um17.js} +1 -1
  334. package/dist/ui/assets/sequenceDiagram-WL72ISMW-DAe4Um17.js.gz +0 -0
  335. package/dist/ui/assets/{stateDiagram-FKZM4ZOC-BCOpNdHV.js → stateDiagram-FKZM4ZOC-CCesDu_C.js} +1 -1
  336. package/dist/ui/assets/stateDiagram-FKZM4ZOC-CCesDu_C.js.gz +0 -0
  337. package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-CMlIrsoO.js +1 -0
  338. package/dist/ui/assets/{syntax-VJrU5BEu.js → syntax-C-M-8jOU.js} +1 -1
  339. package/dist/ui/assets/syntax-C-M-8jOU.js.gz +0 -0
  340. package/dist/ui/assets/{theme-DZtFA8b4.js → theme-BQZdiqwv.js} +1 -1
  341. package/dist/ui/assets/{timeline-definition-IT6M3QCI-Jh_WZzXv.js → timeline-definition-IT6M3QCI-D6P5txjT.js} +1 -1
  342. package/dist/ui/assets/timeline-definition-IT6M3QCI-D6P5txjT.js.gz +0 -0
  343. package/dist/ui/assets/{treemap-KMMF4GRG-CPYIgjxE.js → treemap-KMMF4GRG-Bitm3gy4.js} +1 -1
  344. package/dist/ui/assets/{knowledgeRoutes-CivaUqha.js → useUserLocalStorage-Ckb8HsIw.js} +1 -1
  345. package/dist/ui/assets/useUserLocalStorage-Ckb8HsIw.js.gz +0 -0
  346. package/dist/ui/assets/{xychartDiagram-PRI3JC2R-CERc7Rdb.js → xychartDiagram-PRI3JC2R-CsybjUbd.js} +1 -1
  347. package/dist/ui/assets/xychartDiagram-PRI3JC2R-CsybjUbd.js.gz +0 -0
  348. package/dist/ui/index.html +13 -11
  349. package/dist/ui/index.html.gz +0 -0
  350. package/package.json +10 -9
  351. package/dist/ui/assets/App-9s2WHM6S.js +0 -22
  352. package/dist/ui/assets/App-9s2WHM6S.js.gz +0 -0
  353. package/dist/ui/assets/App-BAdBsEnV.css.gz +0 -0
  354. package/dist/ui/assets/ArtifactConsentModal-ParNk5kW.js.gz +0 -0
  355. package/dist/ui/assets/ArtifactFullscreenPage-VQxLMCiN.js +0 -9
  356. package/dist/ui/assets/ArtifactFullscreenPage-VQxLMCiN.js.gz +0 -0
  357. package/dist/ui/assets/AutocompleteTextarea-3RchrIgk.js +0 -18
  358. package/dist/ui/assets/AutocompleteTextarea-3RchrIgk.js.gz +0 -0
  359. package/dist/ui/assets/CodeEditor.inner-D51Z_CLQ.js.gz +0 -0
  360. package/dist/ui/assets/ConversationView-Dyddw2b1.js +0 -34
  361. package/dist/ui/assets/ConversationView-Dyddw2b1.js.gz +0 -0
  362. package/dist/ui/assets/KnowledgePage-CdftslnF.js +0 -24
  363. package/dist/ui/assets/KnowledgePage-CdftslnF.js.gz +0 -0
  364. package/dist/ui/assets/MobileApp-BdBMpnJ1.js +0 -1
  365. package/dist/ui/assets/MobileApp-BdBMpnJ1.js.gz +0 -0
  366. package/dist/ui/assets/StreamdownDemoPage-B9wbgp2s.js.gz +0 -0
  367. package/dist/ui/assets/ThemeSwitcher-ubn6IOz9.js.gz +0 -0
  368. package/dist/ui/assets/antd-C-HfEC4E.js +0 -400
  369. package/dist/ui/assets/antd-C-HfEC4E.js.gz +0 -0
  370. package/dist/ui/assets/architecture-U656AL7Q-dkBewUpN.js +0 -1
  371. package/dist/ui/assets/architectureDiagram-VXUJARFQ-ChmZt3zk.js.gz +0 -0
  372. package/dist/ui/assets/blockDiagram-VD42YOAC-CzGHAHao.js.gz +0 -0
  373. package/dist/ui/assets/c4Diagram-YG6GDRKO-DscJyaWN.js.gz +0 -0
  374. package/dist/ui/assets/channel-DvRQqEqC.js +0 -1
  375. package/dist/ui/assets/chunk-55IACEB6-DojF2pZN.js +0 -1
  376. package/dist/ui/assets/chunk-ABZYJK2D-RzDCrjE6.js.gz +0 -0
  377. package/dist/ui/assets/chunk-AGHRB4JF-jidCS5Of.js.gz +0 -0
  378. package/dist/ui/assets/chunk-ATLVNIR6-BEIIfJtC.js.gz +0 -0
  379. package/dist/ui/assets/chunk-B4BG7PRW-B8b6dQQ2.js.gz +0 -0
  380. package/dist/ui/assets/chunk-DI55MBZ5-BfATX3V8.js.gz +0 -0
  381. package/dist/ui/assets/chunk-EXTU4WIE-BKt6lPJM.js +0 -1
  382. package/dist/ui/assets/chunk-HN2XXSSU-BCHvD80g.js.gz +0 -0
  383. package/dist/ui/assets/chunk-JA3XYJ7Z-Cp6dqHnY.js.gz +0 -0
  384. package/dist/ui/assets/chunk-JZLCHNYA-cKMooY3y.js.gz +0 -0
  385. package/dist/ui/assets/chunk-MI3HLSF2-BlzO5wOE.js.gz +0 -0
  386. package/dist/ui/assets/chunk-N4CR4FBY-pASDorUx.js +0 -2
  387. package/dist/ui/assets/chunk-N4CR4FBY-pASDorUx.js.gz +0 -0
  388. package/dist/ui/assets/chunk-QXUST7PY-C9l0muI0.js.gz +0 -0
  389. package/dist/ui/assets/chunk-QZHKN3VN-CZskCFCf.js +0 -1
  390. package/dist/ui/assets/chunk-S3R3BYOJ-VJiLzt2o.js.gz +0 -0
  391. package/dist/ui/assets/chunk-TZMSLE5B-DZwI0C_2.js.gz +0 -0
  392. package/dist/ui/assets/classDiagram-2ON5EDUG-BFASUbmZ.js +0 -1
  393. package/dist/ui/assets/classDiagram-v2-WZHVMYZB-BFASUbmZ.js +0 -1
  394. package/dist/ui/assets/cose-bilkent-S5V4N54A-Ipik-oSD.js.gz +0 -0
  395. package/dist/ui/assets/dagre-6UL2VRFP-BDpyWQnh.js.gz +0 -0
  396. package/dist/ui/assets/dagre-CgA4KhUX.js.gz +0 -0
  397. package/dist/ui/assets/diagram-PSM6KHXK-B4GRzxLJ.js.gz +0 -0
  398. package/dist/ui/assets/diagram-QEK2KX5R-BWPW28XI.js.gz +0 -0
  399. package/dist/ui/assets/diagram-S2PKOQOG-BIHhcGoV.js.gz +0 -0
  400. package/dist/ui/assets/editor-C-HJ7Yw0.js.gz +0 -0
  401. package/dist/ui/assets/emoji-D8F6B62m.js.gz +0 -0
  402. package/dist/ui/assets/erDiagram-Q2GNP2WA-ubTaAFcK.js.gz +0 -0
  403. package/dist/ui/assets/flowDiagram-NV44I4VS-BHLCTYjI.js.gz +0 -0
  404. package/dist/ui/assets/ganttDiagram-LVOFAZNH-ClC3pay1.js.gz +0 -0
  405. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-Clqpiswu.js.gz +0 -0
  406. package/dist/ui/assets/index-D9OElx9A.css +0 -1
  407. package/dist/ui/assets/index-D9OElx9A.css.gz +0 -0
  408. package/dist/ui/assets/index-DxPuzG7E.js +0 -350
  409. package/dist/ui/assets/index-DxPuzG7E.js.gz +0 -0
  410. package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CrVickA2.js.gz +0 -0
  411. package/dist/ui/assets/kanban-definition-3W4ZIXB7-C_BsdHYL.js.gz +0 -0
  412. package/dist/ui/assets/knowledgeRoutes-CivaUqha.js.gz +0 -0
  413. package/dist/ui/assets/linear-BsjageUB.js.gz +0 -0
  414. package/dist/ui/assets/mermaid-parser.core-DZdP-NFq.js.gz +0 -0
  415. package/dist/ui/assets/mermaid.core-TNrI0pHG.js.gz +0 -0
  416. package/dist/ui/assets/message-BtWWJ9Af.js +0 -36
  417. package/dist/ui/assets/message-BtWWJ9Af.js.gz +0 -0
  418. package/dist/ui/assets/mindmap-definition-VGOIOE7T-BbmaUjMY.js.gz +0 -0
  419. package/dist/ui/assets/particles-Dv28pjOd.js.gz +0 -0
  420. package/dist/ui/assets/pieDiagram-ADFJNKIX-BbyjfYu8.js.gz +0 -0
  421. package/dist/ui/assets/quadrantDiagram-AYHSOK5B-Bc3GqMKz.js.gz +0 -0
  422. package/dist/ui/assets/reactflow-BVYPxNhc.js.gz +0 -0
  423. package/dist/ui/assets/requirementDiagram-UZGBJVZJ-BQaKKL09.js.gz +0 -0
  424. package/dist/ui/assets/sandpack-BQW_FQ7G.js.gz +0 -0
  425. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-DiJvDvhb.js.gz +0 -0
  426. package/dist/ui/assets/sequenceDiagram-WL72ISMW-Dw32824o.js.gz +0 -0
  427. package/dist/ui/assets/stateDiagram-FKZM4ZOC-BCOpNdHV.js.gz +0 -0
  428. package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-Cuqwvgfg.js +0 -1
  429. package/dist/ui/assets/syntax-VJrU5BEu.js.gz +0 -0
  430. package/dist/ui/assets/timeline-definition-IT6M3QCI-Jh_WZzXv.js.gz +0 -0
  431. package/dist/ui/assets/xychartDiagram-PRI3JC2R-CERc7Rdb.js.gz +0 -0
@@ -187,15 +187,19 @@ var init_unix_group_init = __esm({
187
187
 
188
188
  // src/services/branches.ts
189
189
  import { existsSync as existsSync2 } from "fs";
190
- import { mkdir } from "fs/promises";
191
- import { homedir } from "os";
192
- import { dirname, join } from "path";
193
190
  import { analyticsLogger } from "@agor/core/analytics";
194
- import { ENVIRONMENT, isBranchRbacEnabled, loadConfig, PAGINATION } from "@agor/core/config";
191
+ import {
192
+ createUserProcessEnvironment,
193
+ ENVIRONMENT,
194
+ isBranchRbacEnabled,
195
+ loadConfig,
196
+ PAGINATION
197
+ } from "@agor/core/config";
195
198
  import {
196
199
  BoardRepository,
197
200
  BranchRepository as BranchRepository2,
198
- KnowledgeNamespaceRepository as KnowledgeNamespaceRepository2
201
+ KnowledgeNamespaceRepository as KnowledgeNamespaceRepository2,
202
+ UsersRepository as UsersRepository2
199
203
  } from "@agor/core/db";
200
204
  import { renderBranchSnapshot } from "@agor/core/environment/render-snapshot";
201
205
  import {
@@ -208,7 +212,11 @@ import {
208
212
  import { BadRequest, Forbidden as Forbidden2, NotAuthenticated as NotAuthenticated2 } from "@agor/core/feathers";
209
213
  import { stripGitUrlCredentials } from "@agor/core/git";
210
214
  import { getAssistantConfig as getAssistantConfig2, isAssistant as isAssistant3 } from "@agor/core/types";
211
- import { getGidFromGroupName, spawnEnvironmentCommand } from "@agor/core/unix";
215
+ import {
216
+ getGidFromGroupName,
217
+ resolveUnixUserForImpersonation,
218
+ validateResolvedUnixUser
219
+ } from "@agor/core/unix";
212
220
  import { resolveHostIpAddress } from "@agor/core/utils/host-ip";
213
221
  import { isAllowedHealthCheckUrl } from "@agor/core/utils/url";
214
222
 
@@ -624,19 +632,19 @@ function generateTaskId() {
624
632
  return Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join("");
625
633
  }
626
634
  function findExecutorPath() {
627
- const dirname2 = typeof __dirname !== "undefined" ? __dirname : path.dirname(fileURLToPath(import.meta.url));
635
+ const dirname = typeof __dirname !== "undefined" ? __dirname : path.dirname(fileURLToPath(import.meta.url));
628
636
  const possiblePaths = [
629
- path.join(dirname2, "../executor/cli.js"),
637
+ path.join(dirname, "../executor/cli.js"),
630
638
  // Bundled in agor-live
631
- path.join(dirname2, "../../executor/cli.js"),
639
+ path.join(dirname, "../../executor/cli.js"),
632
640
  // Bundled one level up
633
- path.join(dirname2, "../../../packages/executor/bin/agor-executor"),
641
+ path.join(dirname, "../../../packages/executor/bin/agor-executor"),
634
642
  // Development - bin script
635
- path.join(dirname2, "../../../packages/executor/dist/cli.js"),
643
+ path.join(dirname, "../../../packages/executor/dist/cli.js"),
636
644
  // Development - built dist
637
- path.join(dirname2, "../../../../packages/executor/bin/agor-executor"),
645
+ path.join(dirname, "../../../../packages/executor/bin/agor-executor"),
638
646
  // Development from deeper nesting
639
- path.join(dirname2, "../../../../packages/executor/dist/cli.js")
647
+ path.join(dirname, "../../../../packages/executor/dist/cli.js")
640
648
  // Development from deeper nesting
641
649
  ];
642
650
  const executorPath = possiblePaths.find((p) => existsSync(p));
@@ -796,6 +804,263 @@ function spawnExecutorWithTemplate(payload, options) {
796
804
  executorProcess.stdin?.write(JSON.stringify(payload));
797
805
  executorProcess.stdin?.end();
798
806
  }
807
+ var EXECUTOR_RESULT_PREFIX = "AGOR_EXECUTOR_RESULT ";
808
+ function parseExecutorResultFromStdout(stdout) {
809
+ const lines = stdout.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
810
+ for (let i = lines.length - 1; i >= 0; i--) {
811
+ const line = lines[i];
812
+ const resultJson = line.startsWith(EXECUTOR_RESULT_PREFIX) ? line.slice(EXECUTOR_RESULT_PREFIX.length) : line.startsWith("{") && line.endsWith("}") ? line : null;
813
+ if (!resultJson) continue;
814
+ try {
815
+ const parsed = JSON.parse(resultJson);
816
+ if (parsed && typeof parsed === "object" && "success" in parsed) {
817
+ return parsed;
818
+ }
819
+ } catch {
820
+ }
821
+ }
822
+ return null;
823
+ }
824
+ function logChunkedOutput(prefix, stream, chunk) {
825
+ const text = chunk.toString();
826
+ for (const line of text.split(/\r?\n/)) {
827
+ if (!line.trim()) continue;
828
+ if (line.trim().startsWith(EXECUTOR_RESULT_PREFIX)) continue;
829
+ if (stream === "stdout") {
830
+ if (process.env.AGOR_EXECUTOR_DEBUG_STDOUT === "1") {
831
+ console.log(`${prefix} ${line}`);
832
+ }
833
+ } else {
834
+ console.error(`${prefix} ${line}`);
835
+ }
836
+ }
837
+ }
838
+ async function runExecutorCommand(payload, options = {}) {
839
+ const { templateVariables, logPrefix = "[Executor]", timeoutMs = 6e4 } = options;
840
+ const executorCommandTemplate = options.executorCommandTemplate !== void 0 ? options.executorCommandTemplate || void 0 : configuredExecutorDefaults.executorCommandTemplate;
841
+ const asUser = options.asUser !== void 0 ? options.asUser || void 0 : configuredExecutorDefaults.asUser;
842
+ const payloadWithConfig = withResolvedConfig(payload);
843
+ if (executorCommandTemplate) {
844
+ return runExecutorCommandWithTemplate(payloadWithConfig, {
845
+ ...options,
846
+ timeoutMs,
847
+ asUser,
848
+ executorCommandTemplate,
849
+ templateVariables: {
850
+ command: payloadWithConfig.command,
851
+ task_id: generateTaskId(),
852
+ unix_user: asUser,
853
+ log_level: resolveExecutorLogLevel(options.env ?? process.env),
854
+ ...templateVariables
855
+ },
856
+ logPrefix
857
+ });
858
+ }
859
+ return runExecutorCommandLocal(payloadWithConfig, { ...options, timeoutMs, asUser, logPrefix });
860
+ }
861
+ function runExecutorCommandLocal(payload, options) {
862
+ const executorPath = findExecutorPath();
863
+ const executorDir = path.dirname(path.dirname(executorPath));
864
+ const {
865
+ cwd = executorDir,
866
+ env = process.env,
867
+ logPrefix = "[Executor]",
868
+ asUser: rawAsUser,
869
+ preparedEnv,
870
+ preparedEnvFilePath,
871
+ timeoutMs = 6e4
872
+ } = options;
873
+ const asUser = rawAsUser || void 0;
874
+ if (cwd && !existsSync(cwd)) {
875
+ return Promise.resolve({
876
+ success: false,
877
+ error: {
878
+ code: "EXECUTOR_CWD_MISSING",
879
+ message: `Refusing to spawn: cwd does not exist on disk: ${cwd}`
880
+ }
881
+ });
882
+ }
883
+ const daemonUrl = getDaemonUrl();
884
+ const envWithDaemonUrl = preparedEnv ? withDaemonExecutorEnv(preparedEnv, daemonUrl) : asUser ? withDaemonExecutorEnv(
885
+ Object.fromEntries(
886
+ Object.entries({
887
+ PATH: env.PATH || "/usr/local/bin:/usr/bin:/bin",
888
+ NODE_ENV: env.NODE_ENV,
889
+ LOG_LEVEL: env.LOG_LEVEL,
890
+ ANTHROPIC_API_KEY: env.ANTHROPIC_API_KEY,
891
+ ANTHROPIC_AUTH_TOKEN: env.ANTHROPIC_AUTH_TOKEN,
892
+ ANTHROPIC_BASE_URL: env.ANTHROPIC_BASE_URL,
893
+ CLAUDE_CODE_OAUTH_TOKEN: env.CLAUDE_CODE_OAUTH_TOKEN,
894
+ OPENAI_API_KEY: env.OPENAI_API_KEY,
895
+ OPENAI_BASE_URL: env.OPENAI_BASE_URL,
896
+ GEMINI_API_KEY: env.GEMINI_API_KEY,
897
+ GOOGLE_API_KEY: env.GOOGLE_API_KEY,
898
+ GIT_CONFIG_PARAMETERS: env.GIT_CONFIG_PARAMETERS
899
+ }).filter(([_, v]) => v !== void 0)
900
+ ),
901
+ daemonUrl
902
+ ) : withDaemonExecutorEnv(env, daemonUrl);
903
+ const prepared = asUser ? preparedEnvFilePath ? {
904
+ inlineEnv: Object.fromEntries(
905
+ Object.entries(envWithDaemonUrl).filter(([k]) => !isSecretEnvKey(k))
906
+ ),
907
+ envFilePath: preparedEnvFilePath
908
+ } : prepareImpersonationEnv({ asUser, env: envWithDaemonUrl }) : { inlineEnv: void 0, envFilePath: void 0 };
909
+ const { cmd, args } = buildSpawnArgs("node", [executorPath, "--stdin"], {
910
+ asUser,
911
+ env: asUser ? prepared.inlineEnv : void 0,
912
+ envFilePath: prepared.envFilePath
913
+ });
914
+ console.log(`${logPrefix} Running executor command: ${payload.command ?? "?"}`);
915
+ return new Promise((resolve) => {
916
+ let stdout = "";
917
+ let stderr = "";
918
+ let settled = false;
919
+ const child = spawn(cmd, args, {
920
+ cwd,
921
+ env: asUser ? void 0 : { ...envWithDaemonUrl },
922
+ stdio: ["pipe", "pipe", "pipe"],
923
+ detached: false
924
+ });
925
+ attachEnvFileCleanup(child, { envFilePath: prepared.envFilePath, asUser });
926
+ const timer = setTimeout(() => {
927
+ if (settled) return;
928
+ settled = true;
929
+ child.kill("SIGTERM");
930
+ resolve({
931
+ success: false,
932
+ error: {
933
+ code: "EXECUTOR_TIMEOUT",
934
+ message: `Executor command timed out after ${timeoutMs}ms`,
935
+ details: { command: payload.command }
936
+ }
937
+ });
938
+ }, timeoutMs);
939
+ child.stdout?.on("data", (chunk) => {
940
+ stdout += chunk.toString();
941
+ logChunkedOutput(logPrefix, "stdout", chunk);
942
+ });
943
+ child.stderr?.on("data", (chunk) => {
944
+ stderr += chunk.toString();
945
+ logChunkedOutput(logPrefix, "stderr", chunk);
946
+ });
947
+ child.on("error", (error) => {
948
+ if (settled) return;
949
+ settled = true;
950
+ clearTimeout(timer);
951
+ resolve({
952
+ success: false,
953
+ error: {
954
+ code: "EXECUTOR_SPAWN_ERROR",
955
+ message: error.message,
956
+ details: { command: payload.command }
957
+ }
958
+ });
959
+ });
960
+ child.on("exit", (code) => {
961
+ if (settled) return;
962
+ settled = true;
963
+ clearTimeout(timer);
964
+ const result = parseExecutorResultFromStdout(stdout);
965
+ if (result) {
966
+ resolve(result);
967
+ return;
968
+ }
969
+ resolve({
970
+ success: false,
971
+ error: {
972
+ code: "EXECUTOR_RESULT_MISSING",
973
+ message: `Executor exited with code ${code} but did not emit a JSON result`,
974
+ details: {
975
+ command: payload.command,
976
+ exitCode: code,
977
+ stderr: stderr ? "[redacted; enable executor debug logs]" : ""
978
+ }
979
+ }
980
+ });
981
+ });
982
+ child.stdin?.write(JSON.stringify(payload));
983
+ child.stdin?.end();
984
+ });
985
+ }
986
+ function runExecutorCommandWithTemplate(payload, options) {
987
+ const {
988
+ executorCommandTemplate,
989
+ templateVariables,
990
+ logPrefix = "[Executor]",
991
+ timeoutMs = 6e4
992
+ } = options;
993
+ const logLevel = templateVariables.log_level ?? getCurrentLogLevel();
994
+ const command = substituteTemplateVariables(executorCommandTemplate, templateVariables);
995
+ console.log(`${logPrefix} Running templated executor command: ${payload.command ?? "?"}`);
996
+ return new Promise((resolve) => {
997
+ let stdout = "";
998
+ let stderr = "";
999
+ let settled = false;
1000
+ const child = spawn("sh", ["-c", command], {
1001
+ env: { ...process.env, LOG_LEVEL: logLevel },
1002
+ stdio: ["pipe", "pipe", "pipe"]
1003
+ });
1004
+ const timer = setTimeout(() => {
1005
+ if (settled) return;
1006
+ settled = true;
1007
+ child.kill("SIGTERM");
1008
+ resolve({
1009
+ success: false,
1010
+ error: {
1011
+ code: "EXECUTOR_TIMEOUT",
1012
+ message: `Executor command timed out after ${timeoutMs}ms`,
1013
+ details: { command: payload.command, taskId: templateVariables.task_id }
1014
+ }
1015
+ });
1016
+ }, timeoutMs);
1017
+ child.stdout?.on("data", (chunk) => {
1018
+ stdout += chunk.toString();
1019
+ logChunkedOutput(logPrefix, "stdout", chunk);
1020
+ });
1021
+ child.stderr?.on("data", (chunk) => {
1022
+ stderr += chunk.toString();
1023
+ logChunkedOutput(logPrefix, "stderr", chunk);
1024
+ });
1025
+ child.on("error", (error) => {
1026
+ if (settled) return;
1027
+ settled = true;
1028
+ clearTimeout(timer);
1029
+ resolve({
1030
+ success: false,
1031
+ error: {
1032
+ code: "EXECUTOR_SPAWN_ERROR",
1033
+ message: error.message,
1034
+ details: { command: payload.command, taskId: templateVariables.task_id }
1035
+ }
1036
+ });
1037
+ });
1038
+ child.on("exit", (code) => {
1039
+ if (settled) return;
1040
+ settled = true;
1041
+ clearTimeout(timer);
1042
+ const result = parseExecutorResultFromStdout(stdout);
1043
+ if (result) {
1044
+ resolve(result);
1045
+ return;
1046
+ }
1047
+ resolve({
1048
+ success: false,
1049
+ error: {
1050
+ code: "EXECUTOR_RESULT_MISSING",
1051
+ message: `Executor exited with code ${code} but did not emit a JSON result`,
1052
+ details: {
1053
+ command: payload.command,
1054
+ exitCode: code,
1055
+ stderr: stderr ? "[redacted; enable executor debug logs]" : ""
1056
+ }
1057
+ }
1058
+ });
1059
+ });
1060
+ child.stdin?.write(JSON.stringify(payload));
1061
+ child.stdin?.end();
1062
+ });
1063
+ }
799
1064
  function getDaemonUrl() {
800
1065
  if (configuredDaemonUrl) return configuredDaemonUrl;
801
1066
  return `http://localhost:${process.env.PORT || "3030"}`;
@@ -1060,6 +1325,136 @@ var BranchesService = class extends DrizzleService {
1060
1325
  truncated
1061
1326
  };
1062
1327
  }
1328
+ async resolveEnvironmentExecutorContext(branch) {
1329
+ const config = await loadConfig();
1330
+ const unixUserMode = config.execution?.unix_user_mode ?? "simple";
1331
+ let asUser;
1332
+ if (unixUserMode !== "simple") {
1333
+ const usersRepo = new UsersRepository2(this.db);
1334
+ const user = await usersRepo.findById(branch.created_by);
1335
+ const impersonationResult = resolveUnixUserForImpersonation({
1336
+ mode: unixUserMode,
1337
+ userUnixUsername: user?.unix_username,
1338
+ executorUnixUser: config.execution?.executor_unix_user
1339
+ });
1340
+ asUser = impersonationResult.unixUser ?? void 0;
1341
+ if (asUser) {
1342
+ validateResolvedUnixUser(unixUserMode, asUser);
1343
+ }
1344
+ }
1345
+ const env = await createUserProcessEnvironment(branch.created_by, this.db, void 0, !!asUser);
1346
+ return { asUser, env };
1347
+ }
1348
+ async createEnvironmentExecutorPayload(options) {
1349
+ const { branch, action, params } = options;
1350
+ const userId = params?.user?.user_id ?? branch.created_by;
1351
+ const appWithToken = this.app;
1352
+ const sessionToken = await appWithToken.sessionTokenService?.generateToken(
1353
+ `environment-${action}`,
1354
+ userId,
1355
+ { branchId: branch.branch_id, maxUses: -1 }
1356
+ );
1357
+ if (!sessionToken) {
1358
+ throw new Error(`Session token service unavailable; cannot dispatch environment ${action}`);
1359
+ }
1360
+ const { asUser, env } = await this.resolveEnvironmentExecutorContext(branch);
1361
+ return {
1362
+ asUser,
1363
+ env,
1364
+ payload: {
1365
+ command: "environment.lifecycle",
1366
+ sessionToken,
1367
+ daemonUrl: getDaemonUrl(),
1368
+ env,
1369
+ params: {
1370
+ branchId: branch.branch_id,
1371
+ branchPath: branch.path,
1372
+ action,
1373
+ startCommand: branch.start_command,
1374
+ stopCommand: branch.stop_command,
1375
+ nukeCommand: branch.nuke_command,
1376
+ appUrl: branch.app_url
1377
+ }
1378
+ }
1379
+ };
1380
+ }
1381
+ async dispatchEnvironmentExecutor(options) {
1382
+ const { branch, action } = options;
1383
+ const { payload, asUser, env } = await this.createEnvironmentExecutorPayload(options);
1384
+ spawnExecutor(payload, {
1385
+ logPrefix: `[Environment.${action} ${branch.name}]`,
1386
+ asUser,
1387
+ preparedEnv: env,
1388
+ templateVariables: {
1389
+ branch_id: branch.branch_id
1390
+ }
1391
+ });
1392
+ }
1393
+ async runEnvironmentExecutor(options) {
1394
+ const { branch, action } = options;
1395
+ const { payload, asUser, env } = await this.createEnvironmentExecutorPayload(options);
1396
+ const result = await runExecutorCommand(payload, {
1397
+ logPrefix: `[Environment.${action} ${branch.name}]`,
1398
+ asUser,
1399
+ preparedEnv: env,
1400
+ // Mixed webhook/shell restart needs the daemon to wait for shell stop
1401
+ // before it invokes the daemon-owned webhook start. Keep this generous
1402
+ // enough for docker compose down while still bounding the request.
1403
+ timeoutMs: 10 * 6e4,
1404
+ templateVariables: {
1405
+ branch_id: branch.branch_id
1406
+ }
1407
+ });
1408
+ if (!result.success) {
1409
+ const details = result.error?.details;
1410
+ const error = new Error(
1411
+ result.error?.message || "Executor environment command failed"
1412
+ );
1413
+ error.commandOutput = details?.output;
1414
+ throw error;
1415
+ }
1416
+ }
1417
+ async fetchEnvironmentLogsViaExecutor(branch, logsCommand, params) {
1418
+ const userId = params?.user?.user_id ?? branch.created_by;
1419
+ const appWithToken = this.app;
1420
+ const sessionToken = await appWithToken.sessionTokenService?.generateToken(
1421
+ "environment-logs",
1422
+ userId,
1423
+ { branchId: branch.branch_id, maxUses: -1 }
1424
+ );
1425
+ if (!sessionToken) {
1426
+ throw new Error("Session token service unavailable; cannot fetch environment logs");
1427
+ }
1428
+ const { asUser, env } = await this.resolveEnvironmentExecutorContext(branch);
1429
+ const result = await runExecutorCommand(
1430
+ {
1431
+ command: "environment.logs",
1432
+ sessionToken,
1433
+ daemonUrl: getDaemonUrl(),
1434
+ env,
1435
+ params: {
1436
+ branchId: branch.branch_id,
1437
+ branchPath: branch.path,
1438
+ logsCommand
1439
+ }
1440
+ },
1441
+ {
1442
+ logPrefix: `[Environment.logs ${branch.name}]`,
1443
+ asUser,
1444
+ preparedEnv: env,
1445
+ timeoutMs: ENVIRONMENT.LOGS_TIMEOUT_MS,
1446
+ templateVariables: {
1447
+ branch_id: branch.branch_id
1448
+ }
1449
+ }
1450
+ );
1451
+ if (!result.success) {
1452
+ const details = result.error?.details;
1453
+ throw new Error(result.error?.message || details?.output || "Failed to fetch logs");
1454
+ }
1455
+ const data = result.data ?? {};
1456
+ return { stdout: data.logs ?? "", stderr: "", truncated: data.truncated ?? false };
1457
+ }
1063
1458
  /**
1064
1459
  * Extract caller identity for audit logging. Internal/daemon-initiated
1065
1460
  * calls (no params.provider, no user) return undefined which the audit
@@ -1913,8 +2308,18 @@ var BranchesService = class extends DrizzleService {
1913
2308
  /**
1914
2309
  * Custom method: Update environment status
1915
2310
  */
1916
- async updateEnvironment(id, environmentUpdate, params) {
1917
- const existing = await this.get(id, params);
2311
+ async updateEnvironment(idOrData, environmentUpdateOrParams, params) {
2312
+ const isRpcEnvelope = typeof idOrData === "object";
2313
+ const id = isRpcEnvelope ? idOrData.branch_id ?? idOrData.branchId : idOrData;
2314
+ const environmentUpdate = isRpcEnvelope ? idOrData.environment_update ?? idOrData.environmentUpdate : environmentUpdateOrParams;
2315
+ const resolvedParams = isRpcEnvelope ? environmentUpdateOrParams : params;
2316
+ if (!id) {
2317
+ throw new Error("Branch ID is required to update environment status");
2318
+ }
2319
+ if (!environmentUpdate) {
2320
+ throw new Error("Environment update is required");
2321
+ }
2322
+ const existing = await this.get(id, resolvedParams);
1918
2323
  const updatedEnvironment = {
1919
2324
  ...existing.environment_instance,
1920
2325
  ...environmentUpdate
@@ -1939,7 +2344,7 @@ var BranchesService = class extends DrizzleService {
1939
2344
  environment_instance: updatedEnvironment,
1940
2345
  updated_at: (/* @__PURE__ */ new Date()).toISOString()
1941
2346
  },
1942
- params
2347
+ resolvedParams
1943
2348
  );
1944
2349
  return branch;
1945
2350
  }
@@ -1955,6 +2360,9 @@ var BranchesService = class extends DrizzleService {
1955
2360
  if (branch.environment_instance?.status === "running") {
1956
2361
  throw new Error("Environment is already running");
1957
2362
  }
2363
+ const command = branch.start_command;
2364
+ const execution = await this.resolveEnvironmentCommand(command, "start");
2365
+ const access_urls = branch.app_url ? [{ name: "App", url: branch.app_url }] : void 0;
1958
2366
  await this.updateEnvironment(
1959
2367
  id,
1960
2368
  {
@@ -1963,26 +2371,16 @@ var BranchesService = class extends DrizzleService {
1963
2371
  ...branch.environment_instance?.process,
1964
2372
  started_at: (/* @__PURE__ */ new Date()).toISOString()
1965
2373
  },
2374
+ access_urls,
1966
2375
  last_health_check: void 0,
1967
2376
  last_error: void 0
1968
2377
  },
1969
2378
  params
1970
2379
  );
1971
2380
  try {
1972
- const command = branch.start_command;
1973
- const execution = await this.resolveEnvironmentCommand(command, "start");
1974
2381
  console.log(
1975
2382
  `\u{1F680} Starting environment for branch ${branch.name}: ${execution.kind === "webhook" ? redactManagedEnvWebhookUrlForAudit(execution.url) : execution.command}`
1976
2383
  );
1977
- const logPath = join(
1978
- homedir(),
1979
- ".agor",
1980
- "logs",
1981
- "branches",
1982
- branch.branch_id,
1983
- "environment.log"
1984
- );
1985
- await mkdir(dirname(logPath), { recursive: true });
1986
2384
  if (execution.kind === "webhook") {
1987
2385
  await this.executeEnvironmentWebhook({
1988
2386
  url: execution.url,
@@ -1993,61 +2391,9 @@ var BranchesService = class extends DrizzleService {
1993
2391
  });
1994
2392
  console.log(`\u2705 Start webhook completed successfully for ${branch.name}`);
1995
2393
  } else {
1996
- const childProcess = await spawnEnvironmentCommand({
1997
- command: execution.command,
1998
- branch,
1999
- db: this.db,
2000
- commandType: "start",
2001
- stdio: "pipe",
2002
- triggeredBy: this.extractTriggeredBy(params)
2003
- });
2004
- const outputChunks = [];
2005
- const MAX_OUTPUT_LINES = 100;
2006
- const collectOutput = (stream, prefix) => {
2007
- if (!stream) return;
2008
- stream.on("data", (chunk) => {
2009
- const text = chunk.toString();
2010
- if (prefix) {
2011
- process.stderr.write(text);
2012
- } else {
2013
- process.stdout.write(text);
2014
- }
2015
- outputChunks.push(text);
2016
- });
2017
- };
2018
- collectOutput(childProcess.stdout);
2019
- collectOutput(childProcess.stderr, "stderr");
2020
- await new Promise((resolve, reject) => {
2021
- childProcess.on("exit", (code) => {
2022
- if (code === 0) {
2023
- console.log(`\u2705 Start command completed successfully for ${branch.name}`);
2024
- resolve();
2025
- } else {
2026
- const fullOutput = outputChunks.join("");
2027
- const lines = fullOutput.split("\n");
2028
- const truncated = lines.length > MAX_OUTPUT_LINES ? `... (truncated ${lines.length - MAX_OUTPUT_LINES} lines)
2029
- ${lines.slice(-MAX_OUTPUT_LINES).join("\n")}` : fullOutput;
2030
- const output = truncated.trim();
2031
- const err = new Error(`Start command exited with code ${code}`);
2032
- err.commandOutput = output || void 0;
2033
- reject(err);
2034
- }
2035
- });
2036
- childProcess.on("error", (error) => reject(error));
2037
- });
2038
- }
2039
- let access_urls;
2040
- if (branch.app_url) {
2041
- access_urls = [{ name: "App", url: branch.app_url }];
2394
+ await this.dispatchEnvironmentExecutor({ branch, action: "start", params });
2042
2395
  }
2043
- return await this.updateEnvironment(
2044
- id,
2045
- {
2046
- // Don't change status - keep as 'starting' until first successful health check
2047
- access_urls
2048
- },
2049
- params
2050
- );
2396
+ return await this.get(id, params);
2051
2397
  } catch (error) {
2052
2398
  const errorMessage = error instanceof Error ? error.message : "Unknown error";
2053
2399
  const commandOutput = error instanceof Error ? error.commandOutput : void 0;
@@ -2073,17 +2419,10 @@ ${lines.slice(-MAX_OUTPUT_LINES).join("\n")}` : fullOutput;
2073
2419
  async stopEnvironment(id, params) {
2074
2420
  await this.ensureCanTriggerEnv(id, params, "stop branch environments");
2075
2421
  const branch = await this.get(id, params);
2076
- await this.updateEnvironment(
2077
- id,
2078
- {
2079
- status: "stopping"
2080
- },
2081
- params
2082
- );
2422
+ await this.updateEnvironment(id, { status: "stopping" }, params);
2083
2423
  try {
2084
2424
  if (branch.stop_command) {
2085
- const command = branch.stop_command;
2086
- const execution = await this.resolveEnvironmentCommand(command, "stop");
2425
+ const execution = await this.resolveEnvironmentCommand(branch.stop_command, "stop");
2087
2426
  console.log(
2088
2427
  `\u{1F6D1} Stopping environment for branch ${branch.name}: ${execution.kind === "webhook" ? redactManagedEnvWebhookUrlForAudit(execution.url) : execution.command}`
2089
2428
  );
@@ -2096,23 +2435,8 @@ ${lines.slice(-MAX_OUTPUT_LINES).join("\n")}` : fullOutput;
2096
2435
  maxBytes: 16 * 1024
2097
2436
  });
2098
2437
  } else {
2099
- const stopProcess = await spawnEnvironmentCommand({
2100
- command: execution.command,
2101
- branch,
2102
- db: this.db,
2103
- commandType: "stop",
2104
- triggeredBy: this.extractTriggeredBy(params)
2105
- });
2106
- await new Promise((resolve, reject) => {
2107
- stopProcess.on("exit", (code) => {
2108
- if (code === 0) {
2109
- resolve();
2110
- } else {
2111
- reject(new Error(`Down command exited with code ${code}`));
2112
- }
2113
- });
2114
- stopProcess.on("error", (error) => reject(error));
2115
- });
2438
+ await this.dispatchEnvironmentExecutor({ branch, action: "stop", params });
2439
+ return await this.get(id, params);
2116
2440
  }
2117
2441
  } else {
2118
2442
  const managedProcess = this.processes.get(id);
@@ -2164,11 +2488,42 @@ ${lines.slice(-MAX_OUTPUT_LINES).join("\n")}` : fullOutput;
2164
2488
  async restartEnvironment(id, params) {
2165
2489
  await this.ensureCanTriggerEnv(id, params, "restart branch environments");
2166
2490
  const branch = await this.get(id, params);
2167
- if (branch.environment_instance?.status === "running") {
2491
+ if (!branch.start_command) {
2492
+ throw new Error("No start command configured for this branch");
2493
+ }
2494
+ if (branch.environment_instance?.status !== "running") {
2495
+ return await this.startEnvironment(id, params);
2496
+ }
2497
+ const startExecution = await this.resolveEnvironmentCommand(branch.start_command, "start");
2498
+ const stopExecution = branch.stop_command ? await this.resolveEnvironmentCommand(branch.stop_command, "stop") : void 0;
2499
+ if (!branch.stop_command || stopExecution?.kind === "webhook") {
2168
2500
  await this.stopEnvironment(id, params);
2169
- await new Promise((resolve) => setTimeout(resolve, 1e3));
2501
+ return await this.startEnvironment(id, params);
2502
+ }
2503
+ if (startExecution.kind === "webhook") {
2504
+ await this.updateEnvironment(id, { status: "stopping" }, params);
2505
+ await this.runEnvironmentExecutor({ branch, action: "stop", params });
2506
+ return await this.startEnvironment(id, params);
2507
+ }
2508
+ await this.updateEnvironment(id, { status: "stopping" }, params);
2509
+ try {
2510
+ await this.dispatchEnvironmentExecutor({ branch, action: "restart", params });
2511
+ return await this.get(id, params);
2512
+ } catch (error) {
2513
+ await this.updateEnvironment(
2514
+ id,
2515
+ {
2516
+ status: "error",
2517
+ last_health_check: {
2518
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
2519
+ status: "unhealthy",
2520
+ message: error instanceof Error ? error.message : "Unknown error during restart"
2521
+ }
2522
+ },
2523
+ params
2524
+ );
2525
+ throw error;
2170
2526
  }
2171
- return await this.startEnvironment(id, params);
2172
2527
  }
2173
2528
  /**
2174
2529
  * Custom method: Nuke environment (destructive operation)
@@ -2179,16 +2534,9 @@ ${lines.slice(-MAX_OUTPUT_LINES).join("\n")}` : fullOutput;
2179
2534
  if (!branch.nuke_command) {
2180
2535
  throw new Error("No nuke_command configured for this branch");
2181
2536
  }
2182
- await this.updateEnvironment(
2183
- id,
2184
- {
2185
- status: "stopping"
2186
- },
2187
- params
2188
- );
2537
+ await this.updateEnvironment(id, { status: "stopping" }, params);
2189
2538
  try {
2190
- const command = branch.nuke_command;
2191
- const execution = await this.resolveEnvironmentCommand(command, "nuke");
2539
+ const execution = await this.resolveEnvironmentCommand(branch.nuke_command, "nuke");
2192
2540
  console.log(
2193
2541
  `\u{1F4A3} NUKING environment for branch ${branch.name}: ${execution.kind === "webhook" ? redactManagedEnvWebhookUrlForAudit(execution.url) : execution.command}`
2194
2542
  );
@@ -2202,23 +2550,8 @@ ${lines.slice(-MAX_OUTPUT_LINES).join("\n")}` : fullOutput;
2202
2550
  maxBytes: 16 * 1024
2203
2551
  });
2204
2552
  } else {
2205
- const nukeProcess = await spawnEnvironmentCommand({
2206
- command: execution.command,
2207
- branch,
2208
- db: this.db,
2209
- commandType: "nuke",
2210
- triggeredBy: this.extractTriggeredBy(params)
2211
- });
2212
- await new Promise((resolve, reject) => {
2213
- nukeProcess.on("exit", (code) => {
2214
- if (code === 0) {
2215
- resolve();
2216
- } else {
2217
- reject(new Error(`Nuke command exited with code ${code}`));
2218
- }
2219
- });
2220
- nukeProcess.on("error", (error) => reject(error));
2221
- });
2553
+ await this.dispatchEnvironmentExecutor({ branch, action: "nuke", params });
2554
+ return await this.get(id, params);
2222
2555
  }
2223
2556
  const managedProcess = this.processes.get(id);
2224
2557
  if (managedProcess) {
@@ -2376,54 +2709,7 @@ ${lines.slice(-MAX_OUTPUT_LINES).join("\n")}` : fullOutput;
2376
2709
  commandType: "logs",
2377
2710
  triggeredBy: this.extractTriggeredBy(params),
2378
2711
  maxBytes: ENVIRONMENT.LOGS_MAX_BYTES
2379
- }).then(({ body, truncated: truncated2 }) => ({ stdout: body, stderr: "", truncated: truncated2 })) : await new Promise((resolve, reject) => {
2380
- spawnEnvironmentCommand({
2381
- command: execution.command,
2382
- branch,
2383
- db: this.db,
2384
- commandType: "logs",
2385
- stdio: "pipe",
2386
- // Need to capture output for logs
2387
- triggeredBy: this.extractTriggeredBy(params)
2388
- }).then((childProcess) => {
2389
- let stdout = "";
2390
- let stderr = "";
2391
- let truncated2 = false;
2392
- const timeout = setTimeout(() => {
2393
- childProcess.kill("SIGTERM");
2394
- reject(
2395
- new Error(
2396
- `Logs command timed out after ${ENVIRONMENT.LOGS_TIMEOUT_MS / 1e3}s`
2397
- )
2398
- );
2399
- }, ENVIRONMENT.LOGS_TIMEOUT_MS);
2400
- childProcess.stdout?.on("data", (data) => {
2401
- const chunk = data.toString();
2402
- if (stdout.length + chunk.length <= ENVIRONMENT.LOGS_MAX_BYTES) {
2403
- stdout += chunk;
2404
- } else {
2405
- stdout += chunk.substring(0, ENVIRONMENT.LOGS_MAX_BYTES - stdout.length);
2406
- truncated2 = true;
2407
- childProcess.kill("SIGTERM");
2408
- }
2409
- });
2410
- childProcess.stderr?.on("data", (data) => {
2411
- stderr += data.toString();
2412
- });
2413
- childProcess.on("exit", (code) => {
2414
- clearTimeout(timeout);
2415
- if (code === 0 || stdout.length > 0) {
2416
- resolve({ stdout, stderr, truncated: truncated2 });
2417
- } else {
2418
- reject(new Error(stderr || `Logs command exited with code ${code}`));
2419
- }
2420
- });
2421
- childProcess.on("error", (error) => {
2422
- clearTimeout(timeout);
2423
- reject(error);
2424
- });
2425
- }).catch(reject);
2426
- });
2712
+ }).then(({ body, truncated: truncated2 }) => ({ stdout: body, stderr: "", truncated: truncated2 })) : await this.fetchEnvironmentLogsViaExecutor(branch, execution.command, params);
2427
2713
  const allLines = result.stdout.split("\n");
2428
2714
  let finalLines = allLines;
2429
2715
  let wasTruncatedByLines = false;