@wular/coder 0.4.10 → 0.4.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions-Cwe3IDVs.js +2 -0
- package/dist/{adapter-BeezVK-B.js → adapter-Bi768A94.js} +1 -1
- package/dist/{adapter-ChaISKgI.js → adapter-CkL4PqXE.js} +1 -1
- package/dist/{adapter-MD6ahqPR.js → adapter-DYxjaefw.js} +1 -1
- package/dist/{add-Bk8drM-8.js → add-B6vPKZEr.js} +1 -1
- package/dist/{add-CD_L-WW8.js → add-n6c9OINP.js} +2 -2
- package/dist/{add-BbXuvqj1.js → add-v1Pv00HX.js} +1 -1
- package/dist/{add-B26QSwPY.js → add-wC8ByRgM.js} +1 -1
- package/dist/{agent-B8ItyuHN.js → agent-6GooVMsq.js} +2 -2
- package/dist/{agent-DHpMqHVi.js → agent-BkxXgha0.js} +1 -1
- package/dist/{alias-CScCzXhS.js → alias-A8ObWElH.js} +1 -1
- package/dist/{app-wHQJHu6N.js → app-CaxTL1H3.js} +1 -1
- package/dist/{approvals-BIGQBbCM.js → approvals-h5lytkey.js} +2 -2
- package/dist/{approve-DFSy7Z72.js → approve-BNhg0MLi.js} +2 -2
- package/dist/{approve-BnZ3v-3c.js → approve-BiHM8kSo.js} +1 -1
- package/dist/apps-BNe86LfS.js +367 -0
- package/dist/{archive-CU0nhUeJ.js → archive-CMHRsVYf.js} +2 -2
- package/dist/{archive-CY2lvp_c.js → archive-H2B7Me8E.js} +2 -2
- package/dist/{args-BekfmD9t.js → args-CURX44CA.js} +1 -1
- package/dist/{ask-CLDgHB_Y.js → ask-D8TIVhPl.js} +2 -2
- package/dist/{auth-C3KrIUf1.js → auth-BSMPjhnz.js} +1 -1
- package/dist/auth-D3quZAKT.js +1 -0
- package/dist/{chat-AbW-LOHo.js → chat-3AvUDOwf.js} +1 -1
- package/dist/{chat-bridge-WK-pKNfw.js → chat-bridge-BmqYsASZ.js} +1 -1
- package/dist/{cli-Fp28pM4Y.js → cli-BBlH53hA.js} +4 -4
- package/dist/cli.js +1 -1
- package/dist/{client-DzwzCsue.js → client-sqXb-y09.js} +1 -1
- package/dist/{config-DoVedq6T.js → config-K6Rrjsee.js} +1 -1
- package/dist/{connection-Cb0TK201.js → connection-B-IB8tlP.js} +1 -1
- package/dist/{connection-5V8doFL7.js → connection-BXBDeoax.js} +1 -1
- package/dist/{create-CrjRdQip.js → create-CP_JmJnh.js} +1 -1
- package/dist/{credentials-DoL9w8D1.js → credentials-BRFajC0d.js} +1 -1
- package/dist/dash/standalone/server/build-index.json +1 -1
- package/dist/dash/standalone/server/manifest.json +1273 -1273
- package/dist/dash/standalone/server/modules-server-server-react-server/src/client/{index.843431e3538fd9a4.js → index.0de14cb4e30bd70d.js} +1 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/api/{load.7ae462ef36271be8.js → load.be791a5eaf328738.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/connect/{page.806027fde54ab723.js → page.0fbfdba5254f7ae5.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/create/[id]/{page.bd04d2d3eba00676.js → page.70913bd4075da914.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{notify.857748e260c691e3.js → notify.61aab176baeefebd.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{page.25153459858542f9.js → page.815371ed0d5dd4fa.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{sign-out.ff98573f362d76f3.js → sign-out.1d6af804f9ec043d.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{agents-grid.8efd14bc39281da9.js → agents-grid.f43bcc1148ce3650.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{connect-apps.d1e67db29b12dc0a.js → connect-apps.f3af8cc8540719d7.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{page.0f7d5e3e42462870.js → page.5f88059c03cf82b4.js} +7 -7
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{layout.05210ffa6038791f.js → layout.b7392d534ce0410e.js} +7 -7
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{page.19fe116c0f802cb1.js → page.5aae24bbfd90c434.js} +7 -7
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{page.f87fd8eb66f73af0.js → page.91c992fdd3b4a493.js} +12 -16
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{platform-actions.b6c3d3184e167d0b.js → platform-actions.8e7ca54dd1821e98.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/settings/{agent-settings-form.28220621573033d7.js → agent-settings-form.eb707a9e32718374.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/settings/{page.2f7467868f599ebc.js → page.9ec1ec08ba05da59.js} +6 -6
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/tasks/{loading.ec94096015346f2c.js → loading.dd9088a4581b1d65.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/tasks/{page.a92a36a8ce21088c.js → page.71dc042821133e82.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/usage/{page.8935a5fe5c08bcf1.js → page.45e18b6dc3019af4.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{versions-list.5b97ab6d40e2e639.js → versions-list.c8d76988c734dda2.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/edit/{loading.bedcc1aba372fbce.js → loading.b1367e864b4fb406.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/edit/{page.14760e9eedd6ff8e.js → page.e3179ddf20a7e55d.js} +6 -6
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{agent-toggle.a6ee8bd882178e29.js → agent-toggle.1579dc8acbaacf92.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{hero.8be1dd4ea3ed6e17.js → hero.ad5cc342db794e5d.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{connect-repositories.59d89152fe845af2.js → connect-repositories.43b4b28f194ea842.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{editor.77f68d431408745b.js → editor.62cb8207218e6437.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{import-picker.a7b01817a821819a.js → import-picker.eafa5b41a2ed571f.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/new/{page.c4570fd80bdda68c.js → page.dffb05f2d256d81a.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{layout.19006c2d7dc8d114.js → layout.393cf7429eea189e.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/operator/{operator-apps.d350a52d27f69fa6.js → operator-apps.a244f3199e7cf09c.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/operator/{page.4a652f5080c2b863.js → page.980adfb7c5714752.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{page.d39f7a1719f50c6d.js → page.24a1987405ed7b17.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{connections-list.ff7e1dadcd4df17f.js → connections-list.21ec9dc73ce68656.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{credentials-list.87a1f8ab71eb4bed.js → credentials-list.683476f62a9ecde7.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{credentials.a535c9c6dd8b4cdf.js → credentials.b43dd3d97c536c2a.js} +8 -8
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{engines-list.29fffd07c1c3b771.js → engines-list.9e116751bd34e2cc.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{list.0c87d55cf4ef382c.js → list.083f5c665df04b1b.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{models-list.6fea9faddb8300bb.js → models-list.537f63f8e5dd085d.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{page.295245052b93af90.js → page.dfed4ae6ffc74434.js} +12 -12
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{runners-list.a4a38e54d834a1ec.js → runners-list.3afa989490bbe77c.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{secrets-list.50f487766f87383c.js → secrets-list.0d175ee815b22cd7.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{layout.c42e0ab39cb2c0e0.js → layout.3e8289f888fa444c.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{page.6997506eaa1a4824.js → page.06feaa5fbb06f1e6.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{create-link.9458b49dc99bbaaa.js → create-link.ff95e4b6977d0474.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{page.77e402bb6e8e7f7e.js → page.f06fda0df59beeb5.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{activity.fcda6f18c8207c99.js → activity.3c79cf14feff12bf.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{page.d0f039221a27b8ef.js → page.25b29e72df84806b.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{task-actions.f5f2016d2dc7f422.js → task-actions.587da79d68ab8d14.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{task-view.a292baa2410cdf64.js → task-view.f2e902c8208b2e78.js} +6 -6
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{composer.2d4122eb33addbdd.js → composer.b0bb1faaac8e0b6c.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{tasks-list.021bdc2f3d90af2d.js → tasks-list.b52a49fb5faeefd0.js} +7 -7
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{tasks-section.13f64b0836ae406b.js → tasks-section.80f9c9a42ecae854.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{page.b78f0df100410db0.js → page.20b5c22658eae312.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/usage/{page.93c2306069c03c68.js → page.fb21ebe90d49dac1.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{stream.95a2468086aceb84.js → stream.e2915852cf82c86b.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{task-toasts.e1a484113e1df660.js → task-toasts.0ed8ccaae81b9d53.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/utils/{action.968bcab0f5e3665d.js → action.b9a5c37272250e82.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/utils/{client.189224c16057d7a1.js → client.a3928fa2dcd27b75.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/action-fc8716cda7527d8c.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{agent-pills-0c0b8d40b9bfc78f.js → agent-pills-bd32cb89331aff7e.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{agent-settings-form-5a2601316e2ab283.js → agent-settings-form-f5576a2c50fce094.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{agent-toggle-5ede0c449e88cb9d.js → agent-toggle-a45b95908d62f926.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{agents-grid-ffb18df48e951ecb.js → agents-grid-9f79b5074899c8be.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{back-602db2cfdccf2e7f.js → back-b0cd2b85c9d8403e.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{combo-df2685e277db02c0.js → combo-1050768988cd0347.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{composer-e1cefed81ea89b7e.js → composer-87f138e21d68370d.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/composer-8f0e8b1d07e74aad.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{confirm-d163e6865d66dfab.js → confirm-01d5814b1c5f7721.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/connect-apps-857dc9fa3f6f5bbc.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{connect-repositories-0aa9abc77b9c3d48.js → connect-repositories-49098298b3a82647.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{connections-list-6eddeb8583ded10f.js → connections-list-46d48443d8fc8a0d.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{copy-0cc00656953531be.js → copy-5db9d328f8f65d82.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/create-link-6b6e9eeac436c4af.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{credentials-list-1b6a81e9b4934dc8.js → credentials-list-3cccc85ef335cb22.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{custom-range-cae5567874db83ca.js → custom-range-fdf1946aac09cfc3.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{editor-d55d247a1d7de5f0.js → editor-d2460c315bb1fd32.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{engines-list-288559344de4d4b9.js → engines-list-0159c8baa0b3e711.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{field-693bb870ad0bdee8.js → field-c530e261587d94df.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{instructions-a3d7688e421f2a08.js → instructions-3ea5afeea1992bf2.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/instructions-d8884576a18e6cdb.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{list-2a59237cb7cb0a7c.js → list-b67ce61483dd6acb.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{models-list-5ed9ee02f9b66d98.js → models-list-98c956ba00913a73.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{notice-7d84ffab32ff24ca.js → notice-8939183c8a889bae.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{outcome-dialog-3cffe3507ea92af2.js → outcome-dialog-6323cb5300b6d3c9.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/outcome-dialog-be3fbe8c4b43d180.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{platform-actions-4dc31567d00c4cb2.js → platform-actions-aafbf038008de64f.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/platform-actions-ed27388f722b4a4c.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{runners-list-984246a8f9450da1.js → runners-list-a13d0f8f6583c6d2.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{runtime-6e12333f12903a62-1.js → runtime-71b727f8f5906f08-1.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{secrets-list-88f8b30abbab52f0.js → secrets-list-53a0c079492199c9.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{segmented-79c9c69b702e0b90.js → segmented-a3642b8169857fb1.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/shared-init-6cad28f8cc696d91.js +2 -0
- package/dist/dash/standalone/static/assets/chunks/shared-init-71b727f8f5906f08-2.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/shared-init-94883db7bc70a5a8.js +5 -0
- package/dist/dash/standalone/static/assets/chunks/side-toggle-a2f67a8671a0309b.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{tail-99e29a541a072002.js → tail-81b69d49bfebfd4c.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{task-actions-1cdca1e8d3eee490.js → task-actions-25c70b47b5a53cd2.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{task-view-fdcde0e31f63b737.js → task-view-e5ee0ada38552918.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{tasks-list-3ad1c93deff4fb2e.js → tasks-list-d58f3063ae31d9d2.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{versions-list-60ac4d8f715bf5f7.js → versions-list-fbeed95c0b4e5f0f.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{wular-pnext-6e12333f12903a62-0.js → wular-pnext-71b727f8f5906f08-0.js} +1 -1
- package/dist/dash/standalone/static/assets/pnext-client-037852a9f274c8c8.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-10eac8df53f62104.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-12635905e9754177.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-12955733c71cc641.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-26999113ea61d5b9.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-27b6e4b7d1697094.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-34fec171024dd082.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-44eb6d4096f7e875.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-4c558a168b95d9b1.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-5d21f3dd3f4407af.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-5fe04a4e1dff28a3.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-88bbc009041aa776.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-b36106c6b8a6cd35.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-b47dda1cd4cfac04.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-b556f5611fdcf545.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-b8485144ca29d436.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-c5c3c90b3518c5a8.js +1 -0
- package/dist/dash/standalone/static/assets/{pnext-client-ab36b406301fd2a4.js → pnext-client-e4c659a371f4cd79.js} +1 -1
- package/dist/dash/standalone/static/assets/pnext-client-f139547dc55d7d76.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-fd280710b31af681.js +1 -0
- package/dist/{default-tTTSBdXq.js → default-Ojx5oFuw.js} +1 -1
- package/dist/{delete-DM2sA12f.js → delete-D1hEPpsk.js} +2 -2
- package/dist/{delete-DR37NTr1.js → delete-UyzcQPoG.js} +2 -2
- package/dist/{disable-Dz_zLPX5.js → disable-Dml_Slph.js} +1 -1
- package/dist/{discover-CqabH4Fx.js → discover-CyIfIBGD.js} +2 -2
- package/dist/dispatch-CFZ9Crvg.js +8 -0
- package/dist/{docs-b2mAKC8Z.js → docs-BUHKbQjM.js} +1 -1
- package/dist/{docs-BV9SC67g.js → docs-CvjWiada.js} +1 -1
- package/dist/drive-BqunNi9n.js +1 -0
- package/dist/{enable-Cfeki-ne.js → enable-xye-Nanc.js} +1 -1
- package/dist/{env-DSddo-fz.js → env-BgE9ipvN.js} +1 -1
- package/dist/exec-Cprez703.js +3 -0
- package/dist/{executor-LkokKTTd.js → executor-3QMa-XRY.js} +5 -5
- package/dist/flow/builtin/review.d.ts +1 -1
- package/dist/flow/builtin/review.js +1 -1
- package/dist/flow/index.d.ts +1 -1
- package/dist/flow/index.js +1 -1
- package/dist/{flow-BQcdyrVK.js → flow-CtillCQY.js} +1 -1
- package/dist/{history-D_A5odLI.js → history-C53URBjs.js} +1 -1
- package/dist/{http-CXaW1e7x.js → http-CDZKt5ln.js} +1 -1
- package/dist/hub-B0WCXtsP.js +2 -0
- package/dist/{init-DU_S43NG.js → init-HdSVUozH.js} +1 -1
- package/dist/integrations-BdLs4W6o.js +1 -0
- package/dist/{integrations-DPxWtNnS.js → integrations-IGnXBrPw.js} +2 -2
- package/dist/lib/broker.js +2 -2
- package/dist/{list-_EH6c041.js → list-1IMeVNg3.js} +1 -1
- package/dist/{list-CIS-GYO1.js → list-BTjIMvNs.js} +1 -1
- package/dist/{list-BJ0j5eP9.js → list-BlOB32n6.js} +2 -2
- package/dist/{list-CR0_Emod2.js → list-CZGTVKcS.js} +2 -2
- package/dist/{list-CnHZriYt.js → list-CquHtsmW.js} +1 -1
- package/dist/{list-i2r3Nlyz.js → list-CxjPT0Il.js} +1 -1
- package/dist/{list-7yd9K7d8.js → list-DvFVuGT_.js} +1 -1
- package/dist/{list-Boaz5b5n.js → list-gFnOS9Hk.js} +2 -2
- package/dist/load-Q9fL4VC6.js +2 -0
- package/dist/{local-Fs-dx_dP.js → local-Bzdmzc1o.js} +1 -1
- package/dist/{login-DISw6--d.js → login-C723kHh6.js} +1 -1
- package/dist/{login-CzD2EMD_.js → login-Dq3r6gh6.js} +1 -1
- package/dist/{logout-DMnc5yri.js → logout-DEg0aTmq.js} +1 -1
- package/dist/{maintenance-BVDuG9Hg.js → maintenance-DYOstY6V.js} +1 -1
- package/dist/{match-BfjPZ7gJ.js → match-BwcxeAZF.js} +1 -1
- package/dist/{mcp-CbN-QcpF.js → mcp-CKqinFkk.js} +1 -1
- package/dist/mcp-Dsl3Xdd3.js +13 -0
- package/dist/mcp-server-BlP9lACI.js +1 -0
- package/dist/{model-Ckyoyji3.js → model-Bs27g5EX.js} +1 -1
- package/dist/{models-VaiIYlOW.js → models-Cb0ZTKZ7.js} +1 -1
- package/dist/{prompt-DQyPCLUo.js → prompt-PEgcMJO7.js} +1 -1
- package/dist/prompts-Bj4Fbd_n.js +78 -0
- package/dist/{push-BNomfHJ3.js → push-DpEW4XbQ.js} +1 -1
- package/dist/{reconnect-Bd_jna1M.js → reconnect-BmP_XXDv.js} +1 -1
- package/dist/refresh-SHNJq9Cx.js +1 -0
- package/dist/{remote-f-uny3XZ.js → remote-D3JZ4MMQ.js} +1 -1
- package/dist/{remove-DdcQ-6by.js → remove-BZZgJq8Z.js} +1 -1
- package/dist/{remove-VtavIuGm.js → remove-CId1EwPg.js} +1 -1
- package/dist/{remove-DMTz_c25.js → remove-Ci87WQq0.js} +1 -1
- package/dist/{remove-CCYHc1FN.js → remove-DxCv9BB4.js} +1 -1
- package/dist/{rename-CKMyelWN.js → rename-DJaf5SwH.js} +1 -1
- package/dist/{result-CH3_tVXO.js → result-BesDQ-b1.js} +2 -2
- package/dist/{result-DvOqIwhh.js → result-D0dpv2O_.js} +4 -4
- package/dist/{resume-6j3RUpqa.js → resume-2Y0uC5MM.js} +2 -2
- package/dist/{review-B4ETH5ki.js → review-DIm9oK_W.js} +2 -2
- package/dist/{review-DDYD3Yvq.d.ts → review-Dxs-idTn.d.ts} +1 -1
- package/dist/{rotate-key-Byk_wI73.js → rotate-key-CS1G6ReH.js} +1 -1
- package/dist/{run-LCE1XiyU.js → run-BKUd6B8S.js} +1 -1
- package/dist/{run-DkYzyUnp.js → run-DjTTb8oA.js} +2 -2
- package/dist/{run-DKJW7qwy.js → run-UPW-7pKo.js} +2 -2
- package/dist/runner-BLS_ReEw.js +1 -0
- package/dist/{runner-CxtzTgVq.js → runner-BM_98EQl.js} +1 -1
- package/dist/runner.json +1 -1
- package/dist/runner.tgz +0 -0
- package/dist/{runners-vsoGeyuc.js → runners-DyLnqHKy.js} +2 -2
- package/dist/{schema-Brm7WIKd.js → schema-CjHmulYJ.js} +1 -1
- package/dist/schema.d.ts +1 -1
- package/dist/schema.js +1 -1
- package/dist/{sdk-CKTCrtGe.d.ts → sdk-B4Cl0Hbw.d.ts} +18 -122
- package/dist/sdk.d.ts +3 -3
- package/dist/sdk.js +1 -1
- package/dist/{serve-D8J-sEqm.js → serve-BApfeXk8.js} +2 -2
- package/dist/{serve-CCxSxXgv.js → serve-DE1cKoGa.js} +1 -1
- package/dist/{serve-C6tsUF0D.js → serve-lF97RlpX.js} +2 -2
- package/dist/{serve-C1zag2nr.js → serve-mXTjboT1.js} +1 -1
- package/dist/{server-B4SRYM2L.js → server-CUsxAflx.js} +1 -1
- package/dist/{setup-host-EaP4GPKB.js → setup-host-tlsilI6C.js} +1 -1
- package/dist/{show-xdsqD6de.js → show-Dn7zTz-9.js} +1 -1
- package/dist/{show-CjUG_aIp.js → show-uyUpeqa9.js} +1 -1
- package/dist/{slack-Kpj-G9FE.js → slack-DhPhLuWb.js} +4 -4
- package/dist/{status-BxV_ITeF.js → status-D_1VGn9F.js} +1 -1
- package/dist/{steer-DZ3nkHfC.js → steer-CMp-a7v2.js} +2 -2
- package/dist/{stop-qDw_DjOB.js → stop-C7YjN2sB.js} +1 -1
- package/dist/{stop-DGTUYxd6.js → stop-D8G7AtdY.js} +2 -2
- package/dist/{task-C506SkPR.js → task-DJ6nruuA.js} +1 -1
- package/dist/task-DeFLNmQH.js +1 -0
- package/dist/task-bkoi8_NN.js +7 -0
- package/dist/{test-DF_qVK6S.js → test-BD9rvefN.js} +1 -1
- package/dist/tools-CdWkwI1g.js +1 -0
- package/dist/{types-8zO5Tc9c.d.ts → types-C6NAqGqn.d.ts} +20 -31
- package/dist/{unalias-CklkAN1B.js → unalias-bL5t8Isc.js} +1 -1
- package/dist/{update-CZaFjwOJ.js → update-DIYW08ME.js} +1 -1
- package/dist/{upgrade-CUhFmPhl.js → upgrade-3fH6dGJw.js} +2 -2
- package/dist/{usage-DTAlb2rC.js → usage-Dr8F0xt0.js} +1 -1
- package/dist/{views-LmbLfqpu.js → views-CE2d9x6T.js} +1 -1
- package/dist/{watch-CJruitc6.js → watch-BiyN4NxE.js} +3 -3
- package/dist/{watch-p0j69fVA.js → watch-DJXu13jK.js} +5 -5
- package/dist/{wire-DshFMRsS.js → wire-nJ7sEi-M.js} +1 -1
- package/dist/worker-CHD_OiQS.js +1 -0
- package/dist/worker-KfrTK_Dk.js +2 -0
- package/dist/{workflow-CJJUiSfv.js → workflow-C21qQ4rT.js} +1 -1
- package/docs/agents/index.md +2 -2
- package/docs/agents/prompt.md +19 -8
- package/docs/mcp.md +1 -1
- package/package.json +1 -1
- package/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/plugins/cursor/.cursor-plugin/plugin.json +1 -1
- package/dist/actions-C3Mgpl9J.js +0 -2
- package/dist/apps-6BgpUsFh.js +0 -372
- package/dist/auth-CGeSfgNb.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/action-410bdc82c416bc01.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/composer-08e49d49c0c3ee94.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/connect-apps-ce3c9d049ebad459.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/create-link-bc365f8dfe88e6b3.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/instructions-3f18e035338b0d0b.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/outcome-dialog-f6fb8c69efa66508.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/platform-actions-ecd7200f7749c258.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/shared-init-6e12333f12903a62-2.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/shared-init-962398d15ee67c92.js +0 -5
- package/dist/dash/standalone/static/assets/chunks/shared-init-ae95a674d381c095.js +0 -2
- package/dist/dash/standalone/static/assets/chunks/side-toggle-7ada95cc7601eb49.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-0b3b70f1aefb9947.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-0d90849808b6eb05.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-12faa1754e3ef3be.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-23384b239b81a761.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-23e200dd9b7a79c0.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-2562299eef46e62c.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-3a4ada64991e6a40.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-71e7ecdfcf86be84.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-726c29bbb81054c0.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-825e9f5b63950ef4.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-894cff70289fb7a3.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-8f96a4b8a00ff460.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-9bc9b14c08020649.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-b8c585cae8da7778.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-bab4305b41abb15a.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-bd80926822b3993d.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-cd4c7b4318fa1846.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-db55344d00b7888f.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-eddcd5df2b28120f.js +0 -1
- package/dist/dispatch-BJZqI7sj.js +0 -8
- package/dist/drive-CU2HOCfR.js +0 -1
- package/dist/exec-DcWxZar6.js +0 -3
- package/dist/integrations-Dwvxl7i2.js +0 -1
- package/dist/load-C-GZnuok.js +0 -2
- package/dist/mcp-B-hy3eM-.js +0 -11
- package/dist/mcp-server-DQqSgD3P.js +0 -1
- package/dist/prompts-CEf7z4i_.js +0 -77
- package/dist/refresh-D-broYEx.js +0 -1
- package/dist/runner-Dnu1Vx_i.js +0 -1
- package/dist/task-CQmx_2SI.js +0 -7
- package/dist/task-Ls_-kcSx.js +0 -1
- package/dist/tools-S3eRQOVm.js +0 -1
- package/dist/worker-BHXjDzRp.js +0 -1
- package/dist/worker-nyRZuq4g.js +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{Ar as e,Cr as t,Or as n,Sr as r,_r as i,br as a,gr as o,hr as s,yr as c}from"./prompts-CEf7z4i_.js";import{t as l}from"./types-D_xnfP7m.js";import{createHash as u,createHmac as d,randomUUID as f,timingSafeEqual as ee}from"node:crypto";import{isIP as te}from"node:net";function p(e,t){let n=typeof e==`string`?Buffer.from(e):e,r=typeof t==`string`?Buffer.from(t):t;return n.length===r.length&&ee(n,r)}const ne=e=>u(`sha256`).update(e).digest(`base64url`),m=`https://api.github.com`;function h(e,t=`application/vnd.github+json`){return{accept:t,...e?{authorization:`Bearer ${e}`}:{},"user-agent":`coder`,"x-github-api-version":`2022-11-28`}}function g(e,t){return e.hook.before(`request`,e=>{e.request={...e.request,fetch:t}}),e}async function _(e,t=fetch){let[{createGitHubAdapter:n},{ConsoleLogger:r}]=await Promise.all([import(`./dist-B2jiMMxZ.js`),import(`./dist-DAnSqY1s.js`).then(e=>e.a)]);return g(n({...typeof e==`string`?{installationToken:e}:e,apiUrl:m,webhookVerifier:()=>!1,logger:new r(`error`)}).octokit,t)}const v=e=>t=>{if(!e.includes(t.status??0))throw t},y=e=>{let[t=``,n=``]=e.split(`/`);return{owner:t,repo:n}};async function re(e,t,n,r){let i=await(await _(n)).repos.getContent({...y(e),path:t,...r?{ref:r}:{},mediaType:{format:`raw`}}).catch(v([404]));return typeof i?.data==`string`?i.data:void 0}async function ie(e,t,n,r){let i=new URL(`${m}/repos/${e}/contents/${t}`);r.ref&&i.searchParams.set(`ref`,r.ref);let a=await r.fetch(i,{headers:{...h(n),...r.etag?{"if-none-match":r.etag}:{}}});if(a.status===304)return`unchanged`;let o=a.headers.get(`etag`)??void 0;if(a.status===404)return o?{etag:o}:{};if(!a.ok)throw Error(`GitHub answered ${a.status} reading ${e}/${t}`);let s=await a.json(),c=s.type===`file`&&s.encoding===`base64`?Buffer.from(s.content??``,`base64`).toString():void 0;return{...c===void 0?{}:{text:c},...o?{etag:o}:{}}}async function ae(e,t,n){let r=await(await _(n)).repos.getCommit({...y(e),ref:t,mediaType:{format:`sha`}}).catch(v([404,422]));return r?String(r.data).trim():void 0}async function oe(e,t,n,r=`HEAD`){let i=await _(n),a=y(e),o=`${t}/`,s=await i.git.getTree({...a,tree_sha:r,recursive:`1`}).catch(v([404]));if(!s)return[];let c=[],l=e=>e.startsWith(o)&&e.slice(o.length).split(`/`).length<=22;if(!s.data.truncated)return s.data.tree.flatMap(e=>e.type===`blob`&&e.path&&l(e.path)?[e.path.slice(o.length)]:[]);let u=async(e,t=``)=>{let{data:n}=await i.git.getTree({...a,tree_sha:e});await Promise.all(n.tree.map(async e=>{let n=t?`${t}/${e.path}`:e.path;n&&(e.type===`blob`&&l(n)?c.push(n.slice(o.length)):e.type===`tree`&&e.sha&&(o.startsWith(`${n}/`)||n.startsWith(o)&&l(n))&&await u(e.sha,n))}))};return await u(r),c.sort()}async function se(e,t,n,r){let i=await(await _(n)).repos.getContent({...y(e),path:t,...r?{ref:r}:{}}).catch(v([404]));return Array.isArray(i?.data)?i.data.map(e=>e.name):[]}async function ce(e,t=fetch){let n=[];for(let r=1;;r++){let i=await t(`${m}/installation/repositories?per_page=100&page=${r}`,{headers:{...h(e),authorization:`token ${e}`},signal:AbortSignal.timeout(1e4)});if(!i.ok)throw Error(`GitHub repositories failed: ${i.status}`);let a=await i.json();if(n.push(...a.repositories.map(e=>e.full_name)),n.length>=a.total_count||a.repositories.length<100)break}return[...new Set(n)]}async function le(e,t){let{data:n}=await(await _(t)).pulls.list({...y(e),state:`open`,sort:`created`,direction:`desc`,per_page:50});return n.map(e=>({number:e.number,title:e.title,author:e.user?.login,createdAt:e.created_at}))}async function ue(e,t){let{data:n}=await(await _(t)).repos.get(y(e));return{owner:n.owner.login,name:n.name,cloneUrl:n.clone_url,defaultBranch:n.default_branch}}async function de(e,t,n,r){let i=await(await _(n,r)).repos.getCollaboratorPermissionLevel({...y(e),username:t}).catch(()=>void 0);return[`admin`,`maintain`,`write`].includes(i?.data.permission??``)}function fe(e,t,n){let r=`https://github.com/${e}`;return t?`${r}/tree/${n??`HEAD`}/${t}`:r}var b=class extends Error{code;error;constructor(e,t,n){super(n??(t?`${e} (${t})`:e)),this.code=e,this.error=t}};const x={read:[`read`],write:[`read`,`write`]};function pe(e,t,n){return{name:`github`,command:`github-mcp-server`,args:[`stdio`,`--toolsets=all`,...e.includes(`write`)?[]:[`--read-only`]],env:{GITHUB_PERSONAL_ACCESS_TOKEN:n}}}function me(e,{name:t,description:n,permissions:r,events:i,isPublic:a=!1}){let o=e.replace(/\/$/,``);return{name:t,...n?{description:n}:{},url:o,hook_attributes:{url:`${o}/hooks/github`,active:!0},redirect_url:`${o}/create/github/callback`,callback_urls:[`${o}/install/github/callback`,`${o}/connect/github/callback`],request_oauth_on_install:!0,public:a,default_permissions:r,default_events:[...new Set([...i,`repository`])]}}function he(e,t){let n=e?`https://github.com/organizations/${encodeURIComponent(e)}/settings/apps/new`:`https://github.com/settings/apps/new`;return t?`${n}?state=${encodeURIComponent(t)}`:n}async function ge(e,t=fetch){let n=await t(`${m}/app-manifests/${encodeURIComponent(e)}/conversions`,{method:`POST`,headers:h()});if(!n.ok)throw Error(`GitHub App manifest conversion failed: ${n.status}`);let r=await n.json(),i=r.app_id??r.id;if(!i||!r.slug||!r.pem||!r.webhook_secret||!r.client_id||!r.client_secret)throw Error(`GitHub App manifest conversion response was incomplete`);return{appId:String(i),slug:r.slug,privateKey:r.pem,webhookSecret:r.webhook_secret,clientId:r.client_id,clientSecret:r.client_secret,...r.owner?.login?{owner:{login:r.owner.login,type:r.owner.type}}:{}}}const S=`https://github.com/login/oauth`,C=e=>`${e.replace(/\/$/,``)}/install/github/callback`;function w(e){let{clientId:t,clientSecret:n}=e;if(!t||!n)throw Error(`This GitHub App has no OAuth client; create it again from the dashboard`);return{clientId:t,clientSecret:n}}async function T(e,t,n,r){let{clientId:i,clientSecret:a}=w(e),o=await n(`${S}/access_token`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:i,client_secret:a,...t})}),s=await o.json().catch(()=>({}));if(!o.ok||!s.access_token)throw new b(`platform-error`,s.error??String(o.status),`GitHub authorization failed: ${s.error??o.status}`);return{accessToken:s.access_token,...s.refresh_token?{refreshToken:s.refresh_token}:{},...s.expires_in?{expiresAt:r+s.expires_in*1e3}:{}}}async function _e(e,t){let n=await t(`${m}/user`,{headers:h(e)}),r=await n.json().catch(()=>({}));if(!n.ok||!r.id||!r.login)throw Error(`GitHub user lookup failed: ${n.status}`);return{id:r.id,login:r.login}}async function ve(e,t,n,r=fetch){for(let i=1;i<=10;i++){let a=await r(`${m}/user/installations?per_page=100&page=${i}`,{headers:h(e)});if(!a.ok)throw Error(`GitHub installation check failed: ${a.status}`);let o=(await a.json()).installations??[],s=o.find(e=>String(e.id)===n&&String(e.app_id)===t);if(s)return{login:s.account?.login??`unknown`,...s.account?.type?{type:s.account.type}:{}};if(o.length<100)return}}async function E(e){let{createAppAuth:t}=await import(`./dist-node-Bv1kCqyi.js`).then(e=>e.n),{token:n}=await t({appId:e.appId,privateKey:e.privateKey})({type:`app`});return n}async function ye(e,t,n=fetch){let r=await E(e),i=await n(`${m}/app/installations/${encodeURIComponent(t)}`,{headers:h(r)});if(i.status===404)return!1;if(!i.ok)throw Error(`GitHub installation lookup failed: ${i.status}`);return!0}async function D(e,t,n,r){let i=new URL(e.url).searchParams.get(`code`);if(!i)throw new b(`missing-code`);let a=await T(t,{code:i,...n?{redirect_uri:n}:{}},r,Date.now()),o=await _e(a.accessToken,r);return{id:String(o.id),login:o.login,token:JSON.stringify(a),accessToken:a.accessToken}}const be={authorizeUrl(e,{publicUrl:t,state:n}){let r=new URLSearchParams({client_id:w(e).clientId,redirect_uri:`${t.replace(/\/$/,``)}/connect/github/callback`,state:n});return`${S}/authorize?${r}`},async exchange(e,t,{publicUrl:n,fetch:r}){let{accessToken:i,...a}=await D(e,t,`${n.replace(/\/$/,``)}/connect/github/callback`,r);return a},async access(e,t,{fetch:n,now:r}){let i=JSON.parse(e);if(!i.expiresAt||i.expiresAt-3e5>r||!i.refreshToken)return{accessToken:i.accessToken};let a=await T(t,{grant_type:`refresh_token`,refresh_token:i.refreshToken},n,r);return{accessToken:a.accessToken,refreshed:JSON.stringify(a)}}};function xe(e){return Array.isArray(e)?l.find(t=>e.every(e=>x[t].includes(e)))??`write`:e}const Se={read:{metadata:`read`,contents:`read`,pull_requests:`write`,issues:`write`},write:{metadata:`read`,contents:`write`,pull_requests:`write`,issues:`write`}};function O(e=`write`){return{...Se[xe(e)]}}const k={pull_request:[`pull_request`],issue:[`issues`],comment:[`issue_comment`,`pull_request_review_comment`],mention:[`issue_comment`,`pull_request_review_comment`]};function Ce(e){return[...new Set([...e.flatMap(e=>k[e]??[]),`push`])]}function A(e,t,n,r){let i=t.integrations.github??{},a=Array.isArray(i.events)?i.events:Object.keys(i.events??{});return me(e,{name:t.name??n,description:t.description,permissions:{...O(t.access),...a.some(e=>Object.hasOwn(k,e))?{issues:`write`,pull_requests:`write`}:{}},events:Ce(a),isPublic:r})}const j=(e,t)=>t?.type===`Organization`?`https://github.com/organizations/${encodeURIComponent(t.login)}/settings/apps/${e}`:`https://github.com/settings/apps/${e}`,M={read:1,write:2,admin:3},we={read:`Read-only`,write:`Read and write`,admin:`Admin`},N=e=>e[0].toUpperCase()+e.slice(1).replaceAll(`_`,` `);async function Te(e,t,{publicUrl:n,definition:r,fetch:i}){let a=await i(`${m}/app`,{headers:h(await E(t))});if(!a.ok)throw Error(`GitHub app lookup failed: ${a.status}`);let o=await a.json(),s=A(n,r,e.agent),c=new Set(o.events??[]),l=o.permissions??{},u=[],d=s.description??``;d!==(o.description??``)&&u.push(d?{text:`Set the **Description**`,copy:d}:{text:`Clear the **Description**`});for(let[e,t]of Object.entries(s.default_permissions))(M[l[e]??``]??0)<(M[t]??0)&&u.push({text:`Set **${N(e)}** to **${we[t]??t}**`});for(let e of s.default_events)c.has(e)||u.push({text:`Check the **${N(e)}** event`});for(let e of c)s.default_events.includes(e)||u.push({text:`Uncheck the **${N(e)}** event`});let f=o.owner?.login?{login:o.owner.login,type:o.owner.type}:t.owner;return{url:`${j(o.slug??t.slug,f)}/permissions`,label:`Open app settings`,lines:u}}const Ee={builtin:`shared`,postOrigins:[`https://github.com`],createPost({publicUrl:e,state:t,definition:n,encodedState:r}){let i=A(e,n,t.agent,t.public===!0);return{url:he(t.owner,r),fields:{manifest:JSON.stringify(i)}}},async createCallback(e,{fetch:t}){let n=new URL(e.url).searchParams.get(`code`);if(!n)throw new b(`missing-code`);let r=await ge(n,t),i={appId:r.appId,slug:r.slug,privateKey:r.privateKey,webhookSecret:r.webhookSecret,clientId:r.clientId,clientSecret:r.clientSecret,...r.owner?{owner:r.owner}:{}};return{platformAppId:r.appId,name:r.slug,credentials:i}},accountUrl:({login:e})=>`https://github.com/${encodeURIComponent(e)}`,settingsUrl(e,t){let{slug:n,owner:r}=t;return r?j(n,r):void 0},drift:(e,t,n)=>Te(e,t,n),installUrl(e,t,{publicUrl:n,state:r,installation:i}){let{slug:a}=t;if(!i)return`https://github.com/apps/${a}/installations/new?state=${encodeURIComponent(r)}`;let o=new URLSearchParams({client_id:w(t).clientId,redirect_uri:C(n),state:r});return`${S}/authorize?${o}`},async installedApp(e,{apps:t,fetch:n}){let r=new URL(e.url).searchParams.get(`installation_id`);if(!(!r||!/^\d+$/.test(r))){for(let{app:e,credentials:i}of t)if(await ye(i,r,n).catch(t=>(console.error(`coder server: asking GitHub whether ${e.id} owns installation ${r} failed`,t),!1)))return{app:e,installation:r}}},async installCallback(e,{credentials:t,publicUrl:n,fetch:r,installation:i}){let a=i??new URL(e.url).searchParams.get(`installation_id`);if(!a)throw new b(`missing-code`);let{accessToken:o,...s}=await D(e,t,i?C(n):void 0,r),c=await ve(o,t.appId,a,r);if(!c)throw new b(`not-yours`);return{platformInstallId:a,account:c,installer:s.id,user:s}}};function P(e){return e&&typeof e==`object`?e:{}}function F(e){return e?.agent===!0||e?.type===`Bot`||e?.login?.endsWith(`[bot]`)===!0}function I(e,t){return[e,t].filter(e=>!!e).join(`
|
|
1
|
+
import{Cr as e,_r as t,br as n,gr as r,jr as i,kr as a,vr as o,wr as s,xr as c}from"./prompts-Bj4Fbd_n.js";import{t as l}from"./types-D_xnfP7m.js";import{createHash as u,createHmac as d,randomUUID as f,timingSafeEqual as ee}from"node:crypto";import{isIP as te}from"node:net";function p(e,t){let n=typeof e==`string`?Buffer.from(e):e,r=typeof t==`string`?Buffer.from(t):t;return n.length===r.length&&ee(n,r)}const ne=e=>u(`sha256`).update(e).digest(`base64url`),m=`https://api.github.com`;function h(e,t=`application/vnd.github+json`){return{accept:t,...e?{authorization:`Bearer ${e}`}:{},"user-agent":`coder`,"x-github-api-version":`2022-11-28`}}function g(e,t){return e.hook.before(`request`,e=>{e.request={...e.request,fetch:t}}),e}async function _(e,t=fetch){let[{createGitHubAdapter:n},{ConsoleLogger:r}]=await Promise.all([import(`./dist-B2jiMMxZ.js`),import(`./dist-DAnSqY1s.js`).then(e=>e.a)]);return g(n({...typeof e==`string`?{installationToken:e}:e,apiUrl:m,webhookVerifier:()=>!1,logger:new r(`error`)}).octokit,t)}const v=e=>t=>{if(!e.includes(t.status??0))throw t},y=e=>{let[t=``,n=``]=e.split(`/`);return{owner:t,repo:n}};async function re(e,t,n,r){let i=await(await _(n)).repos.getContent({...y(e),path:t,...r?{ref:r}:{},mediaType:{format:`raw`}}).catch(v([404]));return typeof i?.data==`string`?i.data:void 0}async function ie(e,t,n,r){let i=new URL(`${m}/repos/${e}/contents/${t}`);r.ref&&i.searchParams.set(`ref`,r.ref);let a=await r.fetch(i,{headers:{...h(n),...r.etag?{"if-none-match":r.etag}:{}}});if(a.status===304)return`unchanged`;let o=a.headers.get(`etag`)??void 0;if(a.status===404)return o?{etag:o}:{};if(!a.ok)throw Error(`GitHub answered ${a.status} reading ${e}/${t}`);let s=await a.json(),c=s.type===`file`&&s.encoding===`base64`?Buffer.from(s.content??``,`base64`).toString():void 0;return{...c===void 0?{}:{text:c},...o?{etag:o}:{}}}async function ae(e,t,n){let r=await(await _(n)).repos.getCommit({...y(e),ref:t,mediaType:{format:`sha`}}).catch(v([404,422]));return r?String(r.data).trim():void 0}async function oe(e,t,n,r=`HEAD`){let i=await _(n),a=y(e),o=`${t}/`,s=await i.git.getTree({...a,tree_sha:r,recursive:`1`}).catch(v([404]));if(!s)return[];let c=[],l=e=>e.startsWith(o)&&e.slice(o.length).split(`/`).length<=22;if(!s.data.truncated)return s.data.tree.flatMap(e=>e.type===`blob`&&e.path&&l(e.path)?[e.path.slice(o.length)]:[]);let u=async(e,t=``)=>{let{data:n}=await i.git.getTree({...a,tree_sha:e});await Promise.all(n.tree.map(async e=>{let n=t?`${t}/${e.path}`:e.path;n&&(e.type===`blob`&&l(n)?c.push(n.slice(o.length)):e.type===`tree`&&e.sha&&(o.startsWith(`${n}/`)||n.startsWith(o)&&l(n))&&await u(e.sha,n))}))};return await u(r),c.sort()}async function se(e,t,n,r){let i=await(await _(n)).repos.getContent({...y(e),path:t,...r?{ref:r}:{}}).catch(v([404]));return Array.isArray(i?.data)?i.data.map(e=>e.name):[]}async function ce(e,t=fetch){let n=[];for(let r=1;;r++){let i=await t(`${m}/installation/repositories?per_page=100&page=${r}`,{headers:{...h(e),authorization:`token ${e}`},signal:AbortSignal.timeout(1e4)});if(!i.ok)throw Error(`GitHub repositories failed: ${i.status}`);let a=await i.json();if(n.push(...a.repositories.map(e=>e.full_name)),n.length>=a.total_count||a.repositories.length<100)break}return[...new Set(n)]}async function le(e,t){let{data:n}=await(await _(t)).pulls.list({...y(e),state:`open`,sort:`created`,direction:`desc`,per_page:50});return n.map(e=>({number:e.number,title:e.title,author:e.user?.login,createdAt:e.created_at}))}async function ue(e,t){let{data:n}=await(await _(t)).repos.get(y(e));return{owner:n.owner.login,name:n.name,cloneUrl:n.clone_url,defaultBranch:n.default_branch}}async function de(e,t,n,r){let i=await(await _(n,r)).repos.getCollaboratorPermissionLevel({...y(e),username:t}).catch(()=>void 0);return[`admin`,`maintain`,`write`].includes(i?.data.permission??``)}function fe(e,t,n){let r=`https://github.com/${e}`;return t?`${r}/tree/${n??`HEAD`}/${t}`:r}var b=class extends Error{code;error;constructor(e,t,n){super(n??(t?`${e} (${t})`:e)),this.code=e,this.error=t}};const x={read:[`read`],write:[`read`,`write`]};function pe(e,t,n){return{name:`github`,command:`github-mcp-server`,args:[`stdio`,`--toolsets=all`,...e.includes(`write`)?[]:[`--read-only`]],env:{GITHUB_PERSONAL_ACCESS_TOKEN:n}}}function me(e,{name:t,description:n,permissions:r,events:i,isPublic:a=!1}){let o=e.replace(/\/$/,``);return{name:t,...n?{description:n}:{},url:o,hook_attributes:{url:`${o}/hooks/github`,active:!0},redirect_url:`${o}/create/github/callback`,callback_urls:[`${o}/install/github/callback`,`${o}/connect/github/callback`],request_oauth_on_install:!0,public:a,default_permissions:r,default_events:[...new Set([...i,`repository`])]}}function he(e,t){let n=e?`https://github.com/organizations/${encodeURIComponent(e)}/settings/apps/new`:`https://github.com/settings/apps/new`;return t?`${n}?state=${encodeURIComponent(t)}`:n}async function ge(e,t=fetch){let n=await t(`${m}/app-manifests/${encodeURIComponent(e)}/conversions`,{method:`POST`,headers:h()});if(!n.ok)throw Error(`GitHub App manifest conversion failed: ${n.status}`);let r=await n.json(),i=r.app_id??r.id;if(!i||!r.slug||!r.pem||!r.webhook_secret||!r.client_id||!r.client_secret)throw Error(`GitHub App manifest conversion response was incomplete`);return{appId:String(i),slug:r.slug,privateKey:r.pem,webhookSecret:r.webhook_secret,clientId:r.client_id,clientSecret:r.client_secret,...r.owner?.login?{owner:{login:r.owner.login,type:r.owner.type}}:{}}}const S=`https://github.com/login/oauth`,C=e=>`${e.replace(/\/$/,``)}/install/github/callback`;function w(e){let{clientId:t,clientSecret:n}=e;if(!t||!n)throw Error(`This GitHub App has no OAuth client; create it again from the dashboard`);return{clientId:t,clientSecret:n}}async function T(e,t,n,r){let{clientId:i,clientSecret:a}=w(e),o=await n(`${S}/access_token`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:i,client_secret:a,...t})}),s=await o.json().catch(()=>({}));if(!o.ok||!s.access_token)throw new b(`platform-error`,s.error??String(o.status),`GitHub authorization failed: ${s.error??o.status}`);return{accessToken:s.access_token,...s.refresh_token?{refreshToken:s.refresh_token}:{},...s.expires_in?{expiresAt:r+s.expires_in*1e3}:{}}}async function _e(e,t){let n=await t(`${m}/user`,{headers:h(e)}),r=await n.json().catch(()=>({}));if(!n.ok||!r.id||!r.login)throw Error(`GitHub user lookup failed: ${n.status}`);return{id:r.id,login:r.login}}async function ve(e,t,n,r=fetch){for(let i=1;i<=10;i++){let a=await r(`${m}/user/installations?per_page=100&page=${i}`,{headers:h(e)});if(!a.ok)throw Error(`GitHub installation check failed: ${a.status}`);let o=(await a.json()).installations??[],s=o.find(e=>String(e.id)===n&&String(e.app_id)===t);if(s)return{login:s.account?.login??`unknown`,...s.account?.type?{type:s.account.type}:{}};if(o.length<100)return}}async function E(e){let{createAppAuth:t}=await import(`./dist-node-Bv1kCqyi.js`).then(e=>e.n),{token:n}=await t({appId:e.appId,privateKey:e.privateKey})({type:`app`});return n}async function ye(e,t,n=fetch){let r=await E(e),i=await n(`${m}/app/installations/${encodeURIComponent(t)}`,{headers:h(r)});if(i.status===404)return!1;if(!i.ok)throw Error(`GitHub installation lookup failed: ${i.status}`);return!0}async function D(e,t,n,r){let i=new URL(e.url).searchParams.get(`code`);if(!i)throw new b(`missing-code`);let a=await T(t,{code:i,...n?{redirect_uri:n}:{}},r,Date.now()),o=await _e(a.accessToken,r);return{id:String(o.id),login:o.login,token:JSON.stringify(a),accessToken:a.accessToken}}const be={authorizeUrl(e,{publicUrl:t,state:n}){let r=new URLSearchParams({client_id:w(e).clientId,redirect_uri:`${t.replace(/\/$/,``)}/connect/github/callback`,state:n});return`${S}/authorize?${r}`},async exchange(e,t,{publicUrl:n,fetch:r}){let{accessToken:i,...a}=await D(e,t,`${n.replace(/\/$/,``)}/connect/github/callback`,r);return a},async access(e,t,{fetch:n,now:r}){let i=JSON.parse(e);if(!i.expiresAt||i.expiresAt-3e5>r||!i.refreshToken)return{accessToken:i.accessToken};let a=await T(t,{grant_type:`refresh_token`,refresh_token:i.refreshToken},n,r);return{accessToken:a.accessToken,refreshed:JSON.stringify(a)}}};function xe(e){return Array.isArray(e)?l.find(t=>e.every(e=>x[t].includes(e)))??`write`:e}const Se={read:{metadata:`read`,contents:`read`,pull_requests:`write`,issues:`write`},write:{metadata:`read`,contents:`write`,pull_requests:`write`,issues:`write`}};function O(e=`write`){return{...Se[xe(e)]}}const k={pull_request:[`pull_request`],issue:[`issues`],comment:[`issue_comment`,`pull_request_review_comment`],mention:[`issue_comment`,`pull_request_review_comment`]};function Ce(e){return[...new Set([...e.flatMap(e=>k[e]??[]),`push`])]}function A(e,t,n,r){let i=t.integrations.github??{},a=Array.isArray(i.events)?i.events:Object.keys(i.events??{});return me(e,{name:t.name??n,description:t.description,permissions:{...O(t.access),...a.some(e=>Object.hasOwn(k,e))?{issues:`write`,pull_requests:`write`}:{}},events:Ce(a),isPublic:r})}const j=(e,t)=>t?.type===`Organization`?`https://github.com/organizations/${encodeURIComponent(t.login)}/settings/apps/${e}`:`https://github.com/settings/apps/${e}`,M={read:1,write:2,admin:3},we={read:`Read-only`,write:`Read and write`,admin:`Admin`},N=e=>e[0].toUpperCase()+e.slice(1).replaceAll(`_`,` `);async function Te(e,t,{publicUrl:n,definition:r,fetch:i}){let a=await i(`${m}/app`,{headers:h(await E(t))});if(!a.ok)throw Error(`GitHub app lookup failed: ${a.status}`);let o=await a.json(),s=A(n,r,e.agent),c=new Set(o.events??[]),l=o.permissions??{},u=[],d=s.description??``;d!==(o.description??``)&&u.push(d?{text:`Set the **Description**`,copy:d}:{text:`Clear the **Description**`});for(let[e,t]of Object.entries(s.default_permissions))(M[l[e]??``]??0)<(M[t]??0)&&u.push({text:`Set **${N(e)}** to **${we[t]??t}**`});for(let e of s.default_events)c.has(e)||u.push({text:`Check the **${N(e)}** event`});for(let e of c)s.default_events.includes(e)||u.push({text:`Uncheck the **${N(e)}** event`});let f=o.owner?.login?{login:o.owner.login,type:o.owner.type}:t.owner;return{url:`${j(o.slug??t.slug,f)}/permissions`,label:`Open app settings`,lines:u}}const Ee={builtin:`shared`,postOrigins:[`https://github.com`],createPost({publicUrl:e,state:t,definition:n,encodedState:r}){let i=A(e,n,t.agent,t.public===!0);return{url:he(t.owner,r),fields:{manifest:JSON.stringify(i)}}},async createCallback(e,{fetch:t}){let n=new URL(e.url).searchParams.get(`code`);if(!n)throw new b(`missing-code`);let r=await ge(n,t),i={appId:r.appId,slug:r.slug,privateKey:r.privateKey,webhookSecret:r.webhookSecret,clientId:r.clientId,clientSecret:r.clientSecret,...r.owner?{owner:r.owner}:{}};return{platformAppId:r.appId,name:r.slug,credentials:i}},accountUrl:({login:e})=>`https://github.com/${encodeURIComponent(e)}`,settingsUrl(e,t){let{slug:n,owner:r}=t;return r?j(n,r):void 0},drift:(e,t,n)=>Te(e,t,n),installUrl(e,t,{publicUrl:n,state:r,installation:i}){let{slug:a}=t;if(!i)return`https://github.com/apps/${a}/installations/new?state=${encodeURIComponent(r)}`;let o=new URLSearchParams({client_id:w(t).clientId,redirect_uri:C(n),state:r});return`${S}/authorize?${o}`},async installedApp(e,{apps:t,fetch:n}){let r=new URL(e.url).searchParams.get(`installation_id`);if(!(!r||!/^\d+$/.test(r))){for(let{app:e,credentials:i}of t)if(await ye(i,r,n).catch(t=>(console.error(`coder server: asking GitHub whether ${e.id} owns installation ${r} failed`,t),!1)))return{app:e,installation:r}}},async installCallback(e,{credentials:t,publicUrl:n,fetch:r,installation:i}){let a=i??new URL(e.url).searchParams.get(`installation_id`);if(!a)throw new b(`missing-code`);let{accessToken:o,...s}=await D(e,t,i?C(n):void 0,r),c=await ve(o,t.appId,a,r);if(!c)throw new b(`not-yours`);return{platformInstallId:a,account:c,installer:s.id,user:s}}};function P(e){return e&&typeof e==`object`?e:{}}function F(e){return e?.agent===!0||e?.type===`Bot`||e?.login?.endsWith(`[bot]`)===!0}function I(e,t){return[e,t].filter(e=>!!e).join(`
|
|
2
2
|
|
|
3
|
-
`)}const De=[`OWNER`,`MEMBER`],Oe=[`issue_comment`,`pull_request_review_comment`,`ping`];function L(e){try{return JSON.parse(e)}catch{return}}function R(e,t,n){if(!n||!t?.startsWith(`sha256=`))return!1;let r=Buffer.from(d(`sha256`,n).update(e).digest(`hex`),`hex`);return p(Buffer.from(t.slice(7),`hex`),r)}function z(e,t,n,r,i){let a=n.installation?.id,o=B(n),s=i.user??n.sender;if(a===void 0||!o||!i.number)return;let c=s?.author_association;return{integration:`github`,type:r,appId:t.id,installationId:String(a),deliveryId:e.headers.get(`x-github-delivery`)??``,actor:{id:String(s?.id??s?.login??``),...s?.login?{login:s.login}:{},...c?{role:c}:{},...F(s)?{agent:!0}:{}},text:i.body??``,repo:o,chat:{thread:V(`${o.owner}/${o.name}`,i.number,i.kind===`pull`)}}}function B(e){let t=e.repository;return t?.owner?.login&&t.name&&t.clone_url&&t.default_branch?{owner:t.owner.login,name:t.name,cloneUrl:t.clone_url,defaultBranch:t.default_branch}:void 0}function V(e,t,n){return{_type:`chat:Thread`,adapterName:`github`,channelId:`github:${e}`,id:`github:${e}:${n?``:`issue:`}${t}`,isDM:!1}}function ke(e,t,n,r){let i=P(t),a=e.headers.get(`x-github-event`);if(a===`pull_request`){let t=i.pull_request,a=i.action??``,o=i.requested_reviewer?.login?.toLowerCase();if(!t||![`opened`,`synchronize`,`reopened`,`ready_for_review`,`review_requested`].includes(a)||a===`review_requested`&&o!==`${r.slug}[bot]`.toLowerCase()||t.draft||a!==`review_requested`&&F(t.user)||!t.number||t.head?.repo?.full_name!==i.repository?.full_name)return[];let s=z(e,n,i,`pull_request`,{user:i.sender??t.user,body:I(t.title,t.body),number:t.number,kind:`pull`});return s?[s]:[]}if(a===`issues`){let t=i.issue;if(!t||![`opened`,`edited`].includes(i.action??``)||F(i.sender??t.user)||!t.number)return[];let r=z(e,n,i,`issue`,{user:i.sender??t.user,body:I(t.title,t.body),number:t.number});return r?[r]:[]}return[]}async function Ae(e,t,n={},r){let{token:i,expiresAt:a}=await(await _({appId:e.appId,privateKey:e.privateKey,installationId:Number(t)},r)).auth({type:`installation`,installationId:t,...n.
|
|
4
|
-
`),sample:`github:owner/repo:1`,author:e=>`${e}[bot]`,events:{mention:{description:`Comment from a repo owner or org member mentioning @<agent>; text has the mention stripped.`,on:`mention`,addressed:!0},pull_request:{description:`Opened, updated, or ready non-draft pull request.`},issue:{description:`Opened or edited issue.`},comment:{description:`New non-agent issue, pull request, or inline review comment.`,on:`message`,noisy:!0}},tools:{presets:x,server:pe,install:`arch=$(uname -m); [ "$arch" = aarch64 ] && arch=arm64; curl -fsSL "https://github.com/github/github-mcp-server/releases/latest/download/github-mcp-server_Linux_$arch.tar.gz" | tar -xz -C /usr/local/bin github-mcp-server`,installHosts:[`github.com`,`release-assets.githubusercontent.com`]},hosts:[`github.com`,`api.github.com`,`codeload.github.com`],get app(){return Ee},auth:{token:async(e,t,n,{fetch:r,hold:i}={})=>{let a=()=>Ae(t,e.id.split(`:`).pop(),H(n),r);return i?i(je(t,n),a):(await a()).token},get user(){return be},canWrite:async(e,t,n)=>!!(e.repo&&e.actor.login)&&de(`${e.repo.owner}/${e.repo.name}`,e.actor.login,t,n)},repos:{cloneHosts:[`github.com`],credentialUsername:`x-access-token`,readFile:re,revalidate:ie,listDir:se,tree:oe,commit:ae,list:(e,t,n)=>ce(t,n),get:ue,url:fe,pullRequests:le,pullRequest:e=>{let t=/^github:[^:]+:(\d+)(?::|$)/.exec(e.chat?.thread.id??``);return t?Number(t[1]):void 0},pullRequestThread:(e,t)=>V(e,t,!0)},target(e,t){let n=e.headers.get(`x-github-hook-installation-target-id`);if(!n)return;let r=P(L(t)),i=B(r),a=r.issue?r.issue.comments:r.comment&&r.comment.in_reply_to_id===void 0?0:void 0;return{app:n,...r.installation?.id===void 0?{}:{installation:String(r.installation.id)},...i?{repo:i}:{},...a===void 0?{}:{index:a}}},adapter:async e=>(await import(`./adapter-BeezVK-B.js`)).githubAdapter(e),link(e){let t=/^github:([^:]+):(issue:)?(\d+)(?::rc:(\d+))?(?::|$)/.exec(e.chat?.thread.id??``);return t?`https://github.com/${t[1]}/${t[2]?`issues`:`pull`}/${t[3]}${t[4]?`#discussion_r${t[4]}`:``}`:void 0},ownEvents(e,t,n,r){let i=e.headers.get(`x-github-event`);if(!i||Oe.includes(i))return;let{webhookSecret:a,slug:o}=r;if(!R(t,e.headers.get(`x-hub-signature-256`),a))return{invalid:!0};let s=L(t),c=Ne(i,s,n);if(c)return{installation:c};let l=Pe(s,n),u=i===`push`?Fe(s,n):void 0;return l?{changes:l,...u?{pushed:u}:{}}:u?{pushed:u}:{events:ke(e,s,n,{slug:o})}},event(e,t,n){let r=n.raw.comment?.author_association;return{type:e===`mention`&&!De.includes(r??``)?`comment`:e,actor:{id:n.author.userId,login:n.author.userName,...r?{role:r}:{}}}}};function Le(e,t,n,r=Date.now()){if(!n||!t)return!1;let i=d(`sha256`,n).update(e).digest();if(!p(Buffer.from(t,`hex`),i))return!1;let a=JSON.parse(e).webhookTimestamp;return typeof a==`number`&&Math.abs(r-a)<=6e4}async function Re(e,t,n=fetch){if(!e.actor.id||!e.installationId)throw Error(`Linear event has no actor or workspace`);let r=await n(`https://api.linear.app/graphql`,{method:`POST`,headers:{authorization:`Bearer ${t}`,"content-type":`application/json`},body:JSON.stringify({query:`query CoderWorkspaceMember($id: String!) { user(id: $id) { id active guest app organization { id } } }`,variables:{id:e.actor.id}}),redirect:`error`,signal:AbortSignal.timeout(5e3)}),i=await r.json(),a=i.data?.user;if(!r.ok||i.errors!==void 0&&(!Array.isArray(i.errors)||i.errors.length>0)||!a)throw Error(`Linear returned no valid workspace member`);return a.id===e.actor.id&&a.active===!0&&a.guest===!1&&a.app===!1&&a.organization?.id===e.installationId}function ze(e,t){let n=new Map;return(async(r,i)=>{let a=new Request(r,i);if(new URL(a.url).origin!==`https://slack.com`||new URL(a.url).pathname!==`/api/users.info`)return e(r,i);let o=new URLSearchParams(await a.clone().text()),s=a.headers.get(`authorization`)?.replace(/^Bearer /,``)??o.get(`token`),c=JSON.stringify([s,o.get(`team_id`)??t,o.get(`user`)]),l=n.get(c);return l||(l=e(r,i).then(async e=>{let t=await e.clone().json().catch(()=>void 0);return(!e.ok||t?.ok!==!0)&&n.delete(c),e}).catch(e=>{throw n.delete(c),e}),n.set(c,l)),(await l).clone()})}async function Be(e,t,n=fetch){let r=e.within??e.installationId;if(!r||!e.actor.id)throw Error(`Slack event has no workspace or actor`);let i=await n(`https://slack.com/api/users.info`,{method:`POST`,headers:{authorization:`Bearer ${t}`,"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({user:e.actor.id,team_id:r}),redirect:`error`,signal:AbortSignal.timeout(5e3)}),a=await i.json(),o=a.user;if(!i.ok||a.ok!==!0||!o)throw Error(`Slack returned no valid workspace member`);return o.id===e.actor.id&&o.deleted===!1&&o.is_bot===!1&&o.is_restricted===!1&&o.is_ultra_restricted===!1&&(o.is_external===void 0||o.is_external===!1)&&(o.team_id===r||Array.isArray(o.enterprise_user?.teams)&&o.enterprise_user.teams.includes(r))}function U(e){return e.replace(/\/$/,``)}function Ve(e,{name:t,description:n,scopes:r,events:i,extras:a}){let o=U(e),s=new URL(o).hostname;return{display_information:{name:t,...n?{description:n.slice(0,140)}:{}},features:{bot_user:{display_name:t,always_online:!0},app_home:{home_tab_enabled:!0,messages_tab_enabled:!0,messages_tab_read_only_enabled:!1},...s.includes(`.`)&&!te(s)?{unfurl_domains:[s]}:{},...a},oauth_config:{redirect_urls:[`${o}/install/slack/callback`],scopes:{bot:r}},settings:{org_deploy_enabled:!0,event_subscriptions:{request_url:`${o}/hooks/slack`,bot_events:i},interactivity:{is_enabled:!0,request_url:`${o}/hooks/slack`}}}}async function W(e,t,n,r){let{assertSlackOk:i,callSlackApi:a}=await import(`./api-qdpx8FD0.js`),o=await a(e,t,{token:n,fetch:r});return i(e,o),o}async function He(e,t,n=fetch){let r=await W(`apps.manifest.create`,{manifest:JSON.stringify(t)},e,n);return{appId:r.app_id,clientId:r.credentials.client_id,clientSecret:r.credentials.client_secret,signingSecret:r.credentials.signing_secret}}function G(e){let t=e.integrations.slack?.events;return Array.isArray(t)?t:Object.keys(t??{})}const K=e=>X(e.access,G(e));function q(e,t,n){return Ve(e,{name:t,description:n.description,scopes:K(n),events:Xe(G(n)),extras:Ze(e,n)})}async function J(e,t=fetch){let n=await t(`https://slack.com/api/tooling.tokens.rotate`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({refresh_token:e})}),r=await n.json();if(!n.ok||!r.ok||!r.token||!r.refresh_token||!r.team_id||!r.user_id)throw new b(`platform-error`,r.error??String(n.status));return{workspace:r.team_id,user:r.user_id,configToken:r.token,configRefreshToken:r.refresh_token,configTokenExpires:(r.exp??0)*1e3}}async function Y(e,t,n,r){return e.use(t,async(e,t,i)=>{let a=e;if(a.configTokenExpires<=Date.now()+6e4){try{let e=await J(a.configRefreshToken,n);if(e.workspace!==a.workspace||e.user!==a.user)throw Error(`Configuration token owner changed`);a=e}catch{throw await i(),new b(`invalid-field`,`token`,`This configuration token could not be refreshed. Paste a new token.`)}await t(a)}return r(a.configToken)})}function Ue(e,t,n,r=[]){let i=new URLSearchParams({client_id:e.clientId,state:n,redirect_uri:`${U(t)}/install/slack/callback`});return r.length&&i.set(`scope`,r.join(`,`)),`https://slack.com/oauth/v2/authorize?${i}`}async function We(e,t,n,r=fetch){let i=await r(`https://slack.com/api/oauth.v2.access`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:t.clientId,client_secret:t.clientSecret,code:e,redirect_uri:`${U(n)}/install/slack/callback`})}),a=await i.json(),o=a.is_enterprise_install===!0,s=o?a.enterprise:a.team;if(!i.ok||!a.ok||!a.access_token||!s?.id||!s.name)throw new b(`platform-error`,a.error??String(i.status));return{id:s.id,name:s.name,org:o,accessToken:a.access_token,...a.authed_user?.id?{installer:a.authed_user.id}:{}}}async function Ge(e,t){let n=[],r=``;do{let i=await W(`auth.teams.list`,{limit:1e3,...r?{cursor:r}:{}},e,t);n.push(...i.teams.map(e=>e.id)),r=i.response_metadata?.next_cursor??``}while(r);return n}const Ke={builtin:`own`,createStep:(e,t)=>{let n=t?.saved??[],r=n.length?{field:`token`,equals:`new`}:void 0;return{intro:`Coder creates the Slack app with a configuration token and installs its bot in the token's whole workspace.`,link:`https://api.slack.com/apps`,steps:[{...r?{when:r}:{},text:`Under **Your App Configuration Tokens**, click **Generate Token** and pick the workspace the agent should join.`},{text:`Paste the refresh token below, then approve the install when Slack asks.`,...r?{when:r}:{}}],notes:[`A workspace that requires app approval sends the install to its admins first. In Enterprise Grid, only an org admin can install org-wide.`,`To install the app in other Slack workspaces, click **Activate Public Distribution** under the app's **Manage Distribution**.`],fields:[...n.length?[{name:`token`,label:`Configuration token`,options:[...n.map(({id:e,label:t})=>({value:e,label:t})),{value:`new`,label:`Paste a new token`}]}]:[],{...r?{when:r}:{},name:`refreshToken`,label:`Refresh token`,hint:`Starts with xoxe-1-.`,placeholder:`xoxe-1-…`,required:!0}],submit:`Create Slack app`}},async createCallback(e,{publicUrl:t,state:n,definition:r,fetch:i,tokens:a}){if(!a)throw Error(`Configuration token storage is unavailable`);let o=new URLSearchParams(await e.text()),s=o.get(`token`);if(!s||s===`new`){let e=o.get(`refreshToken`);if(!e)throw Error(`Missing refresh token`);if(e.startsWith(`xoxe.xoxp-`))throw new b(`invalid-field`,`access-token`,`That is the access token, xoxe.xoxp-…. Paste the refresh token next to it, which starts with xoxe-1-.`);if(!e.startsWith(`xoxe-1-`))throw new b(`invalid-field`,`refresh-token`,`That is not a refresh token; they start with xoxe-1-. Copy it from Your App Configuration Tokens.`);let t=await J(e,i),n={workspace:t.workspace,user:t.user,workspaceName:t.workspace,credentials:t},r=await W(`auth.test`,{},t.configToken,i).catch(()=>void 0);s=await a.put({...n,workspaceName:r?.team||n.workspaceName})}let c=r.name??n.agent,l=await Y(a,s,i,e=>He(e,q(t,c,r),i));return{platformAppId:l.appId,name:c,credentials:{...l,configTokenId:s,scopes:K(r)}}},manifest:(e,{publicUrl:t,definition:n})=>q(t,e.name,n),async update(e,t,{publicUrl:n,definition:r,fetch:i,saveCredentials:a,tokens:o}){let s=t;if(!s.configTokenId||!o)throw new b(`no-refresh-token`);await Y(o,s.configTokenId,i,t=>W(`apps.manifest.update`,{app_id:s.appId,manifest:JSON.stringify(q(n,e.name,r))},t,i));let c=K(r);c.join()!==s.scopes?.join()&&await a({...s,scopes:c})},settingsUrl:(e,t)=>`https://api.slack.com/apps/${encodeURIComponent(t.appId)}`,installUrl(e,t,{publicUrl:n,state:r}){let i=t;return Ue(i,n,r,i.scopes??X(`write`))},async installCallback(e,{app:t,credentials:n,publicUrl:r,fetch:i,tokens:a}){let o=new URL(e.url).searchParams.get(`code`);if(!o)throw new b(`missing-code`);let s=await We(o,n,r,i),c=n.configTokenId;a&&c&&!s.org&&await a.use(c,(e,t)=>t(e,s.name));let l=await W(`auth.test`,{},s.accessToken,i).then(e=>e.url?.replace(/\/$/,``)).catch(()=>void 0),u=s.org?await Ge(s.accessToken,i).catch(()=>null):void 0;return{platformInstallId:s.id,account:{login:s.name,...s.org?{type:`Organization`}:{},...l?{url:l}:{}},token:s.accessToken,...s.org?{covers:u}:{},installer:s.installer,...s.installer?{user:{id:s.installer}}:{}}}},qe=[`app_mentions:read`,`channels:history`,`groups:history`,`im:history`,`channels:read`,`groups:read`,`im:read`,`mpim:read`,`users:read`,`users:read.email`,`files:read`,`usergroups:read`,`reactions:read`,`reactions:write`,`commands`,`links:read`,`links:write`];function X(e=`write`,t=[]){return[...qe,...t.includes(`dm`)?[`mpim:history`]:[],`chat:write`,`files:write`,`im:write`,`assistant:write`,...(Array.isArray(e)?e.includes(`write`):e===`write`)?[`channels:join`,`channels:manage`,`groups:write`,`mpim:write`,`usergroups:write`]:[]]}const Je={mention:[`app_mention`],dm:[`message.im`,`message.mpim`],channel:[`message.channels`,`message.groups`]},Ye=[`mention`,`dm`,`channel`];function Xe(e){let t=e.some(e=>Ye.includes(e));return[...new Set([...e.flatMap(e=>Je[e]??[]),...t?[`reaction_added`]:[]]),`team_access_granted`,`team_access_revoked`,`app_uninstalled`,`tokens_revoked`,`app_home_opened`,`link_shared`]}function Ze(e,t){return{slash_commands:[{command:`/setup`,url:`${e.replace(/\/$/,``)}/hooks/slack`,description:`Configure this agent`,usage_hint:`repo owner/name | model <name> | show`}],agent_view:{agent_description:t.description??`${t.name??`Coder`} in your workspace.`}}}const Qe={read:[`read`],write:[`read`,`write`]};function $e(e,t,n){let r=!e.includes(`write`),i=`/tmp/coder-slack-${f()}`;return{name:`slack`,command:`slack-mcp-server`,readOnly:r,args:[`--transport`,`stdio`],env:{SLACK_MCP_XOXB_TOKEN:n,SLACK_MCP_USERS_CACHE:`${i}-users.json`,SLACK_MCP_CHANNELS_CACHE:`${i}-channels.json`,SLACK_MCP_LOG_LEVEL:`error`,SLACK_MCP_ADD_MESSAGE_TOOL:r?``:`true`,SLACK_MCP_REACTION_TOOL:r?``:`true`,SLACK_MCP_ATTACHMENT_TOOL:`true`,SLACK_MCP_MARK_TOOL:r?``:`true`},credentialFields:{env:`SLACK_MCP_XOXB_TOKEN`}}}const et=r({type:t(n()),team_id:t(n()),enterprise_id:t(n()),is_enterprise_install:t(e([i(),n()])),api_app_id:t(n()),challenge:t(n()),authorizations:t(o(r({user_id:t(n()),team_id:t(a(n())),enterprise_id:t(a(n())),is_enterprise_install:t(i())})))}),tt=r({enterprise_id:t(n()),authorizations:t(o(r({enterprise_id:t(n())}))),event:r({type:s([`team_access_granted`,`team_access_revoked`]),team_ids:o(n())})}),nt=r({type:s([`app_uninstalled`,`tokens_revoked`]),tokens:t(r({bot:t(o(n()))}))}),rt=r({type:c(`app_home_opened`),user:n(),tab:c(`home`)}),it=r({type:c(`link_shared`),channel:n(),message_ts:n(),unfurl_id:t(n()),source:t(n()),links:o(r({url:n()}))}),at=`link:`,ot=r({type:c(`block_actions`),actions:o(r({action_id:n()}))});function Z(e){try{return JSON.parse(e)}catch{let t=new URLSearchParams(e),n=t.get(`payload`);if(!n)return Object.fromEntries(t);try{return JSON.parse(n)}catch{return{}}}}function st(e,t,n){let r=nt.safeParse(e.event).data;if(r){let e=r.type===`app_uninstalled`||r.tokens?.bot?.length;return n&&e?{uninstalled:`${t}:${n}`}:{ack:!0}}let i=rt.safeParse(e.event).data;if(i)return{work:async e=>(await import(`./views-LmbLfqpu.js`)).publishHome(e,i.user)};let a=it.safeParse(e.event).data;if(a)return{work:async e=>(await import(`./views-LmbLfqpu.js`)).unfurl(e,a)};let o=ot.safeParse(e).data?.actions;if(o?.length&&o.every(e=>e.action_id.startsWith(`link:`)))return{ack:!0};if(e.type&&e.type!==`event_callback`&&e.type!==`url_verification`)return{unhandled:`Slack interaction ${e.type}`};let s=tt.safeParse(e).data,c=s?.enterprise_id??s?.authorizations?.[0]?.enterprise_id;if(!s||!c)return;let l=s.event.team_ids;return{covers:{installation:`${t}:${c}`,...s.event.type===`team_access_granted`?{add:l}:{remove:l}}}}function ct(e,t,n){let r=e.headers.get(`x-slack-request-timestamp`)??``;if(!n||!(Math.abs(Date.now()/1e3-Number(r))<=300))return!1;let i=`v0=${d(`sha256`,n).update(`v0:${r}:${t}`).digest(`hex`)}`;return p(e.headers.get(`x-slack-signature`)??``,i)}const Q=e=>e===`im`||e===`mpim`?`dm`:`channel`;function lt(e,t,n=`send it a direct message`){let r=[t.includes(`mention`)&&`mention @${e} in a channel`,t.includes(`dm`)&&n,t.includes(`channel`)&&`write in a channel it is in`].filter(e=>!!e);if(!r.length)return;let i=r.length>1?`${r.slice(0,-1).join(`, `)}, or ${r.at(-1)}`:r[0];return`${i[0].toUpperCase()}${i.slice(1)}.`}const $={id:`slack`,brand:{color:`#E3066A`,icon:`M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zM18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zM15.165 18.956a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z`,svg:`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"><g><path d="M 84.04 252.77 c 0 23.13 -18.89 42.02 -42.02 42.02 S 0 275.9 0 252.77 s 18.89 -42.02 42.02 -42.02 h 42.02 v 42.02 Z" fill="#e3066a"/><path d="M 105.21 252.77 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 v 105.21 c 0 23.13 -18.89 42.02 -42.02 42.02 s -42.02 -18.89 -42.02 -42.02 c 0 0 0 -105.21 0 -105.21 Z" fill="#e3066a"/></g><g><path d="M 147.23 84.04 c -23.13 0 -42.02 -18.89 -42.02 -42.02 S 124.1 0 147.23 0 s 42.02 18.89 42.02 42.02 v 42.02 h -42.02 Z" fill="#00b3ff"/><path d="M 147.23 105.21 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 H 42.02 c -23.13 0 -42.02 -18.89 -42.02 -42.02 s 18.89 -42.02 42.02 -42.02 c 0 0 105.21 0 105.21 0 Z" fill="#00b3ff"/></g><g><path d="M 315.96 147.23 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 -18.89 42.02 -42.02 42.02 h -42.02 v -42.02 Z" fill="#41b658"/><path d="M 294.79 147.23 c 0 23.13 -18.89 42.02 -42.02 42.02 s -42.02 -18.89 -42.02 -42.02 V 42.02 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 v 105.21 Z" fill="#41b658"/></g><g><path d="M 252.77 315.96 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 -42.02 -18.89 -42.02 -42.02 v -42.02 h 42.02 Z" fill="#fcc003"/><path d="M 252.77 294.79 c -23.13 0 -42.02 -18.89 -42.02 -42.02 s 18.89 -42.02 42.02 -42.02 h 105.21 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 h -105.21 Z" fill="#fcc003"/></g></svg>`},name:`Slack`,featured:!0,description:`Mentions, direct messages, and channel messages in a Slack workspace`,installLabel:`Add to Slack`,use:e=>lt(`{handle}`,e),covered:`Slack workspace`,sample:`slack:C0000000000:1700000000.000100`,prompt:[`A conversation is a Slack thread or a whole 1:1 DM. A group DM works like a channel.`,`conversations_replies reads a thread. conversations_history reads a channel or DM, including DM messages older than your history.`,`Your final message renders as Markdown with headings, tables, lists, code blocks and quotes.`,`Mention a person as <@USER_ID>.`].join(`
|
|
5
|
-
`),replyLimit:12e3,events:{mention:{description:`A message that mentions the agent in a channel or group DM.`,on:`mention`,addressed:!0},dm:{description:`Every message in a direct message or group DM with the agent.`,on:`message`,addressed:!0},command:{description:`/setup and other slash commands`,on:`command`},channel:{description:`Every message in channels the agent is in. Slack delivers at most 30,000 events per workspace per app per hour.`,on:`message`,noisy:!0,addressed:!0}},tools:{presets:Qe,server:$e,install:`set -eu; arch=$(uname -m); case "$arch" in x86_64) arch=amd64; checksum=d1525962e9b9dbfdd2eaf48d0a81ca1eca7d8f1862b8d34931b812c850b3e568;; aarch64|arm64) arch=arm64; checksum=a307a48d16c2261346bdc257274cdcdb8b2027c867dc971b41d52cef36472c88;; *) exit 1;; esac; file=$(mktemp); trap 'rm -f "$file"' EXIT; curl -fsSL "https://github.com/korotovsky/slack-mcp-server/releases/download/v1.3.0/slack-mcp-server-linux-$arch" -o "$file"; echo "$checksum $file" | sha256sum -c -; install -m 755 "$file" /usr/local/bin/slack-mcp-server`,installHosts:[`github.com`,`release-assets.githubusercontent.com`]},hosts:[`slack.com`,`*.slack.com`],get app(){return Ke},target(e,t){let n=Z(t),r=et.safeParse(n).data;if(r?.type===`url_verification`&&r.challenge)return new Response(r.challenge);let i=r?.authorizations?.[0],a=i?.team_id??r?.team_id??n.team?.id,o=String(i?.is_enterprise_install??r?.is_enterprise_install)===`true`,s=o?i?.enterprise_id??r?.enterprise_id??n.enterprise?.id:a,c=i?.user_id;return r?.api_app_id?{app:r.api_app_id,...s?{installation:s}:{},...o&&a?{within:a}:{},...c?{self:c}:{}}:void 0},welcome:async(e,t,n)=>(await import(`./views-
|
|
3
|
+
`)}const De=[`OWNER`,`MEMBER`],Oe=[`issue_comment`,`pull_request_review_comment`,`ping`];function L(e){try{return JSON.parse(e)}catch{return}}function R(e,t,n){if(!n||!t?.startsWith(`sha256=`))return!1;let r=Buffer.from(d(`sha256`,n).update(e).digest(`hex`),`hex`);return p(Buffer.from(t.slice(7),`hex`),r)}function z(e,t,n,r,i){let a=n.installation?.id,o=B(n),s=i.user??n.sender;if(a===void 0||!o||!i.number)return;let c=s?.author_association;return{integration:`github`,type:r,appId:t.id,installationId:String(a),deliveryId:e.headers.get(`x-github-delivery`)??``,actor:{id:String(s?.id??s?.login??``),...s?.login?{login:s.login}:{},...c?{role:c}:{},...F(s)?{agent:!0}:{}},text:i.body??``,repo:o,chat:{thread:V(`${o.owner}/${o.name}`,i.number,i.kind===`pull`)}}}function B(e){let t=e.repository;return t?.owner?.login&&t.name&&t.clone_url&&t.default_branch?{owner:t.owner.login,name:t.name,cloneUrl:t.clone_url,defaultBranch:t.default_branch}:void 0}function V(e,t,n){return{_type:`chat:Thread`,adapterName:`github`,channelId:`github:${e}`,id:`github:${e}:${n?``:`issue:`}${t}`,isDM:!1}}function ke(e,t,n,r){let i=P(t),a=e.headers.get(`x-github-event`);if(a===`pull_request`){let t=i.pull_request,a=i.action??``,o=i.requested_reviewer?.login?.toLowerCase();if(!t||![`opened`,`synchronize`,`reopened`,`ready_for_review`,`review_requested`].includes(a)||a===`review_requested`&&o!==`${r.slug}[bot]`.toLowerCase()||t.draft||a!==`review_requested`&&F(t.user)||!t.number||t.head?.repo?.full_name!==i.repository?.full_name)return[];let s=z(e,n,i,`pull_request`,{user:i.sender??t.user,body:I(t.title,t.body),number:t.number,kind:`pull`});return s?[s]:[]}if(a===`issues`){let t=i.issue;if(!t||![`opened`,`edited`].includes(i.action??``)||F(i.sender??t.user)||!t.number)return[];let r=z(e,n,i,`issue`,{user:i.sender??t.user,body:I(t.title,t.body),number:t.number});return r?[r]:[]}return[]}async function Ae(e,t,n={},r){let{token:i,expiresAt:a}=await(await _({appId:e.appId,privateKey:e.privateKey,installationId:Number(t)},r)).auth({type:`installation`,installationId:t,...n.permissions?{permissions:n.permissions}:{}});return{token:i,expiresAt:Date.parse(a)}}function je(e,t){let{appId:n,privateKey:r}=e,{permissions:i}=H(t);return u(`sha256`).update(JSON.stringify([n,r,i?Object.entries(i).sort():null])).digest(`base64url`)}const Me={installation:[`created`,`deleted`,`suspend`,`unsuspend`,`new_permissions_accepted`],installation_repositories:[`added`,`removed`],repository:[`created`,`deleted`,`renamed`]};function Ne(e,t,n){let r=P(t),i=r.installation?.id,a=r.action;if(i===void 0||!Me[e??``]?.includes(a??``))return;let o=r.installation?.account,s=Date.now(),c=e===`installation`&&(a===`deleted`||a===`suspend`);return{op:c?`delete`:`upsert`,...e===`repository`&&r.repository?.full_name?{repos:{add:a===`created`||a===`renamed`?[r.repository.full_name]:[],remove:a===`deleted`?[r.repository.full_name]:a===`renamed`&&r.changes?.repository?.name?.from?[`${r.repository.full_name.split(`/`)[0]}/${r.changes.repository.name.from}`]:[]}}:{},...e===`installation_repositories`?{repos:{...r.repository_selection&&(a===`removed`?!r.repositories_removed?.length:!r.repositories_added?.length)?{refresh:!0}:{},add:(r.repositories_added??[]).flatMap(e=>e.full_name?[e.full_name]:[]),remove:(r.repositories_removed??[]).flatMap(e=>e.full_name?[e.full_name]:[])}}:{},installation:{integration:`github`,...e===`installation`&&a===`deleted`?{uninstalled:!0}:{},id:`${n.id}:${i}`,app:n.id,account:{login:o?.login??r.repository?.owner?.login??`unknown`,...o?.type?{type:o.type}:{}},createdAt:s,...r.repositories?{repos:r.repositories.flatMap(e=>e.full_name?[e.full_name]:[])}:{},...c?{deletedAt:s}:{}}}}function Pe(e,t){let n=P(e),r=n.repository?.full_name,i=t.branch??n.repository?.default_branch;if(!r||r!==t.agentsRepo||!i||n.ref!==`refs/heads/${i}`||!n.after||!n.commits)return;let a=[...new Set(n.commits.flatMap(e=>[...e.added??[],...e.modified??[],...e.removed??[]]))].filter(e=>e.startsWith(`.coder/agents/`));return a.length?{repo:r,ref:n.after,branch:i,paths:a}:void 0}function Fe(e,t){let n=P(e),r=n.repository?.full_name,i=n.ref?.startsWith(`refs/heads/`)&&n.ref.slice(11),a=n.installation?.id;if(!r||!i||a===void 0)return;let o=n.commits??[],s=o.flatMap(e=>[...e.added??[],...e.modified??[],...e.removed??[]]);if(!(o.length&&o.length<2048&&!s.some(e=>e.startsWith(`.coder/`))))return{installation:`${t.id}:${a}`,repo:r,branch:i,...n.repository?.default_branch?{defaultBranch:n.repository.default_branch}:{}}}function H(e={}){return e.tools?{permissions:O(e.tools)}:{}}const Ie={id:`github`,brand:{color:`#000000`,icon:`M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12`,dark:`#fff`,svg:`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 98 96" fill="none" style="color:light-dark(#000,#fff)"><g clip-path="url(#github-mark-4)"><path d="M 41.44 69.38 C 28.81 67.85 19.91 58.76 19.91 46.99 C 19.91 42.21 21.63 37.04 24.5 33.59 C 23.26 30.43 23.45 23.73 24.88 20.96 C 28.71 20.48 33.88 22.49 36.94 25.27 C 40.58 24.12 44.41 23.54 49.1 23.54 C 53.79 23.54 57.61 24.12 61.06 25.17 C 64.03 22.49 69.29 20.48 73.12 20.96 C 74.46 23.54 74.65 30.24 73.4 33.5 C 76.47 37.13 78.09 42.01 78.09 46.99 C 78.09 58.76 69.19 67.66 56.37 69.29 C 59.62 71.39 61.82 75.99 61.82 81.25 L 61.82 91.21 C 61.82 94.08 64.22 95.7 67.09 94.55 C 84.41 87.95 98 70.63 98 49.19 C 98 22.11 75.99 0 48.9 0 C 21.82 0 0 22.11 0 49.19 C 0 70.44 13.49 88.05 31.68 94.65 C 34.26 95.61 36.75 93.88 36.75 91.3 L 36.75 83.64 C 35.41 84.22 33.69 84.6 32.16 84.6 C 25.84 84.6 22.11 81.16 19.43 74.74 C 18.38 72.16 17.23 70.63 15.03 70.34 C 13.88 70.25 13.49 69.77 13.49 69.19 C 13.49 68.04 15.41 67.18 17.32 67.18 C 20.1 67.18 22.49 68.91 24.98 72.45 C 26.89 75.22 28.9 76.47 31.29 76.47 C 33.69 76.47 35.22 75.61 37.42 73.4 C 39.05 71.78 40.29 70.34 41.44 69.38 Z" fill="black" style="fill:currentColor"/></g><defs><clipPath id="github-mark-4"><rect width="98" height="96" fill="white"/></clipPath></defs></svg>`},name:`GitHub`,featured:!0,description:`Pull requests, issues, and comments on GitHub repositories`,installLabel:`Connect GitHub`,use:`Mention @{handle} in an issue or pull request.`,organizationApps:!0,publicApps:!0,prompt:[`A conversation is an issue or pull request with its comments, or one inline review comment thread.`,`issue_read reads an issue and its comments. pull_request_read reads a pull request: get, get_diff and get_files for the change, get_comments for its conversation, get_reviews and get_review_comments for reviews and inline comments.`,`Review findings are inline review comments marked coder-review:fp.`,`A task starts on the default branch; a pull request's changes are read with pull_request_read. Check out and push a pull request's branch only when it is in this repository and the request asks for changes; a fork pull request gets reads and comments only.`,`Replies are GitHub Markdown. Cite repository file paths when discussing code; link the pull request after making changes.`].join(`
|
|
4
|
+
`),sample:`github:owner/repo:1`,author:e=>`${e}[bot]`,events:{mention:{description:`Comment from a repo owner or org member mentioning @<agent>; text has the mention stripped.`,on:`mention`,addressed:!0},pull_request:{description:`Opened, updated, or ready non-draft pull request.`},issue:{description:`Opened or edited issue.`},comment:{description:`New non-agent issue, pull request, or inline review comment.`,on:`message`,noisy:!0}},tools:{presets:x,server:pe,install:`arch=$(uname -m); [ "$arch" = aarch64 ] && arch=arm64; curl -fsSL "https://github.com/github/github-mcp-server/releases/latest/download/github-mcp-server_Linux_$arch.tar.gz" | tar -xz -C /usr/local/bin github-mcp-server`,installHosts:[`github.com`,`release-assets.githubusercontent.com`]},hosts:[`github.com`,`api.github.com`,`codeload.github.com`],get app(){return Ee},auth:{token:async(e,t,n,{fetch:r,hold:i}={})=>{let a=()=>Ae(t,e.id.split(`:`).pop(),H(n),r);return i?i(je(t,n),a):(await a()).token},get user(){return be},canWrite:async(e,t,n)=>!!(e.repo&&e.actor.login)&&de(`${e.repo.owner}/${e.repo.name}`,e.actor.login,t,n)},repos:{cloneHosts:[`github.com`],credentialUsername:`x-access-token`,readFile:re,revalidate:ie,listDir:se,tree:oe,commit:ae,list:(e,t,n)=>ce(t,n),get:ue,url:fe,pullRequests:le,pullRequest:e=>{let t=/^github:[^:]+:(\d+)(?::|$)/.exec(e.chat?.thread.id??``);return t?Number(t[1]):void 0},pullRequestThread:(e,t)=>V(e,t,!0)},target(e,t){let n=e.headers.get(`x-github-hook-installation-target-id`);if(!n)return;let r=P(L(t)),i=B(r),a=r.issue?r.issue.comments:r.comment&&r.comment.in_reply_to_id===void 0?0:void 0;return{app:n,...r.installation?.id===void 0?{}:{installation:String(r.installation.id)},...i?{repo:i}:{},...a===void 0?{}:{index:a}}},adapter:async e=>(await import(`./adapter-Bi768A94.js`)).githubAdapter(e),link(e){let t=/^github:([^:]+):(issue:)?(\d+)(?::rc:(\d+))?(?::|$)/.exec(e.chat?.thread.id??``);return t?`https://github.com/${t[1]}/${t[2]?`issues`:`pull`}/${t[3]}${t[4]?`#discussion_r${t[4]}`:``}`:void 0},ownEvents(e,t,n,r){let i=e.headers.get(`x-github-event`);if(!i||Oe.includes(i))return;let{webhookSecret:a,slug:o}=r;if(!R(t,e.headers.get(`x-hub-signature-256`),a))return{invalid:!0};let s=L(t),c=Ne(i,s,n);if(c)return{installation:c};let l=Pe(s,n),u=i===`push`?Fe(s,n):void 0;return l?{changes:l,...u?{pushed:u}:{}}:u?{pushed:u}:{events:ke(e,s,n,{slug:o})}},event(e,t,n){let r=n.raw.comment?.author_association;return{type:e===`mention`&&!De.includes(r??``)?`comment`:e,actor:{id:n.author.userId,login:n.author.userName,...r?{role:r}:{}}}}};function Le(e,t,n,r=Date.now()){if(!n||!t)return!1;let i=d(`sha256`,n).update(e).digest();if(!p(Buffer.from(t,`hex`),i))return!1;let a=JSON.parse(e).webhookTimestamp;return typeof a==`number`&&Math.abs(r-a)<=6e4}async function Re(e,t,n=fetch){if(!e.actor.id||!e.installationId)throw Error(`Linear event has no actor or workspace`);let r=await n(`https://api.linear.app/graphql`,{method:`POST`,headers:{authorization:`Bearer ${t}`,"content-type":`application/json`},body:JSON.stringify({query:`query CoderWorkspaceMember($id: String!) { user(id: $id) { id active guest app organization { id } } }`,variables:{id:e.actor.id}}),redirect:`error`,signal:AbortSignal.timeout(5e3)}),i=await r.json(),a=i.data?.user;if(!r.ok||i.errors!==void 0&&(!Array.isArray(i.errors)||i.errors.length>0)||!a)throw Error(`Linear returned no valid workspace member`);return a.id===e.actor.id&&a.active===!0&&a.guest===!1&&a.app===!1&&a.organization?.id===e.installationId}function ze(e,t){let n=new Map;return(async(r,i)=>{let a=new Request(r,i);if(new URL(a.url).origin!==`https://slack.com`||new URL(a.url).pathname!==`/api/users.info`)return e(r,i);let o=new URLSearchParams(await a.clone().text()),s=a.headers.get(`authorization`)?.replace(/^Bearer /,``)??o.get(`token`),c=JSON.stringify([s,o.get(`team_id`)??t,o.get(`user`)]),l=n.get(c);return l||(l=e(r,i).then(async e=>{let t=await e.clone().json().catch(()=>void 0);return(!e.ok||t?.ok!==!0)&&n.delete(c),e}).catch(e=>{throw n.delete(c),e}),n.set(c,l)),(await l).clone()})}async function Be(e,t,n=fetch){let r=e.within??e.installationId;if(!r||!e.actor.id)throw Error(`Slack event has no workspace or actor`);let i=await n(`https://slack.com/api/users.info`,{method:`POST`,headers:{authorization:`Bearer ${t}`,"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({user:e.actor.id,team_id:r}),redirect:`error`,signal:AbortSignal.timeout(5e3)}),a=await i.json(),o=a.user;if(!i.ok||a.ok!==!0||!o)throw Error(`Slack returned no valid workspace member`);return o.id===e.actor.id&&o.deleted===!1&&o.is_bot===!1&&o.is_restricted===!1&&o.is_ultra_restricted===!1&&(o.is_external===void 0||o.is_external===!1)&&(o.team_id===r||Array.isArray(o.enterprise_user?.teams)&&o.enterprise_user.teams.includes(r))}function U(e){return e.replace(/\/$/,``)}function Ve(e,{name:t,description:n,scopes:r,events:i,extras:a}){let o=U(e),s=new URL(o).hostname;return{display_information:{name:t,...n?{description:n.slice(0,140)}:{}},features:{bot_user:{display_name:t,always_online:!0},app_home:{home_tab_enabled:!0,messages_tab_enabled:!0,messages_tab_read_only_enabled:!1},...s.includes(`.`)&&!te(s)?{unfurl_domains:[s]}:{},...a},oauth_config:{redirect_urls:[`${o}/install/slack/callback`],scopes:{bot:r}},settings:{org_deploy_enabled:!0,event_subscriptions:{request_url:`${o}/hooks/slack`,bot_events:i},interactivity:{is_enabled:!0,request_url:`${o}/hooks/slack`}}}}async function W(e,t,n,r){let{assertSlackOk:i,callSlackApi:a}=await import(`./api-qdpx8FD0.js`),o=await a(e,t,{token:n,fetch:r});return i(e,o),o}async function He(e,t,n=fetch){let r=await W(`apps.manifest.create`,{manifest:JSON.stringify(t)},e,n);return{appId:r.app_id,clientId:r.credentials.client_id,clientSecret:r.credentials.client_secret,signingSecret:r.credentials.signing_secret}}function G(e){let t=e.integrations.slack?.events;return Array.isArray(t)?t:Object.keys(t??{})}const K=e=>X(e.access,G(e));function q(e,t,n){return Ve(e,{name:t,description:n.description,scopes:K(n),events:Xe(G(n)),extras:Ze(e,n)})}async function J(e,t=fetch){let n=await t(`https://slack.com/api/tooling.tokens.rotate`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({refresh_token:e})}),r=await n.json();if(!n.ok||!r.ok||!r.token||!r.refresh_token||!r.team_id||!r.user_id)throw new b(`platform-error`,r.error??String(n.status));return{workspace:r.team_id,user:r.user_id,configToken:r.token,configRefreshToken:r.refresh_token,configTokenExpires:(r.exp??0)*1e3}}async function Y(e,t,n,r){return e.use(t,async(e,t,i)=>{let a=e;if(a.configTokenExpires<=Date.now()+6e4){try{let e=await J(a.configRefreshToken,n);if(e.workspace!==a.workspace||e.user!==a.user)throw Error(`Configuration token owner changed`);a=e}catch{throw await i(),new b(`invalid-field`,`token`,`This configuration token could not be refreshed. Paste a new token.`)}await t(a)}return r(a.configToken)})}function Ue(e,t,n,r=[]){let i=new URLSearchParams({client_id:e.clientId,state:n,redirect_uri:`${U(t)}/install/slack/callback`});return r.length&&i.set(`scope`,r.join(`,`)),`https://slack.com/oauth/v2/authorize?${i}`}async function We(e,t,n,r=fetch){let i=await r(`https://slack.com/api/oauth.v2.access`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:t.clientId,client_secret:t.clientSecret,code:e,redirect_uri:`${U(n)}/install/slack/callback`})}),a=await i.json(),o=a.is_enterprise_install===!0,s=o?a.enterprise:a.team;if(!i.ok||!a.ok||!a.access_token||!s?.id||!s.name)throw new b(`platform-error`,a.error??String(i.status));return{id:s.id,name:s.name,org:o,accessToken:a.access_token,...a.authed_user?.id?{installer:a.authed_user.id}:{}}}async function Ge(e,t){let n=[],r=``;do{let i=await W(`auth.teams.list`,{limit:1e3,...r?{cursor:r}:{}},e,t);n.push(...i.teams.map(e=>e.id)),r=i.response_metadata?.next_cursor??``}while(r);return n}const Ke={builtin:`own`,createStep:(e,t)=>{let n=t?.saved??[],r=n.length?{field:`token`,equals:`new`}:void 0;return{intro:`Coder creates the Slack app with a configuration token and installs its bot in the token's whole workspace.`,link:`https://api.slack.com/apps`,steps:[{...r?{when:r}:{},text:`Under **Your App Configuration Tokens**, click **Generate Token** and pick the workspace the agent should join.`},{text:`Paste the refresh token below, then approve the install when Slack asks.`,...r?{when:r}:{}}],notes:[`A workspace that requires app approval sends the install to its admins first. In Enterprise Grid, only an org admin can install org-wide.`,`To install the app in other Slack workspaces, click **Activate Public Distribution** under the app's **Manage Distribution**.`],fields:[...n.length?[{name:`token`,label:`Configuration token`,options:[...n.map(({id:e,label:t})=>({value:e,label:t})),{value:`new`,label:`Paste a new token`}]}]:[],{...r?{when:r}:{},name:`refreshToken`,label:`Refresh token`,hint:`Starts with xoxe-1-.`,placeholder:`xoxe-1-…`,required:!0}],submit:`Create Slack app`}},async createCallback(e,{publicUrl:t,state:n,definition:r,fetch:i,tokens:a}){if(!a)throw Error(`Configuration token storage is unavailable`);let o=new URLSearchParams(await e.text()),s=o.get(`token`);if(!s||s===`new`){let e=o.get(`refreshToken`);if(!e)throw Error(`Missing refresh token`);if(e.startsWith(`xoxe.xoxp-`))throw new b(`invalid-field`,`access-token`,`That is the access token, xoxe.xoxp-…. Paste the refresh token next to it, which starts with xoxe-1-.`);if(!e.startsWith(`xoxe-1-`))throw new b(`invalid-field`,`refresh-token`,`That is not a refresh token; they start with xoxe-1-. Copy it from Your App Configuration Tokens.`);let t=await J(e,i),n={workspace:t.workspace,user:t.user,workspaceName:t.workspace,credentials:t},r=await W(`auth.test`,{},t.configToken,i).catch(()=>void 0);s=await a.put({...n,workspaceName:r?.team||n.workspaceName})}let c=r.name??n.agent,l=await Y(a,s,i,e=>He(e,q(t,c,r),i));return{platformAppId:l.appId,name:c,credentials:{...l,configTokenId:s,scopes:K(r)}}},manifest:(e,{publicUrl:t,definition:n})=>q(t,e.name,n),async update(e,t,{publicUrl:n,definition:r,fetch:i,saveCredentials:a,tokens:o}){let s=t;if(!s.configTokenId||!o)throw new b(`no-refresh-token`);await Y(o,s.configTokenId,i,t=>W(`apps.manifest.update`,{app_id:s.appId,manifest:JSON.stringify(q(n,e.name,r))},t,i));let c=K(r);c.join()!==s.scopes?.join()&&await a({...s,scopes:c})},settingsUrl:(e,t)=>`https://api.slack.com/apps/${encodeURIComponent(t.appId)}`,installUrl(e,t,{publicUrl:n,state:r}){let i=t;return Ue(i,n,r,i.scopes??X(`write`))},async installCallback(e,{app:t,credentials:n,publicUrl:r,fetch:i,tokens:a}){let o=new URL(e.url).searchParams.get(`code`);if(!o)throw new b(`missing-code`);let s=await We(o,n,r,i),c=n.configTokenId;a&&c&&!s.org&&await a.use(c,(e,t)=>t(e,s.name));let l=await W(`auth.test`,{},s.accessToken,i).then(e=>e.url?.replace(/\/$/,``)).catch(()=>void 0),u=s.org?await Ge(s.accessToken,i).catch(()=>null):void 0;return{platformInstallId:s.id,account:{login:s.name,...s.org?{type:`Organization`}:{},...l?{url:l}:{}},token:s.accessToken,...s.org?{covers:u}:{},installer:s.installer,...s.installer?{user:{id:s.installer}}:{}}}},qe=[`app_mentions:read`,`channels:history`,`groups:history`,`im:history`,`channels:read`,`groups:read`,`im:read`,`mpim:read`,`users:read`,`users:read.email`,`files:read`,`usergroups:read`,`reactions:read`,`reactions:write`,`commands`,`links:read`,`links:write`];function X(e=`write`,t=[]){return[...qe,...t.includes(`dm`)?[`mpim:history`]:[],`chat:write`,`files:write`,`im:write`,`assistant:write`,...(Array.isArray(e)?e.includes(`write`):e===`write`)?[`channels:join`,`channels:manage`,`groups:write`,`mpim:write`,`usergroups:write`]:[]]}const Je={mention:[`app_mention`],dm:[`message.im`,`message.mpim`],channel:[`message.channels`,`message.groups`]},Ye=[`mention`,`dm`,`channel`];function Xe(e){let t=e.some(e=>Ye.includes(e));return[...new Set([...e.flatMap(e=>Je[e]??[]),...t?[`reaction_added`]:[]]),`team_access_granted`,`team_access_revoked`,`app_uninstalled`,`tokens_revoked`,`app_home_opened`,`link_shared`]}function Ze(e,t){return{slash_commands:[{command:`/setup`,url:`${e.replace(/\/$/,``)}/hooks/slack`,description:`Configure this agent`,usage_hint:`repo owner/name | model <name> | show`}],agent_view:{agent_description:t.description??`${t.name??`Coder`} in your workspace.`}}}const Qe={read:[`read`],write:[`read`,`write`]};function $e(e,t,n){let r=!e.includes(`write`),i=`/tmp/coder-slack-${f()}`;return{name:`slack`,command:`slack-mcp-server`,readOnly:r,args:[`--transport`,`stdio`],env:{SLACK_MCP_XOXB_TOKEN:n,SLACK_MCP_USERS_CACHE:`${i}-users.json`,SLACK_MCP_CHANNELS_CACHE:`${i}-channels.json`,SLACK_MCP_LOG_LEVEL:`error`,SLACK_MCP_ADD_MESSAGE_TOOL:r?``:`true`,SLACK_MCP_REACTION_TOOL:r?``:`true`,SLACK_MCP_ATTACHMENT_TOOL:`true`,SLACK_MCP_MARK_TOOL:r?``:`true`},credentialFields:{env:`SLACK_MCP_XOXB_TOKEN`}}}const et=e({type:s(a()),team_id:s(a()),enterprise_id:s(a()),is_enterprise_install:s(i([o(),a()])),api_app_id:s(a()),challenge:s(a()),authorizations:s(t(e({user_id:s(a()),team_id:s(c(a())),enterprise_id:s(c(a())),is_enterprise_install:s(o())})))}),tt=e({enterprise_id:s(a()),authorizations:s(t(e({enterprise_id:s(a())}))),event:e({type:r([`team_access_granted`,`team_access_revoked`]),team_ids:t(a())})}),nt=e({type:r([`app_uninstalled`,`tokens_revoked`]),tokens:s(e({bot:s(t(a()))}))}),rt=e({type:n(`app_home_opened`),user:a(),tab:n(`home`)}),it=e({type:n(`link_shared`),channel:a(),message_ts:a(),unfurl_id:s(a()),source:s(a()),links:t(e({url:a()}))}),at=`link:`,ot=e({type:n(`block_actions`),actions:t(e({action_id:a()}))});function Z(e){try{return JSON.parse(e)}catch{let t=new URLSearchParams(e),n=t.get(`payload`);if(!n)return Object.fromEntries(t);try{return JSON.parse(n)}catch{return{}}}}function st(e,t,n){let r=nt.safeParse(e.event).data;if(r){let e=r.type===`app_uninstalled`||r.tokens?.bot?.length;return n&&e?{uninstalled:`${t}:${n}`}:{ack:!0}}let i=rt.safeParse(e.event).data;if(i)return{work:async e=>(await import(`./views-CE2d9x6T.js`)).publishHome(e,i.user)};let a=it.safeParse(e.event).data;if(a)return{work:async e=>(await import(`./views-CE2d9x6T.js`)).unfurl(e,a)};let o=ot.safeParse(e).data?.actions;if(o?.length&&o.every(e=>e.action_id.startsWith(`link:`)))return{ack:!0};if(e.type&&e.type!==`event_callback`&&e.type!==`url_verification`)return{unhandled:`Slack interaction ${e.type}`};let s=tt.safeParse(e).data,c=s?.enterprise_id??s?.authorizations?.[0]?.enterprise_id;if(!s||!c)return;let l=s.event.team_ids;return{covers:{installation:`${t}:${c}`,...s.event.type===`team_access_granted`?{add:l}:{remove:l}}}}function ct(e,t,n){let r=e.headers.get(`x-slack-request-timestamp`)??``;if(!n||!(Math.abs(Date.now()/1e3-Number(r))<=300))return!1;let i=`v0=${d(`sha256`,n).update(`v0:${r}:${t}`).digest(`hex`)}`;return p(e.headers.get(`x-slack-signature`)??``,i)}const Q=e=>e===`im`||e===`mpim`?`dm`:`channel`;function lt(e,t,n=`send it a direct message`){let r=[t.includes(`mention`)&&`mention @${e} in a channel`,t.includes(`dm`)&&n,t.includes(`channel`)&&`write in a channel it is in`].filter(e=>!!e);if(!r.length)return;let i=r.length>1?`${r.slice(0,-1).join(`, `)}, or ${r.at(-1)}`:r[0];return`${i[0].toUpperCase()}${i.slice(1)}.`}const $={id:`slack`,brand:{color:`#E3066A`,icon:`M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zM18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zM15.165 18.956a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z`,svg:`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"><g><path d="M 84.04 252.77 c 0 23.13 -18.89 42.02 -42.02 42.02 S 0 275.9 0 252.77 s 18.89 -42.02 42.02 -42.02 h 42.02 v 42.02 Z" fill="#e3066a"/><path d="M 105.21 252.77 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 v 105.21 c 0 23.13 -18.89 42.02 -42.02 42.02 s -42.02 -18.89 -42.02 -42.02 c 0 0 0 -105.21 0 -105.21 Z" fill="#e3066a"/></g><g><path d="M 147.23 84.04 c -23.13 0 -42.02 -18.89 -42.02 -42.02 S 124.1 0 147.23 0 s 42.02 18.89 42.02 42.02 v 42.02 h -42.02 Z" fill="#00b3ff"/><path d="M 147.23 105.21 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 H 42.02 c -23.13 0 -42.02 -18.89 -42.02 -42.02 s 18.89 -42.02 42.02 -42.02 c 0 0 105.21 0 105.21 0 Z" fill="#00b3ff"/></g><g><path d="M 315.96 147.23 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 -18.89 42.02 -42.02 42.02 h -42.02 v -42.02 Z" fill="#41b658"/><path d="M 294.79 147.23 c 0 23.13 -18.89 42.02 -42.02 42.02 s -42.02 -18.89 -42.02 -42.02 V 42.02 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 v 105.21 Z" fill="#41b658"/></g><g><path d="M 252.77 315.96 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 -42.02 -18.89 -42.02 -42.02 v -42.02 h 42.02 Z" fill="#fcc003"/><path d="M 252.77 294.79 c -23.13 0 -42.02 -18.89 -42.02 -42.02 s 18.89 -42.02 42.02 -42.02 h 105.21 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 h -105.21 Z" fill="#fcc003"/></g></svg>`},name:`Slack`,featured:!0,description:`Mentions, direct messages, and channel messages in a Slack workspace`,installLabel:`Add to Slack`,use:e=>lt(`{handle}`,e),covered:`Slack workspace`,sample:`slack:C0000000000:1700000000.000100`,prompt:[`A conversation is a Slack thread or a whole 1:1 DM. A group DM works like a channel.`,`conversations_replies reads a thread. conversations_history reads a channel or DM, including DM messages older than your history.`,`Your final message renders as Markdown with headings, tables, lists, code blocks and quotes.`,`Mention a person as <@USER_ID>.`].join(`
|
|
5
|
+
`),replyLimit:12e3,events:{mention:{description:`A message that mentions the agent in a channel or group DM.`,on:`mention`,addressed:!0},dm:{description:`Every message in a direct message or group DM with the agent.`,on:`message`,addressed:!0},command:{description:`/setup and other slash commands`,on:`command`},channel:{description:`Every message in channels the agent is in. Slack delivers at most 30,000 events per workspace per app per hour.`,on:`message`,noisy:!0,addressed:!0}},tools:{presets:Qe,server:$e,install:`set -eu; arch=$(uname -m); case "$arch" in x86_64) arch=amd64; checksum=d1525962e9b9dbfdd2eaf48d0a81ca1eca7d8f1862b8d34931b812c850b3e568;; aarch64|arm64) arch=arm64; checksum=a307a48d16c2261346bdc257274cdcdb8b2027c867dc971b41d52cef36472c88;; *) exit 1;; esac; file=$(mktemp); trap 'rm -f "$file"' EXIT; curl -fsSL "https://github.com/korotovsky/slack-mcp-server/releases/download/v1.3.0/slack-mcp-server-linux-$arch" -o "$file"; echo "$checksum $file" | sha256sum -c -; install -m 755 "$file" /usr/local/bin/slack-mcp-server`,installHosts:[`github.com`,`release-assets.githubusercontent.com`]},hosts:[`slack.com`,`*.slack.com`],get app(){return Ke},target(e,t){let n=Z(t),r=et.safeParse(n).data;if(r?.type===`url_verification`&&r.challenge)return new Response(r.challenge);let i=r?.authorizations?.[0],a=i?.team_id??r?.team_id??n.team?.id,o=String(i?.is_enterprise_install??r?.is_enterprise_install)===`true`,s=o?i?.enterprise_id??r?.enterprise_id??n.enterprise?.id:a,c=i?.user_id;return r?.api_app_id?{app:r.api_app_id,...s?{installation:s}:{},...o&&a?{within:a}:{},...c?{self:c}:{}}:void 0},welcome:async(e,t,n)=>(await import(`./views-CE2d9x6T.js`)).welcome(e,t,n),link(e){let t=/^slack:([^:]+):(\d+)\.(\d+)$/.exec(e.chat?.thread.id??``);return t?`https://slack.com/archives/${t[1]}/p${t[2]}${t[3]}`:void 0},ownEvents(e,t,n,r){let i=$.target(e,t),a=st(Z(t),n.id,i&&!(i instanceof Response)?i.installation:void 0);if(a)return ct(e,t,r?.signingSecret)?a:{invalid:!0}},adapter:async e=>(await import(`./adapter-CkL4PqXE.js`)).slackAdapter(e),event(e,t,n){let r=n.raw.channel_type;return{type:t.isDM?`dm`:e===`mention`?e:Q(r),actor:{id:n.author.userId,...n.author.userName?{login:n.author.userName}:{}}}},requestFetch:ze,isUninstalled(e){let t=e?.data?.error;return[`invalid_auth`,`account_inactive`,`token_revoked`].includes(t??``)},conversation:async(e,t)=>(await import(`./conversation-DT-35cEt.js`)).slackConversation(e,t),auth:{canWrite:Be,async token(e){if(!e.token)throw Error(`Slack installation ${e.id} has no bot token`);return e.token}}};export{W as a,Ie as c,b as d,g as f,lt as i,R as l,ne as m,Q as n,Re as o,p,$ as r,Le as s,at as t,x as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./cli-
|
|
1
|
+
import{i as e}from"./cli-BBlH53hA.js";import{g as t,p as n,s as r}from"./output-BKeyLbvt.js";import{n as i}from"./args-CURX44CA.js";import a from"node:process";const o=e({name:`auth status`,globalFlags:{cwd:!1},help:{usage:`coder auth status [--json]`,summary:`List saved sessions with their server, user, and workspace.`,env:[[`CODER_SERVER`,`the server to use instead of https://coder.wular.ai`]]},options:{json:i},run:async()=>{let{sessions:e}=await import(`./remote-D3JZ4MMQ.js`).then(e=>e.s);return e.status()},print:e=>{let i=n,o=Object.entries(e);if(!o.length)return void a.stdout.write(`${i.dim(`Not signed in`)}\n\n${r([`Sign in: coder auth login`],i)}\n`);a.stdout.write(`${t([{header:`server`,value:([e])=>e,paint:e=>i.cyan(e)},{header:`user`,value:([,e])=>e.user.email},{header:`workspace`,value:([,e])=>e.organization?`${e.organization.name} (${e.organization.slug})`:`-`}],o,i)}\n`)}});export{o as commandStatus};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{U as e}from"./dispatch-
|
|
1
|
+
import{U as e}from"./dispatch-CFZ9Crvg.js";import{i as t,r as n}from"./cli-BBlH53hA.js";import{p as r,r as i,s as a}from"./output-BKeyLbvt.js";import{c as o,n as s,s as c,t as l}from"./args-CURX44CA.js";import{i as u,r as d}from"./result-D0dpv2O_.js";import f from"node:process";function p(t,n,r){let[i,...a]=t,o=a.join(` `).trim();if(!i||!o)throw new e(`invalid-option`,n,{hint:r});return{id:i,text:o}}function m(e,t=!1){let{taskId:n,steered:o}=e;if(o===`queued`){f.stdout.write(`${r.dim(`[coder]`)} follow-up queued for task ${r.cyan(n)}; it runs when the current turn finishes.\n`),t&&f.stdout.write(`\n${r.dim(`[coder] --wait is not available for a queued follow-up.`)}\n\n${a([`Wait in its own background shell, one per task: coder task result ${n} --wait`],r)}\n`);return}if(!t){f.stdout.write(o===`live`?`${r.dim(`[coder]`)} steered follow-up into running task ${r.cyan(n)}.\n`:`${r.dim(`[coder]`)} resumed task ${r.cyan(n)} with the follow-up (same thread, same id).\n`),f.stdout.write(`\n${a([`Wait in its own background shell, one per task: coder task result ${n} --wait`],r)}\n`);return}f.stdout.write(`\n${e.finalMessage||`(no final message)`}\n\n`),f.stderr.write(`${r.dim(`[coder] task=${n} status=${e.status??`unknown`}`)}\n\n${d(n,i)}\n`)}const h=t({name:`task steer`,help:{usage:`coder task steer <task-id> "<follow-up instructions>" [--wait] [--server [url]]`,summary:`Continue a task's thread with new instructions. They are injected into a live Codex or
|
|
2
2
|
Claude turn at its next tool boundary and queued across a startup or completion race.
|
|
3
3
|
A stopped, finished, or archived task resumes on the same task id. It reuses the
|
|
4
|
-
task's engine, model, and permissions unless overridden.`,flags:[[`--wait`,`run in the foreground and block until the answer is ready`],[`--model <alias|slug>`,`override the task's model for this follow-up`],[`--effort <low|medium|high>`,`override the task's reasoning effort`],[`--permissions <mode>`,`read-only · workspace-write · auto`],n],examples:[[`coder task steer task-abc "now add tests"`,`continue that task with a follow-up`]]},options:{...l,model:o,effort:o,permissions:o,wait:s,...c},args:1/0,async run({options:e,args:t}){let{tasks:n}=await import(`./task-
|
|
4
|
+
task's engine, model, and permissions unless overridden.`,flags:[[`--wait`,`run in the foreground and block until the answer is ready`],[`--model <alias|slug>`,`override the task's model for this follow-up`],[`--effort <low|medium|high>`,`override the task's reasoning effort`],[`--permissions <mode>`,`read-only · workspace-write · auto`],n],examples:[[`coder task steer task-abc "now add tests"`,`continue that task with a follow-up`]]},options:{...l,model:o,effort:o,permissions:o,wait:s,...c},args:1/0,async run({options:e,args:t}){let{tasks:n}=await import(`./task-DJ6nruuA.js`).then(e=>e.t),{id:r,text:i}=p(t,`Missing task id or follow-up text.`,[`Usage: coder task steer <task-id> "<follow-up>" [--wait]`,`Help: coder task steer --help`]);return n.steer(r,i,{...e,organization:e.workspace})},json(e,{options:t}){let n=e;return t.server!==void 0||!t.wait||n.steered===`queued`?e:{taskId:n.taskId,status:n.status??null,finalMessage:n.finalMessage??null}},print(e,{options:t,args:[n]}){if(t.server===void 0)return m(e,t.wait);if(t.wait)return u(e,r);f.stdout.write(`Steered server task ${r.cyan(n)}.\n`)},exit(e,{options:t}){let n=e;if(t.wait&&(t.server!==void 0||n.steered!==`queued`))return n.status===`completed`?0:1}});export{h as commandSteer,p as idAndText};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e,r as t}from"./cli-
|
|
1
|
+
import{i as e,r as t}from"./cli-BBlH53hA.js";import{p as n}from"./output-BKeyLbvt.js";import{s as r,t as i}from"./args-CURX44CA.js";import a from"node:process";const o=e({name:`task stop`,help:{usage:`coder task stop <task-id> [--server [url]]`,summary:`Interrupt a running task and mark it cancelled.`,flags:[t]},options:{...i,...r},args:1,run:async({options:e,args:[t]})=>{let{tasks:n}=await import(`./task-DJ6nruuA.js`).then(e=>e.t);return n.stop(t,{...e,organization:e.workspace})},print:(e,{options:t,args:[r]})=>a.stdout.write(t.server===void 0?`Stopped task ${n.cyan(e.taskId)} ${n.dim(`(${e.interrupt})`)}\n`:`Stopped server task ${n.cyan(r)}.\n`)});export{o as commandStop};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{i as e}from"./cli-
|
|
1
|
+
import{i as e}from"./cli-BBlH53hA.js";import{m as t,p as n,s as r}from"./output-BKeyLbvt.js";import{n as i,t as a}from"./args-CURX44CA.js";import o from"node:process";const s=e({name:`flow stop`,help:{usage:`coder flow stop [run-id] [--keep-tasks] [--json]`,summary:`Stop a running flow: signal the orchestrator so it stops dispatching, stamp the
|
|
2
2
|
run stopped, and stop its still-running tasks. Defaults to the most recent run;
|
|
3
|
-
the journal stays ready for \`coder flow resume\`.`,flags:[[`--keep-tasks`,`leave the run's still-running tasks running`]]},options:{...a,"keep-tasks":i},args:1,run:async({options:e,args:[t]})=>{let{stopRun:n}=await import(`./executor-
|
|
3
|
+
the journal stays ready for \`coder flow resume\`.`,flags:[[`--keep-tasks`,`leave the run's still-running tasks running`]]},options:{...a,"keep-tasks":i},args:1,run:async({options:e,args:[t]})=>{let{stopRun:n}=await import(`./executor-3QMa-XRY.js`).then(e=>e.t);return n(t,{keepTasks:e[`keep-tasks`]})},print:c});function c(e){let i=n;e.status===`failed`?o.stdout.write(`${i.dim(`[flow]`)} Run ${i.cyan(e.runId)} orchestrator died. Marked ${t(`failed`)}.\n`):o.stdout.write(`${i.dim(`[flow]`)} run ${i.cyan(e.runId)} ${t(e.status)}.\n`),e.stoppedTasks.length&&o.stdout.write(`${i.dim(`[flow]`)} stopped tasks: ${e.stoppedTasks.join(`, `)}\n`),e.keptTasks.length&&o.stdout.write(`${i.dim(`[flow]`)} left running: ${e.keptTasks.join(`, `)}\n`),o.stdout.write(`\n${r([`Resume: coder flow resume ${e.runId}`],i)}\n`)}export{s as commandStop};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{qi as e}from"./core-DwsAMCnL.js";import{Bt as t,Et as n,Mt as r,Rt as i,St as a,Vt as o,W as s,Xn as c,Yt as l,
|
|
1
|
+
import{qi as e}from"./core-DwsAMCnL.js";import{Bt as t,Et as n,Mt as r,Rt as i,St as a,Vt as o,W as s,Xn as c,Yt as l,hn as u,lr as d,nn as f,pn as p,qt as m,zt as h}from"./prompts-Bj4Fbd_n.js";import{U as g,d as _,f as v,i as y,l as b,m as ee,o as x,p as S,r as C,t as w,y as T}from"./dispatch-CFZ9Crvg.js";import{v as E}from"./prompt-PEgcMJO7.js";import{t as D}from"./remote-D3JZ4MMQ.js";import{c as O,i as k,l as A,n as j,r as M,s as N,t as P}from"./actions-Cwe3IDVs.js";import F from"node:path";import I from"node:process";var L=e({tasks:()=>$});function R(e){return{cwd:e.cwd?F.resolve(e.cwd):I.cwd(),...e.server===void 0?{}:{api:D(e)}}}function z(e,t){let n=r(e,t);if(n)return n;throw new g(`invalid-option`,t?`No task found for "${t}".`:`No tasks found for this workspace.`,{hint:t?[`List tasks: coder task list`,`Start one: coder run "<text>"`]:[`Start one: coder run "<text>"`]})}async function B(e,t){if(t)return e.tasks.get(t);let[n]=await e.tasks.list({limit:1});if(!n)throw new g(`server`,`No server tasks found.`);return n}function V(e){throw new g(`invalid-option`,`Missing task id.`,{hint:e})}async function H(e,t={}){if(t.outputSchema!==void 0&&(!t.outputSchema||typeof t.outputSchema!=`object`||Array.isArray(t.outputSchema)))throw new g(`invalid-option`,`outputSchema must be an object.`);let{cwd:n,api:r}=R(t);if(r){let n=await r.tasks.create({source:`cli`,prompt:e,...t.cwd?{cwd:t.cwd}:{},...t.outputSchema?{outputSchema:t.outputSchema}:{},...t.repo?{repo:t.repo}:{},...t.agent?{agent:t.agent}:{},...t.engine?{engine:t.engine}:{},...t.model?{model:t.model}:{},...t.effort?{effort:t.effort}:{},...t.permissions?{permissions:t.permissions}:{},...t.runner?{runner:t.runner}:{},...t.mcp?{mcp:t.mcp.split(`,`).map(e=>e.trim())}:{},...t.connections?{connections:t.connections}:{}});return t.wait?r.tasks.wait(n.task.id,{onLog:t.onLog}):n}let i=t.agent?await(await import(`./exec-Cprez703.js`).then(e=>e.i)).agentTaskOptions(n,t.agent,t.mcp,void 0,t.connections):void 0,a=i?.connected??await c(t.connections);for(let e of a.warnings)t.onNote?.(e);let o=s(n),l=i??b(t.mcp,o.mcp,{},a.mcp),u={prompt:e,outputSchema:t.outputSchema,cwd:n,engine:t.engine??i?.engine,model:t.model??(t.engine?void 0:i?.model),effort:t.effort??(t.engine?void 0:i?.effort),permissions:t.permissions??i?.permissions,name:t.name,system:t.system,...i?{agentPrompt:{developer:i.developer}}:{},wait:t.wait,simulateApproval:t.simulateApproval,addDirs:t.addDirs,...t.agent?{agentId:t.agent}:{},mcp:l.mcp,mcpBindings:l.mcpBindings,mcpWarnings:l.warnings,connectionEnv:a.env,connections:a.ids,nativeMcp:l.nativeMcp,...t.onFallback?{onFallback:t.onFallback}:{},...t.onNote?{onNote:t.onNote}:{}},d=await C(u,{config:o});if(!t.wait){let e=d.taskId;return{taskId:e,status:d.task.status,startupCheck:d.startupCheck,commands:{result:`coder task result ${e} --wait`,steer:`coder task steer ${e} "<follow-up>"`,stop:`coder task stop ${e}`,list:`coder task list`}}}for(;;){let r=d.taskId;t.onWaiting?.(r);let i=await S(n,r),{task:a,result:s}=i,c=s?.error?.message??``;if(a.status===`failed`&&y(a.permissions??`auto`,c))throw new g(`read-only-unavailable`,c);let l=_(n,i,o);if(l!==void 0){if(l===null)throw new g(`chain-exhausted`,c,{payload:w(d.engine,c,a.permissions??`auto`,t.system,e)});t.onFallback?.({engine:d.engine,detail:c,next:l}),d=await C({...u,engine:l,model:void 0,effort:void 0,name:void 0,simulateApproval:void 0},{config:o});continue}return{taskId:r,status:a.status,finalMessage:s?.finalMessage,...c?{error:c}:{},tokens:s?.tokens??null,model:s?.model??a.model??null}}}async function U(e,t={}){let{cwd:n,api:r}=R(t);if(r){let n=await B(r,e);return t.wait?r.tasks.wait(n.task.id):n}let o=z(n,e);if(t.wait){p.includes(o.status)&&t.onWaiting?.(o.id);let e=await v(n,o);if(o=e.task,e.reason===`approval`)throw new g(`approval-pending`,`Approval needed for task ${o.id}: ${e.approval.summary}`,{taskId:o.id,approval:e.approval})}let{steps:s,result:c,turns:l}=x(n,o.id,{tail:t.tail}),u=T(f(n,o.id)).filter(e=>!e.response),d=p.includes(o.status),h=d?i(n,o):o.updatedAt,_=a(h),y=d?m(n,o.id,200):[];return{taskId:o.id,status:d&&u.length?`waiting-approval`:o.status,task:o,result:c,steps:s,turns:l,pendingApprovals:u.map(e=>({id:e.id,summary:e.summary,cwd:e.cwd??null})),...d?{idleMs:_,lastActivityAt:h??null,stalled:u.length===0&&_>6e5,lastLog:y.at(-1),liveTokens:y.reverse().find(e=>e.kind===`usage`&&String(e.at??``)>=(o.resumedAt??``))?.tokens??null}:{}}}async function W(e={}){let{cwd:t,api:n}=R(e);if(n){let t=await n.tasks.list({status:e.running?`running`:void 0,limit:e.limit===`all`?200:e.limit,archived:e.archived});return e.stopped?t.filter(e=>u.includes(e.status)):t}let{tasks:r,clipped:o}=M(t,{...e,dir:e.dir??e.cwd}),s=r.map(e=>{let n=p.includes(e.status)?T(f(t,e.id)).filter(e=>!e.response).length:0;return{taskId:e.id,status:n?`waiting-approval`:e.status,pendingApprovals:n,engine:e.engine??null,model:e.model??null,effort:e.effort??null,name:e.name??null,cwd:e.cwd??null,prompt:String(e.prompt??``).replace(/\s+/g,` `).trim().slice(0,80),updatedAt:e.updatedAt,archived:e.archived??!1,flowRunId:e.flowRunId??null,idleMs:p.includes(e.status)?a(i(t,e)):null}}),c=!s.length&&!e.archived?h(t,{migrate:!1}).length:0;return Object.assign(s,{clipped:o,archived:c})}async function*G(e,t){let n=-1;for(;;){let r=await e.tasks.stream(t,n);if(!r.ok||!r.body){let n=await e.tasks.get(t);if(u.includes(n.status))return;if(r.status===401)continue;throw new g(`server`,`The task stream answered ${r.status}.`)}let i=!1;for await(let e of E(r.body))if(e.event===`log`){let t=JSON.parse(e.data);n=t.seq,yield t}else e.event===`end`&&(i=!0);if(i)return}}async function K(e,t={}){let{cwd:n,api:r}=R(t);if(r){let t=await B(r,e);return{task:t,events:G(r,t.task.id),final:()=>r.tasks.get(t.task.id)}}let i=z(n,e);return{task:i,events:A(n,i.id,{tail:t.tail}),async final(){let e=l(n,o(n,i.id)??i),t=d(F.join(f(n,i.id),`result.json`));return{taskId:i.id,status:e.status,result:t,task:e}}}}async function q(e,t,n={}){let{cwd:r,api:i}=R(n);if(i){let r=await i.tasks.steer(e,t,{...n.model?{model:n.model}:{},...n.effort?{effort:n.effort}:{},...n.permissions?{permissions:n.permissions}:{}});return n.wait?i.tasks.wait(e):r}let a=await N(r,z(r,e),t,{model:n.model,effort:n.effort,permissions:n.permissions});if(!n.wait||a.steered===`queued`)return a;let s=o(r,a.taskId),c=s?(await S(r,s.id)).task:null,l=d(F.join(f(r,a.taskId),`result.json`));return{...a,status:c?.status??null,finalMessage:l?.finalMessage??null}}async function J(e,t,n={}){let{cwd:r,api:i}=R(n);if(i)return i.tasks.ask(e,t);let a=z(r,e);n.onAsking?.(a.id);let o=await P(r,a,t,{model:n.model,effort:n.effort});return{taskId:a.id,answer:o.finalMessage||null,...o.error?{error:o.error.message}:{},ok:o.status===0}}async function Y(e,t={}){let{cwd:n,api:r}=R(t);if(r)return(e?[await r.tasks.get(e)]:await r.tasks.list({limit:200})).flatMap(e=>e.approval?[{taskId:e.task.id,...e.approval}]:[]);if(!e)return j(n);let i=z(n,e);return T(f(n,i.id)).map(e=>({taskId:i.id,id:e.id,summary:e.summary,cwd:e.cwd??null,createdAt:e.createdAt,answered:e.response?.decision??null}))}async function X(e,t,n={}){let{cwd:r,api:i}=R(n),a=n.deny?`decline`:`accept`;if(i){if(!e||!t)throw new g(`invalid-option`,`Server approvals need a task id and approval id.`,{hint:`Usage: coder task approve <task-id> <approval-id> --server <url>`});return i.tasks.approve(e,t,a)}if(e&&!t&&e.startsWith(`apr-`)&&(t=e,e=j(r).find(e=>e.id===t)?.taskId,!e))throw new g(`invalid-option`,`No pending approval "${t}".`,{hint:`List them: coder task approvals`});if(!e||!t)throw new g(`invalid-option`,`Missing approval id.`,{hint:[`List them: coder task approvals`,`Usage: coder task approve [task-id] <approval-id> [--deny]`]});let o=z(r,e);return ee(f(r,o.id),t,a),{taskId:o.id,approvalId:t,decision:a}}async function Z(e,t={}){let{cwd:n,api:r}=R(t);if(r)return r.tasks.cancel(e??V([]));let i=z(n,e),{interrupt:a}=await O(n,i);return{taskId:i.id,status:`cancelled`,interrupt:a}}async function Q(e,r={}){let{cwd:i,api:a}=R(r);if(a){let t=r.allStopped?(await a.tasks.list({limit:200})).filter(e=>u.includes(e.status)).map(e=>e.task.id):[e??V([])];return await Promise.all(t.map(e=>a.tasks.archive(e))),{archived:t,count:t.length}}if(r.allStopped){let e=t(i).filter(e=>u.includes(e.status));for(let t of e)n(i,t);return{archived:e.map(e=>e.id),count:e.length}}e||V([`Archive one: coder task archive <task-id>`,`Archive all stopped: coder task archive --all-stopped`]);let o=z(i,e);return n(i,o),{taskId:o.id,archived:!0}}async function te(e,t={}){let{cwd:n,api:r}=R(t);if(r){let n=t.allArchived?(await r.tasks.list({limit:200,archived:!0})).map(e=>e.task.id):[e??V([])];return await Promise.all(n.map(e=>r.tasks.delete(e))),{deleted:n,count:n.length}}if(t.allArchived){let e=h(n).filter(e=>k(n,e)).map(e=>e.id);return{deleted:e,count:e.length}}e||V([`Delete one: coder task delete <task-id>`,`Delete all archived: coder task delete --all-archived`]);let i=z(n,e);if(i.status===`running`)throw new g(`invalid-option`,`Task ${i.id} is still running.`,{hint:`Stop it first: coder task stop ${i.id}`});return k(n,i),{taskId:i.id,deleted:!0}}async function*ne(e,t={}){yield*(await K(e,t)).events}const $={run:H,result:U,list:W,watch:K,stream:ne,steer:q,ask:J,approvals:Y,approve:X,stop:Z,archive:Q,delete:te};export{$ as n,L as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{s as e}from"./cli-BBlH53hA.js";const t=[[`--wait`,`run in the foreground and block until the answer is ready`],[`--engine <codex|claude|custom>`,`engine to use; custom runs your configured custom models (default: first in the chain)`],[`--model <alias|slug>`,`luna/sol/astra (codex) · sonnet/opus/fable (claude) · a custom model (coder model list)`],[`--effort <low|medium|high>`,`reasoning effort`],[`--permissions <mode>`,`read-only · workspace-write · auto (default: auto)`],[`--mcp <names|all|json>`,'attach MCP servers from `mcp` in .coder/config.json by name (or all), or an inline JSON array [{"name","command","args","env","tools"}]; none by default, all adds your engine\'s own MCP servers'],[`--connections <ids>`,`use only these connections (coder connection list), within the agent's`],[`--add-dir <dir>`,`give the task another directory beyond --cwd (repeatable); read-only can only read it, other modes can also write`]],n=e(`task`,{worker:async()=>(await import(`./worker-CHD_OiQS.js`)).commandWorker,mcp:async()=>(await import(`./mcp-CKqinFkk.js`)).commandTaskMcp,hub:async()=>(await import(`./hub-B0WCXtsP.js`)).commandTaskHub,run:async()=>(await import(`./run-UPW-7pKo.js`)).commandTask,list:async()=>(await import(`./list-CZGTVKcS.js`)).commandTasks,ls:async()=>(await import(`./list-CZGTVKcS.js`)).commandTasks,watch:async()=>(await import(`./watch-DJXu13jK.js`)).commandWatch,stream:async()=>(await import(`./watch-DJXu13jK.js`)).commandWatch,result:async()=>(await import(`./result-D0dpv2O_.js`).then(e=>e.s)).commandResult,steer:async()=>(await import(`./steer-CMp-a7v2.js`)).commandSteer,ask:async()=>(await import(`./ask-D8TIVhPl.js`)).commandAsk,stop:async()=>(await import(`./stop-C7YjN2sB.js`)).commandStop,archive:async()=>(await import(`./archive-CMHRsVYf.js`)).commandArchive,delete:async()=>(await import(`./delete-D1hEPpsk.js`)).commandDelete,approvals:async()=>(await import(`./approvals-h5lytkey.js`)).commandApprovals,approve:async()=>(await import(`./approve-BNhg0MLi.js`)).commandApprove},{menu:[{sub:`run`,usage:`run "<text>"`,blurb:`run a task (background; --wait blocks)`,alias:`run`},{sub:`list`,usage:`list`,blurb:`list recent tasks (by default running + just stopped)`,alias:`list`},{sub:`result`,usage:`result [task-id]`,blurb:`status + final answer (--wait blocks)`,alias:`result`},{sub:`watch`,usage:`watch [task-id]`,blurb:`stream a task's live transcript`},{sub:`steer`,usage:`steer <task-id> "<follow-up>"`,blurb:`continue a task's thread`},{sub:`ask`,usage:`ask <task-id> "<question>"`,blurb:`ask about a task without interrupting it`},{sub:`stop`,usage:`stop <task-id>`,blurb:`interrupt a running task`},{sub:`archive`,usage:`archive <task-id>`,blurb:`archive a session (or --all-stopped)`},{sub:`delete`,usage:`delete <task-id>`,blurb:`delete a session (or --all-archived)`},{sub:`approvals`,usage:`approvals [task-id]`,blurb:`pending approvals (all tasks, or one)`},{sub:`approve`,usage:`approve <id>`,blurb:`answer an escalated permission`}].map(e=>({usage:e.usage,blurb:e.blurb,...e.alias?{note:`(coder ${e.alias})`}:{}}))},{aliases:{stream:`watch`,ls:`list`},hint:`Run a task: coder run "<text>"`});export{t as TASK_FLAGS,n as commandTaskGroup};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{qi as e}from"./core-DwsAMCnL.js";import{Bt as t,C as n,Dn as r,F as i,Ft as a,Jt as o,Kn as s,N as c,Vt as l,W as u,dn as d,dr as f,fr as p,gn as m,jt as h,kt as g,lr as _,mt as ee,nn as v,or as y,pr as b,un as x,wt as te}from"./prompts-Bj4Fbd_n.js";import{B as ne,L as S,a as re,c as ie,m as C,p as ae,z as w}from"./dispatch-CFZ9Crvg.js";import{t as oe}from"./integrations-IGnXBrPw.js";import{a as T,n as E,t as D}from"./history-C53URBjs.js";import{a as O,c as k,s as A,t as j}from"./actions-Cwe3IDVs.js";import{t as se}from"./log-view-CL3_S0IQ.js";import{o as M}from"./mcp-Dsl3Xdd3.js";import{a as ce,d as le,r as ue,s as de,u as fe}from"./exec-Cprez703.js";import N from"node:path";import P from"node:process";import{execFile as pe}from"node:child_process";import{createHash as F}from"node:crypto";import I from"node:os";import L from"node:net";import R from"node:fs/promises";import{promisify as z}from"node:util";import B from"node:http";import{gunzipSync as V,gzipSync as H}from"node:zlib";const U=e=>F(`sha256`).update(e).digest(`hex`);function W(e,t,r){if(e===`claude`)return N.join(n(),process.env.CLAUDE_CODE_PROJECT_DIR_NAME||`coder`,`${t}.jsonl`);let i=new Date(JSON.parse(r.slice(0,r.indexOf(`
|
|
2
|
+
`))).timestamp).toISOString().slice(0,19).replaceAll(`:`,`-`);return N.join(m(),`sessions`,...i.slice(0,10).split(`-`),`rollout-${i}-${t}.jsonl`)}function G(e,t){return t.flatMap(e=>[e,...e.startsWith(`Bearer `)?[e.slice(7)]:[]]).filter(e=>e.length>=8).flatMap(e=>[e,JSON.stringify(e).slice(1,-1)]).sort((e,t)=>t.length-e.length).reduce((e,t)=>e.replaceAll(t,`[REDACTED]`),e)}function K(e,t){let n=new Map;return{async restore(){let t=await e(`/history`).catch(e=>(console.error(`coder runner: saved history could not be listed`,e),[])),r=t.at(-1),i;return await Promise.all(t.map(async({engine:t,conversation:a})=>{if(D.test(a))try{let{data:o,state:s}=await e(`/history/${a}`);a===r.conversation&&(i=s);let c=V(Buffer.from(o,`base64`)).toString(`utf8`);for(let e of c.split(`
|
|
3
|
+
`))e.trim()&&JSON.parse(e);let[l]=await T({engine:t},a);l||(l=W(t,a,c),await R.mkdir(N.dirname(l),{recursive:!0,mode:448}),await R.writeFile(l,c,{mode:384})),n.set(a,{engine:t,hash:U(c),file:l})}catch(e){console.error(`coder runner: history ${a} could not be restored`,e)}})),{...r?{resume:{...i,engine:r.engine,threadId:r.conversation}}:{},restored:!!(r&&n.has(r.conversation))}},async save(r){let i=new Map([...n].map(([e,{engine:t}])=>[e,t]));if(r?.engine===`claude`||r?.engine===`codex`)for(let e of E(r))i.delete(e),i.set(e,r.engine);let a=await t();for(let[t,o]of i){let i=n.get(t)?.file,s=i&&await R.stat(i).then(e=>e.isFile(),()=>!1)?i:(await T({engine:o},t))[0],c=s?await R.readFile(s,`utf8`).catch(()=>``):``,l=t===r?.threadId;if(!c||!l&&U(c)===n.get(t)?.hash)continue;let u=H(G(c,a)).toString(`base64`);if(u.length>3145728){console.error(`coder runner: history ${t} is too large to save`);continue}let d=l?JSON.parse(G(JSON.stringify({previousThreadIds:r.previousThreadIds,pendingRollover:r.pendingRollover}),a)):void 0;await e(`/history`,{method:`POST`,body:JSON.stringify({engine:o,conversation:t,data:u,...d?{state:d}:{}})}).then(()=>n.set(t,{engine:o,hash:U(c),file:s}),e=>console.error(`coder runner: history ${t} was not saved`,e))}}}}var q=e({INBOX_COMMAND:()=>Ne,INBOX_SOCKET:()=>Ae,applyTaskMessage:()=>Ee,checkout:()=>Z,checkoutCache:()=>he,inboxSocket:()=>je,prepareRepo:()=>Ce,receiveInbox:()=>Pe,releaseCheckout:()=>$,requestInboxControl:()=>Te,runTask:()=>Oe,sendInbox:()=>Me,startInboxControl:()=>we,taskServer:()=>Y,withCheckoutLock:()=>Q});const J=z(pe);function Y(){let e=P.env.CODER_SERVER?.replace(/\/+$/,``),t=P.env.CODER_TASK_TOKEN;if(!e||!t)throw Error(`CODER_SERVER and CODER_TASK_TOKEN are required with --task`);return{server:e,token:t}}async function X(e,t,n,r=``,i={}){let a=await fetch(`${e}/tasks/${encodeURIComponent(n)}${r}`,{...i,signal:i.signal?AbortSignal.any([i.signal,AbortSignal.timeout(3e4)]):AbortSignal.timeout(3e4),headers:{authorization:`Bearer ${t}`,...i.body?{"content-type":`application/json`}:{},...i.headers}}),o=await a.json().catch(()=>({}));if(!a.ok)throw Object.assign(Error(o.error??`Coder server answered ${a.status}`),{status:a.status});return o}function me(e){return e.length>0&&!e.startsWith(`-`)&&!e.endsWith(`/`)&&!e.endsWith(`.`)&&!e.endsWith(`.lock`)&&!/[\x00-\x20\x7f~^:?*[\\]/.test(e)&&!e.includes(`..`)&&!e.includes(`@{`)&&!e.includes(`//`)}async function Z(e,t,n,r,i){let a=e.event?.repo;if(!a)return t;let o=N.join(t,`repo`);if(!me(a.defaultBranch))throw Error(`Invalid repository ref`);let s=new URL(a.cloneUrl),c=oe[e.event.integration]?.repos?.cloneHosts??[];if(s.protocol!==`https:`||!c.includes(s.hostname))throw Error(`Repository clone host does not match the integration`);await R.mkdir(t,{recursive:!0});let l=await R.mkdtemp(N.join(t,`.git-credential-`)),u=N.join(l,`token`),d=N.join(l,`askpass.sh`);n&&(await R.writeFile(u,n,{mode:384}),await R.writeFile(d,`#!/bin/sh
|
|
4
|
+
case "$1" in *Username*) printf x-access-token;; *) command cat "$CODER_GIT_TOKEN_FILE";; esac
|
|
5
|
+
`,{mode:448}));let f=n?{env:{...P.env,GIT_ASKPASS:d,CODER_GIT_TOKEN_FILE:u,GIT_TERMINAL_PROMPT:`0`}}:void 0;try{let e={...f,signal:i,maxBuffer:67108864};if(r)return await Q(r,async()=>{if(!await R.stat(N.join(r,`.git`)).catch(()=>void 0)){let t=await R.mkdtemp(`${r}-clone-`);try{await J(`git`,[`clone`,`--depth`,`50`,a.cloneUrl,t],e),await R.rename(t,r)}finally{await R.rm(t,{recursive:!0,force:!0})}}await J(`git`,[`-C`,r,`worktree`,`prune`,`--expire`,`now`],e),await J(`git`,[`-C`,r,`remote`,`set-url`,`origin`,a.cloneUrl],e),await J(`git`,[`-C`,r,`fetch`,`--depth`,`50`,`origin`,a.defaultBranch],e),await J(`git`,[`-C`,r,`worktree`,`add`,`--detach`,o,`FETCH_HEAD`],e)}),o;await R.stat(N.join(o,`.git`)).then(()=>!0).catch(()=>!1)||await J(`git`,[`clone`,`--depth`,`50`,a.cloneUrl,o],e),await J(`git`,[`-C`,o,`fetch`,`--depth`,`50`,`origin`,a.defaultBranch],e),await J(`git`,[`-C`,o,`checkout`,`--detach`,`FETCH_HEAD`],e)}finally{await R.rm(l,{recursive:!0,force:!0})}return o}function he(e){let t=e.event?.repo;if(t){if(![t.owner,t.name].every(e=>/^[\w.-]+$/.test(e)&&!/^\.+$/.test(e)))throw Error(`Invalid repository name`);return g(`checkouts`,new URL(t.cloneUrl).hostname,t.owner,t.name)}}async function Q(e,t){return p(`${e}.lock`,t,1/0,3e5)}async function $(e){if(!(await R.stat(N.join(e,`.git`)).catch(()=>void 0))?.isFile())return;let t=await J(`git`,[`-C`,e,`rev-parse`,`--git-common-dir`]).catch(async t=>{if(await R.stat(N.join(e,`.git`)).catch(()=>void 0))throw t});if(!t)return;let{stdout:n}=t,r=N.resolve(e,n.trim());await Q(N.dirname(r),async()=>{await R.stat(N.join(e,`.git`)).catch(()=>void 0)&&await J(`git`,[`--git-dir`,r,`worktree`,`remove`,`--force`,e])})}const ge=1048576;async function _e(e){let t={maxBuffer:67108864};await J(`git`,[`-C`,e,`add`,`--intent-to-add`,`--all`],t);let{stdout:n}=await J(`git`,[`-C`,e,`diff`,`HEAD`],t);return Buffer.byteLength(n)>ge?`${Buffer.from(n).subarray(0,ge).toString()}\n[diff truncated]`:n}async function ve(e,t){delete P.env.CODER_SERVER,delete P.env.CODER_TASK_TOKEN,delete P.env.APP_TOKEN;for(let t of Object.keys(e.tokens))delete P.env[M(t)];for(let t of e.engineCredentials??[])for(let e of Object.keys(t.credential.env))delete P.env[e];let{CODEX_AUTH_JSON:n,[c]:r,...a}=e.credential.env;if(Object.assign(P.env,a),P.env[i]=JSON.stringify(e.config??{}),P.env.CODER_MCP_MODE=`cloud`,P.env.CODER_MCP_CONNECTION_ENV=JSON.stringify(s(e.connections??{})),!n)return;let o=await R.mkdtemp(N.join(t,`.codex-`));return await R.writeFile(N.join(o,`auth.json`),n,{mode:384}),P.env.CODEX_HOME=o,o}async function ye(e,t){let{ANTHROPIC_API_KEY:n,CLAUDE_CODE_OAUTH_TOKEN:r}=e.credential.env;if(e.credential.engine!==`claude`||!n&&!r)return;let i=await R.mkdtemp(N.join(t,`.claude-`));return P.env.CLAUDE_CONFIG_DIR=i,P.env.CLAUDE_CODE_PROJECT_DIR_NAME=`coder`,i}async function be(e,t,n){let r=n?await R.readFile(N.join(n,`auth.json`),`utf8`).catch(()=>``):``,i=(e=``)=>{let t=[];try{JSON.parse(e,(e,n)=>(typeof n==`string`&&/token|key/i.test(e)&&t.push(n),n))}catch{e&&console.error(`coder runner: history credentials could not be parsed`)}return t};return[t,...Object.values(e.tokens),...e.postToken?[e.postToken]:[],...Object.values(e.nativeTokens??{}),...Object.values(e.connectionEnv??{}),...Object.entries(e.credential.env).filter(([e])=>/KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|AUTH/i.test(e)).map(([,e])=>e),...i(e.credential.env.CODEX_AUTH_JSON),...e.engineCredentials?.flatMap(e=>[...Object.values(e.credential.env),...i(e.credential.env.CODEX_AUTH_JSON)])??[],...i(r)]}async function xe(e,t,n,r){if(!r)return;let i=await R.readFile(N.join(r,`auth.json`),`utf8`).catch(()=>``);i&&i!==n.credential.env.CODEX_AUTH_JSON&&await X(e.server,e.token,t,`/credential`,{method:`POST`,body:JSON.stringify({authJson:i,credentialId:n.task.credential})}).catch(()=>{}),await R.rm(r,{recursive:!0,force:!0})}const Se=[[`bun.lock`,`bun`,[`install`,`--frozen-lockfile`]],[`bun.lockb`,`bun`,[`install`,`--frozen-lockfile`]],[`pnpm-lock.yaml`,`npx`,[`-y`,`pnpm`,`install`,`--frozen-lockfile`]],[`yarn.lock`,`npx`,[`-y`,`yarn`,`install`,`--frozen-lockfile`]],[`package-lock.json`,`npm`,[`ci`]]];async function Ce(e,t){let n=Y(),r=await X(n.server,n.token,e),i=r.task.event;if(!i?.repo)throw Error(`The task has no repository`);let a=await Z(r.task,t,r.tokens[i.integration]);for(let[e,t,n]of Se)if(await R.stat(N.join(a,e)).catch(()=>void 0)){await J(t,n,{cwd:a,maxBuffer:67108864}).catch(()=>{});break}let o=(await J(`git`,[`-C`,a,`rev-parse`,`HEAD`])).stdout.trim();return console.log(`coder-snapshot ${o}`),{sha:o}}function we(e,t,n){let r=new Set,i=ne(N.join(e,`inbox-control`),{apply(e){let i=e.entry;if(e.task!==t||!Number.isInteger(i?.seq)||i.seq<0||!Number.isInteger(i.generation)||i.generation<0||![`steer`,`ask`,`approve`].includes(i.kind))throw Error(`Invalid engine inbox command`);let a=n(i);return r.add(a),a.finally(()=>r.delete(a)).catch(()=>{}),a}});return{close:async()=>{i(),await Promise.allSettled([...r])}}}function Te(e,t,n){let r=w({task:t,generation:n.generation,seq:n.seq});return S(`apply`,{task:t,entry:n},{dir:N.join(e,`inbox-control`),id:r,keepReply:!0,timeoutMs:3e4})}async function Ee(e,t,n,r=O(t.mcp)){let i={task:t.name?.slice(6)??t.id,generation:n.generation,seq:n.seq},a=N.join(v(e,t.id),`inbox-control`,`${w(i)}.transcript.jsonl`);return p(`${a}.lock`,async()=>{let o=await R.readFile(a,`utf8`).catch(e=>{if(e.code===`ENOENT`)return``;throw e});for(let e of o.split(`
|
|
6
|
+
`)){if(!e.trim())continue;let t;try{t=JSON.parse(e)}catch{continue}if(w(t.command)===w(i)&&Object.hasOwn(t,`result`))return t.result}let s=n.value;if(n.kind===`steer`){let a=String(s?.text??n.value??``),o=!1;t.threadId||(o=await d(e,t.id,()=>{let n=l(e,t.id)??t;if(n.threadId)return!1;if(n.steerClosed||![`running`,`queued`].includes(n.status))throw Error(`Task stopped before it opened a conversation`);return h(e,t.id,a),!0})),o||await A(e,l(e,t.id)??t,a,{command:i,resolveConnections:r})}else if(n.kind===`ask`){let r=await j(e,t,String(s?.question??n.value??``),{command:i});return r.finalMessage??r.error?.message??``}else n.kind===`approve`&&C(v(e,t.id),String(s?.approvalId??s?.id??``),s?.decision===`deny`||s?.decision===`decline`?`decline`:`accept`);await R.mkdir(N.dirname(a),{recursive:!0}),await R.appendFile(a,JSON.stringify({command:i,result:null})+`
|
|
7
|
+
`)})}async function De(e){for(let t=1;;t++)try{return await e()}catch(e){let n=e.status;if(n!==void 0&&n<500||t>=6)throw e;console.error(`coder runner: Coder server did not take the request, trying again: ${e instanceof Error?e.message:e}`),await new Promise(e=>setTimeout(e,1e3*2**(t-1)))}}async function Oe(e,t){let n=Y();r(`runner.credentials.start`);let a=await De(()=>X(n.server,n.token,e)).catch(async t=>{throw await X(n.server,n.token,e,`/result`,{method:`POST`,body:JSON.stringify({status:`failed`,error:t instanceof Error?t.message:String(t)})}).catch(()=>{}),t});r(`runner.credentials.done`);let o=a.task.event,s=o&&a.tokens[o.integration],c=P.env.CODER_INBOX_MODE===`poll`;delete P.env.CODER_INBOX_MODE;let u=P.env.CODER_CHECKOUT_CACHE;delete P.env.CODER_CHECKOUT_CACHE;let d,f,p={CODEX_HOME:P.env.CODEX_HOME,CLAUDE_CONFIG_DIR:P.env.CLAUDE_CONFIG_DIR},m,h=new AbortController,g=setTimeout(()=>h.abort(Error(`timeout`)),a.timeoutMs??18e5),ee=setInterval(()=>{X(n.server,n.token,e,`/heartbeat`,{method:`POST`,signal:AbortSignal.timeout(1e4)}).catch(()=>{})},3e4),v,y=async()=>{let r=_(N.join(t,`.runner-task.json`)),i=v&&r?.generation===a.generation?l(v,r.id):void 0;await m?.save(i??void 0).catch(e=>console.error(`coder runner: history upload failed`,e)),f&&await R.rm(f,{recursive:!0,force:!0}),await xe(n,e,a,d)},b=!1,x=async t=>{b=!0,await y(),await De(()=>X(n.server,n.token,e,`/result`,{method:`POST`,body:JSON.stringify(t)}))};try{let i=(async()=>{[d,f]=await Promise.all([ve(a,t),ye(a,t)]),m=a.task.flow==="default"?K((t,r)=>X(n.server,n.token,e,t,r),()=>be(a,n.token,d)):void 0,r(`runner.environment.done`);let i=await m?.restore();return r(`runner.history.done`),i})();r(`runner.checkout.start`);let o=Promise.race([Z(a.task,t,s,u,h.signal),new Promise((e,t)=>h.signal.addEventListener(`abort`,()=>t(h.signal.reason),{once:!0}))]).then(e=>(v=e,r(`runner.checkout.done`),e)),[l,g]=await Promise.allSettled([o,i]);if(l.status===`rejected`)throw l.reason;if(g.status===`rejected`)throw g.reason;return h.signal.throwIfAborted(),await ke(e,t,n,a,l.value,s,c,h.signal,y,x,g.value,a.engineCredentials?async e=>{if(e===a.credential.engine)return!0;let n=a.engineCredentials.find(t=>t.credential.engine===e);if(!n)return!1;await y();for(let[e,t]of Object.entries(p))t===void 0?delete P.env[e]:P.env[e]=t;return a.credential=n.credential,a.task={...a.task,credential:n.id,usage:{...a.task.usage,engine:e,model:void 0,effort:void 0}},[d,f]=await Promise.all([ve(a,t),ye(a,t)]),!0}:void 0)}catch(e){throw b||await x({status:`failed`,error:e instanceof Error?e.message:String(e),...a.task.event&&oe[a.task.event.integration]?.isUninstalled?.(e)?{installationRevoked:!0}:{}}).catch(e=>console.error(`coder runner: result delivery failed`,e)),e}finally{clearTimeout(g),clearInterval(ee);try{v&&await $(v)}finally{delete P.env[i],delete P.env.CODER_MCP_MODE,delete P.env.CODER_MCP_CONNECTION_ENV}}}async function ke(e,n,r,i,s,c,d,p,m,h,g,ne){let S=i.task.event,C=i.task.flow==="default"?i.postToken:c,w=new AbortController,T,E,D=!1,O=await Pe({root:n,generation:i.generation,apply:async t=>{let n=T&&l(s,T);if(!n)throw Error(`The task is not ready`);if(t.kind===`cancel`){await k(s,n),D=!0,await U(),await m();return}return Te(v(s,n.id),e,t)}}),A=O.ack().seq>=0?O.ack():void 0,j,M=()=>{if(j)return j;if(!A)return Promise.resolve();let t=A;return j=X(r.server,r.token,e,`/ack`,{method:`POST`,body:JSON.stringify(t),signal:w.signal}).then(()=>{A&&A.seq<=t.seq&&(A=void 0)}).catch(e=>{throw(e.status===401||e.status===403)&&(A=void 0),e}).finally(()=>{j=void 0}),j},P=async()=>{let t=await X(r.server,r.token,e,`/messages?after=${O.ack().seq}`,{signal:w.signal});try{t.length&&await O.apply(t)}finally{t.length&&O.ack().seq>=0&&(A=O.ack()),await M().catch(()=>{})}},pe=setInterval(()=>{M().catch(()=>{})},1e3),F=_(N.join(n,`.runner-task.json`)),I=new Map,L=new Map,R=(i.logCursor??-1)+1,z=0,B=[],V,H=()=>{for(let e of L.values())for(let t of e()){if(z>=2097152)continue;let e=Buffer.byteLength(t)>65536?`A task log entry exceeded 64 KB`:t;B.push({seq:R++,at:Date.now(),level:`out`,line:e}),z+=Buffer.byteLength(e)}return V||(V=(async()=>{for(;B.length;){let t=0,n=B.slice(0,100).filter(e=>(t+=Buffer.byteLength(JSON.stringify(e)))<524288);if(!n.length)throw Error(`Task log batch is too large`);let i=!1;for(let t=0;t<3;t++)try{await X(r.server,r.token,e,`/logs`,{method:`POST`,signal:AbortSignal.timeout(5e3),body:JSON.stringify({entries:n})}),i=!0;break}catch(e){if(t===2)throw e;await new Promise(e=>setTimeout(e,1e3))}i&&B.splice(0,n.length)}})().finally(()=>{V=void 0}),V)},U=()=>H().catch(e=>{console.error(`coder runner: log delivery failed`,e)}),W,G,K=!1,q=F?.generation===i.generation?F.usageStart:0,J=F?.generation===i.generation?F.turn:0,Y=J+1,me=(e,t=!1,n=!1)=>ce(oe[S.integration],S,e,C,i.task.author,t,n),Z=async t=>{await X(r.server,r.token,e,`/result`,{method:`POST`,body:JSON.stringify({status:`waiting`,approval:t})})};try{let t=g?.restored&&g.resume?.engine===ie({engine:i.task.usage?.engine??i.task.definition.engine,model:i.task.usage?.model??i.task.definition.model},u(s)).engine,c,m=ue({cwd:s,...F?.generation===i.generation?{resumeTaskId:F.id,resumeTurn:J}:{},...g?.resume?{resume:g.resume}:{},agent:i.task.agent,flow:i.task.flow,task:t?{...i.task,context:{...i.task.context,messages:void 0}}:i.task,toolEnvironment:{tokens:{...i.tokens,...i.nativeTokens},native:Object.keys(i.nativeTokens??{})},replyEndpoint:{url:`${r.server}/tasks/${encodeURIComponent(e)}`,token:r.token},connections:i.connections,connectionEnv:i.connectionEnv,post:i.task.source===S?.integration,...C?{postToken:C}:{},onStart(e){E=e},onWorker(e,t){c=t,t.once(`error`,()=>{c=void 0})},async onTask(e,t){if(T=e,p.aborted){let t=l(s,e);throw t&&await k(s,t),p.reason}L.has(e)||L.set(e,y(N.join(v(s,e),`log.jsonl`))),I.has(e)||I.set(e,f(v(s,e),e=>{(!e||e===`log.jsonl`)&&H().catch(()=>{})})),H().catch(()=>{}),b(N.join(n,`.runner-task.json`),{generation:i.generation,id:e,turn:t??J,usageStart:q}),await M().catch(()=>{}),await P().catch(()=>{}),clearInterval(W),d&&(W=setInterval(()=>{G||=P().catch(()=>{}).finally(()=>{G=void 0})},4e3))},onApproval:Z,onEngine:ne}),_=new Promise((e,t)=>{let n=()=>t(p.reason);p.addEventListener(`abort`,n,{once:!0}),p.aborted&&n()}),w=await Promise.race([m,_]);if(Y=(w.turn??J)+1,T&&i.task.flow==="default"){let e=[...w.postedMessages??[]],t=x(s,T,c);try{for(;;){let n=o(s,T);for(let[t,r]of n.slice(Y).entries()){let n=fe(i.task,r,D,r);n.skipped&&te(s,T,{kind:`status`,message:ee}),i.task.source===S?.integration&&n.text&&!n.duplicate&&e.push(...await de(s,T,Y+t,()=>me(n.text,n.problem))),w.reply=n.text,w.ok=r.status===0}Y=Math.max(Y,n.length);let r=l(s,T);if(r?.status===`running`||r?.status===`queued`){await Promise.race([le(s,T,Z,(e,t)=>ae(e,t,{turn:Y,worker:c,signal:p})),_]);continue}if(r?.rollingOver){await Promise.race([ae(s,T,{rollover:!0,worker:c,signal:p}),_]);continue}if(c?.exitCode===null&&!c.signalCode||a(s,T)){await Promise.race([t.wait(3e4),_]);continue}if(!K){clearInterval(W),await G,await O.close(),K=!0;continue}if(o(s,T).length<=Y)break}}finally{t.close()}let n=(l(s,T)?.turnUsage??[]).slice(q).flatMap(e=>e.tokens?[e.tokens]:[]);w.tokens=n.length?n.reduce((e,t)=>se(e,t)):re(s,T)?.tokens??w.tokens,e.length&&(w.postedMessages=e)}for(await U();A;)p.throwIfAborted(),await M().catch(()=>{}),A&&await new Promise(e=>setTimeout(e,1e3));return await h({status:D?`cancelled`:w.ok?`completed`:`failed`,result:w.reply??w.result,tokens:w.tokens,...w.postedMessages?.length?{postedMessages:w.postedMessages}:{},...s===n?{}:{diff:await _e(s).catch(()=>void 0)}}),w}catch(n){if(p.aborted){E?.requestStop();let n=new Set([...T?[T]:[],...E?.runningIds()??[],...t(s).filter(t=>t.name===`agent:${e}`||E&&t.flowRunId===E.runId).map(e=>e.id)]);for(let e of n){L.has(e)||L.set(e,y(N.join(v(s,e),`log.jsonl`)));let t=l(s,e);t&&await k(s,t)}}throw await U(),n}finally{for(let e of I.values())e.close();await V?.catch(()=>{}),clearInterval(pe),clearInterval(W),w.abort(),await Promise.allSettled([G,j]),K||await O.close()}}const Ae=`/tmp/coder-inbox.sock`,je=e=>N.join(I.tmpdir(),`coder-${F(`sha256`).update(e).digest(`hex`).slice(0,24)}.sock`);function Me(e,t){return new Promise((n,r)=>{let i=B.request({socketPath:e,path:`/messages`,method:`POST`,headers:{"content-type":`application/json`}},e=>{let t=``;e.on(`data`,e=>{t+=e}),e.on(`end`,()=>{if(e.statusCode!==200)return r(Error(`Task inbox answered ${e.statusCode}`));try{n(JSON.parse(t))}catch(e){r(e)}}),e.on(`error`,r)});i.setTimeout(1e4,()=>i.destroy(Error(`Task inbox timed out`))),i.on(`error`,r),i.end(JSON.stringify({entries:t}))})}const Ne=`const http=require('node:http');const req=http.request({socketPath:process.env.CODER_INBOX_SOCKET||'/tmp/coder-inbox.sock',path:'/messages',method:'POST',headers:{'content-type':'application/json'}},res=>{res.pipe(process.stdout);res.on('end',()=>{if(res.statusCode!==200)process.exitCode=1})});req.on('error',()=>{process.exitCode=1});req.setTimeout(10000,()=>req.destroy());req.end(JSON.stringify({entries:JSON.parse(process.env.CODER_INBOX_MESSAGES)}));`;async function Pe(e){let t=N.join(e.root,`.runner-inbox.json`),n=_(t),r=n?.generation===e.generation?n:{generation:e.generation,seq:-1,answers:[]},i=Promise.resolve(),a=n=>{let a=async()=>{if(!Array.isArray(n)||n.some(t=>!Number.isInteger(t.seq)||t.seq<0||t.generation!==e.generation||![`steer`,`ask`,`approve`,`cancel`].includes(t.kind)))throw Error(`Invalid task messages`);for(let i of[...n].sort((e,t)=>e.seq-t.seq)){if(i.seq<=r.seq)continue;let n=await e.apply(i),a={generation:e.generation,seq:i.seq,answers:[...r.answers??[],...i.kind===`ask`?[{seq:i.seq,value:n}]:[]]};b(t,a),r=a}return r},o=i.then(a,a);return i=o.then(()=>{},()=>{}),o},o=e.socketPath??P.env.CODER_INBOX_SOCKET??je(e.root);if(await R.lstat(o).then(()=>!0,()=>!1)){if(!await new Promise((e,t)=>{let n=L.connect(o);n.once(`connect`,()=>{n.destroy(),e(!1)}),n.once(`error`,n=>n.code===`ECONNREFUSED`?e(!0):t(n))}))throw Error(`The task inbox is already running`);await R.unlink(o)}let s=B.createServer(async(e,t)=>{if(e.method!==`POST`||e.url!==`/messages`){t.writeHead(404).end();return}let n=``;try{for await(let t of e)if(n+=t,Buffer.byteLength(n)>1048576)throw Error(`Messages too large`);let r=await a(JSON.parse(n).entries);t.writeHead(200,{"content-type":`application/json`}).end(JSON.stringify(r))}catch{t.writeHead(409).end()}});return await R.mkdir(e.root,{recursive:!0}),await new Promise((e,t)=>{s.once(`error`,t),s.listen(o,e)}),await R.chmod(o,384),{apply:a,ack:()=>r,close:async()=>{await i,await new Promise(e=>s.close(()=>e()))}}}export{je as a,Oe as c,q as d,Q as f,he as i,Me as l,Ae as n,Ce as o,Ee as r,$ as s,Ne as t,Y as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e,t}from"./cli-
|
|
1
|
+
import{i as e,t}from"./cli-BBlH53hA.js";import{runnerOptions as n}from"./remove-DxCv9BB4.js";import r from"node:process";const i=e({name:`runner test`,globalFlags:{cwd:!1},args:1,required:[`<id>`],help:{usage:`coder runner test <id> [--server [url]] [--json]`,summary:`Check the runner connection.`,flags:[t]},options:n,async run({options:e,args:[t]}){let{testRunner:n}=await import(`./runner-BM_98EQl.js`).then(e=>e.t);return n(t,e)},print:e=>r.stdout.write(`${e.ok?`OK`:`Failed`} ${e.detail} (${e.ms} ms).\n`)});export{i as commandRunnerTest};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as e}from"./cli-BBlH53hA.js";import{n as t,r as n}from"./mcp-server-BlP9lACI.js";import r from"node:process";const i=e({name:`agent tools`,options:{},args:1,async run({args:e}){let{INTEGRATIONS:i}=await import(`./integrations-IGnXBrPw.js`).then(e=>e.r),{agentTools:a}=await import(`./mcp-Dsl3Xdd3.js`).then(e=>e.i),o=e[0]??``,s=i[o]?.tools.server;if(s){let e=s([`read`],void 0,``),n=r.env[e.credentialFields?.env??`APP_TOKEN`];if(!n)throw Error(`Platform token is not set`);await t(s([`read`],void 0,n));return}let c=a(o);if(!c)throw Error(`Unknown tool set "${o}"`);await n(`coder-${o}`,c,{fetch})}});export{i as commandTools};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as z from "zod/mini";
|
|
2
2
|
//#region src/core/config.d.ts
|
|
3
3
|
declare const engineSchema: z.ZodMiniEnum<{
|
|
4
|
-
custom: "custom";
|
|
5
|
-
claude: "claude";
|
|
6
4
|
codex: "codex";
|
|
5
|
+
claude: "claude";
|
|
6
|
+
custom: "custom";
|
|
7
7
|
}>;
|
|
8
8
|
declare const effortSchema: z.ZodMiniEnum<{
|
|
9
9
|
low: "low";
|
|
@@ -33,8 +33,8 @@ declare const mcpEntrySchema: z.ZodMiniObject<{
|
|
|
33
33
|
env: z.ZodMiniOptional<z.ZodMiniRecord<z.ZodMiniString<string>, z.ZodMiniString<string>>>;
|
|
34
34
|
url: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
35
35
|
type: z.ZodMiniOptional<z.ZodMiniEnum<{
|
|
36
|
-
http: "http";
|
|
37
36
|
stdio: "stdio";
|
|
37
|
+
http: "http";
|
|
38
38
|
sse: "sse";
|
|
39
39
|
}>>;
|
|
40
40
|
headers: z.ZodMiniOptional<z.ZodMiniRecord<z.ZodMiniString<string>, z.ZodMiniString<string>>>;
|
|
@@ -44,9 +44,9 @@ declare const mcpEntrySchema: z.ZodMiniObject<{
|
|
|
44
44
|
declare const effectiveConfigSchema: z.ZodMiniObject<{
|
|
45
45
|
conversationCompactTokens: z.ZodMiniNumber<number>;
|
|
46
46
|
chain: z.ZodMiniArray<z.ZodMiniEnum<{
|
|
47
|
-
custom: "custom";
|
|
48
|
-
claude: "claude";
|
|
49
47
|
codex: "codex";
|
|
48
|
+
claude: "claude";
|
|
49
|
+
custom: "custom";
|
|
50
50
|
}>>;
|
|
51
51
|
engines: z.ZodMiniObject<{
|
|
52
52
|
codex: z.ZodMiniOptional<z.ZodMiniObject<{
|
|
@@ -101,8 +101,8 @@ declare const effectiveConfigSchema: z.ZodMiniObject<{
|
|
|
101
101
|
disabled: z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>;
|
|
102
102
|
}, z.core.$strict>, z.ZodMiniObject<{
|
|
103
103
|
provider: z.ZodMiniEnum<{
|
|
104
|
-
claude: "claude";
|
|
105
104
|
codex: "codex";
|
|
105
|
+
claude: "claude";
|
|
106
106
|
}>;
|
|
107
107
|
model: z.ZodMiniString<string>;
|
|
108
108
|
effort: z.ZodMiniOptional<z.ZodMiniEnum<{
|
|
@@ -150,8 +150,8 @@ declare const effectiveConfigSchema: z.ZodMiniObject<{
|
|
|
150
150
|
env: z.ZodMiniOptional<z.ZodMiniRecord<z.ZodMiniString<string>, z.ZodMiniString<string>>>;
|
|
151
151
|
url: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
152
152
|
type: z.ZodMiniOptional<z.ZodMiniEnum<{
|
|
153
|
-
http: "http";
|
|
154
153
|
stdio: "stdio";
|
|
154
|
+
http: "http";
|
|
155
155
|
sse: "sse";
|
|
156
156
|
}>>;
|
|
157
157
|
headers: z.ZodMiniOptional<z.ZodMiniRecord<z.ZodMiniString<string>, z.ZodMiniString<string>>>;
|
|
@@ -1399,15 +1399,8 @@ interface AgentEvent {
|
|
|
1399
1399
|
defaultBranch: string;
|
|
1400
1400
|
};
|
|
1401
1401
|
}
|
|
1402
|
-
/** A handle on another integration, linked to this installation at install time. */
|
|
1403
|
-
type InstallationLink = {
|
|
1404
|
-
kind: 'installation';
|
|
1405
|
-
id: string;
|
|
1406
|
-
};
|
|
1407
1402
|
/** Per-installation settings a user sets from the platform (`/setup` in Slack). */
|
|
1408
1403
|
interface InstallationSettings {
|
|
1409
|
-
/** `owner/name` of the repo whose `.coder/` holds this agent's usage and instructions. */
|
|
1410
|
-
configRepo?: string;
|
|
1411
1404
|
model?: string;
|
|
1412
1405
|
engine?: string;
|
|
1413
1406
|
effort?: string;
|
|
@@ -1451,19 +1444,9 @@ interface AgentTask {
|
|
|
1451
1444
|
/** Stored agent body for runners whose checkout does not contain the agent. */
|
|
1452
1445
|
files?: Record<string, string>;
|
|
1453
1446
|
usage?: AgentUsage;
|
|
1454
|
-
/** Effective tools per integration the
|
|
1447
|
+
/** Effective tools per integration the agent declares, by its access mode; every installation of the agent's apps serves them. */
|
|
1455
1448
|
tools: Record<string, string[]>;
|
|
1456
|
-
/**
|
|
1457
|
-
toolScopes?: Record<string, {
|
|
1458
|
-
repo?: {
|
|
1459
|
-
owner: string;
|
|
1460
|
-
name: string;
|
|
1461
|
-
};
|
|
1462
|
-
/** Chat SDK thread id. */
|
|
1463
|
-
thread?: string;
|
|
1464
|
-
within?: string;
|
|
1465
|
-
}>;
|
|
1466
|
-
/** Context gathered by the receiver: repository instructions and who asked. */
|
|
1449
|
+
/** Context gathered by the receiver: notes for the turn and who asked. */
|
|
1467
1450
|
context?: TaskContext;
|
|
1468
1451
|
/** What the platform thread gets when the run fails without an answer. */
|
|
1469
1452
|
failureReply?: string;
|
|
@@ -1480,10 +1463,8 @@ interface TaskContext {
|
|
|
1480
1463
|
}>;
|
|
1481
1464
|
/** Completed turns of this task, kept across dashboard continuations. */
|
|
1482
1465
|
turns?: TaskTurn[];
|
|
1483
|
-
/**
|
|
1466
|
+
/** Notes the receiver adds for the agent, such as a missing account connection. */
|
|
1484
1467
|
instructions?: string;
|
|
1485
|
-
/** The config repo `instructions` came from. */
|
|
1486
|
-
repository?: string;
|
|
1487
1468
|
/** Whether this turn requires a reply. */
|
|
1488
1469
|
mustReply?: boolean;
|
|
1489
1470
|
/** The last conversation batch each kind admitted, by steer or resume. */
|
|
@@ -1659,8 +1640,16 @@ interface McpServerSpec {
|
|
|
1659
1640
|
};
|
|
1660
1641
|
/** Tool allowlist; omit or empty for every tool the server offers. */
|
|
1661
1642
|
tools?: string[];
|
|
1662
|
-
/** Schemas load before the first prompt instead of behind tool search. */
|
|
1643
|
+
/** Schemas load before the first prompt instead of behind tool search or the hub. */
|
|
1663
1644
|
alwaysLoad?: boolean;
|
|
1645
|
+
/** Only tools the server marks read-only may be called. */
|
|
1646
|
+
readOnly?: boolean;
|
|
1647
|
+
/** The integration a platform tool server reaches, and the account of its installation. */
|
|
1648
|
+
integration?: string;
|
|
1649
|
+
account?: string;
|
|
1650
|
+
/** What the server reaches and the access it allows, as the prompt lists it. */
|
|
1651
|
+
description?: string;
|
|
1652
|
+
access?: 'read' | 'write';
|
|
1664
1653
|
}
|
|
1665
1654
|
type TaskStatus = 'queued' | 'running' | 'completed' | 'failed' | 'cancelled';
|
|
1666
1655
|
/** A persisted task record (task.json). Most fields accrete over the lifecycle. */
|
|
@@ -1772,4 +1761,4 @@ interface CommandHelpSpec {
|
|
|
1772
1761
|
/** A subcommand handler. Receives the argv slice after the command name. */
|
|
1773
1762
|
type CommandHandler = (argv: string[]) => Promise<void> | void;
|
|
1774
1763
|
//#endregion
|
|
1775
|
-
export { type
|
|
1764
|
+
export { type InstallationSettings as A, RunnerUpdate as C, type AgentEvent as D, type AgentDefinition as E, type CustomModelConfig as F, type config as I, TaskContext as M, type TaskSource as N, type AgentTask as O, type CoderConfig as P, type RunnerTest as S, type Agent as T, type RunnerInput as _, type HelpRow as a, type RunnerRow as b, type TaskStatus as c, type TokenUsage as d, type AppSync as f, type ProbeResult as g, type LocalFolders as h, type CommandHelpSpec as i, type Preset as j, type AgentUsage as k, type TurnResult as l, LocalFolder as m, type Availability as n, McpServerSpec as o, ConnectionRow as p, CommandHandler as r, Task as s, Approval as t, TaskLogEntry as u, RunnerKind as v, type TaskTurn as w, type RunnerSpec as x, type RunnerPairing as y };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./cli-
|
|
1
|
+
import{i as e}from"./cli-BBlH53hA.js";import{t}from"./models-Cb0ZTKZ7.js";import{n}from"./add-wC8ByRgM.js";import{t as r}from"./remove-CId1EwPg.js";const i=e({name:`model unalias`,help:{usage:`coder model unalias <name> [--workspace]`,summary:`Remove a user-defined alias.`,flags:[[`--workspace`,`target <repo>/.coder/config.json instead of the user file`]]},options:n,args:1,run:({options:e,args:[n],cwd:r})=>t.unalias(n,{...e,cwd:r}),print:e=>r(`unaliased`,e.unaliased,e.file)});export{i as commandModelUnalias};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e}from"./cli-
|
|
1
|
+
import{i as e}from"./cli-BBlH53hA.js";import{t}from"./models-Cb0ZTKZ7.js";import{a as n,i as r,n as i,r as a}from"./add-wC8ByRgM.js";const o=e({name:`model update`,help:{usage:`coder model update <name> [--base-url <url>] [--model <id>] [--env-key VAR]`,summary:`Update a configured custom model. Only the flags you pass change; the endpoint
|
|
2
2
|
is re-probed and the wire protocol re-detected.`,flags:[[`--base-url <url>`,`new API base`],[`--model <id>`,`new provider model id`],[`--env-key <VAR>`,`new API-key env var`],[`--workspace`,`write to <repo>/.coder/config.json instead of the user file`]]},options:i,args:1,run:({options:e,args:[r],cwd:i})=>t.update(r,{...n(e),cwd:i}),json:a,print:e=>r(e,`updated`)});export{o as commandModelUpdate};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{D as e}from"./dispatch-
|
|
2
|
-
the host plugins to match.`,flags:[[`--cli-only`,`update just the CLI`],[`--plugins-only`,`refresh just the host plugins`],[`--codex`,`limit the refresh to the Agent Skills copy (Codex, Pi, ...)`],[`--claude`,`limit the refresh to the Claude Code plugin`],[`--pm <npm|pnpm|yarn|bun>`,`force a package manager instead of auto-detecting`]]},options:{pm:a,"cli-only":o,"plugins-only":o,codex:o,claude:o},run:({options:t})=>e({...t,cliOnly:t[`cli-only`],pluginsOnly:t[`plugins-only`]},l),print:u});function l(e){s.stdout.write(`${r.bold(`Updating coder CLI`)} ${r.dim(`${e}...`)}\n`)}function u(e){let t=r.bold,a=r.dim,o=(e,n)=>n&&e&&n!==e?`${e} ${a(`->`)} ${t(n)}`:`${n??e??`?`} ${a(`(unchanged)`)}`,c=(e,t)=>`${t.installed?n(`${e} ${o(t.from,t.to)} ${a(`- ${t.note}`)}`):i(`${e} ${t.note}`)}\n`;e.cli&&s.stdout.write(e.cli.changed?`${n(`coder CLI ${o(e.cli.from,e.cli.to)}`)}\n`:`${n(`coder CLI ${e.cli.from} ${a(`(already latest)`)}`)}\n`),e.claudePlugin&&s.stdout.write(c(`claude plugin`,e.claudePlugin)),e.agentsSkill&&s.stdout.write(c(`agents skill `,e.agentsSkill))}const d=async()=>(await import(`./refresh-
|
|
1
|
+
import{D as e}from"./dispatch-CFZ9Crvg.js";import{i as t}from"./cli-BBlH53hA.js";import{f as n,p as r,t as i}from"./output-BKeyLbvt.js";import{c as a,n as o}from"./args-CURX44CA.js";import s from"node:process";const c=t({name:`upgrade`,globalFlags:{json:!1,cwd:!1},help:{usage:`coder upgrade [--cli-only] [--plugins-only] [--codex] [--claude] [--pm <mgr>]`,summary:`Update the coder CLI through whichever package manager installed it, then refresh
|
|
2
|
+
the host plugins to match.`,flags:[[`--cli-only`,`update just the CLI`],[`--plugins-only`,`refresh just the host plugins`],[`--codex`,`limit the refresh to the Agent Skills copy (Codex, Pi, ...)`],[`--claude`,`limit the refresh to the Claude Code plugin`],[`--pm <npm|pnpm|yarn|bun>`,`force a package manager instead of auto-detecting`]]},options:{pm:a,"cli-only":o,"plugins-only":o,codex:o,claude:o},run:({options:t})=>e({...t,cliOnly:t[`cli-only`],pluginsOnly:t[`plugins-only`]},l),print:u});function l(e){s.stdout.write(`${r.bold(`Updating coder CLI`)} ${r.dim(`${e}...`)}\n`)}function u(e){let t=r.bold,a=r.dim,o=(e,n)=>n&&e&&n!==e?`${e} ${a(`->`)} ${t(n)}`:`${n??e??`?`} ${a(`(unchanged)`)}`,c=(e,t)=>`${t.installed?n(`${e} ${o(t.from,t.to)} ${a(`- ${t.note}`)}`):i(`${e} ${t.note}`)}\n`;e.cli&&s.stdout.write(e.cli.changed?`${n(`coder CLI ${o(e.cli.from,e.cli.to)}`)}\n`:`${n(`coder CLI ${e.cli.from} ${a(`(already latest)`)}`)}\n`),e.claudePlugin&&s.stdout.write(c(`claude plugin`,e.claudePlugin)),e.agentsSkill&&s.stdout.write(c(`agents skill `,e.agentsSkill))}const d=async()=>(await import(`./refresh-SHNJq9Cx.js`)).commandRefreshUpdate,f=Object.assign(async e=>e[0]===`refresh`?(await d())(e.slice(1)):c(e),c,{subcommands:{refresh:d}});export{f as commandUpgrade};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e,r as t}from"./cli-
|
|
1
|
+
import{i as e,r as t}from"./cli-BBlH53hA.js";import{g as n,p as r}from"./output-BKeyLbvt.js";import{c as i,s as a,t as o}from"./args-CURX44CA.js";import s from"node:process";function c(e,t){let i=Array.isArray(e.totals)?e.totals.map(e=>({group:t??``,...e})):Object.entries(e.totals).flatMap(([e,t])=>t.map(t=>({group:e,...t})));if(!i.length)return void s.stdout.write(`${r.dim(`No usage in this period.`)}\n`);s.stdout.write(`${n([{header:`by`,value:e=>e.group},{header:`key`,value:e=>e.key,paint:e=>r.cyan(e)},{header:`tasks`,value:e=>String(e.tasks)},{header:`runner ms`,value:e=>String(e.runnerMs)},{header:`tokens`,value:e=>e.tokens===void 0?``:JSON.stringify(e.tokens)}],i,r)}\n`)}const l=e({name:`agent usage`,help:{usage:`coder agent usage [--since 7d|24h|<ms>] [--by agent|installation|engine] [--server [url]] [--json] [--cwd <dir>]`,flags:[[`--since <period|ms>`,`period such as 7d or 24h, or milliseconds since epoch`],[`--by <group>`,`agent, installation, or engine`],t]},options:{...o,...a,since:i,by:i},run:async({options:e,cwd:t})=>{let{agents:n}=await import(`./agent-6GooVMsq.js`).then(e=>e.t);return n.usage({...e,cwd:t,organization:e.workspace,since:e.since??`7d`})},print:(e,{options:t})=>c(e,t.by)});export{l as commandAgentUsage};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as e,i as t,r as n,t as r}from"./slack-
|
|
1
|
+
import{a as e,i as t,r as n,t as r}from"./slack-DhPhLuWb.js";const i=e=>({type:`mrkdwn`,text:e}),a=e=>({type:`section`,text:i(e.length>3e3?`${e.slice(0,2999)}…`:e)}),o=e=>e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`),s=(e,t)=>`<${e}|${o(t)}>`,c={queued:`Queued`,running:`Running`,waiting:`Needs approval`,completed:`Completed`,failed:`Failed`,cancelled:`Cancelled`},l=(e,t,n,i)=>({type:`button`,action_id:`${r}${e}`,text:{type:`plain_text`,text:n},url:t,...i?{style:`primary`}:{}});function u(e,r,i){let s=i?.slug??r,c=i?.listens.find(e=>e.integration===n.id)?.events??[],u=c.map(e=>n.events[e]?.description??e),d=t(o(r),c,`message it here`);return{type:`home`,blocks:[a([`*${o(i?.name??r)}*`,i?.description&&o(i.description)].filter(Boolean).join(`
|
|
2
2
|
`)),...d?[a(`*Use it here*\n${d}`)]:[],...u.length?[a(`*Listens to*\n${u.join(`
|
|
3
3
|
`)}`)]:[],{type:`divider`},{type:`actions`,elements:[l(`agent`,`${e.dash}/agents/${encodeURIComponent(s)}/platforms`,`Open in Coder`,!0),l(`coder`,e.home.replace(/\/$/,``),`Make your own agent`)]}]}}async function d(t,n){if(!t.publicUrl||!t.dashUrl||!t.installationId)return;let r=u({home:t.publicUrl,dash:t.dashUrl},t.name,await t.agent?.());await e(`views.publish`,{user_id:n,view:r},await t.token(t.installationId),t.fetch)}async function f(r,i,{open:s,setup:c}){if(!r.installationId)return;let u=await r.agent?.(),d=u?.name??r.name,f=t(o(r.name),u?u.listens.find(e=>e.integration===n.id)?.events??[]:[`mention`],`message it here`),p=[a([`*${o(d)} is in your workspace*`,u?.description&&o(u.description)].filter(Boolean).join(`
|
|
4
4
|
`)),...f?[a(`*Use it*\n${f}`)]:[],...c?[a(`*One step left*\nAdd a model so ${o(d)} can start working.`)]:[],{type:`actions`,elements:[...c?[l(`model`,c,`Add a model`,!0)]:[],l(`agent`,s,`Open in Coder`,!c)]}];await e(`chat.postMessage`,{channel:i,text:`${d} is in your workspace`,blocks:p},await r.token(r.installationId),r.fetch)}function p(e,t){let n=Math.floor(t.startedAt/1e3),r=t.title.length>150?`${t.title.slice(0,149)}…`:t.title;return{blocks:[{...a(`*${s(e,r)}*`),fields:[i(`*Agent*\n${o(t.agent)}`),i(`*Status*\n${c[t.status]??t.status}`),i(`*From*\n${o(t.from)}`),i(`*Started*\n<!date^${n}^{date_short_pretty} at {time}|${new Date(t.startedAt).toISOString()}>`)]},{type:`context`,elements:[i(`Coder task ${o(t.id)}`)]}]}}function m(e,t){let r=t.listens.map(e=>e.name),c=t.listens.length===1&&t.listens[0].integration===n.id;return{blocks:[{...a([`*${s(e,t.name)}*`,t.description&&o(t.description)].filter(Boolean).join(`
|