@wular/coder 0.4.10 → 0.4.11
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.
- package/dist/actions-Cwe3IDVs.js +2 -0
- package/dist/{adapter-BeezVK-B.js → adapter-Bi768A94.js} +1 -1
- package/dist/{adapter-ChaISKgI.js → adapter-CkL4PqXE.js} +1 -1
- package/dist/{adapter-MD6ahqPR.js → adapter-DYxjaefw.js} +1 -1
- package/dist/{add-Bk8drM-8.js → add-B6vPKZEr.js} +1 -1
- package/dist/{add-CD_L-WW8.js → add-n6c9OINP.js} +2 -2
- package/dist/{add-BbXuvqj1.js → add-v1Pv00HX.js} +1 -1
- package/dist/{add-B26QSwPY.js → add-wC8ByRgM.js} +1 -1
- package/dist/{agent-B8ItyuHN.js → agent-6GooVMsq.js} +2 -2
- package/dist/{agent-DHpMqHVi.js → agent-BkxXgha0.js} +1 -1
- package/dist/{alias-CScCzXhS.js → alias-A8ObWElH.js} +1 -1
- package/dist/{app-wHQJHu6N.js → app-CaxTL1H3.js} +1 -1
- package/dist/{approvals-BIGQBbCM.js → approvals-h5lytkey.js} +2 -2
- package/dist/{approve-DFSy7Z72.js → approve-BNhg0MLi.js} +2 -2
- package/dist/{approve-BnZ3v-3c.js → approve-BiHM8kSo.js} +1 -1
- package/dist/apps-BNe86LfS.js +367 -0
- package/dist/{archive-CU0nhUeJ.js → archive-CMHRsVYf.js} +2 -2
- package/dist/{archive-CY2lvp_c.js → archive-H2B7Me8E.js} +2 -2
- package/dist/{args-BekfmD9t.js → args-CURX44CA.js} +1 -1
- package/dist/{ask-CLDgHB_Y.js → ask-D8TIVhPl.js} +2 -2
- package/dist/{auth-C3KrIUf1.js → auth-BSMPjhnz.js} +1 -1
- package/dist/auth-D3quZAKT.js +1 -0
- package/dist/{chat-AbW-LOHo.js → chat-3AvUDOwf.js} +1 -1
- package/dist/{chat-bridge-WK-pKNfw.js → chat-bridge-BmqYsASZ.js} +1 -1
- package/dist/{cli-Fp28pM4Y.js → cli-BBlH53hA.js} +4 -4
- package/dist/cli.js +1 -1
- package/dist/{client-DzwzCsue.js → client-sqXb-y09.js} +1 -1
- package/dist/{config-DoVedq6T.js → config-K6Rrjsee.js} +1 -1
- package/dist/{connection-Cb0TK201.js → connection-B-IB8tlP.js} +1 -1
- package/dist/{connection-5V8doFL7.js → connection-BXBDeoax.js} +1 -1
- package/dist/{create-CrjRdQip.js → create-CP_JmJnh.js} +1 -1
- package/dist/{credentials-DoL9w8D1.js → credentials-BRFajC0d.js} +1 -1
- package/dist/dash/standalone/server/build-index.json +1 -1
- package/dist/dash/standalone/server/manifest.json +1273 -1273
- package/dist/dash/standalone/server/modules-server-server-react-server/src/client/{index.843431e3538fd9a4.js → index.0de14cb4e30bd70d.js} +1 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/api/{load.7ae462ef36271be8.js → load.be791a5eaf328738.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/connect/{page.806027fde54ab723.js → page.0fbfdba5254f7ae5.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/create/[id]/{page.bd04d2d3eba00676.js → page.70913bd4075da914.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{notify.857748e260c691e3.js → notify.61aab176baeefebd.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{page.25153459858542f9.js → page.815371ed0d5dd4fa.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{sign-out.ff98573f362d76f3.js → sign-out.1d6af804f9ec043d.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{agents-grid.8efd14bc39281da9.js → agents-grid.f43bcc1148ce3650.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{connect-apps.d1e67db29b12dc0a.js → connect-apps.f3af8cc8540719d7.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{page.0f7d5e3e42462870.js → page.5f88059c03cf82b4.js} +7 -7
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{layout.05210ffa6038791f.js → layout.b7392d534ce0410e.js} +7 -7
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{page.19fe116c0f802cb1.js → page.5aae24bbfd90c434.js} +7 -7
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{page.f87fd8eb66f73af0.js → page.91c992fdd3b4a493.js} +12 -16
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{platform-actions.b6c3d3184e167d0b.js → platform-actions.8e7ca54dd1821e98.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/settings/{agent-settings-form.28220621573033d7.js → agent-settings-form.eb707a9e32718374.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/settings/{page.2f7467868f599ebc.js → page.9ec1ec08ba05da59.js} +6 -6
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/tasks/{loading.ec94096015346f2c.js → loading.dd9088a4581b1d65.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/tasks/{page.a92a36a8ce21088c.js → page.71dc042821133e82.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/usage/{page.8935a5fe5c08bcf1.js → page.45e18b6dc3019af4.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{versions-list.5b97ab6d40e2e639.js → versions-list.c8d76988c734dda2.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/edit/{loading.bedcc1aba372fbce.js → loading.b1367e864b4fb406.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/edit/{page.14760e9eedd6ff8e.js → page.e3179ddf20a7e55d.js} +6 -6
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{agent-toggle.a6ee8bd882178e29.js → agent-toggle.1579dc8acbaacf92.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{hero.8be1dd4ea3ed6e17.js → hero.ad5cc342db794e5d.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{connect-repositories.59d89152fe845af2.js → connect-repositories.43b4b28f194ea842.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{editor.77f68d431408745b.js → editor.62cb8207218e6437.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{import-picker.a7b01817a821819a.js → import-picker.eafa5b41a2ed571f.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/new/{page.c4570fd80bdda68c.js → page.dffb05f2d256d81a.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{layout.19006c2d7dc8d114.js → layout.393cf7429eea189e.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/operator/{operator-apps.d350a52d27f69fa6.js → operator-apps.a244f3199e7cf09c.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/operator/{page.4a652f5080c2b863.js → page.980adfb7c5714752.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{page.d39f7a1719f50c6d.js → page.24a1987405ed7b17.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{connections-list.ff7e1dadcd4df17f.js → connections-list.21ec9dc73ce68656.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{credentials-list.87a1f8ab71eb4bed.js → credentials-list.683476f62a9ecde7.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{credentials.a535c9c6dd8b4cdf.js → credentials.b43dd3d97c536c2a.js} +8 -8
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{engines-list.29fffd07c1c3b771.js → engines-list.9e116751bd34e2cc.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{list.0c87d55cf4ef382c.js → list.083f5c665df04b1b.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{models-list.6fea9faddb8300bb.js → models-list.537f63f8e5dd085d.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{page.295245052b93af90.js → page.dfed4ae6ffc74434.js} +12 -12
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{runners-list.a4a38e54d834a1ec.js → runners-list.3afa989490bbe77c.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{secrets-list.50f487766f87383c.js → secrets-list.0d175ee815b22cd7.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{layout.c42e0ab39cb2c0e0.js → layout.3e8289f888fa444c.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{page.6997506eaa1a4824.js → page.06feaa5fbb06f1e6.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{create-link.9458b49dc99bbaaa.js → create-link.ff95e4b6977d0474.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{page.77e402bb6e8e7f7e.js → page.f06fda0df59beeb5.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{activity.fcda6f18c8207c99.js → activity.3c79cf14feff12bf.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{page.d0f039221a27b8ef.js → page.25b29e72df84806b.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{task-actions.f5f2016d2dc7f422.js → task-actions.587da79d68ab8d14.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{task-view.a292baa2410cdf64.js → task-view.f2e902c8208b2e78.js} +6 -6
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{composer.2d4122eb33addbdd.js → composer.b0bb1faaac8e0b6c.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{tasks-list.021bdc2f3d90af2d.js → tasks-list.b52a49fb5faeefd0.js} +7 -7
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{tasks-section.13f64b0836ae406b.js → tasks-section.80f9c9a42ecae854.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{page.b78f0df100410db0.js → page.20b5c22658eae312.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/usage/{page.93c2306069c03c68.js → page.fb21ebe90d49dac1.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{stream.95a2468086aceb84.js → stream.e2915852cf82c86b.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{task-toasts.e1a484113e1df660.js → task-toasts.0ed8ccaae81b9d53.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/utils/{action.968bcab0f5e3665d.js → action.b9a5c37272250e82.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/utils/{client.189224c16057d7a1.js → client.a3928fa2dcd27b75.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/action-fc8716cda7527d8c.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{agent-pills-0c0b8d40b9bfc78f.js → agent-pills-bd32cb89331aff7e.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{agent-settings-form-5a2601316e2ab283.js → agent-settings-form-f5576a2c50fce094.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{agent-toggle-5ede0c449e88cb9d.js → agent-toggle-a45b95908d62f926.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{agents-grid-ffb18df48e951ecb.js → agents-grid-9f79b5074899c8be.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{back-602db2cfdccf2e7f.js → back-b0cd2b85c9d8403e.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{combo-df2685e277db02c0.js → combo-1050768988cd0347.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{composer-e1cefed81ea89b7e.js → composer-87f138e21d68370d.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/composer-8f0e8b1d07e74aad.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{confirm-d163e6865d66dfab.js → confirm-01d5814b1c5f7721.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/connect-apps-857dc9fa3f6f5bbc.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{connect-repositories-0aa9abc77b9c3d48.js → connect-repositories-49098298b3a82647.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{connections-list-6eddeb8583ded10f.js → connections-list-46d48443d8fc8a0d.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{copy-0cc00656953531be.js → copy-5db9d328f8f65d82.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/create-link-6b6e9eeac436c4af.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{credentials-list-1b6a81e9b4934dc8.js → credentials-list-3cccc85ef335cb22.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{custom-range-cae5567874db83ca.js → custom-range-fdf1946aac09cfc3.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{editor-d55d247a1d7de5f0.js → editor-d2460c315bb1fd32.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{engines-list-288559344de4d4b9.js → engines-list-0159c8baa0b3e711.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{field-693bb870ad0bdee8.js → field-c530e261587d94df.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{instructions-a3d7688e421f2a08.js → instructions-3ea5afeea1992bf2.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/instructions-d8884576a18e6cdb.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{list-2a59237cb7cb0a7c.js → list-b67ce61483dd6acb.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{models-list-5ed9ee02f9b66d98.js → models-list-98c956ba00913a73.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{notice-7d84ffab32ff24ca.js → notice-8939183c8a889bae.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{outcome-dialog-3cffe3507ea92af2.js → outcome-dialog-6323cb5300b6d3c9.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/outcome-dialog-be3fbe8c4b43d180.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{platform-actions-4dc31567d00c4cb2.js → platform-actions-aafbf038008de64f.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/platform-actions-ed27388f722b4a4c.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{runners-list-984246a8f9450da1.js → runners-list-a13d0f8f6583c6d2.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{runtime-6e12333f12903a62-1.js → runtime-71b727f8f5906f08-1.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{secrets-list-88f8b30abbab52f0.js → secrets-list-53a0c079492199c9.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{segmented-79c9c69b702e0b90.js → segmented-a3642b8169857fb1.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/shared-init-6cad28f8cc696d91.js +2 -0
- package/dist/dash/standalone/static/assets/chunks/shared-init-71b727f8f5906f08-2.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/shared-init-94883db7bc70a5a8.js +5 -0
- package/dist/dash/standalone/static/assets/chunks/side-toggle-a2f67a8671a0309b.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{tail-99e29a541a072002.js → tail-81b69d49bfebfd4c.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{task-actions-1cdca1e8d3eee490.js → task-actions-25c70b47b5a53cd2.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{task-view-fdcde0e31f63b737.js → task-view-e5ee0ada38552918.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{tasks-list-3ad1c93deff4fb2e.js → tasks-list-d58f3063ae31d9d2.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{versions-list-60ac4d8f715bf5f7.js → versions-list-fbeed95c0b4e5f0f.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{wular-pnext-6e12333f12903a62-0.js → wular-pnext-71b727f8f5906f08-0.js} +1 -1
- package/dist/dash/standalone/static/assets/pnext-client-037852a9f274c8c8.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-10eac8df53f62104.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-12635905e9754177.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-12955733c71cc641.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-26999113ea61d5b9.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-27b6e4b7d1697094.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-34fec171024dd082.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-44eb6d4096f7e875.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-4c558a168b95d9b1.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-5d21f3dd3f4407af.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-5fe04a4e1dff28a3.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-88bbc009041aa776.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-b36106c6b8a6cd35.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-b47dda1cd4cfac04.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-b556f5611fdcf545.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-b8485144ca29d436.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-c5c3c90b3518c5a8.js +1 -0
- package/dist/dash/standalone/static/assets/{pnext-client-ab36b406301fd2a4.js → pnext-client-e4c659a371f4cd79.js} +1 -1
- package/dist/dash/standalone/static/assets/pnext-client-f139547dc55d7d76.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-fd280710b31af681.js +1 -0
- package/dist/{default-tTTSBdXq.js → default-Ojx5oFuw.js} +1 -1
- package/dist/{delete-DM2sA12f.js → delete-D1hEPpsk.js} +2 -2
- package/dist/{delete-DR37NTr1.js → delete-UyzcQPoG.js} +2 -2
- package/dist/{disable-Dz_zLPX5.js → disable-Dml_Slph.js} +1 -1
- package/dist/{discover-CqabH4Fx.js → discover-CyIfIBGD.js} +2 -2
- package/dist/dispatch-CFZ9Crvg.js +8 -0
- package/dist/{docs-b2mAKC8Z.js → docs-BUHKbQjM.js} +1 -1
- package/dist/{docs-BV9SC67g.js → docs-CvjWiada.js} +1 -1
- package/dist/drive-BqunNi9n.js +1 -0
- package/dist/{enable-Cfeki-ne.js → enable-xye-Nanc.js} +1 -1
- package/dist/{env-DSddo-fz.js → env-BgE9ipvN.js} +1 -1
- package/dist/exec-Cprez703.js +3 -0
- package/dist/{executor-LkokKTTd.js → executor-3QMa-XRY.js} +5 -5
- package/dist/flow/builtin/review.d.ts +1 -1
- package/dist/flow/builtin/review.js +1 -1
- package/dist/flow/index.d.ts +1 -1
- package/dist/flow/index.js +1 -1
- package/dist/{flow-BQcdyrVK.js → flow-CtillCQY.js} +1 -1
- package/dist/{history-D_A5odLI.js → history-C53URBjs.js} +1 -1
- package/dist/{http-CXaW1e7x.js → http-CDZKt5ln.js} +1 -1
- package/dist/hub-B0WCXtsP.js +2 -0
- package/dist/{init-DU_S43NG.js → init-HdSVUozH.js} +1 -1
- package/dist/integrations-BdLs4W6o.js +1 -0
- package/dist/{integrations-DPxWtNnS.js → integrations-IGnXBrPw.js} +2 -2
- package/dist/lib/broker.js +2 -2
- package/dist/{list-_EH6c041.js → list-1IMeVNg3.js} +1 -1
- package/dist/{list-CIS-GYO1.js → list-BTjIMvNs.js} +1 -1
- package/dist/{list-BJ0j5eP9.js → list-BlOB32n6.js} +2 -2
- package/dist/{list-CR0_Emod2.js → list-CZGTVKcS.js} +2 -2
- package/dist/{list-CnHZriYt.js → list-CquHtsmW.js} +1 -1
- package/dist/{list-i2r3Nlyz.js → list-CxjPT0Il.js} +1 -1
- package/dist/{list-7yd9K7d8.js → list-DvFVuGT_.js} +1 -1
- package/dist/{list-Boaz5b5n.js → list-gFnOS9Hk.js} +2 -2
- package/dist/load-Q9fL4VC6.js +2 -0
- package/dist/{local-Fs-dx_dP.js → local-Bzdmzc1o.js} +1 -1
- package/dist/{login-DISw6--d.js → login-C723kHh6.js} +1 -1
- package/dist/{login-CzD2EMD_.js → login-Dq3r6gh6.js} +1 -1
- package/dist/{logout-DMnc5yri.js → logout-DEg0aTmq.js} +1 -1
- package/dist/{maintenance-BVDuG9Hg.js → maintenance-DYOstY6V.js} +1 -1
- package/dist/{match-BfjPZ7gJ.js → match-BwcxeAZF.js} +1 -1
- package/dist/{mcp-CbN-QcpF.js → mcp-CKqinFkk.js} +1 -1
- package/dist/mcp-Dsl3Xdd3.js +13 -0
- package/dist/mcp-server-BlP9lACI.js +1 -0
- package/dist/{model-Ckyoyji3.js → model-Bs27g5EX.js} +1 -1
- package/dist/{models-VaiIYlOW.js → models-Cb0ZTKZ7.js} +1 -1
- package/dist/{prompt-DQyPCLUo.js → prompt-PEgcMJO7.js} +1 -1
- package/dist/prompts-Bj4Fbd_n.js +78 -0
- package/dist/{push-BNomfHJ3.js → push-DpEW4XbQ.js} +1 -1
- package/dist/{reconnect-Bd_jna1M.js → reconnect-BmP_XXDv.js} +1 -1
- package/dist/refresh-SHNJq9Cx.js +1 -0
- package/dist/{remote-f-uny3XZ.js → remote-D3JZ4MMQ.js} +1 -1
- package/dist/{remove-DdcQ-6by.js → remove-BZZgJq8Z.js} +1 -1
- package/dist/{remove-VtavIuGm.js → remove-CId1EwPg.js} +1 -1
- package/dist/{remove-DMTz_c25.js → remove-Ci87WQq0.js} +1 -1
- package/dist/{remove-CCYHc1FN.js → remove-DxCv9BB4.js} +1 -1
- package/dist/{rename-CKMyelWN.js → rename-DJaf5SwH.js} +1 -1
- package/dist/{result-CH3_tVXO.js → result-BesDQ-b1.js} +2 -2
- package/dist/{result-DvOqIwhh.js → result-D0dpv2O_.js} +4 -4
- package/dist/{resume-6j3RUpqa.js → resume-2Y0uC5MM.js} +2 -2
- package/dist/{review-B4ETH5ki.js → review-DIm9oK_W.js} +2 -2
- package/dist/{review-DDYD3Yvq.d.ts → review-Dxs-idTn.d.ts} +1 -1
- package/dist/{rotate-key-Byk_wI73.js → rotate-key-CS1G6ReH.js} +1 -1
- package/dist/{run-LCE1XiyU.js → run-BKUd6B8S.js} +1 -1
- package/dist/{run-DkYzyUnp.js → run-DjTTb8oA.js} +2 -2
- package/dist/{run-DKJW7qwy.js → run-UPW-7pKo.js} +2 -2
- package/dist/runner-BLS_ReEw.js +1 -0
- package/dist/{runner-CxtzTgVq.js → runner-BM_98EQl.js} +1 -1
- package/dist/runner.json +1 -1
- package/dist/runner.tgz +0 -0
- package/dist/{runners-vsoGeyuc.js → runners-DyLnqHKy.js} +2 -2
- package/dist/{schema-Brm7WIKd.js → schema-CjHmulYJ.js} +1 -1
- package/dist/schema.d.ts +1 -1
- package/dist/schema.js +1 -1
- package/dist/{sdk-CKTCrtGe.d.ts → sdk-B4Cl0Hbw.d.ts} +18 -122
- package/dist/sdk.d.ts +3 -3
- package/dist/sdk.js +1 -1
- package/dist/{serve-D8J-sEqm.js → serve-BApfeXk8.js} +2 -2
- package/dist/{serve-CCxSxXgv.js → serve-DE1cKoGa.js} +1 -1
- package/dist/{serve-C6tsUF0D.js → serve-lF97RlpX.js} +2 -2
- package/dist/{serve-C1zag2nr.js → serve-mXTjboT1.js} +1 -1
- package/dist/{server-B4SRYM2L.js → server-CUsxAflx.js} +1 -1
- package/dist/{setup-host-EaP4GPKB.js → setup-host-tlsilI6C.js} +1 -1
- package/dist/{show-xdsqD6de.js → show-Dn7zTz-9.js} +1 -1
- package/dist/{show-CjUG_aIp.js → show-uyUpeqa9.js} +1 -1
- package/dist/{slack-Kpj-G9FE.js → slack-DhPhLuWb.js} +4 -4
- package/dist/{status-BxV_ITeF.js → status-D_1VGn9F.js} +1 -1
- package/dist/{steer-DZ3nkHfC.js → steer-CMp-a7v2.js} +2 -2
- package/dist/{stop-qDw_DjOB.js → stop-C7YjN2sB.js} +1 -1
- package/dist/{stop-DGTUYxd6.js → stop-D8G7AtdY.js} +2 -2
- package/dist/{task-C506SkPR.js → task-DJ6nruuA.js} +1 -1
- package/dist/task-DeFLNmQH.js +1 -0
- package/dist/task-bkoi8_NN.js +7 -0
- package/dist/{test-DF_qVK6S.js → test-BD9rvefN.js} +1 -1
- package/dist/tools-CdWkwI1g.js +1 -0
- package/dist/{types-8zO5Tc9c.d.ts → types-C6NAqGqn.d.ts} +20 -31
- package/dist/{unalias-CklkAN1B.js → unalias-bL5t8Isc.js} +1 -1
- package/dist/{update-CZaFjwOJ.js → update-DIYW08ME.js} +1 -1
- package/dist/{upgrade-CUhFmPhl.js → upgrade-3fH6dGJw.js} +2 -2
- package/dist/{usage-DTAlb2rC.js → usage-Dr8F0xt0.js} +1 -1
- package/dist/{views-LmbLfqpu.js → views-CE2d9x6T.js} +1 -1
- package/dist/{watch-CJruitc6.js → watch-BiyN4NxE.js} +3 -3
- package/dist/{watch-p0j69fVA.js → watch-DJXu13jK.js} +5 -5
- package/dist/{wire-DshFMRsS.js → wire-nJ7sEi-M.js} +1 -1
- package/dist/worker-CHD_OiQS.js +1 -0
- package/dist/worker-KfrTK_Dk.js +2 -0
- package/dist/{workflow-CJJUiSfv.js → workflow-C21qQ4rT.js} +1 -1
- package/docs/agents/index.md +2 -2
- package/docs/agents/prompt.md +19 -8
- package/docs/mcp.md +1 -1
- package/package.json +1 -1
- package/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/plugins/cursor/.cursor-plugin/plugin.json +1 -1
- package/dist/actions-C3Mgpl9J.js +0 -2
- package/dist/apps-6BgpUsFh.js +0 -372
- package/dist/auth-CGeSfgNb.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/action-410bdc82c416bc01.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/composer-08e49d49c0c3ee94.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/connect-apps-ce3c9d049ebad459.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/create-link-bc365f8dfe88e6b3.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/instructions-3f18e035338b0d0b.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/outcome-dialog-f6fb8c69efa66508.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/platform-actions-ecd7200f7749c258.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/shared-init-6e12333f12903a62-2.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/shared-init-962398d15ee67c92.js +0 -5
- package/dist/dash/standalone/static/assets/chunks/shared-init-ae95a674d381c095.js +0 -2
- package/dist/dash/standalone/static/assets/chunks/side-toggle-7ada95cc7601eb49.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-0b3b70f1aefb9947.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-0d90849808b6eb05.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-12faa1754e3ef3be.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-23384b239b81a761.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-23e200dd9b7a79c0.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-2562299eef46e62c.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-3a4ada64991e6a40.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-71e7ecdfcf86be84.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-726c29bbb81054c0.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-825e9f5b63950ef4.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-894cff70289fb7a3.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-8f96a4b8a00ff460.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-9bc9b14c08020649.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-b8c585cae8da7778.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-bab4305b41abb15a.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-bd80926822b3993d.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-cd4c7b4318fa1846.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-db55344d00b7888f.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-eddcd5df2b28120f.js +0 -1
- package/dist/dispatch-BJZqI7sj.js +0 -8
- package/dist/drive-CU2HOCfR.js +0 -1
- package/dist/exec-DcWxZar6.js +0 -3
- package/dist/integrations-Dwvxl7i2.js +0 -1
- package/dist/load-C-GZnuok.js +0 -2
- package/dist/mcp-B-hy3eM-.js +0 -11
- package/dist/mcp-server-DQqSgD3P.js +0 -1
- package/dist/prompts-CEf7z4i_.js +0 -77
- package/dist/refresh-D-broYEx.js +0 -1
- package/dist/runner-Dnu1Vx_i.js +0 -1
- package/dist/task-CQmx_2SI.js +0 -7
- package/dist/task-Ls_-kcSx.js +0 -1
- package/dist/tools-S3eRQOVm.js +0 -1
- package/dist/worker-BHXjDzRp.js +0 -1
- package/dist/worker-nyRZuq4g.js +0 -2
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import{Rt as e,wi as t}from"./core-DwsAMCnL.js";import{$ as n,A as r,An as i,D as a,Dn as o,Dr as s,E as c,En as l,G as u,I as d,Jn as f,Jt as p,L as m,M as h,Mn as g,N as _,Nn as v,O as y,Or as b,P as x,Pn as S,Pt as C,T as w,Tn as T,U as E,V as ee,Vt as D,W as O,Wt as te,X as ne,Yt as re,_ as ie,_r as ae,dr as oe,fn as se,hn as ce,it as le,j as ue,k as de,kr as fe,kt as pe,lr as k,lt as me,mn as he,n as ge,nn as A,on as _e,or as ve,pn as ye,q as be,qt as xe,st as Se,t as Ce,un as we,ur as j,ut as Te,vn as Ee,wn as De,wt as Oe,yn as ke}from"./prompts-Bj4Fbd_n.js";import M from"node:path";import N from"node:process";import{fileURLToPath as Ae}from"node:url";import P from"node:fs";import{spawn as je,spawnSync as F}from"node:child_process";import{createHash as Me,randomUUID as I}from"node:crypto";import L from"node:os";import{setImmediate as Ne}from"node:timers/promises";var R=class extends Error{code;hint;taskId;payload;approval;result;runId;status;needs;constructor(e,t,n={}){super(t),this.name=`CoderError`,this.code=e,Object.assign(this,n)}};const Pe=/access token could not be refreshed/i,Fe=/model is not supported|Codex cannot run model/i;function z(e){return e instanceof Error?e.message:String(e??``)}function B(e){return Pe.test(e??``)}function Ie(e){return Fe.test(e??``)}function Le(e,t){return!Ie(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 Re(e=process.env){return M.join(e.CODEX_HOME||M.join(L.homedir(),`.codex`),`auth.json`)}function ze(e){try{let t=JSON.parse(Buffer.from(String(e).split(`.`)[1]??``,`base64url`).toString(`utf8`));return String(t.sub??t.email??``)}catch{return``}}function Be(e=process.env,t){let n=Re(e),r;try{r=P.statSync(n).mtimeMs}catch{return``}if(t?.file===n&&t.mtimeMs===r)return t.fingerprint??``;try{let e=JSON.parse(P.readFileSync(n,`utf8`)),i=e.OPENAI_API_KEY?Me(`sha256`).update(String(e.OPENAI_API_KEY)).digest(`hex`):``,a=[e.auth_mode??``,e.tokens?.account_id??``,ze(e.tokens?.id_token),i].join(`|`);return t&&Object.assign(t,{file:n,mtimeMs:r,fingerprint:a}),a}catch{return t?.file===n?t.fingerprint??``:``}}function Ve(e,t){let n=`${e}.${I()}.tmp`;P.writeFileSync(n,JSON.stringify(t),{flag:`wx`}),P.renameSync(n,e)}function He(e,t){let n=P.mkdtempSync(M.join(L.tmpdir(),e)),r=new Map,i=!1,a=()=>{try{for(let e of P.readdirSync(n)){if(!e.endsWith(`.request.json`))continue;let a=e.slice(0,-13),o=M.join(n,e),s=M.join(n,`${a}.response.json`);if(P.existsSync(s)){P.rmSync(o,{force:!0});continue}if(r.has(a))continue;let c=`${o}.processing`;P.renameSync(o,c);let l=(async()=>{let e;try{let n=JSON.parse(P.readFileSync(c,`utf8`));if(n.id!==a)throw Error(`Invalid control request id.`);e={id:a,result:await t(n,i)}}catch(t){let n=t;e={id:a,error:{message:n.message,retryable:n.retryable===!0,rpcCode:n.rpcCode}}}Ve(s,e),P.rmSync(c,{force:!0})})();r.set(a,l),l.finally(()=>r.delete(a)).catch(()=>{})}}catch{}},o=oe(n,a),s=setInterval(a,3e4);return s.unref(),{endpoint:`file:${n}`,async close(){if(i)return;i=!0,clearInterval(s);let e=Date.now()+3e3;try{for(;a(),await Promise.allSettled([...r.values()]),await Ne(),!(!P.existsSync(n)||!P.readdirSync(n).some(e=>e.endsWith(`.reader`))||Date.now()>=e);)await o.wait(e-Date.now())}finally{o.close(),P.rmSync(n,{recursive:!0,force:!0})}}}}async function Ue(e,t,n,r){if(!e)return{ok:!1,retryable:!0,detail:`${r} endpoint is not ready.`};if(!e.startsWith(`file:`)||e.length===5)return{ok:!1,retryable:!1,detail:`Unsupported ${r} endpoint: ${e}`};let i=e.slice(5),a=oe(i),o=M.join(i,`${I()}.reader`),s=!1;try{P.writeFileSync(o,``);let e=M.join(i,`${t.id}.response.json`);P.existsSync(e)||Ve(M.join(i,`${t.id}.request.json`),t),s=!0;let c=Date.now()+n;await Ne();let l=await a.until(()=>{try{let n=JSON.parse(P.readFileSync(e,`utf8`));if((!t.command||n?.error?.retryable)&&P.rmSync(e,{force:!0}),n?.id!==t.id)throw Error(`Malformed ${r} response id.`);if(n.error)return{ok:!1,retryable:n.error.retryable===!0,detail:String(n.error.message)};if(!(`result`in n))throw Error(`Malformed ${r} response.`);return{ok:!0,retryable:!1,result:n.result,detail:`${r} accepted control.`}}catch(e){if(e.code!==`ENOENT`)throw e;if(!P.existsSync(i))throw Error(`${r} endpoint closed after control publication; acceptance is unknown.`)}},Math.max(0,c-Date.now()));if(l)return l;throw Error(`Timed out waiting for ${r} acknowledgement.`)}catch(e){return{ok:!1,retryable:!s&&e.code===`ENOENT`,detail:e instanceof Error?e.message:String(e)}}finally{a.close(),P.rmSync(o,{force:!0})}}const We=`CODER_MAILBOX`,Ge=/^([a-f0-9-]{36})\.(?:req|applying)\.json$/;function V(e){if(!e)return I();if(!e.task||!Number.isInteger(e.generation)||e.generation<0||!Number.isInteger(e.seq)||e.seq<0)throw Error(`Invalid command key`);let t=Me(`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 Ke=[`hint`,`taskId`,`payload`,`approval`,`result`,`runId`,`status`];function qe(e=N.env){return e.CODER_MAILBOX||void 0}function Je(e,t){let n=`${e}.${I()}.tmp`;P.writeFileSync(n,JSON.stringify(t),{encoding:`utf8`,flag:`wx`}),P.renameSync(n,e)}async function Ye(e,t,n={}){let r=n.dir??qe();if(!r)throw Error(`No mailbox: not inside an agent task.`);let i=n.id??I(),a=M.join(r,`${i}.res.json`);P.existsSync(a)||Je(M.join(r,`${i}.req.json`),{kind:e,payload:t});let o=Date.now();for(;!P.existsSync(a);){if(n.timeoutMs&&Date.now()-o>=n.timeoutMs)throw Error(`Worker control timed out`);await new Promise(e=>setTimeout(e,100))}let{result:s,error:c}=JSON.parse(P.readFileSync(a,`utf8`));if(n.keepReply||P.rmSync(a,{force:!0}),c){let{code:e,message:t,...n}=c;throw new R(e,t,n)}return s}function Xe(e,t){P.mkdirSync(e,{recursive:!0});let n=new Set,r=async(r,i)=>{let a;try{let n=M.join(e,r);if(!P.lstatSync(n).isFile())throw Error(`mailbox request is not a regular file`);let{kind:o,payload:s}=JSON.parse(P.readFileSync(n,`utf8`)),c=M.join(e,`${i}.applying.json`);P.existsSync(c)||Je(c,{kind:o,payload:s});let l=Object.hasOwn(t,o)?t[o]:void 0;if(!l)throw Error(`unknown mailbox request "${o}"`);a={result:await l(s??{})??null}}catch(e){let t=e instanceof R?e:void 0;a={error:{code:t?.code??`invalid-option`,message:e instanceof Error?e.message:String(e),...Object.fromEntries(Ke.flatMap(e=>t?.[e]===void 0?[]:[[e,t[e]]]))}}}try{Je(M.join(e,`${i}.res.json`),a),P.rmSync(M.join(e,`${i}.req.json`),{force:!0}),P.rmSync(M.join(e,`${i}.applying.json`),{force:!0}),n.delete(i)}catch{}},i=setInterval(()=>{let t=[];try{t=P.readdirSync(e)}catch{return}for(let i of t){let t=Ge.exec(i)?.[1];if(t){if(P.existsSync(M.join(e,`${t}.res.json`))){P.rmSync(M.join(e,i),{force:!0});continue}n.has(t)||(n.add(t),r(i,t))}}},100);return()=>clearInterval(i)}function Ze(e,t){return t.agentId?M.join(A(e,t.id),`mailbox`):null}function Qe(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 H(e,t,n){return Object.assign(Error(e),{retryable:t,...n===void 0?{}:{rpcCode:n}})}function $e(e,t,n,r){if(!e||e.id!==t||e.method!==`turn/steer`&&e.method!==`turn/interrupt`)throw H(`Invalid Codex control request.`,!1);let i=e.params;if(!i||typeof i!=`object`||i.threadId!==n)throw H(`Codex control request does not match its owning thread.`,!1);if(e.method===`turn/interrupt`){if(i.turnId!==r)throw H(`Codex turn/interrupt request does not match its owning active turn.`,!1);return{method:e.method,params:i}}if(i.expectedTurnId!==r)throw H(`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 H(`Invalid Codex turn/steer input schema.`,!1);return{method:e.method,params:i}}async function et(e,{threadId:t,turnId:n}){return He(`coder-codex-control-`,async(r,i)=>{if(i)throw H(`Codex owner endpoint is shutting down.`,!0);let a=$e(r,r.id,t,n);try{return await e.request(a.method,a.params)}catch(e){throw H(e instanceof Error?e.message:String(e),Qe(e),e.rpcCode)}})}function tt(e){if(e?.startsWith(`file:`)&&e.length>5){let t=M.resolve(e.slice(5)),n=M.resolve(L.tmpdir());M.dirname(t)===n&&M.basename(t).startsWith(`coder-codex-control-`)&&P.rmSync(t,{recursive:!0,force:!0})}}async function nt(e,t,n,r=3e3,i){return Ue(e,{id:V(i),method:t,params:n,command:i},r,`Codex control`)}const rt=`Coder Task`;function it(e,t=72){let n=String(e??``).trim().replace(/\s+/g,` `);return n?n.length<=t?n:`${n.slice(0,t-3)}...`:``}function at(e){let t=it(e,56);return t?`${rt}: ${t}`:rt}function ot(e){return e?.params?.threadId??null}function st(e){return e?.params?.turnId?e.params.turnId:e?.params?.turn?.id?e.params.turn.id:null}function ct(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 lt(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 ut(e){try{let t=P.readFileSync(e,`utf8`),n=t?t.split(/\r\n|\r|\n/).length-+!!t.endsWith(`
|
|
2
|
+
`):0;return n>0?[n===1?`L1`:`L1-L${n}`]:[]}catch{return[]}}function dt(e,t,n){let r=typeof e.kind==`string`?e.kind:e.kind?.type??`change`,i=e.path||`(unknown path)`,a=lt(e.diff??``,r),o=a.length||r!==`add`||!t?a:ut(i),s=typeof e.kind==`object`&&e.kind?.move_path?` -> ${n?j(n,e.kind.move_path):e.kind.move_path}`:``;return`${r} ${n?j(n,i):i}${s}${o.length?` ${o.join(`, `)}`:``}`}function ft(e,t=!1,n){return(e.changes??[]).map(e=>dt(e,t,n)).join(`; `)}function pt(e){let t=e.trim().split(` `)[0]??``;return t===`/dev/null`?``:t.replace(/^[ab]\//,``)}function mt(e,t){let n=new Map,r=``,i=``;for(let t of e.split(/\r?\n/)){if(t.startsWith(`--- `)){r=pt(t.slice(4));continue}if(t.startsWith(`+++ `)){i=pt(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?j(t,e):e} ${n.join(`, `)}`).join(`; `)}function ht(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 gt(e){if(e.tokenUsageByThread.size===0)return null;let t={input:0,cachedInput:0,output:0,total:0};for(let[n,r]of e.tokenUsageByThread){let i=e.tokenUsageBaselineByThread.get(n);t.input+=Math.max(0,r.input-(i?.input??0)),t.cachedInput+=Math.max(0,r.cachedInput-(i?.cachedInput??0)),t.output+=Math.max(0,r.output-(i?.output??0)),t.total+=Math.max(0,r.total-(i?.total??0))}return t}function _t(e){return String(e??``).replace(/\s+/g,` `).trim()}function U(e){if(!e)return[];if(typeof e==`string`){let t=_t(e);return t?[t]:[]}if(Array.isArray(e))return e.flatMap(e=>U(e));if(typeof e==`object`){let t=e;if(typeof t.text==`string`)return U(t.text);if(`summary`in t)return U(t.summary);if(`content`in t)return U(t.content);if(`parts`in t)return U(t.parts)}return[]}function vt(e,t){let n=[];for(let r of[...e,...t]){let e=_t(r);!e||n.includes(e)||n.push(e)}return n}function W(e,t,n=null,r={}){!e||t==null||e({message:t,phase:n,...r})}function yt(e,t){t&&W(e,t.message,t.phase??null,t.extra??{})}function bt(e){return e.replace(/^\/(?:usr\/)?bin\/\w*sh\s+-l?c\s+/,``)}function xt(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 G(e){return e==null?``:typeof e==`string`?e:JSON.stringify(e)}function St(e){let t=String(e.tool||e.name||e.kind||e.type||`tool`),n=Object.fromEntries(Object.entries(e).filter(([e,t])=>t!=null&&![`id`,`type`,`kind`,`name`,`tool`,`status`,`result`,`results`,`output`,`error`,`contentItems`,`success`,`durationMs`,`exitCode`].includes(e))),r=Object.keys(n).length?G(n):``;return{message:r?`${t} ${r}`:t,phase:`investigating`,extra:{kind:`tool`,tool:t}}}function Ct(e,t){switch(e.type){case`commandExecution`:return{message:bt(String(e.command??``).trim())||`command`,phase:`running`,extra:{kind:`tool`,tool:`command`}};case`fileChange`:return{message:ft(e,!1,t)||`edit`,phase:`editing`,extra:{kind:`tool`,tool:`edit`}};case`mcpToolCall`:return{message:[`${e.server}/${e.tool}`,G(e.arguments)].filter(Boolean).join(` `),phase:`investigating`,extra:{kind:`tool`,tool:String(e.tool??``)}};case`dynamicToolCall`:return{message:[[e.namespace,e.tool||`tool`].filter(Boolean).join(`/`),G(e.arguments)].filter(Boolean).join(` `),phase:`investigating`,extra:{kind:`tool`,tool:String(e.tool??``)}};case`webSearch`:{let t=e.action,n=Array.isArray(t?.queries)?t.queries.filter(e=>typeof e==`string`&&e.trim()):[],r=n.length?n.join(`; `):String(t?.query||e.query||``).trim()||G(t);return{message:r?`search: ${r}`:`search`,phase:`investigating`,extra:{kind:`tool`,tool:`search`}}}case`agentMessage`:case`reasoning`:case`userMessage`:return null;default:return St(e)}}function wt(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=U(e.summary).join(`
|
|
3
|
+
`);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(),durationMs:e.durationMs,...t===null?{isError:e.status!==`completed`}:{exitCode:t}}}}case`fileChange`:return{message:ft(e,!0,t)||`(details unavailable)`,phase:`editing`,extra:{kind:`tool-result`,tool:`edit`,isError:e.status!==`completed`}};case`mcpToolCall`:return{message:G(e.error??e.result)||`${e.server}/${e.tool} ${e.status}`,phase:`investigating`,extra:{kind:`tool-result`,tool:String(e.tool??``),durationMs:e.durationMs,isError:e.status!==`completed`||e.error!=null}};case`dynamicToolCall`:return{message:G(e.contentItems)||`${e.tool} ${e.status}`,phase:`investigating`,extra:{kind:`tool-result`,tool:String(e.tool??``),durationMs:e.durationMs,isError:e.status!==`completed`||e.success===!1}};case`userMessage`:return null;default:return{message:G(e.error??e.result??e.results??e.output??e.action??e),phase:`investigating`,extra:{kind:`tool-result`,tool:Ct(e,t)?.extra?.tool,durationMs:e.durationMs,isError:e.status===`failed`||e.status===`declined`||e.success===!1||e.error!=null}}}}function Tt(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:[],reasoningStartedAt:new Map,error:null,fileChanges:[],commandExecutions:[],tokenUsageByThread:new Map,tokenUsageBaselineByThread:new Map,lastDiffSummary:``,loggedTokens:0,reportedChanges:new Set,cwd:t.cwd??``,itemIndex:new Map,onProgress:t.onProgress??null,onHeartbeat:t.onHeartbeat??null}}function Et(e){e.completionTimer&&=(clearTimeout(e.completionTimer),null)}function Dt(e,t=null){e.completed||(Et(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 Ot(e){e.completed||e.finalTurn||!e.finalAnswerSeen||e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||(Et(e),e.completionTimer=setTimeout(()=>{e.completionTimer=null,!(e.completed||e.finalTurn||!e.finalAnswerSeen)&&(e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||Dt(e,null))},250),e.completionTimer.unref?.())}function kt(e,t){let n=ot(t);if(!n||!e.threadIds.has(n))return!1;let r=e.threadTurnIds.get(n)??null,i=st(t);return r===null||i===null||i===r}function At(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),Ot(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,Ot(e)));return}if(t.type===`reasoning`&&n===`completed`){e.reasoningSummary=vt(e.reasoningSummary,U(t.summary));return}if(t.type===`fileChange`&&n===`completed`){e.fileChanges.push(t);return}t.type===`commandExecution`&&n===`completed`&&e.commandExecutions.push(t)}function jt(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),W(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`:t.params.item?.type===`reasoning`&&t.params.item.id&&e.reasoningStartedAt.set(`${t.params.threadId}:${t.params.item.id}`,Date.now()),At(e,t.params.item,`started`,t.params.threadId??null),yt(e.onProgress,xt(Ct(t.params.item,e.cwd),t.params.item));break;case`item/completed`:{let n={...e.itemIndex.get(t.params.item.id),...t.params.item};if(At(e,n,`completed`,t.params.threadId??null),n?.type===`fileChange`)for(let t of n.changes??[])t.path&&e.reportedChanges.add(j(e.cwd,t.path));let r=xt(wt(n,e.cwd),n);if(r?.extra?.kind===`tool-result`){let t=Ct(n,e.cwd);r.extra={...r.extra,callMessage:n.type===`fileChange`?r.message:t?.message}}if(n?.type===`reasoning`){let i=`${t.params.threadId}:${n.id}`,a=e.reasoningStartedAt.get(i);e.reasoningStartedAt.delete(i),r&&(r.extra={...r.extra,durationMs:Math.max(0,Date.now()-(a??Date.now()))})}yt(e.onProgress,r);break}case`thread/tokenUsage/updated`:{let n=ht(t.params?.tokenUsage?.last),r=ot(t);r===e.threadId&&t.params?.tokenUsage?.last&&(e.contextTokens=n?.total);let i=ht(t.params?.tokenUsage?.total??t.params?.tokenUsage);if(i&&r){n&&!e.tokenUsageByThread.has(r)&&e.tokenUsageBaselineByThread.set(r,{input:Math.max(0,i.input-n.input),cachedInput:Math.max(0,i.cachedInput-n.cachedInput),output:Math.max(0,i.output-n.output),total:Math.max(0,i.total-n.total)}),e.tokenUsageByThread.set(r,i);let t=gt(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=mt(String(t.params?.diff??``),e.cwd).split(`; `).filter(t=>!e.reportedChanges.has(t.split(` `)[0]??``)).join(`; `);n&&n!==e.lastDiffSummary&&(e.lastDiffSummary=n,W(e.onProgress,`changed: ${n}`,`editing`,{kind:`status`}));break}case`item/autoApprovalReview/completed`:{let n=t.params?.review??{},r=t.params?.action??{},i=bt(String(r.command??r.type??``).trim());W(e.onProgress,`Auto-review ${n.status}. ${it(i,48)}${n.rationale?`. ${it(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,W(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),Ot(e);break}W(e.onProgress,`Turn ${t.params.turn.status}.`,`finalizing`,{kind:`status`}),Dt(e,t.params.turn)}}async function Mt(e,t,n,r={}){let i=Tt(t,r),a=e.notificationHandler;e.setNotificationHandler(e=>{if(!i.turnId){i.bufferedNotifications.push(e);return}if(e.method===`thread/started`){jt(i,e);return}if(!kt(i,e)){a?.(e);return}jt(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)kt(i,e)?jt(i,e):a?.(e);i.bufferedNotifications.length=0,t.turn?.status&&t.turn.status!==`inProgress`&&Dt(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{Et(i),e.setNotificationHandler(a??null),e.setServerRequestHandler(null)}}function Nt(e,t,n=[]){return e!==`workspace-write`||!n.length?null:{type:`workspaceWrite`,writableRoots:n,networkAccess:t??!1}}const Pt=`coder_read_only`;function Ft(e,t=[]){return(e??`read-only`)!==`read-only`||!t.length?null:{default_permissions:Pt,[`permissions.${Pt}`]:{extends:`:read-only`,filesystem:Object.fromEntries(t.map(e=>[e,`write`]))}}}function It(e=[],t=[],n=!1){let r=Object.fromEntries((n?[]:t).map(e=>[e,{enabled:!1}])),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[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}:{},default_tools_approval_mode:`approve`}}return Object.keys(r).length?{mcp_servers:r}:{}}async function Lt(e,t,n,r){let i=Object.entries(n).filter(([,e])=>e.enabled!==!1).map(([e])=>e);await Promise.all(i.map(async n=>{let i=await e.request(`mcpServerStatus/list`,{threadId:t,serverName:n,detail:`toolsAndAuthOnly`}).catch(e=>{W(r,`MCP server ${n} status unavailable. ${z(e)}`,null,{kind:`warning`})});for(let e of i?.data??[])e.name===n&&e.runtimeStatus===`failed`&&W(r,`MCP server ${e.name} failed to start. ${e.toolsError??``}`.trim(),null,{kind:`error`})}))}function Rt(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(`
|
|
4
|
+
`)}async function zt(e,t,n={}){let r=n.connect??T.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 K(e){let t=process.env.CODEX_AUTH_JSON;if(t){let e=M.join(L.homedir(),`.codex`),n=M.join(e,`auth.json`);if(!P.existsSync(n)){P.mkdirSync(e,{recursive:!0,mode:448});try{P.writeFileSync(n,t,{encoding:`utf8`,flag:`wx`,mode:384})}catch(e){if(e.code!==`EEXIST`)throw e}}}let n=l(`codex`,[`--version`],{cwd:e,env:f()});if(!n.available)return n;let r=l(`codex`,[`app-server`,`--help`],{cwd:e,env:f()});return r.available?{available:!0,detail:`${n.detail}; app-server runtime available`}:{available:!1,detail:`${n.detail}; app-server runtime unavailable: ${r.detail}`}}async function Bt(e){let t=K(e);if(!t.available)return{available:!1,loggedIn:!1,detail:t.detail};let n=null;try{n=await T.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=F(`codex`,[`login`,`status`],{encoding:`utf8`,env:f()}),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 Vt(e,{endpoint:t,threadId:n,turnId:r}){if(!n||!r)return{interrupted:!1,detail:`missing threadId or turnId`};let i=await nt(t,`turn/interrupt`,{threadId:n,turnId:r});return i.ok?{interrupted:!0,detail:`Interrupted ${r} on ${n}.`}:{interrupted:!1,detail:i.detail}}async function Ht(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 nt(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 Ut(e,t={},n={}){if(!t.availabilityChecked){let t=K(e);if(!t.available)throw Error(`Codex CLI is not available: ${t.detail}`)}let r=t.prompt?.trim();if(!r)throw Error(`A prompt is required.`);let i=process.env.CODER_MACHINE_SANDBOX===`1`&&(t.sandbox??`read-only`)!==`read-only`?`danger-full-access`:t.sandbox,a=Ft(i,t.writableRoots),s=a?{}:{sandbox:i??`read-only`},c={...t.configOverrides??{},...a},l=Object.keys(c).length?c:null,u=Nt(i,t.networkAccess,t.writableRoots),d=async n=>{let i=null,a;o(`codex.config.start`);let c=await n.request(`config/read`,{cwd:e,includeLayers:!1});o(`codex.config.done`);let d={...t.modelProvider?{}:{model_reasoning_summary:`auto`},...l,...It(t.mcpServers,Object.keys(c.config?.mcp_servers??{}),t.nativeMcp),...t.nativeMcp?{}:{"features.apps":!1,"features.plugins":!1}},f=t.developerInstructions?{developerInstructions:t.developerInstructions}:{},p;if(t.resumeThreadId&&(W(t.onProgress,`Resuming thread ${t.resumeThreadId}.`,`starting`,{kind:`status`}),Ee(t.resumeThreadId)&&await ke(t.resumeThreadId),p=await n.request(`thread/resume`,{threadId:t.resumeThreadId,cwd:e,model:t.model??null,modelProvider:t.modelProvider??null,config:d,approvalPolicy:t.approvalPolicy??`never`,...s,...t.approvalsReviewer?{approvalsReviewer:t.approvalsReviewer}:{},...f}).catch(e=>{W(t.onProgress,he,`starting`,{kind:`warning`,detail:String(e?.message??e)})})),p)a=p.thread.id;else if(W(t.onProgress,`Starting Codex task thread.`,`starting`,{kind:`status`}),o(`codex.thread.start`),a=(await n.request(`thread/start`,{cwd:e,model:t.model??null,modelProvider:t.modelProvider??null,config:d,approvalPolicy:t.approvalPolicy??`never`,...s,...t.approvalsReviewer?{approvalsReviewer:t.approvalsReviewer}:{},...f,serviceName:`coder_runtime`,ephemeral:t.ephemeral??!1})).thread.id,!(t.ephemeral??!1))try{await n.request(`thread/name/set`,{threadId:a,name:at(r)})}catch(e){let t=String(e?.message??e??``);if(!t.includes(`unknown variant`)&&!t.includes(`unknown method`))throw e}o(`codex.thread.ready`),W(t.onProgress,`Thread ready (${a}).`,`starting`,{kind:`status`,threadId:a}),await Lt(n,a,d.mcp_servers??{},t.onProgress);let m;try{m=await Mt(n,a,()=>n.request(`turn/start`,{threadId:a,input:[{type:`text`,text:r,text_elements:[]}],model:t.model??null,effort:t.effort??null,outputSchema:t.outputSchema??null,...u?{sandboxPolicy:u}:{}}),{cwd:e,onProgress:t.onProgress,onHeartbeat:t.onHeartbeat,onApprovalRequest:t.onApprovalRequest,onTurnStarted:t.onControlReady?async e=>{i=await et(n,{threadId:a,turnId:e}),t.onControlReady?.(i.endpoint,a,e)}:void 0}),o(`codex.result`),t.onResult?.({status:m.finalTurn?.status===`completed`?0:1,threadId:a,turnId:m.turnId,finalMessage:m.lastAgentMessage,error:m.error??m.finalTurn?.error??null})}finally{await i?.close()}return{status:m.finalTurn?.status===`completed`?0:1,threadId:a,turnId:m.turnId,finalMessage:m.lastAgentMessage,reasoningSummary:m.reasoningSummary,turn:m.finalTurn,error:m.error??m.finalTurn?.error??null,stderr:Rt(n.stderr),fileChanges:m.fileChanges,touchedFiles:ct(m.fileChanges),tokens:gt(m),contextTokens:m.contextTokens,model:t.model??null,commandExecutions:m.commandExecutions}},f=async e=>{e.setNoticeHandler?.(e=>W(t.onProgress,e,`starting`,{kind:`status`}));try{let t=await d(e);return B(t.error?.message)&&await Wt(e),t}catch(t){throw B(z(t))&&await Wt(e),t}},p=()=>zt(e,f,{...n,networkAccess:t.networkAccess,nativeMcp:t.nativeMcp}),m=!1,h=()=>(m=!0,W(t.onProgress,`Codex login changed; restarted the Codex app-server and retrying the turn once.`,`starting`,{kind:`status`}),p());try{let e=await p().catch(e=>{if(!B(z(e)))throw e;return h()}),n=!e.touchedFiles?.length&&!e.commandExecutions.length;!m&&n&&B(e.error?.message)&&(e=await h());let r=Le(e.error?.message,t.model);return r?{...e,error:{...e.error,message:r}}:e}catch(e){let n=Le(z(e),t.model);throw n?Error(n):e}}async function Wt(e){e.transport===`broker`&&await e.request(De,{}).catch(()=>{})}const q=`@wular/coder`,Gt=`https://registry.npmjs.org/${q}/latest`,J={npm:[`npm`,`install`,`-g`,`${q}@latest`],pnpm:[`pnpm`,`add`,`-g`,`${q}@latest`],yarn:[`yarn`,`global`,`add`,`${q}@latest`],bun:[`bun`,`add`,`-g`,`${q}@latest`]};function Kt(){return pe(`update-check.json`)}function Y(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 qt(){try{return JSON.parse(P.readFileSync(Kt(),`utf8`))}catch{return null}}function Jt(e){try{P.mkdirSync(pe(),{recursive:!0}),P.writeFileSync(Kt(),JSON.stringify(e))}catch{}}function Yt(){try{P.rmSync(Kt(),{force:!0})}catch{}}function Xt(e,t){if(N.env.CODER_NO_UPDATE_CHECK||N.env.CI)return;let n=qt();if(!n?.checkedAt||Date.now()-n.checkedAt>864e5)try{je(N.execPath,[t,`upgrade`,`refresh`],{detached:!0,stdio:`ignore`}).unref()}catch{}return n?.latest&&Y(n.latest,e)>0?n.latest:void 0}async function Zt(e){let t=qt()?.latest??null;try{let e=await fetch(Gt,{signal:AbortSignal.timeout(3e3),headers:{accept:`application/json`}});if(e.ok){let n=await e.json();n?.version&&(t=n.version)}}catch{}Jt({checkedAt:Date.now(),latest:t,current:e})}function Qt(e){let t=e;try{t=P.realpathSync(e)}catch{}let n=t.replace(/\\/g,`/`);return/\/\.bun\//.test(n)?{pm:`bun`,command:J.bun}:/\/\.pnpm\//.test(n)||/\/pnpm(-global)?\//i.test(n)||/\/Library\/pnpm\//.test(n)?{pm:`pnpm`,command:J.pnpm}:/\/\.config\/yarn\/global\//.test(n)||/\/yarn\/global\//.test(n)||/\/Yarn\/Data\/global\//.test(n)?{pm:`yarn`,command:J.yarn}:{pm:`npm`,command:J.npm}}function $t(e){F(`claude`,[`plugin`,`marketplace`,`remove`,`coder-plugins`],{encoding:`utf8`});let t=F(`claude`,[`plugin`,`marketplace`,`add`,e],{encoding:`utf8`}),n=F(`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 en(){return M.join(L.homedir(),`.agents`,`skills`,`coder`)}function tn(){try{let e=P.readFileSync(M.join(en(),`SKILL.md`),`utf8`);return/^\s*version:\s*(\S+)/m.exec(e)?.[1]??null}catch{return null}}function nn(e){let t=en();try{let n=M.join(e,`plugins`,`agents`,`skills`,`coder`);P.rmSync(t,{recursive:!0,force:!0}),P.mkdirSync(t,{recursive:!0}),P.cpSync(n,t,{recursive:!0});let r=M.join(t,`SKILL.md`),i=P.readFileSync(r,`utf8`).replace(`
|
|
5
|
+
---
|
|
6
|
+
`,`\nmetadata:\n version: ${v()}\n---\n`);return P.writeFileSync(r,i),{marketplace:t,installed:!0,note:`Skill installed to ~/.agents/skills/coder; restart running sessions to load it.`}}catch(e){return{marketplace:t,installed:!1,note:`Skill install failed: ${e instanceof Error?e.message:String(e)}`}}}function rn(e){if(e.available)return null;let t=F(`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 an={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 on(e){let t=/(\d+\.\d+\.\d+)/.exec(String(e??``));return t?t[1]:null}function sn(e,t,n){let r=t?an[e][t]:void 0,i=on(n.detail);return!r||!i||Y(i,r)>=0?null:`${e} ${i} predates ${t} (needs ${r}), so it may fail or run another model. Run: ${e} update`}function cn(e){if(!e.available)return null;let t=on(e.detail);if(!t||Y(t,`0.159.1`)>=0)return null;let n=F(`codex`,[`update`],{encoding:`utf8`});return n.status!==0&&(n=F(`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 ln(e,t={},r){let i=t.hosts??[],a=i.find(e=>![`claude`,`agents`].includes(e));if(a)throw new R(`invalid-option`,`Unknown host "${a}". Use claude or agents.`,{hint:`Codex, Pi, OpenCode, and other Agent Skills hosts: coder setup-host agents`});let o=e=>i.includes(e);r?.();let s=K(e),c=cn(s);c?.updated&&(s=K(e));let l=s.available?await Bt(e):{loggedIn:!1,detail:s.detail},u=Q(),d=u.available?Cn():{loggedIn:!1,detail:u.detail},f=n();if(!P.existsSync(f)){let e=s.available?[`codex`,`claude`]:u.available?[`claude`,`codex`]:[`codex`,`claude`];le({...Te,chain:e})}let p=S(),m=o(`claude`)?$t(p):null,h=o(`agents`)?nn(p):null,g=O(e),_=s.available&&l.loggedIn||u.available&&d.loggedIn;return{codex:{available:s.available,detail:s.detail,auth:l.detail,loggedIn:l.loggedIn},...c?{codexUpdate:c}:{},claude:{available:u.available,detail:u.detail,auth:d.detail,loggedIn:d.loggedIn},configFile:f,runtime:Ae(new URL(`../bin/coder.mjs`,import.meta.url)),...m?{claudePlugin:m}:{},...h?{agentsSkill:h}:{},config:g,ready:_}}async function un(e={},t){let n=!e.pluginsOnly,r=!e.cliOnly,a=S(),o=M.join(a,`plugins/claude/.claude-plugin/plugin.json`),s={cli:v(),claude:g(o)},c={};if(n){let n=Qt(i),[r,...a]=e.pm&&J[e.pm]||n.command,o=e.pm??n.pm;t?.(`via ${o}`);let l=F(r,a,{encoding:`utf8`});if(l.error?.code===`ENOENT`)throw new R(`invalid-option`,`${o} not found on PATH. Re-run with --pm <npm|pnpm|yarn|bun>, or update manually: ${r} ${a.join(` `)}`);if(l.status!==0){let e=(l.stderr||l.stdout||``).trim();throw new R(`invalid-option`,`CLI update failed (${o}).${e?`\n${e}`:``}\nRun manually: ${r} ${a.join(` `)}`)}Yt();let u=v();c.cli={pm:o,from:s.cli,to:u,changed:u!==s.cli}}if(r){if(e.claude||!e.codex&&Q().available){let e=$t(a);c.claudePlugin={installed:e.installed,note:e.note,from:s.claude,to:g(o)}}if(P.existsSync(en())){let e=tn(),t=nn(a);c.agentsSkill={installed:t.installed,note:t.note,from:e,to:tn()}}}return c}function dn(e=[],t={}){return ln(M.resolve(t.cwd??`.`),{hosts:e})}const fn=new Set([`Write`,`Edit`,`MultiEdit`,`NotebookEdit`]),pn=`coder-mcp-status`,X=new Map,mn=`CODER_CLAUDE_VERSION`;function hn(e){let t=e=>e&&typeof e==`object`&&(typeof e.data==`string`||typeof e.blob==`string`||Object.values(e).some(t)),n=e=>typeof e==`string`?e:t(e)||[`image`,`document`,`audio`,`video`,`file`].includes(e?.type)?`[${e?.type??`binary`}]`:typeof e?.text==`string`?e.text:e==null?``:JSON.stringify(e);return Array.isArray(e)?e.map(n).join(``):n(e)}function gn(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 _n(e,t,n=!1){if(!t)return[];let r;try{r=P.readFileSync(e,`utf8`)}catch{return[]}let i=[],a=0;for(;a<=r.length;){let e=r.indexOf(t,a);if(e<0)break;let o=gn(r.slice(0,e))+1,s=Math.max(1,gn(t));if(i.push(s===1?`L${o}`:`L${o}-L${o+s-1}`),!n)break;a=e+Math.max(t.length,1)}return i.length>4?[...i.slice(0,4),`+${i.length-4} matches`]:i}function vn(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 yn(e,t,n){let r=String(t.file_path??t.notebook_path??t.path??``),i=r?M.isAbsolute(r)?r:M.resolve(n,r):``,a=r?j(n,i)||r:`(unknown path)`,o=t.path?` in ${j(n,String(t.path))}`:``;if(e===`Write`){let e=gn(String(t.content??``));return`Write ${a} ${e?`L1-L${e}`:`(empty file)`}`}if(e===`Edit`){let e=_n(i,String(t.old_string??``),t.replace_all===!0);return`Edit ${a}${e.length?` ${e.join(`, `)}`:``}`}if(e===`MultiEdit`){let e=Array.isArray(t.edits)?t.edits:[],n=e.flatMap(e=>_n(i,String(e?.old_string??``),e?.replace_all===!0));return`MultiEdit ${a}${n.length?` ${n.join(`, `)}`:``} (${e.length} edits)`}if(e===`NotebookEdit`){let e=t.cell_id??t.cell_number;return`NotebookEdit ${a}${e==null?``:` cell ${e}`}`}if(e===`Read`){let e=Number(t.offset??0),n=Number(t.limit??0);return`Read ${a}${e&&n?` L${e}-L${e+n-1}`:e?` from L${e}`:``}`}if(e===`Bash`)return`Bash ${String(t.command??``).trim()||`(no command)`}`;if(e===`Glob`)return`Glob ${String(t.pattern??``)}${o}`;if(e===`Grep`){let e=t.glob?` (${String(t.glob)})`:``;return`Grep ${String(t.pattern??``)}${o}${e}`}if(e===`Task`)return`Task ${t.subagent_type?`${String(t.subagent_type)}: `:``}${vn(t.description??t.prompt??``)}`;if(e===`WebFetch`)return`WebFetch ${String(t.url??``)}`;if(e===`WebSearch`)return`WebSearch ${String(t.query??``)}`;if(e===`TodoWrite`){let e=Array.isArray(t.todos)?t.todos:[];return`TodoWrite ${e.length} item${e.length===1?``:`s`}`}let s=Object.entries(t??{}).map(([e,t])=>`${e}=${vn(t)}`).join(` `);return s?`${e} ${s}`:e}function Z(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 bn(e,t,n){let r=N.platform===`win32`?t[Object.keys(t).sort().find(e=>e.toLowerCase()===`path`)??`PATH`]??N.env.PATH??``:t.PATH??`/usr/bin:/bin`,i=/[\\/]/.test(e)?[``]:[...N.platform===`win32`?[n]:[],...r.split(M.delimiter)],a=N.platform===`win32`&&!M.extname(e)?[``,...(t.PATHEXT??`.EXE;.COM`).split(`;`)]:[``];for(let t of i)for(let r of a){let i=M.resolve(n,t,e+r);try{if(P.accessSync(i,P.constants.X_OK),P.statSync(i).isFile())return P.realpathSync(i)}catch{}}return M.resolve(n,e)}function xn(e,t){let n=bn(`claude`,f(e),t),r=X.get(n);return{[mn]:r===void 0?void 0:JSON.stringify({executable:n,detail:r})}}function Sn(e,t,n){let r=bn(e,t,n),i=X.get(r);if(i!==void 0)return i;try{let e=JSON.parse(t[mn]??`null`);if(e?.executable===r&&typeof e.detail==`string`)return X.set(r,e.detail),e.detail}catch{}return Q(e,t,n).detail}function Q(e=`claude`,t=N.env,n=N.cwd()){t=f(t);let r=bn(e,t,n),i=F(e,[`--version`],{encoding:`utf8`,env:t,cwd:n}),a=!i.error&&i.status===0,o=a?String(i.stdout||``).trim():`claude CLI not found on PATH (npm install -g @anthropic-ai/claude-code)`;return X.set(r,o),{available:a,detail:o}}function Cn(){if(N.env.CLAUDE_CODE_OAUTH_TOKEN)return{loggedIn:!0,detail:`CLAUDE_CODE_OAUTH_TOKEN configured`};if(N.env.ANTHROPIC_API_KEY)return{loggedIn:!0,detail:`ANTHROPIC_API_KEY configured`};let e=F(`claude`,[`auth`,`status`,`--json`],{encoding:`utf8`,env:f()});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 wn(e,t){let n=t.permissions??`auto`,r=t.mcpServers??[],a={};n===`auto`&&t.approvalTaskId&&(a.coder={type:`stdio`,command:N.execPath,args:[i,`task`,`mcp`,t.approvalTaskId,`--cwd`,e]});for(let e of r)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}:{}},...e.alwaysLoad?{alwaysLoad:!0}:{}};return a}function Tn(e,t,n,i,a,o){let s=[`-p`,`--input-format`,`stream-json`,`--output-format`,`stream-json`,`--verbose`,`--replay-user-messages`],c=on(a);if(c&&Y(c,`2.1.94`)>=0&&s.push(`--thinking-display`,`summarized`),s.push(t.resumeSessionId?`--resume`:`--session-id`,n),t.model&&s.push(`--model`,t.model),t.effort&&s.push(`--effort`,t.effort),t.systemPrompt&&s.push(`--append-system-prompt-file`,o??M.join(t.taskRoot??e,`.claude-system.md`)),t.excludeDynamicSections&&s.push(`--exclude-dynamic-system-prompt-sections`),t.settingSources&&s.push(`--setting-sources`,t.settingSources),t.outputSchema){let{$schema:e,...n}=t.outputSchema;s.push(`--json-schema`,JSON.stringify(n))}let l=t.permissions??`auto`,u=t.additionalDirectories??[],d=l===`read-only`?t.readOnlyAllowedTools??[]:[],f=t.mcpServers??[],p=wn(e,t),h=l===`auto`&&t.approvalTaskId,g=f.flatMap(e=>e.tools?.length?e.tools.map(t=>`mcp__${e.name}__${t}`):[`mcp__${e.name}`]),v=Object.keys(p).length?[`--mcp-config`,i??M.join(t.taskRoot??e,`.claude-mcp.json`)]:t.nativeMcp?[]:[`--mcp-config`,`{"mcpServers":{}}`];t.nativeMcp||s.push(`--strict-mcp-config`,`--no-chrome`),h?(s.push(`--permission-mode`,`default`,...v,`--permission-prompt-tool`,`mcp__coder__approval_prompt`),g.length&&s.push(`--allowedTools`,...g)):d.length?s.push(...r.filter(e=>N.env.CODER_MACHINE_SANDBOX!==`1`||e!==`Bash`),...v,`--allowedTools`,...d,...g):(s.push(...y[l]??y.auto,...v),g.length&&s.push(`--allowedTools`,...g));let b=t.writableDirectories??[];for(let e of[...u,...l===`read-only`?[]:b])s.push(`--add-dir`,e);let x=m(l,e,t.allowedNetworkHosts??[],u,b,N.env[_]!==`1`),S={...x?JSON.parse(x):{},...t.nativeMcp?{}:{disableClaudeAiConnectors:!0},...t.promptCacheTtl&&c&&Y(c,`2.1.242`)>=0?{promptCacheTtl:t.promptCacheTtl}:{}};return Object.keys(S).length&&s.push(`--settings`,JSON.stringify(S)),s}function $(e,t){return Object.assign(Error(e),{retryable:t})}function En(e,t){let n=t&&V(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 Dn(e){let t=!0;return{sendInitial(t,n){return new Promise((r,i)=>{e(`${JSON.stringify(En(t,n))}\n`,e=>{e?i(e):r()})})},sendSteer(n,r){return t?new Promise((t,i)=>{e(`${JSON.stringify(En(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($(`Failed to write Claude live steer: ${e.message}`,r))})}):Promise.reject($(`Claude turn is no longer accepting live input.`,!0))},stopAccepting(){t=!1}}}async function On(e){return He(`coder-claude-steer-`,async(t,n)=>{if(n)throw $(`Claude turn is no longer accepting live input.`,!0);let r=typeof t?.params?.text==`string`?t.params.text.trim():``;if(t.method!==`turn/steer`||!r)throw $(`Invalid Claude steer request.`,!1);return await e(r,t.command),{accepted:!0}})}async function kn(e,t,n=3e3,r){if(!t.trim())return{steered:!1,retryable:!1,detail:`empty follow-up`};let i=await Ue(e,{id:V(r),method:`turn/steer`,params:{text:t.trim()},command:r},n,`Claude live steer`);return{steered:i.ok&&i.result?.accepted===!0,retryable:i.retryable,detail:i.detail}}async function An(e,t){let n=await jn(e,t);return!t.resumeSessionId||!n.error?.message?.includes(`No conversation found with session ID`)?n:(t.onProgress?.({kind:`warning`,message:he}),jn(e,{...t,resumeSessionId:null}))}async function jn(e,t){let n=t.resumeSessionId??I(),r=wn(e,t),i=Object.keys(r).length?M.join(t.taskRoot??e,`.claude-mcp-${I()}.json`):void 0,a=t.systemPrompt?M.join(t.taskRoot??e,`.claude-system-${I()}.md`):void 0;for(let[e,n]of[[i,`${JSON.stringify({mcpServers:r})}\n`],[a,t.systemPrompt]])e&&(P.mkdirSync(M.dirname(e),{recursive:!0}),P.writeFileSync(e,n,{encoding:`utf8`,flag:`wx`,mode:384}));o(`claude.prepare`,{resume:!!t.resumeSessionId});let s=f({...N.env,...t.env}),c=Tn(e,t,n,i,Sn(t.executable??`claude`,s,e),a),l=()=>{for(let e of[i,a])if(e)try{P.unlinkSync(e)}catch{}};return t.onProgress?.({kind:`status`,message:`claude turn started (session ${n})`,threadId:n}),new Promise((r,i)=>{let a=Date.now();o(`claude.spawn`);let u=je(t.executable??`claude`,c,{cwd:e,stdio:[`pipe`,`pipe`,`pipe`],env:s}),d=``,f=``,p=[],m=null,h=n,g=null,_=!1,v=Dn((e,t)=>u.stdin.write(e,t)),y=Date.now(),b=new Map,x=0,S=0,C=null,T,E=0,ee=new Set,D=n=>{if(!(!n||typeof n!=`object`)){if(l(),t.onHeartbeat?.(),n.type===`system`&&n.subtype===`init`&&n.session_id)h=n.session_id,n.mcp_servers?.some(e=>e.status===`failed`)&&u.stdin.write(`${JSON.stringify({type:`control_request`,request_id:pn,request:{subtype:`mcp_status`}})}\n`);else if(n.type===`control_response`&&n.response?.request_id===pn)for(let e of n.response.response?.mcpServers??[])e.status===`failed`&&t.onProgress?.({kind:`error`,message:`MCP server ${e.name} failed to start. ${e.error??``}`.trim()});else if(n.type===`stream_event`&&!n.parent_tool_use_id){let e=n.event;e?.type===`message_start`?(T=e.message?.id,C=e.message?.usage):e?.type===`message_delta`&&(C={...C,...e.usage});let t=Z(C);S=t?t.input+t.cachedInput:0}else if(n.type===`assistant`||n.type===`user`){let r=n.type===`assistant`?Z(n.message?.usage):null;if(n.type===`assistant`&&!n.parent_tool_use_id){(!T||T!==n.message?.id)&&(C=null),T=n.message?.id,(!C||r&&r.input+r.cachedInput>0)&&(C=n.message?.usage);let e=Z(C);S=e?e.input+e.cachedInput:0}if(r){x+=r.output;let e=r.input+r.cachedInput+x;(!E||e-E>=1e3)&&(E=e,t.onProgress?.({kind:`usage`,tokens:{...r,output:x,total:e},threadId:h}))}for(let r of n.message?.content??[])if(r?.type===`tool_use`||r?.type?.endsWith(`_tool_use`)){let n=String(r.name??`Tool`);if(r.id&&b.set(String(r.id),{name:n,at:Date.now()}),fn.has(n)){let t=String(r.input?.file_path??r.input?.notebook_path??``);t&&ee.add(M.isAbsolute(t)?t:M.resolve(e,t))}t.onProgress?.({kind:`tool`,tool:n,...r.id?{callId:String(r.id)}:{},message:yn(n,r.input??{},e),threadId:h})}else if(r?.type===`tool_result`||r?.type?.endsWith(`_tool_result`)){let e=hn(r.content).trim(),n=r.is_error===!0||r.content?.type?.endsWith(`_error`)===!0,i=r.tool_use_id?b.get(String(r.tool_use_id)):void 0;r.tool_use_id&&b.delete(String(r.tool_use_id)),t.onProgress?.({kind:`tool-result`,...r.tool_use_id?{callId:String(r.tool_use_id)}:{},...i?{tool:i.name,durationMs:Date.now()-i.at}:{},...n?{isError:!0}:{},message:e||(n?`(tool failed with no output)`:`(no output)`),threadId:h})}else n.type===`assistant`&&r?.type===`text`&&typeof r.text==`string`&&r.text.trim()?t.onProgress?.({kind:`assistant`,message:r.text.trim(),threadId:h}):n.type===`assistant`&&r?.type===`thinking`&&typeof r.thinking==`string`&&r.thinking.trim()&&t.onProgress?.({kind:`reasoning`,message:r.thinking.trim(),durationMs:Math.max(0,Date.now()-y),threadId:h})}else n.type===`result`&&(o(`claude.result`),m=n,t.onResult?.({status:n.is_error||p.length?1:0,threadId:n.session_id??h,finalMessage:n.structured_output===void 0?String(n.result??``).trim():JSON.stringify(n.structured_output),error:n.is_error||p.length?{message:p[0]||String(n.result??``)}:null}),n.session_id&&(h=n.session_id),v.stopAccepting(),u.stdin.end());y=Date.now()}};u.stdout.on(`data`,e=>{d+=e;let t;for(;(t=d.indexOf(`
|
|
7
|
+
`))>=0;){let e=d.slice(0,t).trim();if(d=d.slice(t+1),e)try{D(JSON.parse(e))}catch(e){p.push(`Invalid Claude stream-json output: ${e instanceof Error?e.message:String(e)}`)}}}),u.stderr.on(`data`,e=>{f+=e});let O=()=>{v.stopAccepting(),u.kill(`SIGTERM`),l();let e=g?.endpoint;e?.startsWith(`file:`)&&P.rmSync(e.slice(5),{recursive:!0,force:!0}),N.exit(143)};N.on(`SIGTERM`,O),(async()=>{t.onSteerReady&&(g=await On((e,t)=>v.sendSteer(e,t))),await v.sendInitial(t.prompt,t.command),g&&t.onSteerReady?.(g.endpoint)})().catch(e=>{_||(_=!0,v.stopAccepting(),u.kill(`SIGTERM`),l(),N.removeListener(`SIGTERM`,O),g?.close(),i(e))}),u.on(`error`,e=>{_||(_=!0,v.stopAccepting(),N.removeListener(`SIGTERM`,O),l(),g?.close(),i(Error(`claude spawn failed: ${e.message}`)))}),u.on(`close`,async e=>{if(_)return;_=!0,v.stopAccepting(),N.removeListener(`SIGTERM`,O),l(),o(`claude.exit`),await g?.close(),o(`claude.teardown.done`);let n=d.trim();if(n)try{D(JSON.parse(n))}catch(e){p.push(`Invalid trailing Claude stream-json output: ${e instanceof Error?e.message:String(e)}`)}let i=m?.structured_output===void 0?(m?.result??``).trim():JSON.stringify(m.structured_output),c=e!==0||m?.is_error===!0||m==null||p.length>0;o(`claude.usage.start`);let u=Z(m?.usage);if(!S&&m){let e=Z(await w(h,a,s.CLAUDE_CONFIG_DIR).catch(()=>null)),t=e&&e.input+e.cachedInput>0?e:u;S=t?t.input+t.cachedInput:0}o(`claude.usage.done`),r({status:+!!c,threadId:m?.session_id??h,turnId:null,finalMessage:i,touchedFiles:[...ee],tokens:u,contextTokens:S,model:m?.modelUsage&&Object.keys(m.modelUsage).join(`+`)||t.model||null,error:c?{message:p[0]||i||f.trim()||`claude exited ${e}`}:null})})})}const Mn=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(`.`)),Nn=[/\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)/],Pn=new Set([`status`,`log`,`diff`,`show`,`blame`,`rev-parse`,`ls-files`,`ls-tree`,`cat-file`,`describe`,`shortlog`,`grep`,`branch`,`stash`]);function Fn(e){return e.match(/^\s*(?:ba|z|da)?sh\s+(?:-[a-zA-Z]+\s+)*(?:-c\s+)?(["'])([\s\S]*)\1\s*$/)?.[2]??e}function In(e){return e.trim().split(/\s+/).filter(Boolean)}function Ln(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 Pn.has(t)?{decision:`accept`,reason:`git ${t} is read-only`}:Mn.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 Rn(e,t={}){let n=Fn(String(e??``));if(!n.trim())return{decision:`escalate`,reason:`empty command`};for(let e of Nn)if(e.test(n))return{decision:`decline`,reason:`matches hard-deny pattern ${e}`};if(/\$\(|`|<\(/.test(n))return{decision:`escalate`,reason:`contains command substitution`};let r=n.split(/&&|\|\||;|\||\r?\n/).map(e=>e.trim()).filter(Boolean);if(r.length>1){let e={decision:`accept`,reason:`all segments safe`};for(let n of r){let r=Rn(n,t);if(r.decision===`decline`)return r;r.decision===`escalate`&&(e=r)}return e}let i=In(n),a=M.basename(i[0]??``);if(a===`git`)return Ln(i);let o=t.networkHost;return o?(t.allowedNetworkHosts??[]).some(e=>o===e||o.endsWith(`.${e}`))?{decision:`accept`,reason:`network host ${o} is allowlisted`}:{decision:`escalate`,reason:`network access to ${o}`}:{decision:`escalate`,reason:`command needs approval: ${a||`(unknown)`}`}}function zn(e,t){if(!e.length)return{decision:`escalate`,reason:`file change with no resolvable paths`};for(let n of e){let e=M.resolve(t,n),r=M.relative(t,e);if(r.startsWith(`..`)||M.isAbsolute(r))return{decision:`escalate`,reason:`path outside workspace: ${n}`};if(r===`.git`||r.startsWith(`.git${M.sep}`))return{decision:`decline`,reason:`direct .git modification: ${n}`}}return{decision:`accept`,reason:`all paths inside workspace`}}function Bn(e){return M.join(e,`approvals`)}function Vn(e){let t=Bn(e);return P.existsSync(t)?P.readdirSync(t).filter(e=>e.endsWith(`.request.json`)).flatMap(e=>{let n=e.replace(/\.request\.json$/,``),r=k(M.join(t,e));if(!r)return[];let i=k(M.join(t,`${n}.response.json`));return[{...r,id:n,response:i}]}).sort((e,t)=>String(e.createdAt??``).localeCompare(String(t.createdAt??``))):[]}function Hn(e,t,n){let r=Bn(e),i=M.join(r,`${t}.request.json`);if(!P.existsSync(i))throw Error(`No pending approval "${t}" for this task.`);P.writeFileSync(M.join(r,`${t}.response.json`),`${JSON.stringify({decision:n,answeredAt:new Date().toISOString()},null,2)}\n`,`utf8`)}async function Un(e,t,{timeoutMs:n,onEvent:r}){let i=Bn(e);P.mkdirSync(i,{recursive:!0});let a=`apr-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`;P.writeFileSync(M.join(i,`${a}.request.json`),`${JSON.stringify({...t,createdAt:new Date().toISOString()},null,2)}\n`,`utf8`),r?.({kind:`approval-escalated`,approvalId:a,summary:t.summary,message:`Approval needed (${a}): ${t.summary}. Answer with: coder task approve ${M.basename(e)} ${a} [--deny]`});let o=M.join(i,`${a}.response.json`),s=await oe(i).until(()=>k(o)??void 0,n);if(s){let e=s.decision===`accept`?`accept`:`decline`;return r?.({kind:`approval-answered`,approvalId:a,decision:e}),e}return r?.({kind:`approval-timeout`,approvalId:a,message:`Approval ${a} timed out; declining.`}),`decline`}function Wn(e,t={}){return Un(e,{method:`simulate`,summary:`simulated approval probe (--simulate-approval)`},{timeoutMs:t.timeoutMs??12e4,onEvent:t.onEvent??null})}function Gn({workspaceRoot:e,taskDir:t,mode:n=`auto`,escalationTimeoutMs:r=12e4,allowedNetworkHosts:i=[],onEvent:a=null}){return async(o,s,c)=>{let l=c?.itemIndex?.get(s.itemId??``),u,d;if(o===`item/commandExecution/requestApproval`){let t=s.command??l?.command??``,n=s.cwd??l?.cwd??e;u={method:o,summary:`Run command. ${t||`Unknown command`}${s.reason?`. ${s.reason}`:``}`,command:t,cwd:n,params:s},d=Rn(t,{networkHost:s.networkApprovalContext?.host??null,allowedNetworkHosts:i})}else if(o===`item/fileChange/requestApproval`){let t=(l?.changes??[]).map(e=>e.path).filter(e=>!!e);u={method:o,summary:`Apply file changes. ${t.join(`, `)||`Unknown paths`}${s.reason?`. ${s.reason}`:``}`,paths:t,params:s},d=zn(t,e)}else throw a?.({kind:`approval-unsupported`,method:o}),Error(`Coder does not handle server request ${o}; treating as denied.`);return n===`deny`&&(d={decision:`decline`,reason:`deny mode`}),a?.({kind:`approval-decision`,method:o,...d,summary:u.summary}),{decision:d.decision===`escalate`?await Un(t,u,{timeoutMs:r,onEvent:a}):d.decision}}}const Kn=/usage|quota|rate.?limit|429|401|unauthorized|not authenticated|login|insufficient|exhausted|not available|ENOENT/i;function qn(e){return Kn.test(e)&&!Ie(e)}var Jn=class extends Error{engine;detail;constructor(e,t){super(t),this.engine=e,this.detail=t}};function Yn(e,t){let n=e.engine,r=!!n,i=e.model,o=e.effort,s=e=>{let n=e?t.models?.[e]:void 0;return n&&ee(n)?n:void 0},l=e=>{let n=e?t.models?.[e]:void 0;return n&&E(n)?n:void 0},u=e=>{try{return be(e,t)}catch(e){throw new R(`invalid-option`,e instanceof Error?e.message:String(e))}};if(s(i)){let e=u(i);e&&(r||(n=e.engine),i=e.model??void 0,o=o??e.effort??void 0)}if(!n&&i&&(i in a?n=`claude`:i in h?n=`codex`:l(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 h||n in a||n in(t.models??{})?` "${n}" is a model; use --model ${n}.`:``;throw new R(`invalid-option`,`Invalid --engine "${n}". Use codex, claude, or custom.${e}`)}let f=t.engines[n]??{},p=i??f.model??null,m=o??f.effort??null;if(s(p)){let e=u(p);e&&(r||(n=e.engine),p=e.model,m=o??e.effort??m)}let g=e.permissions??f.permissions??`auto`;try{d(t,p)}catch(e){throw new R(`invalid-option`,e instanceof Error?e.message:String(e))}if(n===`custom`){let e=Object.entries(t.models??{}).filter(([,e])=>E(e)).map(([e])=>e);if(!p&&e.length===1&&(p=e[0]),!p||!l(p))throw new R(`invalid-option`,p?`No custom model named "${p}". 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 _=n===`claude`;if(!(g in x))throw new R(`invalid-option`,`Invalid --permissions "${g}". Use one of: ${Object.keys(x).join(`, `)}`);if(!_&&m&&!ue.has(m))throw new R(`invalid-option`,`Invalid codex --effort "${m}". Use one of: ${[...ue].join(`, `)}`);if(_&&m&&!c.has(m))throw new R(`invalid-option`,`Invalid claude --effort "${m}". Use one of: ${[...c].join(`, `)}`);return{engine:n,model:p,effort:m,permissions:g}}const{connection:Xn,description:Zn,...Qn}=u.shape,$n=b({name:fe().check(e(1)),...Qn}).check(s(e=>!!e.command!=!!e.url,`one of command or url`)),er=ae($n);function tr(e,t={}){let n=e.trim();return/^[\[{]/.test(n)?rr(n):(n===`all`?Object.keys(t):n.split(`,`).map(e=>e.trim()).filter(Boolean)).map(e=>{let n=t[e];if(!n)throw new R(`invalid-option`,`Unknown MCP server "${e}".`,{hint:`configured: ${Object.keys(t).join(`, `)||`none`}; or pass a JSON array`});return{name:e,...n}})}function nr(e,t={},n={},r={}){typeof e==`string`&&!e.trim()&&(e=void 0);let i=typeof e==`string`?tr(e,{...t,...n}):e??Object.entries(n).map(([e,t])=>({name:e,...t})),a=[],o=i.filter(e=>e.connection).map(({name:e,connection:t,tools:n})=>({name:e,connection:t,...n?{tools:n}:{}})),s=new Set,c=[];for(let e of i){if(!e.connection||e.resolved){e.connection&&s.add(e.connection),e.repository&&a.push(...me(e.name,e)),c.push(e);continue}let t=Object.hasOwn(r,e.connection)?r[e.connection]:void 0;if(!t){a.push(`MCP server "${e.name}" skipped because connection "${e.connection}" was not granted to this task.`);continue}if(s.has(e.connection))continue;s.add(e.connection);let n=e.tools?.length?e.tools.filter(e=>!t.tools?.length||t.tools.includes(e)):t.tools;if(e.tools?.length&&!n?.length){a.push(`MCP server "${e.name}" skipped because its tools are not granted by connection "${e.connection}".`);continue}c.push({...t,name:e.name,connection:e.connection,resolved:!0,...n?{tools:n}:{}})}for(let[e,t]of Object.entries(r)){if(s.has(e))continue;let n=c.findIndex(e=>e.name===t.name);n>=0&&c.splice(n,1),c.push({...t,resolved:!0})}return{mcp:c,...o.length?{mcpBindings:o}:{},nativeMcp:typeof e==`string`&&e.trim()===`all`,...a.length?{warnings:a}:{}}}function rr(e){let n;try{n=JSON.parse(e)}catch(e){throw new R(`invalid-option`,`Invalid --mcp JSON: ${e instanceof Error?e.message:String(e)}`)}let r=er.safeParse(n);if(!r.success)throw new R(`invalid-option`,`Invalid --mcp value: ${t(r.error)}`,{hint:`--mcp '[{"name":"docs","command":"npx","args":["-y","docs-mcp"],"tools":["search"]}]'`});return r.data}function ir(e,t=N.env,n,r={}){let i=r.cloud??t.CODER_MCP_MODE===`cloud`,a=r.connectionEnv??JSON.parse(t.CODER_MCP_CONNECTION_ENV??`{}`),o=r.onWarning??(e=>N.stderr.write(`coder: ${e}\n`));return(e??[]).flatMap(e=>{let r=e.repository&&!e.resolved;if(r){for(let t of me(e.name,e))o(t);if(!i&&!Se(e))return o(`MCP server "${e.name}" skipped pending local approval. Run coder connection approve ${e.name} in its repository.`),[]}let s=new Set,c=new Set,l=n=>e.resolved?n.replace(/^\$\{(CODER_CONNECTION_[A-F0-9]{24})\}$/,(e,n)=>t[n]??``):n.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\}/g,(e,n,o)=>r&&i?a[n]===null?(c.add(n),``):Object.hasOwn(a,n)?a[n]:(s.add(n),``):t[n]??o??``),u=e=>Object.fromEntries(Object.entries(e).map(([e,t])=>[e,l(t)])),d=r&&!!e.url,f={...e,...e.command?{command:l(e.command)}:{},...e.args?{args:e.args.map(l)}:{},...e.url?{url:d?e.url:l(e.url)}:{},...e.env?{env:u(e.env)}:{},...e.headers?{headers:d?e.headers:u(e.headers)}:{}};if(c.size)return o(`MCP server "${e.name}" skipped because connection variables ${[...c].join(`, `)} are ambiguous.`),[];if(s.size&&o(`MCP server "${e.name}" has unresolved connection variables ${[...s].join(`, `)}; expanded to empty.`),!n||!f.command)return[f];let p=(f.command.includes(M.sep)?[M.resolve(n,f.command)]:(f.env?.PATH??t.PATH??`/usr/bin:/bin`).split(M.delimiter).map(e=>M.resolve(n,e,f.command))).find(e=>{try{return P.accessSync(e,P.constants.X_OK),P.statSync(e).isFile()}catch{return!1}});if(!p)throw new R(`invalid-option`,`MCP server "${e.name}" command cannot be resolved.`);return f.command=P.realpathSync(p),f.args=f.args?.map(e=>{if(e.startsWith(`-`)||M.isAbsolute(e))return e;let t=M.resolve(n,e),r=P.existsSync(t)&&P.statSync(t).isFile();return!r&&!e.startsWith(`./`)&&!e.startsWith(`../`)?e:r?P.realpathSync(t):t}),[f]})}function ar(e,t=[]){let n=[...new Set(t.map(t=>M.resolve(e,t)))];for(let e of n)if(!P.statSync(e,{throwIfNoEntry:!1})?.isDirectory())throw new R(`invalid-option`,`--add-dir ${e} is not a directory.`);return n}function or(e=[]){return e.filter(e=>!e.alwaysLoad&&(e.command||e.url)).map(({name:e,description:t,access:n,connection:r,url:i})=>({name:e,description:t??(r?`connection ${r}`:i&&URL.canParse(i)?new URL(i).host:`MCP server`),...n?{access:n}:{}}))}function sr(e,t){return e===`read-only`&&de.test(t??``)}const cr=[`read-only`,`workspace-write`,`auto`];function lr(e,t,n){if(!t)return n.permissions;if(cr.indexOf(t)>cr.indexOf(n.permissions))throw new R(`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 ur(e,t,n={},r=!1){let a=A(e,t),s=P.openSync(M.join(a,`worker.log`),`a`),c={...N.env,...n};o(`worker.spawn`,{taskId:t});let l=je(N.execPath,[i,`task`,`worker`,t,`--cwd`,e],{cwd:e,detached:!0,stdio:[`ignore`,s,s,`ipc`],env:{...c,...xn(c,e),CODER_WORKER:`1`,CODER_ENGINE_CHECKED:r?`1`:void 0}});return l.on(`error`,()=>{}),l.unref(),l.channel?.unref?.(),P.closeSync(s),se(e,t,{pid:l.pid??null}),l}async function dr(e,t,n,r,i){let a=n.cwd,o=n.availability?.[t.engine===`custom`?`codex`:t.engine]??(t.engine===`claude`?Q(`claude`,{...N.env,...n.connectionEnv},a):K(a)),s=t.model?e.models?.[t.model]:void 0;if(!o.available&&s&&E(s)){let e=rn(o);n.onNote?.(e.note),o=K(a)}if(!o.available)throw new Jn(t.engine,o.detail);let c=s?null:t.engine===`claude`?sn(`claude`,t.model,o):sn(`codex`,ne(t.model),o);c&&n.onNote?.(c);let l=n.addDirs??[],u=n.taskId??C(),d=n.resume?.engine===t.engine?n.resume:void 0,f=se(a,u,{status:`queued`,...n.taskId?{dispatchId:I()}:{},name:r.name??null,system:n.system??null,systemPrompt:ie({cwd:a,...n.agentPrompt,servers:or(n.mcp),hub:t.engine!==`claude`,instructions:n.system??void 0,conversation:n.conversation,agent:!!n.agentId,local:N.env.CODER_MCP_MODE!==`cloud`}),engine:t.engine,prompt:n.prompt,...n.outputSchema?{outputSchema:n.outputSchema}:{},model:t.model,effort:t.effort,permissions:t.permissions,resumeThreadId:d?.threadId??null,...d?{threadId:d.threadId,...d.previousThreadIds?{previousThreadIds:d.previousThreadIds}:{},...d.pendingRollover?{pendingRollover:d.pendingRollover}:{}}:{},cwd:a,...r.simulateApproval?{simulateApproval:!0}:{},...n.flowRunId?{flowRunId:n.flowRunId}:{},...n.agentId?{agentId:n.agentId}:{},...n.conversation?{conversation:!0}:{},...n.source?{source:n.source}:{},...n.author?{author:n.author}:{},...n.repo?{repo:n.repo}:{},...n.mcp?.length?{mcp:n.mcp}:{},...n.mcpBindings?{mcpBindings:n.mcpBindings}:{},...n.connections?{connections:n.connections}:{},...n.connectionSource?{connectionSource:n.connectionSource}:{},nativeMcp:n.nativeMcp??!1,...l.length?{addDirs:l}:{}});for(let e of new Set(n.mcpWarnings??[]))Oe(a,u,{kind:`warning`,message:e});n.resume&&!d&&Oe(a,u,{kind:`warning`,message:he});let m=M.join(A(a,u),`log.jsonl`),h=P.existsSync(m)?P.statSync(m).size:0,g=ur(a,u,n.connectionEnv,!0);if(n.onWorker?.(u,g),!i)return{taskId:u,task:D(a,u)??f,engine:t.engine,startupCheck:`pending`};let _=we(a,u,g),v=ve(m,h),y=!1,b=!1,x=()=>{let e=v().map(e=>{try{return JSON.parse(e)}catch{return{kind:`unknown`}}});return b||=e.some(e=>e.kind===`tool`||e.kind===`reply`),e.some(e=>e.phase!==`starting`&&![`status`,`usage`].includes(e.kind??``))},S=Date.now()+15e3,w,T=f;try{for(;Date.now()<(w===void 0?S:w+5e3)&&(T=D(a,u)??T,!(ce.includes(T.status)||p(a,u).at(-1)?.status===0||(y=x()||y,T.threadId&&(w??=Date.now(),y))));)await _.wait(Math.min(3e4,(w===void 0?S:w+5e3)-Date.now()))}finally{_.close()}if(T.status===`failed`){x();let e=M.join(A(a,u),`result.json`),n=k(e),r=n?.error?.message??``,i=xe(a,u,5).map(e=>e.message??``).join(`
|
|
8
|
+
`),o=r||i;throw sr(t.permissions,o)?new R(`read-only-unavailable`,o):qn(o)&&!hr(n,b)?new Jn(t.engine,o):new R(`startup-failed`,o,{taskId:u})}return{taskId:u,task:T,engine:t.engine,startupCheck:T.threadId?`passed`:`pending`}}function fr(e,t,n,r,i){return{error:`${e} failed to start: ${t}`,fallback:{action:`run-native-subagent`,reason:`no-engine-available`,permissions:n,instructions:Ce,note:ge,...r?{system:r}:{},task:i}}}async function pr(e,t={}){if(N.env.CODER_WORKER&&!t.fromMailbox)throw new R(`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 R(`invalid-option`,`outputSchema must be an object.`);if(!e.prompt.trim())throw new R(`invalid-option`,`Missing task text.`,{hint:[`Usage: coder run "<task text>"`,`Help: coder task run --help`]});e={...e,addDirs:ar(e.cwd,e.addDirs)};let n=t.config??O(e.cwd),r=nr(e.mcp,n.mcp),i={...e,mcp:r.mcp,mcpBindings:e.mcpBindings??r.mcpBindings,mcpWarnings:[...e.mcpWarnings??[],...r.warnings??[]],nativeMcp:e.nativeMcp??r.nativeMcp},a={engine:e.engine,model:e.model,effort:e.effort,permissions:e.permissions},o={name:e.name,simulateApproval:e.simulateApproval};for(;;){let r=Yn(a,n);try{return await dr(n,r,i,o,t.waitForStartup!==!1)}catch(t){if(!(t instanceof Jn))throw t;let i=mr(t.engine,n);if(!i){let n=fr(t.engine,t.detail,r.permissions,e.system,e.prompt);throw new R(`chain-exhausted`,n.error,{payload:n})}e.onFallback?.({engine:t.engine,detail:t.detail,next:i}),a={engine:i,permissions:e.permissions},o={name:void 0,simulateApproval:void 0}}}}function mr(e,t){return t.chain.slice(t.chain.indexOf(e)+1).find(e=>e!==`custom`||Object.values(t.models??{}).some(E))}function hr(e,t=!1){return!!(t||e?.touchedFiles?.length||e?.fileChanges?.length||e?.commandExecutions?.length)}function gr(e,t,n){if(t.status!==`failed`)return;let r=t.result;if(!r||!qn(r.error?.message??``))return;let i=Date.parse(t.turns.at(-2)?.at??t.task.resumedAt??t.task.createdAt);if(!hr(r,xe(e,t.taskId,2**53-1).some(e=>(e.kind===`tool`||e.kind===`reply`)&&(!e.at||Date.parse(e.at)>=i)))&&!t.turns.at(-1)?.lastReply)return mr(t.task.engine,n??O(e))??null}function _r(e,t){return k(M.join(A(e,t),`result.json`))}function vr(e,t,n=0){if(n===0)return[];let r=xe(e,t,2**53-1);return n===`all`?r:_e(r,n)}function yr(e,t,n={}){let r=D(e,t);if(!r)throw Error(`No task found for "${t}".`);return{taskId:t,status:r.status,result:ye.includes(r.status)?null:_r(e,t),steps:vr(e,t,n.tail),turns:p(e,t),task:r}}async function br(e,t,n={}){let r=D(e,t);if(!r)throw Error(`No task found for "${t}".`);let i=await xr(e,r,1e3,n);if(i.reason===`approval`){let e=i.approval;throw new R(`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:_r(e,t),steps:vr(e,t,n.tail),turns:p(e,t),task:a}}async function xr(e,t,n=1e3,{turn:r,worker:i,rollover:a=!1,signal:o}={}){let s=t,c=we(e,t.id,i);try{let t=te();for(;;){o?.throwIfAborted(),s=D(e,s.id)??s;let i=r===void 0?void 0:p(e,s.id)[r];if(s=i?{...s,status:i.status===0?`completed`:`failed`}:re(e,s,t),a?!s.rollingOver:ce.includes(s.status))return{task:s,reason:`terminal`};let l=Vn(A(e,s.id)).find(e=>!e.response);if(l){let e=l.params;return{task:s,reason:`approval`,approval:{id:l.id,summary:String(l.summary??``),cwd:typeof l.cwd==`string`?l.cwd:null,networkHost:e?.networkApprovalContext?.host??null}}}await c.wait(n,o)}}finally{c.close()}}export{K as A,Xe as B,kn as C,un as D,ln as E,We as F,z as H,Ze as I,Ye as L,Ut as M,Ht as N,Xt as O,tt as P,qe as R,An as S,dn as T,R as U,Be as V,zn as _,_r as a,Wn as b,Yn as c,gr as d,xr as f,Rn as g,Gn as h,sr as i,Vt as j,Zt as k,nr as l,Hn as m,lr as n,yr as o,br as p,pr as r,ir as s,fr as t,ur as u,Un as v,rn as w,Q as x,Vn as y,V as z};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e}from"./cli-
|
|
1
|
+
import{i as e}from"./cli-BBlH53hA.js";import{g as t,p as n,s as r}from"./output-BKeyLbvt.js";import{n as i}from"./args-CURX44CA.js";import{t as a}from"./docs-CvjWiada.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{Pn as e}from"./prompts-
|
|
1
|
+
import{Pn as e}from"./prompts-Bj4Fbd_n.js";import{U as t}from"./dispatch-CFZ9Crvg.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)))}}return[...u,...i]}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
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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as e}from"./cli-BBlH53hA.js";import{c as t}from"./args-CURX44CA.js";import{_ as n}from"./executor-3QMa-XRY.js";const r=e({name:`flow drive`,options:{cwd:t},args:1,run:({args:[e],cwd:t})=>n(e,t)});export{r as commandDrive};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{toggle as e}from"./disable-
|
|
1
|
+
import{toggle as e}from"./disable-Dml_Slph.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{Wi as e,Xt as t,Zt as n,dn as r,qi as i}from"./core-DwsAMCnL.js";import{
|
|
1
|
+
import{Wi as e,Xt as t,Zt as n,dn as r,qi as i}from"./core-DwsAMCnL.js";import{Ar as a,Cr as o,Dr as s,On as c,Or as l,Sr as u,Tr as d,gr as f,hr as p,kr as m,mr as h,wr as g,yr as _}from"./prompts-Bj4Fbd_n.js";import{U as v}from"./dispatch-CFZ9Crvg.js";import y from"node:path";import b from"node:process";import x from"node:os";var S=i({ISSUES_URL:()=>T,loadServerConfig:()=>M,requireBunServer:()=>P,rerunUnderBun:()=>F});const C=e=>p(h().check(_(),n()),e),w=d(g(m()),a(e=>e===`1`)),T=`https://github.com/muzam1l/coder/issues/new`,E=(e,n)=>m().check(t(e=>e.replace(/\/$/,``)),s(e=>URL.canParse(e),{error:`must be a URL`,abort:!0}),s(t=>e(new URL(t)),n)),D=e=>d(a(e=>e||void 0),e),O=d(m(),a((t,n)=>{try{let e=JSON.parse(t);if(e&&!Array.isArray(e)&&typeof e==`object`)return e}catch{}return n.issues.push({code:`custom`,message:`must be a JSON object`,input:t}),e})),k=o({AUTH_WULAR_URL:p(E(e=>e.protocol===`https:`||e.hostname===`localhost`,`must use HTTPS unless it is localhost`),`https://auth.wular.ai`)}),A=o({SERVER_LIMITS:D(g(d(O,l({principalPerMinute:g(u().check(_(),n())),authPerMinute:g(u().check(_(),n())),registerPerMinute:g(u().check(_(),n())),ipPerMinute:g(u().check(_(),n())),pairingPerMinute:g(u().check(_(),n())),concurrentTasks:g(u().check(_(),n()))})))),RUNNER:g(f([`local`,`local-docker`,`vercel-sandbox`,`github-actions`,`http`])),RUNNER_CONFIG:D(p(O,{})),WORK_DIR:g(m()),SERVER_ENCRYPTION_KEY:g(m()),SERVER_ENCRYPTION_KEY_PREVIOUS:g(m()),ADMIN_TOKEN:g(m()),PUBLIC_URL:D(g(E(e=>e.pathname===`/`&&!e.search&&!e.hash,`must be an origin, with no path, query or fragment`))),SERVER_NAME:g(m().check(r())),ISSUES_URL:D(g(E(()=>!0,`must be a URL`))),VERCEL_PROJECT_PRODUCTION_URL:g(m()),VERCEL_URL:g(m()),VERCEL:g(m()),DATABASE_URL:g(m()),POSTGRES_URL:g(m()),DATABASE_POOL_MAX:g(h().check(_(),n())),DATABASE_IDLE_TIMEOUT:g(h().check(_(),n())),MAX_TASKS:g(h().check(_(),n())),MAX_QUEUED:C(1e3),TASK_STALL:C(3e5),TASK_ATTEMPTS:C(2),TASK_TIMEOUT:C(18e5),CLAUDE_SUBSCRIPTIONS:w,CODEX_SUBSCRIPTIONS:w,SERVER_INTEGRATIONS:D(g(m())),SERVER_OPERATORS:D(g(m()))});function j(e,t){let n=e.safeParse(t);if(n.success)return n.data;let r=n.error.issues[0];throw new v(`invalid-option`,`Invalid server configuration:${String(r.path[0])} ${r.message}`)}function M(e=b.env,t=`node`){let n=j(A,e),r=n.DATABASE_URL??n.POSTGRES_URL,i=r?`postgres`:`memory`;if(i===`postgres`&&!n.SERVER_ENCRYPTION_KEY)throw new v(`invalid-option`,`SERVER_ENCRYPTION_KEY is required with DATABASE_URL`);let a=t===`vercel`?n.VERCEL_PROJECT_PRODUCTION_URL??n.VERCEL_URL:void 0,o=n.PUBLIC_URL??(a?`https://${a}`:void 0),s=i===`postgres`?j(k,e).AUTH_WULAR_URL:void 0;return{runner:n.RUNNER??(t===`vercel`||n.VERCEL?`vercel-sandbox`:`local`),store:i,workDir:n.WORK_DIR??y.join(x.tmpdir(),`coder`),...n.SERVER_ENCRYPTION_KEY?{encryptionKey:n.SERVER_ENCRYPTION_KEY}:{},...n.SERVER_ENCRYPTION_KEY_PREVIOUS?{previousEncryptionKey:n.SERVER_ENCRYPTION_KEY_PREVIOUS}:{},...n.ADMIN_TOKEN?{adminToken:n.ADMIN_TOKEN}:{},...o?{publicUrl:o}:{},...n.SERVER_NAME?{name:n.SERVER_NAME}:{},issuesUrl:n.ISSUES_URL??`https://github.com/muzam1l/coder/issues/new`,...r?{databaseUrl:r,databasePool:{max:n.DATABASE_POOL_MAX??(t===`vercel`||n.VERCEL?2:10),idleTimeout:n.DATABASE_IDLE_TIMEOUT??(t===`vercel`||n.VERCEL?30:240)}}:{},runnerConfig:n.RUNNER_CONFIG,maxTasks:n.MAX_TASKS,limits:n.SERVER_LIMITS,maxQueued:n.MAX_QUEUED,taskTimeoutMs:n.TASK_TIMEOUT,taskStallMs:n.TASK_STALL,taskAttempts:n.TASK_ATTEMPTS,...n.CLAUDE_SUBSCRIPTIONS||n.CODEX_SUBSCRIPTIONS?{subscriptions:{claude:n.CLAUDE_SUBSCRIPTIONS,codex:n.CODEX_SUBSCRIPTIONS}}:{},...s?{auth:{wular:{url:s}}}:{},...n.SERVER_INTEGRATIONS?{integrations:n.SERVER_INTEGRATIONS.split(`,`).map(e=>e.trim()).filter(Boolean)}:{},...n.SERVER_OPERATORS?{operators:n.SERVER_OPERATORS.split(`,`).map(e=>e.trim()).filter(Boolean)}:{}}}function N(){return new v(`invalid-option`,`The Coder server needs Bun; the CLI itself runs on Node.`,{hint:[b.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 P(){if(typeof Bun>`u`)throw N()}async function F(){if(typeof Bun<`u`)return;let e=b.platform===`win32`?[`bun.exe`,`bun.cmd`,`bun`]:[`bun`];for(let t of e){let e=await c(t);if(e.error?.code!==`ENOENT`&&e.error?.code!==`EINVAL`){if(e.error)throw e.error;if(e.signal){let t=x.constants.signals[e.signal];b.exit(typeof t==`number`?128+t:1)}b.exit(e.status??1)}}throw N()}export{M as n,P as r,S as t};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{qi as e}from"./core-DwsAMCnL.js";import{Bn as t,Jt as n,Pt as r,Qn as i,S as a,Vt as o,W as s,Xn as c,c as l,fn as u,l as d,lr as f,mt as p,nn as m,p as h,pr as g,pt as _,s as v,un as y,wt as b}from"./prompts-Bj4Fbd_n.js";import{B as x,I as S,U as C,c as w,d as ee,l as te,n as T,p as E,r as ne,s as D}from"./dispatch-CFZ9Crvg.js";import{d as O,l as k,m as A,o as j,u as M}from"./load-Q9fL4VC6.js";import{t as N}from"./integrations-IGnXBrPw.js";import{i as P}from"./dist-DAnSqY1s.js";import{a as F,s as I}from"./actions-Cwe3IDVs.js";import{r as L}from"./executor-3QMa-XRY.js";import{REVIEW_PLATFORM as R,postReview as z,resolveReviewTarget as re}from"./flow/builtin/review.js";import{a as ie,o as ae,s as B,u as V}from"./mcp-Dsl3Xdd3.js";import H from"node:path";import U from"node:process";import{readFileSync as oe,readdirSync as se,realpathSync as ce,writeFileSync as le}from"node:fs";import W from"node:fs/promises";var ue=e({AGENT_TASK_PREFIX:()=>G,agentDeveloperInstructions:()=>Se,agentInstructions:()=>Ce,agentTaskOptions:()=>xe,builtinArgs:()=>ye,builtinTaskArgs:()=>_e,defaultTask:()=>Te,execAgent:()=>ge,isConversation:()=>$,localAgentAccess:()=>be,postReply:()=>Y,postReplyParts:()=>J,postTurnReply:()=>X,reactToMessage:()=>me,replyParts:()=>fe,startAgentMailbox:()=>Ee,taskFromEvent:()=>K,threadReply:()=>q,waitForAgentTask:()=>Z});const G=`agent:`;function K(e,t,n){let r=N[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]:r.tools.presets[k(e)]}:{}}}function de(e){return e.normalize(`NFKC`).toLowerCase().replace(/[“”„‟«»‘’‚‛"'`]/g,``).replace(/[‐‑‒–—―−]/g,`-`).replace(/[.!?,;:…]+(?=\s|$)/g,``).replace(/\s+/g,` `).trim()}function q(e,t,n,r){let i=t?.finalMessage?.trim(),a=e.event&&N[e.event.integration]?.progressReplies,o=r?.lastReply?.trim();if(i&&i.replace(/^`+|`+$/g,``).trim()!==`__EMPTY__`&&!t?.error)return{text:i,problem:!1,...!a&&o&&de(i)===de(o)?{duplicate:!0}:{}};let s=t?.error?.message?.trim()??``;if(t?.error&&o&&!a)return{text:``,problem:!0,duplicate:!0};if(n)return{text:s,problem:!1};if(t&&!t.error){if(a&&o)return{text:o,problem:!1};if(r?.lastReply?.trim()||V(r?.prompt,e.context?.mustReply??e.event?.mustReply,r?.steers)===!1)return{text:``,problem:!1,skipped:!0};let t=e.taskUrl?` [See the task](${e.taskUrl})`:``;return{text:`${_}${t}`,problem:!1}}return{text:e.failureReply??s,problem:!0}}function fe(e,t){if(!t||e.length<=t)return[e];let n=[],r=``,i=!1,a=()=>{r.trim()&&n.push(r.trimEnd()),r=``};for(let o of e.split(/\n\n/)){r&&!i&&`${r}\n\n${o}`.length>t&&a();let e=r?`${r}\n\n${o}`:o;for(;e.length>t;){let r=e.lastIndexOf(`
|
|
2
|
+
`,t),i=r>0?r:t;n.push(e.slice(0,i).trimEnd()),e=e.slice(i).replace(/^\n/,``)}r=e,(o.match(/^```/gm)??[]).length%2==1&&(i=!i)}return a(),n}async function J(e,t,n,r,i=!1){let a=[],o=i&&e.adapter.postProgress;for(let i of fe(t,n))a.push(o?await o.call(e.adapter,e.id,i):r&&e.adapter.reply?await e.reply(r,{markdown:i}):await e.post({markdown:i}));return a}async function Y(e,t,n,r,i=e.id,a=!1,o=!1,s){let c=s??await pe(e,t,r,i),l=c.adapter,u=l.postProblem;if(a&&u){let e=(await u.call(l,c.id,n))?.id;return e?[e]:[]}return(await J(c,n,e.replyLimit,t.chat?.message?.id,o)).flatMap(e=>e.id?[e.id]:[])}async function X(e,t,n,r){let i=H.join(m(e,t),`post-${n}.json`),a=f(i);if(a)return a;le(i,`null`,{flag:`wx`});let o=await r();return g(i,o),o}async function pe(e,t,n,r){if(!t.chat)throw Error(`The ${t.integration} event has no conversation`);let[{Chat:i},{LocalChatState:a}]=await Promise.all([import(`./dist-DAnSqY1s.js`).then(e=>e.a),import(`./chat-bwKd3y6V.js`).then(e=>e.r)]),o=await e.adapter({fetch,appId:t.appId.slice(e.id.length+1),name:r,installationId:t.installationId,token:async()=>n,privateState:()=>new a}),s=new i({userName:r,adapters:{[e.id]:o},state:new a,logger:`error`});return await s.initialize(),s.thread(t.chat.thread.id)}async function me(e,t,n){if(!n)throw Error(`This turn has no message to react to; give a message id`);let r=P.fromSlack(P.fromGChat(t).name);await e.adapter.addReaction(e.id,n,r)}function he(e,t){return Object.fromEntries(Object.keys(e.tools).map(n=>[n,t[ae(n)]??(n===e.event?.integration?t.APP_TOKEN:void 0)]))}async function ge(e){let{cwd:i,flow:c}=e,l=s(i),d=await j(i,N),f=e.task;!f&&e.taskFile&&(f={...JSON.parse(await W.readFile(H.resolve(i,e.taskFile),`utf8`)),flow:c});let h=d.find(t=>t.id===e.agent);if(f&&(h={id:f.agent,name:f.definition.name??f.agent,definition:A(f.agent,f.definition),...f.usage?{usage:f.usage}:{},...f.files?{files:f.files}:{},builtin:!1}),!h)throw Error(`No agent named "${e.agent}".`);f??=await ve(i,h,c,e);let _=f.event,v=_&&N[_.integration];if(_&&!v)throw Error(`Unknown integration "${_.integration}".`);let y=t(e.connections??{},e.connectionEnv),x=ie(f,e.toolEnvironment?.tokens??he(f,U.env),e.replyEndpoint,e.toolEnvironment?.native);if(c==="default"){let t=e.post!==!1&&!!v,a=e.postToken??U.env.APP_TOKEN,s=t?pe(v,_,a,f.author??v.id):void 0;s?.catch(()=>{});let d=Te(h,f),S=e.resumeTaskId&&o(i,e.resumeTaskId)?.engine,T=w(S&&S!==O(h).engine?{engine:S}:O(h),l),D=te(f.mcp?.join(`,`),l.mcp,h.definition.mcp,y.mcp),k=[...Object.values(x.mcp),...D.mcp],A=e.resumeTurn??(e.resumeTaskId?n(i,e.resumeTaskId).length:0),j,M=e.resumeTaskId??e.taskId??r(),N=f.engineChain??[T.engine],P=Math.max(0,N.indexOf(T.engine)),F=!1;for(let e of N.slice(0,P))b(i,M,{kind:`warning`,message:`${e} skipped because no applicable credential is connected`});let I,L;for(;;){let t=N[P];T=w(F?{engine:t}:{...O(h),engine:t},l);let r=!1;try{if(await e.onEngine?.(t)===!1)throw new C(`chain-exhausted`,`No applicable credential is connected for ${t}`);F&&u(i,M,{status:`queued`,pid:null,threadId:null,resumeThreadId:null,resumedAt:new Date().toISOString(),error:void 0,completedAt:void 0}),I=e.resumeTaskId?{taskId:e.resumeTaskId}:await ne({onWorker:(t,n)=>{j=n,e.onWorker?.(t,n)},availability:e.availability,taskId:M,...e.resume?{resume:e.resume}:{},mcp:k,mcpBindings:D.mcpBindings,mcpWarnings:D.warnings,nativeMcp:D.nativeMcp,connectionEnv:{...y.env,...x.env},connections:f.connections,cwd:i,agentId:f.agent,...$(f)?{conversation:!0}:{},...f.author?{author:f.author}:{},..._?.repo?{repo:`${_.repo.owner}/${_.repo.name}`}:{},...e.source?{source:e.source}:{name:`${G}${f.id}`,source:f.source},engine:T.engine,model:T.model??void 0,effort:T.effort??void 0,permissions:f.permissions??T.permissions,agentPrompt:d.agentPrompt,prompt:d.prompt,outputSchema:f.context?.outputSchema,wait:!0},f.engineChain?{config:{...l,chain:[T.engine]},waitForStartup:!1}:{}),await e.onTask?.(I.taskId,A),L=await Z(i,I.taskId,e.onApproval,(e,t)=>E(e,t,{turn:A,worker:j}))}catch(t){if(!f.engineChain||!(t instanceof C)||t.code!==`chain-exhausted`)throw t;r=!0;let a=t.payload?.error??t.message,o=u(i,M,{status:`failed`,engine:T.engine,prompt:d.prompt,error:a,pid:null}),s={status:1,threadId:null,error:{message:a}};g(H.join(m(i,o.id),`result.json`),s),await W.appendFile(H.join(m(i,o.id),`results.jsonl`),JSON.stringify({...s,prompt:d.prompt})+`
|
|
3
|
+
`),I={taskId:o.id},await e.onTask?.(o.id,A),L={taskId:o.id,task:o,status:`failed`,result:s,turns:n(i,o.id),steps:[]}}let a=r?N[P+1]??null:f.engineChain?ee(i,L,{...l,chain:N}):void 0;if(a!==void 0&&b(i,M,{kind:`warning`,message:`${T.engine} skipped because ${L.result?.error?.message??`the engine could not start`}`}),a==null)break;A=n(i,I.taskId).length,j&&await new Promise(e=>{if(j.exitCode!==null||j.signalCode)return e();j.once(`exit`,()=>e())}),P++,F=!0,e={...e,resumeTaskId:void 0,resume:void 0}}let R=n(i,I.taskId)[A],{text:z,problem:re,skipped:ie,duplicate:ae}=R?q(f,R,!1,R):q(f,L.result,L.status===`cancelled`);ie&&t&&b(i,I.taskId,{kind:`status`,message:p});let B=t&&!!z&&!ae,V=B?await X(i,I.taskId,A,async()=>Y(v,_,z,a,f.author,re,!1,await s)):[];return{ok:L.status===`completed`,flow:c,reply:z,posted:B,...V.length?{postedMessages:V}:{},taskId:I.taskId,turn:A,tokens:L.result?.tokens??void 0}}let S=a(c,i),T=S.scope===`builtin`?{...await _e(f,h,e.post!==!1),cwd:i,...f.args}:f.args??_,D=await L(S.path,{cwd:i,...e.taskId?{runId:e.taskId}:{},args:T,ceiling:{agent:h.id,permissions:f.permissions??w(O(h),l).permissions},...e.postToken?{integrationToken:e.postToken}:{},connections:{mcp:{...y.mcp,...x.mcp},env:{...y.env,...x.env},ids:f.connections??[]}},{...e.onTask?{onEvent:t=>{t.kind===`task-start`&&e.onTask(t.taskId)}}:{},...e.onStart?{onStart:e.onStart}:{}});return{ok:!0,flow:c,runId:D.runId,result:D.result,tokens:D.tokens}}async function Z(e,t,n,r=E,i){let a,o=y(e,t);try{for(;;)try{return await r(e,t)}catch(e){if(!(e instanceof C)||e.code!==`approval-pending`||!n)throw e;if(e.approval?.id!==a){a=e.approval?.id,await n(e.approval);continue}await(i?i():o.wait(3e4))}}finally{o.close()}}async function _e(e,t,n=!0){if(!e.event)throw Error(`built-in flows need a GitHub pull request event`);return{...await ye(e.event,t,e.context,e.author,n),...O(t),...e.permissions?{permissions:e.permissions}:{}}}async function ve(e,t,n,r){if(r.taskFile){let t=JSON.parse(await W.readFile(H.resolve(e,r.taskFile),`utf8`));return{...t,flow:n,tools:t.tools??{}}}if(!r.eventFile)throw Error(`Missing --task or --event file.`);return K(t,n,JSON.parse(await W.readFile(H.resolve(e,r.eventFile),`utf8`)))}function ye(e,t,n,r,i=!0){let a=N[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 be(e,t){let n=(await j(e,N).catch(()=>[])).find(e=>e.id===t);return n?k(n):`read`}async function xe(e,t,n,r,a){let o=await j(e,N),l=o.find(e=>e.id===t);if(!l)throw new C(`invalid-option`,`No agent named "${t}".`,{hint:`Agents here: ${o.map(e=>e.id).join(`, `)}`});let{definition:u,usage:d}=l,f=r===void 0?await c(i(d?.connections,a),void 0,void 0,k(l)):void 0,p=u.mcp??{},m=te(n,s(e).mcp,p,r??f?.mcp);return{engine:d?.engine??u.engine,model:d?.model??u.model,effort:d?.effort??u.effort,permissions:d?.permissions??u.permissions,developer:Se(l),...m,mcpWarnings:m.warnings,connections:d?.connections,...f?{connected:f}:{}}}const Q=48e3;function Se(e,t){return v({description:e.definition.description,instructions:Ce(e),notes:t?.instructions})}function Ce(e){if(!e.dir)return we(e.files??{});let t;try{t=se(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${oe(H.join(e.dir,r),`utf8`).trim()}\n`;if(n+=t.slice(0,Q-n.length),n.length===Q)break}return n.trimEnd()}function we(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,Q-n.length),n.length===Q)break}return n.trimEnd()}const $=e=>!!(e.event&&e.source===e.event.integration);function Te(e,t){let{event:n,context:r}=t,i=$(t),a=t.prompt===void 0?r?.user:void 0,o=n&&N[n.integration],s=t.prompt===void 0?n?l([n],a):``:h(t.prompt,n?.repo,n&&o?.repos?.pullRequest(n));return{agentPrompt:{developer:Se(e,r),...i?{platform:{name:n.integration,prompt:o?.prompt},events:M(e.definition.integrations[n.integration])}:{},access:k(e)},prompt:d(r?.messages??[],s)}}function Ee(e,t){let n=S(e,t);if(!n)return()=>{};let r={agent:t.agentId,permissions:t.permissions??`auto`},i=ce(e),a=new Map((t.mcp??[]).map(e=>[e.name,e])),s=t.connectionSource??(t.connections?`server`:void 0),c=e=>{if(!e.command)return e;let[t]=D([e],U.env,i);if(!t)throw Error(`MCP server "${e.name}" is not approved.`);return{...e,command:t.command,args:t.args}},l=e=>{try{return ce(e)}catch{return null}},u=[e,...t.addDirs??[]].flatMap(e=>l(H.resolve(e))??[]),d=e=>u.some(t=>e===t||e.startsWith(t+H.sep)),f=new Map,p=new Set,m=()=>{let e=B(D(t.mcp),R);return e?{token:e}:{}};return x(n,{async dispatch(e){let n=e.name??`task`;if(e.mcp!==void 0&&(typeof e.mcp!=`string`||/^[\[{]/.test(e.mcp.trim())))throw new C(`invalid-option`,`Mailbox MCP selections must be server names.`);let o=(e.mcp??``).split(`,`).map(e=>e.trim()).filter(Boolean).map(e=>{let t=e===`all`?void 0:a.get(e);if(!t)throw new C(`invalid-option`,`MCP server "${e}" is not authorized for agent "${r.agent}".`);return c(t)});for(let e of t.connections??[]){let t=[...a.values()].find(t=>t.connection===e||!t.connection&&t.name===e);t&&!o.some(e=>e.name===t.name)&&o.push(c(t))}let u=H.resolve(String(e.cwd??i));if(l(u)!==l(i)&&o.some(e=>e.command))throw new C(`invalid-option`,`Inherited stdio MCP servers do not allow a cwd override.`);let p=[u,...(e.addDirs??[]).map(e=>H.resolve(u,e))],m=p.find(e=>!l(e));if(m)throw new C(`invalid-option`,`task "${n}" asks for ${m}, which does not exist`);let[h,...g]=p.map(e=>l(e)),_=[h,...g].find(e=>!d(e));if(_)throw new C(`invalid-option`,`task "${n}" asks for ${_}, outside the workspace of agent "${r.agent}"`);let v=await ne({prompt:String(e.prompt??``),outputSchema:e.outputSchema,cwd:h,engine:e.engine,model:e.model,effort:e.effort,mcp:o,connections:t.connections,connectionSource:s,permissions:T(n,e.permissions,r),name:e.name,system:e.system,addDirs:g,flowRunId:e.flowRunId,wait:!0},{fromMailbox:!0});return f.set(v.taskId,h),{taskId:v.taskId}},async steer(e){let n=f.get(e.taskId);if(!n)throw new C(`invalid-option`,`No task "${e.taskId}" started by this flow.`);let a=o(n,e.taskId);if(!a)throw new C(`invalid-option`,`No task "${e.taskId}".`);return I(n,a,String(e.text??``),{...s===`server`?{resolveConnections:F(t.mcp,i,c)}:{},model:e.model,effort:e.effort,permissions:e.permissions?T(a.name,e.permissions,r):void 0})},async wait(e){let t=f.get(e.taskId);if(!t)throw new C(`invalid-option`,`No task "${e.taskId}" started by this flow.`);let n=await E(t,e.taskId);return{status:n.status,result:n.result,model:n.task.model??null,next:ee(t,n)??null}},review(n){if(n.op===`resolveTarget`){let{repo:r,...i}=n.input??{};if(!t.repo&&!/^\d+$/.test(String(i.pr)))throw new C(`invalid-option`,`review target must be a pull request number in this task's repository`);let a=re({...i,cwd:e,...t.repo?{repo:t.repo}:{},...t.author?{author:t.author}:{}},m());return a.pr&&p.add(`${a.pr.repo}#${a.pr.number}`),a}if(n.op!==`post`)throw new C(`invalid-option`,`unknown review action "${n.op}"`);if(!p.has(`${n.input?.repo}#${n.input?.pr}`))throw new C(`invalid-option`,`review post: pull request was not resolved by this task`);return z({...n.input,cwd:e},m())}})}export{Y as a,me as c,Z as d,ue as i,K as l,xe as n,J as o,ge as r,X as s,G as t,q as u};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import{qi as e}from"./core-DwsAMCnL.js";import{$t as t,An as n,Dt as r,Lt as i,Nt as a,Qt as o,S as s,St as c,Ut as l,Vt as u,W as d,Wt as f,Yt as ee,
|
|
1
|
+
import{qi as e}from"./core-DwsAMCnL.js";import{$t as t,An as n,Dt as r,Lt as i,Nt as a,Qt as o,S as s,St as c,Ut as l,Vt as u,W as d,Wt as f,Yt as ee,d as p,dr as m,hn as h,or as te,sr as ne,u as re}from"./prompts-Bj4Fbd_n.js";import{L as g,R as _,U as v,d as ie,l as ae,n as oe,p as se,r as ce}from"./dispatch-CFZ9Crvg.js";import{r as le,s as ue}from"./output-BKeyLbvt.js";import{c as de,s as fe}from"./actions-Cwe3IDVs.js";import{t as pe}from"./log-view-CL3_S0IQ.js";import{createRequire as me}from"node:module";import y from"node:path";import b from"node:process";import{fileURLToPath as he,pathToFileURL as x}from"node:url";import S from"node:fs";import{spawn as ge,spawnSync as _e}from"node:child_process";import ve,{randomUUID as ye}from"node:crypto";import be from"node:os";import{AsyncLocalStorage as xe}from"node:async_hooks";function C(e){return typeof e!=`object`||!e?JSON.stringify(e)??`null`:Array.isArray(e)?`[${e.map(C).join(`,`)}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${C(e[t])}`).join(`,`)}}`}function Se(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function w(e,t){return ve.createHash(`sha256`).update(`${e}\0${C(t)}`).digest(`hex`)}function T(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 Ce=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})}},we=e({archiveRun:()=>A,archiveRuns:()=>Le,collectFlowRuns:()=>Ue,deleteRun:()=>j,deleteRuns:()=>Re,driveRun:()=>Oe,flowSteps:()=>He,flowTaskIds:()=>z,generateRunId:()=>D,latestRun:()=>R,listArchivedRuns:()=>L,listRuns:()=>I,readFlowRecord:()=>P,readRawRecord:()=>M,reconcileRun:()=>N,resumeRun:()=>Ne,runDirFor:()=>k,runResult:()=>Fe,startRun:()=>Me,unarchiveRun:()=>ze,watchRun:()=>E,writeFlowRecord:()=>F});function Te(){try{return _e(`bun`,[`--version`],{stdio:`ignore`}).status===0}catch{return!1}}function Ee(e,t){if(!e.endsWith(`.ts`)||b.versions.bun||b.features.typescript)return;if(!Te())throw new v(`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 r=_e(`bun`,[n,...t],{stdio:`inherit`});b.exit(r.status??1)}function De(e){let t=!1,n=n=>{t||(t=!0,(async()=>{let{runId:t}=e;b.stderr.write(`\n[flow] Stopping run ${t}. No new tasks will dispatch.\n`);let r=n?e.runningIds():await St(t,e.runningIds());r.length&&b.stderr.write(`[flow] ${n?`left running`:`stopped tasks`}: ${r.join(`, `)}\n`),b.stderr.write(`\n${ue([`Resume: coder flow resume ${t}`],le)}\n`),e.requestStop(),b.exit(130)})())};b.once(`SIGINT`,()=>n(!1)),b.once(`SIGTERM`,()=>n(!0))}async function Oe(e,t){let n=M(e);if(!n)throw Error(`No flow run "${e}".`);try{await kt(n,t,{onStart:De})}catch(t){throw Z(e,t instanceof Error?t.message:String(t)),t}}function ke(e,t,r){let i=e.script.endsWith(`.ts`)&&!b.versions.bun&&!b.features.typescript;if(i&&!Te())throw Error(`TypeScript flows need bun or Node 23.6+.`);let a=S.openSync(y.join(k(e.runId),`flow.log`),`a`),o=ge(i?`bun`:b.execPath,[n,`flow`,`drive`,e.runId,`--cwd`,t],{detached:!0,stdio:[`ignore`,a,a],env:b.env});return o.unref(),S.closeSync(a),{runId:e.runId,status:`running`,...r?{watch:E(e.runId,{bootPid:o.pid})}:{}}}async function Ae(e,t,n){try{return await n()}catch(n){if(!(n instanceof v)||n.code!==`flow-failed`)throw n;let r=t?`
|
|
2
2
|
[flow] dry-run ended early: a downstream step depends on real task output (stub it or run for real).`:``;throw new v(`flow-failed`,`[flow] ${e} ${n.runId} failed: ${n.message}${r}`,{runId:n.runId,hint:`Resume${e===`resume`?` again`:``}: coder flow resume ${n.runId}`})}}function je(e,t){let n=e?P(e):R();if(!n)throw new v(`flow-failed`,e?`No flow run "${e}".`:t,{hint:`Run one: coder flow run <name>`});return n}async function Me(e,t={},n={}){if(t.detached){if(!t.dryRun)return ke(Y(e,t),t.cwd?y.resolve(t.cwd):b.cwd(),t.wait);Ee(s(e,t.cwd?y.resolve(t.cwd):b.cwd()).path,b.argv.slice(2))}return Ae(`run`,t.dryRun,()=>$(e,t,n))}async function Ne(e,t={},n={}){let r=je(e,`No flow runs to resume.`);if(t.detached){if(!t.dryRun)return ke(Y(``,t,r.runId),t.cwd?y.resolve(t.cwd):b.cwd(),t.wait);Ee(r.script,b.argv.slice(2))}return Ae(`resume`,t.dryRun,()=>Ot(r.runId,t,n))}function Pe(e){let t=y.join(k(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 Fe(e,t={}){let n=e?P(e):R();return n?{...n,steps:He(n.runId,t.tail),journal:T(y.join(k(n.runId),`journal.jsonl`)).map(e=>({kind:e.kind,taskId:e.taskId,tokens:e.tokens})),events:Pe(n.runId)}:null}function E(e,t={}){let n=je(e,`No flow runs yet.`);return{record:n,events:wt(n.runId,t.bootPid,{tail:t.tail}),final(){let e=Fe(n.runId,{tail:0});if(!e)throw new v(`flow-failed`,`[flow] run ${n.runId} vanished while following.`,{hint:`Recent runs: coder flow list`});return e}}}function Ie(e){let t=P(e);if(!t)throw new v(`flow-failed`,`No flow run "${e}".`,{hint:`Recent runs: coder flow list`});if(t.status===`running`)throw new v(`flow-failed`,`Run ${t.runId} is still running.`,{runId:t.runId,hint:`Stop it first: coder flow stop ${t.runId}`});return t}function Le(e,t={}){if(t.allStopped){let e=I().filter(e=>e.status!==`running`);for(let t of e)A(t);let t=e.map(e=>e.runId);return{archived:t,count:t.length}}if(!e)throw new v(`invalid-option`,`Missing run id.`,{hint:[`Archive one: coder flow archive <run-id>`,`Archive all stopped: coder flow archive --all-stopped`]});let n=Ie(e);return A(n),{runId:n.runId,archived:!0}}function Re(e,t={}){if(t.allArchived){let e=L().filter(e=>j(e.runId)).map(e=>e.runId);return{deleted:e,count:e.length}}if(!e)throw new v(`invalid-option`,`Missing run id.`,{hint:[`Delete one: coder flow delete <run-id>`,`Delete all archived: coder flow delete --all-archived`]});let n=Ie(e);return{runId:n.runId,deleted:j(n.runId)}}function D(){return`flow-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function O(){let e=_();return t(e)}function k(e){r(e,`flow run id`);let t=y.join(O(),e);if(S.existsSync(y.join(t,`flow.json`)))return t;let n=y.join(o(),e);return S.existsSync(y.join(n,`flow.json`))?n:t}function A(e){let t=k(e.runId),n=y.join(o(),e.runId);t!==n&&
|
|
3
|
+
`).filter(Boolean).flatMap(e=>{try{return[JSON.parse(e)]}catch{return[]}}):[]}function Fe(e,t={}){let n=e?P(e):R();return n?{...n,steps:He(n.runId,t.tail),journal:T(y.join(k(n.runId),`journal.jsonl`)).map(e=>({kind:e.kind,taskId:e.taskId,tokens:e.tokens})),events:Pe(n.runId)}:null}function E(e,t={}){let n=je(e,`No flow runs yet.`);return{record:n,events:wt(n.runId,t.bootPid,{tail:t.tail}),final(){let e=Fe(n.runId,{tail:0});if(!e)throw new v(`flow-failed`,`[flow] run ${n.runId} vanished while following.`,{hint:`Recent runs: coder flow list`});return e}}}function Ie(e){let t=P(e);if(!t)throw new v(`flow-failed`,`No flow run "${e}".`,{hint:`Recent runs: coder flow list`});if(t.status===`running`)throw new v(`flow-failed`,`Run ${t.runId} is still running.`,{runId:t.runId,hint:`Stop it first: coder flow stop ${t.runId}`});return t}function Le(e,t={}){if(t.allStopped){let e=I().filter(e=>e.status!==`running`);for(let t of e)A(t);let t=e.map(e=>e.runId);return{archived:t,count:t.length}}if(!e)throw new v(`invalid-option`,`Missing run id.`,{hint:[`Archive one: coder flow archive <run-id>`,`Archive all stopped: coder flow archive --all-stopped`]});let n=Ie(e);return A(n),{runId:n.runId,archived:!0}}function Re(e,t={}){if(t.allArchived){let e=L().filter(e=>j(e.runId)).map(e=>e.runId);return{deleted:e,count:e.length}}if(!e)throw new v(`invalid-option`,`Missing run id.`,{hint:[`Delete one: coder flow delete <run-id>`,`Delete all archived: coder flow delete --all-archived`]});let n=Ie(e);return{runId:n.runId,deleted:j(n.runId)}}function D(){return`flow-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function O(){let e=_();return t(e)}function k(e){r(e,`flow run id`);let t=y.join(O(),e);if(S.existsSync(y.join(t,`flow.json`)))return t;let n=y.join(o(),e);return S.existsSync(y.join(n,`flow.json`))?n:t}function A(e){let t=k(e.runId),n=y.join(o(),e.runId);t!==n&&ne(t,n);let r={...e,archived:!0,archivedAt:e.archivedAt??new Date().toISOString()};return F(n,r),r}function ze(e){let t=k(e.runId),n=y.join(O(),e.runId);t!==n&&ne(t,n);let r={...e,archived:void 0,archivedAt:void 0};return F(k(e.runId),r),r}function j(e){let t=k(e);return S.existsSync(y.join(t,`flow.json`))?(S.rmSync(t,{recursive:!0,force:!0}),!0):!1}function M(e){if(!i(e))return null;let t=y.join(k(e),`flow.json`);if(!S.existsSync(t))return null;try{return JSON.parse(S.readFileSync(t,`utf8`))}catch{return null}}function N(e,t=l){return e.status!==`running`||!e.pid||Q(e,t)?e:(Z(e.runId,`orchestrator died`),M(e.runId)??e)}function P(e){let t=M(e);return t?N(t):null}function F(e,t){S.writeFileSync(y.join(e,`flow.json`),`${JSON.stringify(t,null,2)}\n`,`utf8`)}function Be(e){let t=[];try{t=S.readdirSync(e)}catch{return[]}let n=[],r=f();for(let i of t)try{n.push(N(JSON.parse(S.readFileSync(y.join(e,i,`flow.json`),`utf8`)),r))}catch{}return n}const Ve=(e,t)=>String(t.startedAt).localeCompare(String(e.startedAt));function I(){return Be(O()).sort(Ve)}function L(){return Be(o()).sort(Ve)}function R(){return[...I(),...L()].sort(Ve)[0]??null}function z(e){let t=T(y.join(k(e),`journal.jsonl`));return[...new Set([...t.flatMap(e=>e.kind===`task`&&e.taskId?[e.taskId]:[]),...Pe(e).flatMap(e=>e.kind===`task-start`?[e.taskId]:[])])]}function He(e,t=`all`){if(t===0)return[];let n=T(y.join(k(e),`journal.jsonl`)).filter(e=>e.kind===`task`),r=b.cwd(),i=f(),a=z(e).flatMap(e=>{let t=u(r,e);return t?[ee(r,t,i)]:[]}),o=new Map(a.map(e=>[e.id,e])),s=e=>e?.name??e?.prompt?.replace(/\s+/g,` `).trim().slice(0,60)??null,c=n.map(e=>{let t=e.taskId?o.get(e.taskId):void 0;return{taskId:e.taskId??null,name:s(t),status:t?.status??e.result?.status??`?`,tokens:e.tokens??null}}),l=new Set(c.map(e=>e.taskId));for(let t of a)t.flowRunId===e&&!l.has(t.id)&&c.push({taskId:t.id,name:s(t),status:t.status,tokens:null});return t===`all`?c:c.slice(-t)}function Ue(e={}){let t=e.limit===`all`?void 0:e.limit,n;n=e.archived?L():I().filter(e=>e.status===`running`||c(e.endedAt??e.startedAt)<=18e5||(A(e),!1));let r=t===void 0?0:Math.max(0,n.length-t);return{runs:t===void 0?n:n.slice(0,t),clipped:r}}function B(e,t){e&&(S.appendFileSync(y.join(e.runDir,`events.jsonl`),`${JSON.stringify(t)}\n`,`utf8`),e.hooks.onEvent?.(t))}const We=globalThis,V=We.__coderFlowCtxALS??=new xe,H=We.__coderFlowScopeALS??=new xe;function Ge(){return H.getStore()?.args}function Ke(){return V.getStore()?.integrationToken}function U(){return H.getStore()?.depth??0}var qe=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 Je(e,t){if(!t.tokens)return;let n=t.model??`default`;e.ledger[n]=pe(e.ledger[n]??null,t.tokens)}function Ye(e){return!!e&&typeof e.safeParse==`function`}async function Xe(e){try{let t=await import(`./zod-BoqHoRCH.js`).then(e=>e.n);if(typeof t.toJSONSchema==`function`)return t.toJSONSchema(e)}catch{}return null}function Ze(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 W(e,t){if(!Ye(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?oe(e.name,e.permissions,n.ceiling):e.permissions,name:e.name,system:e.system,addDirs:e.addDirs,wait:!0,flowRunId:n?.runId}}function $e(e,t){return{taskId:e,status:t.status,output:t.result?.finalMessage||t.result?.error?.message||``,tokens:t.result?.tokens??null,model:t.result?.model??t.model}}async function et(e,t,n){n?.running.add(t);try{if(_())return await g(`wait`,{taskId:t});let n=await se(e,t);return{status:n.status,result:n.result,model:n.task.model??null,next:ie(e,n)??null}}finally{n?.running.delete(t)}}async function tt(e,t,n,r){let i=r?.cwd??b.cwd();if(_())await g(`steer`,{taskId:e,text:t,...n});else{let a=u(i,e);if(!a)throw new v(`invalid-option`,`No task "${e}".`);await fe(a.cwd??i,a,t,{...r?.connections?{resolveConnections:async e=>({mcp:Object.fromEntries(Object.entries(r.connections.mcp).filter(([t])=>e.includes(t))),env:r.connections.env,warnings:[]})}:{},model:n.model,effort:n.effort,permissions:r?.ceiling&&n.permissions?oe(a.name,n.permissions,r.ceiling):n.permissions})}return $e(e,await et(i,e,r))}async function nt(e,t,n,r){let i=t.cwd?y.resolve(t.cwd):n?.cwd??b.cwd(),o=t.returns&&!r?[t.system,re(null)].filter(Boolean).join(`
|
|
4
4
|
|
|
5
|
-
`):t.system,s;for(;;){let c={prompt:e,...Qe(t,i,n),system:o,...r?{outputSchema:r}:{},...s?{engine:s,model:void 0,effort:void 0}:{}},l=!!_(),f=n?.connections?ae(c.mcp,d(i).mcp,{},n.connections.mcp):void 0,ee=r=>{let o=u(i,r),s=o?a(o):void 0;B(n,{kind:`task-start`,taskId:r,name:t.name,prompt:e,engine:s,depth:U()})},p=l?await g(`dispatch`,c):await ce({...c,onWorker:ee,...n?.connections?{...f,mcpWarnings:f?.warnings,connectionEnv:n.connections.env,connections:n.connections.ids,connectionSource:`server`}:{},onFallback:e=>K(`${e.engine} failed to start. Falling back to ${e.next}. ${e.detail.replace(/\s+/g,` `).slice(0,140)}`)});l&&ee(p.taskId);let m=await et(i,p.taskId,n);if(m.next){let e=m.next;B(n,{kind:`task-end`,taskId:p.taskId,status:`failed`,tokens:null}),s=e;continue}return $e(p.taskId,m)}}async function rt(e,t,n,r=null){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 i=await nt(e,t,n,r);if(i.status!==`completed`){let e={...i,data:void 0};throw new v(`task-failed`,`Task ${i.taskId} ${i.status}: ${i.output||`no output`}`,{taskId:i.taskId,result:e})}let a=i.output,o=i.tokens,s;if(t.returns){let e;try{e=W(t.returns,Ze(a))}catch(t){e={ok:!1,errors:t instanceof Error?t.message:String(t)}}if(e.ok)s=e.data;else{let r=await tt(i.taskId,
|
|
5
|
+
`):t.system,s;for(;;){let c={prompt:e,...Qe(t,i,n),system:o,...r?{outputSchema:r}:{},...s?{engine:s,model:void 0,effort:void 0}:{}},l=!!_(),f=n?.connections?ae(c.mcp,d(i).mcp,{},n.connections.mcp):void 0,ee=r=>{let o=u(i,r),s=o?a(o):void 0;B(n,{kind:`task-start`,taskId:r,name:t.name,prompt:e,engine:s,depth:U()})},p=l?await g(`dispatch`,c):await ce({...c,onWorker:ee,...n?.connections?{...f,mcpWarnings:f?.warnings,connectionEnv:n.connections.env,connections:n.connections.ids,connectionSource:`server`}:{},onFallback:e=>K(`${e.engine} failed to start. Falling back to ${e.next}. ${e.detail.replace(/\s+/g,` `).slice(0,140)}`)});l&&ee(p.taskId);let m=await et(i,p.taskId,n);if(m.next){let e=m.next;B(n,{kind:`task-end`,taskId:p.taskId,status:`failed`,tokens:null}),s=e;continue}return $e(p.taskId,m)}}async function rt(e,t,n,r=null){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 i=await nt(e,t,n,r);if(i.status!==`completed`){let e={...i,data:void 0};throw new v(`task-failed`,`Task ${i.taskId} ${i.status}: ${i.output||`no output`}`,{taskId:i.taskId,result:e})}let a=i.output,o=i.tokens,s;if(t.returns){let e;try{e=W(t.returns,Ze(a))}catch(t){e={ok:!1,errors:t instanceof Error?t.message:String(t)}}if(e.ok)s=e.data;else{let r=await tt(i.taskId,p(e.errors),{},n);a=r.output||a,o=pe(o,r.tokens);try{let e=W(t.returns,Ze(a));if(!e.ok)throw Error(e.errors);s=e.data}catch(e){let t={taskId:i.taskId,status:`completed`,output:a,data:void 0,tokens:o,model:i.model};throw new v(`task-failed`,`Task ${i.taskId} produced no valid structured output: ${e instanceof Error?e.message:String(e)}`,{taskId:i.taskId,result:t})}}}return{taskId:i.taskId,status:`completed`,output:a,data:s,tokens:o,model:i.model}}async function it(e,t,n){let r=e.journal.replay(t);if(r)return r.result;if(++e.taskCount>e.maxTasks)throw Error(`Flow exceeded --max-tasks (${e.maxTasks}). Raise it with --max-tasks, or fix a runaway loop; the run is resumable.`);return e.semaphore.run(async()=>{let r=new Date().toISOString(),i;try{i=await n()}catch(t){let n=t instanceof v?t.result:void 0;throw n&&B(e,{kind:`task-end`,taskId:n.taskId,status:n.status===`completed`?`failed`:n.status,tokens:n.tokens}),t}return Je(e,i),e.dryRun||B(e,{kind:`task-end`,taskId:i.taskId,status:i.status,tokens:i.tokens}),e.journal.record({kind:`task`,fingerprint:t,result:i,taskId:i.taskId,tokens:i.tokens,startedAt:r,endedAt:new Date().toISOString()}),i})}async function at(e,t={}){let n=V.getStore(),r=t.returns?await Xe(t.returns):null,i=()=>rt(e,t,n,r);if(!n)return i();let{returns:a,...o}=t;return it(n,w(`task`,Se({prompt:e,...o,returns:a?r??`<schema>`:void 0})),i)}async function ot(e,t,n={}){let r=V.getStore(),i=async()=>{if(r?.dryRun)return b.stdout.write(`\n[dry-run] steer ${e}:\n${t}\n`),{taskId:e,status:`completed`,output:`[dry-run]`,tokens:null,model:n.model??null};let i=await tt(e,t,n,r);if(i.status!==`completed`)throw new v(`task-failed`,`Task ${e} ${i.status}: ${i.output||`no output`}`,{taskId:e,result:i});return i};return r?it(r,w(`steer`,Se({taskId:e,text:t,...n})),i):i()}const G=262144;function st(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 ct(e,t){return new Promise(n=>{let r=ge(e,{shell:!0,cwd:t,env:st(t)}),i=``,a=e=>{i.length>=G||(i+=e,i.length>=G&&(i=`${i.slice(0,G)}\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 lt(e,t={}){let n=V.getStore(),r=t.cwd?y.resolve(t.cwd):n?.cwd??b.cwd();if(!n)return ct(e,r);let i=w(`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}-${ye()}`,c=U();B(n,{kind:`gate-start`,gateId:s,cmd:e,depth:c});let l=await ct(e,r);return B(n,{kind:`gate`,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 ut(e,...t){return Promise.all(e.map(async(e,n)=>{let r=e;for(let[i,a]of t.entries())try{r=await a(r,e,n)}catch(e){return K(`stage ${i+1} failed: ${e instanceof Error?e.message:String(e)}`),null}return r}))}function K(e){let t=V.getStore();B(t,{kind:`log`,message:e,depth:U()}),(!t||b.stderr.isTTY&&!t.hooks.onEvent)&&b.stderr.write(`[flow] ${e}\n`)}const dt=me(import.meta.url);function q(e){let t=y.dirname(he(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 ft(e){if(e===`zod`||e.startsWith(`zod/`)){let e=q(`zod.js`)??new URL(`./zod.js`,import.meta.url).href;if(S.existsSync(he(e)))return e}if(!(e===`@wular/coder`||e===`@wular/coder/flow`||e===`zod`||e.startsWith(`zod/`)))return null;try{return x(dt.resolve(e)).href}catch{}return e===`@wular/coder/flow`?q(`flow/index.js`):e===`@wular/coder`?q(`sdk.js`):null}const pt=/(\bfrom\s+|\bimport\s+|\bimport\s*\(\s*)(['"])([^'"]+)\2/g;function mt(e){return e.replace(pt,(e,t,n,r)=>{let i=ft(r);return i?`${t}${n}${i}${n}`:e})}async function ht(e){e=S.realpathSync(e);let t=H.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:mt(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=ft(e);return t?[[e,t]]:[]})),a=`const urls = ${JSON.stringify(i)}, parent = ${JSON.stringify(import.meta.url)};
|
|
6
6
|
export function resolve(spec, ctx, next) {
|
|
7
7
|
if (spec.startsWith('zod/') && urls.zod) return { url: urls.zod, shortCircuit: true };
|
|
8
8
|
if (urls[spec]) return { url: urls[spec], shortCircuit: true };
|
|
9
9
|
return next(spec, spec.startsWith('zod/') ? { ...ctx, parentURL: parent } : ctx);
|
|
10
|
-
}`;r(`data:text/javascript,${encodeURIComponent(a)}`)}async function gt(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 _t(e){if(!S.existsSync(e))throw Error(`Cannot read flow file: ${e}`);return await ht(y.dirname(e)),gt(e,y.extname(e),e)}async function J(e,t,n){let r=H.getStore();r.args=t??{};let i=await _t(e),a=V.getStore();a?.flowConcurrency&&!r.depth&&typeof i.concurrency==`number`&&(a.semaphore.limit=Math.max(1,i.concurrency),n&&(n.concurrency=a.semaphore.limit,F(a.runDir,n)));let o=i.args,s=r.args;if(Ye(o)){let e=W(o,t??{});if(!e.ok)throw Error(`Invalid flow args: ${e.errors}`);s=e.data,r.args=s}let c=i.default;return typeof c==`function`?c(s):c}async function vt(e,t){let n=V.getStore(),r=n?.cwd??b.cwd(),i=s(e,r);if(!n)return H.run({args:t??{},depth:0},()=>J(i.path,t));let a=H.getStore();if(a&&a.depth>=1)throw Error(`flow("${e}") nesting is one level deep; a sub-flow cannot call flow().`);let o=w(`flow`,{name:i.name,args:t??{}}),c=n.journal.replay(o);if(c)return c.result;let l=new Date().toISOString();B(n,{kind:`flow-start`,name:i.name,depth:(a?.depth??0)+1});let u=await H.run({args:t??{},depth:(a?.depth??0)+1,imports:a?.imports},()=>J(i.path,t));return n.journal.record({kind:`flow`,fingerprint:o,result:u,startedAt:l,endedAt:new Date().toISOString()}),u}var yt=e({drivePreparedRun:()=>kt,markRunFailed:()=>Z,orchestratorAlive:()=>Q,pidAlive:()=>bt,prepareRun:()=>Y,resumeFlow:()=>Ot,review:()=>At,runFlowByName:()=>$,stopFlowTasks:()=>St,stopRun:()=>Ct,streamFlowCore:()=>wt});function Y(e,t={},n,r){let i,a,o;if(n){let e=P(n);if(!e)throw Error(`No flow run "${n}".`);e.archived&&ze(e),i=e.name,a=e.script,o=t.args??e.args}else{let n=s(e,t.cwd?y.resolve(t.cwd):b.cwd());i=n.name,a=n.path,o=t.args??{}}let c=n??t.runId??D(),l=k(c);S.mkdirSync(l,{recursive:!0});let u={runId:c,name:i,script:a,args:o,status:`running`,startedAt:new Date().toISOString(),concurrency:Math.max(1,t.concurrency??be.cpus().length),maxTasks:Math.max(1,t.maxTasks??be.cpus().length*10),taskCount:0,ledger:{},...r?{pid:r,pidStartedAt:new Date().toISOString()}:{},...t.concurrency===void 0?{}:{concurrencySet:!0}};return F(l,u),u}function X(e,t,n){F(e,{...t,endedAt:new Date().toISOString(),pid:void 0,pidStartedAt:void 0,...n})}function Z(e,t){let n=M(e);!n||n.status!==`running`||X(k(e),n,{status:`failed`,error:t})}function bt(e){try{return b.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function Q(e,t=l){if(!e.pid||!bt(e.pid))return!1;let n=t(e.pid),r=Date.parse(e.pidStartedAt??``);return n===null||!Number.isFinite(r)||n<=r+6e4}function xt(e){return z(e).filter(e=>{let t=u(b.cwd(),e);return t&&!h.includes(t.status)})}async function St(e,t=[]){let n=b.cwd(),r=[];for(let i of new Set([...xt(e),...t])){let e=u(n,i);if(!(!e||h.includes(e.status)))try{await de(n,e),r.push(i)}catch{}}return r}async function Ct(e,t={}){let n=e?P(e):R();if(!n)throw new v(`flow-failed`,e?`No flow run "${e}".`:`No flow runs.`,{hint:`Run one: coder flow run <name>`});if(n.status!==`running`)throw new v(`flow-failed`,`Run ${n.runId} is not running.`,{runId:n.runId,hint:`Result: coder flow result ${n.runId}`});let r=k(n.runId);if(!Q(n))return X(r,n,{status:`failed`,error:`orchestrator died`}),{runId:n.runId,status:`failed`,stoppedTasks:[],keptTasks:xt(n.runId)};let i=xt(n.runId),a=
|
|
11
|
-
`).length-1-a)}catch{}let s=
|
|
10
|
+
}`;r(`data:text/javascript,${encodeURIComponent(a)}`)}async function gt(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 _t(e){if(!S.existsSync(e))throw Error(`Cannot read flow file: ${e}`);return await ht(y.dirname(e)),gt(e,y.extname(e),e)}async function J(e,t,n){let r=H.getStore();r.args=t??{};let i=await _t(e),a=V.getStore();a?.flowConcurrency&&!r.depth&&typeof i.concurrency==`number`&&(a.semaphore.limit=Math.max(1,i.concurrency),n&&(n.concurrency=a.semaphore.limit,F(a.runDir,n)));let o=i.args,s=r.args;if(Ye(o)){let e=W(o,t??{});if(!e.ok)throw Error(`Invalid flow args: ${e.errors}`);s=e.data,r.args=s}let c=i.default;return typeof c==`function`?c(s):c}async function vt(e,t){let n=V.getStore(),r=n?.cwd??b.cwd(),i=s(e,r);if(!n)return H.run({args:t??{},depth:0},()=>J(i.path,t));let a=H.getStore();if(a&&a.depth>=1)throw Error(`flow("${e}") nesting is one level deep; a sub-flow cannot call flow().`);let o=w(`flow`,{name:i.name,args:t??{}}),c=n.journal.replay(o);if(c)return c.result;let l=new Date().toISOString();B(n,{kind:`flow-start`,name:i.name,depth:(a?.depth??0)+1});let u=await H.run({args:t??{},depth:(a?.depth??0)+1,imports:a?.imports},()=>J(i.path,t));return n.journal.record({kind:`flow`,fingerprint:o,result:u,startedAt:l,endedAt:new Date().toISOString()}),u}var yt=e({drivePreparedRun:()=>kt,markRunFailed:()=>Z,orchestratorAlive:()=>Q,pidAlive:()=>bt,prepareRun:()=>Y,resumeFlow:()=>Ot,review:()=>At,runFlowByName:()=>$,stopFlowTasks:()=>St,stopRun:()=>Ct,streamFlowCore:()=>wt});function Y(e,t={},n,r){let i,a,o;if(n){let e=P(n);if(!e)throw Error(`No flow run "${n}".`);e.archived&&ze(e),i=e.name,a=e.script,o=t.args??e.args}else{let n=s(e,t.cwd?y.resolve(t.cwd):b.cwd());i=n.name,a=n.path,o=t.args??{}}let c=n??t.runId??D(),l=k(c);S.mkdirSync(l,{recursive:!0});let u={runId:c,name:i,script:a,args:o,status:`running`,startedAt:new Date().toISOString(),concurrency:Math.max(1,t.concurrency??be.cpus().length),maxTasks:Math.max(1,t.maxTasks??be.cpus().length*10),taskCount:0,ledger:{},...r?{pid:r,pidStartedAt:new Date().toISOString()}:{},...t.concurrency===void 0?{}:{concurrencySet:!0}};return F(l,u),u}function X(e,t,n){F(e,{...t,endedAt:new Date().toISOString(),pid:void 0,pidStartedAt:void 0,...n})}function Z(e,t){let n=M(e);!n||n.status!==`running`||X(k(e),n,{status:`failed`,error:t})}function bt(e){try{return b.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function Q(e,t=l){if(!e.pid||!bt(e.pid))return!1;let n=t(e.pid),r=Date.parse(e.pidStartedAt??``);return n===null||!Number.isFinite(r)||n<=r+6e4}function xt(e){return z(e).filter(e=>{let t=u(b.cwd(),e);return t&&!h.includes(t.status)})}async function St(e,t=[]){let n=b.cwd(),r=[];for(let i of new Set([...xt(e),...t])){let e=u(n,i);if(!(!e||h.includes(e.status)))try{await de(n,e),r.push(i)}catch{}}return r}async function Ct(e,t={}){let n=e?P(e):R();if(!n)throw new v(`flow-failed`,e?`No flow run "${e}".`:`No flow runs.`,{hint:`Run one: coder flow run <name>`});if(n.status!==`running`)throw new v(`flow-failed`,`Run ${n.runId} is not running.`,{runId:n.runId,hint:`Result: coder flow result ${n.runId}`});let r=k(n.runId);if(!Q(n))return X(r,n,{status:`failed`,error:`orchestrator died`}),{runId:n.runId,status:`failed`,stoppedTasks:[],keptTasks:xt(n.runId)};let i=xt(n.runId),a=m(r);try{b.kill(n.pid,t.keepTasks?`SIGTERM`:`SIGINT`)}catch(e){throw a.close(),e}let o=await a.until(()=>{let e=M(n.runId);return e?.status===`running`?void 0:e},5e3);if(!o||o.status===`running`)throw new v(`flow-failed`,`Run ${n.runId} did not stop within 5s.`,{runId:n.runId,hint:`Check it: coder flow result ${n.runId}`});let s=b.cwd(),c=[],l=[];for(let e of i){let t=u(s,e);t&&(t.status===`cancelled`?c.push(e):h.includes(t.status)||l.push(e))}return{runId:n.runId,status:o.status,stoppedTasks:c,keptTasks:l}}async function*wt(e,t,n={}){let r=m(k(e));try{let i=y.join(k(e),`events.jsonl`),a=n.tail??`all`,o=0;if(a!==`all`)try{o=Math.max(0,S.readFileSync(i,`utf8`).split(`
|
|
11
|
+
`).length-1-a)}catch{}let s=te(i),c=()=>{let e=[];for(let t of s()){if(o>0){--o;continue}try{e.push(JSON.parse(t))}catch{}}return e},l=f(),u=M(e);for(;(!u||u.status===`running`)&&(yield*c(),u=M(e)??u,!(u&&u.status!==`running`));){let n=u?.pid?!Q(u,l):t!==void 0&&!bt(t);if(u&&(u.pid||t!==void 0)&&n){Z(e,`orchestrator died`);break}await r.wait(1e3)}yield*c()}finally{r.close()}}function Tt(e,t,n,r,i){let a=i?{...i,pid:b.pid,pidStartedAt:new Date().toISOString()}:Y(e,t,r,b.pid),{runId:o}=a,s=k(o);i&&F(s,a),S.writeFileSync(y.join(s,`events.jsonl`),``,`utf8`);let c=y.join(s,`journal.jsonl`),l=r?T(c):[],u=new Ce(l,c),d={runId:o,runDir:s,cwd:t.cwd?y.resolve(t.cwd):b.cwd(),journal:u,semaphore:new qe(a.concurrency),flowConcurrency:t.concurrency===void 0,maxTasks:a.maxTasks,dryRun:t.dryRun??!1,ledger:{},running:new Set,taskCount:0,stopping:!1,hooks:n,...t.integrationToken?{integrationToken:t.integrationToken}:{},...t.connections?{connections:t.connections}:{},...t.ceiling?{ceiling:t.ceiling}:{}};return{record:a,ctx:d,markStopped:()=>{d.stopping=!0,X(s,a,{status:`stopped`,concurrency:d.semaphore.limit,taskCount:d.taskCount,ledger:d.ledger})},replayable:l.length}}async function Et(e){let{ctx:t,record:n}=e,{runDir:r,runId:i}=t,{script:a,name:o,args:s}=n;try{let e=await V.run(t,()=>H.run({args:s??{},depth:0},()=>J(a,s,n)));return X(r,n,{status:`completed`,concurrency:t.semaphore.limit,taskCount:t.taskCount,ledger:t.ledger,result:e}),{runId:i,name:o,status:`completed`,result:e,tokens:t.ledger,taskCount:t.taskCount}}catch(e){throw t.stopping||X(r,n,{status:`failed`,concurrency:t.semaphore.limit,taskCount:t.taskCount,ledger:t.ledger,error:e instanceof Error?e.message:String(e)}),e instanceof v&&(e.code===`chain-exhausted`||e.code===`approval-pending`)?(e.runId??=i,e):new v(`flow-failed`,e instanceof Error?e.message:String(e),{runId:i})}}async function Dt(e,t,n,r,i){let a=Tt(e,t,n,r,i);return n.onStart?.({runId:a.ctx.runId,requestStop:a.markStopped,runningIds:()=>[...a.ctx.running]}),a.replayable&&B(a.ctx,{kind:`replay`,count:a.replayable}),Et(a)}function $(e,t={},n={}){return Dt(e,t,n)}function Ot(e,t={},n={}){return Dt(``,t,n,e)}function kt(e,t,n){return Dt(``,{cwd:t,concurrency:e.concurrencySet?e.concurrency:void 0,maxTasks:e.maxTasks},n,e.runId,e)}const At={async run(e={}){let t=await $(`review`,{cwd:e.cwd,args:e});return{...t.result,runId:t.runId}}};export{Me as C,we as S,Oe as _,Ct as a,Ne as b,vt as c,ut as d,ot as f,Re as g,Ue as h,St as i,lt as l,Le as m,At as n,Ke as o,at as p,$ as r,Ge as s,yt as t,K as u,D as v,E as w,Fe as x,P as y};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { C as repositoryRules, D as reviewFingerprints, E as reviewCli, S as postReview, T as review, _ as description, a as ReviewExec, b as ownReviewComments, c as ReviewPostSummary, d as ReviewSummary, f as ReviewTarget, g as concurrency, h as changedLines, i as ReviewAuth, l as ReviewResult, m as args, n as REVIEW_PLATFORM, o as ReviewPostFinding, p as ReviewTargetInput, r as ReviewArgs, s as ReviewPostInput, t as Finding, u as ReviewServices, v as fingerprint, w as resolveReviewTarget, x as parseGithubPr, y as lastReviewSummary } from "../../review-
|
|
1
|
+
import { C as repositoryRules, D as reviewFingerprints, E as reviewCli, S as postReview, T as review, _ as description, a as ReviewExec, b as ownReviewComments, c as ReviewPostSummary, d as ReviewSummary, f as ReviewTarget, g as concurrency, h as changedLines, i as ReviewAuth, l as ReviewResult, m as args, n as REVIEW_PLATFORM, o as ReviewPostFinding, p as ReviewTargetInput, r as ReviewArgs, s as ReviewPostInput, t as Finding, u as ReviewServices, v as fingerprint, w as resolveReviewTarget, x as parseGithubPr, y as lastReviewSummary } from "../../review-Dxs-idTn.js";
|
|
2
2
|
export { Finding, REVIEW_PLATFORM, ReviewArgs, ReviewAuth, ReviewExec, ReviewPostFinding, ReviewPostInput, ReviewPostSummary, ReviewResult, ReviewServices, ReviewSummary, ReviewTarget, ReviewTargetInput, args, changedLines, concurrency, review as default, description, fingerprint, lastReviewSummary, ownReviewComments, parseGithubPr, postReview, repositoryRules, resolveReviewTarget, reviewCli, reviewFingerprints };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{h as e,m as t}from"../../prompts-
|
|
1
|
+
import{h as e,m as t}from"../../prompts-Bj4Fbd_n.js";import{L as n,R as r}from"../../dispatch-CFZ9Crvg.js";import{o as i}from"../../executor-3QMa-XRY.js";import{Ft as a,Gn as o,Kn as s,Nn as c,Ot as l,Pn as u,ir as d,zt as f}from"../../zod-BoqHoRCH.js";import p from"node:path";import{existsSync as m,readFileSync as h,realpathSync as g}from"node:fs";import{execFileSync as _}from"node:child_process";import{createHash as v}from"node:crypto";import{CoderError as y,task as b}from"@wular/coder/flow";const x=`Review a code change.`,S=u({pr:d([c(),s()]).optional(),base:s().optional(),head:s().optional(),since:s().optional(),post:f().optional(),author:s().optional(),path:a(s()).optional(),exclude:a(s()).optional(),engine:s().optional(),model:s().optional(),effort:l([`low`,`medium`,`high`]).optional(),cwd:s().optional()}),C=4,w=l([`critical`,`major`,`minor`,`nit`]),T=l([`correctness`,`security`,`reliability`,`performance`,`maintainability`,`testing`,`documentation`]),ee=o({file:s(),line:c().int().positive(),severity:w,category:T,summary:s(),failure_scenario:s()}),E={critical:0,major:1,minor:2,nit:3};function D(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 O(e,t,n){return v(`sha1`).update(`${e}\n${n}\n${t.trim()}`).digest(`hex`)}function k(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 A(e,t){return[`AGENTS.md`,`CLAUDE.md`,`.coder/review.md`].flatMap(n=>{let r=k(e,t,n);return r?.trim()?[[n,r]]:[]})}function j(e){for(let t of[[`symbolic-ref`,`--short`,`refs/remotes/origin/HEAD`],[`rev-parse`,`--verify`,`origin/main`],[`rev-parse`,`--verify`,`origin/master`]])try{let n=e(`git`,t).trim();return e(`git`,[`merge-base`,`HEAD`,t[0]===`symbolic-ref`?n:t[2]]).trim()}catch{}throw new y(`invalid-option`,`Could not detect origin default branch; pass base.`)}async function te(e,t,r,i){if(t.pr===void 0){let n=e(`git`,[`rev-parse`,t.head??`HEAD`]).trim();return{baseSha:t.base?e(`git`,[`rev-parse`,t.base]).trim():j(e),headSha:n,...t.since?{since:t.since}:{}}}let a={pr:t.pr,cwd:r,...t.since?{since:t.since}:{},...t.author?{author:t.author}:{}};return ne(i)?n(`review`,{op:`resolveTarget`,input:a}):X(a,i)}function ne(e){return!!r()&&!e.token&&!e.exec}const M=e=>[`--`,...e.include.map(e=>`:(top)${e}`),...e.exclude.map(e=>`:(top,exclude)${e}`)];function N(e,t){return!t||e.startsWith(t)?e.slice(t.length):!e||t.startsWith(`${e}/`)?``:void 0}function re(e,t,n,r){let i=new Map;for(let a of e(n,[`ls-files`,`--others`,`--exclude-standard`,`--full-name`,`-z`,...M(n)]).split(`\0`)){if(a.endsWith(`/`)){r.push(`Skipped ${n.prefix}${a.slice(0,-1)} because it is a nested repository, not a submodule.`);continue}let e=``;try{a&&(e=h(p.join(t,n.prefix,a),`utf8`))}catch{}let o=e?e.split(`
|
|
3
3
|
`).length-+!!e.endsWith(`
|
|
4
4
|
`):0;o&&i.set(a,[[1,o]])}return i}const P=(e,t,n)=>D(e(t,[`diff`,`--no-ext-diff`,`--find-renames`,`--ignore-submodules=all`,`-U0`,t.head?`${n}..${t.head}`:n,...M(t)]));function F(e,t,n,r,i){let a=e(n,[`diff`,`--raw`,`-z`,`--no-abbrev`,`--no-renames`,`--ignore-submodules=none`,n.head?`${n.base}..${n.head}`:n.base]).split(`\0`),o=[];for(let s=0;s+1<a.length;s+=2){let[c,l,u,d]=a[s].slice(1).split(` `),f=`${n.prefix}${a[s+1]}`,h=r(`${f}/`);if(l!==`160000`||!h)continue;if(!m(p.join(t,f,`.git`))){i.push(`Skipped submodule ${f} because it is not initialized.`);continue}let g={prefix:`${f}/`,base:``,...h},_=()=>e(g,[`hash-object`,`-t`,`tree`,`--stdin`],``).trim(),v=t=>e(n,[`ls-tree`,`--full-tree`,t,a[s+1]]).match(/^160000 commit (\S+)/)?.[1],y={...g,base:c===`160000`?u:_(),...n.head?{head:d}:{},...n.since?{since:v(n.since)??_()}:{}},b=[y.base,y.head,y.since].find(t=>{if(!t)return!1;try{return e(y,[`cat-file`,`-e`,`${t}^{tree}`]),!1}catch{return!0}});b?i.push(`Skipped submodule ${f} because commit ${b} is not fetched.`):o.push(y,...F(e,t,y,r,i))}return o}async function I(r,s={}){if(r.pr!==void 0&&(r.base||r.head))throw new y(`invalid-option`,`pr cannot be combined with base or head.`);if(r.post&&r.pr===void 0)throw new y(`invalid-option`,`post requires pr.`);let c=Date.now(),l=p.resolve(r.cwd??process.cwd()),u=s.exec??B(l),d=s.integrationToken??i(),f={...d?{token:d}:{},...s.exec?{exec:s.exec}:{}},{pr:m,baseSha:_,headSha:v,since:x}=await te(u,r,l,f),S=r.pr===void 0&&!r.head,C=g(u(`git`,[`rev-parse`,`--show-toplevel`]).trim()),w=(e,t,n)=>u(`git`,e.prefix?[`-C`,p.join(C,e.prefix),...t]:t,n),T=g(l),D=e=>p.relative(C,p.resolve(T,e)).split(p.sep).join(`/`),k=(r.path??[]).map(D),j=(r.exclude??[]).map(D),I=e=>{let t=(k.length?k:[``]).map(t=>N(t,e)).filter(e=>e!==void 0),n=j.map(t=>N(t,e));if(!(!t.length||n.includes(``)))return{include:t,exclude:n.filter(e=>e!==void 0)}},L=I(``);if(!L)throw new y(`invalid-option`,`exclude leaves nothing to review.`);let R=[],z={prefix:``,base:_,...S?{}:{head:v},...x?{since:x}:{},...L},V=[z,...F(w,C,z,I,R)],H=new Map,U=new Map,W=new Set;for(let e of V){let t=S?re(w,C,e,R):new Map,n=t=>{try{return w(e,[`show`,`${e.since}:${t}`])!==h(p.join(C,e.prefix,t),`utf8`)}catch{return!0}};for(let[n,r]of[...P(w,e,e.base),...t])H.set(e.prefix+n,r);if(e.since)for(let[r,i]of[...P(w,e,e.since),...[...t].filter(([e])=>n(e))])U.set(e.prefix+r,i);for(let n of t.keys())W.add(e.prefix+n)}let G=H;if(x){let e=(e,t)=>t.some(([t,n])=>e[0]<=n&&e[1]>=t);G=new Map([...U].map(([t,n])=>[t,n.filter(n=>e(n,H.get(t)??[]))]).filter(([,e])=>e.length))}if(S&&!G.size)return{findings:[],summary:{baseSha:_,headSha:v,worktree:S,files:0,model:null,elapsedMs:Date.now()-c,...R.length?{warnings:R}:{}}};let K=r.effort??`medium`,q={engine:r.engine,model:r.model,effort:r.effort,permissions:`read-only`,cwd:l,system:e(K,A(u,_))},J=[...G].map(([e,t])=>`- ${e} (${W.has(e)?`untracked, `:``}lines ${t.map(([e,t])=>e===t?e:`${e}-${t}`).join(`, `)})`).join(`
|
package/dist/flow/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { $ as FlowTaskResult, G as steer, H as gate, J as FlowEvent, K as task, M as CoderError, O as args, Q as FlowTaskOptions, U as log, V as flow, W as pipeline, X as FlowSteerOptions, Z as FlowStep, et as GateResult, k as flowSdk } from "../review-
|
|
1
|
+
import { $ as FlowTaskResult, G as steer, H as gate, J as FlowEvent, K as task, M as CoderError, O as args, Q as FlowTaskOptions, U as log, V as flow, W as pipeline, X as FlowSteerOptions, Z as FlowStep, et as GateResult, k as flowSdk } from "../review-Dxs-idTn.js";
|
|
2
2
|
export { CoderError, type FlowEvent, type FlowSteerOptions, type FlowStep, type FlowTaskOptions, type FlowTaskResult, type GateResult, args, flowSdk as default, flowSdk, flow, gate, log, pipeline, steer, task };
|
package/dist/flow/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{y as e}from"../prompts-
|
|
1
|
+
import{y as e}from"../prompts-Bj4Fbd_n.js";import{U as t}from"../dispatch-CFZ9Crvg.js";import{C as n,a as r,b as i,c as a,d as o,f as s,g as c,h as l,l as u,m as d,p as f,s as p,u as m,w as h,x as g}from"../executor-3QMa-XRY.js";const _=new Proxy({},{get(e,t){return p()?.[t]},has(e,t){let n=p();return n!=null&&t in Object(n)},ownKeys(){let e=p();return e?Reflect.ownKeys(Object(e)):[]},getOwnPropertyDescriptor(e,t){let n=p();if(n!=null&&t in Object(n))return{enumerable:!0,configurable:!0,value:n[t]}}}),v={run(e,t={}){return n(e,t)},list(e={}){return l(e).runs},discover(t){return e(t??process.cwd())},result(e,t={}){return g(e,t)},stream(e,t={}){return h(e,t).events},stop(e,t={}){return r(e,t)},resume(e,t={}){return i(e,t)},archive:d,delete:c};export{t as CoderError,_ as args,v as default,v as flowSdk,a as flow,u as gate,m as log,o as pipeline,s as steer,f as task};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as e}from"./cli-
|
|
1
|
+
import{s as e}from"./cli-BBlH53hA.js";const t=e(`flow`,{drive:async()=>(await import(`./drive-BqunNi9n.js`)).commandDrive,run:async()=>(await import(`./run-DjTTb8oA.js`)).commandRun,list:async()=>(await import(`./list-BlOB32n6.js`)).commandList,ls:async()=>(await import(`./list-BlOB32n6.js`)).commandList,discover:async()=>(await import(`./discover-CyIfIBGD.js`)).commandDiscover,result:async()=>(await import(`./result-BesDQ-b1.js`)).commandResult,watch:async()=>(await import(`./watch-BiyN4NxE.js`)).commandWatch,stream:async()=>(await import(`./watch-BiyN4NxE.js`)).commandWatch,stop:async()=>(await import(`./stop-D8G7AtdY.js`)).commandStop,resume:async()=>(await import(`./resume-2Y0uC5MM.js`)).commandResume,archive:async()=>(await import(`./archive-H2B7Me8E.js`)).commandArchive,delete:async()=>(await import(`./delete-UyzcQPoG.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{C as e,
|
|
1
|
+
import{C as e,gn as t,lr as n,nn as r,pr as i}from"./prompts-Bj4Fbd_n.js";import a from"node:path";import o from"node:fs";import s from"node:readline";const c=/^[A-Za-z0-9-]{1,128}$/;function l(e){return[...new Set([...e.previousThreadIds??[],...e.threadId?[e.threadId]:[]])]}async function u(s,c){if(!/^[a-zA-Z0-9_-]+$/.test(c))return[];let l=s.engine===`claude`,u=l?e():t(),d=s.id?a.join(r(s.cwd??``,s.id),`history-files.json`):void 0,f=JSON.stringify([s.engine,u,c]),p=d?n(d)??{}:{},m=p[f];if(m?.length&&m.every(e=>e.startsWith(`${u}${a.sep}`)&&o.existsSync(e)))return m;let h=[],g=async(e,t)=>{for(let n of await o.promises.readdir(e,{withFileTypes:!0}).catch(()=>[])){let r=a.join(e,n.name);n.isDirectory()&&t?await g(r,t-1):n.isFile()&&(l?n.name===`${c}.jsonl`:n.name.endsWith(`-${c}.jsonl`))&&h.push(r)}};return l?await g(u,1):(await g(a.join(u,`sessions`),3),await g(a.join(u,`archived_sessions`),0)),d&&h.length&&i(d,{...p,[f]:h}),h}function d(e,t){let n=t?e.message:e.type===`response_item`?e.payload:void 0;if(!n||!t&&n.type===`reasoning`)return;let r=n.content,i=Array.isArray(r)?r:[],a=n.role??(n.type?.endsWith(`_output`)?`tool`:`assistant`),o=i.filter(e=>e.type===`tool_use`).map(e=>String(e.id)),s=i.filter(e=>e.type===`tool_result`).map(e=>String(e.tool_use_id));[`function_call`,`custom_tool_call`].includes(n.type)&&o.push(String(n.call_id)),[`function_call_output`,`custom_tool_call_output`].includes(n.type)&&s.push(String(n.call_id));let c=typeof r==`string`?r:i.length?i.map(e=>typeof e.text==`string`?e.text:JSON.stringify(e)).join(`
|
|
2
2
|
`):JSON.stringify(n);return{speaker:s.length&&!o.length?`tool`:a,time:String(e.timestamp??``),text:c,calls:o,results:s,startsExchange:a===`user`&&!s.length,reply:a===`assistant`&&(t?i.some(e=>e.type===`text`)||typeof r==`string`:n.type===`message`)}}async function*f(e,t){for(let n of await u(e,t)){let t=o.createReadStream(n,{encoding:`utf8`}),r=s.createInterface({input:t,crlfDelay:1/0});try{for await(let t of r){let n;try{n=JSON.parse(t)}catch{continue}let r=d(n,e.engine===`claude`);r&&(yield r)}}finally{r.close(),t.destroy()}}}async function p(e,{exchanges:t=6,maxBytes:n=2e4}={}){if(!e.threadId)return{text:``,exchanges:0};let r=[],i=``,a=0,o=!1,s=new Set,c=()=>{if(a>n)r.length=0;else if(i&&o&&!s.size)for(r.push(i);r.length>t||Buffer.byteLength(r.join(`
|
|
3
3
|
|
|
4
4
|
`))>n;)r.shift();i=``,a=0,o=!1,s.clear()};for await(let t of f(e,e.threadId)){if(t.startsExchange&&!s.size&&c(),!i&&!t.startsExchange)continue;for(let e of t.calls)s.add(e);for(let e of t.results)s.delete(e);t.reply&&(o=!0);let e=`[${t.time}] ${t.speaker}\n${t.text}`;a+=Buffer.byteLength(e)+2,a<=n?i+=`${i?`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{An as e}from"./prompts-
|
|
1
|
+
import{An as e}from"./prompts-Bj4Fbd_n.js";import{t}from"./integrations-IGnXBrPw.js";import{a as n,i as r,l as i,s as a}from"./task-bkoi8_NN.js";import o from"node:path";import s from"node:process";import c from"node:fs";import{execFile as l,spawn as u}from"node:child_process";import d from"node:fs/promises";import{promisify as f}from"node:util";import{Readable as p}from"node:stream";import{pipeline as m}from"node:stream/promises";const h=e=>Buffer.from(JSON.stringify(e)).toString(`base64url`),g=e=>JSON.parse(Buffer.from(e,`base64url`).toString(`utf8`)),_=f(l);async function v(e){if(s.platform===`linux`){let t=await d.readFile(`/proc/${e}/stat`,`utf8`).catch(()=>``);return t.slice(t.lastIndexOf(`)`)+2).split(` `)[19]}return(await _(`ps`,[`-p`,String(e),`-o`,`lstart=`]).catch(()=>void 0))?.stdout.trim()||void 0}function y(e){let t=g(e);if(!Number.isInteger(t.pid)||typeof t.dir!=`string`||typeof t.started!=`string`)throw Error(`Invalid local runner handle`);return t}var b=class{workDir;kind=`local`;children=new Map;constructor(e){this.workDir=e}async start(t,i){await d.mkdir(this.workDir,{recursive:!0});let l=await d.mkdtemp(o.join(this.workDir,`task-`)),f=t.runner===`local`?r(t):void 0,p=c.openSync(o.join(l,`runner.log`),`a`);await d.mkdir(o.join(l,`bin`)),await d.writeFile(o.join(l,`bin/coder`),`#!/bin/sh\nexec "${s.execPath}" "${e}" "$@"\n`,{mode:493});let m=u(s.execPath,[e,`agent`,`run`,`--task`,t.id],{cwd:l,detached:!0,env:{PATH:[o.join(l,`bin`),s.env.PATH??``].join(o.delimiter),HOME:s.env.HOME??``,TMPDIR:s.env.TMPDIR??``,...s.env.CODER_HOME?{CODER_HOME:s.env.CODER_HOME}:{},...i,...f?{CODER_CHECKOUT_CACHE:f}:{},CODER_INBOX_SOCKET:n(l)},stdio:[`ignore`,p,p]});await new Promise((e,t)=>{m.once(`spawn`,e),m.once(`error`,t)}),c.closeSync(p);let g={child:m};this.children.set(m.pid,g),m.once(`close`,e=>{g.code=e,a(o.join(l,`repo`)).catch(e=>console.error(`coder runner: checkout cleanup failed`,e))}),m.unref();let _=await v(m.pid);if(!_)throw Error(`Could not identify the local runner process`);return h({pid:m.pid,dir:l,started:_})}async status(e){let{pid:t,dir:n,started:r}=y(e),i=this.children.get(t);if(i?.code===void 0)try{if(s.kill(t,0),await v(t)===r)return{state:`running`}}catch{}return await a(o.join(n,`repo`)),{state:`exited`,...i?.code==null?{}:{code:i.code}}}async stop(e){let{pid:t,started:n}=y(e);if(await v(t)===n)try{s.kill(-t,`SIGTERM`)}catch{try{s.kill(t,`SIGTERM`)}catch{}}}async push(e,t){let{pid:r,dir:a,started:o}=y(e);if(await v(r)!==o)throw Error(`The task process exited`);return i(n(a),t)}};function x(e,t,n={}){return new Promise((r,i)=>{let a=u(e,t,{env:n,stdio:[`ignore`,`pipe`,`pipe`]}),o=``,s=``;a.stdout.on(`data`,e=>o+=String(e)),a.stderr.on(`data`,e=>s+=String(e)),a.once(`error`,i),a.once(`close`,e=>r({code:e,stdout:o,stderr:s}))})}function S(){return Object.values(t).flatMap(e=>e.tools.install?[`(${e.tools.install})`]:[])}function C(e,t=200,n={}){return new Response(JSON.stringify(e),{status:t,headers:{"content-type":`application/json`,...n}})}const w=e=>e.searchParams.has(`cursor`);function T(e){if(e)try{return g(e)}catch{return}}const E=e=>T(e.searchParams.get(`cursor`));function D(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 O(e,t,n){let r=e.slice(0,t);return{items:r,...e.length>t?{next:h(n(r.at(-1)))}:{}}}const k=(e,t=302)=>new Response(null,{status:t,headers:{location:e}}),A=()=>new Response(`Forbidden`,{status:403}),j=()=>new Response(`Not found`,{status:404,headers:{"content-type":`text/plain; charset=utf-8`}}),M=()=>new Response(`Method not allowed`,{status:405}),N=e=>k(`/login?return=${encodeURIComponent(`${e.pathname}${e.search}`)}`),P=e=>e.startsWith(`/api/auth`)?65536:/\/tasks\/[^/]+\/history$/.test(e)?4194304:1048576;async function F(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 I(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}function L(e,t){let n=e.url??`/`,r=e.method===`GET`||e.method===`HEAD`?void 0:p.toWeb(e);return new Request(`http://${e.headers.host??`localhost`}${n}`,{method:e.method,headers:I(e.headers),body:r,duplex:`half`,signal:t})}function R(e,{admit:t=()=>!0}={}){return async(n,r)=>{if(!t(n))return void r.writeHead(404).end(`Not found`);let i=new AbortController,a=()=>{n.socket.destroyed&&i.abort()};r.once(`close`,()=>i.abort()),a();try{let t=await e(L(n,i.signal),n.socket.remoteAddress?.replace(/^::ffff:/,``));a();let o=Object.fromEntries(t.headers.entries()),s=t.headers.getSetCookie();s.length&&(o[`set-cookie`]=s),r.writeHead(t.status,o),t.body?await m(p.fromWeb(t.body),r).catch(()=>{}):r.end()}catch(e){if(r.headersSent)return void r.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`;r.writeHead(t?Number(e.status):500,{"content-type":`application/json`}),r.end(JSON.stringify({error:n}))}}}async function z(e,t){if(e.method===`GET`||e.method===`HEAD`||!e.body)return e;try{let n=await F(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{S as _,C as a,M as c,D as d,w as f,x as g,b as h,A as i,j as l,N as m,E as n,z as o,k as p,T as r,R as s,P as t,O as u,g as v,h as y};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Nn as e,Vt as t,Zn as n}from"./prompts-Bj4Fbd_n.js";import{s as r}from"./dispatch-CFZ9Crvg.js";import{i}from"./cli-BBlH53hA.js";import{c as a}from"./args-CURX44CA.js";import{r as o,t as s}from"./mcp-server-BlP9lACI.js";async function c(e,t=6e4){let r=AbortSignal.timeout(t),i=await n(e,fetch,r).catch(t=>{throw r.aborted?Error(`MCP server ${e.name} did not start in time`):t});try{return{spec:e,client:i,tools:(await i.tools()).filter(t=>(!e.tools?.length||e.tools.includes(t.name))&&(!e.readOnly||t.annotations?.readOnlyHint===!0))}}catch(t){throw await i.close().catch(()=>{}),r.aborted?Error(`MCP server ${e.name} did not start in time`):t}}function l(e,t){let n=(t??``).toLowerCase().split(/\s+/).filter(Boolean);return e.filter(e=>{let t=`${e.name} ${e.description??``}`.toLowerCase();return n.every(e=>t.includes(e))})}function u(e,t=c){let n=new Map(e.map(e=>[e.name,e])),r=new Map,i=e=>{let i=n.get(String(e??``));if(!i)throw Error(`Unknown server "${e}". Servers: ${[...n.keys()].join(`, `)||`none`}`);let a=r.get(i.name);return a||(a=t(i).catch(e=>{throw r.delete(i.name),e}),r.set(i.name,a)),a};return{find_tools:{description:`Find tools on one of the servers listed in your prompt by words from their names or descriptions; empty query lists them all. Returns each match with one line and its input schema.`,inputSchema:s({server:`string`,query:`string`},[`server`],{server:`A server name from the prompt.`,query:`Words that the tool name or description contain, such as "issue list".`}),annotations:{readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},handler:async e=>{let{spec:t,tools:n}=await i(e.server),r=l(n,typeof e.query==`string`?e.query:void 0),a=e=>e.map(e=>e.name).join(`, `)||`none`;return r.length?r.length>25?`${r.length} tools on ${t.name} match; narrow the query. Names: ${a(r)}`:r.map(e=>({name:e.name,description:(e.description??``).split(`
|
|
2
|
+
`)[0].trim(),inputSchema:e.inputSchema??{type:`object`}})):`No tool on ${t.name} matches. Its tools: ${a(n)}`}},call_tool:{description:`Call a tool found with find_tools; returns the server's result as is.`,inputSchema:s({server:`string`,tool:`string`,args:`object`},[`server`,`tool`],{server:`A server name from the prompt.`,tool:`A tool name find_tools returned.`,args:`The tool's arguments, matching its input schema.`}),handler:async e=>{let{spec:t,client:n,tools:r}=await i(e.server),a=String(e.tool??``);if(!r.some(e=>e.name===a))throw Error(`No tool "${a}" on ${t.name}; find it with find_tools first`);let o=await n.rpc(`tools/call`,{name:a,arguments:e.args&&typeof e.args==`object`?e.args:{}});return o&&typeof o==`object`&&Array.isArray(o.content)?o:JSON.stringify(o)}}}}function d(e,n){let i=t(e,n);if(!i)throw Error(`No task "${n}"`);return r(i.mcp,process.env,void 0,{onWarning:e=>process.stderr.write(`coder hub: ${e}\n`)}).filter(e=>!e.alwaysLoad)}const f=i({name:`task hub`,options:{cwd:a},args:1,run:({args:t,cwd:n})=>o(`coder`,u(d(n,t[0])),void 0,void 0,e())});export{f as commandTaskHub};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e,n as t,o as n,r}from"./prompt-
|
|
1
|
+
import{a as e,n as t,o as n,r}from"./prompt-PEgcMJO7.js";import{i}from"./cli-BBlH53hA.js";import{p as a,s as o}from"./output-BKeyLbvt.js";import{c as s,n as c,t as l}from"./args-CURX44CA.js";import u from"node:path";import d from"node:process";const f={read:`Read-only`,write:`Read-write`};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-6GooVMsq.js`).then(e=>e.t),{INTEGRATIONS:o}=await import(`./integrations-IGnXBrPw.js`).then(e=>e.r),{PRESETS:s}=await import(`./types-D_xnfP7m.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.filter(e=>!t.events[e].noisy),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]=await e({title:`Access`,hint:`What the agent may do on its platforms and connections; Read-write allows every tool.`,selected:[`write`],options:s.map(e=>({value:e,label:f[e]}))}),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,access:m}}const h=i({name:`agent init`,help:{usage:`coder agent init [id] [--integrations a,b] [--events a,b] [--access <mode>] [--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 access when run in a terminal without them.",flags:[[`--integrations <a,b>`,`platforms the agent listens to (see coder agent integrations list)`],[`--events <a,b>`,`events that start tasks, applied to each integration that has them (default: mention)`],[`--access <mode>`,`read or write, on its platforms and connections (default: write)`],[`--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 --events issue,mention --access read`,`no questions`]]},options:{...l,name:s,description:s,integrations:s,events:s,access:s,permissions:s,match:s,yes:c},args:1,run:async({options:e,args:[n],cwd:i})=>{let{agents:a}=await import(`./agent-6GooVMsq.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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{s as e}from"./cli-BBlH53hA.js";const t=e(`agent integrations`,{list:async()=>(await import(`./list-DvFVuGT_.js`)).commandIntegrationsList,ls:async()=>(await import(`./list-DvFVuGT_.js`)).commandIntegrationsList,show:async()=>(await import(`./show-Dn7zTz-9.js`)).commandIntegrationsShow},{menu:[{usage:`list`,blurb:`list integrations with their events and tools`},{usage:`show <id>`,blurb:`events and tools of one integration`}],description:[`The platforms an agent can listen to and act on: their events and tool presets.`]},{aliases:{ls:`list`}});export{t as commandAgentIntegrations};
|