@wular/coder 0.4.2 → 0.4.3

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 (320) hide show
  1. package/dist/actions-FzDNxMFf.js +20 -0
  2. package/dist/{adapter-BKVzTDnn.js → adapter-7SEiVsmp.js} +1 -1
  3. package/dist/{adapter-B0oYCI0S.js → adapter-BLEfUqoQ.js} +1 -1
  4. package/dist/{adapter-DPInwbJG.js → adapter-H4GlcKQz.js} +1 -1
  5. package/dist/{add-DRsPpQFl.js → add-B50dIJGd.js} +1 -1
  6. package/dist/{add-DkpUwhtO.js → add-D7X3gxap.js} +1 -1
  7. package/dist/{add-C2y-mVzl.js → add-DOEUHIe7.js} +1 -1
  8. package/dist/{add-CLYTF_up.js → add-QExQhTzi.js} +1 -1
  9. package/dist/{add-json-5uPnWPoD.js → add-json-Ck4KIZrT.js} +1 -1
  10. package/dist/{agent-r5mMcehf.js → agent-BPtnEf1q.js} +1 -1
  11. package/dist/{agent-hw3zKw8y.js → agent-BlQ_dNNm.js} +2 -2
  12. package/dist/{alias-_0Rwf2cA.js → alias-BwQBovke.js} +1 -1
  13. package/dist/{app-oE8G1-bi.js → app-y6BYm2eH.js} +1 -1
  14. package/dist/{approvals-DbVrsxec.js → approvals-Cc9cq5T1.js} +2 -2
  15. package/dist/{approve-DeAhFL-m.js → approve-oO9k2fnK.js} +2 -2
  16. package/dist/{apps-eujHiNca.js → apps-CU2YalX8.js} +1 -1
  17. package/dist/{archive-BCUfymIB.js → archive-C5c_HQS1.js} +2 -2
  18. package/dist/{archive-DZ6vpMHb.js → archive-CemlWlVY.js} +2 -2
  19. package/dist/archive-sweep-ehg-fWIt.js +1 -0
  20. package/dist/{args-BOEEdpWk.js → args-DcBCtXhz.js} +1 -1
  21. package/dist/{ask-BU2WVxVM.js → ask-Chu7Twu_.js} +2 -2
  22. package/dist/auth-BOyXPOtu.js +1 -0
  23. package/dist/auth-XbqKSbcD.js +1 -0
  24. package/dist/{chat-bridge-BS9WtP3X.js → chat-bridge-DXgZItGP.js} +1 -1
  25. package/dist/{chat-B_yhNTo0.js → chat-cknlIhVh.js} +1 -1
  26. package/dist/{cli-DWCR7iqa.js → cli-B1ObVrL4.js} +5 -5
  27. package/dist/cli.d.ts +1 -1
  28. package/dist/cli.js +1 -1
  29. package/dist/{client-D9IoAuDD.js → client-31YzOj-i.js} +1 -1
  30. package/dist/{config-12pK4qW7.js → config-DAE_qHYA.js} +1 -1
  31. package/dist/{create-D3f6q0Yq.js → create-CM8B8JxD.js} +1 -1
  32. package/dist/credentials-BXD4Qptk.js +1 -0
  33. package/dist/dash/manifest.json +949 -915
  34. package/dist/dash/public/assets/chunks/{agent-pills-dd0b7643e125bbf1.js → agent-pills-b6a6da91c9559d9f.js} +1 -1
  35. package/dist/dash/public/assets/chunks/{agent-settings-form-45ae6aeaaed2b568.js → agent-settings-form-b615c677046cd6f2.js} +1 -1
  36. package/dist/dash/public/assets/chunks/agents-grid-f2e7b4ff9e11b6e3.js +1 -0
  37. package/dist/dash/public/assets/chunks/{badge-676b01e0c615bf7b.js → badge-215c7b2631dafc69.js} +1 -1
  38. package/dist/dash/public/assets/chunks/{card-e0901d68b79dfa93.js → card-e86dcc81326d2b14.js} +1 -1
  39. package/dist/dash/public/assets/chunks/{combo-952a457d52360d88.js → combo-09e246dc9a517fa8.js} +1 -1
  40. package/dist/dash/public/assets/chunks/composer-417166b029f48c47.js +1 -0
  41. package/dist/dash/public/assets/chunks/composer-645ae8fa97a35280.js +1 -0
  42. package/dist/dash/public/assets/chunks/{confirm-f2fe4ba9905a89c6.js → confirm-5ae484241ad888fd.js} +1 -1
  43. package/dist/dash/public/assets/chunks/{connect-apps-661f3b3a85f1776a.js → connect-apps-4147c45f45fde2b1.js} +1 -1
  44. package/dist/dash/public/assets/chunks/{connect-repositories-5389ec8701a3deac.js → connect-repositories-77591110836bdf03.js} +1 -1
  45. package/dist/dash/public/assets/chunks/credentials-list-e005a0783ec93465.js +2 -0
  46. package/dist/dash/public/assets/chunks/{custom-range-03ba6fb2ade7d282.js → custom-range-463e119af4681c61.js} +1 -1
  47. package/dist/dash/public/assets/chunks/{editor-34cb529d6d8a4b09.js → editor-804b84f4fe6539cd.js} +4 -4
  48. package/dist/dash/public/assets/chunks/{engines-list-2f1acee3ecc8461a.js → engines-list-ceab51f13c690e8c.js} +1 -1
  49. package/dist/dash/public/assets/chunks/{field-901f1f35c18c39c9.js → field-aa0a4b98a976781e.js} +1 -1
  50. package/dist/dash/public/assets/chunks/filter-91144ac2eec6297f.js +1 -0
  51. package/dist/dash/public/assets/chunks/format-105c706345987fb2.js +1 -0
  52. package/dist/dash/public/assets/chunks/heads-a42817b32d2d7f08.js +1 -0
  53. package/dist/dash/public/assets/chunks/{instructions-052fa45a9daf6db6.js → instructions-3a1dcaff2d868aa5.js} +1 -1
  54. package/dist/dash/public/assets/chunks/instructions-6c6f981fffaa31e4.js +1 -0
  55. package/dist/dash/public/assets/chunks/{list-87b359bebd26986a.js → list-7270361464fc3c04.js} +1 -1
  56. package/dist/dash/public/assets/chunks/{mcp-list-b42f0d2ee463b37d.js → mcp-list-2e715d48666b54ad.js} +1 -1
  57. package/dist/dash/public/assets/chunks/{models-list-0669d26fd662aec3.js → models-list-d3c40f94c761a6e5.js} +1 -1
  58. package/dist/dash/public/assets/chunks/paged-3ddb6077bef42752.js +1 -0
  59. package/dist/dash/public/assets/chunks/{platform-actions-c92ca3c6198a9387.js → platform-actions-271ec3b99a64280b.js} +1 -1
  60. package/dist/dash/public/assets/chunks/runners-list-767e49c7d0ec833a.js +1 -0
  61. package/dist/dash/public/assets/chunks/{segmented-358ff2b4992b8384.js → segmented-de4386ccaac7304d.js} +1 -1
  62. package/dist/dash/public/assets/chunks/{select-1013702bdfb1ade4.js → select-a90307706cffa6e0.js} +1 -1
  63. package/dist/dash/public/assets/chunks/{sentinel-c972a33dc69a5135.js → sentinel-b5e032b38604dfd3.js} +1 -1
  64. package/dist/dash/public/assets/chunks/shared-init-7f81ae7bc8c82438.js +2 -0
  65. package/dist/dash/public/assets/chunks/shared-init-933c7f9ee85be766.js +5 -0
  66. package/dist/dash/public/assets/chunks/{tail-7c27aab8ba268bd9.js → tail-4891e727ee526792.js} +1 -1
  67. package/dist/dash/public/assets/chunks/task-actions-ce854925a2dc78fd.js +1 -0
  68. package/dist/dash/public/assets/chunks/task-ddfddeaf07fb684c.js +1 -0
  69. package/dist/dash/public/assets/chunks/task-view-c37dcee08f21a279.js +5 -0
  70. package/dist/dash/public/assets/chunks/tasks-list-baef587999f322d8.js +1 -0
  71. package/dist/dash/public/assets/chunks/{toolbar-f964fa864699f095.js → toolbar-8d98313606ad8a2d.js} +1 -1
  72. package/dist/dash/public/assets/chunks/{versions-list-fc2e0d2a7382e049.js → versions-list-532690efd9f1b0ea.js} +1 -1
  73. package/dist/dash/public/assets/{dash-account-96fc41be318839fa.css → dash-account-edc56e85dbaaabe0.css} +1 -1
  74. package/dist/dash/public/assets/dash-agents-edba57b67e4005d0.css +1 -0
  75. package/dist/dash/public/assets/dash-agents-new-fe22253fbada2fbf.css +1 -0
  76. package/dist/dash/public/assets/dash-agents-param-slug-adf52e9dacb2d825.css +1 -0
  77. package/dist/dash/public/assets/dash-agents-param-slug-edit-a2937a347689ef29.css +1 -0
  78. package/dist/dash/public/assets/dash-agents-param-slug-platforms-265ba13db32a460d.css +1 -0
  79. package/dist/dash/public/assets/dash-agents-param-slug-settings-8afc52eb0372bc4b.css +1 -0
  80. package/dist/dash/public/assets/dash-agents-param-slug-tasks-6193e646be68dbd2.css +1 -0
  81. package/dist/dash/public/assets/dash-agents-param-slug-usage-ceadb3a1c911c402.css +1 -0
  82. package/dist/dash/public/assets/{dash-settings-53b8e6a8f656fa1a.css → dash-settings-cf1997cd7f72e518.css} +1 -1
  83. package/dist/dash/public/assets/dash-settings-param-tab-b44dac8e79a560e6.css +1 -0
  84. package/dist/dash/public/assets/dash-tasks-916c7100a8058aa3.css +1 -0
  85. package/dist/dash/public/assets/dash-tasks-param-id-194a6ffc20e872f2.css +1 -0
  86. package/dist/dash/public/assets/{dash-usage-884943221f76ad93.css → dash-usage-40940b289f85e0b6.css} +1 -1
  87. package/dist/dash/public/assets/pnext-client-13aee92bef5c9e3f.js +1 -0
  88. package/dist/dash/public/assets/pnext-client-1f2686b2044f0df6.js +1 -0
  89. package/dist/dash/public/assets/pnext-client-26130234ebad7067.js +1 -0
  90. package/dist/dash/public/assets/pnext-client-311e35b0076bf406.js +1 -0
  91. package/dist/dash/public/assets/pnext-client-4ade1bf75c9c3d87.js +1 -0
  92. package/dist/dash/public/assets/pnext-client-61cd31b687ede1da.js +1 -0
  93. package/dist/dash/public/assets/{pnext-client-2693db10b197ade1.js → pnext-client-61db65dc4223217a.js} +1 -1
  94. package/dist/dash/public/assets/pnext-client-6ea656e7705e3f2a.js +1 -0
  95. package/dist/dash/public/assets/pnext-client-7fd0f793f0322cb9.js +1 -0
  96. package/dist/dash/public/assets/pnext-client-88159c0840fcfa4a.js +1 -0
  97. package/dist/dash/public/assets/pnext-client-b03f0c47c066b4f3.js +1 -0
  98. package/dist/dash/public/assets/{pnext-client-1afa4148bea69ad2.js → pnext-client-d6478835f543f901.js} +1 -1
  99. package/dist/dash/public/assets/pnext-client-dadb8359021ed590.js +1 -0
  100. package/dist/dash/public/assets/pnext-client-de07532d6aaebf2c.js +1 -0
  101. package/dist/dash/public/assets/pnext-client-f87a31890c8ff224.js +1 -0
  102. package/dist/dash/public/assets/pnext-client-ffe1c123a8e2a350.js +1 -0
  103. package/dist/{default-CwQXCtoB.js → default-BMvUMTFp.js} +1 -1
  104. package/dist/default-B_nKaX0-.js +1 -0
  105. package/dist/{delete-cS01oOIb.js → delete-Bjteibld.js} +2 -2
  106. package/dist/{delete-BD6AnCLg.js → delete-riCIKZwj.js} +2 -2
  107. package/dist/{disable-BMWWeYFQ.js → disable-DQC56YFy.js} +1 -1
  108. package/dist/{discover-Dvr_3_Xr.js → discover-Qanr5TEO.js} +1 -1
  109. package/dist/{discover-Cfx5RPU7.js → discover-lgTYwoQp.js} +2 -2
  110. package/dist/dispatch-BsW_1m7e.js +14 -0
  111. package/dist/{docs-DWegDRiu.js → docs-DFs7lOJp.js} +1 -1
  112. package/dist/{docs-BX65z2Iu.js → docs-DKROso-4.js} +2 -2
  113. package/dist/{enable-Cfzeau2x.js → enable-D2DqZvcU.js} +1 -1
  114. package/dist/{env-CRf6wkM2.js → env-YRY3I60r.js} +1 -1
  115. package/dist/exec-DuUkLMqg.js +11 -0
  116. package/dist/executor-vMppVLB6.js +10 -0
  117. package/dist/flow/builtin/review.js +1 -1
  118. package/dist/flow/index.d.ts +1 -1
  119. package/dist/flow/index.js +1 -1
  120. package/dist/{flow-kAxxVOiR.js → flow-DmERAnR8.js} +1 -1
  121. package/dist/{github-actions-DwUzm4hC.js → github-actions-C_NkHVJq.js} +1 -1
  122. package/dist/http-D01Udu4u.js +1 -0
  123. package/dist/{index-CZjFX5zV.d.ts → index-B1L4zXZH.d.ts} +2 -1
  124. package/dist/{init-C4tDFH4G.js → init-Bd6JHzBc.js} +1 -1
  125. package/dist/integrations-B2CavXR1.js +5 -0
  126. package/dist/integrations-D1Dwy1kt.js +1 -0
  127. package/dist/lib/broker.js +2 -2
  128. package/dist/{list-DuPqU3fk.js → list-4Uo-0v9s.js} +1 -1
  129. package/dist/{list-COAo7eZd.js → list-B0ujEZhd.js} +3 -3
  130. package/dist/{list-5Ljf9TxF.js → list-B5oa1Bhy.js} +2 -2
  131. package/dist/{list-vOvIpbOH.js → list-BjE_l6la.js} +1 -1
  132. package/dist/{list-J8d_zh-o.js → list-Ck9ibCs1.js} +1 -1
  133. package/dist/{list-vpyS-hv8.js → list-DhgK4Zc4.js} +1 -1
  134. package/dist/{list-way5oLO0.js → list-KvL7AUhD.js} +2 -2
  135. package/dist/{list-DzGuMkQy.js → list-byYLBl1U.js} +1 -1
  136. package/dist/{load-BpEsAn51.js → load-SnZd7xG1.js} +1 -1
  137. package/dist/{local-H3uvqEbq.js → local-BRy1EUq2.js} +1 -1
  138. package/dist/log-view-DeJstSkw.js +3 -0
  139. package/dist/{login-BBw95-S3.js → login-C-ahtDKV.js} +1 -1
  140. package/dist/{login-CNmeRAL7.js → login-zpwke8g1.js} +1 -1
  141. package/dist/{logout-j0dTo_Ib.js → logout-CI6Kf-T6.js} +1 -1
  142. package/dist/{maintenance-DkLVtqM7.js → maintenance-BAzr9Jlr.js} +1 -1
  143. package/dist/{match-CXAjDhg7.js → match-DxV1d49D.js} +1 -1
  144. package/dist/{mcp-BgKb2Cdk.js → mcp-CmcL1MCG.js} +1 -1
  145. package/dist/{mcp-CsmBtlW9.js → mcp-mhXwtGQT.js} +1 -1
  146. package/dist/{migrate-N-85_N7J.js → migrate-Czh3TEK5.js} +1 -1
  147. package/dist/{migrate-D4nzYhk8.js → migrate-w7KfzUAR.js} +1 -1
  148. package/dist/{model-B79MFtRV.js → model-JRoTH9QK.js} +1 -1
  149. package/dist/models-C-S7HqSb.js +1 -0
  150. package/dist/{prompt-CEuBMNhk.js → prompt-CMXmt2l9.js} +4 -4
  151. package/dist/{push-DbdnbZYt.js → push-B8BhTyZs.js} +1 -1
  152. package/dist/queue-CirjEskI.js +117 -0
  153. package/dist/refresh-Bmy2r1Ee.js +1 -0
  154. package/dist/{remote-miQNTVRa.js → remote-CxFnEjZl.js} +1 -1
  155. package/dist/{remove-BNzbUhaK.js → remove-C15WLaXT.js} +1 -1
  156. package/dist/{remove-D-QeeZQL.js → remove-CTZYjjSr.js} +1 -1
  157. package/dist/{remove-CLpL12Ya.js → remove-CTl-H0f0.js} +1 -1
  158. package/dist/{remove-CaYH9Cna.js → remove-DX2FVo5b.js} +1 -1
  159. package/dist/rename-D1g4TnHQ.js +1 -0
  160. package/dist/{result-BfTfJayl.js → result-D49VN8PM.js} +3 -3
  161. package/dist/result-DGWyUHYU.js +18 -0
  162. package/dist/{resume-aZ8yWDBh.js → resume-ywzc7z6A.js} +2 -2
  163. package/dist/{review-BEhDcX4b.js → review-ZC0xG8XY.js} +2 -2
  164. package/dist/{rotate-key-BqnKhTK8.js → rotate-key-Bf8_99ck.js} +1 -1
  165. package/dist/{run-BWbabvub.js → run-D7SJ-ieT.js} +2 -2
  166. package/dist/run-DoRQSC_K.js +2 -0
  167. package/dist/{run-BdPjxaZU.js → run-ukCf2Mdy.js} +1 -1
  168. package/dist/runner-D-REfOUe.js +1 -0
  169. package/dist/{runner-sUpWJ_k0.js → runner-wDYhkVsM.js} +1 -1
  170. package/dist/schema-DoNO0dPh.js +1 -0
  171. package/dist/sdk.d.ts +4 -2
  172. package/dist/sdk.js +1 -1
  173. package/dist/serve-BJ_Mbm2m.js +8 -0
  174. package/dist/{serve-C0WC-QrV.js → serve-C1MMhM1F.js} +2 -2
  175. package/dist/{serve-CcObDKKQ.js → serve-DtrOHaoS.js} +2 -2
  176. package/dist/{serve-Ck95047c.js → serve-P9pFkEnE.js} +1 -1
  177. package/dist/{serve-BTeomYxW.js → serve-yjSw0B1a.js} +1 -1
  178. package/dist/{server-BxLFZL80.js → server-DDWTnmbx.js} +1 -1
  179. package/dist/{setup-host-DLd_j2Uw.js → setup-host-L6Rnn5Cz.js} +1 -1
  180. package/dist/{shared-BLkGRKty.js → shared-XsUX_ZZb.js} +1 -1
  181. package/dist/{show-DzoQIs75.js → show-CU-jqJ90.js} +1 -1
  182. package/dist/{show-FC3dJcD-.js → show-DVJmB2u-.js} +1 -1
  183. package/dist/{status-BU3DR1XU.js → status-CBydR7LE.js} +1 -1
  184. package/dist/{steer-P_38hRRD.js → steer-Cm_sHZqs.js} +2 -2
  185. package/dist/{stop-BJGDRPsp.js → stop-DJS7DAPJ.js} +1 -1
  186. package/dist/{stop-BWY6k6v5.js → stop-TrebIIuv.js} +2 -2
  187. package/dist/store-BrNMqJgk.js +42 -0
  188. package/dist/store-j8icrG0v.js +19 -0
  189. package/dist/task-C8lmcNsf.js +1 -0
  190. package/dist/{task-DeglY79z.js → task-CpUI19o2.js} +4 -4
  191. package/dist/task-CvSqiwxo.js +1 -0
  192. package/dist/{test-BrSrhop9.js → test-CDKz4jY_.js} +1 -1
  193. package/dist/{tools-CgswhJzh.js → tools-DBFeoosk.js} +1 -1
  194. package/dist/{types-I5Cwtl_K.d.ts → types-DMGBYB_K.d.ts} +3 -1
  195. package/dist/{unalias-mMHXqok7.js → unalias-BfQFBnuK.js} +1 -1
  196. package/dist/{update-DbOWToPy.js → update-C4FFOie8.js} +1 -1
  197. package/dist/{upgrade-D6oC9HQI.js → upgrade-DLJqMnUQ.js} +2 -2
  198. package/dist/{usage-Cb8Dtv9V.js → usage-CSh-xwQ2.js} +1 -1
  199. package/dist/{usage-DMs-IIJC.js → usage-D8mc4qXK.js} +1 -1
  200. package/dist/{watch-BcMQXGYO.js → watch-CQu-tJKZ.js} +2 -2
  201. package/dist/{watch-eE2XiwsC.js → watch-DmwaEvoi.js} +2 -2
  202. package/dist/{wire-BeT1Axeo.js → wire-DzGLZ3-O.js} +1 -1
  203. package/dist/worker-BLKTMLqa.js +1 -0
  204. package/dist/worker-nHemduM_.js +9 -0
  205. package/dist/{workflow-Cshghoas.js → workflow-IrouAus_.js} +1 -1
  206. package/docs/mcp.md +1 -1
  207. package/migrations/0000_initial.sql +8 -0
  208. package/migrations/meta/0000_snapshot.json +75 -1
  209. package/migrations/meta/_journal.json +1 -1
  210. package/package.json +1 -1
  211. package/plugins/agents/skills/coder/SKILL.md +1 -0
  212. package/plugins/claude/.claude-plugin/plugin.json +1 -1
  213. package/plugins/claude/skills/dispatch/SKILL.md +1 -1
  214. package/plugins/cursor/.cursor-plugin/plugin.json +1 -1
  215. package/plugins/cursor/skills/coder/SKILL.md +1 -0
  216. package/src/client/index.ts +10 -2
  217. package/src/client/types.ts +18 -0
  218. package/src/core/defaults.ts +11 -0
  219. package/src/core/task/log-view.ts +120 -6
  220. package/src/server/dash/app/dash/agents/(list)/agent-menu.tsx +4 -0
  221. package/src/server/dash/app/dash/agents/(list)/agents-grid.tsx +18 -35
  222. package/src/server/dash/app/dash/agents/(list)/loading.tsx +7 -1
  223. package/src/server/dash/app/dash/agents/[slug]/(tabs)/layout.tsx +2 -1
  224. package/src/server/dash/app/dash/layout.tsx +13 -3
  225. package/src/server/dash/app/dash/settings/[tab]/credentials-list.tsx +20 -13
  226. package/src/server/dash/app/dash/settings/[tab]/runners-list.tsx +13 -12
  227. package/src/server/dash/app/dash/tasks/[id]/activity.tsx +49 -4
  228. package/src/server/dash/app/dash/tasks/[id]/task-actions.tsx +43 -6
  229. package/src/server/dash/app/dash/tasks/[id]/task-view.css +52 -31
  230. package/src/server/dash/app/dash/tasks/[id]/task-view.tsx +143 -51
  231. package/src/server/dash/app/dash/tasks/composer.css +4 -0
  232. package/src/server/dash/app/dash/tasks/composer.tsx +6 -5
  233. package/src/server/dash/app/dash/tasks/list/task.ts +29 -1
  234. package/src/server/dash/app/dash/tasks/list/tasks-list.css +20 -7
  235. package/src/server/dash/app/dash/tasks/list/tasks-list.tsx +256 -109
  236. package/src/server/dash/app/dash/tasks/list/tasks-section.tsx +9 -13
  237. package/src/server/dash/app/dash/tasks/page.tsx +3 -35
  238. package/src/server/dash/comps/frame/loading-card.tsx +4 -3
  239. package/src/server/dash/comps/frame/page-head.css +10 -0
  240. package/src/server/dash/comps/frame/page-head.tsx +3 -2
  241. package/src/server/dash/comps/frame/task-toasts.tsx +196 -50
  242. package/src/server/dash/comps/nav/side-toggle.tsx +15 -4
  243. package/src/server/dash/comps/ui/card.css +1 -0
  244. package/src/server/dash/comps/ui/filter.css +64 -0
  245. package/src/server/dash/comps/ui/filter.tsx +336 -0
  246. package/src/server/dash/comps/ui/icons.ts +2 -0
  247. package/src/server/dash/comps/ui/menu.tsx +4 -0
  248. package/src/server/dash/comps/ui/select.tsx +2 -2
  249. package/src/server/dash/comps/ui/toolbar.css +14 -0
  250. package/src/server/dash/utils/client.ts +21 -0
  251. package/src/server/dash/utils/format.ts +12 -4
  252. package/src/server/dash/utils/paged.ts +14 -6
  253. package/dist/actions-Mk3FSlpJ.js +0 -20
  254. package/dist/archive-sweep-Cxbh8yAI.js +0 -1
  255. package/dist/auth-CBWTmAPA.js +0 -1
  256. package/dist/auth-Dmn2U7rr.js +0 -1
  257. package/dist/credentials-l6dsrZLL.js +0 -1
  258. package/dist/dash/public/assets/chunks/agents-grid-b906da80c31fc035.js +0 -1
  259. package/dist/dash/public/assets/chunks/composer-49f9e7c5c4dfda3b.js +0 -1
  260. package/dist/dash/public/assets/chunks/composer-f331d00837143aee.js +0 -1
  261. package/dist/dash/public/assets/chunks/credentials-list-e6177d0943517929.js +0 -2
  262. package/dist/dash/public/assets/chunks/format-eb03fc9d9744d960.js +0 -1
  263. package/dist/dash/public/assets/chunks/heads-1570a3a6db331979.js +0 -1
  264. package/dist/dash/public/assets/chunks/instructions-d0a4b0d95009c262.js +0 -1
  265. package/dist/dash/public/assets/chunks/paged-bc6fa0c2b9d52ed7.js +0 -1
  266. package/dist/dash/public/assets/chunks/runners-list-9fffa50432c470c9.js +0 -1
  267. package/dist/dash/public/assets/chunks/shared-init-20e199043ff5d00f.js +0 -2
  268. package/dist/dash/public/assets/chunks/shared-init-88cce66bb3cfe1e5.js +0 -5
  269. package/dist/dash/public/assets/chunks/task-actions-a9603d520434baab.js +0 -1
  270. package/dist/dash/public/assets/chunks/task-fa8b82e95e771c4a.js +0 -1
  271. package/dist/dash/public/assets/chunks/task-view-f7039cb330bcb0b5.js +0 -3
  272. package/dist/dash/public/assets/chunks/tasks-list-2a905b4a0c3a9042.js +0 -1
  273. package/dist/dash/public/assets/dash-agents-290a7b21c7dc0c92.css +0 -1
  274. package/dist/dash/public/assets/dash-agents-new-a7a07bf4ebda24c2.css +0 -1
  275. package/dist/dash/public/assets/dash-agents-param-slug-69a72fb0bbd14cc2.css +0 -1
  276. package/dist/dash/public/assets/dash-agents-param-slug-edit-397bdfb2f0ca328c.css +0 -1
  277. package/dist/dash/public/assets/dash-agents-param-slug-platforms-a7b3b7247c27f1d2.css +0 -1
  278. package/dist/dash/public/assets/dash-agents-param-slug-settings-8389b7d0555e8ccf.css +0 -1
  279. package/dist/dash/public/assets/dash-agents-param-slug-tasks-5987b8aea5e8f30d.css +0 -1
  280. package/dist/dash/public/assets/dash-agents-param-slug-usage-19abc69e1d4e6b0a.css +0 -1
  281. package/dist/dash/public/assets/dash-settings-param-tab-ac61fdfdd6fd533f.css +0 -1
  282. package/dist/dash/public/assets/dash-tasks-cc0b1d32874b731c.css +0 -1
  283. package/dist/dash/public/assets/dash-tasks-param-id-02b8c7bd99cc1090.css +0 -1
  284. package/dist/dash/public/assets/pnext-client-17ba55bb57a1f4da.js +0 -1
  285. package/dist/dash/public/assets/pnext-client-43f52a07f8067b1b.js +0 -1
  286. package/dist/dash/public/assets/pnext-client-4594b693fe612835.js +0 -1
  287. package/dist/dash/public/assets/pnext-client-73f73e24f8141fb6.js +0 -1
  288. package/dist/dash/public/assets/pnext-client-7574da4651b40eae.js +0 -1
  289. package/dist/dash/public/assets/pnext-client-7b3a2c1092cbbb02.js +0 -1
  290. package/dist/dash/public/assets/pnext-client-816fe5fc96d3f768.js +0 -1
  291. package/dist/dash/public/assets/pnext-client-86cb956b448b0887.js +0 -1
  292. package/dist/dash/public/assets/pnext-client-8b64e3c030164288.js +0 -1
  293. package/dist/dash/public/assets/pnext-client-8f6161084c595a22.js +0 -1
  294. package/dist/dash/public/assets/pnext-client-9203ec11926e5d04.js +0 -1
  295. package/dist/dash/public/assets/pnext-client-a38b446f941d44df.js +0 -1
  296. package/dist/dash/public/assets/pnext-client-bd8d51aaa095e8a4.js +0 -1
  297. package/dist/dash/public/assets/pnext-client-e9821d1f1bdb281d.js +0 -1
  298. package/dist/default-De8FXiWz.js +0 -1
  299. package/dist/dispatch-BKeAch9E.js +0 -14
  300. package/dist/exec-RZFLclKX.js +0 -11
  301. package/dist/executor-BvAA7Cgw.js +0 -10
  302. package/dist/http-Bkg_OQ6r.js +0 -1
  303. package/dist/integrations-BAgdVDhj.js +0 -5
  304. package/dist/integrations-D-L3uQRj.js +0 -1
  305. package/dist/log-view-dg0TlKLA.js +0 -1
  306. package/dist/models-_5LVGC3m.js +0 -1
  307. package/dist/queue-C9fSdE_X.js +0 -116
  308. package/dist/refresh-BDmap1RA.js +0 -1
  309. package/dist/rename-Bhcb4t9F.js +0 -1
  310. package/dist/result-D8DsvJDu.js +0 -15
  311. package/dist/run-Dqe38jX8.js +0 -2
  312. package/dist/runner-BPpiJvHx.js +0 -1
  313. package/dist/schema-CU2iFkp8.js +0 -1
  314. package/dist/serve-DA5I2qXj.js +0 -4
  315. package/dist/store-B3ZHoBJY.js +0 -8
  316. package/dist/store-BLi19UDE.js +0 -42
  317. package/dist/task-C6VAg5WU.js +0 -1
  318. package/dist/task-b2BK481M.js +0 -1
  319. package/dist/worker-CXndxmGF.js +0 -9
  320. package/dist/worker-DrucI22w.js +0 -1
