@wular/coder 0.4.10 → 0.4.12
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/README.md +3 -1
- package/dist/actions-BT7_eKXm.js +10 -0
- package/dist/{adapter-BeezVK-B.js → adapter-BT8ECcRG.js} +1 -1
- package/dist/{adapter-ChaISKgI.js → adapter-CU9H4g6c.js} +1 -1
- package/dist/{adapter-MD6ahqPR.js → adapter-CVd5klMH.js} +1 -1
- package/dist/{agent-B8ItyuHN.js → agent-BA6xr8QY.js} +2 -2
- package/dist/apps-D-v5sQJk.js +367 -0
- package/dist/args-CbO_Ck9Z.js +11 -0
- package/dist/async-XNO3nqum.js +3 -0
- package/dist/auth-DuXnSNf9.js +1 -0
- package/dist/base64url-CsVsW4Id.js +1 -0
- package/dist/chat-CgQdDRhs.js +13 -0
- package/dist/cli.js +19 -1
- package/dist/{client-DzwzCsue.js → client-C4QCT6cG.js} +2 -2
- package/dist/cmd-DX5ByXo3.js +119 -0
- package/dist/connection-DNxi2btM.js +1 -0
- package/dist/context-65bOofts.js +7 -0
- package/dist/dash/standalone/node_modules/contextjsx/dist/index.mjs +1 -0
- package/dist/dash/standalone/node_modules/contextjsx/dist/jsx-runtime.mjs +1 -0
- package/dist/dash/standalone/node_modules/contextjsx/dist/src-BJ0QFeB8.mjs +2 -0
- package/dist/dash/standalone/node_modules/contextjsx/package.json +70 -0
- package/dist/dash/standalone/server/build-index.json +1 -1
- package/dist/dash/standalone/server/manifest.json +1187 -1187
- package/dist/dash/standalone/server/modules-server-server-react-server/src/agent/context/turn.dac8eb211c500271.js +141 -0
- 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.c6efd5432c1a4a75.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.a795379254982121.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.a2cb6d1f1714259a.js} +8 -8
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{page.f87fd8eb66f73af0.js → page.996172c951739b35.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.aa9e157d141481d7.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/settings/{page.2f7467868f599ebc.js → page.44d886e60ae04303.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.521c9e7b8d77f557.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.828cfb8112404792.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.dd11f2618e08becd.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.776856fe1ed1a642.js} +6 -6
- 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.7d84ef2b178b34d2.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]/{loading.56520888d5270b88.js → loading.47cbb34ea8d2e33f.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.abed2a8424ef3da0.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.dc294bb94b7437e1.js} +7 -7
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{composer.2d4122eb33addbdd.js → composer.5072aacdce127689.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{task.a0c68180db5fb4c1.js → task.0a1b5878dccd3b37.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{tasks-list.021bdc2f3d90af2d.js → tasks-list.1162926f7498c732.js} +10 -10
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{tasks-section.13f64b0836ae406b.js → tasks-section.1d687c986db53a73.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{page.b78f0df100410db0.js → page.d5d8cb5033823c9c.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-410bdc82c416bc01.js → action-71685b2d5ad9f359.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{agent-pills-0c0b8d40b9bfc78f.js → agent-pills-15da36c2cb81991b.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/agent-settings-form-6e6a87d6e673daa8.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{agent-toggle-5ede0c449e88cb9d.js → agent-toggle-ca98586e3b4ce9ae.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{agents-grid-ffb18df48e951ecb.js → agents-grid-29c399e46b4e9e2b.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{back-602db2cfdccf2e7f.js → back-fa9d6e37f9828093.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{combo-df2685e277db02c0.js → combo-86f3e11d1f6f6cee.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{composer-e1cefed81ea89b7e.js → composer-85e0ec7163ae18b7.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/composer-910bb87127972f62.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{confirm-d163e6865d66dfab.js → confirm-c29a1db0130638d2.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{connect-apps-ce3c9d049ebad459.js → connect-apps-b73490e04ae6398d.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{connect-repositories-0aa9abc77b9c3d48.js → connect-repositories-0de82daaf654b1d3.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{connections-list-6eddeb8583ded10f.js → connections-list-c50f58b4b28d10bb.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{copy-0cc00656953531be.js → copy-445c11202f136275.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/create-link-6d64a2d5f9ce6de0.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{credentials-list-1b6a81e9b4934dc8.js → credentials-list-bee95799b2319b3b.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{custom-range-cae5567874db83ca.js → custom-range-a0630599f907b30e.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{editor-d55d247a1d7de5f0.js → editor-b9951819f21b2e43.js} +2 -2
- package/dist/dash/standalone/static/assets/chunks/{engines-list-288559344de4d4b9.js → engines-list-2720c3e8fa12b2f7.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{field-693bb870ad0bdee8.js → field-b82a0f895266791c.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{instructions-a3d7688e421f2a08.js → instructions-affaaeff366b1725.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/instructions-fd7402ac5aa8b50e.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{list-2a59237cb7cb0a7c.js → list-d918f79562d497eb.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{models-list-5ed9ee02f9b66d98.js → models-list-12bc7aceaa52f5b0.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{notice-7d84ffab32ff24ca.js → notice-57db7a1f05b7308c.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{outcome-dialog-3cffe3507ea92af2.js → outcome-dialog-5cf575a5e6921a5d.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/outcome-dialog-b219595be320108a.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/platform-actions-1d27d2ba7eee9ff1.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{platform-actions-4dc31567d00c4cb2.js → platform-actions-dba96dcb0f6513db.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{runners-list-984246a8f9450da1.js → runners-list-36f8c5ecfcf8e9ae.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{secrets-list-88f8b30abbab52f0.js → secrets-list-d7dbafd24dd18481.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{segmented-79c9c69b702e0b90.js → segmented-8f809ebe712e92a7.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/shared-init-cc13a835f3508618.js +2 -0
- package/dist/dash/standalone/static/assets/chunks/shared-init-f475017dd5811e33.js +5 -0
- package/dist/dash/standalone/static/assets/chunks/side-toggle-0aa237eba3dfe9c1.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{tail-99e29a541a072002.js → tail-b1c46587301ef397.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/task-681061023bdf0a49.js +5 -0
- package/dist/dash/standalone/static/assets/chunks/{task-actions-1cdca1e8d3eee490.js → task-actions-c9e46e81604e85c5.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{task-view-fdcde0e31f63b737.js → task-view-134186a544917ceb.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{tasks-list-3ad1c93deff4fb2e.js → tasks-list-352a3222d878de0f.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{versions-list-60ac4d8f715bf5f7.js → versions-list-21cb854e6a7108a7.js} +1 -1
- package/dist/dash/standalone/static/assets/pnext-client-05df74b071ddb0b3.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-2c19cca257f78ae6.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-2db05dfa62642a65.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-36b0d6085a073880.js +1 -0
- package/dist/dash/standalone/static/assets/{pnext-client-0b3b70f1aefb9947.js → pnext-client-576c06599e241231.js} +1 -1
- package/dist/dash/standalone/static/assets/pnext-client-6aa0f19a30d58d63.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-6b30b71f452f2f07.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-6ccb4d4fff812db3.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-74eb465defba421e.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-8c692d12b2fd90d6.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-92e17d39063a9ced.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-93246aea268c2682.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-9954dcbc0c579e0d.js +1 -0
- package/dist/dash/standalone/static/assets/{pnext-client-8f96a4b8a00ff460.js → pnext-client-c0dfa1cdde9a9855.js} +1 -1
- package/dist/dash/standalone/static/assets/pnext-client-c28d38d4aafd4af6.js +1 -0
- package/dist/dash/standalone/static/assets/{pnext-client-ab36b406301fd2a4.js → pnext-client-c2c30dcb6dc31d60.js} +1 -1
- package/dist/dash/standalone/static/assets/pnext-client-dbf741073e11eac0.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-e29194a27280333f.js +1 -0
- package/dist/dash/standalone/static/assets/{pnext-client-0d90849808b6eb05.js → pnext-client-f8a7e692b27caad9.js} +1 -1
- package/dist/dash/standalone/static/assets/pnext-client-fc5b8cfcba2a9f63.js +1 -0
- package/dist/discover-CPZdprlQ.js +1 -0
- package/dist/docs-x-l7gjFE.js +2 -0
- package/dist/drive-Y-ZlgiUW.js +1 -0
- package/dist/env-B9JG6gwo.js +1 -0
- package/dist/errors-XBA-Ls4n.js +10 -0
- package/dist/exec-iFssTO5V.js +3 -0
- package/dist/executor-Dt2FFT-y.js +11 -0
- package/dist/flow/builtin/review/index.d.ts +2 -0
- package/dist/flow/builtin/review/index.js +16 -0
- package/dist/flow/index.d.ts +1 -1
- package/dist/flow/index.js +1 -1
- package/dist/http-BZfjbiov.js +1 -0
- package/dist/{types-8zO5Tc9c.d.ts → index-BdkdNI1v.d.ts} +710 -137
- package/dist/{integrations-DPxWtNnS.js → integrations-DyInAa5g.js} +2 -2
- package/dist/lib/broker.js +2 -2
- package/dist/load-zhcrwSRF.js +2 -0
- package/dist/local-D55UkW93.js +5 -0
- package/dist/maintenance-BfxcatXH.js +1 -0
- package/dist/{match-BfjPZ7gJ.js → match-Bq4sDuCy.js} +1 -1
- package/dist/mcp-Bta09QCU.js +13 -0
- package/dist/mcp-CUITALl1.js +1 -0
- package/dist/models-C1O2DrXx.js +1 -0
- package/dist/output-D95NoAA9.js +16 -0
- package/dist/prompt-onpyIyXK.js +8 -0
- package/dist/prompts-B8pKhMcu.js +4 -0
- package/dist/refresh-D-0K9fo3.js +1 -0
- package/dist/{remote-f-uny3XZ.js → remote-CDm0YUU3.js} +1 -1
- package/dist/runner-CTFTuaz_.js +1 -0
- package/dist/runner.json +1 -1
- package/dist/runner.tgz +0 -0
- package/dist/{runners-vsoGeyuc.js → runners-CYTicTb7.js} +3 -3
- package/dist/schema.d.ts +1 -1
- package/dist/schema.js +8 -1
- package/dist/sdk.d.ts +12552 -4
- package/dist/sdk.js +1 -1
- package/dist/serve-Bzs_lEg-.js +1 -0
- package/dist/serve-CWtLyyTz.js +12 -0
- package/dist/serve-DE6A-rBk.js +4 -0
- package/dist/{slack-Kpj-G9FE.js → slack-Bo5l13Rs.js} +4 -4
- package/dist/task-BU1JEK9X.js +7 -0
- package/dist/task-CPzBITsp.js +1 -0
- package/dist/tools-BMaKWTa6.js +1 -0
- package/dist/tools-CM4UCsId.js +1 -0
- package/dist/turn-DMvPfhb5.js +3 -0
- package/dist/{views-LmbLfqpu.js → views-DEdKqLm_.js} +1 -1
- package/dist/{wire-DshFMRsS.js → wire-JMNPv8f6.js} +1 -1
- package/dist/worker-BuP_Lem1.js +9 -0
- package/dist/worker-C1tuzq5n.js +1 -0
- package/docs/agents/index.md +19 -21
- package/docs/cli/agent.md +137 -0
- package/docs/cli/auth.md +48 -0
- package/docs/cli/connection.md +89 -0
- package/docs/cli/credentials.md +58 -0
- package/docs/cli/flow.md +158 -0
- package/docs/cli/index.md +139 -0
- package/docs/cli/model.md +116 -0
- package/docs/cli/runner.md +92 -0
- package/docs/cli/server.md +89 -0
- package/docs/cli/task.md +271 -0
- package/docs/flows.md +0 -6
- package/docs/mcp.md +8 -8
- package/docs/review.md +4 -0
- package/package.json +3 -1
- package/plugins/agents/skills/coder/SKILL.md +16 -1
- package/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/plugins/claude/.mcp.json +5 -0
- package/plugins/claude/skills/dispatch/SKILL.md +16 -1
- package/plugins/cursor/.cursor-plugin/plugin.json +1 -1
- package/plugins/cursor/skills/coder/SKILL.md +16 -1
- package/dist/actions-C3Mgpl9J.js +0 -2
- package/dist/add-B26QSwPY.js +0 -6
- package/dist/add-BbXuvqj1.js +0 -1
- package/dist/add-Bk8drM-8.js +0 -1
- package/dist/add-CD_L-WW8.js +0 -2
- package/dist/agent-DHpMqHVi.js +0 -1
- package/dist/alias-CScCzXhS.js +0 -2
- package/dist/app-wHQJHu6N.js +0 -1
- package/dist/approvals-BIGQBbCM.js +0 -2
- package/dist/approve-BnZ3v-3c.js +0 -1
- package/dist/approve-DFSy7Z72.js +0 -2
- package/dist/apps-6BgpUsFh.js +0 -372
- package/dist/archive-CU0nhUeJ.js +0 -4
- package/dist/archive-CY2lvp_c.js +0 -3
- package/dist/args-BekfmD9t.js +0 -1
- package/dist/ask-CLDgHB_Y.js +0 -4
- package/dist/auth-C3KrIUf1.js +0 -1
- package/dist/auth-CGeSfgNb.js +0 -1
- package/dist/chat-AbW-LOHo.js +0 -13
- package/dist/chat-bridge-WK-pKNfw.js +0 -2
- package/dist/cli-Fp28pM4Y.js +0 -9
- package/dist/config-DoVedq6T.js +0 -3
- package/dist/connection-5V8doFL7.js +0 -1
- package/dist/connection-Cb0TK201.js +0 -1
- package/dist/create-CrjRdQip.js +0 -1
- package/dist/credentials-DoL9w8D1.js +0 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/core/event-prompt.87f064ca0141e796.js +0 -30
- package/dist/dash/standalone/static/assets/chunks/agent-settings-form-5a2601316e2ab283.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/composer-08e49d49c0c3ee94.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-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/chunks/task-95daa40d39de664f.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-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/default-tTTSBdXq.js +0 -1
- package/dist/delete-DM2sA12f.js +0 -2
- package/dist/delete-DR37NTr1.js +0 -4
- package/dist/disable-Dz_zLPX5.js +0 -1
- package/dist/discover-CqabH4Fx.js +0 -3
- package/dist/dispatch-BJZqI7sj.js +0 -8
- package/dist/docs-BV9SC67g.js +0 -2
- package/dist/docs-b2mAKC8Z.js +0 -2
- package/dist/drive-CU2HOCfR.js +0 -1
- package/dist/enable-Cfeki-ne.js +0 -1
- package/dist/env-DSddo-fz.js +0 -1
- package/dist/exec-DcWxZar6.js +0 -3
- package/dist/executor-LkokKTTd.js +0 -11
- package/dist/flow/builtin/review.d.ts +0 -2
- package/dist/flow/builtin/review.js +0 -12
- package/dist/flow-BQcdyrVK.js +0 -1
- package/dist/history-D_A5odLI.js +0 -8
- package/dist/http-CXaW1e7x.js +0 -1
- package/dist/init-DU_S43NG.js +0 -1
- package/dist/integrations-Dwvxl7i2.js +0 -1
- package/dist/list-7yd9K7d8.js +0 -1
- package/dist/list-BJ0j5eP9.js +0 -4
- package/dist/list-Boaz5b5n.js +0 -2
- package/dist/list-CIS-GYO1.js +0 -1
- package/dist/list-CR0_Emod2.js +0 -4
- package/dist/list-CnHZriYt.js +0 -3
- package/dist/list-_EH6c041.js +0 -1
- package/dist/list-i2r3Nlyz.js +0 -1
- package/dist/load-C-GZnuok.js +0 -2
- package/dist/local-Fs-dx_dP.js +0 -5
- package/dist/login-CzD2EMD_.js +0 -1
- package/dist/login-DISw6--d.js +0 -1
- package/dist/logout-DMnc5yri.js +0 -1
- package/dist/maintenance-BVDuG9Hg.js +0 -1
- package/dist/mcp-B-hy3eM-.js +0 -11
- package/dist/mcp-CbN-QcpF.js +0 -1
- package/dist/mcp-server-DQqSgD3P.js +0 -1
- package/dist/model-Ckyoyji3.js +0 -1
- package/dist/models-VaiIYlOW.js +0 -1
- package/dist/output-BKeyLbvt.js +0 -5
- package/dist/prompt-DQyPCLUo.js +0 -8
- package/dist/prompts-CEf7z4i_.js +0 -77
- package/dist/push-BNomfHJ3.js +0 -1
- package/dist/reconnect-Bd_jna1M.js +0 -1
- package/dist/refresh-D-broYEx.js +0 -1
- package/dist/remove-CCYHc1FN.js +0 -1
- package/dist/remove-DMTz_c25.js +0 -1
- package/dist/remove-DdcQ-6by.js +0 -1
- package/dist/remove-VtavIuGm.js +0 -1
- package/dist/rename-CKMyelWN.js +0 -1
- package/dist/result-CH3_tVXO.js +0 -5
- package/dist/result-DvOqIwhh.js +0 -18
- package/dist/resume-6j3RUpqa.js +0 -3
- package/dist/review-B4ETH5ki.js +0 -7
- package/dist/review-DDYD3Yvq.d.ts +0 -566
- package/dist/rotate-key-Byk_wI73.js +0 -1
- package/dist/run-DKJW7qwy.js +0 -2
- package/dist/run-DkYzyUnp.js +0 -5
- package/dist/run-LCE1XiyU.js +0 -2
- package/dist/runner-CxtzTgVq.js +0 -1
- package/dist/runner-Dnu1Vx_i.js +0 -1
- package/dist/schema-Brm7WIKd.js +0 -8
- package/dist/sdk-CKTCrtGe.d.ts +0 -12655
- package/dist/serve-C1zag2nr.js +0 -1
- package/dist/serve-C6tsUF0D.js +0 -2
- package/dist/serve-CCxSxXgv.js +0 -1
- package/dist/serve-D8J-sEqm.js +0 -12
- package/dist/server-B4SRYM2L.js +0 -1
- package/dist/setup-host-EaP4GPKB.js +0 -6
- package/dist/show-CjUG_aIp.js +0 -1
- package/dist/show-xdsqD6de.js +0 -1
- package/dist/status-BxV_ITeF.js +0 -1
- package/dist/steer-DZ3nkHfC.js +0 -4
- package/dist/stop-DGTUYxd6.js +0 -3
- package/dist/stop-qDw_DjOB.js +0 -1
- package/dist/task-C506SkPR.js +0 -1
- package/dist/task-CQmx_2SI.js +0 -7
- package/dist/task-Ls_-kcSx.js +0 -1
- package/dist/test-DF_qVK6S.js +0 -1
- package/dist/tools-S3eRQOVm.js +0 -1
- package/dist/unalias-CklkAN1B.js +0 -1
- package/dist/update-CZaFjwOJ.js +0 -2
- package/dist/upgrade-CUhFmPhl.js +0 -2
- package/dist/usage-DTAlb2rC.js +0 -1
- package/dist/watch-CJruitc6.js +0 -5
- package/dist/watch-p0j69fVA.js +0 -9
- package/dist/worker-BHXjDzRp.js +0 -1
- package/dist/worker-nyRZuq4g.js +0 -2
- package/dist/workflow-CJJUiSfv.js +0 -1
- package/docs/agents/prompt.md +0 -220
- package/docs/cli.md +0 -155
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{qi as e}from"./core-DwsAMCnL.js";import{c as t,d as n,o as r,r as i,s as a}from"./slack-
|
|
2
|
-
`),events:{mention:{description:`Agent session started or prompted by mentioning or assigning the agent`,on:`mention`,addressed:!0}},tools:{presets:b,server:x},hosts:[`api.linear.app`,`mcp.linear.app`],get app(){return _},auth:{canWrite:r,token:(e,t,n,{save:r,fetch:i}={})=>y(e,t,r,i),get user(){return v}},target(e,t){let n=new URL(e.url).searchParams.get(`app`),r;try{r=JSON.parse(t).organizationId}catch{return}return n&&typeof r==`string`?{app:n,installation:r}:void 0},adapter:async e=>(await import(`./adapter-
|
|
1
|
+
import{qi as e}from"./core-DwsAMCnL.js";import{c as t,d as n,o as r,r as i,s as a}from"./slack-Bo5l13Rs.js";import{randomUUID as o}from"node:crypto";async function s(e,t){let r=new URLSearchParams(await e.text()),i=Object.fromEntries(t.map(e=>[e,r.get(e)?.trim()??``])),a=t.filter(e=>!i[e]);if(a.length)throw new n(`invalid-field`,a[0],`Missing ${a.join(`, `)}`);return i}async function c(e,t,r=fetch,i=Date.now()){let a=await r(e,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams(t)}),o=await a.json().catch(()=>({}));if(!a.ok||!o.access_token)throw new n(`platform-error`,o.error??String(a.status),`${new URL(e).host} refused the token request: ${o.error_description??o.error??a.status}`);return{accessToken:o.access_token,...o.refresh_token?{refreshToken:o.refresh_token}:{},...o.expires_in?{expiresAt:i+o.expires_in*1e3}:{},...o.id_token?{idToken:o.id_token}:{}}}async function l(e,t,n,r=Date.now()){if(!e)throw Error(`The installation has no token; connect it again from the dashboard`);let i=JSON.parse(e);if(!i.refreshToken||(i.expiresAt??1/0)-3e5>r)return i.accessToken;let{idToken:a,...o}=await t(i.refreshToken),s={...o,refreshToken:o.refreshToken??i.refreshToken},c=await n?.(JSON.stringify(s));return c?JSON.parse(c).accessToken:s.accessToken}const u=`https://api.linear.app/oauth/token`,d=[`clientId`,`clientSecret`,`webhookSecret`],f=e=>e.replace(/\/$/,``);async function p(e,t,n){let r=await n(`https://api.linear.app/graphql`,{method:`POST`,headers:{authorization:`Bearer ${e}`,"content-type":`application/json`},body:JSON.stringify({query:t})}),i=await r.json().catch(()=>({}));if(!r.ok||!i.data)throw Error(`Linear refused the query: ${r.status}`);return i.data}function m(e,t,n,r,i=!1){return`https://linear.app/oauth/authorize?${new URLSearchParams({client_id:e.clientId,redirect_uri:t,response_type:`code`,scope:r?`read,write,app:mentionable,app:assignable`:i?`read,write`:`read`,state:n,...r?{actor:`app`}:{}})}`}function h(e,t,r,i){let a=new URL(e.url).searchParams.get(`code`);if(!a)throw new n(`missing-code`);let{clientId:o,clientSecret:s}=t;return c(u,{grant_type:`authorization_code`,code:a,redirect_uri:r,client_id:o,client_secret:s},i)}function g(e,t,n){let r=new URLSearchParams(n?{"oauth.client_name":n}:{});return r.set(`developer.name`,f(e).replace(/^https?:\/\//,``)),r.set(`oauth.client_uri`,f(e)),r.append(`oauth.redirect_uris`,`${f(e)}/install/linear/callback`),r.append(`oauth.redirect_uris`,`${f(e)}/connect/linear/callback`),r.set(`webhook.enabled`,`true`),r.set(`webhook.url`,`${f(e)}/hooks/linear?app=${t}`),r.set(`webhook.resourceTypes`,`AgentSessionEvent`),`https://linear.app/settings/api/applications/new?${r}`}const _={builtin:`shared`,createStep:(e,{name:t}={},n=o())=>({intro:`Linear runs the agent as an app of your own OAuth application.`,link:g(e,n,t),steps:[{text:`Open the link signed in to Linear, check the form and click **Create**.`},{text:`Copy the client ID, the client secret and the webhook signing secret into the fields below.`}],notes:[`The link fills in the name, the callback URLs and the webhook.`,`To install the app in other Linear workspaces, make it public in its Linear settings.`],hidden:{key:n},fields:[{name:`clientId`,label:`Client ID`,placeholder:`9f3c2a7d1e8b4c6a0d5e7f1a2b3c4d5e`,required:!0},{name:`clientSecret`,label:`Client secret`,placeholder:`4b1e9c7a2d0f8e3c5a6b9d1f0e2c4a7b`,required:!0},{name:`webhookSecret`,label:`Webhook signing secret`,hint:`shown with the webhook settings`,placeholder:`lin_wh_…`,required:!0}],submit:`Create Linear app`}),settingsUrl:()=>`https://linear.app/settings/api`,values:(e,{publicUrl:t,definition:n})=>({url:`https://linear.app/settings/api`,label:`Open application`,lines:[{text:`Application name`,copy:n.name??e.agent},{text:`Callback URL`,copy:`${f(t)}/install/linear/callback`},{text:`Callback URL`,copy:`${f(t)}/connect/linear/callback`},{text:`Webhook URL`,copy:`${f(t)}/hooks/linear?app=${e.id.slice(e.id.indexOf(`:`)+1)}`},{text:`Webhook resource types`,copy:`AgentSessionEvent`}]}),async createCallback(e,{state:t,definition:r}){let{key:i,...a}=await s(e,[...d,`key`]);if(!/^[0-9a-f-]{36}$/.test(i))throw new n(`invalid-field`,`key`);return{platformAppId:i,name:r.name??t.agent,credentials:a}},accountUrl:({login:e})=>`https://linear.app/${encodeURIComponent(e)}`,installUrl(e,t,{publicUrl:n,state:r}){return m(t,`${f(n)}/install/linear/callback`,r,!0)},async installCallback(e,{credentials:t,publicUrl:n,fetch:r}){let{idToken:i,...a}=await h(e,t,`${f(n)}/install/linear/callback`,r),{organization:o,viewer:s}=await p(a.accessToken,`query { organization { id name urlKey } viewer { id } }`,r);return{platformInstallId:o.id,account:{login:o.urlKey},token:JSON.stringify(a),self:s.id}}},v={authorizeUrl:(e,{publicUrl:t,state:n,access:r})=>m(e,`${f(t)}/connect/linear/callback`,n,!1,!!r),async exchange(e,t,{publicUrl:n,fetch:r,access:i}){let{idToken:a,...o}=await h(e,t,`${f(n)}/connect/linear/callback`,r),{viewer:s}=await p(o.accessToken,`query { viewer { id displayName } }`,r);return{id:s.id,login:s.displayName,...i?{token:JSON.stringify(o)}:{}}},async access(e,t,{fetch:n,now:r}){let{clientId:i,clientSecret:a}=t,o;return{accessToken:await l(e,e=>c(u,{grant_type:`refresh_token`,refresh_token:e,client_id:i,client_secret:a},n,r),async e=>{o=e},r),...o?{refreshed:o}:{}}}};function y(e,t,n,r){let{clientId:i,clientSecret:a}=t;return l(e.token,e=>c(u,{grant_type:`refresh_token`,refresh_token:e,client_id:i,client_secret:a},r),n)}const b={read:[`read`],write:[`read`,`write`]};function x(e,t,n){return{name:`linear`,url:`https://mcp.linear.app/mcp${e.includes(`write`)?``:`/readonly`}`,headers:{Authorization:`Bearer ${n}`},credentialFields:{header:`Authorization`}}}const S={id:`linear`,brand:{color:`#222326`,icon:`M2.886 4.18A11.982 11.982 0 0 1 11.99 0C18.624 0 24 5.376 24 12.009c0 3.64-1.62 6.903-4.18 9.105L2.887 4.18ZM1.817 5.626l16.556 16.556c-.524.33-1.075.62-1.65.866L.951 7.277c.247-.575.537-1.126.866-1.65ZM.322 9.163l14.515 14.515c-.71.172-1.443.282-2.195.322L0 11.358a12 12 0 0 1 .322-2.195Zm-.17 4.862 9.823 9.824a12.02 12.02 0 0 1-9.824-9.824Z`,svg:`<svg xmlns="http://www.w3.org/2000/svg" fill="#222326" viewBox="0 0 100 100" style="fill:light-dark(#222326,#fff)"><path d="M 1.23 61.52 c -0.22 -0.95 0.91 -1.55 1.6 -0.86 L 39.33 97.18 c 0.69 0.69 0.09 1.82 -0.86 1.6 C 20.05 94.45 5.55 79.95 1.23 61.52 Z M 0 46.89 c -0.02 0.28 0.09 0.56 0.29 0.76 L 52.35 99.71 c 0.2 0.2 0.48 0.31 0.76 0.29 2.37 -0.15 4.69 -0.46 6.96 -0.93 0.76 -0.16 1.03 -1.1 0.48 -1.65 L 2.58 39.45 c -0.55 -0.55 -1.49 -0.29 -1.65 0.48 -0.47 2.27 -0.78 4.59 -0.93 6.96 Z M 4.21 29.71 c -0.17 0.37 -0.08 0.81 0.21 1.1 l 64.78 64.78 c 0.29 0.29 0.73 0.37 1.1 0.21 1.79 -0.8 3.52 -1.69 5.19 -2.68 0.55 -0.33 0.64 -1.09 0.18 -1.54 L 8.44 24.34 c -0.45 -0.45 -1.21 -0.37 -1.54 0.18 -0.99 1.67 -1.89 3.4 -2.68 5.19 Z M 12.66 18.07 c -0.37 -0.37 -0.39 -0.96 -0.04 -1.35 C 21.78 6.46 35.11 0 49.95 0 77.59 0 100 22.41 100 50.05 c 0 14.84 -6.46 28.17 -16.72 37.34 -0.39 0.35 -0.98 0.33 -1.35 -0.04 L 12.66 18.07 Z"/></svg>`},name:`Linear`,description:`Agent sessions on Linear issues: mentions and assignments`,installLabel:`Connect Linear`,use:`Mention @{handle} or delegate an issue to it.`,answersEveryPrompt:!0,progressReplies:!0,sample:`linear:2f1e6a1c-0000-4000-8000-000000000001:s:5b7d3c2a-0000-4000-8000-000000000002`,prompt:[`A conversation is a Linear agent session on an issue.`,`get_issue reads the issue by its id or identifier, such as ENG-123.`,`reply posts progress in the agent session; your final message completes it. save_comment posts an issue comment outside the session.`,`Replies are Markdown about the issue; link pull requests you open.`].join(`
|
|
2
|
+
`),events:{mention:{description:`Agent session started or prompted by mentioning or assigning the agent`,on:`mention`,addressed:!0}},tools:{presets:b,server:x},hosts:[`api.linear.app`,`mcp.linear.app`],get app(){return _},auth:{canWrite:r,token:(e,t,n,{save:r,fetch:i}={})=>y(e,t,r,i),get user(){return v}},target(e,t){let n=new URL(e.url).searchParams.get(`app`),r;try{r=JSON.parse(t).organizationId}catch{return}return n&&typeof r==`string`?{app:n,installation:r}:void 0},adapter:async e=>(await import(`./adapter-CVd5klMH.js`)).linearAdapter(e),ownEvents(e,t,n,r){let i=JSON.parse(t);if(i.type!==`OAuthApp`||i.action!==`revoked`)return;let o=r.webhookSecret;return a(t,e.headers.get(`linear-signature`),o)&&i.organizationId&&i.oauthClientId===n.id.slice(7)?{uninstalled:`${n.id}:${i.organizationId}`}:{invalid:!0}},event(e,t,n){t.startTyping(`Reading the issue`).catch(()=>{});let r=n.raw.agentSessionPromptContext;return{type:e,actor:{id:n.author.userId,login:n.author.userName},...r?{promptContext:r.slice(0,16384)}:{}}}};var C=e({INTEGRATIONS:()=>w,enabledIntegrations:()=>T,repositoryReader:()=>E});const w={slack:i,github:t,linear:S};function T(e){if(!e)return w;let t=e.filter(e=>!w[e]);if(t.length)throw Error(`Unknown integration ${t.join(`, `)} in SERVER_INTEGRATIONS; pick from ${Object.keys(w).join(`, `)}`);return Object.fromEntries(e.map(e=>[e,w[e]]))}const E=e=>Object.values(e).find(e=>e.repos);export{T as n,C as r,w as t};
|
package/dist/lib/broker.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{
|
|
2
|
+
import{Qt as e,Tt as t,Ut as n,cn as r,ft as i,jn as a,jt as o,lt as s,mn as c,mt as l,r as ee,t as u,ut as d,vt as te,yt as f}from"../errors-XBA-Ls4n.js";import{m as p,s as m}from"../args-CbO_Ck9Z.js";import h from"node:path";import g from"node:process";import _ from"node:fs";import ne from"node:net";const v=new Set([`turn/start`,`review/start`,`thread/compact/start`]),y=3e4;function b(e,t,n){let r=new Set;return t?.threadId&&r.add(t.threadId),e===`review/start`&&n?.reviewThreadId&&r.add(n.reviewThreadId),r}function x(e,t,n){return n===void 0?{code:e,message:t}:{code:e,message:t,data:n}}function S(e,t){e.destroyed||e.write(`${JSON.stringify(t)}\n`)}const C=new Set([`turn/interrupt`,`turn/steer`,`thread/backgroundTerminals/clean`,`thread/archive`,`thread/delete`]);function re(e){return typeof e?.method==`string`&&C.has(e.method)}function ie(e){e&&(_.mkdirSync(h.dirname(e),{recursive:!0}),_.writeFileSync(e,`${g.pid}\n`,`utf8`))}async function w(){let[C,...w]=g.argv.slice(2);if(C!==`serve`)throw Error(`Usage: coder broker serve --endpoint <value> [--cwd <path>] [--pid-file <path>] [--network-access <true|false>] [--idle-ms <ms>]`);let T=p(a({name:`broker`,description:`The codex app-server broker`,access:`write`,args:{cwd:m(),"pid-file":m(),endpoint:c(),"network-access":r(e([`true`,`false`])),"idle-ms":m()},run(){}}),w),E=T.cwd?h.resolve(g.cwd(),T.cwd):g.cwd(),D=String(T.endpoint),O=t(D),k=T[`pid-file`]?h.resolve(T[`pid-file`]):null,A=T[`network-access`]===`true`,j=Number(T[`idle-ms`]??18e5);ie(k);let M=null,N=``,P={},F=null,I=!1,L=!1,R=null,z=null,B=null,V=new Set,H=new Map;function U(e){g.stderr.write(`[coder broker] ${JSON.parse(n(e))}\n`)}function W(e){for(let[t,n]of H)n.socket===e&&(H.delete(t),n.client.exitResolved||n.client.sendMessage({id:t,error:x(-32e3,`Broker client disconnected before answering the server request.`)}))}function G(e,t){let n=z??R;if(!n||n.destroyed){e.sendMessage({id:t.id,error:x(-32601,`No broker client available to answer ${t.method}.`)});return}H.set(t.id,{socket:n,client:e}),S(n,t)}function K(e){if(e!==M||L)return;M=null;let t=e.exitError?.message??`codex app-server exited.`;U(`${t} Starting a fresh one on the next request.`);for(let e of new Set([R,z]))e&&S(e,{method:s,params:{message:t}});H.clear(),R=null,z=null,B=null}async function q(){let e=u(g.env,P),t=l.connect(E,{disableBroker:!0,networkAccess:A}),n,r=new Promise((e,t)=>{n=setTimeout(()=>t(Error(`no answer within ${y/1e3}s`)),y)});try{let n=await Promise.race([t,r]);return n.setNotificationHandler(oe),n.handleServerRequest=e=>G(n,e),n.exitPromise.then(()=>K(n)),N=e,n}catch(e){throw t.then(e=>e.close()).catch(()=>{}),Error(`codex app-server could not start: ${ee(e)}`)}finally{clearTimeout(n)}}async function J(){let e=M;M=null,H.clear(),await e?.close().catch(()=>{})}async function ae(e){if(F)return F;let t=I||u(g.env,P)!==N;if(M&&!M.exitResolved&&!t)return M;if(M&&!M.exitResolved){let t=`Codex login changed; restarted the shared Codex app-server.`;U(t),S(e,{method:i,params:{message:t}})}return I=!1,await J(),F=q().finally(()=>{F=null}),M=await F,M}function Y(e){W(e),R===e&&(R=null),z===e&&(z=null,B=null)}function oe(e){let t=R??z;if(t&&(S(t,e),e.method===`turn/completed`&&z===t)){let n=e.params?.threadId??null;(!n||!B||B.has(n))&&(z=null,B=null,R===t&&(R=null))}}async function X(e){L=!0;let t=new Promise(t=>e.close(t));O.kind===`unix`&&_.existsSync(O.path)&&_.unlinkSync(O.path);let n=o();f(E,A,n)?.endpoint===D&&te(E,A,n);for(let e of V)e.end();await M?.close().catch(()=>{}),await t,k&&_.existsSync(k)&&_.unlinkSync(k)}M=await q();let Z;function Q(){clearTimeout(Z),V.size===0&&(Z=setTimeout(async()=>{U(`No clients for ${j/1e3}s; exiting.`),await X($),g.exit(0)},j))}let $=ne.createServer(e=>{clearTimeout(Z),V.add(e),e.setEncoding(`utf8`);let t=``;e.on(`data`,async n=>{t+=n;let r=t.indexOf(`
|
|
3
3
|
`);for(;r!==-1;){let n=t.slice(0,r);if(t=t.slice(r+1),r=t.indexOf(`
|
|
4
|
-
`),!n.trim())continue;let i;try{i=JSON.parse(n)}catch(t){
|
|
4
|
+
`),!n.trim())continue;let i;try{i=JSON.parse(n)}catch(t){S(e,{id:null,error:x(-32700,`Invalid JSON: ${t instanceof Error?t.message:String(t)}`)});continue}let a=i.id!==void 0&&!i.method?H.get(i.id):void 0;if(a){H.delete(i.id),a.client.exitResolved||a.client.sendMessage(i);continue}if(i.id!==void 0&&i.method===`initialize`){S(e,{id:i.id,result:{userAgent:`coder-broker`}});continue}if(i.method===`initialized`&&i.id===void 0||(i.id!==void 0&&i.method===`broker/shutdown`&&(S(e,{id:i.id,result:{}}),await X($),g.exit(0)),i.id===void 0||!i.method))continue;let o=R&&R!==e||z&&z!==e;if(i.method===`broker/recycle`){I=!0,!o&&M&&(U(`Recycling the shared Codex app-server after a stale-login error.`),I=!1,await J()),S(e,{id:i.id,result:{recycled:!o}});continue}let s=re(i)&&z&&z!==e&&!R;if(o&&!s){S(e,{id:i.id,error:x(d,`Shared Codex broker is busy.`)});continue}if(s){try{if(!M)throw Error(`codex app-server is not running.`);let t=await M.request(i.method,i.params??{});S(e,{id:i.id,result:t})}catch(t){let n=t;S(e,{id:i.id,error:x(n.rpcCode??-32e3,n.message)})}continue}let c=v.has(i.method);R=e,c&&(z=e,B=b(i.method,i.params??{},null));try{let t=await(await ae(e)).request(i.method,i.params??{});S(e,{id:i.id,result:t}),c&&(B=b(i.method,i.params??{},t)),R===e&&(R=null)}catch(t){let n=t;S(e,{id:i.id,error:x(n.rpcCode??-32e3,n.message)}),R===e&&(R=null),z===e&&c&&(z=null,B=null)}}}),e.on(`close`,()=>{V.delete(e),Y(e),Q()}),e.on(`error`,()=>{V.delete(e),Y(e),Q()})});g.on(`SIGTERM`,async()=>{await X($),g.exit(0)}),g.on(`SIGINT`,async()=>{await X($),g.exit(0)}),setInterval(async()=>{V.size===0&&f(E,A,o())?.endpoint!==D&&(await X($),g.exit(0))},3e4).unref(),$.listen(O.path),Q()}w().catch(e=>{g.stderr.write(`${JSON.parse(n(e instanceof Error?e.message:String(e)))}\n`),g.exit(1)});export{};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Rt as e,en as t,qi as n}from"./core-DwsAMCnL.js";import{$t as r,K as i,Qt as a,Zt as o,_ as s,cn as c,dn as l,en as u,gn as d,in as f,mn as p,pn as m}from"./errors-XBA-Ls4n.js";import{Ct as h,Nt as ee,Rt as g,wt as te}from"./output-D95NoAA9.js";import _ from"node:path";import{fileURLToPath as v}from"node:url";import y from"node:fs";var b={name:`Coder`,description:`Answers engineering questions, reviews pull requests, and makes requested changes.`,permissions:`workspace-write`,integrations:{github:{events:{pull_request:{flow:`review`,permissions:`read-only`},mention:!0,issue:!0,comment:{match:`[Cc]oder`}}},slack:{events:{mention:!0,dm:!0,command:!0,channel:{match:`[Cc]oder`}}},linear:{events:{mention:!0}}}};const x=p().check(t(/^[a-z0-9][a-z0-9_-]*$/i,`agent or flow name`)),S=a([`low`,`medium`,`high`]),C=a([`read-only`,`workspace-write`,`auto`]),w=a([`read`,`write`]),T=m({flow:c(x),match:c(p().check(e(1))),permissions:c(C),actAs:c(f(`requester`))}),E=m({events:c(d([r(p()),l(p(),d([x,T,f(!0)]))]))}),ne=m({$schema:c(p()),name:c(p().check(e(1))),description:c(p()),engine:c(p()),runner:c(p().check(e(1))),model:c(p()),effort:c(S),permissions:c(C),access:c(w),mcp:c(l(x,te)),integrations:o(l(p(),E),{})}),re=m({allowedEvents:c(r(p()))}),D=m({connections:c(r(p())),engine:c(p()),model:c(p()),effort:c(S),permissions:c(C),access:c(w),integrations:c(l(p(),re)),disabled:c(u())}),O=l(x,d([u(),D]));function k(e){return e.issues.map(e=>`${e.path.map(String).join(`.`)||`(root)`}: ${e.message}`).join(`; `)}function A(e){let t=e?.mcp;return!t||typeof t!=`object`?e:{...e,mcp:Object.fromEntries(Object.entries(t).map(([e,t])=>{if(!t||typeof t!=`object`)return[e,t];let{repository:n,...r}=t;return[e,r]}))}}function j(e,t,n=!0){let r=ne.safeParse(A(t));if(!r.success)throw Error(`Invalid agent definition "${e}": ${k(r.error)}`);let{$schema:i,...a}=r.data;return g(a.mcp,n),a}function M(e){if(e===void 0)return{};let t=O.safeParse(e);if(!t.success)throw Error(`Invalid agents usage: ${k(t.error)}`);return t.data}function N(e){return e?.events?Array.isArray(e.events)?e.events:Object.keys(e.events):[]}function P(e,t){if(!e?.events)return;if(Array.isArray(e.events))return e.events.includes(t)?{}:void 0;if(!Object.prototype.hasOwnProperty.call(e.events,t))return;let n=e.events[t];return n===!0?{}:typeof n==`string`?{flow:n}:n}function F(e,t){let n=[],r=Object.keys(t).sort().join(`, `)||`none`;for(let i of e){for(let[e,a]of Object.entries(i.definition.integrations)){let o=`agents.${i.id}.integrations.${e}`,s=t[e];if(!s){n.push(`${o}: unknown integration; valid: ${r}`);continue}let c=Object.keys(s.events).sort().join(`, `)||`none`;for(let e of N(a)){e in s.events||n.push(`${o}.events.${e}: unknown event; valid: ${c}`);let t=P(a,e)?.match;if(t!==void 0)try{new RegExp(t)}catch{n.push(`${o}.events.${e}.match: invalid regex`)}}}for(let[e,a]of Object.entries(i.usage?.integrations??{})){let o=`agents.${i.id}.integrations.${e}`,s=t[e];if(!s){n.push(`${o}: unknown integration; valid: ${r}`);continue}let c=Object.keys(s.events).sort().join(`, `)||`none`;for(let e of a.allowedEvents??[])e in s.events||n.push(`${o}.allowedEvents: unknown event "${e}"; valid: ${c}`)}}return n}function I(e){return e.definition.access===`read`||e.usage?.access===`read`?`read`:`write`}function L(e,t){let n=N(e.definition.integrations[t]),r=e.usage?.integrations?.[t]?.allowedEvents;return r===void 0?n:n.filter(e=>r.includes(e))}function R(e){return{engine:e.usage?.engine??e.definition.engine,model:e.usage?.model??e.definition.model,effort:e.usage?.effort??e.definition.effort,permissions:e.usage?.permissions??e.definition.permissions??`auto`}}const z={"read-only":0,"workspace-write":1,auto:2};function B(e,t){return t&&z[t]<=z[e]?t:e}var V=n({AgentLoadError:()=>H,agentsFromSources:()=>Y,assertNotReserved:()=>X,builtinDefinitions:()=>K,defaultAgent:()=>q,loadAgents:()=>$,repoAgentOverride:()=>Q}),H=class extends Error{};const U=v(new URL(`./builtin/coder/`,import.meta.url)),W={coder:{json:b,builtin:!0,dir:U,systemPrompt:y.readFileSync(_.join(U,`system.md`),`utf8`)}};function G(e,t=!1){let n={},r;try{r=y.readdirSync(e,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>e.name)}catch{return n}for(let i of r){let r=_.join(e,i),a=_.join(r,`agent.json`);y.statSync(a,{throwIfNoEntry:!1})?.isFile()&&(n[i]={json:JSON.parse(y.readFileSync(a,`utf8`)),builtin:t,dir:r})}return n}function K(){return W}function q(){return`coder`}function J(e,t){let n=Object.entries(e.integrations).flatMap(([e,n])=>{let r=t[e]?.events;if(!r)return[];let i=Array.isArray(n.events)?n.events.filter(e=>e in r):n.events&&Object.fromEntries(Object.entries(n.events).filter(([e])=>e in r));return[[e,{...n,...i?{events:i}:{}}]]});return{...e,integrations:Object.fromEntries(n)}}function Y(e,t,n){let r=M(e.usage),i=Object.keys(r).filter(t=>!(t in e.definitions));if(i.length){let t=Object.keys(e.definitions).sort().join(`, `)||`none`;throw Error(`Invalid agents:\n agents.${i.sort().join(`, agents.`)}: no agent definition; known ids: ${t}`)}let a=[];for(let[n,i]of Object.entries(e.definitions)){let o=r[n],s=o===!1?{disabled:!0}:o,c=typeof s==`object`&&s.disabled;if(c&&!e.includeDisabled)continue;let l;try{l=j(n,i.json,i.repository??!i.builtin)}catch(e){if(c)continue;throw new H(e instanceof Error?e.message:String(e))}let u=i.builtin?J(l,t):l;a.push({id:n,name:u.name??n,definition:u,...typeof s==`object`?{usage:s}:{},...i.dir?{dir:i.dir}:{},builtin:i.builtin})}let o=F(a.filter(e=>!e.usage?.disabled),t);if(o.length)throw new H(`Invalid agents:\n ${o.join(`
|
|
2
|
+
`)}`);return a}function X(e){let t=e.filter(e=>e in K()).sort();if(t.length)throw Error(`Invalid agents:\n agents.${t.join(`, agents.`)}: built-in agent ids are reserved`)}function Z(e){let t=ee(i(_.resolve(e)));return{file:t,usage:y.existsSync(t)?JSON.parse(y.readFileSync(t,`utf8`)).agents??{}:{}}}function Q(e,t,n){let{file:r,usage:i}=Z(e),a=i[t],o=typeof a==`boolean`?!a:a?.disabled;return o===void 0||o===n?void 0:r}async function $(e,t,{includeDisabled:n=!1}={}){e=_.resolve(e);let r={...K()},i=G(s(`agents`));for(let e of Object.values(i))e.repository=!1;let a=G(_.join(e,`.coder`,`agents`));X([...Object.keys(i),...Object.keys(a)]),Object.assign(r,i,a);let o={...h(e).agents},{usage:c}=Z(e);for(let e of Object.keys(o))!(e in r)&&!(e in c)&&delete o[e];return Y({definitions:r,usage:o,includeDisabled:n},t,e)}export{q as a,Q as c,R as d,P as f,L as g,M as h,K as i,I as l,j as m,Y as n,$ as o,B as p,X as r,V as s,H as t,N as u};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{qi as e}from"./core-DwsAMCnL.js";import{Ct as t,Dt as n,H as r,V as i,_ as a,wn as o}from"./errors-XBA-Ls4n.js";import{i as s,m as c,n as l,o as u}from"./load-zhcrwSRF.js";import{t as d}from"./integrations-DyInAa5g.js";import"./turn-DMvPfhb5.js";import f from"node:path";import p from"node:fs";import{execFile as ee}from"node:child_process";import{randomUUID as te}from"node:crypto";import{isDeepStrictEqual as m}from"node:util";const h=(e,t=``)=>`token:${e}:${t}`,g=e=>`token-drop:${e}`;var ne=e({agentProblems:()=>D,agentWithVersion:()=>x,diskFiles:()=>k,ensureBuiltinAgents:()=>M,getAgent:()=>v,getVersion:()=>b,listAgents:()=>y,publishAgent:()=>S,publishVersion:()=>C,seedBuiltinAgent:()=>A,seedBuiltinAgents:()=>j,setAgentSettings:()=>w,toAgent:()=>O,versionKey:()=>_});const _=(e,t)=>`${e}:${String(t).padStart(6,`0`)}`;function v(e,t){return e.get(`agent`,t)}async function y(e){return(await e.list(`agent`)).map(e=>e.value)}async function b(e,t,n){let r=n??(await v(e,t))?.currentVersion;return r===void 0?void 0:e.get(`agentversion`,_(t,r))}async function x(e,t){return(await e.listAgentsWithVersions(t))[0]??{}}async function S(e,t,n){let r=c(t.id,t.definition),i=t.files&&Object.keys(t.files).length?t.files:void 0;return e.publishAgent({id:t.id,name:t.name??r.name??t.id,...t.description??r.description?{description:t.description??r.description}:{},source:t.source,...t.repo?{repo:t.repo}:{},...t.path?{path:t.path}:{},currentVersion:0,createdAt:n,updatedAt:n},{agent:t.id,version:0,definition:r,systemPrompt:t.systemPrompt,...i?{files:i}:{},...t.commit?{commit:t.commit}:{},...t.origin?{source:t.origin}:{},importedFrom:t.importedFrom,createdAt:n})}async function C(e,t,n,r){if(!r)return(await S(e,t,n)).version;let i=c(t.id,t.definition),a=t.files&&Object.keys(t.files).length?t.files:void 0,o=r?r.record:await v(e,t.id),s=r?r.version:o?await b(e,t.id,o.currentVersion):void 0,l=(e,r)=>({id:t.id,name:t.name??i.name??t.id,...t.description??i.description?{description:t.description??i.description}:{},source:t.source,...t.repo?{repo:t.repo}:{},...t.path?{path:t.path}:{},currentVersion:e,...o?.settings?{settings:o.settings}:{},createdAt:o?.createdAt??n,updatedAt:r}),u=e=>m(e.definition,i)&&e.systemPrompt===t.systemPrompt&&m(e.files,a);if(s&&u(s)){let r=l(s.version,o.updatedAt);return m(o,r)||await e.put(`agent`,t.id,l(s.version,n)),s}o||await e.put(`agent`,t.id,l(0,n));let d;for(let r=(o?.currentVersion??0)+1;d={agent:t.id,version:r,definition:i,systemPrompt:t.systemPrompt,...a?{files:a}:{},...t.commit?{commit:t.commit}:{},...t.origin?{source:t.origin}:{},importedFrom:t.importedFrom,createdAt:n},!await e.create(`agentversion`,_(t.id,r),d);r++){let n=await e.get(`agentversion`,_(t.id,r));if(n&&u(n)){d=n;break}}let f=await v(e,t.id);return(!f||f.currentVersion<d.version)&&await e.put(`agent`,t.id,l(d.version,n)),d}async function w(e,t,n,r=Date.now()){let i=await v(e,t);if(!i)throw Error(`No agent named "${t}".`);let a={...i,settings:n,updatedAt:r};return await e.put(`agent`,t,a),a}const T=[`read-only`,`workspace-write`,`auto`];function E(e,t,n,r){if(!t&&!n)return;let i=t??{},a=n??{},o=new Set([...Object.keys(i.integrations??{}),...Object.keys(a.integrations??{})]),s=Object.fromEntries([...o].map(e=>{let t=i.integrations?.[e],n=a.integrations?.[e],r=t?.allowedEvents&&n?.allowedEvents?t.allowedEvents.filter(e=>n.allowedEvents.includes(e)):n?.allowedEvents??t?.allowedEvents;return[e,r?{allowedEvents:r}:{}]})),c=i.permissions??e.permissions??`auto`,l=a.permissions,u=l&&T.indexOf(l)<=T.indexOf(c)?l:c,d=i.access===`read`||a.access===`read`?`read`:a.access??i.access;return{...i,...a,permissions:u,...d?{access:d}:{},...o.size?{integrations:s}:{},...i.connections!==void 0||a.connections!==void 0?{connections:i.connections&&a.connections?i.connections.filter(e=>a.connections.includes(e)):a.connections??i.connections}:{}}}function D(e,t,n){if(e.problems?.length)return e.problems;if(!t)return[`No version ${e.currentVersion} for agent "${e.id}".`];try{return l({definitions:{[e.id]:{json:t.definition,builtin:e.source===`builtin`}},usage:e.settings?{[e.id]:e.settings}:void 0,includeDisabled:!0},n),[]}catch(e){return[e instanceof Error?e.message:String(e)]}}function O(e,t,n,r=d){let i=E(t.definition,void 0,e.settings,r),a=E(t.definition,i,n,r),[o]=l({definitions:{[e.id]:{json:t.definition,builtin:e.source===`builtin`}},usage:a?{[e.id]:a}:void 0},r);if(!o)throw Error(`Agent "${e.id}" is disabled.`);return{...o,files:{...t.files??{},"system.md":t.systemPrompt}}}function k(e,t=``){let n={};for(let r of p.readdirSync(f.join(e,t),{withFileTypes:!0})){let i=t?`${t}/${r.name}`:r.name;r.isDirectory()?Object.assign(n,k(e,i)):r.isFile()&&i!==`agent.json`&&i!==`system.md`&&(n[i]=p.readFileSync(f.join(e,i),`utf8`))}return n}async function A(e,n,r,i){let a=s()[r];return a?await C(e,{id:r,source:`builtin`,definition:a.json,systemPrompt:a.systemPrompt,importedFrom:`builtin:${t()}`},n,i)!==i.version:!1}async function j(e,t,n){let r=n??await Promise.all(Object.keys(s()).map(t=>x(e,t))),i=!1;for(let n of Object.keys(s()))await A(e,t,n,r.find(({record:e})=>e?.id===n)??{})&&(i=!0);return i}async function M(e,t){let n=e.settings??={};return n.builtinAgents||=j(e.store,t).then(()=>{}).catch(e=>{throw delete n.builtinAgents,e}),n.builtinAgents}const N=3e4;var P=class extends Error{};function F(e,t,n,r){let i=t;return(!n.runner||n.runner===e||n.runner===i.name)&&(!n.defaults||!!i.default)&&(!n.ids||n.ids.includes(e))&&(!n.agent||(r??i.agent)===n.agent)&&(!Object.hasOwn(n,`visibleTo`)||!i.owner||i.owner===n.visibleTo)&&(!n.active||i.deletedAt===void 0||!!(n.includeUninstalled&&i.uninstalled))&&(!n.installation||i.installationId===n.installation)&&(!n.apps||!!i.app&&n.apps.includes(i.app))}const I=(e,t)=>e===`credential`?`credential:${t.slice(0,Math.max(0,t.lastIndexOf(`/`)))}`:e===`runner`?`runners:`:`installation:${t}`;async function L(e,t,n,r){let{parseCredentialId:i}=await import(`./apps-D-v5sQJk.js`).then(e=>e.wt),a=i(n).owner,o=(await e.list(t)).filter(e=>t===`credential`?i(e.id).owner===a:e.id===n),s=await r(o.find(e=>e.id===n)?.value,o,e);for(let n of s??[])n.value===null?await e.delete(t,n.id):await e.put(t,n.id,n.value);return!!s?.length}function R(e,t,n){if(n.deletedAt!==void 0)return;let r=n.app.split(`/`)[0],i=(e,t)=>[e.slice(t.app.length+1),...t.covers??[]],a=new Set(i(t,n));if(e.some(([e,n])=>{let o=n;return e!==t&&!o.deletedAt&&(o.app===r||o.app.startsWith(`${r}/`))&&i(e,o).some(e=>a.has(e))}))throw new P(`Installation "${t}" is bound through another app.`)}function z(e,t,n,r){let i=e?.sending?.count??0,a=[...e?.items.slice(i)??[],...n],o=a.slice(0,Math.max(0,a.length-50));return{...e,owner:t,at:r,items:[...e?.items.slice(0,i)??[],...a.slice(-50)],more:(e?.more??0)+o.length,mustReply:e?.mustReply||o.some(e=>e?.event?.mustReply===!0)}}function B(e,t){let n=e.sending?.count??0;return t===void 0?n:e.items.findIndex((e,r)=>r<n&&e.admission===t)+1}function V(e,t,n,r){let{sending:i,...a}=e,o=t?B(e,n):0;if(t&&i&&o<i.count)return{...e,items:e.items.slice(o),sending:{...i,count:i.count-o,until:r+N}};let s={...a,items:t?e.items.slice(i?.count??0):e.items,more:(e.more??0)+(t?0:i?.more??0),mustReply:e.mustReply||!t&&i?.mustReply};return t?s:z(s,s.owner,[],s.at)}function H(e,t,n=0,r){let i=e??{messages:[],more:0,epoch:te()},a=i.version??i.messages.length+i.more,o=i.messages.map((e,t)=>({sequence:t+1,...e}));if(t)return{...i,version:a+1,messages:o.length<50?[...o,{...t,sequence:a+1}]:o,more:i.more+(o.length<50?0:1)};if(i.epoch!==r)return i;let s=Math.max(i.acknowledged??0,Math.min(n,a)),c=o.filter(e=>e.sequence>s);return{...i,version:a,acknowledged:s,messages:c,more:a-s-c.length}}function U(e){let{sending:t,...n}=e;return z({...n,more:(e.more??0)+(t?.more??0),mustReply:e.mustReply||t?.mustReply},e.owner,[],e.at)}var W=class{now;recordEvents=new EventTarget;async watch(e,t){let n=`${e}:${t}`,r=o();return this.recordEvents.addEventListener(n,r.notify),{...r,close:()=>{this.recordEvents.removeEventListener(n,r.notify),r.close()}}}appUpdates=new Map;values=new Map;configUpdate;constructor(e=Date.now){this.now=e}async withAppLock(e,t){e.startsWith(`runners:`)&&(e=`runners:`);let n=(this.appUpdates.get(e)??Promise.resolve()).catch(()=>{}).then(()=>t(this));this.appUpdates.set(e,n);try{return await n}finally{this.appUpdates.get(e)===n&&this.appUpdates.delete(e)}}async withConfigLock(e){let t=(this.configUpdate??Promise.resolve()).catch(()=>{}).then(()=>e(this));this.configUpdate=t;try{return await t}finally{this.configUpdate===t&&delete this.configUpdate}}withCredential(e,t,n){return this.withAppLock(I(e,t),()=>L(this,e,t,n))}async listAgentsWithVersions(e){let t=Array.isArray(e)?await this.list(`agent`,{ids:e}):e?[{value:await this.get(`agent`,e)}]:await this.list(`agent`);return Promise.all(t.flatMap(({value:e})=>e?[this.get(`agentversion`,`${e.id}:${String(e.currentVersion).padStart(6,`0`)}`).then(t=>({record:e,version:t}))]:[]))}async listAgentSummaries(e={}){return(await this.listAgentsWithVersions(e.slug)).filter(({record:t,version:n})=>(!e.after||t.id>e.after)&&(!e.source||t.source===e.source)&&(!e.platform||!!n?.definition.integrations?.[e.platform])&&(!e.q||[t.id,t.name,t.description,t.repo].some(t=>t?.toLowerCase().includes(e.q.toLowerCase())))).slice(0,e.limit).map(({record:e,version:t})=>{if(!t)return{record:e};let{systemPrompt:n,files:r,...i}=t;return{record:e,version:i}})}async listVersions(e,t,n){let r=await this.get(`agent`,e),i=n??(t===void 0?1/0:(r?.currentVersion??0)+1);return(await this.list(`agentversion`,{prefix:`${e}:`})).filter(({value:e})=>e.version<i&&(t===void 0||e.version>=i-t)).map(({id:e,value:{systemPrompt:t,files:n,...r}})=>({id:e,value:r}))}async publishAgent(e,t){let{publishVersion:n}=await Promise.resolve().then(()=>ne);return this.withAppLock(`agent:${e.id}`,async()=>{let r=(await this.listAgentsWithVersions(e.id))[0]??{},i=await n(this,{...e,definition:t.definition,systemPrompt:t.systemPrompt,files:t.files,commit:t.commit,origin:t.source,importedFrom:t.importedFrom},e.updatedAt,r);return{record:await this.get(`agent`,e.id),version:i,unchanged:i.version===r.record?.currentVersion}})}async listCredentials(e){return(await this.list(`credential`)).filter(({value:t})=>!t.owner||t.owner===e.owner).slice(0,e.limit)}async installationApp(e){let t=await this.get(`installation`,e);if(!t||t.deletedAt)return;let n=await this.get(`app`,t.app);return n?{installation:t,app:n}:void 0}async getApps(e){return(await Promise.all([...new Set(e)].map(async e=>({id:e,value:await this.get(`app`,e)})))).filter(e=>!!e.value)}async updateMetadata(e,t,n){let r=await this.get(e,t);return r?(await this.put(e,t,{...r,...n}),!0):!1}async listHistory(e){return(await this.list(`history`,{prefix:`${e}:`})).map(({value:{engine:e,conversation:t,savedAt:n}})=>({engine:e,conversation:t,savedAt:n})).sort((e,t)=>e.savedAt-t.savedAt)}async conversationState(e){let[t,n,r]=await Promise.all([this.get(`delivery`,e),this.get(`delivery`,`since:${e}`),this.get(`delivery`,`batch:${e}`)]),i=t&&await this.get(`task`,t.taskId);return{record:t,unseen:n,batch:r,...i?.task.flow==="default"?{status:i}:{}}}async markConversation(e,t,n,r,i){let a=await this.get(`delivery`,e);a?.taskId===t&&await this.put(`delivery`,e,{...a,at:r,seen:n},{ttlMs:i})}async heldTokens(e,t){let n={held:new Map,drops:new Map};for(let t of e)for(let e of await this.list(`snapshot`,{prefix:h(t)}))n.held.set(e.id,e.value);for(let r of[...e,...t])n.drops.set(g(r),(await this.get(`snapshot`,g(r)))?.drop);return n}async holdToken(e){(await Promise.all(e.drops.map(async e=>(await this.get(`snapshot`,e.key))?.drop===e.drop))).every(Boolean)&&await this.put(`snapshot`,e.key,e.value,{ttlMs:e.ttlMs})}saveTaskSecrets(e,t){return this.withAppLock(`connections:${e}`,async n=>{let r=await n.get(`task`,e),i=!!(r&&![`completed`,`failed`,`cancelled`].includes(r.status));if(i)for(let e of t)await n.put(`snapshot`,e.id,{secret:e.value,expiresAt:e.expiresAt},{ttlMs:Math.max(1,e.expiresAt-this.now())});return i})}async dispatchState(e){let{key:t,owner:n,at:r,ttlMs:i}=e.delivery,a=this.live(`delivery`).get(t)?.value,o=a?.pending!==void 0&&(!a.owner||(a.at??0)+i<=r);return a&&!o?{claimed:!1}:(await this.put(`delivery`,t,{at:r,owner:n,pending:a?.pending??!0},a?.pending&&a.pending!==!0?{}:{ttlMs:i}),{claimed:!0})}async usageTotals(e){let{sumUsageTotals:t}=await import(`./apps-D-v5sQJk.js`).then(e=>e.wn);return t(this,e)}async usageSummary(e,t){let{usageSummary:n}=await import(`./apps-D-v5sQJk.js`).then(e=>e.wn);return n((await this.list(`usage`)).map(e=>e.value),e,t).totals}bucket(e){let t=this.values.get(e);return t||(t=new Map,this.values.set(e,t)),t}changed(e){}read(e,t){let n=t;if(e!==`app`||!n.shared)return t;let r=this.live(`app`).get(n.shared)?.value;return{...n,credentials:r?.credentials??``}}live(e){let t=this.bucket(e),n=this.now();for(let[e,r]of t)r.expiresAt!==void 0&&r.expiresAt<=n&&t.delete(e);return t}async get(e,t){let n=this.live(e).get(t);return n&&this.read(e,n.value)}async patchLogin(e,t,n={}){let r=this.live(`login`).get(e),i=r?.value;if(!i||!(i.expiresAt>this.now())||Object.entries(n).some(([e,t])=>Array.isArray(t)?!t.includes(i[e]):i[e]!==t))return;let a={...i,...t};return a.input===null&&delete a.input,r.value=a,this.recordEvents.dispatchEvent(new Event(`login:${e}`)),a}async completeLogin(e,t,n){let{completeLogin:r}=await import(`./apps-D-v5sQJk.js`).then(e=>e.wt);return r(this,e,t,n)}async put(e,t,n,r={}){e===`installation`&&R([...this.live(e)].map(([e,t])=>[e,t.value]),t,n);let i=r.ttlMs===void 0?void 0:this.now()+r.ttlMs,a=this.bucket(e),o=e===`task`&&!r.unarchive?a.get(t)?.value?.archivedAt:void 0;a.set(t,{value:o===void 0?e===`app`&&n.shared?{...n,credentials:``}:n:Object.assign({},n,{archivedAt:o}),expiresAt:i}),(e===`delivery`||e===`login`)&&this.recordEvents.dispatchEvent(new Event(`${e}:${t}`)),this.changed(e)}async putMany(e,t,n={}){if(e===`task`){await Promise.all(t.map(t=>this.put(e,t.id,t.value,n)));return}let r=this.bucket(e);for(let e of t)r.set(e.id,{value:e.value,...n.ttlMs===void 0?{}:{expiresAt:this.now()+n.ttlMs}});this.changed(e)}async list(e,t={}){let n=e===`installation`&&t.agent?this.live(`app`):void 0;return[...this.live(e).entries()].filter(([e])=>!t.prefix||e.startsWith(t.prefix)).filter(([e])=>!t.after||e>t.after).filter(([r,i])=>F(r,i.value,t,e===`agent`?r:n?.get(i.value.app)?.value?.agent)).sort(([e],[t])=>e.localeCompare(t)).slice(0,t.limit).map(([t,n])=>({id:t,value:this.read(e,n.value)}))}async delete(e,t){this.bucket(e).delete(t),e===`login`&&this.recordEvents.dispatchEvent(new Event(`login:${t}`)),this.changed(e);for(let n of e===`task`?[`history`,`tasklog`]:e===`agent`?[`agentversion`]:[]){for(let e of this.bucket(n).keys())e.startsWith(`${t}:`)&&this.bucket(n).delete(e);this.changed(n)}}async create(e,t,n,r={}){let i=this.live(e);if(i.has(t))return!1;let a=r.ttlMs===void 0?void 0:this.now()+r.ttlMs;return i.set(t,{value:n,expiresAt:a}),this.changed(e),!0}async claimDeliveryLease(e,t,n){let r=this.live(`delivery`);if(r.has(e))return;let i=this.live(`snapshot`).get(`delivery:${e}`)?.value?.failures??0;return r.set(e,{value:{owner:t,failures:i},expiresAt:this.now()+n}),this.changed(`delivery`),i}async updateDeliveryLease(e,t,n,r={ttlMs:3e4}){let i=this.live(`delivery`);if(i.get(e)?.value?.owner!==t)return!1;if(!n)i.delete(e),this.bucket(`snapshot`).delete(`delivery:${e}`);else{let t=n.next===void 0?n:{...n,next:this.now()+r.ttlMs};i.set(e,{value:t,expiresAt:this.now()+r.ttlMs}),n.next!==void 0&&this.bucket(`snapshot`).set(`delivery:${e}`,{value:t,expiresAt:this.now()+864e5})}return this.changed(`delivery`),this.changed(`snapshot`),!0}async updateDelivery(e,t,n,r={}){let i=this.live(`delivery`);return i.get(e)?.value?.owner===t&&(n===void 0?i.delete(e):i.set(e,{value:n,...r.ttlMs===void 0?{}:{expiresAt:this.now()+r.ttlMs}}),this.changed(`delivery`),!0)}async appendUnseen(e,t,n){let r=this.live(`delivery`);if(!r.has(e))return;let i=`since:${e}`,a=r.get(i)?.value;r.set(i,{value:H(a,t),expiresAt:this.now()+n}),this.changed(`delivery`)}async acknowledgeUnseen(e,t,n){let r=this.live(`delivery`).get(`since:${e}`);r&&(r.value=H(r.value,void 0,t,n),this.changed(`delivery`))}async appendBatch(e,t,n,r,i){let a=this.live(`delivery`).get(e)?.value,o=z(a,t,n,r),s=this.now()+i;this.bucket(`delivery`).set(e,{value:o,expiresAt:s}),this.changed(`delivery`)}async claimBatch(e,t){return this.withAppLock(`batch:${e}`,async()=>{let n=this.live(`delivery`).get(e),r=n?.value;if(r?.owner!==t||!r.items.length)return;if(r.sending&&(r.sending.until??0)>this.now())return null;r.sending&&(r=U(r));let i={...r,more:0,mustReply:!1,sending:{owner:t,until:this.now()+N,count:r.items.length,more:r.more,mustReply:r.mustReply}},a=n.expiresAt;return this.bucket(`delivery`).set(e,{value:i,expiresAt:a}),this.changed(`delivery`),r})}async finishBatch(e,t,n,r){let i=this.live(`delivery`).get(e),a=i?.value;if(a?.sending?.owner!==t)return!1;let o=V(a,n,r,this.now());return this.bucket(`delivery`).set(e,{value:o,expiresAt:i.expiresAt}),this.changed(`delivery`),!0}async take(e,t,n){let r=this.live(e),i=r.get(t);if(!(!i||Object.entries(n??{}).some(([e,t])=>i.value[e]!==t)))return r.delete(t),this.changed(e),this.read(e,i.value)}},re=e({LocalStore:()=>X,deleteLocalAgent:()=>$,syncLocalAgents:()=>Z,writeLocalAgent:()=>Q});const G=new Set([`app`,`installation`,`runner`]),K=new Set([`connection`,`credential`]),q=new Set([`agent`,`agentversion`]);function J(e,t){try{return JSON.parse(p.readFileSync(e,`utf8`))}catch(e){if(e.code===`ENOENT`)return t;throw e}}function Y(e,t){p.mkdirSync(f.dirname(e),{recursive:!0});let n=`${e}.${process.pid}.tmp`;try{p.writeFileSync(n,t,{mode:384}),p.renameSync(n,e)}finally{p.rmSync(n,{force:!0})}}var X=class extends W{connections;revisions=new Map;logBuckets=new Map;writes=Promise.resolve();constructor(e=Date.now,t=()=>new n){super(e),this.connections=t}withAppLock(e,t){return e.startsWith(`connection:`)||e.startsWith(`connection-import:`)?this.connections().withLock(()=>t(this),e.replace(/^connection:/,``)):super.withAppLock(e,t)}withConfigLock(e){return super.withConfigLock(e)}withCredential(e,t,n){let r=()=>L(this,e,t,n);return e===`credential`?this.connections().withLock(r,I(e,t)):super.withAppLock(I(e,t),r)}get appsFile(){return a(`apps.json`)}get deliveriesFile(){return f.join(r(``),`deliveries.json`)}serial(e,t=!1){let n=this.writes.then(()=>t?this.connections().withLock(async()=>e()):e());return this.writes=n.catch(()=>{}),n}apps(){return J(this.appsFile,{})}recordsFile(e){return e===`delivery`?this.deliveriesFile:e===`usage`?i():e===`snapshot`?f.join(r(``),`snapshots.json`):f.join(r(``),`runner`,`${e}.json`)}bucket(e){let t=super.bucket(e);if(G.has(e)||K.has(e)||q.has(e)||e===`tasklog`)return t;let n=this.recordsFile(e),r=p.statSync(n,{throwIfNoEntry:!1}),i=r?`${r.ino}:${r.mtimeMs}:${r.size}`:``;if(this.revisions.get(e)!==i){for(let n of t.keys())(e!==`snapshot`||!n.startsWith(`connection`))&&t.delete(n);for(let[e,r]of Object.entries(J(n,{})))t.set(e,r);this.revisions.set(e,i)}return t}changed(e){!G.has(e)&&!K.has(e)&&!q.has(e)&&e!==`tasklog`&&Y(this.recordsFile(e),`${JSON.stringify(Object.fromEntries([...this.bucket(e)].filter(([t])=>e!==`snapshot`||!t.startsWith(`connection`))))}\n`)}logFile(e){return f.join(r(``),`runner`,`logs`,`${encodeURIComponent(e)}.jsonl`)}loadLog(e){let t=this.logBuckets.get(e);if(t)return t;t=new Map;try{let n=p.readFileSync(this.logFile(e),`utf8`);for(let e of n.split(`
|
|
2
|
+
`).filter(Boolean)){let{id:n,...r}=JSON.parse(e);t.set(n,r)}}catch(e){if(e.code!==`ENOENT`)throw e}return this.logBuckets.set(e,t),t}entries(e){if(e===`connection`)return this.connections().list().map(e=>[e.id,e]);if(e===`credential`)return this.connections().credentials().map(e=>[e.id,e.value]);if(G.has(e)){let t=this.apps(),n=Object.entries(t[e]??{});return e===`app`?n.map(([e,n])=>{let r=n,i=r.shared?t.app?.[r.shared]:void 0;return[e,r.shared?{...r,credentials:i?.credentials??``}:r]}):n}return[]}refuse(e){throw Error(`A local server keeps no ${e} records`)}async get(e,t){if(e===`connection`)return this.connections().get(t);if(e===`tasklog`){let e=this.loadLog(t.slice(0,t.lastIndexOf(`:`))).get(t);return e&&(e.expiresAt===void 0||e.expiresAt>this.now())?e.value:void 0}return!G.has(e)&&!K.has(e)?super.get(e,t):this.entries(e).find(([e])=>e===t)?.[1]}async completeLogin(){return this.refuse(`login`)}async patchLogin(){return this.refuse(`login`)}async put(e,t,n,r={}){if(e===`tasklog`)return this.putMany(e,[{id:t,value:n}],r);if(!G.has(e)&&!K.has(e))return super.put(e,t,n,r);await this.serial(()=>this.write(e,t,n),K.has(e))}write(e,t,n){if(e===`connection`){this.connections().put(n);return}if(e===`credential`&&t!==`claude`&&t!==`codex`){this.connections().putCredential(t,n);return}if(G.has(e)){let r=this.apps();e===`installation`&&R(Object.entries(r.installation??{}),t,n),e===`app`&&n.shared&&(n={...n,credentials:``}),r[e]={...r[e],[t]:n},Y(this.appsFile,`${JSON.stringify(r,null,2)}\n`)}else this.refuse(e)}remove(e,t){if(e===`connection`){let e=this.connections(),n=!!e.get(t);return e.delete(t),n}if(e===`credential`){let e=this.connections(),n=e.credentials().some(e=>e.id===t);return e.deleteCredential(t),n}if(G.has(e)){let n=this.apps(),r=n[e];return!r||!(t in r)?!1:(delete r[t],Y(this.appsFile,`${JSON.stringify(n,null,2)}\n`),!0)}return!1}async putMany(e,t,n={}){if(e===`tasklog`){let e=new Map;for(let{id:r,value:i}of t){let t=r.slice(0,r.lastIndexOf(`:`)),a=e.get(t)??[];a.push(JSON.stringify({id:r,value:i,...n.ttlMs===void 0?{}:{expiresAt:this.now()+n.ttlMs}})),e.set(t,a)}for(let[t,n]of e){let e=this.logFile(t);p.mkdirSync(f.dirname(e),{recursive:!0}),p.appendFileSync(e,`${n.join(`
|
|
3
|
+
`)}\n`,{mode:384})}for(let{id:e,value:r}of t)this.loadLog(e.slice(0,e.lastIndexOf(`:`))).set(e,{value:r,...n.ttlMs===void 0?{}:{expiresAt:this.now()+n.ttlMs}})}else if(!G.has(e)&&!K.has(e))await super.putMany(e,t,n);else for(let r of t)await this.put(e,r.id,r.value,n)}async list(e,t={}){if(e===`tasklog`){let e=t.prefix?.endsWith(`:`)?t.prefix.slice(0,-1):void 0;if(e!==void 0)this.loadLog(e);else{let e=f.dirname(this.logFile(``));if(p.existsSync(e))for(let t of p.readdirSync(e))t.endsWith(`.jsonl`)&&this.loadLog(decodeURIComponent(t.slice(0,-6)))}return(e===void 0?[...this.logBuckets.values()]:[this.loadLog(e)]).flatMap(e=>[...e]).filter(([e,n])=>(!t.prefix||e.startsWith(t.prefix))&&(!t.after||e>t.after)&&(n.expiresAt===void 0||n.expiresAt>this.now())).sort(([e],[t])=>e.localeCompare(t)).slice(0,t.limit).map(([e,t])=>({id:e,value:t.value}))}if(!G.has(e)&&!K.has(e))return super.list(e,t);let n=e===`installation`&&t.agent?this.apps().app:void 0;return this.entries(e).filter(([e])=>(!t.prefix||e.startsWith(t.prefix))&&(!t.after||e>t.after)).filter(([e,r])=>F(e,r,t,n?.[r.app]?.agent)).sort(([e],[t])=>e.localeCompare(t)).slice(0,t.limit).map(([n,r])=>{let i=r;return{id:n,value:(e===`connection`&&t.secrets&&(t.secrets===`all`||i.provider===`mcp`&&i.auth===`oauth`)?this.connections().get(n):void 0)??r}})}async delete(e,t){if(e===`tasklog`){let e=t.slice(0,t.lastIndexOf(`:`)),n=this.loadLog(e);n.delete(t),Y(this.logFile(e),[...n].map(([e,t])=>JSON.stringify({id:e,...t})).join(`
|
|
4
|
+
`)+`
|
|
5
|
+
`);return}if(!G.has(e)&&!K.has(e)){await super.delete(e,t),e===`task`&&(p.rmSync(this.logFile(t),{force:!0}),this.logBuckets.delete(t));return}await this.serial(()=>this.remove(e,t),K.has(e))}async create(e,t,n,r={}){return e===`tasklog`?this.serial(async()=>!await this.get(e,t)&&(await this.put(e,t,n,r),!0)):!G.has(e)&&!K.has(e)?super.create(e,t,n,r):this.serial(()=>!this.entries(e).some(([e])=>e===t)&&(this.write(e,t,n),!0),K.has(e))}async take(e,t,n){return!G.has(e)&&!K.has(e)&&e!==`tasklog`?super.take(e,t,n):this.serial(async()=>{let r=await this.get(e,t);if(!(r===void 0||Object.entries(n??{}).some(([e,t])=>r[e]!==t)))return e===`tasklog`?await this.delete(e,t):this.remove(e,t),r},K.has(e))}};function ie(e){let t=f.resolve(e);for(;!p.existsSync(f.join(t,`.git`));){let e=f.dirname(t);if(e===t)return Promise.resolve(void 0);t=e}return new Promise(t=>ee(`git`,[`log`,`-1`,`--format=%H`,`--`,`.`],{cwd:e},(e,n)=>t(e?void 0:n.trim()||void 0)))}async function Z(e,t,n,r){let i=await u(t,n,{includeDisabled:!0}),o=await Promise.all(i.filter(e=>!r||e.id===r).map(async t=>{let n=t.usage?{settings:t.usage}:{};if(t.builtin){let{record:r,version:i}=await x(e,t.id);if(!r)return;let a={...r,settings:void 0,...n,local:!0};return await e.put(`agent`,t.id,a),{record:a,version:i}}if(!t.dir)return;let r=await ie(t.dir),i=p.statSync(f.join(t.dir,`agent.json`)),o=f.join(t.dir,`system.md`),s={agent:t.id,version:1,definition:t.definition,systemPrompt:p.existsSync(o)?p.readFileSync(o,`utf8`):``,files:k(t.dir),...r?{commit:r}:{},importedFrom:`local:${t.dir}`,createdAt:i.mtimeMs},c={id:t.id,name:t.name,...t.definition.description?{description:t.definition.description}:{},source:f.resolve(t.dir)===a(`agents`,t.id)?`home`:`repo`,path:t.dir,currentVersion:1,...n,local:!0,...r?{commit:r}:{},createdAt:i.birthtimeMs||i.mtimeMs,updatedAt:i.mtimeMs};return await e.put(`agentversion`,_(t.id,1),s),await e.put(`agent`,t.id,c),{record:c,version:s}}));if(!r){let t=new Set(i.map(e=>e.id));for(let n of await y(e))n.local&&n.path&&!t.has(n.id)&&await e.delete(`agent`,n.id)}return o.filter(e=>!!e).sort((e,t)=>e.record.id<t.record.id?-1:+(e.record.id>t.record.id))}async function Q(e,t,n,r){let i=(await u(e,t,{includeDisabled:!0})).find(e=>e.id===n&&!e.builtin)?.dir??a(`agents`,n),o={...r.files,"agent.json":`${JSON.stringify(r.definition,null,2)}\n`,"system.md":r.systemPrompt};for(let[e,t]of Object.entries(o))p.mkdirSync(f.dirname(f.join(i,e)),{recursive:!0}),p.writeFileSync(f.join(i,e),t)}async function $(e,t,n){let r=(await u(e,t,{includeDisabled:!0})).find(e=>e.id===n&&!e.builtin);if(!r?.dir)throw Error(`No local agent named "${n}".`);return f.resolve(r.dir)===a(`agents`,n)&&(p.rmSync(r.dir,{recursive:!0}),!0)}export{g as C,O as S,S as _,Q as a,j as b,R as c,P as d,D as f,b as g,v as h,Z as i,L as l,M as m,$ as n,W as o,x as p,re as r,z as s,X as t,N as u,C as v,h as w,w as x,A as y};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{qi as e}from"./core-DwsAMCnL.js";import{Zt as t}from"./output-D95NoAA9.js";import{Dt as n,xn as r,zn as i}from"./apps-D-v5sQJk.js";import{n as a}from"./env-B9JG6gwo.js";import{C as o,T as s,w as c,x as l}from"./runners-CYTicTb7.js";import{chatState as u,m as d,platformLink as f,secret as p,x as m,y as h}from"./schema.js";import g from"node:process";var _=e({rotateKey:()=>y});async function v(e){try{return await e()}catch(e){throw e instanceof t?e:new t(`server`,e instanceof Error?e.message:String(e))}}function y(e={}){return v(async()=>{let _=a(e.env??g.env);if(!_.encryptionKey)throw new t(`invalid-option`,`SERVER_ENCRYPTION_KEY is required to rotate keys.`,{hint:`Set the new key in SERVER_ENCRYPTION_KEY and the old key in SERVER_ENCRYPTION_KEY_PREVIOUS.`});let v=await i(_);try{let e=new Set([v.defaultOrganizationId]);if(v.connection){let t=v.connection.db,[n,i,a]=await Promise.all([t.selectDistinct({id:p.organizationId}).from(p),t.select({key:u.key}).from(u).where(m(u.key,`o:%,"config"]:workspace`)),t.select({key:u.key}).from(u).where(m(u.key,`o:%,"connection"]:%`))]);for(let t of n)e.add(t.id);for(let t of i){let n;try{n=JSON.parse(t.key.slice(2,-10))}catch{continue}Array.isArray(n)&&n.length===2&&typeof n[0]==`string`&&n[1]===`config`&&t.key===r(n[0],`config`,`workspace`)&&e.add(n[0])}for(let t of a){let n=t.key.lastIndexOf(`,"connection"]:`);try{let r=JSON.parse(t.key.slice(2,n+14));Array.isArray(r)&&r.length===2&&typeof r[0]==`string`&&r[1]===`connection`&&e.add(r[0])}catch{}}}let t=0;for(let r of e)t+=await n(v.store(r),_);let i=v.connection?.db,a=c(_.encryptionKey);for(let e of i?await i.select().from(f).where(h(f.token)):[])s(_,e.token)!==a&&(await i.update(f).set({token:o(_,l(_,e.token))}).where(d(f.id,e.id)),t++);return{moved:t}}finally{await v.close()}})}export{y as n,_ as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{f as e,g as t,l as n,p as r}from"./load-
|
|
1
|
+
import{f as e,g as t,l as n,p as r}from"./load-zhcrwSRF.js";import{t as i}from"./integrations-DyInAa5g.js";function a(e){let t={};for(let r of Object.keys(e.definition.integrations)){let a=i[r];a&&(t[r]=a.tools.presets[n(e)])}return t}function o(n,o){if(!i[n.integration]||!t(o,n.integration).includes(n.type))return;let s=e(o.definition.integrations[n.integration],n.type);if(!s||s.match!==void 0&&!new RegExp(s.match).test(n.text))return;let c=o.usage?.permissions??o.definition.permissions;return{flow:s.flow??`default`,tools:a(o),...s.actAs?{actAs:s.actAs}:{},...c?{permissions:r(c,s.permissions)}:s.permissions?{permissions:s.permissions}:{}}}function s(e,t){return t.flatMap(t=>{let n=o(e,t);return n?[{agent:t,...n}]:[]})}export{o as n,s as r,a as t};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import{At as e}from"./errors-XBA-Ls4n.js";import{t}from"./integrations-DyInAa5g.js";import n from"node:path";import r from"node:process";import i from"node:os";import a from"node:fs/promises";function o(e){return`APP_TOKEN_${e.toUpperCase().replace(/[^A-Z0-9]/g,`_`)}`}const s=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-|-$/g,``);function c(e,n,r){let{name:i,tools:a,repos:o}=t[e],{readOnly:c,...u}=a.server(n,r.event,r.token),d=Object.entries(u.env??{}).find(([,e])=>e===r.token)?.[0],f=n.some(e=>!a.presets.read.includes(e))?`write`:`read`;return{...u,name:s(l(e,r.account)),integration:e,...r.account?{account:r.account}:{},description:r.account?`${i} ${r.account}`:`${i}, the account this task started in`,access:f,...c?{readOnly:c}:{},...d?{credentialFields:{env:d}}:{},...o?.credentialUsername?{gitCredential:!0}:{}}}const l=(e,t)=>t?`${e}:${t}`:e;function u(e){if(!e?.integration||!t[e.integration])return;let n=c(e.integration,[],{token:`\0`}),r=Object.entries(n.env??{}).find(([,e])=>e===`\0`)?.[0],i=n.credentialFields?.header;return r?e.env?.[r]||void 0:i?e.headers?.[i]?.replace(/^Bearer /,``):void 0}function d(e,n,r=[]){let i=new Set,a=new Set(r);return Object.entries(n).flatMap(([n,r])=>{let[o,s]=n.split(/:(.*)/),l=e.tools[o];if(!t[o]||!r||!l?.length)return[];let u=c(o,l,{token:r,...e.event?{event:e.event}:{},...s?{account:s}:{}});a.has(n)&&u.access===`read`&&delete u.gitCredential;let d=u.name;for(let e=2;i.has(d);e++)d=`${u.name}-${e}`;return i.add(d),[{...u,name:d}]})}function f(t,n,r,i=[]){return e(Object.fromEntries([...d(t,n,i).map(e=>[`native:${e.name}`,{...e,resolved:!0}]),...r?[[`native:conversation`,{name:`conversation`,resolved:!0,env:{CODER_REPLY_URL:r.url,CODER_REPLY_TOKEN:r.token},credentialFields:{env:`CODER_REPLY_TOKEN`}}]]:[]]))}async function p(e){let o=e.flatMap(e=>{let n=e.integration?t[e.integration]?.repos:void 0,r=e.gitCredential&&n?.credentialUsername&&u(e);return r&&!/[\r\n]/.test(r)?n.cloneHosts.map(t=>({host:t,username:n.credentialUsername,password:r,...e.account?{owner:e.account.toLowerCase()}:{}})):[]});if(!o.length)return{env:{},close:async()=>{}};let s=await a.mkdtemp(n.join(i.tmpdir(),`coder-git-`)),c=n.join(s,`credential.cjs`);try{await a.writeFile(n.join(s,`tokens.json`),JSON.stringify(o),{mode:384}),await a.writeFile(c,`const fs = require('node:fs');
|
|
2
|
+
let input = '';
|
|
3
|
+
process.stdin.on('data', data => input += data);
|
|
4
|
+
process.stdin.on('end', () => {
|
|
5
|
+
if (process.argv[2] !== 'get') return;
|
|
6
|
+
const fields = Object.fromEntries(input.trim().split('\\n').map(line => { const at = line.indexOf('='); return [line.slice(0, at), line.slice(at + 1)]; }));
|
|
7
|
+
const entries = JSON.parse(fs.readFileSync(require('node:path').join(__dirname, 'tokens.json'), 'utf8'));
|
|
8
|
+
const owner = (fields.path || '').split('/')[0].toLowerCase();
|
|
9
|
+
const hosted = entries.filter(entry => fields.protocol === 'https' && fields.host === entry.host);
|
|
10
|
+
const credential = hosted.find(entry => entry.owner === owner) || hosted.find(entry => !entry.owner) || hosted[0];
|
|
11
|
+
if (credential) process.stdout.write('username=' + credential.username + '\\npassword=' + credential.password + '\\n');
|
|
12
|
+
});
|
|
13
|
+
`,{mode:384});let e=e=>`'${e.replaceAll(`'`,`'\\''`)}'`,t=Number(r.env.GIT_CONFIG_COUNT??0);if(!Number.isInteger(t)||t<0||t>1e3)throw Error(`Invalid git config count`);return{env:{GIT_CONFIG_COUNT:String(t+3),[`GIT_CONFIG_KEY_${t}`]:`credential.helper`,[`GIT_CONFIG_VALUE_${t}`]:``,[`GIT_CONFIG_KEY_${t+1}`]:`credential.helper`,[`GIT_CONFIG_VALUE_${t+1}`]:`!${e(r.execPath)} ${e(c)}`,[`GIT_CONFIG_KEY_${t+2}`]:`credential.useHttpPath`,[`GIT_CONFIG_VALUE_${t+2}`]:`true`},close:()=>a.rm(s,{recursive:!0,force:!0})}}catch(e){throw await a.rm(s,{recursive:!0,force:!0}),e}}export{o as i,l as n,f as r,p as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{En as e,K as t,O as n,Sn as r,Tn as i,U as a,_n as o,cn as s,d as c,dn as l,jn as u,kn as d,mn as f}from"./errors-XBA-Ls4n.js";import{s as p,t as m}from"./args-CbO_Ck9Z.js";import{B as h,Ct as g,V as _,dt as v,z as y}from"./output-D95NoAA9.js";import{command as b}from"./cli.js";import{n as x,t as S}from"./prompts-B8pKhMcu.js";import{serve as C}from"./serve-DE6A-rBk.js";import w from"node:path";import{spawn as T}from"node:child_process";import{randomUUID as E}from"node:crypto";function D(e){return w.join(e,`sidecar.json`)}function O(e){return r(D(e))??{sessionId:null,declineStreak:0}}function k(e,t,n,r){return[`-p`,r,`--output-format`,`json`,`--model`,`sonnet`,`--effort`,`low`,`--strict-mcp-config`,`--no-chrome`,`--mcp-config`,`{"mcpServers":{}}`,`--settings`,`{"disableClaudeAiConnectors":true}`,n?`--resume`:`--session-id`,t,...v,`--add-dir`,e]}function A(e,t,n,r,i){let a=k(t,n,r,i);return new Promise((t,n)=>{let r=T(`claude`,a,{cwd:e,stdio:[`ignore`,`pipe`,`pipe`]}),i=``,o=``,s=setTimeout(()=>{r.kill(`SIGKILL`),n(Error(`sidecar call timed out`))},12e4);r.stdout.on(`data`,e=>i+=e),r.stderr.on(`data`,e=>o+=e),r.on(`error`,e=>{clearTimeout(s),n(e)}),r.on(`close`,e=>{if(clearTimeout(s),e!==0){n(Error(`sidecar claude exited ${e}: ${o.trim().slice(0,200)}`));return}try{let e=JSON.parse(i);if(e.is_error){n(Error(`sidecar turn errored: ${String(e.result??``).slice(0,200)}`));return}t(String(e.result??``))}catch{n(Error(`sidecar returned unparseable output`))}})})}function j(e){let t=e.match(/\{[^{}]*"decision"[^{}]*\}/);if(!t)return null;try{let e=JSON.parse(t[0]);if(e.decision===`accept`||e.decision===`decline`||e.decision===`escalate`)return{decision:e.decision,reason:String(e.reason??``)}}catch{}return null}async function M(t,n,r){try{return await i(w.join(n,`sidecar.lock`),async()=>{let i=O(n);if(i.declineStreak>=3)return{decision:`escalate`,reason:`sidecar decline streak; needs human review`};if(!i.sessionId){let a=E();await A(t,n,a,!1,x(r.taskGoal,w.join(n,`log.jsonl`))),i.sessionId=a,e(D(n),i)}let a=j(await A(t,n,i.sessionId,!0,S(r.summary)));return a?.decision===`decline`?i.declineStreak+=1:a?.decision===`accept`&&(i.declineStreak=0),e(D(n),i),a??{decision:`escalate`,reason:`sidecar verdict unparseable`}},9e4,12e4)}catch(e){return{decision:`escalate`,reason:`sidecar unavailable: ${e instanceof Error?e.message:String(e)}`}}}const N=new Set([`Write`,`Edit`,`MultiEdit`,`NotebookEdit`]);async function P(e,r,i){let o=String(i.tool_name??``),s=i.input??i.tool_input??{},l=t(e),u=a(e,r),d=g(e),f=t=>c(e,r,t),p,m;if(o===`Bash`){let e=String(s.command??``);m=`run command: ${e||`(unknown command)`}`,p=y(e,{allowedNetworkHosts:d.approvals.allowedNetworkHosts})}else if(N.has(o)){let e=String(s.file_path??s.notebook_path??``);m=`${o}: ${e||`(unknown path)`}`,p=h(e?[e]:[],l)}else m=`${o||`(unknown tool)`}: ${JSON.stringify(s).slice(0,200)}`,p={decision:`escalate`,reason:`tool needs approval: ${o}`};f({kind:`approval-decision`,method:o,decision:p.decision,reason:p.reason,summary:m});let v=p.decision,b=p.reason;if(v===`escalate`){let t=await M(e,u,{taskGoal:n(e,r)?.prompt??null,summary:m});f({kind:`sidecar-decision`,decision:t.decision,reason:t.reason,summary:m}),t.decision===`escalate`?(v=await _(u,{method:`claude/${o}`,summary:m,params:{tool_name:o,input:s}},{timeoutMs:d.approvals.escalationTimeoutMs,onEvent:f}),b=`escalated for human review`):(v=t.decision,b=t.reason)}return v===`accept`?{behavior:`allow`,updatedInput:s}:{behavior:`deny`,message:`Denied by coder policy: ${b}`}}const F=m(s(l(f(),o())),`The tool's input.`),I=(e,t)=>d({name:`coder`,description:`Coder approval policy`,commands:[u({name:`approval_prompt`,description:`Coder approval policy for claude permission prompts.`,args:{tool_name:p(`The tool Claude asks to run.`),input:F,tool_input:F},access:`read`,run:n=>P(e,t,n).catch(e=>({behavior:`deny`,message:`coder mcp tool failed: ${e instanceof Error?e.message:String(e)}`})),mcp:{text:e=>JSON.stringify(e)}})]}),L=b({name:`mcp`,description:`the coder MCP server engines call back into`,access:`write`,args:{"task-id":p()},globalFlags:{json:!1},cli:{positional:[`task-id`]},mcp:!1,run:async({args:e,cwd:t})=>{await(await C(I(t,e[0]),`stdio`)).done}});export{L as commandTaskMcp};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{qi as e}from"./core-DwsAMCnL.js";import{Ct as t,Et as n,It as r,Ot as i,St as a,Tt as o,Y as s,Zt as c,bt as l,ft as u,lt as d,pt as f,tt as p,ut as m,vt as h,xt as g,yt as _}from"./output-D95NoAA9.js";import{t as v}from"./wire-JMNPv8f6.js";import y from"node:path";import b from"node:process";var x=e({RESERVED:()=>S,buildModelRows:()=>T,modelAddCore:()=>N,modelAliasCore:()=>I,modelListData:()=>E,modelRemoveCore:()=>F,modelToggleCore:()=>R,modelUnaliasCore:()=>L,modelUpdateCore:()=>P,models:()=>z,persistModel:()=>D,probeEndpoint:()=>C});const S=new Set([`codex`,`claude`,`custom`]);async function C(e,t={}){let n=`key`in t?t.key:e.envKey?b.env[e.envKey]:void 0,r=t.fetch??fetch,i=_(e.baseUrl,`models`),a=null;for(let t of i)try{let i=await r(t,{headers:n?{Authorization:`Bearer ${n}`}:{},signal:AbortSignal.timeout(5e3)});if(!i.ok){a=i.status===404?{reachable:!0,modelListed:null,models:null,detail:`endpoint reachable (no model list to verify against)`}:{reachable:!1,modelListed:null,models:null,detail:`${t} -> HTTP ${i.status}`};continue}let o=await i.json().catch(()=>null),s=Array.isArray(o?.data)?o.data.map(e=>e.id).filter(e=>typeof e==`string`):null;if(!s)return{reachable:!0,modelListed:null,models:null,detail:`endpoint reachable`};if(!e.model)return{reachable:!0,modelListed:null,models:s,detail:`endpoint reachable; ${s.length} models listed`};let c=s.includes(e.model);return{reachable:!0,modelListed:c,models:s,detail:c?`endpoint reachable; model "${e.model}" listed`:`endpoint reachable, but "${e.model}" is not in its model list`}}catch(e){a={reachable:!1,modelListed:null,models:null,detail:`${t} unreachable (${e instanceof Error?e.message:String(e)})`}}return a}function w(e,t){r(e,e=>{e.models=e.models??{},t(e.models)})}function T(e){let t=e.models??{},n=Object.entries(t).filter(e=>a(e[1])),r=e=>`${e.provider}:${e.model}${e.effort?`:${e.effort}`:``}`,i=Object.entries(t).filter(e=>l(e[1])).map(([e,t])=>{let n=t.provider===`claude`?m:f,i=n[t.model]??t.model,a=g(e)?e:Object.entries(n).find(([,e])=>e===i)?.[0];return{name:e,spec:r(t),replaces:a,disabled:!!t.disabled}}),o=new Map;for(let e of i)e.replaces&&(e.name===e.replaces||!o.has(e.replaces))&&o.get(e.replaces)?.name!==e.replaces&&o.set(e.replaces,e);let s=e=>!!t[e]?.disabled,c=i.filter(e=>![...o.values()].some(t=>t.name===e.name));return{models:t,endpoints:n,providerRows:(e,t)=>[...Object.entries(t).map(([e,t])=>{let n=o.get(e);return n?{alias:n.name,spec:n.spec,overrides:e,disabled:n.disabled}:{alias:e,model:t,builtin:!0,disabled:s(e)}}),...c.filter(t=>t.spec.startsWith(`${e}:`)).map(({name:e,spec:t,disabled:n})=>({alias:e,spec:t,disabled:n}))],toggledSlugs:Object.entries(t).filter(([e,t])=>!a(t)&&!l(t)&&!g(e)).map(([e,t])=>({name:e,disabled:!!t.disabled})),disabled:s}}async function E(e){let{endpoints:n,providerRows:r,toggledSlugs:i}=T(t(e)),a=await Promise.all(n.map(async([e,t])=>({name:e,...t,probe:await C(t)})));return{codex:r(`codex`,f),claude:r(`claude`,m),custom:a,...i.length?{toggles:i}:{}}}async function D(e,t,n,r){let i=await v(t),a=i?.wireApi===`responses`;i?(t.wireApi=i.wireApi,t.baseUrl=i.baseUrl??t.baseUrl):delete t.wireApi,w(n,n=>{n[e]=t});let o=await C(t),c=s(p(r)),l=p(r);return{name:e,entry:t,file:n,probe:o,codex:l,install:c,nativeResponses:a,keyMissing:!!(t.envKey&&!b.env[t.envKey]),ready:o.reachable&&l.available}}const O=`Usage: coder model add <name> --base-url <url> --model <id> [--env-key VAR]`,k=`Usage: coder model update <name> [--base-url <url>] [--model <id>] [--env-key VAR]`,A=`Usage: coder model alias <name> <spec> (e.g. coder model alias fast codex:luna)`,j=`List them: coder model list`;function M(e,t,n){if(!e)throw new c(`invalid-option`,`Missing model name.`,{hint:n});if(!/^[a-z][a-z0-9-]*$/.test(e))throw new c(`invalid-option`,`Invalid model name "${e}". Use lowercase kebab-case (e.g. qwen-local).`);if(S.has(e)||t===`model`&&g(e))throw new c(`invalid-option`,`"${e}" is reserved; pick another name.`)}async function N(e,n,r){M(n,`model`,O);let i=t(e).models?.[n];if(i)throw new c(`invalid-option`,a(i)?`Custom model "${n}" already exists.`:`"${n}" is already configured as an ${l(i)?`alias`:`entry`}; remove it first.`,{hint:`Change it: coder model update ${n} [--base-url|--model|--env-key], or remove it first.`});if(!r.baseUrl||!r.model)throw new c(`invalid-option`,`Missing --base-url or --model.`,{hint:O});return D(n,{baseUrl:o(r.baseUrl),model:r.model,...r.envKey?{envKey:r.envKey}:{}},h(e,r.workspace),e)}async function P(e,n,r){let i=n?t(e).models?.[n]:void 0,s=i&&a(i)?i:void 0;if(!n||!s)throw new c(`invalid-option`,n?`No custom model named "${n}".`:`Missing model name.`,{hint:n?j:k});if(!r.baseUrl&&!r.model&&!r.envKey)throw new c(`invalid-option`,`Nothing to update: pass --base-url, --model, or --env-key.`,{hint:k});return D(n,{...s,...r.baseUrl?{baseUrl:o(r.baseUrl)}:{},...r.model?{model:r.model}:{},...r.envKey?{envKey:r.envKey}:{}},h(e,r.workspace),e)}function F(e,n,a={}){if(!n||!t(e).models?.[n])throw new c(`invalid-option`,n?`No custom model named "${n}".`:`Missing model name.`,{hint:n?j:`Usage: coder model remove <name>`});let o=h(e,a.workspace);return r(o,e=>i(e,n)),{removed:n,file:o}}function I(e,r,i,o={}){M(r,`alias`,A);let s=t(e),l=s.models?.[r];if(l&&a(l))throw new c(`invalid-option`,`"${r}" is a custom model name; pick another alias name.`);if(!i)throw new c(`invalid-option`,`Missing alias spec.`,{hint:A});let p;try{p=n(i,s)}catch(e){throw new c(`invalid-option`,e instanceof Error?e.message:String(e),{hint:A})}if(!p||!p.model)throw new c(`invalid-option`,`Alias spec "${i}" does not resolve to a model.`,{hint:A});if(p.engine===`custom`)throw new c(`invalid-option`,`"${i}" names a custom model, which is already dispatchable by name; aliases target codex/claude models.`);let g=i.split(`:`).some(e=>u.has(e.trim())||d.has(e.trim())),_=p.engine===`claude`?m:f,v={provider:p.engine,model:_[p.model]??p.model,...g&&p.effort?{effort:p.effort}:{}},y=h(e,o.workspace);return w(y,e=>{e[r]=v}),{alias:r,...v,file:y}}function L(e,n,a={}){let o=n?t(e).models?.[n]:void 0;if(!n||!o||!l(o))throw new c(`invalid-option`,n?`No alias named "${n}".`:`Missing alias name.`,{hint:n?j:`Usage: coder model unalias <name>`});let s=h(e,a.workspace);return r(s,e=>i(e,n)),{unaliased:n,file:s}}function R(e,n,r,i={}){if(!n)throw new c(`invalid-option`,`Missing model name.`,{hint:`Usage: coder model ${r?`disable`:`enable`} <name>`});let o=!!t(e).models?.[n],s=h(e,i.workspace);return w(s,e=>{let t=e[n];if(!t){r?e[n]={disabled:!0}:o&&(e[n]={disabled:!1});return}a(t)||l(t)?r?t.disabled=!0:delete t.disabled:r?t.disabled=!0:delete e[n]}),{name:n,disabled:r,file:s}}const z={add:(e,t)=>N(y.resolve(t.cwd??`.`),e,t),update:(e,t)=>P(y.resolve(t.cwd??`.`),e,t),remove:(e,t={})=>F(y.resolve(t.cwd??`.`),e,t),list:(e={})=>E(y.resolve(e.cwd??`.`)),alias:(e,t,n={})=>I(y.resolve(n.cwd??`.`),e,t,n),unalias:(e,t={})=>L(y.resolve(t.cwd??`.`),e,t),disable:(e,t={})=>R(y.resolve(t.cwd??`.`),e,!0,t),enable:(e,t={})=>R(y.resolve(t.cwd??`.`),e,!1,t)};export{x as n,C as r,z as t};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import{Rt as e,Zt as t,en as n,qi as r,wi as i}from"./core-DwsAMCnL.js";import{$ as a,$t as o,Cn as s,Ct as c,En as l,F as u,I as d,K as f,O as p,P as m,Qt as h,Rt as g,Sn as _,St as v,U as y,Z as ee,_ as b,a as x,bt as S,cn as C,ct as w,d as T,dn as E,en as D,et as te,fn as O,g as k,gn as ne,gt as A,ht as re,i as ie,it as ae,j as oe,ln as se,mn as j,mt as ce,n as le,nn as ue,on as de,pn as M,pt as fe,q as pe,r as me,rn as he,st as ge,tt as _e,vn as ve,wn as ye,wt as be,x as xe,yn as Se}from"./errors-XBA-Ls4n.js";import N from"node:path";import P from"node:process";import{fileURLToPath as Ce}from"node:url";import F from"node:fs";import{spawn as we,spawnSync as I}from"node:child_process";import{createHash as Te,randomUUID as L}from"node:crypto";import R from"node:os";import Ee from"node:net";import De from"node:readline";import{setImmediate as Oe}from"node:timers/promises";var z=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 B={conversationCompactTokens:7e4,chain:[`codex`,`claude`,`custom`],engines:{codex:{model:`gpt-6.1-sol`,effort:`high`,permissions:`auto`},claude:{model:`opus`,effort:`medium`,permissions:`auto`}},models:{},approvals:{escalationTimeoutMs:12e4,allowedNetworkHosts:[]}},ke=B.chain[0],Ae=`__EMPTY__`,je=`Skipped: the agent chose not to reply.`,Me=`The agent returned no reply.`,Ne=e=>e===`failed`?0:e===`completed`?3:e===`cancelled`?2:1,Pe=(e,t)=>e<t?-1:+(e>t),Fe=(e,t)=>e.rank-t.rank||t.createdAt-e.createdAt||Pe(t.id,e.id);function Ie(e,t){if(!t||typeof t!=`object`||Array.isArray(t))return t;let n=e&&typeof e==`object`&&!Array.isArray(e)?Object.fromEntries(Object.entries(e)):{};for(let[e,r]of Object.entries(t))r===null?delete n[e]:Object.defineProperty(n,e,{value:Ie(Object.hasOwn(n,e)?n[e]:void 0,r),writable:!0,enumerable:!0,configurable:!0});return n}function Le(e,t){for(let n of Object.values(e??{}))n.repository=t}function Re(e){let t={...e.url?{url:e.url}:{command:e.command,args:e.args??[]},headers:Object.keys(e.headers??{}).sort(),env:Object.keys(e.env??{}).sort()};return Te(`sha256`).update(JSON.stringify(t)).digest(`hex`)}function ze(){try{let e=JSON.parse(F.readFileSync(b(`state`,`global`,`mcp-approvals.json`),`utf8`));return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}catch(e){if(e.code===`ENOENT`||e instanceof SyntaxError)return{};throw e}}function Be(e){return ze()[Re(e)]===!0}async function Ve(e,t,n){if(!t)throw Error(`Usage: coder connection approve <name> [--agent <id>]`);let r=G(e).mcp?.[t],i=[];r&&!n&&i.push(r);let{loadAgents:a}=await import(`./load-zhcrwSRF.js`).then(e=>e.s),{INTEGRATIONS:o}=await import(`./integrations-DyInAa5g.js`).then(e=>e.r);for(let r of await a(e,o,{includeDisabled:!0})){let e=r.definition.mcp?.[t];e&&(!n||r.id===n)&&i.push(e)}if(!i.length)throw Error(`No MCP server "${t}". Use --cwd to select its repository.`);if(i.some(e=>e.connection))throw Error(`MCP server "${t}" uses a connection and needs no repository approval.`);let s=new Set(i.map(Re));if(s.size!==1)throw Error(`MCP server "${t}" has different definitions. Select one with --agent <id>.`);let c=b(`state`,`global`,`mcp-approvals.json`);F.mkdirSync(N.dirname(c),{recursive:!0});let u=ze();return u[[...s][0]]=!0,l(c,u),F.chmodSync(c,384),{name:t,file:c}}function He(e){return!/\$\{[^}]+\}/.test(e)&&(/^(?:Bearer\s+\S+|ghp_|github_pat_|xox[a-z]-|sk-|lin_api_)/i.test(e)||/^[A-Za-z0-9_+\/.=-]{32,}$/.test(e))}function Ue(e,t){if(!t||typeof t!=`object`)return[];let{url:n,headers:r,env:i}=t,a=e=>e&&typeof e==`object`&&!Array.isArray(e)?Object.entries(e).filter(e=>typeof e[1]==`string`):[],o=[];typeof n==`string`&&[n,...a(r).map(([,e])=>e)].some(e=>/\$\{[^}]+\}/.test(e))&&o.push(`MCP server "${e}" keeps remote URL and header variables literal. Use a connection for credentials.`);for(let[t,n]of[[`headers`,r],[`env`,i]])for(let[r,i]of a(n))He(i)&&o.push(`MCP server "${e}" has a literal secret in ${t}.${r}. Use a connection instead.`);return o}const V={luna:`gpt-6-luna`,sol:`gpt-6.1-sol`,astra:`gpt-6-astra`},We=new Set([`low`,`medium`,`high`]),Ge={sonnet:`sonnet`,opus:`opus`,fable:`fable`},Ke=new Set([`low`,`medium`,`high`]),qe={"read-only":{sandbox:`read-only`,approvalPolicy:`never`,approvalMode:null},"workspace-write":{sandbox:`workspace-write`,approvalPolicy:`never`,approvalMode:null},auto:{sandbox:`workspace-write`,approvalPolicy:`on-request`,approvalMode:`auto`}},Je={"read-only":[`--permission-mode`,`dontAsk`,`--disallowedTools`,`Edit`,`Write`,`MultiEdit`,`NotebookEdit`],"workspace-write":[`--permission-mode`,`acceptEdits`],auto:[`--permission-mode`,`auto`]},Ye=[`--permission-mode`,`dontAsk`,`--disallowedTools`,`Edit`,`Write`,`MultiEdit`,`NotebookEdit`,`Bash`,`WebFetch`,`WebSearch`,`Task`],Xe=/failIfUnavailable|sandbox\b[^.\n]*?(?:failed|could ?n[o']t|cannot|unavailable|not available|not supported)/i,Ze=`CODER_MACHINE_SANDBOX`,Qe=new Set([`localhost`,`127.0.0.1`,`::1`,`[::1]`]);function $e(e){return e.flatMap(e=>Ee.isIPv6(e)?[`[${e}]`]:e.startsWith(`[`)||e.includes(`:`)||Ee.isIP(e)?[e]:[e,`*.${e}`])}function et(e,t,n=[],r=[],i=!0){let a=r.length?{permissions:{additionalDirectories:r}}:{};return JSON.stringify(i?e===`read-only`?{...a,sandbox:{enabled:!0,failIfUnavailable:!0,autoAllowBashIfSandboxed:!0,network:{strictAllowlist:!0},filesystem:{denyWrite:[t,...r]}}}:{...a,sandbox:{enabled:!0,autoAllowBashIfSandboxed:!0,network:{strictAllowlist:!0,...e===`auto`&&n.length?{allowedDomains:$e(n),...n.some(e=>Qe.has(e))?{allowLocalBinding:!0}:{}}:{}}}}:{permissions:{additionalDirectories:r,allow:[`Bash`],...e===`read-only`?{deny:[`Edit`,`Write`,`MultiEdit`,`NotebookEdit`]}:{}},sandbox:{enabled:!1}})}const tt=h([`codex`,`claude`]),nt=h([`codex`,`claude`,`custom`]),rt=h([`low`,`medium`,`high`]),it=h([`read-only`,`workspace-write`,`auto`]),at=se(M({model:j().check(e(1)),effort:rt,permissions:it})),ot=se(M({model:j().check(e(1)),effort:rt,permissions:it,network:D()})),st=M({baseUrl:ve(),model:j().check(e(1)),envKey:C(j().check(e(1))),wireApi:C(h([`chat`,`responses`])),disabled:C(D())}),ct=M({provider:tt,model:j().check(e(1)),effort:C(rt),disabled:C(D())}),lt=M({disabled:D()}),ut=ne([st,ct,lt]),dt=M({escalationTimeoutMs:de().check(t()),allowedNetworkHosts:o(j())}),ft=h([`read`,`write`]),pt=j().check(n(/^[a-z0-9][a-z0-9_-]*$/i,`agent or flow name`)),mt=M({allowedEvents:C(o(j()))}),ht=ne([D(),M({engine:C(j()),model:C(j()),effort:C(rt),permissions:C(it),access:C(ft),runner:C(h([`local`,`local-docker`,`vercel-sandbox`,`github-actions`])),integrations:C(E(j(),mt)),connections:C(o(j())),disabled:C(D())})]),gt=M({connection:C(j().check(e(1))),command:C(j().check(e(1))),args:C(o(j())),env:C(E(j(),j())),url:C(j().check(e(1))),type:C(h([`stdio`,`http`],{error:`Use type stdio or http; legacy SSE servers are not supported, use their streamable HTTP URL`})),headers:C(E(j(),j())),tools:C(o(j())),description:C(j())}).check(O(e=>e.connection?[e.url,e.command,e.args,e.env,e.headers,e.type].every(e=>e===void 0):!!e.command!=!!e.url,`Use a connection alone, without url, command, args, env, headers or type; otherwise supply one of command or url`)),_t=M({conversationCompactTokens:de().check(he(),t()),chain:o(nt).check(e(1)),engines:se(M({codex:ot,claude:at,custom:at})),models:C(E(j().check(n(/^[a-z0-9][a-z0-9./_-]*$/i,`model name`)),ut)),agents:C(E(pt,ht)),mcp:C(E(pt,gt)),approvals:dt}),vt=se(ue(_t,{approvals:se(dt)}));function H(e){return`baseUrl`in e}function yt(e){return`provider`in e}function bt(e,t){return t??e===`auto`}const xt=/^(?!-)[a-z0-9-]{1,63}(?<!-)(?:\.(?!-)[a-z0-9-]{1,63}(?<!-))*(?::\d{1,5})?$/i;function St(e){if(Ee.isIP(e))return!0;let t=/^\[([^\]]+)\](?::\d{1,5})?$/.exec(e);return t?Ee.isIPv6(t[1]):e.length<=253&&xt.test(e)}function Ct(e,t){delete e.models?.[t];for(let n of Object.values(e.engines??{}))n?.model===t&&delete n.model}function U(e){let t=vt.safeParse(e);if(!t.success)return t.error.issues.map(e=>`${e.path.join(`.`)||`config`}: ${e.message}`);let n=Et(B,t.data),r=[];for(let[e,n]of(t.data.approvals?.allowedNetworkHosts??[]).entries())St(n)||r.push(`approvals.allowedNetworkHosts.${e}: "${n}" is not a host name or IP address`);for(let[e,i]of Object.entries(t.data.models??{})){if(e===`codex`||e===`claude`||e===`custom`){r.push(`models.${e}: reserved engine name`);continue}if(yt(i)){let t=n.models?.[i.model];t&&!H(t)&&r.push(`models.${e}: alias target "${i.model}" is itself a config entry`)}}return r}function wt(e){if(!F.existsSync(e))return null;try{return JSON.parse(F.readFileSync(e,`utf8`))}catch(t){let n=t instanceof Error?t.message:String(t);throw Error(`Invalid JSON in ${e}: ${n}`)}}function Tt(e){return Et(B,e)}function Et(e,t){if(!t||typeof t!=`object`||Array.isArray(t))return t??e;let n={...e},r=e;for(let[e,i]of Object.entries(t))n[e]=i&&typeof i==`object`&&!Array.isArray(i)&&r?.[e]&&typeof r[e]==`object`?Et(r[e],i):i;return n}function W(){return b(`config.json`)}function Dt(e){return N.join(e,`.coder`,`config.json`)}const Ot=`CODER_WORKSPACE_CONFIG`;function kt(e,t){let n=t.approvals?.allowedNetworkHosts?.filter(t=>e.approvals.allowedNetworkHosts.includes(t)),r=Object.fromEntries(Object.entries(t.engines??{}).map(([e,t])=>[e,{...t?.model?{model:t.model}:{},...t?.effort?{effort:t.effort}:{}}])),i=Object.entries(t.models??{}).filter(([,e])=>e.disabled===!0);return{...t.mcp?{mcp:t.mcp}:{},...t.chain?{chain:t.chain.filter(t=>e.chain.includes(t))}:{},engines:r,models:Object.fromEntries(i.map(([e])=>[e,{disabled:!0}])),...n?{approvals:{...e.approvals,allowedNetworkHosts:n}}:{}}}function G(e){let t=f(e),n=process.env[Ot],r=[[W(),wt(W())],...n?[[`the workspace config`,JSON.parse(n)]]:[]],i=Dt(t);r.push([i,wt(i)]);let a=B,o=new Set;for(let[e,t]of r){if(!t)continue;let r=U(t);if(r.length)throw Error(`Invalid config in ${e}:\n ${r.join(`
|
|
2
|
+
`)}`);let s=n&&e===i?kt(a,t):t,c={...a.mcp,...s.mcp};for(let t of Object.keys(s.mcp??{}))e===i?o.add(t):o.delete(t);a={...Et(a,s),...Object.keys(c).length?{mcp:c}:{}}}let s=U(a);if(s.length)throw Error(`Invalid merged config:\n ${s.join(`
|
|
3
|
+
`)}`);for(let[e,t]of Object.entries(a.mcp??{}))Le({[e]:t},o.has(e));return a}function At(e){return e.replace(/\/+$/,``).replace(/\/(chat\/completions|completions|responses)$/,``)}function jt(e,t,n){let r=[Dt(f(e)),W()];for(let e of r){let r;try{r=wt(e)}catch{continue}if(r?.models?.[t])return Object.assign(r.models[t],n),!U(r).length&&(F.writeFileSync(e,`${JSON.stringify(r,null,2)}\n`,`utf8`),!0)}return!1}function Mt(e){return/\/(chat\/completions|completions|responses)\/*$/.test(e)}function Nt(e,t){let n=At(e);return Mt(e)||/\/v\d+(alpha|beta)?$/.test(n)?[`${n}/${t}`]:[`${n}/${t}`,`${n}/v1/${t}`]}function Pt(e,t,n){let r=t?e.models?.[t]:void 0;if(!t||!r||!H(r))return null;let i=`coder-${t}`;return{model:r.model,modelProvider:i,configOverrides:{[`model_providers.${i}`]:{name:t,base_url:n?.url??At(r.baseUrl),...r.envKey&&!n?{env_key:r.envKey}:{},wire_api:`responses`}}}}function Ft(e){return e?V[e]??e:null}function It(e){return e in V||e in Ge}function Lt(e,t){return!!(t&&e.models?.[t]?.disabled)}function Rt(e,t){if(Lt(e,t))throw Error(`model "${t}" is disabled in config`)}function zt(e,t){if(!e)return null;let n=String(e).trim().split(`:`).map(e=>e.trim());if(!n.length||n.length>3||n.some(e=>!e))throw Error(`Invalid engine spec "${e}".`);let r=null,i=null,a=null,o=e=>We.has(e)||Ke.has(e);for(let t of n)if(t===`codex`||t===`claude`||t===`custom`){if(r)throw Error(`Invalid engine spec "${e}".`);r=t}else if(o(t)&&!a)a=t;else if(!i)i=t;else throw Error(`Invalid engine spec "${e}".`);let s=i?t.models?.[i]:void 0;if(s&&yt(s)){if(s.disabled)throw Error(`model "${i}" is disabled in config`);if(r&&r!==s.provider)throw Error(`Alias "${i}" runs on ${s.provider}, not ${r}.`);r=s.provider,a=a??s.effort??null,i=s.model}r||=i&&i in Ge?`claude`:i&&s&&H(s)?`custom`:`codex`;let c=t.engines[r]??{},l=i??c.model??null;return Rt(t,l),{engine:r,model:l,effort:a??c.effort??null}}function Bt(e){let t=W();return F.mkdirSync(N.dirname(t),{recursive:!0}),F.writeFileSync(t,`${JSON.stringify(e,null,2)}\n`,`utf8`),t}function Vt(e,t){return t.split(`.`).reduce((e,t)=>e?.[t],e)}function Ht(e,t){return t?Dt(f(e)):W()}function Ut(e,t){let n=G(e);return t?Vt(n,t):n}function Wt(e,t,n,r={}){let i=Ht(e,r.workspace);Gt(i,e=>{let i=t.split(`.`),a=i.at(-1),o=e;for(let e of i.slice(0,-1))(typeof o[e]!=`object`||o[e]===null)&&(o[e]={}),o=o[e];r.unset?delete o[a]:o[a]=n});let a=Vt(G(e),t)??null;return{file:i,key:t,...r.unset?{unset:!0}:{value:n},effective:a}}function Gt(e,t){let n=F.existsSync(e)?JSON.parse(F.readFileSync(e,`utf8`)):{};t(n),n.models&&Object.keys(n.models).length===0&&delete n.models;let r=U(n);if(r.length)throw Error(`Refusing to write invalid config:\n ${r.join(`
|
|
4
|
+
`)}`);F.mkdirSync(N.dirname(e),{recursive:!0}),F.writeFileSync(e,`${JSON.stringify(n,null,2)}\n`,`utf8`)}const Kt={get:(e,t={})=>Ut(N.resolve(t.cwd??`.`),e),set:(e,t,n={})=>Wt(N.resolve(n.cwd??`.`),e,t,n)};function qt(e,t){let n=`${e}.${L()}.tmp`;F.writeFileSync(n,JSON.stringify(t),{flag:`wx`}),F.renameSync(n,e)}function Jt(e,t){let n=F.mkdtempSync(N.join(R.tmpdir(),e)),r=new Map,i=!1,a=()=>{try{for(let e of F.readdirSync(n)){if(!e.endsWith(`.request.json`))continue;let a=e.slice(0,-13),o=N.join(n,e),s=N.join(n,`${a}.response.json`);if(F.existsSync(s)){F.rmSync(o,{force:!0});continue}if(r.has(a))continue;let c=`${o}.processing`;F.renameSync(o,c);let l=(async()=>{let e;try{let n=JSON.parse(F.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}}}qt(s,e),F.rmSync(c,{force:!0})})();r.set(a,l),l.finally(()=>r.delete(a)).catch(()=>{})}}catch{}},o=ye(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 Oe(),!(!F.existsSync(n)||!F.readdirSync(n).some(e=>e.endsWith(`.reader`))||Date.now()>=e);)await o.wait(e-Date.now())}finally{o.close(),F.rmSync(n,{recursive:!0,force:!0})}}}}async function Yt(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=ye(i),o=N.join(i,`${L()}.reader`),s=!1;try{F.writeFileSync(o,``);let e=N.join(i,`${t.id}.response.json`);F.existsSync(e)||qt(N.join(i,`${t.id}.request.json`),t),s=!0;let c=Date.now()+n;await Oe();let l=await a.until(()=>{try{let n=JSON.parse(F.readFileSync(e,`utf8`));if((!t.command||n?.error?.retryable)&&F.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(!F.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(),F.rmSync(o,{force:!0})}}const Xt=/^([a-f0-9-]{36})\.(?:req|applying)\.json$/;function Zt(e){if(!e)return L();if(!e.task||!Number.isInteger(e.generation)||e.generation<0||!Number.isInteger(e.seq)||e.seq<0)throw Error(`Invalid command key`);let t=Te(`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 Qt=[`hint`,`taskId`,`payload`,`approval`,`result`,`runId`,`status`];function $t(e,t){let n=`${e}.${L()}.tmp`;F.writeFileSync(n,JSON.stringify(t),{encoding:`utf8`,flag:`wx`}),F.renameSync(n,e)}async function en(e,t,n){let{dir:r}=n,i=n.id??L(),a=N.join(r,`${i}.res.json`);F.existsSync(a)||$t(N.join(r,`${i}.req.json`),{kind:e,payload:t});let o=Date.now();for(;!F.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(F.readFileSync(a,`utf8`));if(n.keepReply||F.rmSync(a,{force:!0}),c){let{code:e,message:t,...n}=c;throw new z(e,t,n)}return s}function tn(e,t){F.mkdirSync(e,{recursive:!0});let n=new Set,r=async(r,i)=>{let a;try{let n=N.join(e,r);if(!F.lstatSync(n).isFile())throw Error(`mailbox request is not a regular file`);let{kind:o,payload:s}=JSON.parse(F.readFileSync(n,`utf8`)),c=N.join(e,`${i}.applying.json`);F.existsSync(c)||$t(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 z?e:void 0;a={error:{code:t?.code??`invalid-option`,message:e instanceof Error?e.message:String(e),...Object.fromEntries(Qt.flatMap(e=>t?.[e]===void 0?[]:[[e,t[e]]]))}}}try{$t(N.join(e,`${i}.res.json`),a),F.rmSync(N.join(e,`${i}.req.json`),{force:!0}),F.rmSync(N.join(e,`${i}.applying.json`),{force:!0}),n.delete(i)}catch{}},i=setInterval(()=>{let t=[];try{t=F.readdirSync(e)}catch{return}for(let i of t){let t=Xt.exec(i)?.[1];if(t){if(F.existsSync(N.join(e,`${t}.res.json`))){F.rmSync(N.join(e,i),{force:!0});continue}n.has(t)||(n.add(t),r(i,t))}}},100);return()=>clearInterval(i)}function nn(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 K(e,t,n){return Object.assign(Error(e),{retryable:t,...n===void 0?{}:{rpcCode:n}})}function rn(e,t,n,r){if(!e||e.id!==t||e.method!==`turn/steer`&&e.method!==`turn/interrupt`)throw K(`Invalid Codex control request.`,!1);let i=e.params;if(!i||typeof i!=`object`||i.threadId!==n)throw K(`Codex control request does not match its owning thread.`,!1);if(e.method===`turn/interrupt`){if(i.turnId!==r)throw K(`Codex turn/interrupt request does not match its owning active turn.`,!1);return{method:e.method,params:i}}if(i.expectedTurnId!==r)throw K(`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 K(`Invalid Codex turn/steer input schema.`,!1);return{method:e.method,params:i}}async function an(e,{threadId:t,turnId:n}){return Jt(`coder-codex-control-`,async(r,i)=>{if(i)throw K(`Codex owner endpoint is shutting down.`,!0);let a=rn(r,r.id,t,n);try{let n=await e.request(a.method,a.params);return a.method===`turn/interrupt`&&await e.request(`thread/backgroundTerminals/clean`,{threadId:t}),n}catch(e){throw K(e instanceof Error?e.message:String(e),nn(e),e.rpcCode)}})}function on(e){if(e?.startsWith(`file:`)&&e.length>5){let t=N.resolve(e.slice(5)),n=N.resolve(R.tmpdir());N.dirname(t)===n&&N.basename(t).startsWith(`coder-codex-control-`)&&F.rmSync(t,{recursive:!0,force:!0})}}async function sn(e,t,n,r=3e3,i){return Yt(e,{id:Zt(i),method:t,params:n,command:i},r,`Codex control`)}const cn=`Coder Task`;function ln(e,t=72){let n=String(e??``).trim().replace(/\s+/g,` `);return n?n.length<=t?n:`${n.slice(0,t-3)}...`:``}function un(e){let t=ln(e,56);return t?`${cn}: ${t}`:cn}function dn(e){return e?.params?.threadId??null}function fn(e){return e?.params?.turnId?e.params.turnId:e?.params?.turn?.id?e.params.turn.id:null}function pn(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 mn(e){try{let t=F.readFileSync(e,`utf8`),n=t?t.split(/\r\n|\r|\n/).length-+!!t.endsWith(`
|
|
5
|
+
`):0;return n>0?[n===1?`L1`:`L1-L${n}`]:[]}catch{return[]}}function hn(e,t,n){let r=typeof e.kind==`string`?e.kind:e.kind?.type??`change`,i=e.path||`(unknown path)`,a=pn(e.diff??``,r),o=a.length||r!==`add`||!t?a:mn(i),c=typeof e.kind==`object`&&e.kind?.move_path?` -> ${n?s(n,e.kind.move_path):e.kind.move_path}`:``;return`${r} ${n?s(n,i):i}${c}${o.length?` ${o.join(`, `)}`:``}`}function gn(e,t=!1,n){return(e.changes??[]).map(e=>hn(e,t,n)).join(`; `)}function _n(e){let t=e.trim().split(` `)[0]??``;return t===`/dev/null`?``:t.replace(/^[ab]\//,``)}function vn(e,t){let n=new Map,r=``,i=``;for(let t of e.split(/\r?\n/)){if(t.startsWith(`--- `)){r=_n(t.slice(4));continue}if(t.startsWith(`+++ `)){i=_n(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?s(t,e):e} ${n.join(`, `)}`).join(`; `)}function yn(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 bn(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 xn(e){return String(e??``).replace(/\s+/g,` `).trim()}function q(e){if(!e)return[];if(typeof e==`string`){let t=xn(e);return t?[t]:[]}if(Array.isArray(e))return e.flatMap(e=>q(e));if(typeof e==`object`){let t=e;if(typeof t.text==`string`)return q(t.text);if(`summary`in t)return q(t.summary);if(`content`in t)return q(t.content);if(`parts`in t)return q(t.parts)}return[]}function Sn(e,t){let n=[];for(let r of[...e,...t]){let e=xn(r);!e||n.includes(e)||n.push(e)}return n}function J(e,t,n=null,r={}){!e||t==null||e({message:t,phase:n,...r})}function Cn(e,t){t&&J(e,t.message,t.phase??null,t.extra??{})}function wn(e){return e.replace(/^\/(?:usr\/)?bin\/\w*sh\s+-l?c\s+/,``)}function Tn(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 Y(e){return e==null?``:typeof e==`string`?e:JSON.stringify(e)}function En(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?Y(n):``;return{message:r?`${t} ${r}`:t,phase:`investigating`,extra:{kind:`tool`,tool:t}}}function Dn(e,t){switch(e.type){case`commandExecution`:return{message:wn(String(e.command??``).trim())||`command`,phase:`running`,extra:{kind:`tool`,tool:`command`}};case`fileChange`:return{message:gn(e,!1,t)||`edit`,phase:`editing`,extra:{kind:`tool`,tool:`edit`}};case`mcpToolCall`:return{message:[`${e.server}/${e.tool}`,Y(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(`/`),Y(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()||Y(t);return{message:r?`search: ${r}`:`search`,phase:`investigating`,extra:{kind:`tool`,tool:`search`}}}case`agentMessage`:case`reasoning`:case`userMessage`:return null;default:return En(e)}}function On(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=q(e.summary).join(`
|
|
6
|
+
`);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:gn(e,!0,t)||`(details unavailable)`,phase:`editing`,extra:{kind:`tool-result`,tool:`edit`,isError:e.status!==`completed`}};case`mcpToolCall`:return{message:Y(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:Y(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:Y(e.error??e.result??e.results??e.output??e.action??e),phase:`investigating`,extra:{kind:`tool-result`,tool:Dn(e,t)?.extra?.tool,durationMs:e.durationMs,isError:e.status===`failed`||e.status===`declined`||e.success===!1||e.error!=null}}}}function kn(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 An(e){e.completionTimer&&=(clearTimeout(e.completionTimer),null)}function jn(e,t=null){e.completed||(An(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 Mn(e){e.completed||e.finalTurn||!e.finalAnswerSeen||e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||(An(e),e.completionTimer=setTimeout(()=>{e.completionTimer=null,!(e.completed||e.finalTurn||!e.finalAnswerSeen)&&(e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||jn(e,null))},250),e.completionTimer.unref?.())}function Nn(e,t){let n=dn(t);if(!n||!e.threadIds.has(n))return!1;let r=e.threadTurnIds.get(n)??null,i=fn(t);return r===null||i===null||i===r}function Pn(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),Mn(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,Mn(e)));return}if(t.type===`reasoning`&&n===`completed`){e.reasoningSummary=Sn(e.reasoningSummary,q(t.summary));return}if(t.type===`fileChange`&&n===`completed`){e.fileChanges.push(t);return}t.type===`commandExecution`&&n===`completed`&&e.commandExecutions.push(t)}function Fn(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),J(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()),Pn(e,t.params.item,`started`,t.params.threadId??null),Cn(e.onProgress,Tn(Dn(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(Pn(e,n,`completed`,t.params.threadId??null),n?.type===`fileChange`)for(let t of n.changes??[])t.path&&e.reportedChanges.add(s(e.cwd,t.path));let r=Tn(On(n,e.cwd),n);if(r?.extra?.kind===`tool-result`){let t=Dn(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()))})}Cn(e.onProgress,r);break}case`thread/tokenUsage/updated`:{let n=yn(t.params?.tokenUsage?.last),r=dn(t);r===e.threadId&&t.params?.tokenUsage?.last&&(e.contextTokens=n?.total);let i=yn(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=bn(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=vn(String(t.params?.diff??``),e.cwd).split(`; `).filter(t=>!e.reportedChanges.has(t.split(` `)[0]??``)).join(`; `);n&&n!==e.lastDiffSummary&&(e.lastDiffSummary=n,J(e.onProgress,`changed: ${n}`,`editing`,{kind:`status`}));break}case`item/autoApprovalReview/completed`:{let n=t.params?.review??{},r=t.params?.action??{},i=wn(String(r.command??r.type??``).trim());J(e.onProgress,`Auto-review ${n.status}. ${ln(i,48)}${n.rationale?`. ${ln(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,J(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),Mn(e);break}J(e.onProgress,`Turn ${t.params.turn.status}.`,`finalizing`,{kind:`status`}),jn(e,t.params.turn)}}async function In(e,t,n,r={}){let i=kn(t,r),a=e.notificationHandler;e.setNotificationHandler(e=>{if(!i.turnId){i.bufferedNotifications.push(e);return}if(e.method===`thread/started`){Fn(i,e);return}if(!Nn(i,e)){a?.(e);return}Fn(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)Nn(i,e)?Fn(i,e):a?.(e);i.bufferedNotifications.length=0,t.turn?.status&&t.turn.status!==`inProgress`&&jn(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{An(i),e.setNotificationHandler(a??null),e.setServerRequestHandler(null)}}function Ln(e,t,n=[]){return e!==`workspace-write`||!n.length?null:{type:`workspaceWrite`,writableRoots:n,networkAccess:t??!1}}function Rn(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 zn(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=>{J(r,`MCP server ${n} status unavailable. ${me(e)}`,null,{kind:`warning`})});for(let e of i?.data??[])e.name===n&&e.runtimeStatus===`failed`&&J(r,`MCP server ${e.name} failed to start. ${e.toolsError??``}`.trim(),null,{kind:`error`})}))}function Bn(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(`
|
|
7
|
+
`)}async function Vn(e,t,n={}){let r=n.connect??ce.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 X(e){let t=process.env.CODEX_AUTH_JSON;if(t){let e=N.join(R.homedir(),`.codex`),n=N.join(e,`auth.json`);if(!F.existsSync(n)){F.mkdirSync(e,{recursive:!0,mode:448});try{F.writeFileSync(n,t,{encoding:`utf8`,flag:`wx`,mode:384})}catch(e){if(e.code!==`EEXIST`)throw e}}}let n=re(`codex`,[`--version`],{cwd:e,env:g()});if(!n.available)return n;let r=re(`codex`,[`app-server`,`--help`],{cwd:e,env:g()});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 Hn(e){let t=X(e);if(!t.available)return{available:!1,loggedIn:!1,detail:t.detail};let n=null;try{n=await ce.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=I(`codex`,[`login`,`status`],{encoding:`utf8`,env:g()}),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 Un(e,{endpoint:t,threadId:n,turnId:r}){if(!n||!r)return{interrupted:!1,detail:`missing threadId or turnId`};let i=await sn(t,`turn/interrupt`,{threadId:n,turnId:r});return i.ok?{interrupted:!0,detail:`Interrupted ${r} on ${n}.`}:{interrupted:!1,detail:i.detail}}async function Wn(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 sn(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 Gn(e,t={},n={}){if(!t.availabilityChecked){let t=X(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={sandbox:i??`read-only`},o=t.configOverrides&&Object.keys(t.configOverrides).length?t.configOverrides:null,s=Ln(i,t.networkAccess,t.writableRoots),c=async n=>{let i=null,c;A(`codex.config.start`);let l=await n.request(`config/read`,{cwd:e,includeLayers:!1});A(`codex.config.done`);let u={...t.modelProvider?{}:{model_reasoning_summary:`auto`},...o,...Rn(t.mcpServers,Object.keys(l.config?.mcp_servers??{}),t.nativeMcp),...t.nativeMcp?{}:{"features.apps":!1,"features.plugins":!1}},d=t.developerInstructions?{developerInstructions:t.developerInstructions}:{},f;if(t.resumeThreadId&&(J(t.onProgress,`Resuming thread ${t.resumeThreadId}.`,`starting`,{kind:`status`}),ge(t.resumeThreadId)&&await w(t.resumeThreadId),f=await n.request(`thread/resume`,{threadId:t.resumeThreadId,cwd:e,model:t.model??null,modelProvider:t.modelProvider??null,config:u,approvalPolicy:t.approvalPolicy??`never`,...a,...t.approvalsReviewer?{approvalsReviewer:t.approvalsReviewer}:{},...d}).catch(e=>{J(t.onProgress,_e,`starting`,{kind:`warning`,detail:String(e?.message??e)})})),f)c=f.thread.id;else if(J(t.onProgress,`Starting Codex task thread.`,`starting`,{kind:`status`}),A(`codex.thread.start`),c=(await n.request(`thread/start`,{cwd:e,model:t.model??null,modelProvider:t.modelProvider??null,config:u,approvalPolicy:t.approvalPolicy??`never`,...a,...t.approvalsReviewer?{approvalsReviewer:t.approvalsReviewer}:{},...d,serviceName:`coder_runtime`,ephemeral:t.ephemeral??!1})).thread.id,!(t.ephemeral??!1))try{await n.request(`thread/name/set`,{threadId:c,name:un(r)})}catch(e){let t=String(e?.message??e??``);if(!t.includes(`unknown variant`)&&!t.includes(`unknown method`))throw e}A(`codex.thread.ready`),J(t.onProgress,`Thread ready (${c}).`,`starting`,{kind:`status`,threadId:c}),await zn(n,c,u.mcp_servers??{},t.onProgress);let p;try{p=await In(n,c,()=>n.request(`turn/start`,{threadId:c,input:[{type:`text`,text:r,text_elements:[]}],model:t.model??null,effort:t.effort??null,outputSchema:t.outputSchema??null,...s?{sandboxPolicy:s}:{}}),{cwd:e,onProgress:t.onProgress,onHeartbeat:t.onHeartbeat,onApprovalRequest:t.onApprovalRequest,onTurnStarted:t.onControlReady?async e=>{i=await an(n,{threadId:c,turnId:e}),t.onControlReady?.(i.endpoint,c,e)}:void 0}),A(`codex.result`),t.onResult?.({status:p.finalTurn?.status===`completed`?0:1,threadId:c,turnId:p.turnId,finalMessage:p.lastAgentMessage,error:p.error??p.finalTurn?.error??null})}finally{await i?.close()}return{status:p.finalTurn?.status===`completed`?0:1,threadId:c,turnId:p.turnId,finalMessage:p.lastAgentMessage,reasoningSummary:p.reasoningSummary,turn:p.finalTurn,error:p.error??p.finalTurn?.error??null,stderr:Bn(n.stderr),fileChanges:p.fileChanges,tokens:bn(p),contextTokens:p.contextTokens,model:t.model??null,commandExecutions:p.commandExecutions}},l=async e=>{e.setNoticeHandler?.(e=>J(t.onProgress,e,`starting`,{kind:`status`}));try{let t=await c(e);return ie(t.error?.message)&&await Kn(e),t}catch(t){throw ie(me(t))&&await Kn(e),t}},u=()=>Vn(e,l,{...n,networkAccess:t.networkAccess,nativeMcp:t.nativeMcp}),d=!1,f=()=>(d=!0,J(t.onProgress,`Codex login changed; restarted the Codex app-server and retrying the turn once.`,`starting`,{kind:`status`}),u());try{let e=await u().catch(e=>{if(!ie(me(e)))throw e;return f()}),n=!e.fileChanges?.length&&!e.commandExecutions.length;!d&&n&&ie(e.error?.message)&&(e=await f());let r=le(e.error?.message,t.model);return r?{...e,error:{...e.error,message:r}}:e}catch(e){let n=le(me(e),t.model);throw n?Error(n):e}}async function Kn(e){e.transport===`broker`&&await e.request(fe,{}).catch(()=>{})}const qn=`@wular/coder`,Jn=`https://registry.npmjs.org/${qn}/latest`,Yn={npm:[`npm`,`install`,`-g`,`${qn}@latest`],pnpm:[`pnpm`,`add`,`-g`,`${qn}@latest`],yarn:[`yarn`,`global`,`add`,`${qn}@latest`],bun:[`bun`,`add`,`-g`,`${qn}@latest`]};function Xn(){return k(`update-check.json`)}function Zn(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 Qn(){try{return JSON.parse(F.readFileSync(Xn(),`utf8`))}catch{return null}}function $n(e){try{F.mkdirSync(k(),{recursive:!0}),F.writeFileSync(Xn(),JSON.stringify(e))}catch{}}function er(){try{F.rmSync(Xn(),{force:!0})}catch{}}function tr(e,t){if(P.env.CODER_NO_UPDATE_CHECK||P.env.CI)return;let n=Qn();if(!n?.checkedAt||Date.now()-n.checkedAt>864e5)try{we(P.execPath,[t,`upgrade`,`refresh`],{detached:!0,stdio:`ignore`}).unref()}catch{}return n?.latest&&Zn(n.latest,e)>0?n.latest:void 0}async function nr(e){let t=Qn()?.latest??null;try{let e=await fetch(Jn,{signal:AbortSignal.timeout(3e3),headers:{accept:`application/json`}});if(e.ok){let n=await e.json();n?.version&&(t=n.version)}}catch{}$n({checkedAt:Date.now(),latest:t,current:e})}function rr(e){let t=e;try{t=F.realpathSync(e)}catch{}let n=t.replace(/\\/g,`/`);return/\/\.bun\//.test(n)?{pm:`bun`,command:Yn.bun}:/\/\.pnpm\//.test(n)||/\/pnpm(-global)?\//i.test(n)||/\/Library\/pnpm\//.test(n)?{pm:`pnpm`,command:Yn.pnpm}:/\/\.config\/yarn\/global\//.test(n)||/\/yarn\/global\//.test(n)||/\/Yarn\/Data\/global\//.test(n)?{pm:`yarn`,command:Yn.yarn}:{pm:`npm`,command:Yn.npm}}var ir=r({MIN_CODEX_VERSION:()=>fr,agentsSkillDir:()=>or,ensureCodexInstalled:()=>dr,ensureCodexUpToDate:()=>gr,installAgentsSkill:()=>cr,installClaudePlugin:()=>ar,modelVersionWarning:()=>hr,parseVersion:()=>mr,readAgentsSkillVersion:()=>sr,registerCodexMcp:()=>lr,registerCursorMcp:()=>ur,setupHost:()=>yr,setupHostCore:()=>_r,upgradeCore:()=>vr});function ar(e){I(`claude`,[`plugin`,`marketplace`,`remove`,`coder-plugins`],{encoding:`utf8`});let t=I(`claude`,[`plugin`,`marketplace`,`add`,e],{encoding:`utf8`}),n=I(`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 or(){return N.join(R.homedir(),`.agents`,`skills`,`coder`)}function sr(){try{let e=F.readFileSync(N.join(or(),`SKILL.md`),`utf8`);return/^\s*version:\s*(\S+)/m.exec(e)?.[1]??null}catch{return null}}function cr(e){let t=or();try{let n=N.join(e,`plugins`,`agents`,`skills`,`coder`);F.rmSync(t,{recursive:!0,force:!0}),F.mkdirSync(t,{recursive:!0}),F.cpSync(n,t,{recursive:!0});let r=N.join(t,`SKILL.md`),i=F.readFileSync(r,`utf8`).replace(`
|
|
8
|
+
---
|
|
9
|
+
`,`\nmetadata:\n version: ${c()}\n---\n`);return F.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 lr(){let e=`codex`;if(I(`codex`,[`mcp`,`get`,`coder`],{encoding:`utf8`}).status===0)return{marketplace:e,installed:!0,note:`Coder MCP server already registered with Codex.`};let t=I(`codex`,[`mcp`,`add`,`coder`,`--`,`coder`,`mcp`],{encoding:`utf8`});return{marketplace:e,installed:t.status===0,note:t.status===0?`Coder MCP server registered with Codex; restart running sessions to load it.`:`MCP registration failed; run: codex mcp add coder -- coder mcp`}}function ur(){let e=N.join(R.homedir(),`.cursor`,`mcp.json`);try{let t=F.existsSync(e)?JSON.parse(F.readFileSync(e,`utf8`)):{},n=e=>typeof e==`object`&&!!e&&!Array.isArray(e);if(!n(t)||t.mcpServers!==void 0&&!n(t.mcpServers))throw Error(`Invalid MCP configuration`);let r=t.mcpServers??{};return Object.hasOwn(r,`coder`)?{marketplace:e,installed:!0,note:`Coder MCP server already registered with Cursor.`}:(F.mkdirSync(N.dirname(e),{recursive:!0}),F.writeFileSync(e,JSON.stringify({...t,mcpServers:{...r,coder:{type:`stdio`,command:`coder`,args:[`mcp`]}}},null,2)+`
|
|
10
|
+
`,{mode:384}),{marketplace:e,installed:!0,note:`Coder MCP server registered in ~/.cursor/mcp.json; restart running sessions to load it.`})}catch{return{marketplace:e,installed:!1,note:`MCP registration failed; merge a coder entry with command "coder" and args ["mcp"] into ~/.cursor/mcp.json.`}}}function dr(e){if(e.available)return null;let t=I(`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 fr=`0.159.1`,pr={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 mr(e){let t=/(\d+\.\d+\.\d+)/.exec(String(e??``));return t?t[1]:null}function hr(e,t,n){let r=t?pr[e][t]:void 0,i=mr(n.detail);return!r||!i||Zn(i,r)>=0?null:`${e} ${i} predates ${t} (needs ${r}), so it may fail or run another model. Run: ${e} update`}function gr(e){if(!e.available)return null;let t=mr(e.detail);if(!t||Zn(t,`0.159.1`)>=0)return null;let n=I(`codex`,[`update`],{encoding:`utf8`});return n.status!==0&&(n=I(`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 >= ${fr}); auto-update failed: ${(n.stderr||`codex/npm not found`).trim()}. Run: codex update`}}async function _r(e,t={},n){let r=t.hosts??[],i=r.find(e=>![`claude`,`agents`,`codex`,`cursor`].includes(e));if(i)throw new z(`invalid-option`,`Unknown host "${i}". Use claude, agents, codex or cursor.`,{hint:`Codex, Pi, OpenCode, and other Agent Skills hosts: coder setup-host agents`});let a=e=>r.includes(e);n?.();let o=X(e),s=gr(o);s?.updated&&(o=X(e));let c=o.available?await Hn(e):{loggedIn:!1,detail:o.detail},l=Pr(),u=l.available?Fr():{loggedIn:!1,detail:l.detail},d=W();if(!F.existsSync(d)){let e=o.available?[`codex`,`claude`]:l.available?[`claude`,`codex`]:[`codex`,`claude`];Bt({...B,chain:e})}let f=be(),p=a(`claude`)?ar(f):null,m=a(`agents`)||a(`codex`)||a(`cursor`)?cr(f):null,h=[];(a(`codex`)||o.available&&(a(`agents`)||!r.length))&&h.push(lr()),(a(`cursor`)||!r.length&&F.existsSync(N.join(R.homedir(),`.cursor`)))&&h.push(ur()),p&&h.push({...p,note:p.installed?`Coder MCP server is declared by the Claude Code plugin.`:`Install the Claude Code plugin to register its Coder MCP server.`});let g=G(e),_=o.available&&c.loggedIn||l.available&&u.loggedIn;return{codex:{available:o.available,detail:o.detail,auth:c.detail,loggedIn:c.loggedIn},...s?{codexUpdate:s}:{},claude:{available:l.available,detail:l.detail,auth:u.detail,loggedIn:u.loggedIn},configFile:d,runtime:Ce(new URL(`../bin/coder.mjs`,import.meta.url)),...p?{claudePlugin:p}:{},...m?{agentsSkill:m}:{},mcp:h,config:g,ready:_}}async function vr(e={},t){let n=!e.pluginsOnly,r=!e.cliOnly,i=be(),a=N.join(i,`plugins/claude/.claude-plugin/plugin.json`),o={cli:c(),claude:v(a)},s={};if(n){let n=rr(S),[r,...i]=e.pm&&Yn[e.pm]||n.command,a=e.pm??n.pm;t?.(`via ${a}`);let l=I(r,i,{encoding:`utf8`});if(l.error?.code===`ENOENT`)throw new z(`invalid-option`,`${a} not found on PATH. Re-run with --pm <npm|pnpm|yarn|bun>, or update manually: ${r} ${i.join(` `)}`);if(l.status!==0){let e=(l.stderr||l.stdout||``).trim();throw new z(`invalid-option`,`CLI update failed (${a}).${e?`\n${e}`:``}\nRun manually: ${r} ${i.join(` `)}`)}er();let u=c();s.cli={pm:a,from:o.cli,to:u,changed:u!==o.cli}}if(r){if(e.claude||!e.codex&&Pr().available){let e=ar(i);s.claudePlugin={installed:e.installed,note:e.note,from:o.claude,to:v(a)}}if(F.existsSync(or())){let e=sr(),t=cr(i);s.agentsSkill={installed:t.installed,note:t.note,from:e,to:sr()}}}return s}function yr(e=[],t={}){return _r(N.resolve(t.cwd??`.`),{hosts:e})}function br(){let e=process.env.CLAUDE_CONFIG_DIR||N.join(R.homedir(),`.claude`);return N.join(e,`projects`)}async function xr(e,t,n){if(!/^[a-zA-Z0-9_-]+$/.test(e))return null;let r=n?N.join(n,`projects`):br(),i=null;for(let n of await F.promises.readdir(r).catch(()=>[])){let a=N.join(r,n,`${e}.jsonl`);if(!F.existsSync(a))continue;let o=F.createReadStream(a,{encoding:`utf8`}),s=De.createInterface({input:o,crlfDelay:1/0});try{for await(let e of s){let n;try{n=JSON.parse(e)}catch{continue}n.type===`assistant`&&!n.isSidechain&&Date.parse(n.timestamp)>=t&&(i=n.message?.usage??null)}}finally{s.close(),o.destroy()}}return i}function Sr(e){if(!e)return!1;let t=br(),n=!1;try{for(let r of F.readdirSync(t)){let i=N.join(t,r,`${e}.jsonl`);F.existsSync(i)&&(F.rmSync(i,{force:!0}),n=!0)}}catch{}return n}const Cr=`coder-mcp-status`,wr=new Map,Tr=`CODER_CLAUDE_VERSION`;function Er(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 Dr(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 Or(e,t,n=!1){if(!t)return[];let r;try{r=F.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=Dr(r.slice(0,e))+1,s=Math.max(1,Dr(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 kr(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 Ar(e,t,n){let r=String(t.file_path??t.notebook_path??t.path??``),i=r?N.isAbsolute(r)?r:N.resolve(n,r):``,a=r?s(n,i)||r:`(unknown path)`,o=t.path?` in ${s(n,String(t.path))}`:``;if(e===`Write`){let e=Dr(String(t.content??``));return`Write ${a} ${e?`L1-L${e}`:`(empty file)`}`}if(e===`Edit`){let e=Or(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=>Or(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)}: `:``}${kr(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 c=Object.entries(t??{}).map(([e,t])=>`${e}=${kr(t)}`).join(` `);return c?`${e} ${c}`: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 jr(e,t,n){let r=P.platform===`win32`?t[Object.keys(t).sort().find(e=>e.toLowerCase()===`path`)??`PATH`]??P.env.PATH??``:t.PATH??`/usr/bin:/bin`,i=/[\\/]/.test(e)?[``]:[...P.platform===`win32`?[n]:[],...r.split(N.delimiter)],a=P.platform===`win32`&&!N.extname(e)?[``,...(t.PATHEXT??`.EXE;.COM`).split(`;`)]:[``];for(let t of i)for(let r of a){let i=N.resolve(n,t,e+r);try{if(F.accessSync(i,F.constants.X_OK),F.statSync(i).isFile())return F.realpathSync(i)}catch{}}return N.resolve(n,e)}function Mr(e,t){let n=jr(`claude`,g(e),t),r=wr.get(n);return{[Tr]:r===void 0?void 0:JSON.stringify({executable:n,detail:r})}}function Nr(e,t,n){let r=jr(e,t,n),i=wr.get(r);if(i!==void 0)return i;try{let e=JSON.parse(t[Tr]??`null`);if(e?.executable===r&&typeof e.detail==`string`)return wr.set(r,e.detail),e.detail}catch{}return Pr(e,t,n).detail}function Pr(e=`claude`,t=P.env,n=P.cwd()){t=g(t);let r=jr(e,t,n),i=I(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 wr.set(r,o),{available:a,detail:o}}function Fr(){if(P.env.CLAUDE_CODE_OAUTH_TOKEN)return{loggedIn:!0,detail:`CLAUDE_CODE_OAUTH_TOKEN configured`};if(P.env.ANTHROPIC_API_KEY)return{loggedIn:!0,detail:`ANTHROPIC_API_KEY configured`};let e=I(`claude`,[`auth`,`status`,`--json`],{encoding:`utf8`,env:g()});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`}}}const Ir=(e,t)=>[`mcp`,e,...t===void 0?[]:[t]].map(e=>e.replace(/[^A-Za-z0-9_-]/g,`_`)).join(`__`),Lr=`coder-approval`;function Rr(e,t){let n=t.permissions??`auto`,r=t.mcpServers??[],i={};n===`auto`&&t.approvalTaskId&&(i[Lr]={type:`stdio`,command:P.execPath,args:[S,`task`,`mcp`,t.approvalTaskId,`--cwd`,e],env:{[li]:`1`}});for(let e of r)i[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 i}function zr(e,t,n,r,i,a){let o=[`-p`,`--input-format`,`stream-json`,`--output-format`,`stream-json`,`--verbose`,`--replay-user-messages`],s=mr(i);if(s&&Zn(s,`2.1.94`)>=0&&o.push(`--thinking-display`,`summarized`),o.push(t.resumeSessionId?`--resume`:`--session-id`,n),t.model&&o.push(`--model`,t.model),t.effort&&o.push(`--effort`,t.effort),t.systemPrompt&&o.push(`--append-system-prompt-file`,a??N.join(t.taskRoot??e,`.claude-system.md`)),t.excludeDynamicSections&&o.push(`--exclude-dynamic-system-prompt-sections`),t.settingSources&&o.push(`--setting-sources`,t.settingSources),t.outputSchema){let{$schema:e,...n}=t.outputSchema;o.push(`--json-schema`,JSON.stringify(n))}let c=t.permissions??`auto`,l=t.additionalDirectories??[],u=c===`read-only`?t.readOnlyAllowedTools??[]:[],d=t.mcpServers??[],f=Rr(e,t),p=c===`auto`&&t.approvalTaskId,m=d.flatMap(e=>e.tools?.length?e.tools.map(t=>Ir(e.name,t)):[Ir(e.name)]),h=(t.deniedMcpTools??[]).map(([e,t])=>Ir(e,t)),g=Object.keys(f).length?[`--mcp-config`,r??N.join(t.taskRoot??e,`.claude-mcp.json`)]:t.nativeMcp?[]:[`--mcp-config`,`{"mcpServers":{}}`];t.nativeMcp||o.push(`--strict-mcp-config`,`--no-chrome`),p?(o.push(`--permission-mode`,`default`,...g,`--permission-prompt-tool`,Ir(Lr,`approval_prompt`)),m.length&&o.push(`--allowedTools`,...m)):u.length?o.push(...Ye.filter(e=>P.env.CODER_MACHINE_SANDBOX!==`1`||e!==`Bash`),...g,`--allowedTools`,...u,...m):(o.push(...Je[c]??Je.auto,...g),m.length&&o.push(`--allowedTools`,...m)),h.length&&o.push(`--disallowedTools`,...h);for(let e of l)o.push(`--add-dir`,e);let _=et(c,e,t.allowedNetworkHosts??[],l,P.env[Ze]!==`1`),v={..._?JSON.parse(_):{},...t.nativeMcp?{}:{disableClaudeAiConnectors:!0},...t.promptCacheTtl&&s&&Zn(s,`2.1.242`)>=0?{promptCacheTtl:t.promptCacheTtl}:{}};return Object.keys(v).length&&o.push(`--settings`,JSON.stringify(v)),o}function Br(e,t){return Object.assign(Error(e),{retryable:t})}function Vr(e,t){let n=t&&Zt(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 Hr(e){let t=!0;return{sendInitial(t,n){return new Promise((r,i)=>{e(`${JSON.stringify(Vr(t,n))}\n`,e=>{e?i(e):r()})})},sendSteer(n,r){return t?new Promise((t,i)=>{e(`${JSON.stringify(Vr(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(Br(`Failed to write Claude live steer: ${e.message}`,r))})}):Promise.reject(Br(`Claude turn is no longer accepting live input.`,!0))},stopAccepting(){t=!1}}}async function Ur(e){return Jt(`coder-claude-steer-`,async(t,n)=>{if(n)throw Br(`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 Br(`Invalid Claude steer request.`,!1);return await e(r,t.command),{accepted:!0}})}async function Wr(e,t,n=3e3,r){if(!t.trim())return{steered:!1,retryable:!1,detail:`empty follow-up`};let i=await Yt(e,{id:Zt(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 Gr(e,t){let n=await Kr(e,t);return!t.resumeSessionId||!n.error?.message?.includes(`No conversation found with session ID`)?n:(t.onProgress?.({kind:`warning`,message:_e}),Kr(e,{...t,resumeSessionId:null}))}async function Kr(e,t){let n=t.resumeSessionId??L(),r=Rr(e,t),i=Object.keys(r).length?N.join(t.taskRoot??e,`.claude-mcp-${L()}.json`):void 0,a=t.systemPrompt?N.join(t.taskRoot??e,`.claude-system-${L()}.md`):void 0;for(let[e,n]of[[i,`${JSON.stringify({mcpServers:r})}\n`],[a,t.systemPrompt]])e&&(F.mkdirSync(N.dirname(e),{recursive:!0}),F.writeFileSync(e,n,{encoding:`utf8`,flag:`wx`,mode:384}));A(`claude.prepare`,{resume:!!t.resumeSessionId});let o=g({...P.env,...t.env}),s=zr(e,t,n,i,Nr(t.executable??`claude`,o,e),a),c=()=>{for(let e of[i,a])if(e)try{F.unlinkSync(e)}catch{}};return t.onProgress?.({kind:`status`,message:`claude turn started (session ${n})`,threadId:n}),new Promise((r,i)=>{let a=Date.now();A(`claude.spawn`);let l=we(t.executable??`claude`,s,{cwd:e,stdio:[`pipe`,`pipe`,`pipe`],env:o}),u=``,d=``,f=[],p=null,m=n,h=null,g=!1,_=Hr((e,t)=>l.stdin.write(e,t)),v=Date.now(),y=new Map,ee=0,b=0,x=null,S,C=0,w=n=>{if(!(!n||typeof n!=`object`)){if(c(),t.onHeartbeat?.(),n.type===`system`&&n.subtype===`init`&&n.session_id)m=n.session_id,n.mcp_servers?.some(e=>e.status===`failed`)&&l.stdin.write(`${JSON.stringify({type:`control_request`,request_id:Cr,request:{subtype:`mcp_status`}})}\n`);else if(n.type===`control_response`&&n.response?.request_id===Cr)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`?(S=e.message?.id,x=e.message?.usage):e?.type===`message_delta`&&(x={...x,...e.usage});let t=Z(x);b=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){(!S||S!==n.message?.id)&&(x=null),S=n.message?.id,(!x||r&&r.input+r.cachedInput>0)&&(x=n.message?.usage);let e=Z(x);b=e?e.input+e.cachedInput:0}if(r){ee+=r.output;let e=r.input+r.cachedInput+ee;(!C||e-C>=1e3)&&(C=e,t.onProgress?.({kind:`usage`,tokens:{...r,output:ee,total:e},threadId:m}))}for(let r of n.message?.content??[])if(r?.type===`tool_use`||r?.type?.endsWith(`_tool_use`)){let n=String(r.name??`Tool`);r.id&&y.set(String(r.id),{name:n,at:Date.now()}),t.onProgress?.({kind:`tool`,tool:n,...r.id?{callId:String(r.id)}:{},message:Ar(n,r.input??{},e),threadId:m})}else if(r?.type===`tool_result`||r?.type?.endsWith(`_tool_result`)){let e=Er(r.content).trim(),n=r.is_error===!0||r.content?.type?.endsWith(`_error`)===!0,i=r.tool_use_id?y.get(String(r.tool_use_id)):void 0;r.tool_use_id&&y.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:m})}else n.type===`assistant`&&r?.type===`text`&&typeof r.text==`string`&&r.text.trim()?t.onProgress?.({kind:`assistant`,message:r.text.trim(),threadId:m}):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()-v),threadId:m})}else n.type===`result`&&(A(`claude.result`),p=n,t.onResult?.({status:n.is_error||f.length?1:0,threadId:n.session_id??m,finalMessage:n.structured_output===void 0?String(n.result??``).trim():JSON.stringify(n.structured_output),error:n.is_error||f.length?{message:f[0]||String(n.result??``)}:null}),n.session_id&&(m=n.session_id),_.stopAccepting(),l.stdin.end());v=Date.now()}};l.stdout.on(`data`,e=>{u+=e;let t;for(;(t=u.indexOf(`
|
|
11
|
+
`))>=0;){let e=u.slice(0,t).trim();if(u=u.slice(t+1),e)try{w(JSON.parse(e))}catch(e){f.push(`Invalid Claude stream-json output: ${e instanceof Error?e.message:String(e)}`)}}}),l.stderr.on(`data`,e=>{d+=e});let T=()=>{_.stopAccepting(),l.kill(`SIGTERM`),c();let e=h?.endpoint;e?.startsWith(`file:`)&&F.rmSync(e.slice(5),{recursive:!0,force:!0}),P.exit(143)};P.on(`SIGTERM`,T),(async()=>{t.onSteerReady&&(h=await Ur((e,t)=>_.sendSteer(e,t))),await _.sendInitial(t.prompt,t.command),h&&t.onSteerReady?.(h.endpoint)})().catch(e=>{g||(g=!0,_.stopAccepting(),l.kill(`SIGTERM`),c(),P.removeListener(`SIGTERM`,T),h?.close(),i(e))}),l.on(`error`,e=>{g||(g=!0,_.stopAccepting(),P.removeListener(`SIGTERM`,T),c(),h?.close(),i(Error(`claude spawn failed: ${e.message}`)))}),l.on(`close`,async e=>{if(g)return;g=!0,_.stopAccepting(),P.removeListener(`SIGTERM`,T),c(),A(`claude.exit`),await h?.close(),A(`claude.teardown.done`);let n=u.trim();if(n)try{w(JSON.parse(n))}catch(e){f.push(`Invalid trailing Claude stream-json output: ${e instanceof Error?e.message:String(e)}`)}let i=p?.structured_output===void 0?(p?.result??``).trim():JSON.stringify(p.structured_output),s=e!==0||p?.is_error===!0||p==null||f.length>0;A(`claude.usage.start`);let l=Z(p?.usage);if(!b&&p){let e=Z(await xr(m,a,o.CLAUDE_CONFIG_DIR).catch(()=>null)),t=e&&e.input+e.cachedInput>0?e:l;b=t?t.input+t.cachedInput:0}A(`claude.usage.done`),r({status:+!!s,threadId:p?.session_id??m,turnId:null,finalMessage:i,tokens:l,contextTokens:b,model:p?.modelUsage&&Object.keys(p.modelUsage).join(`+`)||t.model||null,error:s?{message:f[0]||i||d.trim()||`claude exited ${e}`}:null})})})}const qr=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(`.`)),Jr=[/\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)/],Yr=new Set([`status`,`log`,`diff`,`show`,`blame`,`rev-parse`,`ls-files`,`ls-tree`,`cat-file`,`describe`,`shortlog`,`grep`,`branch`,`stash`]);function Xr(e){return e.match(/^\s*(?:ba|z|da)?sh\s+(?:-[a-zA-Z]+\s+)*(?:-c\s+)?(["'])([\s\S]*)\1\s*$/)?.[2]??e}function Zr(e){return e.trim().split(/\s+/).filter(Boolean)}function Qr(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 Yr.has(t)?{decision:`accept`,reason:`git ${t} is read-only`}:qr.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 $r(e,t={}){let n=Xr(String(e??``));if(!n.trim())return{decision:`escalate`,reason:`empty command`};for(let e of Jr)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=$r(n,t);if(r.decision===`decline`)return r;r.decision===`escalate`&&(e=r)}return e}let i=Zr(n),a=N.basename(i[0]??``);if(a===`git`)return Qr(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 ei(e,t){if(!e.length)return{decision:`escalate`,reason:`file change with no resolvable paths`};for(let n of e){let e=N.resolve(t,n),r=N.relative(t,e);if(r.startsWith(`..`)||N.isAbsolute(r))return{decision:`escalate`,reason:`path outside workspace: ${n}`};if(r===`.git`||r.startsWith(`.git${N.sep}`))return{decision:`decline`,reason:`direct .git modification: ${n}`}}return{decision:`accept`,reason:`all paths inside workspace`}}function ti(e){return N.join(e,`approvals`)}function ni(e){let t=ti(e);return F.existsSync(t)?F.readdirSync(t).filter(e=>e.endsWith(`.request.json`)).flatMap(e=>{let n=e.replace(/\.request\.json$/,``),r=_(N.join(t,e));if(!r)return[];let i=_(N.join(t,`${n}.response.json`));return[{...r,id:n,response:i}]}).sort((e,t)=>String(e.createdAt??``).localeCompare(String(t.createdAt??``))):[]}function ri(e,t,n){let r=ti(e),i=N.join(r,`${t}.request.json`);if(!F.existsSync(i))throw Error(`No pending approval "${t}" for this task.`);F.writeFileSync(N.join(r,`${t}.response.json`),`${JSON.stringify({decision:n,answeredAt:new Date().toISOString()},null,2)}\n`,`utf8`)}async function ii(e,t,{timeoutMs:n,onEvent:r}){let i=ti(e);F.mkdirSync(i,{recursive:!0});let a=`apr-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`;F.writeFileSync(N.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 ${N.basename(e)} ${a} [--deny]`});let o=N.join(i,`${a}.response.json`),s=await ye(i).until(()=>_(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 ai(e,t={}){return ii(e,{method:`simulate`,summary:`simulated approval probe (--simulate-approval)`},{timeoutMs:t.timeoutMs??12e4,onEvent:t.onEvent??null})}function oi({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=$r(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=ei(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 ii(t,u,{timeoutMs:r,onEvent:a}):d.decision}}}const si=/usage|quota|rate.?limit|429|401|unauthorized|not authenticated|login|insufficient|exhausted|not available|\bat capacity\b|ENOENT/i;function ci(e){return si.test(e)&&!x(e)}const li=`CODER_WORKER`;var ui=class extends Error{engine;detail;constructor(e,t){super(t),this.engine=e,this.detail=t}};function di(e,t){let n=e.engine,r=!!n,i=e.model,a=e.effort,o=e=>{let n=e?t.models?.[e]:void 0;return n&&yt(n)?n:void 0},s=e=>{let n=e?t.models?.[e]:void 0;return n&&H(n)?n:void 0},c=e=>{try{return zt(e,t)}catch(e){throw new z(`invalid-option`,e instanceof Error?e.message:String(e))}};if(o(i)){let e=c(i);e&&(r||(n=e.engine),i=e.model??void 0,a=a??e.effort??void 0)}if(!n&&i&&(i in Ge?n=`claude`:i in V?n=`codex`:s(i)?n=`custom`:/^(?:claude-|opus|sonnet|haiku|fable)/i.test(i)&&(n=`claude`)),n=n??t.chain[0]??`codex`,n!==`codex`&&n!==`claude`&&n!==`custom`){let e=n in V||n in Ge||n in(t.models??{})?` "${n}" is a model; use --model ${n}.`:``;throw new z(`invalid-option`,`Invalid --engine "${n}". Use codex, claude, or custom.${e}`)}let l=t.engines[n]??{},u=i??l.model??null,d=a??l.effort??null;if(o(u)){let e=c(u);e&&(r||(n=e.engine),u=e.model,d=a??e.effort??d)}let f=e.permissions??l.permissions??`auto`;try{Rt(t,u)}catch(e){throw new z(`invalid-option`,e instanceof Error?e.message:String(e))}if(n===`custom`){let e=Object.entries(t.models??{}).filter(([,e])=>H(e)).map(([e])=>e);if(!u&&e.length===1&&(u=e[0]),!u||!s(u))throw new z(`invalid-option`,u?`No custom model named "${u}". 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 p=n===`claude`;if(!(f in qe))throw new z(`invalid-option`,`Invalid --permissions "${f}". Use one of: ${Object.keys(qe).join(`, `)}`);if(!p&&d&&!We.has(d))throw new z(`invalid-option`,`Invalid codex --effort "${d}". Use one of: ${[...We].join(`, `)}`);if(p&&d&&!Ke.has(d))throw new z(`invalid-option`,`Invalid claude --effort "${d}". Use one of: ${[...Ke].join(`, `)}`);return{engine:n,model:u,effort:d,permissions:f}}const{connection:fi,description:pi,...mi}=gt.shape,hi=M({name:j().check(e(1)),...mi}).check(O(e=>!!e.command!=!!e.url,`one of command or url`)),gi=o(hi);function _i(e,t={}){let n=e.trim();return/^[\[{]/.test(n)?yi(n):(n===`all`?Object.keys(t):n.split(`,`).map(e=>e.trim()).filter(Boolean)).map(e=>{let n=t[e];if(!n)throw new z(`invalid-option`,`Unknown MCP server "${e}".`,{hint:`configured: ${Object.keys(t).join(`, `)||`none`}; or pass a JSON array`});return{name:e,...n}})}function vi(e,t={},n={},r={}){typeof e==`string`&&!e.trim()&&(e=void 0);let i=typeof e==`string`?_i(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(...Ue(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 yi(e){let t;try{t=JSON.parse(e)}catch(e){throw new z(`invalid-option`,`Invalid --mcp JSON: ${e instanceof Error?e.message:String(e)}`)}let n=gi.safeParse(t);if(!n.success)throw new z(`invalid-option`,`Invalid --mcp value: ${i(n.error)}`,{hint:`--mcp '[{"name":"docs","command":"npx","args":["-y","docs-mcp"],"tools":["search"]}]'`});return n.data}function bi(e,t=P.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=>P.stderr.write(`coder: ${e}\n`));return(e??[]).flatMap(e=>{let r=e.repository&&!e.resolved;if(r){for(let t of Ue(e.name,e))o(t);if(!i&&!Be(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(N.sep)?[N.resolve(n,f.command)]:(f.env?.PATH??t.PATH??`/usr/bin:/bin`).split(N.delimiter).map(e=>N.resolve(n,e,f.command))).find(e=>{try{return F.accessSync(e,F.constants.X_OK),F.statSync(e).isFile()}catch{return!1}});if(!p)throw new z(`invalid-option`,`MCP server "${e.name}" command cannot be resolved.`);return f.command=F.realpathSync(p),f.args=f.args?.map(e=>{if(e.startsWith(`-`)||N.isAbsolute(e))return e;let t=N.resolve(n,e),r=F.existsSync(t)&&F.statSync(t).isFile();return!r&&!e.startsWith(`./`)&&!e.startsWith(`../`)?e:r?F.realpathSync(t):t}),[f]})}function xi(e,t=[]){let n=[...new Set(t.map(t=>N.resolve(e,t)))];for(let e of n)if(!F.statSync(e,{throwIfNoEntry:!1})?.isDirectory())throw new z(`invalid-option`,`--add-dir ${e} is not a directory.`);return n}function Si(e,t){return e===`read-only`&&Xe.test(t??``)}const Ci=[`read-only`,`workspace-write`,`auto`];function wi(e,t,n){if(!t)return n.permissions;if(Ci.indexOf(t)>Ci.indexOf(n.permissions))throw new z(`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 Ti(e,t,n={},r=!1){let i=y(e,t),o=F.openSync(N.join(i,`worker.log`),`a`),s={...P.env,...n};A(`worker.spawn`,{taskId:t});let c=we(P.execPath,[S,`task`,`worker`,t,`--cwd`,e],{cwd:e,detached:!0,stdio:[`ignore`,o,o,`ipc`],env:{...s,...Mr(s,e),[li]:`1`,CODER_ENGINE_CHECKED:r?`1`:void 0}});return c.on(`error`,()=>{}),c.unref(),c.channel?.unref?.(),F.closeSync(o),a(e,t,{pid:c.pid??null}),c}async function Ei(e,t,n,r,i){let o=n.cwd,s=n.availability?.[t.engine===`custom`?`codex`:t.engine]??(t.engine===`claude`?Pr(`claude`,{...P.env,...n.connectionEnv},o):X(o)),c=t.model?e.models?.[t.model]:void 0;if(!s.available&&c&&H(c)){let e=dr(s);n.onNote?.(e.note),s=X(o)}if(!s.available)throw new ui(t.engine,s.detail);let l=c?null:t.engine===`claude`?hr(`claude`,t.model,s):hr(`codex`,Ft(t.model),s);l&&n.onNote?.(l);let d=n.addDirs??[],f=n.taskId??xe(),h=n.resume?.engine===t.engine?n.resume:void 0,g=a(o,f,{status:`queued`,...n.taskId?{dispatchId:L()}:{},name:r.name??null,system:n.system??null,promptParts:{cwd:o,...n.agentPrompt,instructions:n.system??void 0,conversation:n.conversation,local:P.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:h?.threadId??null,...h?{threadId:h.threadId,...h.previousThreadIds?{previousThreadIds:h.previousThreadIds}:{},...h.pendingRollover?{pendingRollover:h.pendingRollover}:{}}:{},cwd:o,...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,...d.length?{addDirs:d}:{}});for(let e of new Set(n.mcpWarnings??[]))T(o,f,{kind:`warning`,message:e});n.resume&&!h&&T(o,f,{kind:`warning`,message:_e});let v=N.join(y(o,f),`log.jsonl`),b=F.existsSync(v)?F.statSync(v).size:0,x=Ti(o,f,n.connectionEnv,!0);if(n.onWorker?.(f,x),!i)return{taskId:f,task:p(o,f)??g,engine:t.engine,startupCheck:`pending`};let S=ee(o,f,x),C=Se(v,b),w=!1,E=!1,D=()=>{let e=C().map(e=>{try{return JSON.parse(e)}catch{return{kind:`unknown`}}});return E||=e.some(e=>e.kind===`tool`||e.kind===`reply`),e.some(e=>e.phase!==`starting`&&![`status`,`usage`].includes(e.kind??``))},te=Date.now()+15e3,O,k=g;try{for(;Date.now()<(O===void 0?te:O+5e3)&&(k=p(o,f)??k,!(ae.includes(k.status)||u(o,f).at(-1)?.status===0||ni(y(o,f)).some(e=>!e.response)||(w=D()||w,k.threadId&&(O??=Date.now(),w))));)await S.wait(Math.min(3e4,(O===void 0?te:O+5e3)-Date.now()))}finally{S.close()}if(k.status===`failed`){D();let e=N.join(y(o,f),`result.json`),n=_(e),r=n?.error?.message??``,i=m(o,f,5).map(e=>e.message??``).join(`
|
|
12
|
+
`),a=r||i;throw Si(t.permissions,a)?new z(`read-only-unavailable`,a):ci(a)&&!Ai(n,E)?new ui(t.engine,a):new z(`startup-failed`,a,{taskId:f})}return{taskId:f,task:k,engine:t.engine,startupCheck:k.threadId?`passed`:`pending`}}function Di(e,t,n,r,i){return{error:`${e} failed to start: ${t}`,fallback:{action:`run-native-subagent`,reason:`no-engine-available`,permissions:n,instructions:`Mention the engine failure to the user, including any limit reset time. If your harness has a native subagent facility, spawn one subagent with fallback.task verbatim, prefixed with: "NEVER run git write operations (commit, checkout, stash, reset, push, etc.); leave changes uncommitted." If fallback.permissions is "read-only", append: "Investigate and report without modifying anything." If it is "workspace-write", append: "Never touch anything outside the workspace." Relay its output when it completes. If your harness has no native subagent facility, report the failure and stop; do not implement the task yourself.`,note:`Every coder engine failed to start. Spawn your own native subagent and forward the task verbatim; tell it to never run git write operations (commit, checkout, stash, reset, push, ...) and to honor the permissions.`,...r?{system:r}:{},task:i}}}async function Oi(e,t={}){if(P.env.CODER_WORKER)throw new z(`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 z(`invalid-option`,`outputSchema must be an object.`);if(!e.prompt.trim())throw new z(`invalid-option`,`Missing task text.`,{hint:[`Usage: coder run "<task text>"`,`Help: coder task run --help`]});e={...e,addDirs:xi(e.cwd,e.addDirs)};let n=t.config??G(e.cwd),r=vi(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=di(a,n);try{return await Ei(n,r,i,o,t.waitForStartup!==!1)}catch(t){if(!(t instanceof ui))throw t;let i=ki(t.engine,n);if(!i){let n=Di(t.engine,t.detail,r.permissions,e.system,e.prompt);throw new z(`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 ki(e,t){return t.chain.slice(t.chain.indexOf(e)+1).find(e=>e!==`custom`||Object.values(t.models??{}).some(H))}function Ai(e,t=!1){return!!(t||e?.fileChanges?.length||e?.commandExecutions?.length)}function ji(e,t,n){if(t.status!==`failed`)return;let r=t.result;if(!r||!ci(r.error?.message??``))return;let i=Date.parse(t.turns.at(-2)?.at??t.task.resumedAt??t.task.createdAt);if(!Ai(r,m(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 ki(t.task.engine,n??G(e))??null}function Mi(e,t){return _(N.join(y(e,t),`result.json`))}function Ni(e,t,n=0){if(n===0)return[];let r=m(e,t,2**53-1);return n===`all`?r:pe(r,n)}function Pi(e,t,n={}){let r=p(e,t);if(!r)throw Error(`No task found for "${t}".`);return{taskId:t,status:r.status,result:te.includes(r.status)?null:Mi(e,t),steps:Ni(e,t,n.tail),turns:u(e,t),task:r}}async function Fi(e,t,n={}){let r=p(e,t);if(!r)throw Error(`No task found for "${t}".`);let i=await Ii(e,r,1e3,n);if(i.reason===`approval`){let e=i.approval;throw new z(`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:Mi(e,t),steps:Ni(e,t,n.tail),turns:u(e,t),task:a}}async function Ii(e,t,n=1e3,{turn:r,worker:i,rollover:a=!1,signal:o}={}){let s=t,c=ee(e,t.id,i);try{let t=oe();for(;;){o?.throwIfAborted(),s=p(e,s.id)??s;let i=r===void 0?void 0:u(e,s.id)[r];if(s=i?{...s,status:i.status===0?`completed`:`failed`}:d(e,s,t),a?!s.rollingOver:ae.includes(s.status))return{task:s,reason:`terminal`};let l=ni(y(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()}}function Li(e=P.stdout){try{return e.getWindowSize?.()[0]??e.columns}catch{return e.columns}}function Ri(e=P.stdout){try{return e.getWindowSize?.()[1]??e.rows}catch{return e.rows}}function zi(e){return e>=768&&e<=879||e>=8203&&e<=8207||e>=65024&&e<=65039?0:e>=4352&&e<=4447||e>=11904&&e<=42191||e>=44032&&e<=55203||e>=63744&&e<=64255||e>=65072&&e<=65103||e>=65280&&e<=65376||e>=65504&&e<=65510||e>=127744&&e<=129791||e>=131072&&e<=262141?2:1}function Bi(e){let t=0;for(let n of e.replace(/\x1b\[[0-9;]*m/g,``))t+=zi(n.codePointAt(0));return t}function Vi(e,t){let n=0;for(let r=0;r<e.length;){let i=e[r]===`\x1B`?/^\x1b\[[0-9;]*m/.exec(e.slice(r)):null;if(i){r+=i[0].length;continue}let a=String.fromCodePoint(e.codePointAt(r)),o=zi(a.codePointAt(0));if(n+o>t)return r;n+=o,r+=a.length}return e.length}function Hi(e,t,n){if(t<4||n<1)return[e];let r=[],i=e;for(;Bi(i)>t;){if(r.length===n-1)return[...r,`${i.slice(0,Vi(i,t-1))}…`];let e=Vi(i,t),a=i.lastIndexOf(` `,e),o=a>t*.66?a:e;r.push(i.slice(0,o).trimEnd()),i=i.slice(o).replace(/^\s+/,``)}return[...r,i]}function Ui(e,t){let n=0,r=``;for(let i=0;i<e.length;){let a=e[i]===`\x1B`?/^\x1b\[[0-9;]*m/.exec(e.slice(i)):null;if(a){r+=a[0],i+=a[0].length;continue}let o=e.codePointAt(i),s=String.fromCodePoint(o),c=zi(o);if(n+c>t-1)return`${r}\x1b[0m${Q.dim(`…`)}`;r+=s,n+=c,i+=s.length}return r}function Wi(){let e=P.stdin;if(!e.isTTY||!P.stdout.isTTY)return()=>{};e.setRawMode(!0),e.resume();let t=e=>{e.includes(3)&&P.kill(P.pid,`SIGINT`),e.includes(26)&&P.kill(P.pid,`SIGTSTP`)};return e.on(`data`,t),e.unref(),()=>{e.off(`data`,t),e.isTTY&&e.setRawMode(!1),e.pause()}}var Gi=class{stream;quietMs;lines=[];painted=[];paintedWidths=[];paintedCols;resizeTimer;tty;constructor(e=P.stdout,t=250){this.stream=e,this.quietMs=t,this.tty=!!e.isTTY,this.tty&&e.on(`resize`,this.onResize)}set(e){this.lines=e,!(!this.tty||this.resizeTimer)&&this.paint()}commit(e){this.clear(),this.stream.write(e)}clear(){if(!this.painted.length)return;let e=Li(this.stream),t=this.painted.length;e&&this.paintedCols&&e!==this.paintedCols&&(t=this.paintedWidths.reduce((t,n)=>t+Math.max(1,Math.ceil(n/e)),0)),this.stream.write(`\x1b[${t}A\x1b[0J`),this.painted=[],this.paintedWidths=[]}done(){this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=void 0,this.paint()),this.tty&&this.stream.off(`resize`,this.onResize)}paint(){this.clear();let e=Li(this.stream),t=e?this.lines.map(t=>Ui(t,e-1)):this.lines,n=Ri(this.stream);n&&t.length>n-1&&(t=n>1?t.slice(-(n-1)):[]);for(let e of t)this.stream.write(`${e}\n`);this.painted=t,this.paintedWidths=t.map(Bi),this.paintedCols=e}onResize=()=>{this.clear(),this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=setTimeout(()=>{this.resizeTimer=void 0,this.paint()},this.quietMs),this.resizeTimer.unref?.()}};function Ki(e){let t=P.env.FORCE_COLOR,n=t!=null&&t!==``&&t!==`0`||t!==`0`&&e.isTTY&&!P.env.NO_COLOR,r=(e,t)=>n?`\x1b[${e}m${t}\x1b[0m`:t;return{blue:e=>r(`34`,e),bold:e=>r(`1`,e),cyan:e=>r(`36`,e),dim:e=>r(`2`,e),light:e=>r(`38;5;246`,e),green:e=>r(`32`,e),red:e=>r(`31`,e),yellow:e=>r(`33`,e)}}const Q=Ki(P.stdout),qi=Ki(P.stderr);function Ji(e,t=qi,n=t.blue,r=`Related`){let i=e.map(e=>{let t=e.search(/(?:\b[A-Z][A-Z0-9_]*=\S+\s+)*coder /);if(t===-1)return{text:e};let n=e.slice(0,t).trim().replace(/:$/,``);return{command:e.slice(t),label:n.charAt(0).toLowerCase()+n.slice(1)}}),a=Math.max(0,...i.map(e=>e.command?.length??0))+2;return[t.bold(`${r}:`),...i.map(e=>e.command===void 0?` ${t.dim(e.text)}`:` ${n(e.label?e.command.padEnd(a):e.command)}${t.dim(e.label)}`)].join(`
|
|
13
|
+
`)}function Yi(e,t={}){let n=typeof t==`number`?t:t.code??1,r=typeof t==`object`?t.hint:null,i=r==null?[]:Array.isArray(r)?r:[r];P.stderr.write(`${qi.red(e)}\n`),i.length&&P.stderr.write(`\n${Ji(i,qi)}\n`),P.exit(n)}function Xi(e){P.stdout.write(`${JSON.stringify(e,null,2)}\n`)}function Zi(e,t=Q){return(JSON.stringify(e,null,2)??`null`).split(`
|
|
14
|
+
`).map(e=>e.replace(/"((?:[^"\\]|\\.)*)":/g,(e,n)=>`${t.light(`"${n}"`)}:`).replace(/: (-?\d[\d.eE+-]*|true|false|null)(,?)$/,(e,n,r)=>`: ${t.blue(n)}${r}`)).join(`
|
|
15
|
+
`)}function Qi(e){let t=Math.floor(e/1e3);if(t<60)return`${t}s`;let n=Math.floor(t/60);return n<60?`${n}m`:`${Math.floor(n/60)}h${n%60}m`}function $i(e){let t=Math.max(0,Math.round(e/1e3)),n=t%60,r=Math.floor(t/60)%60,i=Math.floor(t/3600),a=e=>String(e).padStart(2,`0`);return i?`${i}:${a(r)}:${a(n)}`:`${r}:${a(n)}`}function $(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(+(e<1e4))}k`:`${(e/1e6).toFixed(1)}M`}function ea(e,t){let n=[`in ${$(e.input)}`,...e.cachedInput?[`cached ${$(e.cachedInput)}`]:[],`out ${$(e.output)}`];return`${$(e.total)} (${n.join(` · `)}) on ${t||`default model`}`}function ta(e){return`ctx ${$(e.input+e.cachedInput)} · out ${$(e.output)}`}function na(e,t){return e.length>t?`${e.slice(0,t-1)}…`:e.padEnd(t)}function ra(e,t){let n=[],r=e;for(;r.length>t;){let e=r.lastIndexOf(` `,t);e<=0&&(e=t),n.push(r.slice(0,e).trimEnd()),r=r.slice(e).trimStart()}return n.push(r),n}function ia(e,t,n={}){let r=`bold`in n?{style:n}:n,i=r.style??Q,a=t.length&&typeof t[0]==`object`&&t[0]!==null&&`rows`in t[0]?t:[{rows:t}],o=a.flatMap(e=>e.rows),s=e.length-1,c=e.map((e,t)=>t===s&&!r.border?0:Math.min(e.max??40,Math.max(e.header.length,...o.map(t=>e.value(t).length))));if(r.border){let t=r.width??Li()??120,n=c.slice(0,s).reduce((e,t)=>e+t+3,0)+4,i=Math.max(e[s].header.length,...o.map(t=>e[s].value(t).length));c[s]=Math.max(e[s].header.length,Math.min(i,t-n))}let l=(e,t,n)=>i.light(`${e}${c.map(e=>`─`.repeat(e+2)).join(t)}${n}`),u=e=>r.border?`${i.light(`│`)} ${e.join(` ${i.light(`│`)} `)} ${i.light(`│`)}`:e.join(` `),d=(e,t)=>t===s&&!r.border?e:na(e,c[t]),f=[];return r.border&&f.push(l(`┌`,`┬`,`┐`)),f.push(i.bold(i.light(u(e.map((e,t)=>d(e.header,t)))))),r.border&&f.push(l(`├`,`┼`,`┤`)),a.forEach((t,n)=>{n&&!r.border&&f.push(``),t.header&&f.push(r.border?`${i.light(`│`)} ${t.header}`:t.header),t.rows.forEach((n,i)=>{r.border&&(i||t.header)&&f.push(l(`├`,`┼`,`┤`));let a=e.map((e,t)=>r.border?ra(e.value(n),c[t]):[e.value(n)]),o=Math.max(...a.map(e=>e.length));for(let t=0;t<o;t++)f.push(u(e.map((e,r)=>{let i=d(a[r][t]??``,r);return e.paint&&a[r][t]!==void 0?e.paint(i,n):i})))})}),r.border&&f.push(l(`└`,`┴`,`┘`)),`${f.join(`
|
|
16
|
+
`)}\n`}function aa(e){return` ${Q.bold(Q.green(`✔`))} ${e}`}function oa(e){return` ${Q.bold(Q.red(`✘`))} ${e}`}function sa(e,t=0){let n=e.padEnd(t);return e===`running`?Q.green(n):e===`waiting-approval`?Q.yellow(n):e===`failed`||e===`cancelled`?Q.red(n):e===`completed`?Q.blue(n):Q.dim(n)}export{tr as $,bi as A,bt as At,ei as B,Be as Bt,li as C,G as Ct,Si as D,jt as Dt,Oi as E,zt as Et,Ii as F,Tt as Ft,Gr as G,Me as Gt,ni as H,Ue as Ht,Fi as I,Gt as It,Sr as J,Fe as Jt,Wr as K,je as Kt,ri as L,Bt as Lt,vi as M,W as Mt,Ti as N,Dt as Nt,Mi as O,Ct as Ot,ji as P,U as Pt,vr as Q,oi as R,Le as Rt,Hi as S,H as St,wi as T,At as Tt,ai as U,ke as Ut,ii as V,He as Vt,Pr as W,Ae as Wt,ir as X,Ie as Xt,dr as Y,Ne as Yt,yr as Z,z as Zt,Gi as _,Kt as _t,Qi as a,on as at,Ri as b,yt as bt,Zi as c,tn as ct,ta as d,Ye as dt,nr as et,aa as f,We as ft,ia as g,Ot as gt,Xi as h,qe as ht,Yi as i,Wn as it,di as j,Pt as jt,Pi as k,Ft as kt,$ as l,Ke as lt,sa as m,Ze as mt,na as n,Un as nt,$i as o,en as ot,Q as p,V as pt,br as q,Pe as qt,qi as r,Gn as rt,Ji as s,Zt as st,oa as t,X as tt,ea as u,Ge as ut,Wi as v,Ht as vt,Di as w,gt as wt,Bi as x,It as xt,Li as y,Nt as yt,$r as z,Ve as zt};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import{qi as e}from"./core-DwsAMCnL.js";import{_ as t}from"./errors-XBA-Ls4n.js";import{Zt as n,p as r,x as i,y as a}from"./output-D95NoAA9.js";import o from"node:path";import s from"node:process";import c from"node:fs";import{spawn as l}from"node:child_process";var u=class extends n{authenticate;needs;constructor(e,t,n=``,r,i){super(`server`,t,{status:e,...r?{hint:r}:{}}),this.authenticate=n,this.needs=i}};function d(e){try{let t=new URL(e).hostname.toLowerCase();return t===`localhost`||t===`[::1]`||/^127(?:\.\d{1,3}){3}$/.test(t)}catch{return!1}}function f(e){let t;try{t=new URL(e)}catch{throw new n(`invalid-option`,`Give the server as a URL, e.g. https://agents.example.com.`)}if(t.protocol!==`https:`&&!(t.protocol===`http:`&&d(t.origin)))throw new n(`invalid-option`,`Coder servers require HTTPS unless they are loopback.`,{hint:`Use https://, or http://localhost for a local server.`});if(t.username||t.password||t.search||t.hash)throw new n(`invalid-option`,`The server must be an origin without credentials, query, or fragment.`);return t.toString().replace(/\/+$/,``)}const p=(e,t)=>{let n=new URLSearchParams;`cursor`in t&&typeof t.cursor==`string`&&n.set(`cursor`,t.cursor);for(let[e,r]of Object.entries(t))e!==`cursor`&&r!==void 0&&r!==!1&&r!==``&&n.set(e,r===!0?`1`:Array.isArray(r)?r.join(`,`):String(r));return`${e}?${n}`},m=new Set([`completed`,`failed`,`cancelled`]);var h=class{url;fetchImpl;organization;renewal;onError;token;cookie;constructor(e,t,r={}){if(this.cookie=`cookie`in t,this.url=e?f(e):``,!this.cookie&&!this.url)throw new n(`invalid-option`,`Bearer clients need a server URL.`);this.token=`token`in t?t.token:void 0,this.fetchImpl=r.fetch??((e,t)=>fetch(e,t)),this.organization=r.organization,this.renewal=r.renewal,this.onError=r.onError}request(e,t={}){let n=this.read(e,t);return n.catch(()=>{}),n}async read(e,t){this.renewal&&this.renewal.expiresAt()-Date.now()<3e4&&(this.token=await this.renewal.renew());let r=await this.send(e,t);r.status===401&&this.renewal&&/invalid_token/.test(r.headers.get(`www-authenticate`)??``)&&(this.token=await this.renewal.renew(),r=await this.send(e,t));let i=await r.text().catch(()=>``),a={},o;try{i&&r.status!==204&&(a=JSON.parse(i))}catch{if(r.ok)throw new n(`server`,`The server answered ${r.status} with a body that is not JSON.`);this.cookie&&i&&(o=i)}if(!r.ok){let e=new u(r.status,a.error??a.message??o??`The server answered ${r.status}.`,r.headers.get(`www-authenticate`)??``,a.hint,a.needs===`key`?a.needs:void 0);throw this.onError?.(e),e}return a}send(e,t){let r=new Headers(t.headers);return t.body&&!r.has(`content-type`)&&r.set(`content-type`,`application/json`),this.cookie||r.set(`authorization`,`Bearer ${this.token}`),this.organization&&r.set(`x-coder-organization`,this.organization),this.fetchImpl(`${this.url}${e}`,{...t,headers:r,...this.cookie?{credentials:`same-origin`}:{}}).catch(e=>{throw e instanceof n||e.name===`AbortError`?e:new n(`server`,this.url?`No Coder server answers at ${this.url}: ${e.message}`:`The server did not answer. Check the connection and try again.`)})}post(e,t){return this.request(e,{method:`POST`,...t===void 0?{}:{body:JSON.stringify(t)}})}me(){return this.request(`/me`)}info(){return this.request(`/api/auth/capabilities`)}linkAccount(e){return this.post(`/connect`,{token:e})}signOut(){return this.post(`/api/auth/sign-out`,{})}agents={list:e=>this.request(p(`/admin/agents`,{...e,...e?.connect?{connect:1}:{}})),get:(e,t)=>this.request(p(`/admin/agents/${encodeURIComponent(e)}`,{...t?.versions===!1?{versions:0}:{},...t?.content===!1?{content:0}:{},...t?.handles?{handles:1}:{}})),versions:(e,t={})=>this.request(p(`/admin/agents/${encodeURIComponent(e)}/versions`,t)),remove:e=>this.request(`/admin/agents/${encodeURIComponent(e)}`,{method:`DELETE`}),preview:(e,t)=>this.request(p(`/admin/agents/import`,{repo:e,ref:t})),version:(e,t)=>this.request(`/admin/agents/${encodeURIComponent(e)}/versions/${t}`),put:(e,t)=>this.request(`/admin/agents/${encodeURIComponent(e)}`,{method:`PUT`,body:JSON.stringify(t)}).then(t=>({id:e,version:t.version,unchanged:t.unchanged,...t.apps?.length?{apps:t.apps}:{}})),settings:(e,t)=>this.request(`/admin/agents/${encodeURIComponent(e)}/settings`,{method:`PATCH`,body:JSON.stringify(t)}),import:(e,t,n)=>this.post(`/admin/agents/import`,{repo:e,ref:t,...n?{agents:n}:{}})};composer(){return this.request(`/admin/composer`)}folders={list:()=>this.request(`/admin/folders`),check:e=>this.post(`/admin/folders/check`,{path:e}),clone:e=>this.post(`/admin/folders/clone`,{url:e}),pick:()=>this.post(`/admin/folders/pick`,{})};tasks={list:e=>this.request(p(`/admin/tasks`,{limit:20,...e,...e?.archived?{archived:1}:{},...e?.summary?{summary:1}:{},...e?.counts?{counts:1}:{}})),get:e=>this.request(`/admin/tasks/${encodeURIComponent(e)}`),logs:(e,t=-1,n)=>this.request(p(`/admin/tasks/${encodeURIComponent(e)}/logs`,{after:t,limit:n})),stream:(e,t=-1,n)=>this.send(`/admin/tasks/${encodeURIComponent(e)}/stream?after=${t}`,{headers:{accept:`text/event-stream`},signal:n}),events:(e,t,n)=>this.send(p(`/admin/events`,{tasks:e}),{headers:{accept:`text/event-stream`,...t?{"last-event-id":t}:{}},signal:n}),cancel:e=>this.post(`/admin/tasks/${encodeURIComponent(e)}/cancel`),steer:(e,t,n={})=>this.post(`/admin/tasks/${encodeURIComponent(e)}/steer`,{text:t,...n}),ask:(e,t)=>this.post(`/admin/tasks/${encodeURIComponent(e)}/ask`,{question:t}),approve:(e,t,n)=>this.post(`/admin/tasks/${encodeURIComponent(e)}/approve`,{approvalId:t,decision:n}),archive:e=>this.post(`/admin/tasks/${encodeURIComponent(e)}/archive`),delete:e=>this.request(`/admin/tasks/${encodeURIComponent(e)}`,{method:`DELETE`}),create:e=>this.post(`/admin/tasks`,e),wait:async(e,t={})=>{let r=-1;for(;;){let i=await this.tasks.stream(e,r);if(!i.ok||!i.body){let t=await this.tasks.get(e);if(m.has(t.status))return t;if(i.status===401)continue;throw new n(`server`,`The task stream answered ${i.status}.`)}let a=!1;for await(let e of g(i.body))if(e.event===`log`){let n=JSON.parse(e.data);r=n.seq,t.onLog?.(n)}else e.event===`end`&&(a=!0);if(a)return this.tasks.get(e)}}};credentials={list:e=>this.request(p(`/admin/credentials`,e??{})),add:e=>this.post(`/admin/credentials`,e),remove:(e,{workspace:t}={})=>this.request(`/admin/credentials/${encodeURIComponent(e)}${t?`?workspace`:``}`,{method:`DELETE`}),login:e=>this.post(`/admin/logins`,{engine:e}),loginStatus:(e,t)=>this.request(`/admin/logins/${encodeURIComponent(e)}${t?`?state=${encodeURIComponent(t)}`:``}`),loginCode:(e,t)=>this.post(`/admin/logins/${encodeURIComponent(e)}`,{code:t}),cancelLogin:e=>this.request(`/admin/logins/${encodeURIComponent(e)}`,{method:`DELETE`})};runners={list:()=>this.request(`/admin/runners`),add:e=>this.post(`/admin/runners`,e),pair:e=>this.post(`/admin/runners/pair`,e),update:(e,t)=>this.request(`/admin/runners/${encodeURIComponent(e)}`,{method:`PATCH`,body:JSON.stringify(t)}),test:e=>this.post(`/admin/runners/${encodeURIComponent(e)}/test`,{}),remove:e=>this.request(`/admin/runners/${encodeURIComponent(e)}`,{method:`DELETE`})};integrations={list:e=>this.request(p(`/admin/integrations`,{agent:e}))};repositories={list:()=>this.request(`/admin/repositories`),refresh:()=>this.post(`/admin/repositories/refresh`,{})};engines={status:()=>this.request(`/admin/engines/status`),login:e=>this.post(`/admin/engines/${encodeURIComponent(e)}/login`,{}),logout:e=>this.post(`/admin/engines/${encodeURIComponent(e)}/logout`,{})};apps={list:e=>this.request(p(`/admin/apps`,{agent:e})),install:(e,t)=>this.post(p(`/admin/apps/${encodeURIComponent(e)}/install`,{back:t})),remove:e=>this.request(`/admin/apps/${encodeURIComponent(e)}`,{method:`DELETE`}),update:e=>this.post(`/admin/apps/${encodeURIComponent(e)}/update`,{}),drift:e=>this.request(`/admin/apps/${encodeURIComponent(e)}/drift`),create:(e,t)=>this.post(`/admin/apps/create/${encodeURIComponent(e)}`,t),start:(e,t)=>this.post(p(`/create/${encodeURIComponent(e)}`,t)),finish:(e,t)=>this.request(`/create/${encodeURIComponent(e)}/callback`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams(t)})};operator={apps:()=>this.request(`/admin/operator/apps`),setUp:(e,t)=>this.post(`/admin/operator/apps/${encodeURIComponent(e)}`,t),audit:()=>this.request(`/admin/operator/audit`)};installations={list:(e,t={})=>this.request(p(`/admin/installations`,{agent:e,limit:t.limit,...t.active?{active:1}:{}}))};connections={list:(e,t)=>this.request(p(`/admin/connections`,{authorization:e,wait:t})),add:e=>this.post(`/admin/connections`,e),update:(e,t)=>this.request(`/admin/connections/${encodeURIComponent(e)}`,{method:`PATCH`,body:JSON.stringify(t)}),remove:e=>this.request(`/admin/connections/${encodeURIComponent(e)}`,{method:`DELETE`}),authorize:e=>this.post(`/admin/connections/${encodeURIComponent(e)}/authorize`)};config={get:()=>this.request(`/admin/config`),patch:e=>this.request(`/admin/config`,{method:`PATCH`,headers:{"content-type":`application/merge-patch+json`},body:JSON.stringify(e)})};models={list:()=>this.request(`/admin/models`),add:e=>this.post(`/admin/models`,e),probe:e=>this.post(`/admin/models/probe`,e),remove:e=>this.request(`/admin/models/${encodeURIComponent(e)}`,{method:`DELETE`}),alias:(e,t)=>this.post(`/admin/models/${encodeURIComponent(e)}/alias`,{spec:t}),enable:e=>this.post(`/admin/models/${encodeURIComponent(e)}/enable`),disable:e=>this.post(`/admin/models/${encodeURIComponent(e)}/disable`)};mcp={search:e=>this.request(p(`/admin/mcp-registry`,{q:e}))};flows={list:e=>this.request(p(`/admin/flows`,{repo:e})),run:(e,t)=>this.post(`/admin/flows/${encodeURIComponent(e)}/run`,t)};pulls={list:e=>this.request(p(`/admin/pulls`,{repo:e}))};review(e){return this.post(`/admin/review`,e)}usage(e={}){return this.request(p(`/admin/usage/totals`,{...e,since:e.since??Date.now()-6048e5}))}usageRows(e){return this.request(p(`/admin/usage`,{installation:e}))}};async function*g(e){let t=new TextDecoder,n=``;for await(let r of e){n+=t.decode(r,{stream:!0});let e;for(;(e=n.indexOf(`
|
|
2
|
+
|
|
3
|
+
`))>=0;){let t=n.slice(0,e);n=n.slice(e+2);let r=`message`,i,a=[];for(let e of t.split(`
|
|
4
|
+
`))e.startsWith(`event: `)?r=e.slice(7):e.startsWith(`data: `)?a.push(e.slice(6)):e.startsWith(`id: `)&&(i=e.slice(4));(a.length||i)&&(yield{event:r,data:a.join(`
|
|
5
|
+
`),...i?{id:i}:{}})}}}function _(){return t(`session.json`)}function v(){try{let e=JSON.parse(c.readFileSync(_(),`utf8`));return Object.fromEntries(Object.entries(e).filter(e=>!!(e[1].token&&e[1].refreshToken&&e[1].user)))}catch{return{}}}function y(){try{return JSON.parse(c.readFileSync(_(),`utf8`))}catch{return{}}}const b=e=>e.replace(/\/+$/,``),x=`https://coder.wular.ai`,S=e=>b((e===!0?void 0:e)??process.env.CODER_SERVER??`https://coder.wular.ai`);function C(e){return f(S(e))}function w(e){let t=b(e);return t===`https://coder.wular.ai`||!!y()[t]}function T(e){let t=y(),n=b(e),r=t[n]??{};O({...t,[n]:{...r,confirmedAt:Date.now()}})}function E(e){return v()[b(e)]}function D(e){let t=y(),n=Object.fromEntries(Object.entries(t).map(([e,t])=>[e,{confirmedAt:t.confirmedAt??Date.now()}]));O(Object.fromEntries(Object.entries({...n,...e}).map(([e,n])=>[e,{...n,...t[e]?{confirmedAt:t[e].confirmedAt??Date.now()}:{}}])))}function O(e){let t=_();c.mkdirSync(o.dirname(t),{recursive:!0}),c.writeFileSync(t,`${JSON.stringify(e,null,2)}\n`,{mode:384}),c.chmodSync(t,384)}var k=e({PromptCancelled:()=>M,ask:()=>B,askSecret:()=>z,canPrompt:()=>N,openUrl:()=>V,pick:()=>L,pickDetailed:()=>R});function A(e){let t=a()??80;return Math.max(1,Math.ceil(i(e)/t))}const j={tab:[` `],up:[`\x1B[A`,`k`],down:[`\x1B[B`,`j`],enter:[`\r`,`
|
|
6
|
+
`],space:[` `],backspace:[``,`\b`],cancel:[``,`\x1B`]};var M=class extends Error{constructor(){super(`Cancelled.`)}};function N(){return!!(s.stdin.isTTY&&s.stdout.isTTY)}function P(e){let t=[];for(let n=0;n<e.length;)if(e[n]===`\x1B`&&e[n+1]===`[`){let r=n+2;for(;r<e.length&&!/[@-~]/.test(e[r]);)r++;t.push(e.slice(n,r+1)),n=r+1}else t.push(e[n]),n++;return t}const F=[];function I(){return F.length?Promise.resolve(F.shift()):new Promise(e=>{let t=n=>{s.stdin.off(`data`,t);let r=P(n.toString(`utf8`));F.push(...r.slice(1)),e(r[0])};s.stdin.on(`data`,t)})}async function L(e){return(await R(e)).values}async function R(e){let t=r,n=s.stdout,i=Math.max(3,e.window??8),a=new Set(e.selected??[]),o=Math.max(0,e.options.findIndex(e=>a.has(e.value))),c=0,l=``,u=0,d=``,f=new Map(e.options.flatMap(e=>e.input?.value?[[e.value,e.input.value]]:[])),p=!1,m=e.options.some(e=>e.input),h=()=>e.options.filter(e=>!l||e.value.toLowerCase().includes(l.toLowerCase())||(e.label??``).toLowerCase().includes(l.toLowerCase())),g=(r=!1)=>{u&&n.write(`\x1b[${u}A\x1b[J`);let s=h();o=Math.min(o,Math.max(0,s.length-1)),o<c&&(c=o),o>=c+i&&(c=o-i+1);let g=m?` · tab to edit`:``,_=p?`type to edit · enter when done · esc to discard`:e.multi?`↑↓ to move · space to toggle · type to filter${g} · enter to continue · esc to cancel`:`↑↓ to move · type to filter${g} · enter to choose · esc to cancel`,v=[`${t.bold(e.title)} ${t.dim(_)}`];if(r){let r=[...a].map(e=>f.get(e)?`${e} (${f.get(e)})`:e).join(`, `)||`-`;n.write(`${t.green(`✔`)} ${t.bold(e.title)} ${t.cyan(r)}\n\n`),u=0;return}e.hint&&v.push(` ${t.light(e.hint)}`),e.multi&&v.push(` ${t.light(`selected:`)} ${[...a].join(`, `)||t.dim(`none`)}`),l&&v.push(` ${t.light(`filter:`)} ${l}${t.dim(`▏`)}`),s.length||v.push(` ${t.dim(`no matches`)}`),c>0&&v.push(` ${t.dim(`↑ ${c} more`)}`);let y=Math.max(0,...s.map(e=>(e.label??e.value).length));s.slice(c,c+i).forEach((n,r)=>{let i=c+r===o,s=`${e.multi?a.has(n.value)?`◉`:`◯`:i?`●`:`○`} ${(n.label??n.value).padEnd(y)}${n.hint?` ${t.light(n.hint)}`:``}`,l=f.get(n.value)??``,u=n.input&&(l||i&&p)?` ${t.light(`${n.input.label}:`)} ${l}${i&&p?t.dim(`▏`):``}`:n.input&&i&&n.input.placeholder?` ${t.dim(n.input.placeholder)}`:``;v.push(`${i?t.cyan(`❯ `):` `}${i?t.cyan(s):s}${u}`)});let b=s.length-(c+i);b>0&&v.push(` ${t.dim(`↓ ${b} more`)}`),d&&v.push(` ${t.red(d)}`),n.write(`${v.join(`
|
|
7
|
+
`)}\n`),u=v.reduce((e,t)=>e+A(t),0)},_=s.stdin,v=_.isRaw;_.setRawMode(!0),_.resume(),n.write(`\x1B[?25l`);try{for(g();;){let t=await I();d=``;let n=h(),r=n[o];if(p&&r?.input){let e=f.get(r.value)??``;if(j.cancel.includes(t))f.delete(r.value),p=!1;else if(j.enter.includes(t)){let t=e?r.input.validate?.(e):void 0;t?d=t:p=!1}else j.backspace.includes(t)?f.set(r.value,e.slice(0,-1)):t.length===1&&t>=` `&&f.set(r.value,e+t);g();continue}if(j.cancel.includes(t))throw new M;if(j.tab.includes(t)&&r?.input){p=!0,e.multi&&a.add(r.value),g();continue}if(j.up.includes(t)&&!(t===`k`&&l))o=Math.max(0,o-1);else if(j.down.includes(t)&&!(t===`j`&&l))o=Math.min(n.length-1,o+1);else if(j.enter.includes(t))if(!e.multi&&n[o]&&(a.clear(),a.add(n[o].value)),e.required&&!a.size)d=`Pick at least one.`;else{g(!0);let e={};for(let[t,n]of f)n&&a.has(t)&&(e[t]=n);return{values:[...a],inputs:e}}else if(e.multi&&j.space.includes(t)&&n[o]){let e=n[o].value;a.has(e)?a.delete(e):a.add(e)}else j.backspace.includes(t)?l=l.slice(0,-1):t.length===1&&t>=` `&&t!==` `&&(l+=t,o=0,c=0);g()}}finally{n.write(`\x1B[?25h`),_.setRawMode(!!v),_.pause()}}async function z(e){let t=s.stdin;if(!t.isTTY){let e=``;for await(let n of t)e+=n.toString();return e.replace(/\r?\n$/,``)}s.stderr.write(`${r.bold(e)} `),t.setRawMode(!0),t.resume();let n=``;try{for(;;){let e=await I();if(j.cancel.includes(e))throw new M;if(j.enter.includes(e))return n;j.backspace.includes(e)?n=n.slice(0,-1):e.length===1&&e>=` `&&(n+=e)}}finally{t.setRawMode(!1),t.pause(),s.stderr.write(`
|
|
8
|
+
`)}}async function B(e,t=``,n,i){let a=r;i&&s.stdout.write(`${a.bold(e)}\n ${a.light(i)}\n`);let o=(await import(`node:readline/promises`)).createInterface({input:s.stdin,output:s.stdout}),c=i?A(e)+A(` ${i}`):0;try{for(;;){let r=i?` ${t?a.dim(`[${t}] `):``}`:`${a.bold(e)} ${t?a.dim(`[${t}] `):``}`,l=(await o.question(r)).trim()||t;c+=A(`${i?` `:`${e} `}${t?`[${t}] `:``}${l}`);let u=n?.(l);if(!u)return s.stdout.write(`\x1b[${c}A\x1b[J${a.green(`✔`)} ${a.bold(e)} ${a.cyan(l||`-`)}\n\n`),l;s.stdout.write(` ${a.red(u)}\n`),c+=A(` ${u}`)}}finally{o?.close()}}function V(e){let t=s.env.BROWSER;if(t===`none`||s.env.CI||s.env.NODE_ENV===`test`)return!1;let[n,r]=t?s.platform===`darwin`?[`open`,[`-a`,t,e]]:[t,[e]]:s.platform===`darwin`?[`open`,[e]]:s.platform===`win32`?[`cmd`,[`/c`,`start`,``,e]]:[`xdg-open`,[e]];try{return l(n,r,{detached:!0,stdio:`ignore`}).unref(),!0}catch{return!1}}export{d as _,L as a,x as c,E as d,v as f,h as g,D as h,V as i,w as l,C as m,B as n,R as o,_ as p,N as r,k as s,M as t,T as u,g as v};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{An as e,Fn as t,Nn as n,On as r,Pn as i}from"./errors-XBA-Ls4n.js";function a(a,o,s,c){let l=e(t(i,{children:[n(`instructions`,{children:[`Answer one question about a Coder task, read-only.`,`You are not the task: never continue, redo or fix its work. The task never sees this question or your answer.`,`Grep or read the files selectively; events can be large.`,`Answer directly and concisely.`].join(`
|
|
2
|
+
`)}),n(`task`,{children:n(r,{value:{id:a.id,name:a.name??void 0,status:a.status,engine:a.engine,model:a.model??void 0,effort:a.effort??void 0,workspace:a.cwd??void 0,created:a.createdAt??void 0,finished:a.completedAt??void 0}})}),n(`task-prompt`,{children:n(r,{children:a.prompt??`(unknown)`})}),n(`files`,{children:[`progress log, one JSON event per line: ${o.log}`,`final result: ${o.result}`,`worker output: ${o.worker}`,a.cwd&&`workspace with the task's code and changes: ${a.cwd}`].filter(Boolean).join(`
|
|
3
|
+
`)}),n(`question`,{children:n(r,{children:s})})]}));return c?`${l}\n\nCoder command ${c}`:l}function o(a,o){return e(t(i,{children:[n(`rules`,{children:[`Review actions a Coder task wants to run outside its OS sandbox.`,`Decline git writes (commit, push, checkout, reset and the like).`,`Decline commands that print secret values, such as env dumps or CLI config and token output.`,`Decline destructive or system-level actions: sudo, rm -rf outside the workspace, killing processes, changing system config, piping downloads to a shell.`,`Temp locations (/tmp, $TMPDIR, OS temp dirs) and paths the task created are workspace scratch; delete them only after checking the progress log.`,`Accept actions the task goal clearly needs: package installs in the workspace, tests, builds, linters, reading system info, network to well-known package registries.`,`Escalate when uncertain, when the action is irreversible beyond the workspace, or when it touches credentials or secrets.`,`Read workspace files or the progress log only when the action line alone is not enough.`,`Reply with only one line of JSON: {"decision":"accept"|"decline"|"escalate","reason":"<short>"}. Acknowledge now with {"decision":"escalate","reason":"ready"}.`].join(`
|
|
4
|
+
`)}),n(`task-goal`,{children:a&&n(r,{children:a.replace(/\s+/g,` `).slice(0,500)})}),n(`progress-log`,{children:o})]}))}const s=e=>`action: ${e.slice(0,500)}`;function c(e){return e?`Reply with only one JSON object matching this JSON Schema, without prose or markdown fences:\n${JSON.stringify(e)}`:`Reply with only one JSON object matching the requested shape, without prose or markdown fences.`}const l=e=>`Your last reply did not match the required JSON: ${e}\nReply again with only the JSON object.`;export{l as a,c as i,o as n,a as r,s as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Ct as e}from"./errors-XBA-Ls4n.js";import{et as t}from"./output-D95NoAA9.js";import{command as n}from"./cli.js";const r=n({name:`refresh`,description:`refresh the cached latest version, detached`,access:`write`,globalFlags:{json:!1,cwd:!1},mcp:!1,run:()=>t(e())});export{r as commandRefreshUpdate};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{qi as e}from"./core-DwsAMCnL.js";import{
|
|
1
|
+
import{qi as e}from"./core-DwsAMCnL.js";import{Tn as t}from"./errors-XBA-Ls4n.js";import{Zt as n}from"./output-D95NoAA9.js";import{_ as r,d as i,f as a,g as o,h as s,i as c,l,m as u,p as d,u as f}from"./prompt-onpyIyXK.js";import{o as p}from"./load-zhcrwSRF.js";import{t as m}from"./integrations-DyInAa5g.js";import{_t as h,a as g,c as _,f as ee,h as te,i as ne,l as re,m as v,p as y,r as b,s as x,t as ie,u as ae,vt as S}from"./build-CmtlB7pX.js";import C from"node:path";import w from"node:process";import{execFile as T}from"node:child_process";import{createHash as E}from"node:crypto";import D from"node:fs/promises";import{promisify as O}from"node:util";import oe from"node:http";const se={"**/":`(?:.*/)?`,"/**":`/.*`,"**":`.*`,"*":`[^/]*`,"?":`[^/]`};function ce(e){return e.split(/\r?\n/).flatMap(e=>{let t=e.trimEnd();if(!t||t.startsWith(`#`))return[];let n=t.startsWith(`!`);n&&(t=t.slice(1));let r=t.endsWith(`/`);r&&(t=t.slice(0,-1));let i=t.replace(/^\//,``).replace(/[.+^${}()|[\]\\]/g,`\\$&`).replace(/\*\*\/|\/\*\*$|\*\*|\*|\?/g,e=>se[e]),a=t.includes(`/`);return[{pattern:RegExp(a?`^${i}$`:`^(?:.*/)?${i}$`),negate:n,directory:r}]})}const k=(e,t,n)=>e.reduce((e,r)=>(!r.directory||n)&&r.pattern.test(t)?!r.negate:e,!1);async function A(e,t,n=``){let r=[];for(let i of await D.readdir(C.join(e,n),{withFileTypes:!0})){let a=n?`${n}/${i.name}`:i.name;i.isDirectory()&&!k(t,a,!0)?r.push(...await A(e,t,a)):i.isFile()&&!k(t,a,!1)&&r.push(a)}return r}async function le(e){return(await O(T)(`git`,[`-C`,e,`ls-files`,`--cached`,`--others`,`--exclude-standard`,`-z`,`--`,`.`],{maxBuffer:67108864}).catch(()=>void 0))?.stdout.split(`\0`).filter(Boolean)}async function ue(e){let t=await le(e)??await A(e,ce(await D.readFile(C.join(e,`.gitignore`),`utf8`).catch(()=>``))),n={};for(let r of t){if(r===`agent.json`||r===`system.md`)continue;let t=C.join(e,r);(await D.lstat(t).catch(()=>void 0))?.isFile()&&(n[r]=await D.readFile(t,`utf8`))}return n}var j=e({deviceSignIn:()=>z,hasBrowser:()=>de,logoutSession:()=>W,loopbackSignIn:()=>R,refreshSignIn:()=>B,revokeSignIn:()=>V,selectLoginOrganization:()=>H,sessions:()=>G,signIn:()=>U});const M=`openid profile email offline_access organizations:read`,N=e=>`<!doctype html><meta charset="utf-8"><meta name="viewport" content="width=device-width"><title>Coder · ${e}</title>
|
|
2
2
|
<style>:root{color-scheme:light dark}body{margin:0;min-height:100vh;display:grid;place-items:center;font:15px/1.6 ui-monospace,SFMono-Regular,Menlo,monospace;background:light-dark(#fafafa,#111);color:light-dark(#111,#eee)}main{text-align:center;padding:32px}h1{margin:0 0 8px;font-size:20px}p{margin:0;opacity:.7}</style>
|
|
3
3
|
<main><h1>${e}</h1><p>You can close this tab and return to the terminal.</p></main>`,P=e=>`${e}/.well-known/oauth-cli-client.json`;async function F(e,t){let r=new URL(e).origin,i=await fetch(`${r}/.well-known/oauth-protected-resource`).catch(t=>{throw new n(`login-failed`,`No Coder server answers at ${e}: ${t.message}`)}),a=await i.json().catch(()=>({})),o=Array.isArray(a.authorization_servers)?a.authorization_servers[0]:void 0;if(!i.ok||a.resource!==r||typeof o!=`string`)throw new n(`login-failed`,`${e} does not offer sign-in.`,{hint:`Sign-in needs a Postgres-backed server; see coder docs self-host`});if(t!==void 0&&o!==t)throw new n(`login-failed`,`The server's sign-in issuer has changed. Sign in again before using this session.`);return{config:await _(new URL(o),P(e),void 0,ie(),new URL(o).protocol===`http:`?{execute:[b]}:void 0).catch(e=>{throw new n(`login-failed`,`Wular Auth at ${o} did not answer: ${e.message}`)}),resource:r}}function I(e,t,r){let i=t.claims(),a=t.refresh_token??r?.refreshToken;if(!a)throw new n(`login-failed`,`Wular Auth returned no refresh token.`);return{token:t.access_token,refreshToken:a,expiresAt:Date.now()+(t.expires_in??600)*1e3,issuer:e.serverMetadata().issuer,user:i?{name:typeof i.name==`string`?i.name:``,email:typeof i.email==`string`?i.email:``}:r?.user??{name:``,email:``}}}const L=e=>new n(`login-failed`,e instanceof S||e instanceof h?e.error===`access_denied`?`Sign-in was denied in the browser.`:e.error_description??e.error:e instanceof Error?e.message:String(e));async function R(e,t){let{config:r,resource:i}=await F(e),a=ee(),o=y(),s=oe.createServer();await new Promise(e=>s.listen(0,`127.0.0.1`,e));let{port:c}=s.address(),l=`http://127.0.0.1:${c}/callback`;try{let e=new Promise((e,t)=>{let r=setTimeout(()=>t(new n(`login-failed`,`Sign-in timed out.`)),3e5);s.on(`request`,(t,n)=>{let i=new URL(t.url??`/`,l);if(i.pathname!==`/callback`||i.searchParams.get(`state`)!==o){n.writeHead(404).end();return}n.writeHead(200,{"content-type":`text/html; charset=utf-8`}).end(N(i.searchParams.has(`error`)?`Sign-in failed`:`Signed in`)),clearTimeout(r),e(i)})});return t(g(r,{redirect_uri:l,scope:M,resource:i,code_challenge:await x(a),code_challenge_method:`S256`,state:o}).href),I(r,await ne(r,await e,{pkceCodeVerifier:a,expectedState:o},{resource:i}).catch(e=>{throw L(e)}))}finally{s.close(),s.closeAllConnections()}}async function z(e,t){let{config:n,resource:r}=await F(e);try{let e=await re(n,{scope:M,resource:r});return t(e.user_code,e.verification_uri_complete??e.verification_uri),I(n,await ae(n,e,{resource:r}))}catch(e){throw L(e)}}async function B(e,t){let{config:r,resource:i}=await F(e,t.issuer);try{return I(r,await v(r,t.refreshToken,{resource:i}),t)}catch(e){if(e instanceof S&&(e.error===`invalid_grant`||e.error===`invalid_client`))return;throw new n(`server`,`Wular Auth did not refresh the session: ${e instanceof Error?e.message:String(e)}`)}}async function V(e,t){let{config:n}=await F(e,t.issuer);n.serverMetadata().revocation_endpoint&&await te(n,t.refreshToken,{token_type_hint:`refresh_token`})}async function H(e,t,r){if(!e.length)throw new n(`login-failed`,`This account belongs to no workspace.`);if(t){let r=e.find(e=>e.slug===t);if(!r)throw new n(`login-failed`,`You are not a member of workspace "${t}".`);return r}if(e.length<=1)return e[0];if(!r)throw new n(`login-failed`,`Choose a workspace for this server.`,{hint:`Pass --workspace <slug>.`});let i=await r(e);return e.find(e=>e.slug===i)}const de=()=>!w.env.SSH_CONNECTION&&(w.platform!==`linux`||!!(w.env.DISPLAY||w.env.WAYLAND_DISPLAY));async function U(e,t={}){let r=t.device?await z(e,t.onCode??(()=>{})):await R(e,t.open??c),i=await fetch(`${e}/me`,{headers:{authorization:`Bearer ${r.token}`}}).catch(t=>{throw new n(`login-failed`,`No Coder server answers at ${e}: ${t.message}`)}),a=await i.json().catch(()=>({}));if(!i.ok)throw new n(`login-failed`,`Signed in, but the server refused the token.`);let o=await H(a.organizations??[],t.organization,t.chooseOrganization);return{...r,...o?{organization:o}:{},at:Date.now()}}async function W(e){let t=a(),r=t[e];if(!r)throw new n(`login-failed`,`Not signed in to ${e}.`);return await V(e,r).catch(()=>void 0),delete t[e],s(t),{ok:!0,server:e}}const G={async login(e={}){let t=K(e),n=await U(t,e);return e.save!==!1&&s({...a(),[t]:n}),{...n,server:t}},logout:(e={})=>W(K(e)),status:()=>Object.fromEntries(Object.entries(a()).map(([e,t])=>[e,{user:t.user,organization:t.organization,at:t.at}]))};function fe(e,n){let r=n,i;return{expiresAt:()=>r.expiresAt,async renew(){return i||=t(`${d()}.${E(`sha256`).update(e).digest(`hex`)}.lock`,()=>pe(e,r)).finally(()=>{i=void 0}),r=await i,r.token}}}async function pe(e,t){let r=e=>e&&e.refreshToken!==t.refreshToken?e:void 0,i=r(a()[e]);if(i&&i.expiresAt>t.expiresAt)return i;let o=await B(e,t),c=a();if(o){let n={...t,...o};return s({...c,[e]:n}),n}let l=r(c[e]);if(l)return l;throw delete c[e],s(c),new n(`login-failed`,`Signed out of ${e}.`,{hint:`Sign in again: coder auth login`})}var me=e({addCredential:()=>Z,coderClient:()=>J,connect:()=>q,credentials:()=>$,loginCredential:()=>Q,pushAgents:()=>Y,serverFor:()=>K});function K(e={}){let t=u(e.server);if(!l(t)){if(!e.yes)throw new n(`invalid-option`,`First use of Coder server ${new URL(t).origin} needs confirmation.`,{hint:`Inspect the origin, then pass yes: true.`});f(t)}return t}function q(e={}){let t=K(e);return J(t,{token:e.token,missingHint:`auth.login({ server: '${t}' })`,organization:e.organization})}function J(e,{token:t,missingHint:a,organization:s}={}){let c=u(e),l=i(c),d=l?.token,f=w.env.ADMIN_TOKEN,p=t??d??f;if(p&&p===f&&!r(c))throw new n(`invalid-option`,`ADMIN_TOKEN cannot be sent to a non-loopback server.`);if(!p)throw new n(`login-failed`,`Not signed in to ${c}.`,{...a?{hint:a}:{}});return new o(c,{token:p},{organization:s??l?.organization?.slug,renewal:l&&p===d?fe(c,l):void 0})}async function Y(e,t,r){let i=(await p(t,m)).filter(e=>!e.builtin),a=r?i.filter(e=>e.id===r):i;if(r&&!a.length)throw new n(`invalid-option`,`No workspace agent named "${r}".`);let o=[];for(let t of a)o.push(await e.agents.put(t.id,{definition:t.definition,systemPrompt:await D.readFile(C.join(t.dir,`system.md`),`utf8`).catch(()=>``),files:await ue(t.dir),name:t.name,description:t.definition.description}));return o}const he=/^[A-Z_][A-Z0-9_]*$/,X=(e,t)=>new n(`invalid-option`,e,t?{hint:t}:{});async function ge(){let e=``;for await(let t of w.stdin)e+=t.toString();return e.replace(/\r?\n$/,``)}async function Z(e){let t=e.env;if(!t)throw X(`Missing required --env NAME.`,`Like --env ANTHROPIC_API_KEY`);if(!he.test(t))throw X(`Invalid environment variable name ${JSON.stringify(t)}.`);let n=e.value===`-`?await ge():e.value??w.env[t];if(!n)throw X(`Environment variable ${t} is not set.`);return q(e).credentials.add({env:{[t]:n},workspace:e.workspace,noCheck:e.noCheck})}async function Q(e,t={}){if(e!==`claude`&&e!==`codex`)throw X(`Name the engine to sign in to.`,`Usage: coder credentials login <claude|codex>`);let n=q(t).credentials,r=await n.login(e);t.onStart?.(()=>n.cancelLogin(r.id));let i=async e=>{for(;!e(r.state);)r=await n.loginStatus(r.id,r.state)};return await i(e=>e!==`starting`),t.onOpen?.(r),e===`claude`&&r.state===`open`&&t.code&&await n.loginCode(r.id,await t.code()),await i(e=>e===`done`||e===`failed`),r}const $={list:(e={})=>q(e).credentials.list(),add:Z,remove:(e,t={})=>q(t).credentials.remove(e,t),login:Q};export{K as a,me as i,$ as n,G as o,Y as r,j as s,q as t};
|