@@ -0,0 +1,14 @@
1
+ import e from"node:path";import t from"node:process";import{fileURLToPath as n}from"node:url";import*as r from"zod/mini";import i from"node:fs";import{execFileSync as a,spawn as o,spawnSync as s}from"node:child_process";import{createHash as c,randomUUID as l}from"node:crypto";import u from"node:os";import d from"node:net";import f from"node:readline";function p(t,n){if(!n)return``;if(!e.isAbsolute(n))return n;let r=e.relative(t,n);return r&&!r.startsWith(`..`)?r:n}function m(e){try{return JSON.parse(i.readFileSync(e,`utf8`))}catch{return null}}function h(t,n){i.mkdirSync(e.dirname(t),{recursive:!0});let r=`${t}.${process.pid}.${l()}.tmp`;try{i.writeFileSync(r,`${JSON.stringify(n,null,2)}\n`,{encoding:`utf8`,flag:`wx`}),i.renameSync(r,t)}finally{i.rmSync(r,{force:!0})}}function g(t,n){if(i.mkdirSync(e.dirname(n),{recursive:!0}),i.existsSync(n))throw Object.assign(Error(`Directory already exists: ${n}`),{code:`EEXIST`});try{i.renameSync(t,n);return}catch(e){if(e.code!==`EXDEV`)throw e}let r=`${n}.${process.pid}.${l()}.tmp`;try{i.cpSync(t,r,{recursive:!0,preserveTimestamps:!0,verbatimSymlinks:!0,errorOnExist:!0,force:!1}),i.renameSync(r,n),i.rmSync(t,{recursive:!0})}finally{i.rmSync(r,{recursive:!0,force:!0})}}async function _(t,n){if(await i.promises.mkdir(e.dirname(n),{recursive:!0}),await i.promises.lstat(n).catch(e=>{if(e.code!==`ENOENT`)throw e}))throw Object.assign(Error(`Directory already exists: ${n}`),{code:`EEXIST`});try{await i.promises.rename(t,n);return}catch(e){if(e.code!==`EXDEV`)throw e}let r=`${n}.${process.pid}.${l()}.tmp`;try{await i.promises.cp(t,r,{recursive:!0,preserveTimestamps:!0,verbatimSymlinks:!0,errorOnExist:!0,force:!1}),await i.promises.rename(r,n),await i.promises.rm(t,{recursive:!0})}finally{await i.promises.rm(r,{recursive:!0,force:!0})}}function v(e){let t=0,n=``;return()=>{let r;try{r=i.statSync(e).size}catch{return[]}if(r<t&&(t=0,n=``),r===t)return[];let a;try{a=i.openSync(e,`r`)}catch{return[]}try{let e=Buffer.alloc(r-t),o=i.readSync(a,e,0,e.length,t);t+=o;let s=(n+e.toString(`utf8`,0,o)).split(`
2
+ `);return n=s.pop()??``,s.filter(Boolean)}finally{i.closeSync(a)}}}function y(e){return String(e??``).replace(/[^A-Za-z0-9._-]/g,`-`).replace(/^-+|-+$/g,``)}function b(n,r=t.platform){return r===`win32`?`pipe:\\\\.\\pipe\\${y(`${e.win32.basename(n)}-codex-app-server`)}`:`unix:${e.join(n,`broker.sock`)}`}function x(e){if(typeof e!=`string`||e.length===0)throw Error(`Missing broker endpoint.`);if(e.startsWith(`pipe:`)){let t=e.slice(5);if(!t)throw Error(`Broker pipe endpoint is missing its path.`);return{kind:`pipe`,path:t}}if(e.startsWith(`unix:`)){let t=e.slice(5);if(!t)throw Error(`Broker Unix socket endpoint is missing its path.`);return{kind:`unix`,path:t}}throw Error(`Unsupported broker endpoint: ${e}`)}function S(){let t=e.dirname(n(import.meta.url));for(let n=0;n<10;n++){let n=e.join(t,`package.json`);try{if(JSON.parse(i.readFileSync(n,`utf8`)).name===`@wular/coder`)return t}catch{}let r=e.dirname(t);if(r===t)break;t=r}return e.resolve(e.dirname(n(import.meta.url)),`..`)}const C=S(),w=i.existsSync(e.join(C,`dist/cli.js`))?e.join(C,`dist/cli.js`):e.join(C,`src/cli.ts`);function T(){try{return JSON.parse(i.readFileSync(e.join(C,`package.json`),`utf8`)).version??`unknown`}catch{return`unknown`}}function E(e){try{return JSON.parse(i.readFileSync(e,`utf8`)).version??null}catch{return null}}function ee(){return C}const te={false:`broker.json`,true:`broker-network.json`};function ne(t=`coder-`){return i.mkdtempSync(e.join(u.tmpdir(),t))}function re(e){let t=x(e);return d.createConnection({path:t.path})}async function ie(e,t=2e3){let n=Date.now();for(;Date.now()-n<t;){if(await new Promise(t=>{let n=re(e);n.on(`connect`,()=>{n.end(),t(!0)}),n.on(`error`,()=>t(!1))}))return!0;await new Promise(e=>setTimeout(e,50))}return!1}function ae({scriptPath:e,cwd:n,endpoint:r,pidFile:a,logFile:s,networkAccess:c=!1,env:l=t.env}){let u=i.openSync(s,`a`),d=o(t.execPath,[e,`serve`,`--endpoint`,r,`--cwd`,n,`--pid-file`,a,`--network-access`,String(c)],{cwd:n,env:l,detached:!0,stdio:[`ignore`,u,u]});return d.unref(),i.closeSync(u),d}function oe(){let e=[new URL(`./lib/broker.js`,import.meta.url),new URL(`./main.js`,import.meta.url)];for(let t of e){let e=n(t);if(i.existsSync(e))return e}throw Error("Coder broker script not found next to the runtime. Rebuild with `bun run build`.")}function se(t,n=!1){return e.join(A(t),te[n?`true`:`false`])}function ce(e,t=!1){let n=se(e,t);if(!i.existsSync(n))return null;try{let e=JSON.parse(i.readFileSync(n,`utf8`));return(e.networkAccess??!1)===t?e:null}catch{return null}}function le(e,t,n=t.networkAccess??!1){let r=A(e);i.mkdirSync(r,{recursive:!0}),i.writeFileSync(se(e,n),`${JSON.stringify(t,null,2)}\n`,`utf8`)}function ue(e,t=!1){let n=se(e,t);i.existsSync(n)&&i.unlinkSync(n)}async function de(e){if(!e)return!1;try{return await ie(e,150)}catch{return!1}}async function fe(n,r={}){let i=r.scriptPath??oe(),a=T(),o=r.networkAccess??!1,s=ce(n,o),c=s?.version===a&&s?.scriptPath===i&&(s?.networkAccess??!1)===o;if(s&&c&&await de(s.endpoint))return s;s&&(pe({endpoint:s.endpoint??null,pidFile:s.pidFile??null,logFile:s.logFile??null,sessionDir:s.sessionDir??null,pid:s.pid??null,killProcess:r.killProcess??null}),ue(n,o));let l=ne(),u=(r.createBrokerEndpoint??b)(l,r.platform),d=e.join(l,`broker.pid`),f=e.join(l,`broker.log`),p=ae({scriptPath:i,cwd:n,endpoint:u,pidFile:d,logFile:f,networkAccess:o,env:r.env??t.env});if(!await ie(u,r.timeoutMs??2e3))return pe({endpoint:u,pidFile:d,logFile:f,sessionDir:l,pid:p.pid??null,killProcess:r.killProcess??null}),null;let m={endpoint:u,pidFile:d,logFile:f,sessionDir:l,pid:p.pid??null,networkAccess:o,version:a,scriptPath:i};return le(n,m,o),m}function pe({endpoint:t=null,pidFile:n,logFile:r,sessionDir:a=null,pid:o=null,killProcess:s=null}){if(Number.isFinite(o)&&s)try{s(o)}catch{}if(n&&i.existsSync(n)&&i.unlinkSync(n),r&&i.existsSync(r)&&i.unlinkSync(r),t)try{let e=x(t);e.kind===`unix`&&i.existsSync(e.path)&&i.unlinkSync(e.path)}catch{}let c=a??(n?e.dirname(n):r?e.dirname(r):null);if(c&&i.existsSync(c))try{i.rmdirSync(c)}catch{}}function me(e,n=[],r={}){let i=s(e,n,{cwd:r.cwd,env:r.env,encoding:`utf8`,input:r.input,maxBuffer:r.maxBuffer,stdio:r.stdio??`pipe`,shell:t.platform===`win32`?t.env.SHELL||!0:!1,windowsHide:!0});return{command:e,args:n,status:i.status??0,signal:i.signal??null,stdout:i.stdout??``,stderr:i.stderr??``,error:i.error??null}}function he(e,t=[`--version`],n={}){let r=me(e,t,n);return r.error&&r.error.code===`ENOENT`?{available:!1,detail:`not found`}:r.error?{available:!1,detail:r.error.message}:r.status===0?{available:!0,detail:r.stdout.trim()||r.stderr.trim()||`ok`}:{available:!1,detail:r.stderr.trim()||r.stdout.trim()||`exit ${r.status}`}}function ge(e){return/not found|no running instance|cannot find|does not exist|no such process/i.test(e)}function _e(e,n={}){if(!Number.isFinite(e))return{attempted:!1,delivered:!1,method:null};let r=e,i=n.platform??t.platform,a=n.runCommandImpl??me,o=n.killImpl??t.kill.bind(t);if(i===`win32`){let e=a(`taskkill`,[`/PID`,String(r),`/T`,`/F`],{cwd:n.cwd,env:n.env});if(!e.error&&e.status===0)return{attempted:!0,delivered:!0,method:`taskkill`,result:e};let t=`${e.stderr}\n${e.stdout}`.trim();if(!e.error&&ge(t))return{attempted:!0,delivered:!1,method:`taskkill`,result:e};if(e.error?.code===`ENOENT`)try{return o(r),{attempted:!0,delivered:!0,method:`kill`}}catch(e){if(e?.code===`ESRCH`)return{attempted:!0,delivered:!1,method:`kill`};throw e}throw e.error?e.error:Error(ve(e))}try{return o(-r,`SIGTERM`),{attempted:!0,delivered:!0,method:`process-group`}}catch(e){if(e?.code!==`ESRCH`)try{return o(r,`SIGTERM`),{attempted:!0,delivered:!0,method:`process`}}catch(e){if(e?.code===`ESRCH`)return{attempted:!0,delivered:!1,method:`process`};throw e}return{attempted:!0,delivered:!1,method:`process-group`}}}function ve(e){let t=[`${e.command} ${e.args.join(` `)}`.trim()];e.signal?t.push(`signal=${e.signal}`):t.push(`exit=${e.status}`);let n=(e.stderr||``).trim(),r=(e.stdout||``).trim();return n?t.push(n):r&&t.push(r),t.join(`: `)}function ye(e){return new Promise(n=>{let r=o(e,t.argv.slice(1),{env:t.env,shell:!1,stdio:`inherit`}),i=()=>r.kill(`SIGINT`),a=()=>r.kill(`SIGTERM`);t.once(`SIGINT`,i),t.once(`SIGTERM`,a);let s=e=>{t.off(`SIGINT`,i),t.off(`SIGTERM`,a),n(e)};r.once(`error`,e=>s({error:e,status:null,signal:null})),r.once(`close`,(e,t)=>s({status:e,signal:t}))})}const be=-32001,xe=`coder/notice`,Se=`coder/appServerExited`,Ce=`broker/recycle`;function we(){let e=me(`codex`,[`--version`]),t=/(\d+\.\d+\.\d+(?:-[\w.]+)?)/.exec(`${e.stdout} ${e.stderr}`);return t?t[1]:`0.144.1`}function Te(){return{title:`Coder`,name:`coder`,version:we()}}const Ee={experimentalApi:!1,requestAttestation:!1,optOutNotificationMethods:[`item/agentMessage/delta`,`item/reasoning/summaryTextDelta`,`item/reasoning/summaryPartAdded`,`item/reasoning/textDelta`]};function De(e,t,n){return n===void 0?{code:e,message:t}:{code:e,message:t,data:n}}function Oe(e,t){let n=Error(e);return n.data=t,t?.code!==void 0&&(n.rpcCode=t.code),n}var ke=class{cwd;options;pending;nextId;stderr;closed;exitError;notificationHandler;serverRequestHandler;noticeHandler;lineBuffer;transport;exitPromise;exitResolved;resolveExit;handleServerRequest;constructor(e,t={}){this.cwd=e,this.options=t,this.pending=new Map,this.nextId=1,this.stderr=``,this.closed=!1,this.exitError=null,this.notificationHandler=null,this.serverRequestHandler=null,this.noticeHandler=null,this.lineBuffer=``,this.transport=`unknown`,this.handleServerRequest=e=>this.defaultHandleServerRequest(e),this.exitPromise=new Promise(e=>{this.resolveExit=e})}setNotificationHandler(e){this.notificationHandler=e}setServerRequestHandler(e){this.serverRequestHandler=e}setNoticeHandler(e){this.noticeHandler=e}request(e,t){if(this.closed)throw Error(`codex app-server client is closed.`);if(this.exitResolved)return Promise.reject(this.exitError??Error(`codex app-server connection closed.`));let n=this.nextId;return this.nextId+=1,new Promise((r,i)=>{this.pending.set(n,{resolve:r,reject:i,method:e}),this.sendMessage({id:n,method:e,params:t})})}notify(e,t={}){this.closed||this.sendMessage({method:e,params:t})}handleChunk(e){this.lineBuffer+=e;let t=this.lineBuffer.indexOf(`
3
+ `);for(;t!==-1;){let e=this.lineBuffer.slice(0,t);this.lineBuffer=this.lineBuffer.slice(t+1),this.handleLine(e),t=this.lineBuffer.indexOf(`
4
+ `)}}handleLine(e){if(!e.trim())return;let t;try{t=JSON.parse(e)}catch(t){this.handleExit(Oe(`Failed to parse codex app-server JSONL: ${t instanceof Error?t.message:String(t)}`,{line:e}));return}if(t.id!==void 0&&t.method){this.handleServerRequest(t);return}if(t.id!==void 0){let e=this.pending.get(t.id);if(!e)return;this.pending.delete(t.id),t.error?e.reject(Oe(t.error.message??`codex app-server ${e.method} failed.`,t.error)):e.resolve(t.result??{});return}if(t.method===`coder/notice`){this.noticeHandler?.(String(t.params?.message??``));return}if(t.method===`coder/appServerExited`){this.handleExit(Oe(String(t.params?.message??`codex app-server exited.`)));return}t.method&&this.notificationHandler&&this.notificationHandler(t)}defaultHandleServerRequest(e){let t=this.serverRequestHandler;if(!t){this.sendMessage({id:e.id,error:De(-32601,`Unsupported server request: ${e.method}`)});return}Promise.resolve().then(()=>t(e.method,e.params??{})).then(t=>{this.sendMessage({id:e.id,result:t??{}})}).catch(t=>{this.sendMessage({id:e.id,error:De(-32e3,t instanceof Error?t.message:String(t))})})}handleExit(e){if(!this.exitResolved){this.exitResolved=!0,this.exitError=e??null;for(let e of this.pending.values())e.reject(this.exitError??Error(`codex app-server connection closed.`));this.pending.clear(),this.resolveExit(void 0)}}sendMessage(e){throw Error(`sendMessage must be implemented by subclasses.`)}},Ae=class extends ke{proc;readline;constructor(e,t={}){super(e,t),this.transport=`direct`}async initialize(){let e=this.options.networkAccess??!1;this.proc=o(`codex`,je(e,this.options.nativeMcp),{cwd:this.cwd,env:this.options.env??t.env,stdio:[`pipe`,`pipe`,`pipe`],shell:t.platform===`win32`?t.env.SHELL||!0:!1,windowsHide:!0});let n=this.proc.stdout,r=this.proc.stderr;if(!n||!r)throw Error(`codex app-server did not expose stdio streams.`);n.setEncoding(`utf8`),r.setEncoding(`utf8`),r.on(`data`,e=>{this.stderr+=e}),this.proc.on(`error`,e=>{this.handleExit(e)}),this.proc.stdin?.on(`error`,()=>{}),this.proc.on(`exit`,(e,t)=>{let n=this.stderr.trim(),r=e===0?null:Oe(`codex app-server exited unexpectedly (${t?`signal ${t}`:`exit ${e}`}).${n?`\n${n}`:``}`);this.handleExit(r)}),this.readline=f.createInterface({input:n}),this.readline.on(`line`,e=>{this.handleLine(e)}),await this.request(`initialize`,{clientInfo:this.options.clientInfo??Te(),capabilities:this.options.capabilities??Ee}),this.notify(`initialized`,{})}async close(){if(this.closed){await this.exitPromise;return}this.closed=!0,this.readline&&this.readline.close(),this.proc&&!this.proc.killed&&(this.proc.stdin?.end(),setTimeout(()=>{if(this.proc&&!this.proc.killed&&this.proc.exitCode===null)if(t.platform===`win32`)try{_e(this.proc.pid)}catch{}else this.proc.kill(`SIGTERM`)},50).unref?.()),await this.exitPromise}sendMessage(e){let t=`${JSON.stringify(e)}\n`,n=this.proc?.stdin;if(!n)throw Error(`codex app-server stdin is not available.`);n.write(t)}};function je(e,t=!1){return[`-c`,`sandbox_workspace_write.network_access=${e}`,`app-server`,...t?[]:[`--disable`,`plugins`,`--disable`,`apps`]]}var Me=class extends ke{endpoint;socket;constructor(e,t={}){super(e,t),this.transport=`broker`,this.endpoint=t.brokerEndpoint}async initialize(){await new Promise((e,t)=>{let n=x(this.endpoint);this.socket=d.createConnection({path:n.path}),this.socket.setEncoding(`utf8`),this.socket.on(`connect`,e),this.socket.on(`data`,e=>{this.handleChunk(e)}),this.socket.on(`error`,e=>{this.exitResolved||t(e),this.handleExit(e)}),this.socket.on(`close`,()=>{this.handleExit(this.exitError)})}),await this.request(`initialize`,{clientInfo:this.options.clientInfo??Te(),capabilities:this.options.capabilities??Ee}),this.notify(`initialized`,{})}async close(){if(this.closed){await this.exitPromise;return}this.closed=!0,this.socket&&this.socket.end(),await this.exitPromise}sendMessage(e){let t=`${JSON.stringify(e)}\n`,n=this.socket;if(!n)throw Error(`codex app-server broker connection is not connected.`);n.write(t)}},Ne=class{static async connect(e,n={}){let r=n.networkAccess??!1,i=null;!n.disableBroker&&!n.nativeMcp&&(i=n.brokerEndpoint??n.env?.CODER_APP_SERVER_ENDPOINT??t.env.CODER_APP_SERVER_ENDPOINT??null,!i&&n.reuseExistingBroker&&(i=ce(e,r)?.endpoint??null),!i&&!n.reuseExistingBroker&&(i=(await fe(e,{env:n.env,networkAccess:r}))?.endpoint??null));let a=i?new Me(e,{...n,brokerEndpoint:i}):new Ae(e,n);return await a.initialize(),a}};async function Pe(e,t,n){for(let r of[!1,!0]){if(!ce(e,r))continue;let i=null;try{return i=await Ne.connect(e,{networkAccess:r,reuseExistingBroker:!0}),await i.request(t,{threadId:n}),!0}catch{}finally{await i?.close().catch(()=>{})}}return!1}function Fe(e){try{let t=o(`codex`,e,{detached:!0,stdio:`ignore`});t.on(`error`,()=>{}),t.unref()}catch{}}async function Ie(e,t){await Pe(e,`thread/archive`,t)||Fe([`archive`,t])}function Le(t){let n=e.join(process.env.CODEX_HOME||e.join(u.homedir(),`.codex`),`archived_sessions`);try{return i.readdirSync(n).some(e=>e.endsWith(`-${t}.jsonl`))}catch{return!1}}function Re(e){return new Promise(t=>{try{let n=o(`codex`,[`unarchive`,e],{stdio:`ignore`});n.on(`error`,()=>t(!1)),n.on(`close`,e=>t(e===0))}catch{t(!1)}})}async function ze(e,t){return await Pe(e,`thread/delete`,t)?!0:s(`codex`,[`delete`,`--force`,t],{encoding:`utf8`}).status===0}const Be=[`completed`,`failed`,`cancelled`],Ve=[`queued`,`running`],He=/^[a-z0-9][a-z0-9_-]*$/i;function Ue(e){return He.test(e)}function We(e,t){if(!Ue(e))throw Error(`Invalid ${t} "${e}".`)}function D(...t){return e.join(e.resolve(process.env.CODER_HOME||e.join(u.homedir(),`.coder`)),...t)}function O(...t){let n=u.homedir(),r=u.platform(),i=process.env.CODER_CACHE_HOME||(r===`darwin`?e.join(n,`Library`,`Caches`,`wular-coder`):r===`win32`?e.join(process.env.LOCALAPPDATA||e.join(n,`AppData`,`Local`),`wular-coder`,`cache`):e.join(process.env.XDG_CACHE_HOME||e.join(n,`.cache`),`wular-coder`));return e.join(e.resolve(i),...t)}function Ge(){return D()}function Ke(t){return t?e.join(t,`flows`):D(`state`,`global`,`flows`)}function qe(){return O(`flows-archived`)}function Je(){return O(`usage.json`)}function Ye(e=Je()){return`${e}.${process.pid}.${l()}.tmp`}function Xe(){return O(`runner`,`usage.json`)}function k(e){try{return a(`git`,[`rev-parse`,`--show-toplevel`],{cwd:e,encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim()}catch{return e}}const Ze=`global`;function A(e){return D(`state`,Ze)}function Qe(){let t=D(`state`),n=[];try{n=i.readdirSync(t,{withFileTypes:!0})}catch{}return n.filter(e=>e.isDirectory()&&e.name!==Ze).map(n=>e.join(t,n.name))}function j(t){return e.join(A(t),`jobs`)}const $e=18e5,et=(e,t=Date.now())=>t-e>$e;function M(e){return O(`archive`)}function N(t,n){We(n,`task id`);let r=e.join(j(t),n);if(i.existsSync(e.join(r,`job.json`)))return r;let a=e.join(M(t),n);if(i.existsSync(e.join(a,`job.json`)))return a;for(let t of Qe()){let r=e.join(t,`jobs`,n);if(i.existsSync(e.join(r,`job.json`)))return r}return r}function tt(e,t,n={}){return t.archived&&(n.auto||!t.autoArchived)?t:t.archived?P(e,t.id,{autoArchived:void 0}):P(e,t.id,{archived:!0,archivedAt:new Date().toISOString(),...n.auto?{autoArchived:!0}:{}},{touch:!n.auto})}function nt(t,n,r={}){if(Ve.includes(n.status))return tt(t,n,r);let i=N(t,n.id),a=e.join(M(t),n.id);i!==a&&g(i,a);let o=tt(t,n,r);return n.engine!==`claude`&&n.threadId&&Ie(t,n.threadId),o}function rt(e){return!!e.archived&&(e.resumedAt??``)>(e.archivedAt??``)}function it(t,n){let r=N(t,n.id),i=e.join(j(t),n.id);return r!==i&&g(r,i),P(t,n.id,{archived:void 0,archivedAt:void 0,autoArchived:void 0})}function at(){let e=Math.random().toString(36).slice(2,8);return`task-${Date.now().toString(36)}-${e}`}function P(t,n,r,a={}){let o=N(t,n);i.mkdirSync(o,{recursive:!0});let s=e.join(o,`job.json`),c=F(t,n)??{id:n,createdAt:new Date().toISOString(),status:`queued`},l={...c,...r,updatedAt:a.touch===!1?c.updatedAt:new Date().toISOString()};return i.writeFileSync(s,`${JSON.stringify(l,null,2)}\n`,`utf8`),l}function ot(e){return e.agent&&(e.engine=e.agent),delete e.agent,e}function F(t,n){if(!Ue(n))return null;let r=e.join(N(t,n),`job.json`);if(!i.existsSync(r))return null;try{return ot(JSON.parse(i.readFileSync(r,`utf8`)))}catch{return null}}function st(e,t){let n=N(e,t);return i.existsSync(n)?(i.rmSync(n,{recursive:!0,force:!0}),!0):!1}function ct(e){if(!e)return!1;try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function lt(e){try{let t=a(`ps`,[`-o`,`lstart=`,`-p`,String(e)],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`],env:{...process.env,TZ:Intl.DateTimeFormat().resolvedOptions().timeZone}}).trim(),n=t?Date.parse(t):NaN;return Number.isFinite(n)?n:null}catch{return null}}function ut(e,t,n){if(!ct(e))return!1;let r=n(e),i=Date.parse(t.resumedAt??t.createdAt??``);return r===null||!Number.isFinite(i)||r<=i+6e4}function I(e,t,n=lt){if(t.status!==`running`&&t.status!==`queued`)return t;let r;if(t.pid)r=!ut(t.pid,t,n);else{let e=Date.parse(t.updatedAt??t.createdAt??``);r=Number.isFinite(e)&&Date.now()-e>6e4}return r?P(e,t.id,{status:`failed`,error:`worker exited without finishing`,completedAt:new Date().toISOString()}):t}function dt(t,n){let r=[];for(let a of t){let t=[];try{t=i.readdirSync(a)}catch{continue}for(let o of t){if(n.has(o))continue;let t=e.join(a,o,`job.json`);try{let e=ot(JSON.parse(i.readFileSync(t,`utf8`)));n.add(o),r.push(e)}catch{}}}return r}async function*ft(t){let n=await i.promises.readdir(e.dirname(A(t)),{withFileTypes:!0}).catch(()=>[]),r=[{dir:j(t),archived:!1},{dir:M(t),archived:!0},...n.filter(e=>e.isDirectory()&&e.name!==Ze).map(n=>({dir:e.join(e.dirname(A(t)),n.name,`jobs`),archived:!1}))];for(let{dir:t,archived:n}of r){let r=await i.promises.readdir(t,{withFileTypes:!0}).catch(()=>[]);for(let i of r)i.isDirectory()&&Ue(i.name)&&(yield{id:i.name,dir:e.join(t,i.name),archived:n})}}const pt=(e,t)=>String(t.updatedAt??``).localeCompare(String(e.updatedAt??``));function mt(){let e=new Map;return t=>(e.has(t)||e.set(t,lt(t)),e.get(t))}function ht(t){let n=mt(),r=[j(t),...Qe().map(t=>e.join(t,`jobs`))],i=[];for(let e of dt(r,new Set)){let r=I(t,e,n);r.archived&&!rt(r)?nt(t,r,{auto:!0}):i.push(r.archived?it(t,r):r)}return i.sort(pt)}function gt(e,t,n=!1){if(t.status===`queued`)return!0;let r=t.generation??0;if(n&&!r)return!1;let i=F(e,t.task.id);return i?r?t.startedAt===void 0||(Date.parse(i.resumedAt??``)||0)<t.startedAt:!1:!0}function _t(t){let n=m(e.join(A(t),`runner`,`task.json`))??{},r=e=>e===void 0?void 0:new Date(e).toISOString();return Object.values(n).map(({value:e})=>e).filter(e=>gt(t,e)).map(e=>{let t=e.status===`waiting`?`running`:e.status,n=e.archivedAt??(Be.includes(t)&&et(e.finishedAt??e.updatedAt)?e.finishedAt??e.updatedAt:void 0);return{id:e.task.id,status:t,...e.task.name?{name:e.task.name}:{},...e.task.prompt?{prompt:e.task.prompt}:{},...e.task.cwd?{cwd:e.task.cwd}:{},...e.task.agent?{agentId:e.task.agent}:{},source:e.task.source??`dashboard`,...e.error?{error:e.error}:{},createdAt:r(e.createdAt),updatedAt:r(e.updatedAt),...e.finishedAt?{completedAt:r(e.finishedAt)}:{},...n===void 0?{}:{archived:!0,archivedAt:r(n)}}})}function vt(t,n){let r=mt(),i=n?.migrate??!0,a=new Set,o=[];for(let e of dt([M(t)],a))rt(e)?i&&it(t,I(t,e,r)):o.push(I(t,e,r));let s=[j(t),...Qe().map(t=>e.join(t,`jobs`))];for(let e of dt(s,a))if(e.archived&&!rt(e)){let n=I(t,e,r);o.push(i?nt(t,n,{auto:!0}):n)}return o.sort(pt)}function yt(e,t){let n=vt(e),r=[...ht(e),...n].sort(pt);if(!t)return r[0]??null;let i=r.find(e=>e.id===t);if(i)return i;let a=r.filter(e=>e.id.startsWith(t));if(a.length===1)return a[0];if(a.length>1)throw Error(`Task reference "${t}" is ambiguous. Use a longer id.`);return null}function bt(t,n){let r=N(t,n);try{i.mkdirSync(r,{recursive:!0}),i.writeFileSync(e.join(r,`heartbeat`),``,`utf8`)}catch{}}function xt(t,n){let r=N(t,n.id),a=Date.parse(n.updatedAt??``)||0;for(let t of[`log.jsonl`,`heartbeat`])try{a=Math.max(a,i.statSync(e.join(r,t)).mtimeMs)}catch{}return a?new Date(a).toISOString():void 0}async function St(e,t,n=400){let r=t;for(;!Be.includes(r.status);)await new Promise(e=>setTimeout(e,n)),r=I(e,F(e,r.id)??r);return r}const Ct=`steer-queue.jsonl`;function wt(t,n,r){let a=N(t,n);i.mkdirSync(a,{recursive:!0}),i.appendFileSync(e.join(a,Ct),`${JSON.stringify({at:new Date().toISOString(),text:r})}\n`,`utf8`)}function Tt(t,n){let r=N(t,n),a=e.join(r,Ct),o=e.join(r,`steer-claim-${process.pid}-${Date.now()}.tmp`);try{i.renameSync(a,o)}catch{return[]}try{return i.readFileSync(o,`utf8`).split(/\r?\n/).filter(Boolean).map(e=>{try{return String(JSON.parse(e).text??``)}catch{return``}}).filter(Boolean)}finally{try{i.unlinkSync(o)}catch{}}}function Et(t,n,r){let a=N(t,n);i.mkdirSync(a,{recursive:!0}),i.appendFileSync(e.join(a,`log.jsonl`),`${JSON.stringify({at:new Date().toISOString(),...r})}\n`,`utf8`)}function Dt(t,n){let r=e.join(N(t,n),`results.jsonl`);return i.existsSync(r)?i.readFileSync(r,`utf8`).split(/\r?\n/).filter(Boolean).flatMap(e=>{try{return[JSON.parse(e)]}catch{return[]}}):[]}function Ot(e,t){if(t<=0)return[];let n=0;for(let r=e.length-1;r>=0;--r)if(e[r]?.kind!==`usage`&&(n+=1)===t)return e.slice(r);return e}function kt(t,n,r=40){let a=e.join(N(t,n),`log.jsonl`);return i.existsSync(a)?i.readFileSync(a,`utf8`).split(/\r?\n/).filter(Boolean).slice(-r).map(e=>{try{return JSON.parse(e)}catch{return{message:e}}}):[]}function At(e){return[e.engine??`-`,e.model,e.model?e.effort:null].filter(Boolean).join(`/`)}function jt(e){let t=Date.parse(e??``);return Number.isFinite(t)?Math.max(0,Date.now()-t):0}const Mt=6e5;var L=class extends Error{code;hint;taskId;payload;approval;result;runId;status;constructor(e,t,n={}){super(t),this.name=`CoderError`,this.code=e,Object.assign(this,n)}};const R={chain:[`codex`,`claude`],engines:{codex:{model:`gpt-6.1-sol`,effort:`high`,permissions:`auto`},claude:{model:`opus`,effort:`medium`,permissions:`auto`}},models:{},approvals:{escalationTimeoutMs:12e4,allowedNetworkHosts:[]}},Nt=e=>e===`failed`?0:e===`completed`?3:e===`cancelled`?2:1,Pt=(e,t)=>e.rank-t.rank||t.createdAt-e.createdAt||(t.id<e.id?-1:+(t.id>e.id)),z={luna:`gpt-6-luna`,sol:`gpt-6.1-sol`,astra:`gpt-6-astra`},Ft=new Set([`low`,`medium`,`high`]),B={sonnet:`sonnet`,opus:`opus`,fable:`fable`},V=new Set([`low`,`medium`,`high`]),It={"read-only":{sandbox:`read-only`,approvalPolicy:`never`,approvalMode:null},"workspace-write":{sandbox:`workspace-write`,approvalPolicy:`never`,approvalMode:null},auto:{sandbox:`workspace-write`,approvalPolicy:`on-request`,approvalMode:`auto`}},Lt={"read-only":[`--permission-mode`,`dontAsk`,`--disallowedTools`,`Edit`,`Write`,`NotebookEdit`],"workspace-write":[`--permission-mode`,`acceptEdits`],auto:[`--permission-mode`,`auto`]},Rt=[`--permission-mode`,`dontAsk`,`--disallowedTools`,`Edit`,`Write`,`NotebookEdit`,`Bash`,`WebFetch`,`WebSearch`,`Task`],zt=/failIfUnavailable|sandbox\b[^.\n]*?(?:failed|could ?n[o']t|cannot|unavailable|not available|not supported)/i,Bt=new Set([`localhost`,`127.0.0.1`,`::1`,`[::1]`]);function Vt(e){return e.flatMap(e=>d.isIPv6(e)?[`[${e}]`]:e.startsWith(`[`)||e.includes(`:`)||d.isIP(e)?[e]:[e,`*.${e}`])}function Ht(e,t,n=[],r=[],i=[]){let a=e===`read-only`?r:[...r,...i],o=a.length?{permissions:{additionalDirectories:a}}:{};return JSON.stringify(e===`read-only`?{...o,sandbox:{enabled:!0,failIfUnavailable:!0,autoAllowBashIfSandboxed:!0,filesystem:{denyWrite:[t,...r],...i.length?{allowWrite:i}:{}}}}:{...o,sandbox:{enabled:!0,autoAllowBashIfSandboxed:!0,...e===`auto`&&n.length?{network:{allowedDomains:Vt(n),...n.some(e=>Bt.has(e))?{allowLocalBinding:!0}:{}}}:{}}})}const Ut=r.enum([`codex`,`claude`]),Wt=r.enum([`codex`,`claude`,`custom`]),Gt=r.enum([`low`,`medium`,`high`]),Kt=r.enum([`read-only`,`workspace-write`,`auto`]),qt=r.partial(r.strictObject({model:r.string().check(r.minLength(1)),effort:Gt,permissions:Kt})),Jt=r.partial(r.strictObject({model:r.string().check(r.minLength(1)),effort:Gt,permissions:Kt,network:r.boolean()})),Yt=r.strictObject({baseUrl:r.url(),model:r.string().check(r.minLength(1)),envKey:r.optional(r.string().check(r.minLength(1))),wireApi:r.optional(r.enum([`chat`,`responses`])),disabled:r.optional(r.boolean())}),Xt=r.strictObject({provider:Ut,model:r.string().check(r.minLength(1)),effort:r.optional(Gt),disabled:r.optional(r.boolean())}),Zt=r.strictObject({disabled:r.boolean()}),Qt=r.union([Yt,Xt,Zt]),$t=r.strictObject({escalationTimeoutMs:r.number().check(r.positive()),allowedNetworkHosts:r.array(r.string())}),en=r.enum([`observe`,`comment`,`write`]),tn=r.string().check(r.regex(/^[a-z0-9][a-z0-9_-]*$/i,`agent or flow name`)),nn=r.strictObject({allowedTools:r.optional(r.union([en,r.array(r.string())])),allowedEvents:r.optional(r.array(r.string()))}),rn=r.union([r.boolean(),r.strictObject({engine:r.optional(r.string()),model:r.optional(r.string()),effort:r.optional(Gt),permissions:r.optional(Kt),runner:r.optional(r.enum([`local`,`local-docker`,`vercel-sandbox`,`github-actions`])),integrations:r.optional(r.record(r.string(),nn))})]),an=r.strictObject({command:r.optional(r.string().check(r.minLength(1))),args:r.optional(r.array(r.string())),env:r.optional(r.record(r.string(),r.string())),url:r.optional(r.string().check(r.minLength(1))),type:r.optional(r.enum([`stdio`,`http`,`sse`])),headers:r.optional(r.record(r.string(),r.string())),tools:r.optional(r.array(r.string())),description:r.optional(r.string())}).check(r.refine(e=>!!e.command!=!!e.url,`one of command or url`)),on=r.strictObject({chain:r.array(Wt).check(r.minLength(1)),engines:r.partial(r.strictObject({codex:Jt,claude:qt,custom:qt})),models:r.optional(r.record(r.string().check(r.regex(/^[a-z0-9][a-z0-9./_-]*$/i,`model name`)),Qt)),agents:r.optional(r.record(tn,rn)),mcp:r.optional(r.record(tn,an)),approvals:$t}),sn=r.partial(r.extend(on,{approvals:r.partial($t)}));function H(e){return`baseUrl`in e}function cn(e){return`provider`in e}function ln(e,t){return t??e===`auto`}const un=/^(?!-)[a-z0-9-]{1,63}(?<!-)(?:\.(?!-)[a-z0-9-]{1,63}(?<!-))*(?::\d{1,5})?$/i;function dn(e){if(d.isIP(e))return!0;let t=/^\[([^\]]+)\](?::\d{1,5})?$/.exec(e);return t?d.isIPv6(t[1]):e.length<=253&&un.test(e)}function fn(e,t){delete e.models?.[t];for(let n of Object.values(e.engines??{}))n?.model===t&&delete n.model}function U(e){let t=Object.keys(e?.agents??{}).filter(e=>[`codex`,`claude`,`custom`].includes(e));if(t.length)return t.map(e=>`agents.${e}: engine defaults moved to engines.${e}`);let n=sn.safeParse(e);if(!n.success)return n.error.issues.map(e=>`${e.path.join(`.`)||`config`}: ${e.message}`);let r=W(R,n.data),i=[];for(let[e,t]of(n.data.approvals?.allowedNetworkHosts??[]).entries())dn(t)||i.push(`approvals.allowedNetworkHosts.${e}: "${t}" is not a host name or IP address`);for(let[e,t]of Object.entries(n.data.models??{})){if(e===`codex`||e===`claude`||e===`custom`){i.push(`models.${e}: reserved engine name`);continue}if(cn(t)){let n=r.models?.[t.model];n&&!H(n)&&i.push(`models.${e}: alias target "${t.model}" is itself a config entry`)}}return i}function pn(e){if(!i.existsSync(e))return null;try{return JSON.parse(i.readFileSync(e,`utf8`))}catch(t){let n=t instanceof Error?t.message:String(t);throw Error(`Invalid JSON in ${e}: ${n}`)}}function mn(e){return W(R,e)}function W(e,t){if(!t||typeof t!=`object`||Array.isArray(t))return t??e;let n={...e},r=e;for(let[e,i]of Object.entries(t))n[e]=i&&typeof i==`object`&&!Array.isArray(i)&&r?.[e]&&typeof r[e]==`object`?W(r[e],i):i;return n}function G(){return D(`config.json`)}const hn=[`coder.config.json`,`coder.json`];function K(t){let n=e.join(t,`.coder`,`config.json`);if(i.existsSync(n))return n;for(let r of hn){let a=e.join(t,r);if(i.existsSync(a)){i.mkdirSync(e.dirname(n),{recursive:!0}),i.renameSync(a,n),process.stderr.write(`coder: moved ${r} to .coder/config.json\n`);break}}return n}const gn=`CODER_WORKSPACE_CONFIG`;function _n(e,t){let n=t.approvals?.allowedNetworkHosts?.filter(t=>e.approvals.allowedNetworkHosts.includes(t)),r=Object.fromEntries(Object.entries(t.engines??{}).map(([e,t])=>[e,{...t?.model?{model:t.model}:{},...t?.effort?{effort:t.effort}:{}}])),i=Object.entries(t.models??{}).filter(([,e])=>e.disabled===!0);return{...t.chain?{chain:t.chain.filter(t=>e.chain.includes(t))}:{},engines:r,models:Object.fromEntries(i.map(([e])=>[e,{disabled:!0}])),...n?{approvals:{...e.approvals,allowedNetworkHosts:n}}:{}}}function q(e){let t=k(e),n=process.env[gn],r=[[G(),pn(G())],...n?[[`the workspace config`,JSON.parse(n)]]:[]],i=K(t);r.push([i,pn(i)]);let a=R;for(let[e,t]of r){if(!t)continue;let r=U(t);if(r.length)throw Error(`Invalid config in ${e}:\n ${r.join(`
5
+ `)}`);a=W(a,n&&e===i?_n(a,t):t)}let o=U(a);if(o.length)throw Error(`Invalid merged config:\n ${o.join(`
6
+ `)}`);return a}function vn(e){return e.replace(/\/+$/,``).replace(/\/(chat\/completions|completions|responses)$/,``)}function yn(e,t,n){let r=[K(k(e)),G()];for(let e of r){let r;try{r=pn(e)}catch{continue}if(r?.models?.[t])return Object.assign(r.models[t],n),!U(r).length&&(i.writeFileSync(e,`${JSON.stringify(r,null,2)}\n`,`utf8`),!0)}return!1}function bn(e){return/\/(chat\/completions|completions|responses)\/*$/.test(e)}function xn(e,t){let n=vn(e);return bn(e)||/\/v\d+(alpha|beta)?$/.test(n)?[`${n}/${t}`]:[`${n}/${t}`,`${n}/v1/${t}`]}function Sn(e,t,n){let r=t?e.models?.[t]:void 0;if(!t||!r||!H(r))return null;let i=`coder-${t}`;return{model:r.model,modelProvider:i,configOverrides:{[`model_providers.${i}`]:{name:t,base_url:n?.url??vn(r.baseUrl),...r.envKey&&!n?{env_key:r.envKey}:{},wire_api:`responses`}}}}function Cn(e){return e?z[e]??e:null}function wn(e){return e in z||e in B}function Tn(e,t){return!!(t&&e.models?.[t]?.disabled)}function En(e,t){if(Tn(e,t))throw Error(`model "${t}" is disabled in config`)}function Dn(e,t){if(!e)return null;let n=String(e).trim().split(`:`).map(e=>e.trim());if(!n.length||n.length>3||n.some(e=>!e))throw Error(`Invalid engine spec "${e}".`);let r=null,i=null,a=null,o=e=>Ft.has(e)||V.has(e);for(let t of n)if(t===`codex`||t===`claude`||t===`custom`){if(r)throw Error(`Invalid engine spec "${e}".`);r=t}else if(o(t)&&!a)a=t;else if(!i)i=t;else throw Error(`Invalid engine spec "${e}".`);let s=i?t.models?.[i]:void 0;if(s&&cn(s)){if(s.disabled)throw Error(`model "${i}" is disabled in config`);if(r&&r!==s.provider)throw Error(`Alias "${i}" runs on ${s.provider}, not ${r}.`);r=s.provider,a=a??s.effort??null,i=s.model}r||=i&&i in B?`claude`:i&&s&&H(s)?`custom`:`codex`;let c=t.engines[r]??{},l=i??c.model??null;return En(t,l),{engine:r,model:l,effort:a??c.effort??null}}function On(t){let n=G();return i.mkdirSync(e.dirname(n),{recursive:!0}),i.writeFileSync(n,`${JSON.stringify(t,null,2)}\n`,`utf8`),n}function kn(e,t){return t.split(`.`).reduce((e,t)=>e?.[t],e)}function An(e,t){return t?K(k(e)):G()}function jn(e,t){let n=q(e);return t?kn(n,t):n}function Mn(e,t,n,r={}){let i=An(e,r.workspace);Nn(i,e=>{let i=t.split(`.`),a=i.at(-1),o=e;for(let e of i.slice(0,-1))(typeof o[e]!=`object`||o[e]===null)&&(o[e]={}),o=o[e];r.unset?delete o[a]:o[a]=n});let a=kn(q(e),t)??null;return{file:i,key:t,...r.unset?{unset:!0}:{value:n},effective:a}}function Nn(t,n){let r=i.existsSync(t)?JSON.parse(i.readFileSync(t,`utf8`)):{};n(r),r.models&&Object.keys(r.models).length===0&&delete r.models;let a=U(r);if(a.length)throw Error(`Refusing to write invalid config:\n ${a.join(`
7
+ `)}`);i.mkdirSync(e.dirname(t),{recursive:!0}),i.writeFileSync(t,`${JSON.stringify(r,null,2)}\n`,`utf8`)}function Pn(e,t){return t?G():K(k(e))}function Fn(e,t){let n={};for(let r of(e??``).split(`,`).map(e=>e.trim()).filter(Boolean)){let e=r.indexOf(`=`);if(e<1)throw Error(`Invalid ${t} "${r}": use KEY=VALUE (values may hold \${VAR}).`);n[r.slice(0,e)]=r.slice(e+1)}return n}function In(e,t,n,r){let i=Pn(e,r);return Nn(i,e=>{e.mcp={...e.mcp,[t]:n}}),{name:t,file:i}}function Ln(e,t,n={}){let[r,...i]=n.command??[];if(!t)throw Error(`Usage: coder mcp add <name> [--tools a,b] [--user] (--url <url> [--header K=V] | -- <command> [args...])`);if(!r&&!n.url)throw Error("Give a remote --url, or a command after `--`.");if(r&&n.url)throw Error(`Use either --url or a command, not both.`);let a=n.tools?{tools:n.tools.split(`,`).map(e=>e.trim()).filter(Boolean)}:{},o=Fn(n.env,`--env`),s=Fn(n.header,`--header`);return In(e,t,n.url?{url:n.url,...n.transport?{type:n.transport}:{},...Object.keys(s).length?{headers:s}:{},...a}:{command:r,...i.length?{args:i}:{},...Object.keys(o).length?{env:o}:{},...a},n.user)}function Rn(e,t,n,r={}){if(!t||!n)throw Error(`Usage: coder mcp add-json <name> '<json entry>' [--user]`);let i=n;if(typeof n==`string`)try{i=JSON.parse(n)}catch(e){throw Error(`Invalid JSON: ${e instanceof Error?e.message:String(e)}`)}if(!i||typeof i!=`object`||Array.isArray(i))throw Error(`The entry must be a JSON object.`);return In(e,t,i,r.user)}function zn(e){return q(e).mcp??{}}function Bn(e,t,n={}){if(!t)throw Error(`Usage: coder mcp rm <name> [--user]`);let r=Pn(e,n.user);return Nn(r,e=>{if(!e.mcp?.[t])throw Error(`No MCP server "${t}" in ${r}.`);delete e.mcp[t],Object.keys(e.mcp).length||delete e.mcp}),{name:t,file:r}}const Vn=/access token could not be refreshed/i,Hn=/model is not supported|Codex cannot run model/i;function Un(e){return e instanceof Error?e.message:String(e??``)}function J(e){return Vn.test(e??``)}function Wn(e){return Hn.test(e??``)}function Gn(e,t){return!Wn(e)||/Codex cannot run model/.test(e??``)?null:`Codex cannot run model ${/'([^']+)' model/.exec(e??``)?.[1]??t??`this model`} on the signed-in account. Run \`codex login\` with an account that has it, or pick another alias (coder model list).`}function Kn(t=process.env){return e.join(t.CODEX_HOME||e.join(u.homedir(),`.codex`),`auth.json`)}function qn(e){try{let t=JSON.parse(Buffer.from(String(e).split(`.`)[1]??``,`base64url`).toString(`utf8`));return String(t.sub??t.email??``)}catch{return``}}function Jn(e=process.env,t){let n=Kn(e),r;try{r=i.statSync(n).mtimeMs}catch{return``}if(t?.file===n&&t.mtimeMs===r)return t.fingerprint??``;try{let e=JSON.parse(i.readFileSync(n,`utf8`)),a=e.OPENAI_API_KEY?c(`sha256`).update(String(e.OPENAI_API_KEY)).digest(`hex`):``,o=[e.auth_mode??``,e.tokens?.account_id??``,qn(e.tokens?.id_token),a].join(`|`);return t&&Object.assign(t,{file:n,mtimeMs:r,fingerprint:o}),o}catch{return t?.file===n?t.fingerprint??``:``}}const Yn=`CODER_MAILBOX`,Xn=/^([a-f0-9-]{36})\.(?:req|applying)\.json$/;function Zn(e){if(!e)return l();if(!e.task||!Number.isInteger(e.generation)||e.generation<0||!Number.isInteger(e.seq)||e.seq<0)throw Error(`Invalid command key`);let t=c(`sha256`).update(JSON.stringify([e.task,e.generation,e.seq])).digest(`hex`).slice(0,32);return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`}const Qn=[`hint`,`taskId`,`payload`,`approval`,`result`,`runId`,`status`];function $n(e=t.env){return e.CODER_MAILBOX||void 0}function er(e,t){let n=`${e}.${l()}.tmp`;i.writeFileSync(n,JSON.stringify(t),{encoding:`utf8`,flag:`wx`}),i.renameSync(n,e)}async function tr(t,n,r={}){let a=r.dir??$n();if(!a)throw Error(`No mailbox: not inside an agent task.`);let o=r.id??l(),s=e.join(a,`${o}.res.json`);i.existsSync(s)||er(e.join(a,`${o}.req.json`),{kind:t,payload:n});let c=Date.now();for(;!i.existsSync(s);){if(r.timeoutMs&&Date.now()-c>=r.timeoutMs)throw Error(`Worker control timed out`);await new Promise(e=>setTimeout(e,100))}let{result:u,error:d}=JSON.parse(i.readFileSync(s,`utf8`));if(r.keepReply||i.rmSync(s,{force:!0}),d){let{code:e,message:t,...n}=d;throw new L(e,t,n)}return u}function nr(t,n){i.mkdirSync(t,{recursive:!0});let r=new Set,a=async(a,o)=>{let s;try{let r=e.join(t,a);if(!i.lstatSync(r).isFile())throw Error(`mailbox request is not a regular file`);let{kind:c,payload:l}=JSON.parse(i.readFileSync(r,`utf8`)),u=e.join(t,`${o}.applying.json`);i.existsSync(u)||er(u,{kind:c,payload:l});let d=Object.hasOwn(n,c)?n[c]:void 0;if(!d)throw Error(`unknown mailbox request "${c}"`);s={result:await d(l??{})??null}}catch(e){let t=e instanceof L?e:void 0;s={error:{code:t?.code??`invalid-option`,message:e instanceof Error?e.message:String(e),...Object.fromEntries(Qn.flatMap(e=>t?.[e]===void 0?[]:[[e,t[e]]]))}}}try{er(e.join(t,`${o}.res.json`),s),i.rmSync(e.join(t,`${o}.req.json`),{force:!0}),i.rmSync(e.join(t,`${o}.applying.json`),{force:!0}),r.delete(o)}catch{}},o=setInterval(()=>{let n=[];try{n=i.readdirSync(t)}catch{return}for(let o of n){let n=Xn.exec(o)?.[1];if(n){if(i.existsSync(e.join(t,`${n}.res.json`))){i.rmSync(e.join(t,o),{force:!0});continue}r.has(n)||(r.add(n),a(o,n))}}},100);return()=>clearInterval(o)}function rr(t,n){return n.agentId?e.join(N(t,n.id),`mailbox`):null}function ir(e,t){let n=`${e}.${process.pid}.${l()}.tmp`;i.writeFileSync(n,`${JSON.stringify(t)}\n`,`utf8`),i.renameSync(n,e)}function ar(e){let t=e instanceof Error?e.message:String(e);return/no active turn|active turn.*(?:ended|completed)|turn.*(?:already )?(?:ended|completed)|turn.*not active/i.test(t)}function Y(e,t,n){return Object.assign(Error(e),{retryable:t,...n===void 0?{}:{rpcCode:n}})}function or(e,t,n,r){if(!e||e.id!==t||e.method!==`turn/steer`&&e.method!==`turn/interrupt`)throw Y(`Invalid Codex control request.`,!1);let i=e.params;if(!i||typeof i!=`object`||i.threadId!==n)throw Y(`Codex control request does not match its owning thread.`,!1);if(e.method===`turn/interrupt`){if(i.turnId!==r)throw Y(`Codex turn/interrupt request does not match its owning active turn.`,!1);return{method:e.method,params:i}}if(i.expectedTurnId!==r)throw Y(`Codex turn/steer request does not match its owning active turn.`,!1);let a=i.input;if(!Array.isArray(a)||a.length!==1||a[0]?.type!==`text`||typeof a[0]?.text!=`string`||!a[0].text.trim())throw Y(`Invalid Codex turn/steer input schema.`,!1);return{method:e.method,params:i}}async function sr(t,{threadId:n,turnId:r}){let a=i.mkdtempSync(e.join(u.tmpdir(),`coder-codex-control-`)),o=`file:${a}`,s=new Set,c=new Set,l=!1,d=!1,f=(o=!1)=>{if(!(l&&!o||d)){d=!0;try{for(let o of i.readdirSync(a).filter(e=>e.endsWith(`.request.json`))){let u=o.slice(0,-13),d=e.join(a,o),f=e.join(a,`${u}.response.json`);if(i.existsSync(f)){i.unlinkSync(d);continue}if(c.has(u))continue;let p=`${d}.${process.pid}.processing`;try{i.renameSync(d,p)}catch{continue}c.add(u);let m=(async()=>{let e;try{if(l)throw Y(`Codex owner endpoint is shutting down.`,!0);let a=or(JSON.parse(i.readFileSync(p,`utf8`)),u,n,r);try{let n=await t.request(a.method,a.params);e={id:u,result:n}}catch(t){let n=t;e={id:u,error:{message:t instanceof Error?t.message:String(t),retryable:ar(t),...n.rpcCode===void 0?{}:{rpcCode:n.rpcCode}}}}}catch(t){let n=t;e={id:u,error:{message:n.message,retryable:n.retryable===!0,...n.rpcCode===void 0?{}:{rpcCode:n.rpcCode}}}}try{ir(f,e)}finally{c.delete(u);try{i.unlinkSync(p)}catch{}}})();s.add(m),m.then(()=>s.delete(m),()=>s.delete(m))}}catch{}finally{d=!1}}},p=setInterval(f,10);return p.unref?.(),{endpoint:o,async close(){l||(l=!0,clearInterval(p),f(!0),await Promise.allSettled([...s]),await new Promise(e=>setTimeout(e,50)),i.rmSync(a,{recursive:!0,force:!0}))}}}function cr(t){if(t?.startsWith(`file:`)&&t.length>5){let n=e.resolve(t.slice(5)),r=e.resolve(u.tmpdir());e.dirname(n)===r&&e.basename(n).startsWith(`coder-codex-control-`)&&i.rmSync(n,{recursive:!0,force:!0})}}async function lr(t,n,r,a=3e3,o){if(!t)return{ok:!1,retryable:!0,detail:`Codex owner endpoint is not ready.`};if(!t.startsWith(`file:`)||t.length===5)return{ok:!1,retryable:!1,detail:`Unsupported Codex control endpoint: ${t}`};let s=t.slice(5);if(!i.existsSync(s))return{ok:!1,retryable:!0,detail:`Codex owner endpoint is no longer available.`};let c=Zn(o),l=e.join(s,`${c}.request.json`),u=e.join(s,`${c}.response.json`);try{i.existsSync(u)||ir(l,{id:c,method:n,params:r,command:o})}catch(e){return{ok:!1,retryable:e.code===`ENOENT`,detail:e instanceof Error?e.message:String(e)}}let d=Date.now();for(;Date.now()-d<a;){try{let e=JSON.parse(i.readFileSync(u,`utf8`));try{(!o||e?.error?.retryable)&&i.unlinkSync(u)}catch{}return e?.id===c?e?.error?{ok:!1,retryable:e.error.retryable===!0,detail:String(e.error.message??`Malformed Codex owner error response.`)}:`result`in e?{ok:!0,retryable:!1,result:e.result,detail:`Codex owner accepted control.`}:{ok:!1,retryable:!1,detail:`Malformed Codex owner response.`}:{ok:!1,retryable:!1,detail:`Malformed Codex owner response id.`}}catch(e){if(e.code!==`ENOENT`)return{ok:!1,retryable:!1,detail:`Invalid Codex owner response: ${e instanceof Error?e.message:String(e)}`};if(!i.existsSync(s))return{ok:!1,retryable:!1,detail:`Codex owner endpoint closed after control publication; acceptance is unknown.`}}await new Promise(e=>setTimeout(e,10))}return{ok:!1,retryable:!1,detail:`Timed out waiting for Codex owner acknowledgement.`}}const ur=`Coder Task`;function dr(e,t=72){let n=String(e??``).trim().replace(/\s+/g,` `);return n?n.length<=t?n:`${n.slice(0,t-3)}...`:``}function fr(e){let t=dr(e,56);return t?`${ur}: ${t}`:ur}function pr(e){return e?.params?.threadId??null}function mr(e){return e?.params?.turnId?e.params.turnId:e?.params?.turn?.id?e.params.turn.id:null}function hr(e){let t=new Set;for(let n of e)for(let e of n.changes??[])e.path&&t.add(e.path);return[...t]}function gr(e,t){let n=[];for(let r of e.matchAll(/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/gm)){let e=t===`delete`,i=Number(e?r[1]:r[3]),a=Number((e?r[2]:r[4])??1);!Number.isFinite(i)||!Number.isFinite(a)||n.push(a<=1?`L${i}`:`L${i}-L${i+a-1}`)}return n}function _r(e){try{let t=i.readFileSync(e,`utf8`),n=t?t.split(/\r\n|\r|\n/).length-+!!t.endsWith(`
8
+ `):0;return n>0?[n===1?`L1`:`L1-L${n}`]:[]}catch{return[]}}function vr(e,t,n){let r=typeof e.kind==`string`?e.kind:e.kind?.type??`change`,i=e.path||`(unknown path)`,a=gr(e.diff??``,r),o=a.length||r!==`add`||!t?a:_r(i),s=typeof e.kind==`object`&&e.kind?.move_path?` -> ${n?p(n,e.kind.move_path):e.kind.move_path}`:``;return`${r} ${n?p(n,i):i}${s}${o.length?` ${o.join(`, `)}`:``}`}function yr(e,t=!1,n){return(e.changes??[]).map(e=>vr(e,t,n)).join(`; `)}function br(e){let t=e.trim().split(` `)[0]??``;return t===`/dev/null`?``:t.replace(/^[ab]\//,``)}function xr(e,t){let n=new Map,r=``,i=``;for(let t of e.split(/\r?\n/)){if(t.startsWith(`--- `)){r=br(t.slice(4));continue}if(t.startsWith(`+++ `)){i=br(t.slice(4));continue}let e=/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/.exec(t);if(!e)continue;let a=Number(e[1]),o=Number(e[2]??1),s=Number(e[3]),c=Number(e[4]??1),l=c===0,u=(l?r:i)||i||r||`(unknown path)`,d=l?a:s,f=l?o:c,p=f<=1?`L${d}`:`L${d}-L${d+f-1}`,m=n.get(u)??[];m.push(p),n.set(u,m)}return[...n].map(([e,n])=>`${t?p(t,e):e} ${n.join(`, `)}`).join(`; `)}function Sr(e){if(!e||typeof e!=`object`)return null;let t=e=>typeof e==`number`&&Number.isFinite(e)?e:0,n=t(e.inputTokens),r=t(e.cachedInputTokens),i=t(e.outputTokens);return{input:n,cachedInput:r,output:i,total:t(e.totalTokens)||n+r+i}}function Cr(e){if(e.tokenUsageByThread.size===0)return null;let t={input:0,cachedInput:0,output:0,total:0};for(let n of e.tokenUsageByThread.values())t.input+=n.input,t.cachedInput+=n.cachedInput,t.output+=n.output,t.total+=n.total;return t}function wr(e){return String(e??``).replace(/\s+/g,` `).trim()}function X(e){if(!e)return[];if(typeof e==`string`){let t=wr(e);return t?[t]:[]}if(Array.isArray(e))return e.flatMap(e=>X(e));if(typeof e==`object`){let t=e;if(typeof t.text==`string`)return X(t.text);if(`summary`in t)return X(t.summary);if(`content`in t)return X(t.content);if(`parts`in t)return X(t.parts)}return[]}function Tr(e,t){let n=[];for(let r of[...e,...t]){let e=wr(r);!e||n.includes(e)||n.push(e)}return n}function Z(e,t,n=null,r={}){!e||t==null||e({message:t,phase:n,...r})}function Er(e,t){t&&Z(e,t.message,t.phase??null,t.extra??{})}function Dr(e){return e.replace(/^\/(?:usr\/)?bin\/\w*sh\s+-l?c\s+/,``)}function Or(e,t){let n=e?.extra?.kind;return!e||n!==`tool`&&n!==`tool-result`||typeof t.id!=`string`?e:{...e,extra:{...e.extra,callId:t.id}}}function kr(e,t){switch(e.type){case`commandExecution`:return{message:Dr(String(e.command??``).trim()),phase:`running`,extra:{kind:`tool`,tool:`command`}};case`fileChange`:return null;case`mcpToolCall`:return{message:`${e.server}/${e.tool}`,phase:`investigating`,extra:{kind:`tool`,tool:String(e.tool??``)}};case`dynamicToolCall`:return{message:String(e.tool??``),phase:`investigating`,extra:{kind:`tool`,tool:String(e.tool??``)}};case`webSearch`:return{message:`search: ${String(e.query??``).trim()}`,phase:`investigating`,extra:{kind:`tool`,tool:`search`}};default:return null}}function Ar(e,t){switch(e.type){case`agentMessage`:{let t=String(e.text??``).trim();return t?{message:t,phase:null,extra:{kind:`assistant`}}:null}case`reasoning`:{let t=X(e.summary).join(`
9
+ `);return t?{message:t,phase:null,extra:{kind:`reasoning`}}:null}case`commandExecution`:{let t=typeof e.exitCode==`number`?e.exitCode:null;return{message:String(e.aggregatedOutput??``).trim(),phase:`running`,extra:{kind:`tool-result`,tool:`command`,command:String(e.command??``).trim(),...t===null?{isError:e.status!==`completed`}:{exitCode:t}}}}case`fileChange`:return{message:yr(e,!0,t)||`(details unavailable)`,phase:`editing`,extra:{kind:`tool`,tool:`edit`}};case`mcpToolCall`:return{message:`${e.server}/${e.tool} ${e.status}`,phase:`investigating`,extra:{kind:`tool-result`,isError:e.status!==`completed`}};case`dynamicToolCall`:return{message:`${e.tool} ${e.status}`,phase:`investigating`,extra:{kind:`tool-result`,isError:e.status!==`completed`}};default:return null}}function jr(e,t={}){let n,r,i=new Promise((e,t)=>{n=e,r=t});return{threadId:e,rootThreadId:e,threadIds:new Set([e]),threadTurnIds:new Map,turnId:null,bufferedNotifications:[],completion:i,resolveCompletion:n,rejectCompletion:r,finalTurn:null,completed:!1,finalAnswerSeen:!1,pendingCollaborations:new Set,activeSubagentTurns:new Set,completionTimer:null,lastAgentMessage:``,reasoningSummary:[],error:null,fileChanges:[],commandExecutions:[],tokenUsageByThread:new Map,lastDiffSummary:``,loggedTokens:0,reportedChanges:new Set,cwd:t.cwd??``,itemIndex:new Map,onProgress:t.onProgress??null,onHeartbeat:t.onHeartbeat??null}}function Mr(e){e.completionTimer&&=(clearTimeout(e.completionTimer),null)}function Nr(e,t=null){e.completed||(Mr(e),e.completed=!0,t?(e.finalTurn=t,e.turnId||=t.id??null):e.finalTurn||={id:e.turnId??`inferred-turn`,status:`completed`},e.resolveCompletion(e))}function Pr(e){e.completed||e.finalTurn||!e.finalAnswerSeen||e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||(Mr(e),e.completionTimer=setTimeout(()=>{e.completionTimer=null,!(e.completed||e.finalTurn||!e.finalAnswerSeen)&&(e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||Nr(e,null))},250),e.completionTimer.unref?.())}function Fr(e,t){let n=pr(t);if(!n||!e.threadIds.has(n))return!1;let r=e.threadTurnIds.get(n)??null,i=mr(t);return r===null||i===null||i===r}function Ir(e,t,n,r=null){if(t.id&&e.itemIndex.set(t.id,t),t.type===`collabAgentToolCall`){(!r||r===e.threadId)&&(n===`started`||t.status===`inProgress`?e.pendingCollaborations.add(t.id):n===`completed`&&(e.pendingCollaborations.delete(t.id),Pr(e)));for(let n of t.receiverThreadIds??[])e.threadIds.add(n)}if(t.type===`agentMessage`){t.text&&(!r||r===e.threadId)&&(e.lastAgentMessage=t.text.trim(),n===`completed`&&t.phase===`final_answer`&&(e.finalAnswerSeen=!0,Pr(e)));return}if(t.type===`reasoning`&&n===`completed`){e.reasoningSummary=Tr(e.reasoningSummary,X(t.summary));return}if(t.type===`fileChange`&&n===`completed`){e.fileChanges.push(t);return}t.type===`commandExecution`&&n===`completed`&&e.commandExecutions.push(t)}function Lr(e,t){switch(e.onHeartbeat?.(),t.method){case`thread/started`:e.threadIds.add(t.params.thread.id);break;case`turn/started`:e.threadIds.add(t.params.threadId),e.threadTurnIds.set(t.params.threadId,t.params.turn.id),(t.params.threadId??null)!==e.threadId&&e.activeSubagentTurns.add(t.params.threadId),Z(e.onProgress,`Turn started (${t.params.turn.id}).`,`starting`,{kind:`status`,threadId:t.params.threadId??null,turnId:t.params.turn.id??null});break;case`item/started`:Ir(e,t.params.item,`started`,t.params.threadId??null),Er(e.onProgress,Or(kr(t.params.item,e.cwd),t.params.item));break;case`item/completed`:{Ir(e,t.params.item,`completed`,t.params.threadId??null);let n=t.params.item;if(n?.type===`fileChange`)for(let t of n.changes??[])t.path&&e.reportedChanges.add(p(e.cwd,t.path));Er(e.onProgress,Or(Ar(n,e.cwd),n));break}case`thread/tokenUsage/updated`:{let n=Sr(t.params?.tokenUsage?.total??t.params?.tokenUsage),r=pr(t);if(n&&r){e.tokenUsageByThread.set(r,n);let t=Cr(e);t&&(!e.loggedTokens||t.total-e.loggedTokens>=1e3)&&(e.loggedTokens=t.total,e.onProgress?.({kind:`usage`,tokens:t}))}break}case`turn/diff/updated`:{let n=xr(String(t.params?.diff??``),e.cwd).split(`; `).filter(t=>!e.reportedChanges.has(t.split(` `)[0]??``)).join(`; `);n&&n!==e.lastDiffSummary&&(e.lastDiffSummary=n,Z(e.onProgress,`changed: ${n}`,`editing`,{kind:`status`}));break}case`item/autoApprovalReview/completed`:{let n=t.params?.review??{},r=t.params?.action??{},i=Dr(String(r.command??r.type??``).trim());Z(e.onProgress,`Auto-review ${n.status}. ${dr(i,48)}${n.rationale?`. ${dr(n.rationale,320)}`:``}`,null,{kind:`auto-review`,decision:String(n.status??``),...n.riskLevel?{riskLevel:String(n.riskLevel)}:{},...i?{summary:`run command: ${i}`}:{},...n.rationale?{reason:String(n.rationale)}:{}});break}case`error`:e.error=t.params.error,Z(e.onProgress,`Codex error: ${t.params.error.message}`,`failed`,{kind:`error`});break;case`turn/completed`:if((t.params.threadId??null)!==e.threadId){e.activeSubagentTurns.delete(t.params.threadId),Pr(e);break}Z(e.onProgress,`Turn ${t.params.turn.status}.`,`finalizing`,{kind:`status`}),Nr(e,t.params.turn)}}async function Rr(e,t,n,r={}){let i=jr(t,r),a=e.notificationHandler;e.setNotificationHandler(e=>{if(!i.turnId){i.bufferedNotifications.push(e);return}if(e.method===`thread/started`){Lr(i,e);return}if(!Fr(i,e)){a?.(e);return}Lr(i,e)});let o=r.onApprovalRequest;o&&e.setServerRequestHandler((e,t)=>o(e,t,i));try{let t=await n();i.turnId=t.turn?.id??null,i.turnId&&(i.threadTurnIds.set(i.threadId,i.turnId),await r.onTurnStarted?.(i.turnId));for(let e of i.bufferedNotifications)Fr(i,e)?Lr(i,e):a?.(e);i.bufferedNotifications.length=0,t.turn?.status&&t.turn.status!==`inProgress`&&Nr(i,t.turn);let o=e.exitPromise?.then(()=>{throw e.exitError??Error(`codex app-server connection closed before the turn completed.`)});return await(o?Promise.race([i.completion,o]):i.completion)}finally{Mr(i),e.setNotificationHandler(a??null),e.setServerRequestHandler(null)}}function zr(e,t,n=[]){return e!==`workspace-write`||!n.length?null:{type:`workspaceWrite`,writableRoots:n,networkAccess:t??!1}}const Br=`coder_read_only`;function Vr(e,t=[]){return(e??`read-only`)!==`read-only`||!t.length?null:{default_permissions:Br,[`permissions.${Br}`]:{extends:`:read-only`,filesystem:Object.fromEntries(t.map(e=>[e,`write`]))}}}function Hr(e=[],t=[],n=!1){let r={};!n&&t.length&&(r.mcp_servers=Object.fromEntries(t.map(e=>[e,{enabled:!1}])));let i=new Set([...t,...e.map(e=>e.name)]);for(let n of e){let e=n.name;if(t.includes(e)){for(let t=1;i.has(e);t++)e=`${n.name}_coder_${t}`;i.add(e)}r[`mcp_servers.${e}`]={...n.url?{url:n.url,...n.headers?{http_headers:n.headers}:{}}:{command:n.command,args:n.args??[],...n.env?{env:n.env}:{}},...n.tools?.length?{enabled_tools:n.tools}:{}}}return r}function Ur(e){return e.split(/\r?\n/).map(e=>e.trimEnd()).filter(e=>e&&!e.startsWith(`WARNING: proceeding, even though we could not update PATH:`)).join(`
10
+ `)}async function Wr(e,t,n={}){let r=n.connect??Ne.connect,i={...n.networkAccess===void 0?{}:{networkAccess:n.networkAccess},nativeMcp:n.nativeMcp??!1},a=null;try{a=await r(e,i);let n=await t(a);return await a.close(),n}catch(n){let o=n,s=a?.transport===`broker`||!!process.env.CODER_APP_SERVER_ENDPOINT,c=a?.transport===`broker`&&o?.rpcCode===-32001||s&&(o?.code===`ENOENT`||o?.code===`ECONNREFUSED`);if(a&&=(await a.close().catch(()=>{}),null),!c)throw n;let l=await r(e,{...i,disableBroker:!0});try{return await t(l)}finally{await l.close()}}}function Q(t){let n=process.env.CODEX_AUTH_JSON;if(n){let t=e.join(u.homedir(),`.codex`),r=e.join(t,`auth.json`);if(!i.existsSync(r)){i.mkdirSync(t,{recursive:!0,mode:448});try{i.writeFileSync(r,n,{encoding:`utf8`,flag:`wx`,mode:384})}catch(e){if(e.code!==`EEXIST`)throw e}}}let r=he(`codex`,[`--version`],{cwd:t});if(!r.available)return r;let a=he(`codex`,[`app-server`,`--help`],{cwd:t});return a.available?{available:!0,detail:`${r.detail}; app-server runtime available`}:{available:!1,detail:`${r.detail}; app-server runtime unavailable: ${a.detail}`}}async function Gr(e){let t=Q(e);if(!t.available)return{available:!1,loggedIn:!1,detail:t.detail};let n=null;try{n=await Ne.connect(e,{reuseExistingBroker:!0});let t=await n.request(`account/read`,{refreshToken:!1}),r=t?.account??null;return r?.type===`chatgpt`?{available:!0,loggedIn:!0,detail:r.email?`ChatGPT login active for ${r.email}`:`ChatGPT login active`}:r?.type===`apiKey`?{available:!0,loggedIn:!0,detail:`API key configured`}:t?.requiresOpenaiAuth===!1?{available:!0,loggedIn:!0,detail:`Active provider does not require OpenAI authentication`}:{available:!0,loggedIn:!1,detail:"Not authenticated. Run `codex login`."}}catch(e){let t=s(`codex`,[`login`,`status`],{encoding:`utf8`}),n=`${t.stdout??``}${t.stderr??``}`.trim();return t.status===0?{available:!0,loggedIn:!0,detail:n||`Logged in`}:{available:!0,loggedIn:!1,detail:n||(e instanceof Error?e.message:String(e))}}finally{await n?.close().catch(()=>{})}}async function Kr(e,{endpoint:t,threadId:n,turnId:r}){if(!n||!r)return{interrupted:!1,detail:`missing threadId or turnId`};let i=await lr(t,`turn/interrupt`,{threadId:n,turnId:r});return i.ok?{interrupted:!0,detail:`Interrupted ${r} on ${n}.`}:{interrupted:!1,detail:i.detail}}async function qr(e,{endpoint:t,threadId:n,turnId:r,text:i,command:a}){if(!n)return{steered:!1,retryable:!0,detail:`missing active threadId`};if(!r)return{steered:!1,retryable:!0,detail:`missing active turnId`};let o=i.trim();if(!o)return{steered:!1,retryable:!1,detail:`empty follow-up`};let s=await lr(t,`turn/steer`,{threadId:n,input:[{type:`text`,text:o,text_elements:[]}],expectedTurnId:r},3e3,a);return s.ok?s.result?.turnId===r?{steered:!0,retryable:!1,detail:`Steered follow-up into ${r} on ${n}.`}:{steered:!1,retryable:!1,detail:`turn/steer returned unexpected turnId ${String(s.result?.turnId??`(missing)`)}; expected ${r}`}:{steered:!1,retryable:s.retryable,detail:s.detail}}async function Jr(e,t={},n={}){let r=Q(e);if(!r.available)throw Error(`Codex CLI is not available: ${r.detail}`);let i=t.prompt?.trim();if(!i)throw Error(`A prompt is required.`);let a=Vr(t.sandbox,t.writableRoots),o=a?{}:{sandbox:t.sandbox??`read-only`},s={...t.configOverrides??{},...a},c=Object.keys(s).length?s:null,l=zr(t.sandbox,t.networkAccess,t.writableRoots),u=async n=>{let r=null,a,s=await n.request(`config/read`,{cwd:e,includeLayers:!1}),u={...c,...Hr(t.mcpServers,Object.keys(s.config?.mcp_servers??{}),t.nativeMcp),...t.nativeMcp?{}:{"features.apps":!1,"features.plugins":!1}};if(t.resumeThreadId)Z(t.onProgress,`Resuming thread ${t.resumeThreadId}.`,`starting`,{kind:`status`}),Le(t.resumeThreadId)&&await Re(t.resumeThreadId),a=(await n.request(`thread/resume`,{threadId:t.resumeThreadId,cwd:e,model:t.model??null,modelProvider:t.modelProvider??null,config:u,approvalPolicy:t.approvalPolicy??`never`,...o,...t.approvalsReviewer?{approvalsReviewer:t.approvalsReviewer}:{}})).thread.id;else if(Z(t.onProgress,`Starting Codex task thread.`,`starting`,{kind:`status`}),a=(await n.request(`thread/start`,{cwd:e,model:t.model??null,modelProvider:t.modelProvider??null,config:u,approvalPolicy:t.approvalPolicy??`never`,...o,...t.approvalsReviewer?{approvalsReviewer:t.approvalsReviewer}:{},serviceName:`coder_runtime`,ephemeral:t.ephemeral??!1})).thread.id,!(t.ephemeral??!1))try{await n.request(`thread/name/set`,{threadId:a,name:fr(i)})}catch(e){let t=String(e?.message??e??``);if(!t.includes(`unknown variant`)&&!t.includes(`unknown method`))throw e}Z(t.onProgress,`Thread ready (${a}).`,`starting`,{kind:`status`,threadId:a});let d;try{d=await Rr(n,a,()=>n.request(`turn/start`,{threadId:a,input:[{type:`text`,text:i,text_elements:[]}],model:t.model??null,effort:t.effort??null,outputSchema:t.outputSchema??null,...l?{sandboxPolicy:l}:{}}),{cwd:e,onProgress:t.onProgress,onHeartbeat:t.onHeartbeat,onApprovalRequest:t.onApprovalRequest,onTurnStarted:t.onControlReady?async e=>{r=await sr(n,{threadId:a,turnId:e}),t.onControlReady?.(r.endpoint,a,e)}:void 0}),t.onResult?.({status:d.finalTurn?.status===`completed`?0:1,threadId:a,turnId:d.turnId,finalMessage:d.lastAgentMessage,error:d.error??null})}finally{await r?.close()}return{status:d.finalTurn?.status===`completed`?0:1,threadId:a,turnId:d.turnId,finalMessage:d.lastAgentMessage,reasoningSummary:d.reasoningSummary,turn:d.finalTurn,error:d.error??d.finalTurn?.error??null,stderr:Ur(n.stderr),fileChanges:d.fileChanges,touchedFiles:hr(d.fileChanges),tokens:Cr(d),model:t.model??null,commandExecutions:d.commandExecutions}},d=async e=>{e.setNoticeHandler?.(e=>Z(t.onProgress,e,`starting`,{kind:`status`}));try{let t=await u(e);return J(t.error?.message)&&await Yr(e),t}catch(t){throw J(Un(t))&&await Yr(e),t}},f=()=>Wr(e,d,{...n,networkAccess:t.networkAccess,nativeMcp:t.nativeMcp}),p=!1,m=()=>(p=!0,Z(t.onProgress,`Codex login changed; restarted the Codex app-server and retrying the turn once.`,`starting`,{kind:`status`}),f());try{let e=await f().catch(e=>{if(!J(Un(e)))throw e;return m()}),n=!e.touchedFiles?.length&&!e.commandExecutions.length;!p&&n&&J(e.error?.message)&&(e=await m());let r=Gn(e.error?.message,t.model);return r?{...e,error:{...e.error,message:r}}:e}catch(e){let n=Gn(Un(e),t.model);throw n?Error(n):e}}async function Yr(e){e.transport===`broker`&&await e.request(Ce,{}).catch(()=>{})}const Xr=new Set([`Write`,`Edit`,`MultiEdit`,`NotebookEdit`]);function Zr(e){return typeof e==`string`?e:Array.isArray(e)?e.map(e=>typeof e?.text==`string`?e.text:``).join(``):e==null?``:JSON.stringify(e)}function Qr(e){if(!e)return 0;let t=e.split(/\r\n|\r|\n/);return t.at(-1)===``&&t.pop(),Math.max(1,t.length)}function $r(e,t,n=!1){if(!t)return[];let r;try{r=i.readFileSync(e,`utf8`)}catch{return[]}let a=[],o=0;for(;o<=r.length;){let e=r.indexOf(t,o);if(e<0)break;let i=Qr(r.slice(0,e))+1,s=Math.max(1,Qr(t));if(a.push(s===1?`L${i}`:`L${i}-L${i+s-1}`),!n)break;o=e+Math.max(t.length,1)}return a.length>4?[...a.slice(0,4),`+${a.length-4} matches`]:a}function ei(e){let t=(typeof e==`string`?e:JSON.stringify(e)??String(e)).replace(/\s+/g,` `).trim();return t.length>80?`${t.slice(0,80)}…`:t}function ti(t,n,r){let i=String(n.file_path??n.notebook_path??n.path??``),a=i?e.isAbsolute(i)?i:e.resolve(r,i):``,o=i?p(r,a)||i:`(unknown path)`,s=n.path?` in ${p(r,String(n.path))}`:``;if(t===`Write`){let e=Qr(String(n.content??``));return`Write ${o} ${e?`L1-L${e}`:`(empty file)`}`}if(t===`Edit`){let e=$r(a,String(n.old_string??``),n.replace_all===!0);return`Edit ${o}${e.length?` ${e.join(`, `)}`:``}`}if(t===`MultiEdit`){let e=Array.isArray(n.edits)?n.edits:[],t=e.flatMap(e=>$r(a,String(e?.old_string??``),e?.replace_all===!0));return`MultiEdit ${o}${t.length?` ${t.join(`, `)}`:``} (${e.length} edits)`}if(t===`NotebookEdit`){let e=n.cell_id??n.cell_number;return`NotebookEdit ${o}${e==null?``:` cell ${e}`}`}if(t===`Read`){let e=Number(n.offset??0),t=Number(n.limit??0);return`Read ${o}${e&&t?` L${e}-L${e+t-1}`:e?` from L${e}`:``}`}if(t===`Bash`)return`Bash ${String(n.command??``).trim()||`(no command)`}`;if(t===`Glob`)return`Glob ${String(n.pattern??``)}${s}`;if(t===`Grep`){let e=n.glob?` (${String(n.glob)})`:``;return`Grep ${String(n.pattern??``)}${s}${e}`}if(t===`Task`)return`Task ${n.subagent_type?`${String(n.subagent_type)}: `:``}${ei(n.description??n.prompt??``)}`;if(t===`WebFetch`)return`WebFetch ${String(n.url??``)}`;if(t===`WebSearch`)return`WebSearch ${String(n.query??``)}`;if(t===`TodoWrite`){let e=Array.isArray(n.todos)?n.todos:[];return`TodoWrite ${e.length} item${e.length===1?``:`s`}`}let c=Object.entries(n??{}).map(([e,t])=>`${e}=${ei(t)}`).join(` `);return c?`${t} ${c}`:t}function ni(e){if(!e||typeof e!=`object`)return null;let t=e=>typeof e==`number`&&Number.isFinite(e)?e:0,n=t(e.input_tokens),r=t(e.cache_read_input_tokens)+t(e.cache_creation_input_tokens),i=t(e.output_tokens);return{input:n,cachedInput:r,output:i,total:n+r+i}}function ri(){let e=s(`claude`,[`--version`],{encoding:`utf8`});return e.error||e.status!==0?{available:!1,detail:`claude CLI not found on PATH (npm install -g @anthropic-ai/claude-code)`}:{available:!0,detail:String(e.stdout||``).trim()}}function ii(){if(t.env.CLAUDE_CODE_OAUTH_TOKEN)return{loggedIn:!0,detail:`CLAUDE_CODE_OAUTH_TOKEN configured`};if(t.env.ANTHROPIC_API_KEY)return{loggedIn:!0,detail:`ANTHROPIC_API_KEY configured`};let e=s(`claude`,[`auth`,`status`,`--json`],{encoding:`utf8`});if(e.error||e.status!==0)return{loggedIn:!1,detail:`not logged in`};try{let t=JSON.parse(String(e.stdout||``));return t.loggedIn?{loggedIn:!0,detail:[t.email,t.subscriptionType].filter(Boolean).join(`, `)||`logged in`}:{loggedIn:!1,detail:`not logged in`}}catch{return{loggedIn:!1,detail:`unknown`}}}function ai(e,n){let r=n.permissions??`auto`,i=n.mcpServers??[],a={};r===`auto`&&n.approvalTaskId&&(a.coder={type:`stdio`,command:t.execPath,args:[w,`mcp`,`serve`,n.approvalTaskId,`--cwd`,e]});for(let e of i)a[e.name]=e.url?{type:e.type??`http`,url:e.url,...e.headers?{headers:e.headers}:{}}:{type:`stdio`,command:e.command,args:e.args??[],...e.env?{env:e.env}:{}};return a}function oi(t,n,r,i){let a=[`-p`,`--input-format`,`stream-json`,`--output-format`,`stream-json`,`--verbose`,`--replay-user-messages`];a.push(n.resumeSessionId?`--resume`:`--session-id`,r),n.model&&a.push(`--model`,n.model),n.effort&&a.push(`--effort`,n.effort),n.outputSchema&&a.push(`--json-schema`,JSON.stringify(n.outputSchema));let o=n.permissions??`auto`,s=n.additionalDirectories??[],c=o===`read-only`?n.readOnlyAllowedTools??[]:[],l=n.mcpServers??[],u=ai(t,n),d=o===`auto`&&n.approvalTaskId,f=l.flatMap(e=>e.tools?.length?e.tools.map(t=>`mcp__${e.name}__${t}`):[`mcp__${e.name}`]),p=Object.keys(u).length?[`--mcp-config`,i??e.join(n.taskRoot??t,`.claude-mcp.json`)]:n.nativeMcp?[]:[`--mcp-config`,`{"mcpServers":{}}`];n.nativeMcp||a.push(`--strict-mcp-config`,`--no-chrome`),d?(a.push(`--permission-mode`,`default`,...p,`--permission-prompt-tool`,`mcp__coder__approval_prompt`),f.length&&a.push(`--allowedTools`,...f)):c.length?a.push(...Rt,...p,`--allowedTools`,...c,...f):(a.push(...Lt[o]??Lt.auto,...p),f.length&&a.push(`--allowedTools`,...f));let m=n.writableDirectories??[];for(let e of[...s,...o===`read-only`?[]:m])a.push(`--add-dir`,e);let h=Ht(o,t,n.allowedNetworkHosts??[],s,m),g={...h?JSON.parse(h):{},...n.nativeMcp?{}:{disableClaudeAiConnectors:!0}};return Object.keys(g).length&&a.push(`--settings`,JSON.stringify(g)),a}function si(e,t){return Object.assign(Error(e),{retryable:t})}function ci(e,t){let n=t&&Zn(t),r=n&&`${n.slice(0,14)}5${n.slice(15,19)}${(Number.parseInt(n[19],16)&3|8).toString(16)}${n.slice(20)}`;return{type:`user`,...r?{uuid:r}:{},message:{role:`user`,content:[{type:`text`,text:e}]}}}function li(e){let t=!0;return{sendInitial(t,n){return new Promise((r,i)=>{e(`${JSON.stringify(ci(t,n))}\n`,e=>{e?i(e):r()})})},sendSteer(n,r){return t?new Promise((t,i)=>{e(`${JSON.stringify(ci(n,r))}\n`,e=>{if(!e){t();return}let n=e.code,r=n===`EPIPE`||n===`ERR_STREAM_DESTROYED`||n===`ERR_STREAM_WRITE_AFTER_END`;i(si(`Failed to write Claude live steer: ${e.message}`,r))})}):Promise.reject(si(`Claude turn is no longer accepting live input.`,!0))},stopAccepting(){t=!1}}}function ui(e,n){let r=`${e}.${t.pid}.${l()}.tmp`;i.writeFileSync(r,`${JSON.stringify(n)}\n`,`utf8`),i.renameSync(r,e)}async function di(n){let r=i.mkdtempSync(e.join(u.tmpdir(),`coder-claude-steer-`)),a=`file:${r}`,o=new Set,s=new Set,c=!1,l=!1,d=(a=!1)=>{if(!(c&&!a||l)){l=!0;try{for(let a of i.readdirSync(r).filter(e=>e.endsWith(`.request.json`))){let c=a.slice(0,-13),l=e.join(r,a),u=e.join(r,`${c}.response.json`);if(i.existsSync(u)){i.unlinkSync(l);continue}if(s.has(c))continue;let d=`${l}.${t.pid}.processing`;try{i.renameSync(l,d)}catch{continue}s.add(c);let f=(async()=>{let e;try{let t=JSON.parse(i.readFileSync(d,`utf8`)),r=typeof t?.params?.text==`string`?t.params.text.trim():``;if(t?.method!==`turn/steer`||!r||t?.id!==c)e={id:c,error:{message:`Invalid Claude steer request.`,retryable:!1}};else try{await n(r,t.command),e={id:c,result:{accepted:!0}}}catch(t){let n=t;e={id:c,error:{message:n.message,retryable:n.retryable===!0}}}}catch(t){e={id:c,error:{message:`Invalid Claude steer JSON: ${t instanceof Error?t.message:String(t)}`,retryable:!1}}}try{ui(u,e)}finally{s.delete(c);try{i.unlinkSync(d)}catch{}}})();o.add(f),f.then(()=>o.delete(f),()=>o.delete(f))}}catch{}finally{l=!1}}},f=setInterval(d,10);return{endpoint:a,async close(){c=!0,clearInterval(f),d(!0),await Promise.allSettled([...o]),await new Promise(e=>setTimeout(e,50)),i.rmSync(r,{recursive:!0,force:!0})}}}async function fi(t,n,r=3e3,a){if(!t)return{steered:!1,retryable:!0,detail:`Claude live steer endpoint is not ready.`};let o=n.trim();if(!o)return{steered:!1,retryable:!1,detail:`empty follow-up`};if(!t.startsWith(`file:`)||t.length===5)return{steered:!1,retryable:!1,detail:`Unsupported Claude steer endpoint: ${t}`};let s=t.slice(5);if(!i.existsSync(s))return{steered:!1,retryable:!0,detail:`Claude live steer endpoint is no longer available.`};let c=Zn(a),l=e.join(s,`${c}.request.json`),u=e.join(s,`${c}.response.json`);try{i.existsSync(u)||ui(l,{id:c,method:`turn/steer`,params:{text:o},command:a})}catch(e){return{steered:!1,retryable:e.code===`ENOENT`,detail:e instanceof Error?e.message:String(e)}}let d=Date.now();for(;Date.now()-d<r;){try{let e=JSON.parse(i.readFileSync(u,`utf8`));try{(!a||e?.error?.retryable)&&i.unlinkSync(u)}catch{}return e?.result?.accepted===!0?{steered:!0,retryable:!1,detail:`Claude accepted the live follow-up.`}:{steered:!1,retryable:e?.error?.retryable===!0,detail:String(e?.error?.message??`Malformed Claude steer response.`)}}catch(e){if(e.code!==`ENOENT`)return{steered:!1,retryable:!1,detail:`Invalid Claude steer response: ${e instanceof Error?e.message:String(e)}`}}await new Promise(e=>setTimeout(e,10))}return{steered:!1,retryable:!1,detail:`Timed out waiting for Claude live steer acknowledgement.`}}async function pi(n,r){let a=r.resumeSessionId??l(),s=ai(n,r),c=Object.keys(s).length?e.join(r.taskRoot??n,`.claude-mcp-${l()}.json`):void 0;c&&(i.mkdirSync(e.dirname(c),{recursive:!0}),i.writeFileSync(c,`${JSON.stringify({mcpServers:s})}\n`,{encoding:`utf8`,flag:`wx`,mode:384}));let u=oi(n,r,a,c),d=()=>{if(c)try{i.unlinkSync(c)}catch{}};return r.onProgress?.({kind:`status`,message:`claude turn started (session ${a})`,threadId:a}),new Promise((s,c)=>{let l=o(r.executable??`claude`,u,{cwd:n,stdio:[`pipe`,`pipe`,`pipe`],...r.env?{env:{...t.env,...r.env}}:{}}),f=``,p=``,m=[],h=null,g=a,_=null,v=!1,y=li((e,t)=>l.stdin.write(e,t)),b=Date.now(),x=new Map,S=0,C=0,w=new Set,T=t=>{if(!(!t||typeof t!=`object`)){if(d(),r.onHeartbeat?.(),t.type===`system`&&t.subtype===`init`&&t.session_id)g=t.session_id;else if(t.type===`assistant`){let i=ni(t.message?.usage);if(i){S+=i.output;let e=i.input+i.cachedInput+S;(!C||e-C>=1e3)&&(C=e,r.onProgress?.({kind:`usage`,tokens:{...i,output:S,total:e},threadId:g}))}for(let i of t.message?.content??[])if(i?.type===`tool_use`){let t=String(i.name??`Tool`);if(i.id&&x.set(String(i.id),{name:t,at:Date.now()}),Xr.has(t)){let t=String(i.input?.file_path??i.input?.notebook_path??``);t&&w.add(e.isAbsolute(t)?t:e.resolve(n,t))}r.onProgress?.({kind:`tool`,tool:t,...i.id?{callId:String(i.id)}:{},message:ti(t,i.input??{},n),threadId:g})}else i?.type===`text`&&typeof i.text==`string`&&i.text.trim()?r.onProgress?.({kind:`assistant`,message:i.text.trim(),threadId:g}):i?.type===`thinking`&&typeof i.thinking==`string`&&i.thinking.trim()&&r.onProgress?.({kind:`reasoning`,message:i.thinking.trim(),durationMs:Math.max(1e3,Date.now()-b),threadId:g})}else if(t.type===`user`){for(let e of t.message?.content??[])if(e?.type===`tool_result`){let t=Zr(e.content).trim(),n=e.is_error===!0,i=e.tool_use_id?x.get(String(e.tool_use_id)):void 0;if(e.tool_use_id&&x.delete(String(e.tool_use_id)),!t&&!n&&!i)continue;r.onProgress?.({kind:`tool-result`,...e.tool_use_id?{callId:String(e.tool_use_id)}:{},...i?{tool:i.name,durationMs:Date.now()-i.at}:{},...n?{isError:!0}:{},message:t||(n?`(tool failed with no output)`:``),threadId:g})}}else t.type===`result`&&(h=t,r.onResult?.({status:+!!t.is_error,threadId:t.session_id??g,finalMessage:t.structured_output===void 0?String(t.result??``).trim():JSON.stringify(t.structured_output),error:t.is_error?{message:String(t.result??``)}:null}),t.session_id&&(g=t.session_id),y.stopAccepting(),l.stdin.end());b=Date.now()}};l.stdout.on(`data`,e=>{f+=e;let t;for(;(t=f.indexOf(`
11
+ `))>=0;){let e=f.slice(0,t).trim();if(f=f.slice(t+1),e)try{T(JSON.parse(e))}catch(e){m.push(`Invalid Claude stream-json output: ${e instanceof Error?e.message:String(e)}`)}}}),l.stderr.on(`data`,e=>{p+=e});let E=()=>{y.stopAccepting(),l.kill(`SIGTERM`),d();let e=_?.endpoint;e?.startsWith(`file:`)&&i.rmSync(e.slice(5),{recursive:!0,force:!0}),t.exit(143)};t.on(`SIGTERM`,E),(async()=>{r.onSteerReady&&(_=await di((e,t)=>y.sendSteer(e,t))),await y.sendInitial(r.prompt,r.command),_&&r.onSteerReady?.(_.endpoint)})().catch(e=>{v||(v=!0,y.stopAccepting(),l.kill(`SIGTERM`),d(),t.removeListener(`SIGTERM`,E),_?.close(),c(e))}),l.on(`error`,e=>{v||(v=!0,y.stopAccepting(),t.removeListener(`SIGTERM`,E),d(),_?.close(),c(Error(`claude spawn failed: ${e.message}`)))}),l.on(`close`,async e=>{if(v)return;v=!0,y.stopAccepting(),t.removeListener(`SIGTERM`,E),d(),await _?.close();let n=f.trim();if(n)try{T(JSON.parse(n))}catch(e){m.push(`Invalid trailing Claude stream-json output: ${e instanceof Error?e.message:String(e)}`)}let i=h?.structured_output===void 0?(h?.result??``).trim():JSON.stringify(h.structured_output),a=e!==0||h?.is_error===!0||h==null||m.length>0;s({status:+!!a,threadId:h?.session_id??g,turnId:null,finalMessage:i,touchedFiles:[...w],tokens:ni(h?.usage),model:h?.modelUsage&&Object.keys(h.modelUsage).join(`+`)||r.model||null,error:a?{message:m[0]||i||p.trim()||`claude exited ${e}`}:null})})})}const $=`@wular/coder`,mi=`https://registry.npmjs.org/${$}/latest`;function hi(){return O(`update-check.json`)}function gi(e,t){let n=String(e).split(`.`).map(e=>parseInt(e,10)||0),r=String(t).split(`.`).map(e=>parseInt(e,10)||0);for(let e=0;e<3;e+=1){if((n[e]??0)>(r[e]??0))return 1;if((n[e]??0)<(r[e]??0))return-1}return 0}function _i(){try{return JSON.parse(i.readFileSync(hi(),`utf8`))}catch{return null}}function vi(e){try{i.mkdirSync(O(),{recursive:!0}),i.writeFileSync(hi(),JSON.stringify(e))}catch{}}function yi(){try{i.rmSync(hi(),{force:!0})}catch{}}function bi(e,n){if(t.env.CODER_NO_UPDATE_CHECK||t.env.CI)return;let r=_i();if(!r?.checkedAt||Date.now()-r.checkedAt>864e5)try{o(t.execPath,[n,`upgrade`,`refresh`],{detached:!0,stdio:`ignore`}).unref()}catch{}return r?.latest&&gi(r.latest,e)>0?r.latest:void 0}async function xi(e){let t=_i()?.latest??null;try{let e=new AbortController,n=setTimeout(()=>e.abort(),3e3),r=await fetch(mi,{signal:e.signal,headers:{accept:`application/json`}});if(clearTimeout(n),r.ok){let e=await r.json();e?.version&&(t=e.version)}}catch{}vi({checkedAt:Date.now(),latest:t,current:e})}function Si(e){let t=e;try{t=i.realpathSync(e)}catch{}let n=t.replace(/\\/g,`/`);return/\/\.bun\//.test(n)?{pm:`bun`,command:[`bun`,`add`,`-g`,`${$}@latest`]}:/\/\.pnpm\//.test(n)||/\/pnpm(-global)?\//i.test(n)||/\/Library\/pnpm\//.test(n)?{pm:`pnpm`,command:[`pnpm`,`add`,`-g`,`${$}@latest`]}:/\/\.config\/yarn\/global\//.test(n)||/\/yarn\/global\//.test(n)||/\/Yarn\/Data\/global\//.test(n)?{pm:`yarn`,command:[`yarn`,`global`,`add`,`${$}@latest`]}:{pm:`npm`,command:[`npm`,`install`,`-g`,`${$}@latest`]}}function Ci(e){s(`claude`,[`plugin`,`marketplace`,`remove`,`coder-plugins`],{encoding:`utf8`});let t=s(`claude`,[`plugin`,`marketplace`,`add`,e],{encoding:`utf8`}),n=s(`claude`,[`plugin`,`install`,`coder@coder-plugins`],{encoding:`utf8`}),r=t.status===0&&n.status===0;return{marketplace:e,installed:r,note:r?`Plugin installed; restart any running Claude Code session to load it.`:`Automatic install failed (${(n.stderr||t.stderr||`claude not found`).trim()}); run: claude plugin marketplace add "${e}" && claude plugin install coder@coder-plugins`}}function wi(){return e.join(u.homedir(),`.agents`,`skills`,`coder`)}function Ti(){try{let t=i.readFileSync(e.join(wi(),`SKILL.md`),`utf8`);return/^\s*version:\s*(\S+)/m.exec(t)?.[1]??null}catch{return null}}function Ei(t){let n=wi();try{let r=e.join(t,`plugins`,`agents`,`skills`,`coder`);i.rmSync(n,{recursive:!0,force:!0}),i.mkdirSync(n,{recursive:!0}),i.cpSync(r,n,{recursive:!0});let a=e.join(n,`SKILL.md`),o=i.readFileSync(a,`utf8`).replace(`
12
+ ---
13
+ `,`\nmetadata:\n version: ${T()}\n---\n`);return i.writeFileSync(a,o),{marketplace:n,installed:!0,note:`Skill installed to ~/.agents/skills/coder; restart running sessions to load it.`}}catch(e){return{marketplace:n,installed:!1,note:`Skill install failed: ${e instanceof Error?e.message:String(e)}`}}}function Di(e){if(e.available)return null;let t=s(`npm`,[`install`,`-g`,`@openai/codex@latest`],{encoding:`utf8`});return t.status===0?{installed:!0,note:`codex CLI installed (runs your custom models; no login needed for them)`}:{installed:!1,note:`custom models run on the codex CLI and it is not installed; auto-install failed: ${(t.stderr||`npm not found`).trim()}. Run: npm install -g @openai/codex`}}const Oi={codex:{"gpt-6-astra":`0.154.0`,"gpt-6-sol":`0.156.1`,"gpt-6-luna":`0.156.1`,"gpt-6.1-sol":`0.159.1`},claude:{sonnet:`2.1.197`,fable:`2.1.257`,opus:`2.1.280`}};function ki(e){let t=/(\d+\.\d+\.\d+)/.exec(String(e??``));return t?t[1]:null}function Ai(e,t,n){let r=t?Oi[e][t]:void 0,i=ki(n.detail);return!r||!i||gi(i,r)>=0?null:`${e} ${i} predates ${t} (needs ${r}), so it may fail or run another model. Run: ${e} update`}function ji(e){if(!e.available)return null;let t=ki(e.detail);if(!t||gi(t,`0.159.1`)>=0)return null;let n=s(`codex`,[`update`],{encoding:`utf8`});return n.status!==0&&(n=s(`npm`,[`install`,`-g`,`@openai/codex@latest`],{encoding:`utf8`})),n.status===0?{updated:!0,from:t}:{updated:!1,from:t,note:`codex ${t} is too old for the default codex model (needs >= 0.159.1); auto-update failed: ${(n.stderr||`codex/npm not found`).trim()}. Run: codex update`}}async function Mi(e,t={},r){let a=t.hosts??[],o=a.find(e=>![`claude`,`codex`,`agents`].includes(e));if(o)throw new L(`invalid-option`,`Unknown host "${o}". Use claude, codex, or agents.`,{hint:`Codex, Pi, OpenCode, and other Agent Skills hosts: coder setup-host agents`});let s=e=>t[e]||a.includes(e);r?.();let c=Q(e),l=ji(c);l?.updated&&(c=Q(e));let u=c.available?await Gr(e):{loggedIn:!1,detail:c.detail},d=ri(),f=d.available?ii():{loggedIn:!1,detail:d.detail},p=G();if(!i.existsSync(p)){let e=c.available?[`codex`,`claude`]:d.available?[`claude`,`codex`]:[`codex`,`claude`];On({...R,chain:e})}let m=ee(),h=s(`claude`)?Ci(m):null,g=s(`agents`)||s(`codex`)?Ei(m):null,_=q(e),v=c.available&&u.loggedIn||d.available&&f.loggedIn;return{codex:{available:c.available,detail:c.detail,auth:u.detail,loggedIn:u.loggedIn},...l?{codexUpdate:l}:{},claude:{available:d.available,detail:d.detail,auth:f.detail,loggedIn:f.loggedIn},configFile:p,runtime:n(new URL(`../bin/coder.mjs`,import.meta.url)),...h?{claudePlugin:h}:{},...g?{agentsSkill:g}:{},config:_,ready:v}}async function Ni(t={},n){let r=!t.pluginsOnly,a=!t.cliOnly,o=ee(),c=e.join(o,`plugins/claude/.claude-plugin/plugin.json`),l={cli:T(),claude:E(c)},u={};if(r){let e=Si(w),[r,...i]=t.pm===`npm`?[`npm`,`install`,`-g`,`@wular/coder@latest`]:t.pm===`pnpm`?[`pnpm`,`add`,`-g`,`@wular/coder@latest`]:t.pm===`yarn`?[`yarn`,`global`,`add`,`@wular/coder@latest`]:t.pm===`bun`?[`bun`,`add`,`-g`,`@wular/coder@latest`]:e.command,a=t.pm??e.pm;n?.(`via ${a}`);let o=s(r,i,{encoding:`utf8`});if(o.error?.code===`ENOENT`)throw new L(`invalid-option`,`${a} not found on PATH. Re-run with --pm <npm|pnpm|yarn|bun>, or update manually: ${r} ${i.join(` `)}`);if(o.status!==0){let e=(o.stderr||o.stdout||``).trim();throw new L(`invalid-option`,`CLI update failed (${a}).${e?`\n${e}`:``}\nRun manually: ${r} ${i.join(` `)}`)}yi();let c=T();u.cli={pm:a,from:l.cli,to:c,changed:c!==l.cli}}if(a){if(t.claude||!t.codex&&ri().available){let e=Ci(o);u.claudePlugin={installed:e.installed,note:e.note,from:l.claude,to:E(c)}}if(i.existsSync(wi())){let e=Ti(),t=Ei(o);u.agentsSkill={installed:t.installed,note:t.note,from:e,to:Ti()}}}return u}const Pi=new Set(`commit.checkout.switch.restore.stash.reset.rebase.merge.push.pull.cherry-pick.revert.clean.am.apply.tag.branch.worktree.filter-branch.filter-repo.gc.prune.reflog.remote.submodule.config`.split(`.`)),Fi=[/\bsudo\b/,/\brm\s+(-[a-zA-Z]*r[a-zA-Z]*f|-[a-zA-Z]*f[a-zA-Z]*r)\b.*\s(\/\*?|~\/?|\$HOME\/?)(\s|$)/,/\b(shutdown|reboot|halt|poweroff)\b/,/\bmkfs\b|\bdiskutil\s+erase/i,/\b(chmod|chown)\b.*-R.*\s\/(\s|$)/,/\bkill(all)?\s+-9\s+1\b/,/curl[^|;&]*\|\s*(ba|z|da)?sh\b/,/wget[^|;&]*\|\s*(ba|z|da)?sh\b/,/\blaunchctl\b|\bsystemctl\b/,/\bdefaults\s+write\b/,/>\s*\/dev\/(sd|disk)/],Ii=new Set([`status`,`log`,`diff`,`show`,`blame`,`rev-parse`,`ls-files`,`ls-tree`,`cat-file`,`describe`,`shortlog`,`grep`,`branch`,`stash`]);function Li(e){return e.match(/^\s*(?:ba|z|da)?sh\s+(?:-[a-zA-Z]+\s+)*(?:-c\s+)?(["'])([\s\S]*)\1\s*$/)?.[2]??e}function Ri(e){return e.trim().split(/\s+/).filter(Boolean)}function zi(e){let t=e.find((e,t)=>t>0&&!e.startsWith(`-`));if(!t)return{decision:`accept`,reason:`bare git`};if(t===`branch`&&e.some(e=>/^-(d|D|m|M|c|C|f|u)|^--(delete|move|copy|force|set-upstream)/.test(e)))return{decision:`decline`,reason:`git branch write operation (git is read-only for Coder)`};if(t===`stash`){let t=e.find((e,t)=>t>1&&!e.startsWith(`-`));return t===`list`||t===`show`?{decision:`accept`,reason:`git stash ${t} is read-only`}:{decision:`decline`,reason:`git stash write operation (git is read-only for Coder)`}}return Ii.has(t)?{decision:`accept`,reason:`git ${t} is read-only`}:Pi.has(t)?{decision:`decline`,reason:`git ${t} is a write operation (git is read-only for Coder)`}:{decision:`escalate`,reason:`unrecognized git subcommand: ${t}`}}function Bi(t,n={}){let r=Li(String(t??``));if(!r.trim())return{decision:`escalate`,reason:`empty command`};for(let e of Fi)if(e.test(r))return{decision:`decline`,reason:`matches hard-deny pattern ${e}`};if(/\$\(|`|<\(/.test(r))return{decision:`escalate`,reason:`contains command substitution`};let i=r.split(/&&|\|\||;|\||\r?\n/).map(e=>e.trim()).filter(Boolean);if(i.length>1){let e={decision:`accept`,reason:`all segments safe`};for(let t of i){let r=Bi(t,n);if(r.decision===`decline`)return r;r.decision===`escalate`&&(e=r)}return e}let a=Ri(r),o=e.basename(a[0]??``);if(o===`git`)return zi(a);let s=n.networkHost;return s?(n.allowedNetworkHosts??[]).some(e=>s===e||s.endsWith(`.${e}`))?{decision:`accept`,reason:`network host ${s} is allowlisted`}:{decision:`escalate`,reason:`network access to ${s}`}:{decision:`escalate`,reason:`command needs approval: ${o||`(unknown)`}`}}function Vi(t,n){if(!t.length)return{decision:`escalate`,reason:`file change with no resolvable paths`};for(let r of t){let t=e.resolve(n,r),i=e.relative(n,t);if(i.startsWith(`..`)||e.isAbsolute(i))return{decision:`escalate`,reason:`path outside workspace: ${r}`};if(i===`.git`||i.startsWith(`.git${e.sep}`))return{decision:`decline`,reason:`direct .git modification: ${r}`}}return{decision:`accept`,reason:`all paths inside workspace`}}function Hi(t){return e.join(t,`approvals`)}function Ui(t){let n=Hi(t);return i.existsSync(n)?i.readdirSync(n).filter(e=>e.endsWith(`.request.json`)).flatMap(t=>{let r=t.replace(/\.request\.json$/,``),i=m(e.join(n,t));if(!i)return[];let a=m(e.join(n,`${r}.response.json`));return[{...i,id:r,response:a}]}).sort((e,t)=>String(e.createdAt??``).localeCompare(String(t.createdAt??``))):[]}function Wi(t,n,r){let a=Hi(t),o=e.join(a,`${n}.request.json`);if(!i.existsSync(o))throw Error(`No pending approval "${n}" for this task.`);i.writeFileSync(e.join(a,`${n}.response.json`),`${JSON.stringify({decision:r,answeredAt:new Date().toISOString()},null,2)}\n`,`utf8`)}async function Gi(t,n,{timeoutMs:r,onEvent:a}){let o=Hi(t);i.mkdirSync(o,{recursive:!0});let s=`apr-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`;i.writeFileSync(e.join(o,`${s}.request.json`),`${JSON.stringify({...n,createdAt:new Date().toISOString()},null,2)}\n`,`utf8`),a?.({kind:`approval-escalated`,approvalId:s,summary:n.summary,message:`Approval needed (${s}): ${n.summary}. Answer with: coder task approve ${e.basename(t)} ${s} [--deny]`});let c=e.join(o,`${s}.response.json`),l=Date.now()+r;for(;Date.now()<l;){if(i.existsSync(c))try{let e=JSON.parse(i.readFileSync(c,`utf8`)).decision===`accept`?`accept`:`decline`;return a?.({kind:`approval-answered`,approvalId:s,decision:e}),e}catch{}await new Promise(e=>setTimeout(e,400))}return a?.({kind:`approval-timeout`,approvalId:s,message:`Approval ${s} timed out; declining.`}),`decline`}function Ki(e,t={}){return Gi(e,{method:`simulate`,summary:`simulated approval probe (--simulate-approval)`},{timeoutMs:t.timeoutMs??12e4,onEvent:t.onEvent??null})}function qi({workspaceRoot:e,taskDir:t,mode:n=`auto`,escalationTimeoutMs:r=12e4,allowedNetworkHosts:i=[],onEvent:a=null}){return async(o,s,c)=>{if(o===`item/commandExecution/requestApproval`){let l=c?.itemIndex?.get(s.itemId??``),u=s.command??l?.command??``,d=s.cwd??l?.cwd??e,f=`Run command. ${u||`Unknown command`}${s.reason?`. ${s.reason}`:``}`;if(n===`deny`)return a?.({kind:`approval-decision`,method:o,decision:`decline`,reason:`deny mode`,summary:f}),{decision:`decline`};let p=Bi(u,{networkHost:s.networkApprovalContext?.host??null,allowedNetworkHosts:i});return a?.({kind:`approval-decision`,method:o,decision:p.decision,reason:p.reason,summary:f}),p.decision===`escalate`?{decision:await Gi(t,{method:o,summary:f,command:u,cwd:d,params:s},{timeoutMs:r,onEvent:a})}:{decision:p.decision}}if(o===`item/fileChange/requestApproval`){let i=(c?.itemIndex?.get(s.itemId??``)?.changes??[]).map(e=>e.path).filter(e=>!!e),l=`Apply file changes. ${i.join(`, `)||`Unknown paths`}${s.reason?`. ${s.reason}`:``}`;if(n===`deny`)return a?.({kind:`approval-decision`,method:o,decision:`decline`,reason:`deny mode`,summary:l}),{decision:`decline`};let u=Vi(i,e);return a?.({kind:`approval-decision`,method:o,decision:u.decision,reason:u.reason,summary:l}),u.decision===`escalate`?{decision:await Gi(t,{method:o,summary:l,paths:i,params:s},{timeoutMs:r,onEvent:a})}:{decision:u.decision}}throw a?.({kind:`approval-unsupported`,method:o}),Error(`Coder does not handle server request ${o}; treating as denied.`)}}const Ji=/usage|quota|rate.?limit|429|401|unauthorized|not authenticated|login|insufficient|exhausted|not available|ENOENT/i;function Yi(e){return Ji.test(e)&&!Wn(e)}var Xi=class extends Error{engine;detail;constructor(e,t){super(t),this.engine=e,this.detail=t}};function Zi(e,t){let n=e.engine,r=!!n,i=e.model,a=e.effort,o=e=>{let n=e?t.models?.[e]:void 0;return n&&cn(n)?n:void 0},s=e=>{let n=e?t.models?.[e]:void 0;return n&&H(n)?n:void 0};if(o(i)){let e;try{e=Dn(i,t)}catch(e){throw new L(`invalid-option`,e instanceof Error?e.message:String(e))}e&&(r||(n=e.engine),i=e.model??void 0,a=a??e.effort??void 0)}if(!n&&i&&(i in B?n=`claude`:i in z?n=`codex`:s(i)?n=`custom`:/^(?:claude-|opus|sonnet|haiku|fable)/i.test(i)&&(n=`claude`)),n=n??t.chain[0]??`codex`,n!==`codex`&&n!==`claude`&&n!==`custom`){let e=n in z||n in B||n in(t.models??{})?` "${n}" is a model; use --model ${n}.`:``;throw new L(`invalid-option`,`Invalid --engine "${n}". Use codex, claude, or custom.${e}`)}let c=t.engines[n]??{},l=i??c.model??null,u=a??c.effort??null;if(o(l)){let e;try{e=Dn(l,t)}catch(e){throw new L(`invalid-option`,e instanceof Error?e.message:String(e))}e&&(r||(n=e.engine),l=e.model,u=a??e.effort??u)}let d=e.permissions??c.permissions??`auto`;try{En(t,l)}catch(e){throw new L(`invalid-option`,e instanceof Error?e.message:String(e))}if(n===`custom`){let e=Object.entries(t.models??{}).filter(([,e])=>H(e)).map(([e])=>e);if(!l&&e.length===1&&(l=e[0]),!l||!s(l))throw new L(`invalid-option`,l?`No custom model named "${l}". Configured: ${e.join(`, `)||`none`}.`:`No custom model to run: pass --model <name> or set engines.custom.model.`,{hint:`Add one: coder model add <name> --base-url <url> --model <id>`})}let f=n===`claude`;if(!(d in It))throw new L(`invalid-option`,`Invalid --permissions "${d}". Use one of: ${Object.keys(It).join(`, `)}`);if(!f&&u&&!Ft.has(u))throw new L(`invalid-option`,`Invalid codex --effort "${u}". Use one of: ${[...Ft].join(`, `)}`);if(f&&u&&!V.has(u))throw new L(`invalid-option`,`Invalid claude --effort "${u}". Use one of: ${[...V].join(`, `)}`);return{engine:n,model:l,effort:u,permissions:d}}const Qi=r.strictObject({name:r.string().check(r.minLength(1)),command:r.optional(r.string().check(r.minLength(1))),args:r.optional(r.array(r.string())),env:r.optional(r.record(r.string(),r.string())),url:r.optional(r.string().check(r.minLength(1))),type:r.optional(r.enum([`stdio`,`http`,`sse`])),headers:r.optional(r.record(r.string(),r.string())),tools:r.optional(r.array(r.string()))}).check(r.refine(e=>!!e.command!=!!e.url,`one of command or url`)),$i=r.array(Qi);function ea(e,t={}){let n=e.trim();return/^[\[{]/.test(n)?na(n):(n===`all`?Object.keys(t):n.split(`,`).map(e=>e.trim()).filter(Boolean)).map(e=>{let n=t[e];if(!n)throw new L(`invalid-option`,`Unknown MCP server "${e}".`,{hint:`configured: ${Object.keys(t).join(`, `)||`none`}; or pass a JSON array`});return{name:e,...n}})}function ta(e,t={},n={}){return typeof e==`string`&&!e.trim()&&(e=void 0),{mcp:typeof e==`string`?ea(e,{...t,...n}):e??Object.entries(n).map(([e,t])=>({name:e,...t})),nativeMcp:typeof e==`string`&&e.trim()===`all`}}function na(e){let t;try{t=JSON.parse(e)}catch(e){throw new L(`invalid-option`,`Invalid --mcp JSON: ${e instanceof Error?e.message:String(e)}`)}let n=$i.safeParse(t);if(!n.success)throw new L(`invalid-option`,`Invalid --mcp value: ${r.prettifyError(n.error)}`,{hint:`--mcp '[{"name":"docs","command":"npx","args":["-y","docs-mcp"],"tools":["search"]}]'`});return n.data}function ra(n,r=t.env,a){let o=e=>e.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\}/g,(e,t,n)=>r[t]??n??``),s=e=>Object.fromEntries(Object.entries(e).map(([e,t])=>[e,o(t)]));return(n??[]).map(t=>{let n={...t,...t.command?{command:o(t.command)}:{},...t.args?{args:t.args.map(o)}:{},...t.url?{url:o(t.url)}:{},...t.env?{env:s(t.env)}:{},...t.headers?{headers:s(t.headers)}:{}};if(!a||!n.command)return n;let c=(n.command.includes(e.sep)?[e.resolve(a,n.command)]:(n.env?.PATH??r.PATH??`/usr/bin:/bin`).split(e.delimiter).map(t=>e.resolve(a,t,n.command))).find(e=>{try{return i.accessSync(e,i.constants.X_OK),i.statSync(e).isFile()}catch{return!1}});if(!c)throw new L(`invalid-option`,`MCP server "${t.name}" command cannot be resolved.`);return n.command=i.realpathSync(c),n.args=n.args?.map(t=>{if(t.startsWith(`-`)||e.isAbsolute(t))return t;let n=e.resolve(a,t),r=i.existsSync(n)&&i.statSync(n).isFile();return!r&&!t.startsWith(`./`)&&!t.startsWith(`../`)?t:r?i.realpathSync(n):n}),n})}function ia(t,n=[]){let r=[...new Set(n.map(n=>e.resolve(t,n)))];for(let e of r)if(!i.statSync(e,{throwIfNoEntry:!1})?.isDirectory())throw new L(`invalid-option`,`--add-dir ${e} is not a directory.`);return r}function aa(e,t){return e===`read-only`&&zt.test(t??``)}const oa=[`read-only`,`workspace-write`,`auto`];function sa(e,t,n){if(!t)return n.permissions;if(oa.indexOf(t)>oa.indexOf(n.permissions))throw new L(`invalid-option`,`task "${e??`task`}" asks for ${t} but agent "${n.agent}" is ${n.permissions}: lower the task's permissions or raise the agent's`);return t}function ca(e){if(!e.resume)return e;let t=yt(e.cwd,e.resume);return t?{...e,cwd:e.cwdExplicit===!1?t.cwd??e.cwd:e.cwd,engine:e.engine??t.engine,model:e.model??t.model??void 0,effort:e.effort??t.effort??void 0,permissions:e.permissions??t.permissions??void 0,outputSchema:e.outputSchema??t.outputSchema}:e}function la(n,r){let a=N(n,r),s=i.openSync(e.join(a,`worker.log`),`a`),c=o(t.execPath,[w,`task`,`worker`,r,`--cwd`,n],{cwd:n,detached:!0,stdio:[`ignore`,s,s],env:{...t.env,CODER_WORKER:`1`}});c.unref(),i.closeSync(s),P(n,r,{pid:c.pid??null})}async function ua(t,n,r,i,a){let o=r.cwd,s=n.engine===`claude`?ri():Q(o),c=n.model?t.models?.[n.model]:void 0;if(!s.available&&c&&H(c)){let e=Di(s);r.onNote?.(e.note),s=Q(o)}if(!s.available)throw new Xi(n.engine,s.detail);let u=c?null:n.engine===`claude`?Ai(`claude`,n.model,s):Ai(`codex`,Cn(n.model),s);u&&r.onNote?.(u);let d=null,f=r.addDirs??[];if(i.resume){let e=yt(o,i.resume);d=e?.threadId??i.resume,f=[...new Set([...e?.addDirs??[],...f])]}let p=r.taskId??at(),h=P(o,p,{status:`queued`,...r.taskId?{dispatchId:l()}:{},kind:`task`,name:i.name??null,system:r.system??null,engine:n.engine,prompt:r.prompt,...r.outputSchema?{outputSchema:r.outputSchema}:{},model:n.model,effort:n.effort,permissions:n.permissions,resumeThreadId:d,cwd:o,background:!r.wait,...i.simulateApproval?{simulateApproval:!0}:{},...r.flowRunId?{flowRunId:r.flowRunId}:{},...r.agentId?{agentId:r.agentId}:{},...r.source?{source:r.source}:{},...r.author?{author:r.author}:{},...r.repo?{repo:r.repo}:{},...r.mcp?.length?{mcp:r.mcp}:{},nativeMcp:r.nativeMcp??!1,...f.length?{addDirs:f}:{}});if(la(o,p),!a)return{taskId:p,task:F(o,p)??h,engine:n.engine,startupCheck:`pending`};let g=2**53-1,_=new Set([`status`,`usage`]),v=()=>kt(o,p,g).filter(e=>{let{phase:t,kind:n}=e;return t!==`starting`&&!_.has(String(n??``))}).length,y=Date.now()+15e3,b=h,x=null,S=null;for(;Date.now()<(S??y)&&(b=F(o,p)??b,b.status!==`failed`&&b.status!==`completed`);){if(b.threadId&&x===null&&(x=v(),S=Date.now()+5e3),x!==null&&v()>x){b=F(o,p)??b;break}await new Promise(e=>setTimeout(e,150))}if(b.status===`failed`){let t=m(e.join(N(o,p),`result.json`))?.error?.message??``,r=kt(o,p,5).map(e=>e.message??``).join(`
14
+ `),i=t||r;throw aa(n.permissions,i)?new L(`read-only-unavailable`,i):Yi(i)?new Xi(n.engine,i):new L(`startup-failed`,i,{taskId:p})}return{taskId:p,task:b,engine:n.engine,startupCheck:b.threadId?`passed`:`pending`}}function da(e,t,n,r,i){return{error:`${e} failed to start: ${t}`,fallback:{action:`run-native-subagent`,reason:`no-engine-available`,permissions:n,instructions:`Mention the engine failure to the user, including any limit reset time. If your harness has a native subagent facility, spawn one subagent with fallback.task verbatim, prefixed with: "NEVER run git write operations (commit, checkout, stash, reset, push, etc.); leave changes uncommitted." If fallback.permissions is "read-only", append: "Investigate and report without modifying anything." If it is "workspace-write", append: "Never touch anything outside the workspace." Relay its output when it completes. If your harness has no native subagent facility, report the failure and stop; do not implement the task yourself.`,note:`Every coder engine failed to start. Spawn your own native subagent and forward the task verbatim; tell it to never run git write operations (commit, checkout, stash, reset, push, ...) and to honor the permissions.`,...r?{system:r}:{},task:i}}}async function fa(e,n={}){if(t.env.CODER_WORKER&&!n.fromMailbox)throw new L(`nested-dispatch`,`Nested dispatch is disabled inside a worker; do the work directly.`);if(e.outputSchema!==void 0&&(!e.outputSchema||typeof e.outputSchema!=`object`||Array.isArray(e.outputSchema)))throw new L(`invalid-option`,`outputSchema must be an object.`);if(!e.prompt.trim())throw new L(`invalid-option`,`Missing task text.`,{hint:[`Usage: coder run "<task text>"`,`Help: coder task run --help`]});e=ca(e),e={...e,addDirs:ia(e.cwd,e.addDirs)};let r=q(e.cwd),i=ta(e.mcp,r.mcp),a={...e,mcp:i.mcp,nativeMcp:e.nativeMcp??i.nativeMcp},o={engine:e.engine,model:e.model,effort:e.effort,permissions:e.permissions},s={name:e.name,resume:e.resume,simulateApproval:e.simulateApproval};for(;;){let t=Zi(o,r);try{return await ua(r,t,a,s,n.waitForStartup!==!1)}catch(n){if(!(n instanceof Xi))throw n;let i=r.chain[r.chain.indexOf(n.engine)+1];if(!i){let r=da(n.engine,n.detail,t.permissions,e.system,e.prompt);throw new L(`chain-exhausted`,r.error,{payload:r})}e.onFallback?.({engine:n.engine,detail:n.detail,next:i}),o={engine:i,permissions:e.permissions},s={name:void 0,resume:void 0,simulateApproval:void 0}}}}function pa(e,t){if(t.status!==`failed`)return;let n=t.result;if(!n||!Yi(n.error?.message??``)||!(!n.touchedFiles?.length&&!n.fileChanges?.length&&!n.commandExecutions?.length))return;let r=q(e).chain;return r[r.indexOf(t.task.engine)+1]}function ma(t,n){return m(e.join(N(t,n),`result.json`))}function ha(e,t,n=0){if(n===0)return[];let r=kt(e,t,2**53-1);return n===`all`?r:Ot(r,n)}function ga(e,t,n={}){let r=F(e,t);if(!r)throw Error(`No task found for "${t}".`);return{taskId:t,status:r.status,result:Ve.includes(r.status)?null:ma(e,t),steps:ha(e,t,n.tail),turns:Dt(e,t),task:r}}async function _a(e,t,n={}){let r=F(e,t);if(!r)throw Error(`No task found for "${t}".`);let i=await va(e,r);if(i.reason===`approval`){let e=i.approval;throw new L(`approval-pending`,`Approval needed for task ${t}: ${e.summary}`,{taskId:t,approval:e})}n.onSettle?.();let a=i.task;return{taskId:t,status:a.status,result:ma(e,t),steps:ha(e,t,n.tail),turns:Dt(e,t),task:a}}async function va(e,t,n=400){let r=t;for(;;){if(Be.includes(r.status))return{task:r,reason:`terminal`};let t=Ui(N(e,r.id)).filter(e=>!e.response);if(t[0]){let e=t[0].params;return{task:r,reason:`approval`,approval:{id:t[0].id,summary:String(t[0].summary??``),cwd:typeof t[0].cwd==`string`?t[0].cwd:null,networkHost:e?.networkApprovalContext?.host??null}}}await new Promise(e=>setTimeout(e,n)),r=I(e,F(e,r.id)??r)}}export{cn as $,qe as $t,Q as A,_ as An,We as At,nr as B,vt as Bt,Di as C,w as Cn,L as Ct,xi as D,x as Dn,Et as Dt,bi as E,ee as En,jt as Et,Yn as F,yt as Ft,Rt as G,_t as Gt,Un as H,F as Ht,rr as I,At as It,It as J,Dt as Jt,Ft as K,gt as Kt,tr as L,at as Lt,Jr as M,p as Mn,O as Mt,qr as N,h as Nn,D as Nt,pi as O,v as On,et as Ot,cr as P,wt as Pt,xn as Q,Ge as Qt,$n as R,Ue as Rt,Ki as S,ce as Sn,Nt as St,Ni as T,T as Tn,Mt as Tt,V as U,tt as Ut,Jn as V,ht as Vt,B as W,lt as Wt,jn as X,st as Xt,gn as Y,I as Yt,Mn as Z,M as Zt,qi as _,be as _n,U as _t,Yi as a,Ye as an,an as at,Gi as b,Ne as bn,On as bt,ra as c,ft as cn,vn as ct,la as d,St as dn,fn as dt,Ke as en,wn as et,pa as f,P as fn,Cn as ft,Wi as g,Se as gn,K as gt,ca as h,ze as hn,G as ht,aa as i,Je as in,Rn as it,Kr as j,m as jn,Tt as jt,fi as k,g as kn,nt as kt,Zi as l,bt as ln,Dn as lt,_a as m,Be as mn,Sn as mt,sa as n,A as nn,q as nt,ma as o,k as on,zn as ot,va as p,Ve as pn,ln as pt,z as q,kt as qt,fa as r,N as rn,Ln as rt,ga as s,Ot as sn,Bn as st,da as t,Xe as tn,H as tt,ta as u,it as un,yn as ut,Bi as v,xe as vn,mn as vt,Mi as w,C as wn,$e as wt,Ui as x,ye as xn,Pt as xt,Vi as y,Ce as yn,Nn as yt,Zn as z,xt as zt};
@@ -1,2 +1,2 @@
1
- import{i as e}from"./cli-DWCR7iqa.js";import{g as t,p as n,s as r}from"./output-BKeyLbvt.js";import{n as i}from"./args-BOEEdpWk.js";import{t as a}from"./docs-BX65z2Iu.js";import o from"node:process";const s=e({name:`docs`,globalFlags:{cwd:!1},help:{usage:`coder docs [topic] [--json]`,summary:"Print bundled documentation. With no topic, list the available topics; with a\ntopic, print that doc's raw markdown to stdout (unstyled, for an agent to\nconsume). Topics with sub-pages list them as `<topic>/<page>` (also accepted as\n`<topic>-<page>`). `coder docs skill` prints the host skill so an engine can\nload it once per session (--claude for the Claude Code flavor).",flags:[[`--claude`,`with the skill topic: print the Claude Code flavor`]],examples:[[`coder docs`,`list the available topics`],[`coder docs flows`,`print the Flows doc`],[`coder docs review`,`print the Review doc`]]},options:{json:i,claude:i},args:1,run:({options:e,args:[t]})=>a(t,e),print:e=>o.stdout.write(`content`in e?e.content.endsWith(`
1
+ import{i as e}from"./cli-B1ObVrL4.js";import{g as t,p as n,s as r}from"./output-BKeyLbvt.js";import{n as i}from"./args-DcBCtXhz.js";import{t as a}from"./docs-DKROso-4.js";import o from"node:process";const s=e({name:`docs`,globalFlags:{cwd:!1},help:{usage:`coder docs [topic] [--json]`,summary:"Print bundled documentation. With no topic, list the available topics; with a\ntopic, print that doc's raw markdown to stdout (unstyled, for an agent to\nconsume). Topics with sub-pages list them as `<topic>/<page>` (also accepted as\n`<topic>-<page>`). `coder docs skill` prints the host skill so an engine can\nload it once per session (--claude for the Claude Code flavor).",flags:[[`--claude`,`with the skill topic: print the Claude Code flavor`]],examples:[[`coder docs`,`list the available topics`],[`coder docs flows`,`print the Flows doc`],[`coder docs review`,`print the Review doc`]]},options:{json:i,claude:i},args:1,run:({options:e,args:[t]})=>a(t,e),print:e=>o.stdout.write(`content`in e?e.content.endsWith(`
2
2
  `)?e.content:`${e.content}\n`:c(e.topics))});function c(e){let i=n,a=e=>e.includes(`/`)?` ${e}`:e;return t([{header:`topic`,value:e=>a(e.name),paint:e=>i.cyan(e)},{header:`about`,value:e=>e.description,paint:e=>i.light(e)}],e,i)+`\n${r([`Read a topic: coder docs <topic>`],i)}\n`}export{s as commandDocs};
@@ -1,2 +1,2 @@
1
- import{xn as e,xt as t}from"./dispatch-BKeAch9E.js";import n from"node:path";import r from"node:fs";const i=[{name:`readme`,file:`README.md`,description:`What Coder is and how to get started.`},{name:`skill`,file:`plugins/agents/skills/coder/SKILL.md`,description:`How a host agent should drive Coder.`}];function a(e){let t=n.join(e,`docs`),a=[];try{a=r.readdirSync(t,{withFileTypes:!0})}catch{a=[]}let c=(t,r)=>({name:t,file:r,description:s(n.join(e,r))}),l=[...new Set(a.filter(e=>e.isDirectory()?o(n.join(t,e.name)):e.name.endsWith(`.md`)).map(e=>e.isDirectory()?e.name:n.basename(e.name,`.md`)))].sort(),u=[];for(let e of l){let i=n.join(t,e);if(!a.some(t=>t.isDirectory()&&t.name===e)){u.push(c(e,n.join(`docs`,`${e}.md`)));continue}u.push(c(e,n.join(`docs`,e,`index.md`)));let o=r.readdirSync(i).filter(e=>e.endsWith(`.md`)&&e!==`index.md`).sort();for(let t of o){let r=n.basename(t,`.md`);u.push(c(`${e}/${r}`,n.join(`docs`,e,t)))}}let d=i.map(e=>({name:e.name,file:e.file,description:e.description}));return[...u,...d]}function o(e){return r.existsSync(n.join(e,`index.md`))}function s(e){let t=``;try{t=r.readFileSync(e,`utf8`)}catch{return``}let n=t.split(`
2
- `),i=``,a=``,o=!1;for(let e of n){let t=e.trim();if(t.startsWith("```")){o=!o;continue}if(!(o||t===``)){if(t.startsWith(`#`)){i||=t.replace(/^#+\s*/,``);continue}a=t;break}}return c(a)||i}function c(e){if(!e)return``;let t=e.match(/^.*?[.!?](?=\s|$)/);return(t?t[0]:e).trim()}function l(i,o={}){let s=e(),c=a(s);if(!i)return{topics:c.map(e=>({name:e.name,description:e.description}))};let l=i.toLowerCase(),u=c.find(e=>{let t=e.name.toLowerCase();return t===l||t.replace(`/`,`-`)===l});if(u?.name===`skill`&&o.claude&&(u={...u,file:`plugins/claude/skills/dispatch/SKILL.md`}),!u)throw new t(`invalid-option`,`Unknown docs topic "${i}". Available: ${c.map(e=>e.name).join(`, `)}`,{hint:`List topics: coder docs`});let d=n.join(s,u.file),f;try{f=r.readFileSync(d,`utf8`)}catch{throw new t(`invalid-option`,`Could not read docs for "${u.name}" (${u.file}).`)}return{name:u.name,content:f}}export{l as t};
1
+ import{Ct as e,En as t}from"./dispatch-BsW_1m7e.js";import n from"node:path";import r from"node:fs";const i=[{name:`readme`,file:`README.md`,description:`What Coder is and how to get started.`},{name:`skill`,file:`plugins/agents/skills/coder/SKILL.md`,description:`How a host agent should drive Coder.`}];function a(e){let t=n.join(e,`docs`),a=[];try{a=r.readdirSync(t,{withFileTypes:!0})}catch{a=[]}let c=(t,r)=>({name:t,file:r,description:s(n.join(e,r))}),l=[...new Set(a.filter(e=>e.isDirectory()?o(n.join(t,e.name)):e.name.endsWith(`.md`)).map(e=>e.isDirectory()?e.name:n.basename(e.name,`.md`)))].sort(),u=[];for(let e of l){let i=n.join(t,e);if(!a.some(t=>t.isDirectory()&&t.name===e)){u.push(c(e,n.join(`docs`,`${e}.md`)));continue}u.push(c(e,n.join(`docs`,e,`index.md`)));let o=r.readdirSync(i).filter(e=>e.endsWith(`.md`)&&e!==`index.md`).sort();for(let t of o){let r=n.basename(t,`.md`);u.push(c(`${e}/${r}`,n.join(`docs`,e,t)))}}let d=i.map(e=>({name:e.name,file:e.file,description:e.description}));return[...u,...d]}function o(e){return r.existsSync(n.join(e,`index.md`))}function s(e){let t=``;try{t=r.readFileSync(e,`utf8`)}catch{return``}let n=t.split(`
2
+ `),i=``,a=``,o=!1;for(let e of n){let t=e.trim();if(t.startsWith("```")){o=!o;continue}if(!(o||t===``)){if(t.startsWith(`#`)){i||=t.replace(/^#+\s*/,``);continue}a=t;break}}return c(a)||i}function c(e){if(!e)return``;let t=e.match(/^.*?[.!?](?=\s|$)/);return(t?t[0]:e).trim()}function l(i,o={}){let s=t(),c=a(s);if(!i)return{topics:c.map(e=>({name:e.name,description:e.description}))};let l=i.toLowerCase(),u=c.find(e=>{let t=e.name.toLowerCase();return t===l||t.replace(`/`,`-`)===l});if(u?.name===`skill`&&o.claude&&(u={...u,file:`plugins/claude/skills/dispatch/SKILL.md`}),!u)throw new e(`invalid-option`,`Unknown docs topic "${i}". Available: ${c.map(e=>e.name).join(`, `)}`,{hint:`List topics: coder docs`});let d=n.join(s,u.file),f;try{f=r.readFileSync(d,`utf8`)}catch{throw new e(`invalid-option`,`Could not read docs for "${u.name}" (${u.file}).`)}return{name:u.name,content:f}}export{l as t};
@@ -1 +1 @@
1
- import{toggle as e}from"./disable-BMWWeYFQ.js";const t=e(!1,{usage:`coder model enable <name> [--workspace]`,summary:`Re-enable a disabled model.`,flags:[[`--workspace`,`target <repo>/.coder/config.json instead of the user file`]]});export{t as commandModelEnable};
1
+ import{toggle as e}from"./disable-DQC56YFy.js";const t=e(!1,{usage:`coder model enable <name> [--workspace]`,summary:`Re-enable a disabled model.`,flags:[[`--workspace`,`target <repo>/.coder/config.json instead of the user file`]]});export{t as commandModelEnable};
@@ -1 +1 @@
1
- import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{gn as t,xt as n}from"./dispatch-BKeAch9E.js";import r from"node:path";import i from"node:process";import*as a from"zod/mini";import o from"node:os";var s=e({loadServerConfig:()=>g,requireBunServer:()=>v,rerunUnderBun:()=>y});const c=e=>a._default(a.coerce.number().check(a.int(),a.positive()),e),l=a.pipe(a.optional(a.string()),a.transform(e=>e===`1`)),u=(e,t)=>a.string().check(a.overwrite(e=>e.replace(/\/$/,``)),a.refine(e=>URL.canParse(e),{error:`must be a URL`,abort:!0}),a.refine(t=>e(new URL(t)),t)),d=e=>a.pipe(a.transform(e=>e||void 0),e),f=a.pipe(a.string(),a.transform((e,t)=>{try{let t=JSON.parse(e);if(t&&!Array.isArray(t)&&typeof t==`object`)return t}catch{}return t.issues.push({code:`custom`,message:`must be a JSON object`,input:e}),a.NEVER})),p=a.object({AUTH_WULAR_URL:a._default(u(e=>e.protocol===`https:`||e.hostname===`localhost`,`must use HTTPS unless it is localhost`),`https://auth.wular.ai`)}),m=a.object({SERVER_LIMITS:d(a.optional(a.pipe(f,a.strictObject({principalPerMinute:a.optional(a.number().check(a.int(),a.positive())),authPerMinute:a.optional(a.number().check(a.int(),a.positive())),registerPerMinute:a.optional(a.number().check(a.int(),a.positive())),ipPerMinute:a.optional(a.number().check(a.int(),a.positive())),pairingPerMinute:a.optional(a.number().check(a.int(),a.positive())),concurrentTasks:a.optional(a.number().check(a.int(),a.positive()))})))),RUNNER:a.optional(a.enum([`local`,`local-docker`,`vercel-sandbox`,`github-actions`,`http`])),RUNNER_CONFIG:d(a._default(f,{})),WORK_DIR:a.optional(a.string()),SERVER_ENCRYPTION_KEY:a.optional(a.string()),SERVER_ENCRYPTION_KEY_PREVIOUS:a.optional(a.string()),ADMIN_TOKEN:a.optional(a.string()),PUBLIC_URL:d(a.optional(u(e=>e.pathname===`/`&&!e.search&&!e.hash,`must be an origin, with no path, query or fragment`))),SERVER_NAME:a.optional(a.string().check(a.trim())),VERCEL_PROJECT_PRODUCTION_URL:a.optional(a.string()),VERCEL_URL:a.optional(a.string()),VERCEL:a.optional(a.string()),DATABASE_URL:a.optional(a.string()),POSTGRES_URL:a.optional(a.string()),DATABASE_POOL_MAX:a.optional(a.coerce.number().check(a.int(),a.positive())),DATABASE_IDLE_TIMEOUT:a.optional(a.coerce.number().check(a.int(),a.positive())),MAX_TASKS:a.optional(a.coerce.number().check(a.int(),a.positive())),MAX_QUEUED:c(1e3),TASK_STALL:c(3e5),TASK_ATTEMPTS:c(2),TASK_TIMEOUT:c(18e5),CLAUDE_SUBSCRIPTIONS:l,CODEX_SUBSCRIPTIONS:l,SERVER_INTEGRATIONS:d(a.optional(a.string()))});function h(e,t){let r=e.safeParse(t);if(r.success)return r.data;let i=r.error.issues[0];throw new n(`invalid-option`,`Invalid server configuration:${String(i.path[0])} ${i.message}`)}function g(e=i.env,t=`node`){let a=h(m,e),s=a.DATABASE_URL??a.POSTGRES_URL,c=s?`postgres`:`memory`;if(c===`postgres`&&!a.SERVER_ENCRYPTION_KEY)throw new n(`invalid-option`,`SERVER_ENCRYPTION_KEY is required with DATABASE_URL`);let l=t===`vercel`?a.VERCEL_PROJECT_PRODUCTION_URL??a.VERCEL_URL:void 0,u=a.PUBLIC_URL??(l?`https://${l}`:void 0),d=c===`postgres`?h(p,e).AUTH_WULAR_URL:void 0;return{runner:a.RUNNER??(t===`vercel`||a.VERCEL?`vercel-sandbox`:`local`),store:c,workDir:a.WORK_DIR??r.join(o.tmpdir(),`coder`),...a.SERVER_ENCRYPTION_KEY?{encryptionKey:a.SERVER_ENCRYPTION_KEY}:{},...a.SERVER_ENCRYPTION_KEY_PREVIOUS?{previousEncryptionKey:a.SERVER_ENCRYPTION_KEY_PREVIOUS}:{},...a.ADMIN_TOKEN?{adminToken:a.ADMIN_TOKEN}:{},...u?{publicUrl:u}:{},...a.SERVER_NAME?{name:a.SERVER_NAME}:{},...s?{databaseUrl:s,databasePool:{max:a.DATABASE_POOL_MAX??(t===`vercel`||a.VERCEL?2:10),idleTimeout:a.DATABASE_IDLE_TIMEOUT??(t===`vercel`||a.VERCEL?30:240)}}:{},runnerConfig:a.RUNNER_CONFIG,maxTasks:a.MAX_TASKS,limits:a.SERVER_LIMITS,maxQueued:a.MAX_QUEUED,taskTimeoutMs:a.TASK_TIMEOUT,taskStallMs:a.TASK_STALL,taskAttempts:a.TASK_ATTEMPTS,...a.CLAUDE_SUBSCRIPTIONS||a.CODEX_SUBSCRIPTIONS?{subscriptions:{claude:a.CLAUDE_SUBSCRIPTIONS,codex:a.CODEX_SUBSCRIPTIONS}}:{},...d?{auth:{wular:{url:d}}}:{},...a.SERVER_INTEGRATIONS?{integrations:a.SERVER_INTEGRATIONS.split(`,`).map(e=>e.trim()).filter(Boolean)}:{}}}function _(){return new n(`invalid-option`,`The Coder server needs Bun; the CLI itself runs on Node.`,{hint:[i.platform===`win32`?`Install Bun: powershell -c "irm bun.sh/install.ps1 | iex"`:`Install Bun: curl -fsSL https://bun.sh/install | bash`,`Or with npm: npm install -g bun`,`Then run the command again. More: https://bun.sh/docs/installation`]})}function v(){if(typeof Bun>`u`)throw _()}async function y(){if(typeof Bun<`u`)return;let e=i.platform===`win32`?[`bun.exe`,`bun.cmd`,`bun`]:[`bun`];for(let n of e){let e=await t(n);if(e.error?.code!==`ENOENT`&&e.error?.code!==`EINVAL`){if(e.error)throw e.error;if(e.signal){let t=o.constants.signals[e.signal];i.exit(typeof t==`number`?128+t:1)}i.exit(e.status??1)}}throw _()}export{g as n,v as r,s as t};
1
+ import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{Ct as t,xn as n}from"./dispatch-BsW_1m7e.js";import r from"node:path";import i from"node:process";import*as a from"zod/mini";import o from"node:os";var s=e({loadServerConfig:()=>g,requireBunServer:()=>v,rerunUnderBun:()=>y});const c=e=>a._default(a.coerce.number().check(a.int(),a.positive()),e),l=a.pipe(a.optional(a.string()),a.transform(e=>e===`1`)),u=(e,t)=>a.string().check(a.overwrite(e=>e.replace(/\/$/,``)),a.refine(e=>URL.canParse(e),{error:`must be a URL`,abort:!0}),a.refine(t=>e(new URL(t)),t)),d=e=>a.pipe(a.transform(e=>e||void 0),e),f=a.pipe(a.string(),a.transform((e,t)=>{try{let t=JSON.parse(e);if(t&&!Array.isArray(t)&&typeof t==`object`)return t}catch{}return t.issues.push({code:`custom`,message:`must be a JSON object`,input:e}),a.NEVER})),p=a.object({AUTH_WULAR_URL:a._default(u(e=>e.protocol===`https:`||e.hostname===`localhost`,`must use HTTPS unless it is localhost`),`https://auth.wular.ai`)}),m=a.object({SERVER_LIMITS:d(a.optional(a.pipe(f,a.strictObject({principalPerMinute:a.optional(a.number().check(a.int(),a.positive())),authPerMinute:a.optional(a.number().check(a.int(),a.positive())),registerPerMinute:a.optional(a.number().check(a.int(),a.positive())),ipPerMinute:a.optional(a.number().check(a.int(),a.positive())),pairingPerMinute:a.optional(a.number().check(a.int(),a.positive())),concurrentTasks:a.optional(a.number().check(a.int(),a.positive()))})))),RUNNER:a.optional(a.enum([`local`,`local-docker`,`vercel-sandbox`,`github-actions`,`http`])),RUNNER_CONFIG:d(a._default(f,{})),WORK_DIR:a.optional(a.string()),SERVER_ENCRYPTION_KEY:a.optional(a.string()),SERVER_ENCRYPTION_KEY_PREVIOUS:a.optional(a.string()),ADMIN_TOKEN:a.optional(a.string()),PUBLIC_URL:d(a.optional(u(e=>e.pathname===`/`&&!e.search&&!e.hash,`must be an origin, with no path, query or fragment`))),SERVER_NAME:a.optional(a.string().check(a.trim())),VERCEL_PROJECT_PRODUCTION_URL:a.optional(a.string()),VERCEL_URL:a.optional(a.string()),VERCEL:a.optional(a.string()),DATABASE_URL:a.optional(a.string()),POSTGRES_URL:a.optional(a.string()),DATABASE_POOL_MAX:a.optional(a.coerce.number().check(a.int(),a.positive())),DATABASE_IDLE_TIMEOUT:a.optional(a.coerce.number().check(a.int(),a.positive())),MAX_TASKS:a.optional(a.coerce.number().check(a.int(),a.positive())),MAX_QUEUED:c(1e3),TASK_STALL:c(3e5),TASK_ATTEMPTS:c(2),TASK_TIMEOUT:c(18e5),CLAUDE_SUBSCRIPTIONS:l,CODEX_SUBSCRIPTIONS:l,SERVER_INTEGRATIONS:d(a.optional(a.string()))});function h(e,n){let r=e.safeParse(n);if(r.success)return r.data;let i=r.error.issues[0];throw new t(`invalid-option`,`Invalid server configuration:${String(i.path[0])} ${i.message}`)}function g(e=i.env,n=`node`){let a=h(m,e),s=a.DATABASE_URL??a.POSTGRES_URL,c=s?`postgres`:`memory`;if(c===`postgres`&&!a.SERVER_ENCRYPTION_KEY)throw new t(`invalid-option`,`SERVER_ENCRYPTION_KEY is required with DATABASE_URL`);let l=n===`vercel`?a.VERCEL_PROJECT_PRODUCTION_URL??a.VERCEL_URL:void 0,u=a.PUBLIC_URL??(l?`https://${l}`:void 0),d=c===`postgres`?h(p,e).AUTH_WULAR_URL:void 0;return{runner:a.RUNNER??(n===`vercel`||a.VERCEL?`vercel-sandbox`:`local`),store:c,workDir:a.WORK_DIR??r.join(o.tmpdir(),`coder`),...a.SERVER_ENCRYPTION_KEY?{encryptionKey:a.SERVER_ENCRYPTION_KEY}:{},...a.SERVER_ENCRYPTION_KEY_PREVIOUS?{previousEncryptionKey:a.SERVER_ENCRYPTION_KEY_PREVIOUS}:{},...a.ADMIN_TOKEN?{adminToken:a.ADMIN_TOKEN}:{},...u?{publicUrl:u}:{},...a.SERVER_NAME?{name:a.SERVER_NAME}:{},...s?{databaseUrl:s,databasePool:{max:a.DATABASE_POOL_MAX??(n===`vercel`||a.VERCEL?2:10),idleTimeout:a.DATABASE_IDLE_TIMEOUT??(n===`vercel`||a.VERCEL?30:240)}}:{},runnerConfig:a.RUNNER_CONFIG,maxTasks:a.MAX_TASKS,limits:a.SERVER_LIMITS,maxQueued:a.MAX_QUEUED,taskTimeoutMs:a.TASK_TIMEOUT,taskStallMs:a.TASK_STALL,taskAttempts:a.TASK_ATTEMPTS,...a.CLAUDE_SUBSCRIPTIONS||a.CODEX_SUBSCRIPTIONS?{subscriptions:{claude:a.CLAUDE_SUBSCRIPTIONS,codex:a.CODEX_SUBSCRIPTIONS}}:{},...d?{auth:{wular:{url:d}}}:{},...a.SERVER_INTEGRATIONS?{integrations:a.SERVER_INTEGRATIONS.split(`,`).map(e=>e.trim()).filter(Boolean)}:{}}}function _(){return new t(`invalid-option`,`The Coder server needs Bun; the CLI itself runs on Node.`,{hint:[i.platform===`win32`?`Install Bun: powershell -c "irm bun.sh/install.ps1 | iex"`:`Install Bun: curl -fsSL https://bun.sh/install | bash`,`Or with npm: npm install -g bun`,`Then run the command again. More: https://bun.sh/docs/installation`]})}function v(){if(typeof Bun>`u`)throw _()}async function y(){if(typeof Bun<`u`)return;let e=i.platform===`win32`?[`bun.exe`,`bun.cmd`,`bun`]:[`bun`];for(let t of e){let e=await n(t);if(e.error?.code!==`ENOENT`&&e.error?.code!==`EINVAL`){if(e.error)throw e.error;if(e.signal){let t=o.constants.signals[e.signal];i.exit(typeof t==`number`?128+t:1)}i.exit(e.status??1)}}throw _()}export{g as n,v as r,s as t};
@@ -0,0 +1,11 @@
1
+ import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{B as t,Ct as n,I as r,c as i,f as a,l as o,m as s,n as c,nt as l,r as u,u as d}from"./dispatch-BsW_1m7e.js";import{a as f,f as p,o as m}from"./load-SnZd7xG1.js";import{t as h}from"./integrations-B2CavXR1.js";import{a as g}from"./discover-Qanr5TEO.js";import{n as _}from"./executor-vMppVLB6.js";import{REVIEW_PLATFORM as v,postReview as y,resolveReviewTarget as b}from"./flow/builtin/review.js";import{a as x,i as S,n as C,r as w}from"./mcp-CmcL1MCG.js";import T from"node:path";import E from"node:process";import{readFileSync as D,readdirSync as O,realpathSync as k}from"node:fs";import A from"node:os";import j from"node:fs/promises";var M=e({AGENT_TASK_PREFIX:()=>N,agentInstructions:()=>G,agentSystemPrompt:()=>W,agentTaskOptions:()=>H,builtinArgs:()=>V,builtinTaskArgs:()=>z,defaultTask:()=>X,execAgent:()=>L,postReply:()=>F,renderContext:()=>J,startAgentMailbox:()=>Z,taskFromEvent:()=>P,waitForAgentTask:()=>R});const N=`agent:`;function P(e,t,n){let r=h[n.integration];return{id:`local-${n.deliveryId}-${e.id}`,source:n.integration,agent:e.id,flow:t,runner:`local`,event:n,definition:e.definition,...e.usage?{usage:e.usage}:{},tools:r?{[n.integration]:p(e,n.integration,r)}:{}}}async function F(e,t,n,r,i=e.id){if(!t.chat)throw Error(`The ${t.integration} event has no thread to reply in`);let[{Chat:a},{LocalChatState:o}]=await Promise.all([import(`chat`),import(`./chat-3Znsevah.js`).then(e=>e.r)]),s=await e.adapter({fetch,appId:t.appId.slice(e.id.length+1),name:i,installationId:t.installationId,token:async()=>r}),c=new a({userName:i,adapters:{[e.id]:s},state:new o,logger:`error`});await c.initialize();let l=c.thread(t.chat.thread.id);s.reply&&t.chat.message?.id?await l.reply(t.chat.message.id,n):await l.post(n)}function I(e,t){return Object.fromEntries(Object.keys(e.tools).map(n=>[n,t[S(n)]??(n===e.event?.integration?t.APP_TOKEN:void 0)]))}async function L(e){let{cwd:t,flow:n}=e,r=l(t),i=await f(t,h),a=e.task;!a&&e.taskFile&&(a={...JSON.parse(await j.readFile(T.resolve(t,e.taskFile),`utf8`)),flow:n});let s=i.find(t=>t.id===e.agent);if(!s&&a&&(s={id:a.agent,name:a.definition.name??a.agent,definition:a.definition,...a.usage?{usage:a.usage}:{},...a.files?{files:a.files}:{},builtin:!1}),!s)throw Error(`No agent named "${e.agent}".`);a??=await B(t,s,n,e);let c=a.event,p=c&&h[c.integration];if(c&&!p)throw Error(`Unknown integration "${c.integration}".`);if(n==="default"){let i=X(s,a),l=e.noteFile?void 0:await j.mkdtemp(T.join(A.tmpdir(),`coder-note-`)),f=e.noteFile??T.join(l,`note`);e.noteFile||await j.writeFile(f,a.context?.note??``);let h=o(m(s),r),g=d(a.mcp?.join(`,`),r.mcp,s.definition.mcp),_=[...w(a,e.toolEnvironment?.tokens??I(a,E.env)),C(f),...g.mcp],v=e.resumeTaskId?{taskId:e.resumeTaskId}:await u({taskId:e.taskId,mcp:_,nativeMcp:g.nativeMcp,cwd:t,agentId:a.agent,...a.author?{author:a.author}:{},...c?.repo?{repo:`${c.repo.owner}/${c.repo.name}`}:{},...e.source?{source:e.source}:{name:`${N}${a.id}`},engine:h.engine,model:h.model??void 0,effort:h.effort??void 0,permissions:a.permissions??h.permissions,system:i.system,prompt:i.prompt,outputSchema:a.context?.outputSchema,wait:!0});await e.onTask?.(v.taskId);let y=await R(t,v.taskId,e.onApproval),b=(y.result?.finalMessage??y.result?.error?.message??``).trim(),x=(await j.readFile(f,`utf8`).catch(()=>``)).trim();l&&await j.rm(l,{recursive:!0,force:!0});let S=e.post!==!1&&!!p;return S&&await F(p,c,b,e.postToken??E.env.APP_TOKEN,a.author),{ok:y.status===`completed`,flow:n,reply:b,posted:S,taskId:v.taskId,tokens:y.result?.tokens??void 0,...x===(a.context?.note??``).trim()?{}:{note:x}}}let v=g(n,t),y=v.scope===`builtin`?{...await z(a,s,e.post!==!1),cwd:t,...a.args}:a.args??c,b=await _(v.path,{cwd:t,...e.taskId?{runId:e.taskId}:{},args:y,ceiling:{agent:s.id,permissions:a.permissions??o(m(s),r).permissions},...e.postToken?{integrationToken:e.postToken}:{}},{...e.onTask?{onTaskStart:t=>e.onTask(t.taskId)}:{},...e.onStart?{onStart:e.onStart}:{}});return{ok:!0,flow:n,runId:b.runId,result:b.result,tokens:b.tokens}}async function R(e,t,r,i=s,a=()=>new Promise(e=>setTimeout(e,100))){let o;for(;;)try{return await i(e,t)}catch(e){if(!(e instanceof n)||e.code!==`approval-pending`||!r)throw e;e.approval?.id!==o&&(o=e.approval?.id,await r(e.approval)),await a()}}async function z(e,t,n=!0){if(!e.event)throw Error(`built-in flows need a GitHub pull request event`);return{...await V(e.event,t,e.context,e.author,n),...m(t),...e.permissions?{permissions:e.permissions}:{}}}async function B(e,t,n,r){if(r.taskFile){let t=JSON.parse(await j.readFile(T.resolve(e,r.taskFile),`utf8`));return{...t,flow:n,tools:t.tools??{}}}if(!r.eventFile)throw Error(`Missing --task or --event file.`);return P(t,n,JSON.parse(await j.readFile(T.resolve(e,r.eventFile),`utf8`)))}function V(e,t,n,r,i=!0){let a=h[e.integration]?.repos?.pullRequest(e);if(!a)throw Error(`built-in flows need a pull request event`);return{pr:a,post:i,...r?{author:r}:{}}}async function H(e,t,r){let i=await f(e,h),a=i.find(e=>e.id===t);if(!a)throw new n(`invalid-option`,`No agent named "${t}".`,{hint:`Agents here: ${i.map(e=>e.id).join(`, `)}`});let{definition:o,usage:s}=a,c=o.mcp??{},u=d(r,l(e).mcp,c);return{engine:s?.engine??o.engine,model:s?.model??o.model,effort:s?.effort??o.effort,permissions:s?.permissions??o.permissions,system:G(a)||void 0,...u}}const U=48e3;function W(e){let t=[`You are an agent named "{name}" acting on behalf of a software team. You receive one request, a platform event or a task, and must produce the reply that goes back to its thread verbatim. Be direct and specific, use the attached tools to read context before answering, never invent facts about the repository, and stay within the actions your tools allow. Reply in plain markdown with no preamble.`.replace(`{name}`,e.definition.name??e.id)];e.definition.description&&t.push(`Your role: ${e.definition.description}`);let n=G(e);return n&&t.push(`## Agent instructions\n\n${n}`),t.join(`
2
+
3
+ `)}function G(e){if(!e.dir)return K(e.files??{});let t;try{t=O(e.dir).filter(e=>e.endsWith(`.md`))}catch{return``}t.sort((e,t)=>e===`system.md`?-1:t===`system.md`?1:e.localeCompare(t));let n=``;for(let r of t){let t=`### ${r}\n\n${D(T.join(e.dir,r),`utf8`).trim()}\n`;if(n+=t.slice(0,U-n.length),n.length===U)break}return n.trimEnd()}function K(e){let t=Object.keys(e).filter(e=>e.endsWith(`.md`));t.sort((e,t)=>e===`system.md`?-1:t===`system.md`?1:e.localeCompare(t));let n=``;for(let r of t){let t=`### ${r}\n\n${e[r].trim()}\n`;if(n+=t.slice(0,U-n.length),n.length===U)break}return n.trimEnd()}function q(e){let t=[`**Integration:** ${e.integration}`,`**Type:** ${e.type}`,`**Actor:** ${e.actor.login??e.actor.id}`];return e.repo&&t.push(`**Repo:** ${e.repo.owner}/${e.repo.name}`),e.chat&&t.push(`**Thread:** ${e.chat.thread.id}${e.chat.thread.isDM?` (direct message)`:``}`),[t.join(`
4
+ `),e.promptContext,e.text].filter(Boolean).join(`
5
+
6
+ `)}function J(e){if(!e)return``;let t=[];return e.messages?.length&&t.push(`## Recent thread\n\n${e.messages.map(e=>`- ${e.user}: ${e.text}`).join(`
7
+ `)}`),e.note&&t.push(`## Note from earlier in this thread\n\n${e.note}`),e.instructions&&t.push(`## Repository instructions\n\n${e.instructions}`),e.user&&t.push(`## Who asked\n\n${e.user.name} (${e.user.email}), a member of this Coder server.`),t.join(`
8
+
9
+ `)}function Y({event:e,prompt:t}){return t===void 0?e?q(e):``:e?.repo?`**Repo:** ${e.repo.owner}/${e.repo.name}\n\n${t}`:t}function X(e,t){let n=J(t.context),r=t.prompt===void 0&&t.event?h[t.event.integration]?.hint:void 0,i=Y(t);return{system:[W(e),r?`## Platform\n\n${r}`:``].filter(Boolean).join(`
10
+
11
+ `),prompt:n?`${i}\n\n${n}`:i}}function Z(e,o){let l=r(e,o);if(!l)return()=>{};let d={agent:o.agentId,permissions:o.permissions??`auto`},f=k(e),p=new Map((o.mcp??[]).map(e=>[e.name,e])),m=e=>{if(!e.command)return e;let[t]=i([e],E.env,f);return{...e,command:t.command,args:t.args}},h=e=>{try{return k(e)}catch{return null}},g=[e,...o.addDirs??[]].flatMap(e=>h(T.resolve(e))??[]),_=e=>g.some(t=>e===t||e.startsWith(t+T.sep)),S=new Map,C=new Set,w=()=>{let e=x(i(o.mcp),v);return e?{token:e}:{}};return t(l,{async dispatch(e){let t=e.name??`task`;if(e.mcp!==void 0&&(typeof e.mcp!=`string`||/^[\[{]/.test(e.mcp.trim())))throw new n(`invalid-option`,`Mailbox MCP selections must be server names.`);let r=(e.mcp??``).split(`,`).map(e=>e.trim()).filter(Boolean).map(e=>{let t=e===`all`?void 0:p.get(e);if(!t)throw new n(`invalid-option`,`MCP server "${e}" is not authorized for agent "${d.agent}".`);return m(t)}),i=T.resolve(String(e.cwd??f));if(h(i)!==h(f)&&r.some(e=>e.command))throw new n(`invalid-option`,`Inherited stdio MCP servers do not allow a cwd override.`);let a=[i,...(e.addDirs??[]).map(e=>T.resolve(i,e))],o=a.find(e=>!h(e));if(o)throw new n(`invalid-option`,`task "${t}" asks for ${o}, which does not exist`);let[s,...l]=a.map(e=>h(e)),g=[s,...l].find(e=>!_(e));if(g)throw new n(`invalid-option`,`task "${t}" asks for ${g}, outside the workspace of agent "${d.agent}"`);if(e.resume&&!S.has(e.resume))throw new n(`invalid-option`,`task "${t}" resumes a task this flow did not start`);let v=await u({prompt:String(e.prompt??``),outputSchema:e.outputSchema,cwd:s,engine:e.engine,model:e.model,effort:e.effort,mcp:r,permissions:c(t,e.permissions,d),name:e.name,system:e.system,resume:e.resume,addDirs:l,flowRunId:e.flowRunId,wait:!0},{fromMailbox:!0});return S.set(v.taskId,s),{taskId:v.taskId}},async wait(e){let t=S.get(e.taskId);if(!t)throw new n(`invalid-option`,`No task "${e.taskId}" started by this flow.`);let r=await s(t,e.taskId);return{status:r.status,result:r.result,model:r.task.model??null,next:a(t,r)??null}},review(t){if(t.op===`resolveTarget`){let{repo:r,...i}=t.input??{};if(!o.repo&&!/^\d+$/.test(String(i.pr)))throw new n(`invalid-option`,`review target must be a pull request number in this task's repository`);let a=b({...i,cwd:e,...o.repo?{repo:o.repo}:{},...o.author?{author:o.author}:{}},w());return a.pr&&C.add(`${a.pr.repo}#${a.pr.number}`),a}if(t.op!==`post`)throw new n(`invalid-option`,`unknown review action "${t.op}"`);if(!C.has(`${t.input?.repo}#${t.input?.pr}`))throw new n(`invalid-option`,`review post: pull request was not resolved by this task`);return y({...t.input,cwd:e},w())}})}export{P as a,M as i,H as n,L as r,N as t};
@@ -0,0 +1,10 @@
1
+ import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{$t as t,At as n,Cn as r,Ct as i,Et as a,Ht as o,It as s,L as c,On as l,R as u,Rt as d,Vt as f,Wt as p,en as m,f as ee,kn as h,m as te,mn as g,n as _,r as ne}from"./dispatch-BsW_1m7e.js";import{r as re,s as ie}from"./output-BKeyLbvt.js";import{a as v}from"./discover-Qanr5TEO.js";import{l as ae,s as oe}from"./actions-FzDNxMFf.js";import{createRequire as se}from"node:module";import y from"node:path";import b from"node:process";import{fileURLToPath as ce,pathToFileURL as x}from"node:url";import S from"node:fs";import{spawn as le,spawnSync as ue}from"node:child_process";import de,{randomUUID as fe}from"node:crypto";import pe from"node:os";import{AsyncLocalStorage as me}from"node:async_hooks";function he(e){return typeof e!=`object`||!e?JSON.stringify(e)??`null`:Array.isArray(e)?`[${e.map(he).join(`,`)}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${he(e[t])}`).join(`,`)}}`}function ge(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function C(e,t){return de.createHash(`sha256`).update(`${e}\0${he(t)}`).digest(`hex`)}function w(e){return S.existsSync(e)?S.readFileSync(e,`utf8`).split(/\r?\n/).filter(Boolean).map(e=>{try{return JSON.parse(e)}catch{return null}}).filter(e=>e!==null):[]}var _e=class{file;recorded;seq=0;constructor(e,t){this.file=t,this.recorded=e.map(e=>({...e})),S.writeFileSync(t,``,`utf8`)}write(e){e.seq=this.seq++,S.appendFileSync(this.file,`${JSON.stringify(e)}\n`,`utf8`)}replay(...e){let t=this.recorded.find(t=>!t.consumed&&e.includes(t.fingerprint));if(!t)return null;t.consumed=!0;let{consumed:n,...r}=t;return this.write(r),r}record(e){this.write({...e,seq:0})}},ve=e({archiveFlaggedRuns:()=>Ne,archiveRun:()=>N,archiveRuns:()=>je,collectFlowRuns:()=>Le,deleteRun:()=>P,deleteRuns:()=>Me,flowSteps:()=>Ie,generateRunId:()=>O,latestRun:()=>H,listArchivedRuns:()=>V,listRuns:()=>B,markRunArchived:()=>M,readFlowRecord:()=>L,readRawRecord:()=>F,reconcileRun:()=>I,resumeRun:()=>Oe,runDirFor:()=>j,runResult:()=>E,startRun:()=>De,unarchiveRun:()=>Pe,watchRun:()=>D,writeFlowRecord:()=>R});const T=`CODER_FLOW_ATTACH`;function ye(){try{return ue(`bun`,[`--version`],{stdio:`ignore`}).status===0}catch{return!1}}function be(e,t){if(!e.endsWith(`.ts`)||b.versions.bun||b.features.typescript)return;if(!ye())throw new i(`invalid-option`,`This flow is a TypeScript file (${e}) and this Node cannot run TypeScript.`,{hint:[`Upgrade to Node 23.6+ or install bun: https://bun.sh`,`Or write the flow as .mjs / .js`]});let n=ue(`bun`,[r,...t],{stdio:`inherit`});b.exit(n.status??1)}function xe(e){b.once(`SIGINT`,()=>{(async()=>{let{runId:t}=e,n=S.existsSync(y.join(j(t),mt));if(b.stderr.write(`\n[flow] Stopping run ${t}. No new tasks will dispatch.\n`),n){let t=e.runningIds();t.length&&b.stderr.write(`[flow] left running: ${t.join(`, `)}\n`)}else{let n=await _t(t,e.runningIds());n.length&&b.stderr.write(`[flow] stopped tasks: ${n.join(`, `)}\n`)}b.stderr.write(`\n${ie([`Resume: coder flow resume ${t}`],re)}\n`),e.requestStop(),b.exit(130)})()})}function Se(e){let t=y.join(j(e),`events.jsonl`),n=e=>{try{S.appendFileSync(t,`${JSON.stringify(e)}\n`,`utf8`)}catch{}};return{onStart:e=>xe(e),onTaskStart:e=>n({kind:`task-start`,...e}),onTaskEnd:e=>n({kind:`task-end`,...e}),onGateStart:e=>n({kind:`gate-start`,...e}),onGate:e=>n({kind:`gate`,...e}),onLog:(e,t)=>n({kind:`log`,message:e,depth:t}),onFlowStart:e=>n({kind:`flow-start`,...e}),onReplay:e=>n({kind:`replay`,count:e})}}async function Ce(e){let t=b.env[T];if(t){delete b.env[T];try{await $(t,e,Se(t)),b.exit(0)}catch(e){Z(t,e instanceof Error?e.message:String(e)),b.exit(1)}}}function we(e,t,n){let i=j(e.runId);S.writeFileSync(y.join(i,`events.jsonl`),``,`utf8`);let a=S.openSync(y.join(i,`flow.log`),`a`),o=le(b.execPath,[r,...t],{detached:!0,stdio:[`ignore`,a,a],env:{...b.env,[T]:e.runId}});return o.unref(),S.closeSync(a),{runId:e.runId,status:`running`,...n?{watch:D(e.runId,{bootPid:o.pid})}:{}}}async function Te(e,t,n){try{return await n()}catch(n){if(!(n instanceof i)||n.code!==`flow-failed`)throw n;let r=t?`
2
+ [flow] dry-run ended early: a downstream step depends on real task output (stub it or run for real).`:``;throw new i(`flow-failed`,`[flow] ${e} ${n.runId} failed: ${n.message}${r}`,{runId:n.runId,hint:`Resume${e===`resume`?` again`:``}: coder flow resume ${n.runId}`})}}function Ee(e,t){let n=e?L(e):H();if(!n)throw new i(`flow-failed`,e?`No flow run "${e}".`:t,{hint:`Run one: coder flow run <name>`});return n}async function De(e,t={},n={}){return t.argv&&(be(v(e,t.cwd?y.resolve(t.cwd):b.cwd()).path,t.argv),await Ce(t),!t.dryRun)?we(Y(e,t),t.argv,t.wait):Te(`run`,t.dryRun,()=>St(e,t,n))}async function Oe(e,t={},n={}){let r=Ee(e,`No flow runs to resume.`);return t.argv&&(be(r.script,t.argv),await Ce(t),!t.dryRun)?we(Y(``,t,r.runId),t.argv,t.wait):Te(`resume`,t.dryRun,()=>$(r.runId,t,n))}function ke(e){let t=y.join(j(e),`events.jsonl`);return S.existsSync(t)?S.readFileSync(t,`utf8`).split(`
3
+ `).filter(Boolean).flatMap(e=>{try{return[JSON.parse(e)]}catch{return[]}}):[]}function E(e,t={}){let n=e?L(e):H();return n?{...n,steps:Ie(n.runId,t.tail),journal:w(y.join(j(n.runId),`journal.jsonl`)).map(e=>({kind:e.kind,taskId:e.taskId,tokens:e.tokens})),events:ke(n.runId)}:null}function D(e,t={}){let n=Ee(e,`No flow runs yet.`);return{record:n,events:yt(n.runId,t.bootPid,{tail:t.tail}),final(){let e=E(n.runId,{tail:0});if(!e)throw new i(`flow-failed`,`[flow] run ${n.runId} vanished while following.`,{hint:`Recent runs: coder flow list`});return e}}}function Ae(e){let t=L(e);if(!t)throw new i(`flow-failed`,`No flow run "${e}".`,{hint:`Recent runs: coder flow list`});if(t.status===`running`||t.status===`queued`)throw new i(`flow-failed`,`Run ${t.runId} is still running.`,{runId:t.runId,hint:`Stop it first: coder flow stop ${t.runId}`});return t}function je(e,t={}){if(t.allStopped){let e=B().filter(e=>e.status!==`running`&&e.status!==`queued`);for(let t of e)N(t);let t=e.map(e=>e.runId);return{archived:t,count:t.length}}if(!e)throw new i(`invalid-option`,`Missing run id.`,{hint:[`Archive one: coder flow archive <run-id>`,`Archive all stopped: coder flow archive --all-stopped`]});let n=Ae(e);return N(n),{runId:n.runId,archived:!0}}function Me(e,t={}){if(t.allArchived){let e=V().filter(e=>P(e.runId)).map(e=>e.runId);return{deleted:e,count:e.length}}if(!e)throw new i(`invalid-option`,`Missing run id.`,{hint:[`Delete one: coder flow delete <run-id>`,`Delete all archived: coder flow delete --all-archived`]});let n=Ae(e);return{runId:n.runId,deleted:P(n.runId)}}function O(){return`flow-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function k(){let e=u();return m(e)}function A(){return t()}function j(e){n(e,`flow run id`);let t=y.join(k(),e);if(S.existsSync(y.join(t,`flow.json`)))return t;let r=y.join(A(),e);return S.existsSync(y.join(r,`flow.json`))?r:t}function M(e){if(e.archived)return e;let t={...e,archived:!0,archivedAt:new Date().toISOString()};return R(j(e.runId),t),t}function N(e){let t=j(e.runId),n=y.join(A(),e.runId);return t!==n&&h(t,n),M(e)}function Ne(e){for(let t of e){let e=L(t);e&&N(e)}}function Pe(e){let t=j(e.runId),n=y.join(k(),e.runId);t!==n&&h(t,n);let r={...e,archived:void 0,archivedAt:void 0};return R(j(e.runId),r),r}function P(e){let t=j(e);return S.existsSync(y.join(t,`flow.json`))?(S.rmSync(t,{recursive:!0,force:!0}),!0):!1}function F(e){if(!d(e))return null;let t=y.join(j(e),`flow.json`);if(!S.existsSync(t))return null;try{return JSON.parse(S.readFileSync(t,`utf8`))}catch{return null}}function I(e){return e.status!==`running`||!e.pid||Q(e)?e:(Z(e.runId,`orchestrator died`),F(e.runId)??e)}function L(e){let t=F(e);return t?I(t):null}function R(e,t){S.writeFileSync(y.join(e,`flow.json`),`${JSON.stringify(t,null,2)}\n`,`utf8`)}function z(e){let t=[];try{t=S.readdirSync(e)}catch{return[]}let n=[];for(let r of t)try{n.push(I(JSON.parse(S.readFileSync(y.join(e,r,`flow.json`),`utf8`))))}catch{}return n}const Fe=(e,t)=>String(t.startedAt).localeCompare(String(e.startedAt));function B(){let e=[];for(let t of z(k()))t.archived?N(t):e.push(t);return e.sort(Fe)}function V(e){let t=e?.migrate??!0,n=z(A()),r=new Set(n.map(e=>e.runId));for(let e of z(k()))e.archived&&!r.has(e.runId)&&n.push(t?N(e):e);return n.sort(Fe)}function H(){return[...B(),...V()].sort(Fe)[0]??null}function Ie(e,t=`all`){if(t===0)return[];let n=w(y.join(j(e),`journal.jsonl`)).filter(e=>e.kind===`task`),r=f(b.cwd()),i=new Map(r.map(e=>[e.id,e])),a=e=>e?.name??e?.prompt?.replace(/\s+/g,` `).trim().slice(0,60)??null,o=n.map(e=>{let t=e.taskId?i.get(e.taskId):void 0;return{taskId:e.taskId??null,name:a(t),status:t?.status??e.result?.status??`?`,tokens:e.tokens??null}}),s=new Set(o.map(e=>e.taskId));for(let t of r)t.flowRunId===e&&!s.has(t.id)&&o.push({taskId:t.id,name:a(t),status:t.status,tokens:null});return t===`all`?o:o.slice(-t)}function Le(e={}){let t=e.limit===`all`?void 0:e.limit,n;if(e.archived)n=V();else{let e=[];n=B().filter(t=>t.status===`running`||t.status===`queued`||a(t.endedAt??t.startedAt)<=18e5||(M(t),e.push(t.runId),!1)),oe(b.cwd(),e,{flows:!0})}let r=t===void 0?0:Math.max(0,n.length-t);return{runs:t===void 0?n:n.slice(0,t),clipped:r}}const Re=globalThis,U=Re.__coderFlowCtxALS??=new me,W=Re.__coderFlowScopeALS??=new me;function ze(){return W.getStore()?.args}function Be(){return U.getStore()?.integrationToken}function G(){return W.getStore()?.depth??0}var Ve=class{limit;active=0;queue=[];constructor(e){this.limit=e}async run(e){this.active<this.limit?this.active+=1:await new Promise(e=>this.queue.push(e));try{return await e()}finally{let e=this.queue.shift();e?e():--this.active}}};function He(e,t){return t?e?{input:e.input+t.input,cachedInput:e.cachedInput+t.cachedInput,output:e.output+t.output,total:e.total+t.total}:{...t}:e}function Ue(e,t){if(!t.tokens)return;let n=t.model??`default`;e.ledger[n]=He(e.ledger[n]??null,t.tokens)}function We(e){return!!e&&typeof e.safeParse==`function`}async function K(e){try{let t=await import(`zod`);if(typeof t.toJSONSchema==`function`)return t.toJSONSchema(e)}catch{}return null}async function Ge(e){let t=await K(e);return`Reply with only a single JSON object ${t?`matching this JSON Schema:\n${JSON.stringify(t,null,2)}`:`matching the requested shape`}\nUse no prose or markdown fences. Return only the JSON object.`}function Ke(e){let t=e.trim(),n=t.match(/```(?:json)?\s*([\s\S]*?)```/i);n&&(t=n[1].trim());let r=t.indexOf(`{`);if(r===-1)throw Error(`no JSON object found in reply`);let i=0,a=!1,o=!1;for(let e=r;e<t.length;e+=1){let n=t[e];if(a){o?o=!1:n===`\\`?o=!0:n===`"`&&(a=!1);continue}if(n===`"`)a=!0;else if(n===`{`)i+=1;else if(n===`}`&&(--i,i===0))return JSON.parse(t.slice(r,e+1))}throw Error(`unterminated JSON object in reply`)}function q(e,t){if(!We(e))return{ok:!0,data:t};let n=e.safeParse(t);if(n.success)return{ok:!0,data:n.data};let r=n.error?.issues??n.error?.errors??[];return{ok:!1,errors:Array.isArray(r)?r.map(e=>`${(e.path??[]).join(`.`)||`(root)`}: ${e.message}`).join(`; `):String(n.error)}}function qe(e,t,n){return{cwd:t,engine:e.engine,model:e.model,effort:e.effort,mcp:e.mcp,permissions:n?.ceiling?_(e.name,e.permissions,n.ceiling):e.permissions,name:e.name,system:e.system,addDirs:e.addDirs,wait:!0,flowRunId:n?.runId}}async function Je(e,t,n,r){let i=t.cwd?y.resolve(t.cwd):n?.cwd??b.cwd(),a=t.returns?await K(t.returns):null,l=t.returns&&!a?[t.system,await Ge(t.returns)].filter(Boolean).join(`
4
+
5
+ `):t.system,d;for(;;){let f={prompt:e,...qe(t,i,n),system:l,...a?{outputSchema:a}:{},...d?{engine:d,model:void 0,effort:void 0,resume:void 0}:{resume:r??t.resume}},p=!!u(),m=p?await c(`dispatch`,f):await ne({...f,onFallback:e=>nt(`${e.engine} failed to start. Falling back to ${e.next}. ${e.detail.replace(/\s+/g,` `).slice(0,140)}`)});n?.running.add(m.taskId);let h=o(i,m.taskId),g=h?s(h):void 0;n?.hooks.onTaskStart?.({taskId:m.taskId,name:t.name,prompt:e,engine:g,depth:G()});let _;try{if(p)_=await c(`wait`,{taskId:m.taskId});else{let e=await te(i,m.taskId);_={status:e.status,result:e.result,model:e.task.model??null,next:ee(i,e)??null}}}finally{n?.running.delete(m.taskId)}if(_.next){let e=_.next;n?.hooks.onTaskEnd?.({taskId:m.taskId,status:`failed`,tokens:null}),d=e;continue}return{taskId:m.taskId,status:_.status,output:_.result?.finalMessage||_.result?.error?.message||``,tokens:_.result?.tokens??null,model:_.result?.model??_.model}}}async function Ye(e,t,n){if(n?.dryRun){b.stdout.write(`\n[dry-run] task${t.name?` (${t.name})`:``}:\n${e}\n`);let n={...t,returns:t.returns?`<schema>`:void 0};return b.stdout.write(`[dry-run] opts: ${JSON.stringify(n)}\n`),{taskId:`dry`,status:`completed`,output:`[dry-run]`,data:void 0,tokens:null,model:t.model??null}}let r=await Je(e,t,n);if(r.status!==`completed`){let e={...r,data:void 0};throw new i(`task-failed`,`Task ${r.taskId} ${r.status}: ${r.output||`no output`}`,{taskId:r.taskId,result:e})}let a=r.output,o=r.tokens,s;if(t.returns){let e;try{e=q(t.returns,Ke(a))}catch(t){e={ok:!1,errors:t instanceof Error?t.message:String(t)}}if(e.ok)s=e.data;else{let c=await Je(`Your previous reply did not match the required format: ${e.errors}\n\nReply again with the required JSON object.`,t,n,r.taskId);a=c.output||a,o=He(o,c.tokens);try{let e=q(t.returns,Ke(a));if(!e.ok)throw Error(e.errors);s=e.data}catch(e){let t={taskId:r.taskId,status:`completed`,output:a,data:void 0,tokens:o,model:r.model};throw new i(`task-failed`,`Task ${r.taskId} produced no valid structured output: ${e instanceof Error?e.message:String(e)}`,{taskId:r.taskId,result:t})}}}return{taskId:r.taskId,status:`completed`,output:a,data:s,tokens:o,model:r.model}}async function Xe(e){if(e)return await K(e)??`<schema>`}async function Ze(e,t={}){let n=U.getStore();if(!n)return Ye(e,t);let r={prompt:e,agent:t.engine,model:t.model,effort:t.effort,...t.mcp===void 0?{}:{mcp:t.mcp},permissions:t.permissions,name:t.name,system:t.system,resume:t.resume,cwd:t.cwd,...t.addDirs?.length?{addDirs:t.addDirs}:{},returns:await Xe(t.returns)},a=C(`task`,ge(r)),o=n.journal.replay(a,C(`task`,r));if(o)return o.result;if(n.taskCount+=1,n.taskCount>n.maxTasks)throw Error(`Flow exceeded --max-tasks (${n.maxTasks}). Raise it with --max-tasks, or fix a runaway loop; the run is resumable.`);return n.semaphore.run(async()=>{let r=new Date().toISOString(),o;try{o=await Ye(e,t,n)}catch(e){let t=e instanceof i?e.result:void 0;throw t&&n.hooks.onTaskEnd?.({taskId:t.taskId,status:t.status===`completed`?`failed`:t.status,tokens:t.tokens}),e}return Ue(n,o),n.dryRun||n.hooks.onTaskEnd?.({taskId:o.taskId,status:o.status,tokens:o.tokens}),n.journal.record({kind:`task`,fingerprint:a,result:o,taskId:o.taskId,tokens:o.tokens,startedAt:r,endedAt:new Date().toISOString()}),o})}const J=262144;function Qe(e){let t=[];for(let n=e;;){t.push(y.join(n,`node_modules`,`.bin`));let e=y.dirname(n);if(e===n)break;n=e}let n=b.platform===`win32`?`;`:`:`;return{...b.env,PATH:[...t,b.env.PATH??``].join(n)}}async function $e(e,t){return new Promise(n=>{let r=le(e,{shell:!0,cwd:t,env:Qe(t)}),i=``,a=e=>{i.length>=J||(i+=e,i.length>=J&&(i=`${i.slice(0,J)}\n... [gate output truncated]`))};r.stdout?.on(`data`,a),r.stderr?.on(`data`,a),r.on(`error`,e=>n({ok:!1,code:1,output:String(e.message??e).trim()})),r.on(`close`,e=>n({ok:e===0,code:e??0,output:i.trim()}))})}async function et(e,t={}){let n=U.getStore(),r=t.cwd?y.resolve(t.cwd):n?.cwd??b.cwd();if(!n)return $e(e,r);let i=C(`gate`,{cmd:e,cwd:t.cwd}),a=n.journal.replay(i);if(a)return a.result;if(n.dryRun){b.stdout.write(`\n[dry-run] gate: ${e}\n`);let t={ok:!0,code:0,output:``};return n.journal.record({kind:`gate`,fingerprint:i,result:t,startedAt:new Date().toISOString(),endedAt:new Date().toISOString()}),t}let o=new Date().toISOString(),s=`gate-${b.pid}-${fe()}`,c=G();n.hooks.onGateStart?.({gateId:s,cmd:e,depth:c});let l=await $e(e,r);return n.hooks.onGate?.({gateId:s,cmd:e,ok:l.ok,code:l.code,depth:c}),n.journal.record({kind:`gate`,fingerprint:i,result:l,startedAt:o,endedAt:new Date().toISOString()}),l}async function tt(e,...t){return Promise.all(e.map(async(e,n)=>{let r=e;for(let i of t)try{r=await i(r,e,n)}catch{return null}return r}))}function nt(e){let t=U.getStore();if(t)try{S.appendFileSync(y.join(t.runDir,`flow.log`),`${JSON.stringify({at:new Date().toISOString(),message:e})}\n`,`utf8`)}catch{}t?.hooks.onLog?t.hooks.onLog(e,G()):(b.stderr.isTTY||!t)&&b.stderr.write(`[flow] ${e}\n`)}const rt=se(import.meta.url);function it(e){let t=y.dirname(ce(import.meta.url));for(;y.basename(t)!==`dist`&&y.dirname(t)!==t;)t=y.dirname(t);return y.basename(t)===`dist`?x(y.join(t,e)).href:null}function at(e){if(!(e===`@wular/coder`||e===`@wular/coder/flow`||e===`zod`||e.startsWith(`zod/`)))return null;try{return x(rt.resolve(e)).href}catch{}return e===`@wular/coder/flow`?it(`flow/index.js`):e===`@wular/coder`?it(`sdk.js`):null}const ot=/(\bfrom\s+|\bimport\s+|\bimport\s*\(\s*)(['"])([^'"]+)\2/g;function st(e){return e.replace(ot,(e,t,n,r)=>{let i=at(r);return i?`${t}${n}${i}${n}`:e})}async function ct(e){let t=W.getStore(),n=t.imports??={dirs:new Set,node:!1};if(b.versions?.bun){if(n.dirs.has(e))return;n.dirs.add(e);let{plugin:t}=await import(`bun`),r=e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);t({name:`coder-flow:${e}`,setup(e){e.onLoad({filter:RegExp(`^${r}/(?!.*node_modules/).*\\.m?[jt]sx?$`)},e=>({contents:st(S.readFileSync(e.path,`utf8`)),loader:y.extname(e.path).replace(/^\.m?/,``)}))}});return}if(n.node)return;n.node=!0;let{register:r}=await import(`node:module`),i=Object.fromEntries([`@wular/coder`,`@wular/coder/flow`,`zod`].flatMap(e=>{let t=at(e);return t?[[e,t]]:[]})),a=`const urls = ${JSON.stringify(i)}, parent = ${JSON.stringify(import.meta.url)};
6
+ export function resolve(spec, ctx, next) {
7
+ if (urls[spec]) return { url: urls[spec], shortCircuit: true };
8
+ return next(spec, spec.startsWith('zod/') ? { ...ctx, parentURL: parent } : ctx);
9
+ }`;r(`data:text/javascript,${encodeURIComponent(a)}`)}async function lt(e,t,n){try{return await import(x(e).href)}catch(e){let r=e instanceof Error?e.message:String(e);throw t===`.ts`&&!b.versions?.bun&&/Unknown file extension|Unexpected token|SyntaxError|Cannot parse|import type|interface/i.test(r)?Error(`Could not run ${y.basename(n)}: TypeScript flows need bun. Run under \`bun\`, or write the flow as .mjs/.js.`):e}}async function ut(e){if(!S.existsSync(e))throw Error(`Cannot read flow file: ${e}`);return await ct(y.dirname(e)),lt(e,y.extname(e),e)}async function dt(e,t){let n=W.getStore();n.args=t??{};let r=await ut(e),i=U.getStore();i?.flowConcurrency&&!n.depth&&typeof r.concurrency==`number`&&(i.semaphore.limit=Math.max(1,r.concurrency),R(i.runDir,{...L(i.runId),concurrency:i.semaphore.limit}));let a=r.args,o=n.args;if(We(a)){let e=a.safeParse(t??{});if(!e.success){let e=q(a,t??{});throw Error(`Invalid flow args: ${e.errors??`validation failed`}`)}o=e.data,n.args=o}let s=r.default;return typeof s==`function`?s(o):s}async function ft(e,t){let n=U.getStore(),r=n?.cwd??b.cwd(),i=v(e,r);if(!n)return W.run({args:t??{},depth:0},()=>dt(i.path,t));let a=W.getStore();if(a&&a.depth>=1)throw Error(`flow("${e}") nesting is one level deep; a sub-flow cannot call flow().`);let o=C(`flow`,{name:i.name,args:t??{}}),s=n.journal.replay(o);if(s)return s.result;let c=new Date().toISOString();n.hooks.onFlowStart?.({name:i.name,depth:(a?.depth??0)+1});let l=await W.run({args:t??{},depth:(a?.depth??0)+1,imports:a?.imports},()=>dt(i.path,t));return n.journal.record({kind:`flow`,fingerprint:o,result:l,startedAt:c,endedAt:new Date().toISOString()}),l}var pt=e({STOP_KEEP_TASKS_MARKER:()=>mt,markRunFailed:()=>Z,orchestratorAlive:()=>Q,pidAlive:()=>ht,prepareRun:()=>Y,resumeFlow:()=>$,runFlowByName:()=>St,stopFlowTasks:()=>_t,stopRun:()=>vt,streamFlowCore:()=>yt});function Y(e,t={},n){let r,i,a;if(n){let e=L(n);if(!e)throw Error(`No flow run "${n}".`);e.archived&&Pe(e),r=e.name,i=e.script,a=t.args??e.args}else{let n=v(e,t.cwd?y.resolve(t.cwd):b.cwd());r=n.name,i=n.path,a=t.args??{}}let o=n??t.runId??O(),s=j(o);S.mkdirSync(s,{recursive:!0});let c={runId:o,name:r,script:i,args:a,status:`running`,startedAt:new Date().toISOString(),concurrency:Math.max(1,t.concurrency??pe.cpus().length),maxTasks:Math.max(1,t.maxTasks??pe.cpus().length*10),taskCount:0,ledger:{}};return R(s,c),c}function X(e,t,n){R(e,{...t,endedAt:new Date().toISOString(),pid:void 0,pidStartedAt:void 0,...n})}function Z(e,t){let n=F(e);!n||n.status!==`running`||X(j(e),n,{status:`failed`,error:t})}const mt=`stop-keep-tasks`;function ht(e){try{return b.kill(e,0),!0}catch{return!1}}function Q(e){if(!e.pid||!ht(e.pid))return!1;let t=p(e.pid),n=Date.parse(e.pidStartedAt??``);return t===null||!Number.isFinite(n)||t<=n+6e4}function gt(e){let t=f(b.cwd()),n=new Map(t.map(e=>[e.id,e])),r=new Set(t.filter(t=>t.flowRunId===e).map(e=>e.id));for(let t of w(y.join(j(e),`journal.jsonl`)))t.kind===`task`&&t.taskId&&r.add(t.taskId);return[...r].filter(e=>{let t=n.get(e);return!!t&&!g.includes(t.status)})}async function _t(e,t=[]){let n=b.cwd(),r=[];for(let i of new Set([...gt(e),...t])){let e=o(n,i);if(!(!e||g.includes(e.status)))try{await ae(n,e),r.push(i)}catch{}}return r}async function vt(e,t={}){let n=e?L(e):H();if(!n)throw new i(`flow-failed`,e?`No flow run "${e}".`:`No flow runs.`,{hint:`Run one: coder flow run <name>`});if(n.status!==`running`)throw new i(`flow-failed`,`Run ${n.runId} is not running.`,{runId:n.runId,hint:`Result: coder flow result ${n.runId}`});let r=j(n.runId);if(!Q(n))return X(r,n,{status:`failed`,error:`orchestrator died`}),{runId:n.runId,status:`failed`,stoppedTasks:[],keptTasks:gt(n.runId)};let a=gt(n.runId),s=y.join(r,mt);t.keepTasks&&S.writeFileSync(s,``,`utf8`);try{b.kill(n.pid,`SIGINT`);let e=L(n.runId);for(let t=0;t<25&&e?.status===`running`;t+=1)await new Promise(e=>setTimeout(e,200)),e=L(n.runId);if(!e||e.status===`running`)throw new i(`flow-failed`,`Run ${n.runId} did not stop within 5s.`,{runId:n.runId,hint:`Check it: coder flow result ${n.runId}`});let t=b.cwd(),r=[],s=[];for(let e of a){let n=o(t,e);n&&(n.status===`cancelled`?r.push(e):g.includes(n.status)||s.push(e))}return{runId:n.runId,status:e.status,stoppedTasks:r,keptTasks:s}}finally{if(t.keepTasks)try{S.unlinkSync(s)}catch{}}}async function*yt(e,t,n={}){let r=y.join(j(e),`events.jsonl`),i=n.tail??`all`,a=0;if(i!==`all`)try{a=Math.max(0,S.readFileSync(r,`utf8`).split(`
10
+ `).length-1-i)}catch{}let o=l(r),s=()=>{let e=[];for(let t of o()){if(a>0){--a;continue}try{e.push(JSON.parse(t))}catch{}}return e},c=L(e);for(;!c||c.status===`running`;){yield*s();let n=c?.pid?!Q(c):t!==void 0&&!ht(t);if(c&&(c.pid||t!==void 0)&&n){Z(e,`orchestrator died`);break}await new Promise(e=>setTimeout(e,400)),c=L(e)??c}yield*s()}function bt(e,t,n,r){let i={...Y(e,t,r),pid:b.pid,pidStartedAt:new Date().toISOString()},{runId:a}=i,o=j(a);R(o,i);let s=y.join(o,`journal.jsonl`),c=r?w(s):[],l=new _e(c,s),u={runId:a,runDir:o,cwd:t.cwd?y.resolve(t.cwd):b.cwd(),journal:l,semaphore:new Ve(i.concurrency),flowConcurrency:t.concurrency===void 0,maxTasks:i.maxTasks,dryRun:t.dryRun??!1,ledger:{},running:new Set,taskCount:0,stopping:!1,hooks:n,...t.integrationToken?{integrationToken:t.integrationToken}:{},...t.ceiling?{ceiling:t.ceiling}:{}};return{started:{runId:a,runDir:o,ctx:u,markStopped:()=>{u.stopping=!0,X(o,i,{status:`stopped`,concurrency:u.semaphore.limit,taskCount:u.taskCount,ledger:u.ledger})}},args:i.args,name:i.name,replayable:c.length}}async function xt(e,t,n,r){let{ctx:a,runDir:o,runId:s}=e,c=L(s);try{let e=await U.run(a,()=>W.run({args:r??{},depth:0},()=>dt(t,r)));return X(o,c,{status:`completed`,concurrency:a.semaphore.limit,taskCount:a.taskCount,ledger:a.ledger,result:e}),{runId:s,name:n,status:`completed`,result:e,tokens:a.ledger,taskCount:a.taskCount}}catch(e){throw a.stopping||X(o,c,{status:`failed`,concurrency:a.semaphore.limit,taskCount:a.taskCount,ledger:a.ledger,error:e instanceof Error?e.message:String(e)}),e instanceof i&&(e.code===`chain-exhausted`||e.code===`approval-pending`)?(e.runId??=s,e):new i(`flow-failed`,e instanceof Error?e.message:String(e),{runId:s})}}async function St(e,t={},n={}){let{started:r}=bt(e,t,n),i=L(r.runId).script;return n.onStart?.({runId:r.runId,requestStop:r.markStopped,runningIds:()=>[...r.ctx.running]}),xt(r,i,L(r.runId).name,t.args??{})}async function $(e,t={},n={}){let{started:r,args:i,name:a,replayable:o}=bt(``,t,n,e),s=L(e).script;return n.onStart?.({runId:e,requestStop:r.markStopped,runningIds:()=>[...r.ctx.running]}),o&&n.onReplay?.(o),xt(r,s,a,i)}export{Oe as _,Be as a,De as b,et as c,Ze as d,je as f,L as g,O as h,vt as i,nt as l,Me as m,St as n,ze as o,Le as p,_t as r,ft as s,pt as t,tt as u,E as v,D as x,ve as y};
@@ -1,4 +1,4 @@
1
- import{L as e,R as t}from"../../dispatch-BKeAch9E.js";import{a as n}from"../../executor-BvAA7Cgw.js";import r from"node:path";import{existsSync as i,readFileSync as a,realpathSync as o}from"node:fs";import{execFileSync as s}from"node:child_process";import{createHash as c}from"node:crypto";import*as l from"zod";import{CoderError as u,task as d}from"@wular/coder/flow";const f=l.object({pr:l.union([l.number(),l.string()]).optional(),base:l.string().optional(),head:l.string().optional(),since:l.string().optional(),post:l.boolean().optional(),author:l.string().optional(),path:l.array(l.string()).optional(),exclude:l.array(l.string()).optional(),engine:l.string().optional(),model:l.string().optional(),effort:l.enum([`low`,`medium`,`high`]).optional(),cwd:l.string().optional()}),p=4,m=l.enum([`critical`,`major`,`minor`,`nit`]),h=l.enum([`correctness`,`security`,`reliability`,`performance`,`maintainability`,`testing`,`documentation`]),g=l.strictObject({file:l.string(),line:l.number().int().positive(),severity:m,category:h,summary:l.string(),failure_scenario:l.string()}),_={critical:0,major:1,minor:2,nit:3};function v(e){return(t,n,r)=>s(t,n,{cwd:e,input:r,encoding:`utf8`,maxBuffer:67108864,stdio:[`pipe`,`pipe`,`pipe`]})}function y(e){let t=new Map,n=``;for(let r of e.split(`
1
+ import{L as e,R as t}from"../../dispatch-BsW_1m7e.js";import{a as n}from"../../executor-vMppVLB6.js";import r from"node:path";import{existsSync as i,readFileSync as a,realpathSync as o}from"node:fs";import{execFileSync as s}from"node:child_process";import{createHash as c}from"node:crypto";import*as l from"zod";import{CoderError as u,task as d}from"@wular/coder/flow";const f=l.object({pr:l.union([l.number(),l.string()]).optional(),base:l.string().optional(),head:l.string().optional(),since:l.string().optional(),post:l.boolean().optional(),author:l.string().optional(),path:l.array(l.string()).optional(),exclude:l.array(l.string()).optional(),engine:l.string().optional(),model:l.string().optional(),effort:l.enum([`low`,`medium`,`high`]).optional(),cwd:l.string().optional()}),p=4,m=l.enum([`critical`,`major`,`minor`,`nit`]),h=l.enum([`correctness`,`security`,`reliability`,`performance`,`maintainability`,`testing`,`documentation`]),g=l.strictObject({file:l.string(),line:l.number().int().positive(),severity:m,category:h,summary:l.string(),failure_scenario:l.string()}),_={critical:0,major:1,minor:2,nit:3};function v(e){return(t,n,r)=>s(t,n,{cwd:e,input:r,encoding:`utf8`,maxBuffer:67108864,stdio:[`pipe`,`pipe`,`pipe`]})}function y(e){let t=new Map,n=``;for(let r of e.split(`
2
2
  `)){r.startsWith(`+++ `)&&(n=r.slice(4).replace(/^b\//,``).split(` `)[0]);let e=r.match(/^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@/);if(!e||n===`/dev/null`)continue;let i=Number(e[1]),a=e[2]===void 0?1:Number(e[2]);a>0&&t.set(n,[...t.get(n)??[],[i,i+a-1]])}return t}function b(e,t,n){return c(`sha1`).update(`${e}\n${t}\n${n}`).digest(`hex`)}function x(e,t,n){try{let r=e(`git`,[`show`,`${t}:${n}`]);return r.length>32e3?`${r.slice(0,32e3)}\n[truncated]`:r}catch{return}}function S(e,t){return`## Repository rules\n\n${[[`AGENTS.md`,x(e,t,`AGENTS.md`)],[`CLAUDE.md`,x(e,t,`CLAUDE.md`)],[`.coder/review.md`,x(e,t,`.coder/review.md`)]].filter(([,e])=>e?.trim()).map(([e,t])=>`### ${e}\n\n${t.trim()}`).join(`
3
3
 
4
4
  `)||`(none found)`}`}function C(e){for(let t of[[`symbolic-ref`,`--short`,`refs/remotes/origin/HEAD`],[`rev-parse`,`--verify`,`origin/main`],[`rev-parse`,`--verify`,`origin/master`]])try{return e(`git`,t),e(`git`,[`merge-base`,`HEAD`,t[0]===`symbolic-ref`?e(`git`,t).trim():t[2]]).trim()}catch{}throw new u(`invalid-option`,`Could not detect origin default branch; pass base.`)}const ee={low:`report only confirmed critical or major defects.`,medium:`report confirmed defects of any severity a maintainer would act on.`,high:`also report minor issues and maintainability nits, each verified against the repository.`};async function te(t,n,r,i){if(n.pr===void 0){let e=t(`git`,[`rev-parse`,n.head??`HEAD`]).trim();return{baseSha:n.base?t(`git`,[`rev-parse`,n.base]).trim():C(t),headSha:e,...n.since?{since:n.since}:{}}}let a={pr:n.pr,cwd:r,...n.since?{since:n.since}:{},...n.author?{author:n.author}:{}};return w(i)?e(`review`,{op:`resolveTarget`,input:a}):U(a,i)}function w(e){return!!t()&&!e.token&&!e.exec}const T=e=>[`--`,...e.include.map(e=>`:(top)${e}`),...e.exclude.map(e=>`:(top,exclude)${e}`)];function E(e,t){return!t||e.startsWith(t)?e.slice(t.length):!e||t.startsWith(`${e}/`)?``:void 0}function ne(e,t,n,i){let o=new Map;for(let s of e(n,[`ls-files`,`--others`,`--exclude-standard`,`--full-name`,`-z`,...T(n)]).split(`\0`)){if(s.endsWith(`/`)){i.push(`Skipped ${n.prefix}${s.slice(0,-1)} because it is a nested repository, not a submodule.`);continue}let e=``;try{s&&(e=a(r.join(t,n.prefix,s),`utf8`))}catch{}let c=e?e.split(`
@@ -1,2 +1,2 @@
1
- import { C as FlowTaskResult, S as FlowTaskOptions, _ as task, g as pipeline, h as log, m as gate, n as flowSdk, o as CoderError, p as flow, t as args, w as GateResult, x as FlowStep, y as FlowEvent } from "../index-CZjFX5zV.js";
1
+ import { C as FlowTaskResult, S as FlowTaskOptions, _ as task, g as pipeline, h as log, m as gate, n as flowSdk, o as CoderError, p as flow, t as args, w as GateResult, x as FlowStep, y as FlowEvent } from "../index-B1L4zXZH.js";
2
2
  export { CoderError, type FlowEvent, type FlowStep, type FlowTaskOptions, type FlowTaskResult, type GateResult, args, flowSdk as default, flowSdk, flow, gate, log, pipeline, task };
@@ -1 +1 @@
1
- import{xt as e}from"../dispatch-BKeAch9E.js";import{n as t}from"../discover-Dvr_3_Xr.js";import{_ as n,b as r,c as i,d as a,f as o,i as s,l as c,m as l,o as u,p as d,s as f,u as p,v as m,x as h}from"../executor-BvAA7Cgw.js";const g=new Proxy({},{get(e,t){return u()?.[t]},has(e,t){let n=u();return n!=null&&t in Object(n)},ownKeys(){let e=u();return e?Reflect.ownKeys(Object(e)):[]},getOwnPropertyDescriptor(e,t){let n=u();if(n!=null&&t in Object(n))return{enumerable:!0,configurable:!0,value:n[t]}}}),_={run(e,t={}){return r(e,t)},list(e={}){return d(e).runs},discover(e){return t(e??process.cwd())},result(e,t={}){return m(e,t)},stream(e,t={}){return h(e,t).events},stop(e,t={}){return s(e,t)},resume(e,t={}){return n(e,t)},archive:o,delete:l};export{e as CoderError,g as args,_ as default,_ as flowSdk,f as flow,i as gate,c as log,p as pipeline,a as task};
1
+ import{Ct as e}from"../dispatch-BsW_1m7e.js";import{n as t}from"../discover-Qanr5TEO.js";import{_ as n,b as r,c as i,d as a,f as o,i as s,l as c,m as l,o as u,p as d,s as f,u as p,v as m,x as h}from"../executor-vMppVLB6.js";const g=new Proxy({},{get(e,t){return u()?.[t]},has(e,t){let n=u();return n!=null&&t in Object(n)},ownKeys(){let e=u();return e?Reflect.ownKeys(Object(e)):[]},getOwnPropertyDescriptor(e,t){let n=u();if(n!=null&&t in Object(n))return{enumerable:!0,configurable:!0,value:n[t]}}}),_={run(e,t={}){return r(e,t)},list(e={}){return d(e).runs},discover(e){return t(e??process.cwd())},result(e,t={}){return m(e,t)},stream(e,t={}){return h(e,t).events},stop(e,t={}){return s(e,t)},resume(e,t={}){return n(e,t)},archive:o,delete:l};export{e as CoderError,g as args,_ as default,_ as flowSdk,f as flow,i as gate,c as log,p as pipeline,a as task};
@@ -1 +1 @@
1
- import{s as e}from"./cli-DWCR7iqa.js";const t=e(`flow`,{run:async()=>(await import(`./run-BWbabvub.js`)).commandRun,list:async()=>(await import(`./list-way5oLO0.js`)).commandList,ls:async()=>(await import(`./list-way5oLO0.js`)).commandList,discover:async()=>(await import(`./discover-Cfx5RPU7.js`)).commandDiscover,result:async()=>(await import(`./result-BfTfJayl.js`)).commandResult,watch:async()=>(await import(`./watch-eE2XiwsC.js`)).commandWatch,stream:async()=>(await import(`./watch-eE2XiwsC.js`)).commandWatch,stop:async()=>(await import(`./stop-BWY6k6v5.js`)).commandStop,resume:async()=>(await import(`./resume-aZ8yWDBh.js`)).commandResume,archive:async()=>(await import(`./archive-BCUfymIB.js`)).commandArchive,delete:async()=>(await import(`./delete-cS01oOIb.js`)).commandDelete},{menu:[{usage:`run <name|path> [--wait] [--args ...]`,blurb:`run a flow in the background (--wait to follow it live)`},{usage:`list`,blurb:`recent flow runs (by default running + just stopped)`},{usage:`discover`,blurb:`list flows runnable here (workspace + global)`},{usage:`result [run-id]`,blurb:`progress and result of a run`},{usage:`watch [run-id]`,blurb:`watch a run live (replay + follow)`},{usage:`stop [run-id]`,blurb:`stop a run and its still-running tasks`},{usage:`resume [run-id]`,blurb:`continue a stopped or edited run`},{usage:`archive <run-id> | --all-stopped`,blurb:`hide a run (or all stopped) from the list`},{usage:`delete <run-id> | --all-archived`,blurb:`delete a run's record (or all archived)`}],description:[`Orchestrate many coder tasks with a plain TypeScript file: dispatch, gates,`,`concurrency, journaling, and resume. Flows live in .coder/flows/ (workspace)`,"or ~/.coder/flows/ (global). See `coder docs flows`."]},{aliases:{stream:`watch`,ls:`list`},hint:`Run a flow: coder flow run <name>`});export{t as commandFlow};
1
+ import{s as e}from"./cli-B1ObVrL4.js";const t=e(`flow`,{run:async()=>(await import(`./run-D7SJ-ieT.js`)).commandRun,list:async()=>(await import(`./list-KvL7AUhD.js`)).commandList,ls:async()=>(await import(`./list-KvL7AUhD.js`)).commandList,discover:async()=>(await import(`./discover-lgTYwoQp.js`)).commandDiscover,result:async()=>(await import(`./result-D49VN8PM.js`)).commandResult,watch:async()=>(await import(`./watch-DmwaEvoi.js`)).commandWatch,stream:async()=>(await import(`./watch-DmwaEvoi.js`)).commandWatch,stop:async()=>(await import(`./stop-TrebIIuv.js`)).commandStop,resume:async()=>(await import(`./resume-ywzc7z6A.js`)).commandResume,archive:async()=>(await import(`./archive-C5c_HQS1.js`)).commandArchive,delete:async()=>(await import(`./delete-Bjteibld.js`)).commandDelete},{menu:[{usage:`run <name|path> [--wait] [--args ...]`,blurb:`run a flow in the background (--wait to follow it live)`},{usage:`list`,blurb:`recent flow runs (by default running + just stopped)`},{usage:`discover`,blurb:`list flows runnable here (workspace + global)`},{usage:`result [run-id]`,blurb:`progress and result of a run`},{usage:`watch [run-id]`,blurb:`watch a run live (replay + follow)`},{usage:`stop [run-id]`,blurb:`stop a run and its still-running tasks`},{usage:`resume [run-id]`,blurb:`continue a stopped or edited run`},{usage:`archive <run-id> | --all-stopped`,blurb:`hide a run (or all stopped) from the list`},{usage:`delete <run-id> | --all-archived`,blurb:`delete a run's record (or all archived)`}],description:[`Orchestrate many coder tasks with a plain TypeScript file: dispatch, gates,`,`concurrency, journaling, and resume. Flows live in .coder/flows/ (workspace)`,"or ~/.coder/flows/ (global). See `coder docs flows`."]},{aliases:{stream:`watch`,ls:`list`},hint:`Run a flow: coder flow run <name>`});export{t as commandFlow};
@@ -1,4 +1,4 @@
1
- import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{a as t,i as n,n as r,o as i}from"./local-H3uvqEbq.js";var a=e({ACTIONS_WORKFLOW_YAML:()=>o,GithubActionsRunner:()=>c});const o=`name: Coder agent
1
+ import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{a as t,i as n,n as r,o as i}from"./local-BRy1EUq2.js";var a=e({ACTIONS_WORKFLOW_YAML:()=>o,GithubActionsRunner:()=>c});const o=`name: Coder agent
2
2
  run-name: Coder agent \${{ inputs.task }}
3
3
  on:
4
4
  workflow_dispatch:
@@ -0,0 +1 @@
1
+ import{a as e,o as t}from"./local-BRy1EUq2.js";import{Readable as n}from"node:stream";import{pipeline as r}from"node:stream/promises";function i(e,t=200,n={}){return new Response(JSON.stringify(e),{status:t,headers:{"content-type":`application/json`,...n}})}const a=e=>e.searchParams.has(`cursor`);function o(t){if(t)try{return e(t)}catch{return}}const s=e=>o(e.searchParams.get(`cursor`));function c(e,t=50,n=200){let r=Number(e.searchParams.get(`limit`)??t);return Number.isInteger(r)&&r>0?Math.min(r,n):t}function l(e,n,r){let i=e.slice(0,n);return{items:i,...e.length>n?{next:t(r(i.at(-1)))}:{}}}const u=(e,t=302)=>new Response(null,{status:t,headers:{location:e}}),d=()=>new Response(`Forbidden`,{status:403}),f=()=>new Response(`Not found`,{status:404}),p=()=>new Response(`Method not allowed`,{status:405}),m=e=>u(`/login?return=${encodeURIComponent(`${e.pathname}${e.search}`)}`),h=e=>e.startsWith(`/api/auth`)?65536:1048576;async function g(e,t,n){let r=Number(t??0);if(Number.isFinite(r)&&r>n)throw Object.assign(Error(`Payload too large`),{status:413});let i=[],a=0;for await(let t of e){if(a+=t.byteLength,a>n)throw Object.assign(Error(`Payload too large`),{status:413});i.push(t)}let o=new Uint8Array(a),s=0;for(let e of i)o.set(e,s),s+=e.byteLength;return o}function _(e){let t=new Headers;for(let[n,r]of Object.entries(e))r!==void 0&&t.set(n,Array.isArray(r)?r.join(`, `):r);return t}async function v(e,t,n){let r=e.url??`/`,i=await g(e,e.headers[`content-length`],t);return new Request(`http://${e.headers.host??`localhost`}${r}`,{method:e.method,headers:_(e.headers),body:i.byteLength?Buffer.from(i):void 0,signal:n})}function y(e,{limit:t,admit:i=()=>!0}){return async(a,o)=>{if(!i(a))return void o.writeHead(404).end(`Not found`);let s=new AbortController,c=()=>{a.socket.destroyed&&s.abort()};o.once(`close`,()=>s.abort()),c();try{let i=await e(await v(a,t(a.url??`/`),s.signal),a.socket.remoteAddress?.replace(/^::ffff:/,``));c();let l=Object.fromEntries(i.headers.entries()),u=i.headers.getSetCookie();u.length&&(l[`set-cookie`]=u),o.writeHead(i.status,l),i.body?await r(n.fromWeb(i.body),o).catch(()=>{}):o.end()}catch(e){if(o.headersSent)return void o.destroy();let t=typeof e==`object`&&e&&`status`in e;t||console.error(`coder server: request failed`,e);let n=t?e instanceof Error?e.message:String(e):`Internal server error`;o.writeHead(t?Number(e.status):500,{"content-type":`application/json`}),o.end(JSON.stringify({error:n}))}}}async function b(e,t){if(e.method===`GET`||e.method===`HEAD`||!e.body)return e;try{let n=await g(e.body,e.headers.get(`content-length`)??void 0,t);return new Request(e.url,{method:e.method,headers:e.headers,body:n.byteLength?Buffer.from(n):void 0,signal:e.signal})}catch(e){if(e.status===413)return new Response(`Payload too large`,{status:413});throw e}}export{i as a,p as c,c as d,a as f,d as i,f as l,m,s as n,b as o,u as p,o as r,y as s,h as t,l as u};
@@ -1,4 +1,4 @@
1
- import { c as TurnResult, l as TaskLogEntry, o as Task, s as TaskStatus, u as TokenUsage } from "./types-I5Cwtl_K.js";
1
+ import { c as TaskStatus, d as TokenUsage, l as TurnResult, o as McpServerSpec, s as Task, u as TaskLogEntry } from "./types-DMGBYB_K.js";
2
2
  import { AsyncLocalStorage } from "node:async_hooks";
3
3
  //#region src/flow/types.d.ts
4
4
  /** Anything with zod's parse shape; the flow runtime never imports zod itself. */
@@ -24,6 +24,7 @@ interface FlowTaskOptions<T = unknown> {
24
24
  model?: string;
25
25
  effort?: string;
26
26
  permissions?: string;
27
+ mcp?: string | McpServerSpec[];
27
28
  name?: string;
28
29
  system?: string;
29
30
  resume?: string;
@@ -1 +1 @@
1
- import{a as e,n as t,o as n,r}from"./prompt-CEuBMNhk.js";import{i}from"./cli-DWCR7iqa.js";import{p as a,s as o}from"./output-BKeyLbvt.js";import{n as s,s as c,t as l}from"./args-BOEEdpWk.js";import u from"node:path";import d from"node:process";const f={observe:`read the platform only`,comment:`also post replies and reactions`,write:`also push, branch, and open or merge pull requests`};function p(e,t){let n=a,{id:r,samples:i,integrations:s}=e;d.stdout.write(`Created ${n.cyan(t)}.\n`);let c=s.length?[`1. Write ${t}/system.md. Try it with no server: coder task run --agent ${r} "<task>"`,`2. Run it on a server: coder dash on this machine reads it from this repo; a cloud server imports it from the dashboard or with coder agent push.`,`3. On the dashboard, create the agent's app on each platform it uses (${s.join(`, `)}) from its Platforms tab, and install it.`,`4. Fire an event by hand, or leave --server out to run it offline: coder agent run ${r} ${i[0]??`<event.json>`} --server <url>`,`Guide: https://github.com/muzam1l/coder/blob/main/docs/agents/index.md`,`Agents: coder docs agents`]:[`1. Write ${t}/system.md. Try it with no server: coder task run --agent ${r} "<task>"`,`2. Give the agent a platform under "integrations" in ${t}/agent.json, then run init again or follow the guide: coder agent integrations list`,`Guide: https://github.com/muzam1l/coder/blob/main/docs/agents/index.md`,`Agents: coder docs agents`];d.stdout.write(`\n${o(c,n)}\n`)}async function m(r){let{regexError:i}=await import(`./agent-hw3zKw8y.js`).then(e=>e.t),{INTEGRATIONS:o}=await import(`./integrations-BAgdVDhj.js`).then(e=>e.r),{PRESETS:s}=await import(`./types-D0q15RJa.js`).then(e=>e.n),c=a;d.stdout.write(`Creating ${c.cyan(`.coder/agents/${r}`)}. Pick what the agent listens to and what it may do; flags skip these questions.\n\n`);let l=await e({title:`Integrations`,hint:`Platforms the agent listens to and acts on. Add or remove them later in agent.json.`,multi:!0,selected:[Object.keys(o)[0]],options:Object.values(o).map(e=>({value:e.id,hint:e.description}))}),u={},p={};for(let e of l){let t=o[e],r=Object.keys(t.events),a=await n({title:`${e} events`,hint:`What wakes the agent on ${e}; each event runs the agent with that event as its prompt.`,multi:!0,required:!0,selected:[r.includes(`mention`)?`mention`:r[0]],options:Object.entries(t.events).map(([e,t])=>({value:e,hint:t.description,...t.noisy?{input:{label:`match`,value:`^help\\b`,placeholder:`tab to add a match`,validate:i}}:{}}))});u[e]=a.values,p[e]=a.inputs}let[m]=l.length?await e({title:`Tools`,hint:`What the agent may do on its platforms; comment suits most agents.`,selected:[`comment`],options:s.map(e=>({value:e,hint:f[e]}))}):[`comment`],h=await t(`Display name`,r,void 0,`Shown in replies and app names.`);return{...h===r?{}:{name:h},integrations:l,events:u,matches:p,tools:m}}const h=i({name:`agent init`,help:{usage:`coder agent init [id] [--integrations a,b] [--triggers a,b] [--tools <preset>] [--name <text>] [--description <text>] [--permissions <mode>] [--yes]`,summary:"Create .coder/agents/<id>/ with an agent.json built from the integration catalog, a system.md to write the prompt in, and one sample event per integration for `coder agent run`. Asks for the id, integrations, events, and tools when run in a terminal without them.",flags:[[`--integrations <a,b>`,`platforms the agent listens to (see coder agent integrations list)`],[`--triggers <a,b>`,`events that start tasks, applied to each integration that has them (default: mention)`],[`--tools <preset>`,`observe, comment, or write (default: comment)`],[`--name <text>`,`display name used in replies (default: the id)`],[`--description <text>`,`one line for agent list`],[`--permissions <mode>`,`engine permission mode (default: read-only)`],[`--yes`,`skip the questions and take the defaults`]],examples:[[`coder agent init`,`answer the questions, id included`],[`coder agent init triage --integrations github --triggers issue,mention --tools comment`,`no questions`]]},options:{...l,name:c,description:c,integrations:c,triggers:c,tools:c,permissions:c,match:c,yes:s},args:1,run:async({options:e,args:[n],cwd:i})=>{let{agents:a}=await import(`./agent-hw3zKw8y.js`).then(e=>e.t),o=r()&&!e.yes;return a.init(n,{...e,cwd:i,permissions:e.permissions,...o?{askId:e=>t(`Agent id`,``,e,`Folder name under .coder/agents and the name used in commands.`)}:{},...o&&!e.integrations?{askPicks:m}:{}})},json:(e,{cwd:t})=>({id:e.id,dir:u.relative(t,e.dir),files:e.files,samples:e.samples}),print:(e,{cwd:t})=>p(e,u.relative(t,e.dir))});export{h as commandAgentInit};
1
+ import{a as e,n as t,o as n,r}from"./prompt-CMXmt2l9.js";import{i}from"./cli-B1ObVrL4.js";import{p as a,s as o}from"./output-BKeyLbvt.js";import{n as s,s as c,t as l}from"./args-DcBCtXhz.js";import u from"node:path";import d from"node:process";const f={observe:`read the platform only`,comment:`also post replies and reactions`,write:`also push, branch, and open or merge pull requests`};function p(e,t){let n=a,{id:r,samples:i,integrations:s}=e;d.stdout.write(`Created ${n.cyan(t)}.\n`);let c=s.length?[`1. Write ${t}/system.md. Try it with no server: coder task run --agent ${r} "<task>"`,`2. Run it on a server: coder dash on this machine reads it from this repo; a cloud server imports it from the dashboard or with coder agent push.`,`3. On the dashboard, create the agent's app on each platform it uses (${s.join(`, `)}) from its Platforms tab, and install it.`,`4. Fire an event by hand, or leave --server out to run it offline: coder agent run ${r} ${i[0]??`<event.json>`} --server <url>`,`Guide: https://github.com/muzam1l/coder/blob/main/docs/agents/index.md`,`Agents: coder docs agents`]:[`1. Write ${t}/system.md. Try it with no server: coder task run --agent ${r} "<task>"`,`2. Give the agent a platform under "integrations" in ${t}/agent.json, then run init again or follow the guide: coder agent integrations list`,`Guide: https://github.com/muzam1l/coder/blob/main/docs/agents/index.md`,`Agents: coder docs agents`];d.stdout.write(`\n${o(c,n)}\n`)}async function m(r){let{regexError:i}=await import(`./agent-BlQ_dNNm.js`).then(e=>e.t),{INTEGRATIONS:o}=await import(`./integrations-B2CavXR1.js`).then(e=>e.r),{PRESETS:s}=await import(`./types-D0q15RJa.js`).then(e=>e.n),c=a;d.stdout.write(`Creating ${c.cyan(`.coder/agents/${r}`)}. Pick what the agent listens to and what it may do; flags skip these questions.\n\n`);let l=await e({title:`Integrations`,hint:`Platforms the agent listens to and acts on. Add or remove them later in agent.json.`,multi:!0,selected:[Object.keys(o)[0]],options:Object.values(o).map(e=>({value:e.id,hint:e.description}))}),u={},p={};for(let e of l){let t=o[e],r=Object.keys(t.events),a=await n({title:`${e} events`,hint:`What wakes the agent on ${e}; each event runs the agent with that event as its prompt.`,multi:!0,required:!0,selected:[r.includes(`mention`)?`mention`:r[0]],options:Object.entries(t.events).map(([e,t])=>({value:e,hint:t.description,...t.noisy?{input:{label:`match`,value:`^help\\b`,placeholder:`tab to add a match`,validate:i}}:{}}))});u[e]=a.values,p[e]=a.inputs}let[m]=l.length?await e({title:`Tools`,hint:`What the agent may do on its platforms; comment suits most agents.`,selected:[`comment`],options:s.map(e=>({value:e,hint:f[e]}))}):[`comment`],h=await t(`Display name`,r,void 0,`Shown in replies and app names.`);return{...h===r?{}:{name:h},integrations:l,events:u,matches:p,tools:m}}const h=i({name:`agent init`,help:{usage:`coder agent init [id] [--integrations a,b] [--triggers a,b] [--tools <preset>] [--name <text>] [--description <text>] [--permissions <mode>] [--yes]`,summary:"Create .coder/agents/<id>/ with an agent.json built from the integration catalog, a system.md to write the prompt in, and one sample event per integration for `coder agent run`. Asks for the id, integrations, events, and tools when run in a terminal without them.",flags:[[`--integrations <a,b>`,`platforms the agent listens to (see coder agent integrations list)`],[`--triggers <a,b>`,`events that start tasks, applied to each integration that has them (default: mention)`],[`--tools <preset>`,`observe, comment, or write (default: comment)`],[`--name <text>`,`display name used in replies (default: the id)`],[`--description <text>`,`one line for agent list`],[`--permissions <mode>`,`engine permission mode (default: read-only)`],[`--yes`,`skip the questions and take the defaults`]],examples:[[`coder agent init`,`answer the questions, id included`],[`coder agent init triage --integrations github --triggers issue,mention --tools comment`,`no questions`]]},options:{...l,name:c,description:c,integrations:c,triggers:c,tools:c,permissions:c,match:c,yes:s},args:1,run:async({options:e,args:[n],cwd:i})=>{let{agents:a}=await import(`./agent-BlQ_dNNm.js`).then(e=>e.t),o=r()&&!e.yes;return a.init(n,{...e,cwd:i,permissions:e.permissions,...o?{askId:e=>t(`Agent id`,``,e,`Folder name under .coder/agents and the name used in commands.`)}:{},...o&&!e.integrations?{askPicks:m}:{}})},json:(e,{cwd:t})=>({id:e.id,dir:u.relative(t,e.dir),files:e.files,samples:e.samples}),print:(e,{cwd:t})=>p(e,u.relative(t,e.dir))});export{h as commandAgentInit};