@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
package/dist/sdk.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as RunnerUpdate,
|
|
2
|
-
import { A as TaskResult, J as FlowEvent, M as CoderError, Z as FlowStep, k as flowSdk, l as ReviewResult, r as ReviewArgs, z as review } from "./review-
|
|
3
|
-
import { R as SteerOutcome, _ as TaskRunOptions, a as docs, c as task, d as ConnectionOptions, f as DeclaredServer, g as Session, h as setupHost, i as connection, l as upgrade, m as models, n as agent, o as folders, p as runners, r as auth, s as server, t as _default, u as ConnectionAddOptions, v as ServerOptions, y as credentials } from "./sdk-
|
|
1
|
+
import { C as RunnerUpdate, I as config, S as RunnerTest, _ as RunnerInput, b as RunnerRow, h as LocalFolders, l as TurnResult, m as LocalFolder, p as ConnectionRow, s as Task, t as Approval, u as TaskLogEntry, v as RunnerKind, x as RunnerSpec, y as RunnerPairing } from "./types-C6NAqGqn.js";
|
|
2
|
+
import { A as TaskResult, J as FlowEvent, M as CoderError, Z as FlowStep, k as flowSdk, l as ReviewResult, r as ReviewArgs, z as review } from "./review-Dxs-idTn.js";
|
|
3
|
+
import { R as SteerOutcome, _ as TaskRunOptions, a as docs, c as task, d as ConnectionOptions, f as DeclaredServer, g as Session, h as setupHost, i as connection, l as upgrade, m as models, n as agent, o as folders, p as runners, r as auth, s as server, t as _default, u as ConnectionAddOptions, v as ServerOptions, y as credentials } from "./sdk-B4Cl0Hbw.js";
|
|
4
4
|
export { type Approval, CoderError, type ConnectionAddOptions, type ConnectionOptions, type ConnectionRow, type DeclaredServer, type FlowEvent, type FlowStep, type LocalFolder, type LocalFolders, type ReviewArgs, type ReviewResult, type RunnerInput, type RunnerKind, type RunnerPairing, type RunnerRow, type RunnerSpec, type RunnerTest, type RunnerUpdate, type ServerOptions, type Session, type SteerOutcome, type Task, type TaskLogEntry, type TaskResult, type TaskRunOptions, type TurnResult, agent, auth, config, connection, credentials, _default as default, docs, flowSdk as flow, folders, models as model, review, runners as runner, server, setupHost, task, upgrade };
|
package/dist/sdk.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{R as e}from"./prompts-
|
|
1
|
+
import{R as e}from"./prompts-Bj4Fbd_n.js";import{D as t,T as n,U as r}from"./dispatch-CFZ9Crvg.js";import{n as i,o as a,t as o}from"./remote-D3JZ4MMQ.js";import{n as s}from"./executor-3QMa-XRY.js";import{n as c}from"./agent-6GooVMsq.js";import{t as l}from"./connection-B-IB8tlP.js";import{t as u}from"./docs-CvjWiada.js";import{t as d}from"./models-Cb0ZTKZ7.js";import{n as f}from"./task-DJ6nruuA.js";import p from"./flow/index.js";import{n as m}from"./runner-BM_98EQl.js";import{n as h}from"./apps-BNe86LfS.js";import{v as g}from"./runners-DyLnqHKy.js";import{n as _}from"./maintenance-DYOstY6V.js";import{r as v,t as y}from"./serve-BApfeXk8.js";const b=f,x=l,S=t,C=u,w=a,T={serve:y,rotateKey:_,workflow:g,app:{create:h},handler:v},E={list:(e={})=>o(e).folders.list(),check:(e,t={})=>o(t).folders.check(e)},D=c;var O={task:b,flow:p,model:d,config:e,connection:x,setupHost:n,upgrade:S,docs:C,review:s,auth:w,agent:D,credentials:i,folders:E,runner:m,server:T};export{r as CoderError,D as agent,w as auth,e as config,x as connection,i as credentials,O as default,C as docs,p as flow,E as folders,d as model,s as review,m as runner,T as server,n as setupHost,b as task,S as upgrade};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{qi as e}from"./core-DwsAMCnL.js";import{At as t,D as n,E as r,H as i,M as a,U as o,V as s,Vt as c,Y as l,j as u,kt as d,lt as f,nn as p,nt as m,q as h,sr as g,v as _,x as v}from"./prompts-CEf7z4i_.js";import{U as y}from"./dispatch-BJZqI7sj.js";import{a as b,c as x,h as S,i as C,n as w,r as ee}from"./load-C-GZnuok.js";import{d as T,m as E}from"./slack-Kpj-G9FE.js";import{n as te}from"./integrations-DPxWtNnS.js";import{t as ne}from"./history-D_A5odLI.js";import{n as re}from"./models-VaiIYlOW.js";import{a as D,d as O,f as k,l as ie,n as ae,o as oe,p as se,r as ce,s as le,t as ue,u as de,y as fe}from"./http-CXaW1e7x.js";import{$ as pe,$n as me,$t as he,A as ge,An as _e,At as ve,Bn as ye,Bt as be,C as xe,Cn as Se,Cr as Ce,Ct as we,D as Te,Dn as Ee,E as De,En as Oe,Et as ke,F as Ae,Fn as je,G as A,Gn as Me,Gt as Ne,H as Pe,Hn as Fe,Ht as j,I as Ie,In as Le,It as Re,J as ze,Jn as Be,Jt as Ve,K as He,Kn as Ue,Kt as We,L as Ge,Ln as Ke,Lt as qe,M as Je,Mn as Ye,Mt as Xe,N as Ze,Nn as Qe,Nt as M,O as N,On as $e,Ot as et,P as tt,Pn as nt,Pt as P,Q as rt,Qn as it,Qt as at,R as ot,Rn as st,Rt as ct,S as F,Sn as lt,Sr as ut,St as dt,T as ft,Tn as pt,Tt as mt,U as ht,Un as gt,Ut as _t,V as vt,Vn as yt,Vt as bt,W as xt,Wn as St,Wt as I,X as Ct,Xn as wt,Xt as Tt,Y as Et,Yn as Dt,Yt as Ot,Z as kt,Zn as At,Zt as jt,_ as Mt,_n as Nt,_t as Pt,a as Ft,an as It,ar as Lt,at as Rt,b as zt,br as L,c as R,cn as Bt,cr as Vt,ct as Ht,d as Ut,dn as Wt,dr as Gt,en as Kt,er as qt,et as Jt,f as Yt,fn as Xt,fr as Zt,ft as Qt,g as $t,gn as en,gt as z,h as B,hn as tn,hr as nn,ht as rn,i as an,in as on,ir as sn,it as cn,j as V,jn as ln,jt as un,k as dn,kn as fn,kt as pn,l as mn,ln as hn,lr as gn,lt as _n,m as vn,mn as yn,mr as bn,mt as xn,nn as Sn,nr as Cn,nt as wn,o as Tn,on as En,or as Dn,ot as On,p as kn,pn as An,pr as jn,pt as Mn,q as Nn,qn as Pn,qt as Fn,r as In,rn as Ln,rr as Rn,rt as zn,s as Bn,sn as Vn,sr as Hn,st as Un,tn as Wn,tr as Gn,tt as Kn,u as qn,un as Jn,ur as Yn,ut as Xn,v as Zn,vn as Qn,vr as $n,vt as er,w as tr,x as nr,xr as H,xt as rr,y as ir,yr as U,yt as ar,z as or,zn as sr,zt as cr}from"./apps-6BgpUsFh.js";import{n as lr,r as ur}from"./env-DSddo-fz.js";import{C as W,S as dr,a as fr,g as pr,i as mr,m as hr,n as gr,o as _r,x as G}from"./runners-vsoGeyuc.js";import{S as vr,_ as yr,a as br,b as xr,f as Sr,g as K,h as q,i as Cr,m as wr,n as Tr,p as Er,x as Dr}from"./local-Fs-dx_dP.js";import{X as Or}from"./schema-Brm7WIKd.js";import{r as kr}from"./client-DzwzCsue.js";import J from"node:path";import Y from"node:process";import Ar from"node:fs";import{spawnSync as jr}from"node:child_process";import{createHash as Mr,randomBytes as Nr,randomUUID as Pr}from"node:crypto";import X from"node:fs/promises";import{isDeepStrictEqual as Fr,promisify as Ir}from"node:util";import Lr from"node:http";import{gunzip as Rr,gzip as zr}from"node:zlib";async function Br(e){try{return await X.readdir(e,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}}async function Vr(e){try{return await X.lstat(e),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}}async function Hr(e,t){if(e===t||!await Vr(e))return 0;let n=await Br(e),r=n.filter(e=>e.isDirectory()).length;if(!await Vr(t))return await g(e,t),r;for(let r of n)await g(J.join(e,r.name),J.join(t,r.name));return await X.rmdir(e),r}async function Ur(e){let t=J.dirname(e),n=J.basename(e);for(let e of await Br(t)){let r=e.name.startsWith(n)?e.name.slice(n.length):``;if(!e.isFile()||!(r===`.tmp`||/^\.\d+(?:\.[a-f0-9-]{36})?\.tmp$/.test(r)))continue;let i=Number(e.name.slice(n.length+1).split(`.`)[0]);if(Number.isInteger(i)&&i>0)try{process.kill(i,0);continue}catch(e){if(e.code!==`ESRCH`)continue}await X.unlink(J.join(t,e.name)).catch(e=>{if(e.code!==`ENOENT`)throw e})}}async function Wr(e,t){if(await Ur(e),e===t||!await Vr(e))return 0;if(!await Vr(t))return await g(e,t),1;let n=JSON.parse(await X.readFile(e,`utf8`)),r=JSON.parse(await X.readFile(t,`utf8`)),i={...n,...r,...n.rows||r.rows?{rows:{...n.rows,...r.rows}}:{}},a=`${t}.${process.pid}.${Pr()}.tmp`;try{await X.writeFile(a,`${JSON.stringify(i)}\n`,{mode:384,flag:`wx`}),await X.rename(a,t),await X.unlink(e)}finally{await X.rm(a,{force:!0})}return 1}async function Gr(){let e=d(),n=t(`state`),r=d(`archive`),i=d(`flows-archived`),a=d(`usage.json`),o=d(`runner`,`usage.json`),s={from:t(`checkouts`),to:d(`checkouts`)},c={from:t(`update-check.json`),to:d(`update-check.json`)},l={cache:e,tasks:0,flows:0,files:0},u=(await Br(n)).filter(e=>e.isDirectory()).map(e=>({archive:t(`state`,e.name,`archive`),flows:t(`state`,e.name,`flows-archived`),usage:t(`state`,e.name,`usage.json`),runnerUsage:t(`state`,e.name,`runner`,`usage.json`)}));await Ur(a),await Ur(o);for(let e of u)l.tasks+=await Hr(e.archive,r),l.flows+=await Hr(e.flows,i),l.files+=await Wr(e.usage,a),l.files+=await Wr(e.runnerUsage,o);return await Hr(s.from,s.to),l.files+=await Wr(c.from,c.to),l}async function Kr(e){let t=(e.now??Date.now)(),n=await e.store.list(`runner`);return{online:1+n.filter(({value:e})=>e.lastSeen!==void 0&&t-e.lastSeen<3e5).length,total:1+n.length}}async function qr(e){let t=(e.now??Date.now)(),n=e.healthyAt!==void 0&&t-e.healthyAt<5e3,r=n||await Jr(e);return e.healthyAt=r?n?e.healthyAt:t:void 0,D({ok:r},r?200:503,{"cache-control":`no-store`})}async function Jr(e){return e.config.store===`postgres`?e.databaseHealth?e.databaseHealth().then(()=>!0,()=>!1):!1:!0}async function Yr(e){let t=(e.now??Date.now)();if(!e.local)return{...await e.queue.metrics(e.organizationId,t-864e5),runnersOnline:(await Kr(e)).online,requests:e.limits?.requests??0,rateLimitRejections:e.limits?.rejections??0};let n=await e.queue.list(e.organizationId),r=e.local?[...P(e.local.cwd,!1),...P(e.local.cwd,!0)]:[],i=new Map([...r,...n.map(e=>e.status===`queued`?e:r.find(t=>t.task.id===e.task.id)??e)].map(e=>[e.task.id,e])),a={queued:0,running:0,waiting:0,completed:0,failed:0,cancelled:0},o=0;for(let e of i.values())e.createdAt>=t-864e5&&a[e.status]++,e.status===`queued`&&o++;return{tasks:a,queueDepth:o,runnersOnline:(await Kr(e)).online,requests:e.limits?.requests??0,rateLimitRejections:e.limits?.rejections??0}}const Xr=Ir(Rr),Zr=Ir(zr);async function Qr(e,t,n){return D(await t.store.listHistory(n.id))}async function $r(e,t,n){let r=await t.store.get(`history`,`${n.id}:${n.conversation}`);if(!r)return D({error:`No saved history`},404);try{return D({engine:r.engine,conversation:r.conversation,data:G(t.config,r.data),...r.state?{state:G(t.config,r.state)}:{}})}catch(e){return console.error(`coder server: history ${n.id}/${n.conversation} could not be decrypted`,e),D({error:`The saved history cannot be read`},422)}}async function ei(e,t,n){let r=await e.json().catch(()=>void 0);if(r?.engine!==`claude`&&r?.engine!==`codex`||typeof r.conversation!=`string`||!ne.test(r.conversation)||typeof r.data!=`string`||r.state!==void 0&&(!r.state||typeof r.state!=`object`||Array.isArray(r.state)))return D({error:`Invalid history`},400);let i;try{i=(await Xr(Buffer.from(r.data,`base64`),{maxOutputLength:67108864})).toString(`utf8`)}catch{return D({error:`Invalid history`},400)}let a=await Nt(t,t.callbackTask,!0);return await t.store.put(`history`,`${n.id}:${r.conversation}`,{engine:r.engine,conversation:r.conversation,data:W(t.config,(await Zr(a(i))).toString(`base64`)),...r.state?{state:W(t.config,JSON.parse(a(JSON.stringify(r.state))))}:{},savedAt:(t.now??Date.now)()}),D({ok:!0})}async function ti(e,t,n,r){let i=t.session.user.id;n.id;let a=(await e.json().catch(()=>({}))).engine??``;if(!oi.has(a)||!t.config.subscriptions?.[a])return D({error:`Sign in with ${a||`that engine`} is off on this server.`},403);let o=t.runners[t.config.runner];if(!o||o.kind===`github-actions`)return D({error:`Sign-in cannot run on the ${t.config.runner} runner.`},409);let s=(await t.store.list(`login`)).find(({value:e})=>e.owner===i&&e.engine===a&&e.state!==`done`&&e.state!==`failed`&&e.expiresAt>si(t));if(s)return D(li(s.id,s.value));let c=`login-${Nr(12).toString(`base64url`)}`,l=Qn(c,t.organizationId,0),u={owner:i,engine:a,state:`starting`,tokenHash:l.hash,runner:o.kind,createdAt:si(t),expiresAt:si(t)+ai};await ci(t,c,u);let d;try{let e=await o.start({id:c},{CODER_SERVER:t.config.publicUrl??``,CODER_TASK_TOKEN:l.token,CODER_LOGIN:a},void 0,{timeoutMs:ai,hosts:[hr[a].api,...hr[a].account]}),n=await t.store.patchLogin(c,{handle:e},{tokenHash:u.tokenHash});if(!n)return await o.stop(e).catch(()=>{}),D({error:`This sign-in is gone. Start again.`},409);d=n}catch(e){return await t.store.delete(`login`,c),D({error:e instanceof Error?e.message:String(e)},502)}return D(li(c,d),201)}async function ni(e,t,n,r){t.session.user.id;let i=n.id??``;if(!r.searchParams.has(`state`)){let e=i&&!i.includes(`/`)?await Z(t,i):void 0;return e?D(li(i,e)):D({error:`This sign-in is gone. Start again.`},404)}let a=await t.store.watch(`login`,i);try{let n=i&&!i.includes(`/`)?await Z(t,i):void 0;if(!n)return D({error:`This sign-in is gone. Start again.`},404);let o=r.searchParams.get(`state`),s=Date.now()+25e3;for(;o&&n.state===o&&Date.now()<s&&!e.signal.aborted;)if(await a.wait(Math.min(1e4,s-Date.now()),e.signal),n=await Z(t,i),!n)return D({error:`This sign-in is gone. Start again.`},404);return D(li(i,n))}finally{a.close()}}async function ri(e,t,n,r){t.session.user.id;let i=n.id??``,a=i&&!i.includes(`/`)?await Z(t,i):void 0;if(!a)return D({error:`This sign-in is gone. Start again.`},404);let o=await e.json().catch(()=>({})),s=typeof o.code==`string`?o.code.trim():``;return a.engine!==`claude`||a.state!==`open`||!s||!await t.store.patchLogin(i,{state:`verifying`,input:W(t.config,s)},{state:`open`,tokenHash:a.tokenHash})?D({error:`This sign-in is not waiting for a code.`},409):D({ok:!0})}async function ii(e,t,n,r){t.session.user.id;let i=n.id??``,a=i&&!i.includes(`/`)?await Z(t,i):void 0;return a?(await t.store.delete(`login`,i),a.handle&&await t.runners[a.runner]?.stop(a.handle).catch(()=>{}),D({ok:!0})):D({error:`This sign-in is gone. Start again.`},404)}const ai=6e5,oi=new Set([`claude`,`codex`]),si=e=>(e.now??Date.now)();function ci(e,t,n){return e.store.put(`login`,t,n,{ttlMs:Math.max(1,n.expiresAt-si(e))})}function li(e,t){return{id:e,engine:t.engine,state:t.state,expiresAt:t.expiresAt,...t.url?{url:t.url}:{},...t.code?{code:t.code}:{},...t.error?{error:t.error}:{}}}async function Z(e,t){let n=await e.store.get(`login`,t);return n&&n.owner===e.session?.user.id?n:void 0}function ui(e,t){let n=t.handle&&e.runners[t.runner]?.stop(t.handle);if(!n)return;let r=n.catch(e=>console.error(`coder server: could not stop the machine of a finished ${t.engine} sign-in`,e));e.waitUntil?.(r)}async function di(e,t,n,r){let i=n.id,a=await t.store.watch(`login`,i),o=Date.now()+25e3;try{for(;;){if(e.signal.aborted)return D({});let n=await t.store.get(`login`,i);if(!n||n.tokenHash!==t.callbackLogin.tokenHash)return new Response(`Unauthorized`,{status:401});if(n.input){let e=await t.store.patchLogin(i,{input:null},{input:n.input,tokenHash:n.tokenHash});return D(e?{code:G(t.config,n.input)}:{})}if(n.state===`verifying`||n.state===`done`||n.state===`failed`||Date.now()>=o)return D({});await a.wait(Math.min(1e4,o-Date.now()),e.signal)}}finally{a.close()}}async function fi(e,t,n,r){return D({engine:t.callbackLogin.engine})}async function pi(e,t,n,r){let i=n.id,a=t.callbackLogin,o=await e.json().catch(()=>({}));if(a.state===`done`||a.state===`failed`)return D({ok:!0});let s={state:[`starting`,`open`,`verifying`],tokenHash:a.tokenHash};if(typeof o.error==`string`)return await t.store.patchLogin(i,{state:`failed`,error:o.error.slice(0,500)},s)&&ui(t,a),D({ok:!0});let c=o.result?.env;if(c){let e=a.engine===`claude`?`CLAUDE_CODE_OAUTH_TOKEN`:`CODEX_AUTH_JSON`;if(Object.keys(c).join()!==e||typeof c[e]!=`string`)return D({error:`Invalid sign-in result`},400);let n=o.result?.account;return await t.store.completeLogin(i,a.tokenHash,{...dr(t.config,{env:c}),createdAt:(t.now??Date.now)(),...n?.email||n?.plan?{account:{...typeof n.email==`string`?{email:n.email}:{},...typeof n.plan==`string`?{plan:n.plan}:{}}}:{}})?(ui(t,a),D({ok:!0})):D({error:`This sign-in changed. Try again.`},409)}let l={...typeof o.url==`string`&&/^https:\/\//.test(o.url)?{url:o.url}:{},...typeof o.code==`string`?{code:o.code.slice(0,64)}:{}};return await t.store.patchLogin(i,l.url?{...l,state:`open`}:l,s)?D({ok:!0}):D({error:`This sign-in changed. Try again.`},409)}const mi=e=>`audit:${String(9999999999999-e).padStart(13,`0`)}:${Nr(4).toString(`hex`)}`,hi=e=>e.config.name??`Wular`,gi=e=>Hn(e,e.serverOrganizationId??e.organizationId);async function _i(e,t,n){let r=(e.now??Date.now)(),i=e.session?.user,a={at:r,actor:i?{id:i.id,name:i.name,email:i.email}:{id:`admin-token`},action:t,target:n};await gi(e).store.put(`snapshot`,mi(r),a)}async function vi(e,t){let n=await gi(t).store.list(`app`),r=Object.values(t.integrations).filter(e=>e.app.builtin===`shared`).map(e=>{let t=n.find(({value:t})=>t.builtin&&t.integration===e.id)?.value;return{integration:e.id,name:e.name,brand:e.brand,organizationApps:e.organizationApps===!0,...t?{app:{id:t.id,name:t.name,createdAt:t.createdAt}}:{}}}),i=t.config.publicUrl,a=!!i&&B.has(new URL(i).hostname);return D({name:hi(t),platforms:r,...a?{unreachable:!0}:{}})}async function yi(e,t,n){let r=t.integrations[n.integration];if(!r)return D({error:`Unknown integration "${n.integration}".`},404);if(r.app.builtin!==`shared`)return D({error:`Create ${r.name} apps in your workspace from the agent's Platforms tab.`},400);if(!t.config.publicUrl)return D({error:`Set PUBLIC_URL on this server first. Platforms call it.`},400);let i=await e.json().catch(()=>void 0),a=e=>typeof e==`string`&&e.trim()||void 0,o=a(i?.name)??hi(t),s=r.organizationApps?a(i?.owner):void 0,c=await In(gi(t),r.id,{name:o,owner:s});return await _i(t,`Started setting up a shared app`,`${o} on ${r.name}`),D({url:c})}async function bi(e,t){let n=await gi(t).store.list(`snapshot`,{prefix:`audit:`,limit:100});return D(n.map(e=>e.value))}const xi=e=>`create-finished:${E(e)}`;async function Si(e,t){let n=await e.store.get(`delivery`,xi(t));return n&&`target`in n?n.target:void 0}async function Ci(e,t,n){let r=e.operatorApp??!1,i=r?`*`:e.session?.user.id??`anonymous`;if(!e.integrations[t])return{error:`Unknown integration "${t}"; run coder agent integrations list to see them`,status:404};if(!e.config.publicUrl)return{error:`PUBLIC_URL is not set on this server; set it to the address platforms should call and restart`,status:400};if(r&&e.integrations[t].app.builtin!==`shared`)return{error:`Create this app in your workspace from the agent's Platforms tab.`,status:400};let a=qn(n);if(!a)return{error:`Setup link is missing or malformed; start again from the agent's Platforms tab`,status:400};if(!a.definition.integrations[t])return{error:`This agent declares no ${t} integration in its agent.json`,status:400};if(a.state.public&&!r&&!e.integrations[t].publicApps)return{error:`${e.integrations[t].name} apps cannot be public here. Create a private one.`,status:400};let o=Tn(t,a.state),s=a.state.tx?await ut(e,a.state.tx,`create`,i)===o?a.state.tx:void 0:await Ce(e,`create`,i,o);return s?{state:{...a.state,tx:s},definition:a.definition}:{error:`This app creation link is invalid, expired, or already used`,status:403}}async function wi(e,t,n,r){let i=r.searchParams.get(`tx`);if(t.operatorApp&&i&&(await ut(t,i,`create`,`*`)||await Si(t,i)===n.id))return await bn(e,t.dashboardHosts)??jn();let a=new URLSearchParams(r.searchParams);return a.set(`create`,n.id),se(`${Bn(t)}${Yt(vn(t),`/setup`)}?${a}`)}async function Ti(e,t,n){let r=await Ci(e,t,n);if(`error`in r)return D({error:r.error},r.status);let{app:i}=e.integrations[t],a=r.state.tx,o=i.createStep&&(e.operatorApp||r.state.public)?i.createStep(e.config.publicUrl,{saved:await Be(e,t),name:r.definition.name,public:r.state.public}):void 0,s=e.config.publicUrl;if(i.createPost&&B.has(new URL(s).hostname))return D({error:`${e.integrations[t].name} cannot reach ${s}. Set a public address first.`},400);let c=e.operatorApp?void 0:mn(e,r.state.agent),l=i.createPost?.({publicUrl:s,...r,encodedState:fe({tx:a,...c?{back:c}:{}})});return D({tx:a,...l?{post:l}:{},...o?{create:o}:{}})}async function Ei(e,t,n,r){return Ti(t,n.id,r.searchParams)}async function Di(e,t,n){let r=await e.json().catch(()=>void 0);return Ti(t,n.integration,new URLSearchParams(r&&typeof r==`object`?r:{}))}async function Oi(e,t,n,r,i){let a=t.operatorApp??!1,o=a?`*`:t.session?.user.id??`anonymous`,s=t.integrations[n];if(!s)return R(t,`unknown-integration`,{platform:n},i);if(a&&s.app.builtin!==`shared`)return D({error:`Create this app in your workspace from the agent's Platforms tab.`},400);let c=t.config.publicUrl;if(!c)return R(t,`no-public-url`,{},i);let l=r?await Ut(t,r,n,o):void 0;if(!l)return R(t,`create-expired`,{platform:n},i);a&&await t.store.put(`delivery`,xi(r),{at:t.now?.()??Date.now(),target:n},{ttlMs:6e5});let u=a?`/create/${n}`:mn(t,l.state.agent),d=a?{tx:r}:{},f=a?void 0:(await an(t)).find(e=>e.integration===n),p=await s.app.createCallback(e,{publicUrl:c,...l,fetch:t.fetch??fetch,tokens:Pn(t,n),...f?{shared:G(t.config,f.credentials)}:{}}).catch(r=>r instanceof T&&r.code===`invalid-field`&&e.headers.get(`accept`)===`application/json`?D({error:r.message},400):r instanceof T?R(t,r.code,{platform:n,error:r.error,...d},u):(console.error(`coder server: creating the ${n} app failed`,r),R(t,`failed`,{platform:n,...d},u)));if(p instanceof Response)return p;let m={id:`${n}:${p.platformAppId}`,integration:n,agent:l.state.agent,name:p.name,...l.state.repo?{agentsRepo:l.state.repo}:{},...l.state.repo?{branch:l.state.branch??`main`}:{},...a?{builtin:!0}:{},...`shared`in p?{shared:f.id,credentials:``}:{credentials:W(t.config,p.credentials)},createdAt:t.now?.()??Date.now()};if(await t.store.put(`app`,m.id,m),s.app.values&&await t.store.put(`delivery`,Me(m.id),{version:0,manifest:s.app.values(m,{publicUrl:c,definition:l.definition}).lines,changed:!1}),a)return await _i(t,`Created the shared app`,`${p.name} on ${s.name}`),R(t,`created`,{platform:n,app:p.name,...d},u);let h=await Ce(t,`install`,o,m.id);return se(`${c}/install/${n}?app=${encodeURIComponent(m.id)}&state=${fe({tx:h,back:u})}`)}async function ki(e,t,n,r){let i=ce(r.searchParams.get(`state`));return Oi(e,t,n.id,i?.tx,Ft(i?.back))}async function Ai(e,t,n,r){let i=new URLSearchParams(await e.clone().text()).get(`tx`),a=await Oi(e,t,n.id,i,void 0),o=a.headers.get(`location`);return o&&e.headers.get(`accept`)===`application/json`?D({url:o}):a}async function ji(e,t,n,r){if(t.source!==`repo`||!t.repo)return;let i=(await(r??e.store.list(`app`))).find(({value:e})=>e.agent===t.id&&e.agentsRepo===t.repo)?.value;return((i&&e.integrations[i.integration])??Object.values(e.integrations).find(e=>e.repos))?.repos?.url(t.repo,t.path,i?.branch??n?.commit)}async function Mi(e,t,n){return C()[t]&&await wr(e,n),Er(e.store,t)}async function Q(e,t){let n=(e.now??Date.now)();(!t||C()[t])&&await wr(e,n);let r=e.local?await Cr(e.store,e.local.cwd,e.integrations,t).catch(()=>void 0):void 0;return{now:n,local:r,loadCurrent:()=>r?Promise.resolve(r.find(({record:e})=>e.id===t)??{}):Mi(e,t,n)}}async function Ni(e,t,{after:n,q:r,source:i,platform:a,limit:o}){return t?(t??[]).filter(({version:e})=>!a||!!e?.definition?.integrations?.[a]).map(({record:e})=>e).filter(e=>(!n||e.id>n)&&(!i||e.source===i)&&(!r||[e.id,e.name,e.description,e.repo].some(e=>e?.toLowerCase().includes(r)))).sort((e,t)=>e.id.localeCompare(t.id)).slice(0,o):(await e.store.listAgentSummaries({after:n,q:r,source:i,platform:a,limit:o})).map(({record:e})=>e)}async function Pi(e,t,n,r){let i=r.searchParams.get(`fields`);if(i&&![`id`,`id,name`].includes(i))return D({error:`Invalid fields`},400);let{local:a}=await Q(t);if(!a&&k(r)&&!i)return D(await zi(t,r));let o=O(r,200);if(i){let e=await Ni(t,a,{after:ae(r),q:r.searchParams.get(`q`)?.trim().toLowerCase(),source:Ri[r.searchParams.get(`type`)??``],platform:r.searchParams.get(`platform`)??void 0,limit:o+ +!!k(r)}),n=e=>i===`id`?{id:e.id}:{id:e.id,name:e.name},s=de(e,o,e=>e.id);return D(k(r)?{...s,items:s.items.map(n)}:e.map(n))}let s=a??await t.store.listAgentSummaries({limit:o});if(k(r))return D(await zi(t,r,s));let c,l=b();return D(await Promise.all(s.slice(0,o).map(async({record:e,version:n})=>{e.source===`repo`&&e.repo&&(c??=t.store.list(`app`));let r=await ji(t,e,n,c);return{...e,problems:Sr(e,n,t.integrations),...e.id===l?{default:!0}:{},definition:n?.definition,...r?{sourceUrl:r}:{}}})))}async function Fi(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),c=O(r,10,50),l=ae(r),[u,d]=await Promise.all([o?s().then(e=>e.record):q(t.store,i),o?Promise.resolve(o.flatMap(({version:e})=>e?[{value:e}]:[])):t.store.listVersions(i,c+1,l)]);return u?D(await Bi(t,u,c,l??u.currentVersion+1,d)):D({error:`No agent named "${i}"`},404)}async function Ii(e,t,n,r){let i=n.slug,a=n.version?Number(n.version):void 0;if(n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return ie();let{now:o,local:s,loadCurrent:c}=await Q(t,i),l=s?s.find(({version:e})=>e?.version===a)?.version:await K(t.store,i,a);return l?D(l):D({error:`No version ${a} for agent "${i}"`},404)}async function Li(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),c=r.searchParams.get(`versions`)!==`0`,l=r.searchParams.get(`content`)!==`0`,u=r.searchParams.get(`handles`)===`1`,d=t.session?.user.id,[{record:f,version:p},m,h,g]=await Promise.all([!l&&!o?t.store.listAgentSummaries({slug:i}).then(e=>e[0]??{}):s(),c?o?o.flatMap(({version:e})=>e?[{value:e}]:[]):t.store.listVersions(i):[],u?Ye(t,i):[],u?tn(t.store,i):void 0]);if(!f)return D({error:`No agent named "${i}"`},404);let _=u?await et(t,{engine:f.settings?.engine??p?.definition.engine,model:f.settings?.model??p?.definition.model},d):void 0,v=p?.definition.integrations??{},y=e=>{let t=v[e]?.events;return Array.isArray(t)?t.includes(`mention`):!!(t&&`mention`in t)},b=[],x=Object.keys(t.integrations),S=(e,t)=>x.indexOf(e.value.integration)-x.indexOf(t.value.integration);for(let{value:e}of[...h].sort(S))y(e.integration)&&!b.some(t=>t.integration===e.integration&&t.name.toLowerCase()===e.name.toLowerCase())&&b.push({name:e.name,integration:e.integration,platform:t.integrations[e.integration]?.name??e.integration});let C=m.map(({value:e})=>{let{systemPrompt:t,files:n,...r}=e;return r}),w=await ji(t,f,p);return D({...f,problems:Sr(f,p,t.integrations),...p?{definition:p.definition,...l&&`systemPrompt`in p?{systemPrompt:p.systemPrompt,...p.files?{files:p.files}:{}}:{}}:{},...w?{sourceUrl:w}:{},...c?{versions:C}:{},...b.length?{handles:b}:{},...g?.failed?{deliveries:{failed:g.failed,recent:g.recent.map(e=>({at:e.at,platform:t.integrations[e.integration]?.name??e.integration,...e.type?{type:e.type}:{},error:e.error,...e.url?{url:e.url}:{}}))}}:{},..._?{..._.usable?{}:{needsModel:!0}}:{}})}const Ri={builtin:`builtin`,dashboard:`upload`,repository:`repo`};async function zi(e,t,n){let r=O(t,24,100),i=ae(t),a=t.searchParams.get(`q`)?.trim().toLowerCase(),o=Ri[t.searchParams.get(`type`)??``],s=t.searchParams.get(`platform`),c=t.searchParams.get(`connect`)===`1`,l=e.serverOrganizationId,u=e.store.list(`app`),[d,f,p,m]=await Promise.all([u,e.store.list(`installation`),c&&l!==void 0&&l!==e.organizationId&&e.scope?e.scope(l).store.list(`app`):[],n?n.filter(({record:e})=>(!i||e.id>i)&&(!o||e.source===o)&&(!a||[e.id,e.name,e.description,e.repo].some(e=>e?.toLowerCase().includes(a)))):e.store.listAgentSummaries({after:i,source:o,q:a,platform:s??void 0,limit:r+1})]),h=new Set(f.filter(({value:e})=>!e.deletedAt&&!e.uninstalled).map(({value:e})=>e.app)),g=(e,t)=>{let n=d.filter(({value:n})=>n.agent===e&&n.integration===t);return n.length?n.some(({value:e})=>h.has(e.id))?`installed`:`created`:`none`},_=[];for(let{record:e,version:t}of m){let n=Object.keys(t?.definition?.integrations??{}).sort();if(!(s&&!n.includes(s))&&(_.push({record:e,version:t,ids:n}),_.length>r))break}let v=de(_,r,e=>e.record.id),y=b();return{...v,...c?{connectable:[...d,...p].filter(({value:t})=>t.builtin&&e.integrations[t.integration]?.app.builtin===`shared`&&!h.has(t.id)).map(({value:e})=>({id:e.id,integration:e.integration,agent:e.agent}))}:{},items:await Promise.all(v.items.map(async({record:t,version:n,ids:r})=>{let i=await ji(e,t,n,u);return{...t,problems:Sr(t,n,e.integrations),...t.id===y?{default:!0}:{},definition:n?.definition,...i?{sourceUrl:i}:{},platforms:r.map(e=>({id:e,state:g(t.id,e)}))}}))}}async function Bi(e,t,n,r,i){let a=(i??await e.store.listVersions(t.id,n+1,r)).map(({value:e})=>{let{systemPrompt:t,files:n,definition:r,...i}=e;return i}).filter(e=>e.version<r).reverse();return de(a,n,e=>e.version)}var Vi=class{options;entries=new Map;pending=new Map;constructor(e){this.options=e}async get(e,t){let n=this.options.now??Date.now,r=n(),i=this.entries.get(e);if(i&&r-i.at<this.options.ttlMs)return i.value;let a=this.pending.get(e);return a||(a=Promise.resolve().then(t).then(t=>{if(t===void 0)return i?.value;if(this.options.accept&&!this.options.accept(t))return i?.value??t;this.entries.set(e,{value:t,at:n()});let r=this.entries.keys().next().value;return this.entries.size>this.options.max&&r!==void 0&&this.entries.delete(r),t}).catch(t=>(console.error(`coder server: model probe failed for ${e}`,t),i?.value)).finally(()=>this.pending.delete(e)),this.pending.set(e,a)),a}};const Hi=/^[a-z0-9][a-z0-9-]*$/,Ui=new Set([`openrouter.ai`,`ai-gateway.vercel.sh`,`api.groq.com`,`api.together.xyz`]);function Wi(e){return{builtin:{codex:a,claude:n},models:e.models??{}}}async function Gi(e,t){let{baseUrl:n,envKey:r,key:i}=await _t(e);if(!n||!/^https?:\/\//.test(n)||!URL.canParse(n))return D({error:`An http or https base URL is required`},400);let a=!i&&r&&await Ki(t,n,r)?await we(t,r):void 0,o=i||a,s=t.settings??={},c=s.probes??=new Vi({ttlMs:6e5,max:100,now:t.now,accept:e=>e.reachable}),l=`${new URL(n).host}|${r??``}|${E(String(o??``))}`;return D(await c.get(l,()=>re({baseUrl:n},{key:o,fetch:t.fetch})))}async function Ki(e,t,n){let r=new URL(t).host;if(Ui.has(r))return!0;let i=(await Ve(e)).models??{};return Object.values(i).some(e=>`baseUrl`in e&&e.envKey===n&&new URL(e.baseUrl).host===r)}async function qi(e,t,n,r){return D(Wi(await Ve(t)))}async function Ji(e,t,n,r){let{name:a=``,...o}=await _t(e);return!Hi.test(a)||i(a)?D({error:`Invalid model name "${a}"`},400):I(t,e=>{if(e.models?.[a])throw new j(`"${a}" already exists`);e.models={...e.models,[a]:o}})}async function Yi(e,t,n,r){let i=n.name;return I(t,e=>{if(!e.models?.[i])throw new j(`No model "${i}"`);l(e,i)})}async function Xi(e,t,i,s){let c=i.name,{spec:l}=await _t(e);return I(t,e=>{if(!Hi.test(c))throw new j(`Invalid alias name "${c}"`);let t=e.models?.[c];if(t&&o(t))throw new j(`"${c}" is a custom model name`);let i=h(l,m(e));if(!i?.model||i.engine===`custom`)throw new j(`"${l}" does not name a codex or claude model`);let s=i.engine===`claude`?n:a,d=l.split(`:`).some(e=>u.has(e)||r.has(e));e.models={...e.models,[c]:{provider:i.engine,model:s[i.model]??i.model,...d&&i.effort?{effort:i.effort}:{}}}})}async function Zi(e,t,n,r){let i=n.name;return I(t,e=>{let t=e.models??={},n=t[i];n&&(o(n)||s(n))?n.disabled=!0:t[i]={disabled:!0}})}async function Qi(e,t,n,r){let i=n.name;return I(t,e=>{let t=e.models??={},n=t[i];n&&(o(n)||s(n))?delete n.disabled:delete t[i]})}async function $i(e,t){let{now:n,local:r}=await Q(t),[i,a,o]=await Promise.all([Ni(t,r,{limit:200}),Ve(t),t.store.list(`runner`)]),s=b(),c=i.filter(e=>!e.settings?.disabled).sort((e,t)=>Number(t.id===s)-Number(e.id===s)).map(({id:e,name:t})=>({id:e,name:t,...e===s?{default:!0}:{}})),l=Ne(t,a),u=Object.values(t.integrations).find(e=>e.repos);return D({agents:c,...l.chain?.[0]?{engine:l.chain[0]}:{},engines:l.engines??{},models:Wi(a),runners:Ht(t,o,n).map(({id:e,name:t,default:n})=>({id:e,name:t,default:n})),flows:v(_(),`builtin`).map(e=>e.name),...t.local?{folders:At(t.local.cwd)}:{},...u?{connectLabel:u.installLabel??`Connect ${u.id}`}:{}})}async function ea(e,t){let n=(await e.store.list(`installation`)).filter(({value:t})=>!t.deletedAt&&e.integrations[t.integration]?.repos),r=new Map((await ye(e.store,n.map(({value:e})=>e.app))).map(({id:e,value:t})=>[e,t]));for(let{value:i}of n){let n=e.integrations[i.integration];if(i.deletedAt||!n?.repos)continue;let a=r.get(i.app);if(!(!a||a.integration!==n.id))try{let r=await be(e,n,i,G(e.config,a.credentials),{repo:{owner:t.split(`/`)[0],name:t.split(`/`)[1]}});if(i.repos?.includes(t)||(await n.repos.list(bt(e,i),r)).includes(t))return{contents:n,token:r,app:a,installation:i}}catch(e){console.error(`coder server: repository access for ${i.id} failed`,e)}}}async function ta(e,t,n){let r=await ea(e,t);if(!r)return D({error:`No installed app can read ${t}`},400);let i=await r.contents.repos.listDir(t,yt,r.token,n).catch(()=>[]),a=await Promise.all(i.map(async i=>{let a=await r.contents.repos.readFile(t,`${yt}/${i}/agent.json`,r.token,n).catch(()=>void 0);if(a===void 0)return;let o={};try{let e=JSON.parse(a);e&&typeof e==`object`&&(o=e)}catch{}let s=Object.entries(o.mcp&&typeof o.mcp==`object`&&!Array.isArray(o.mcp)?o.mcp:{}).flatMap(([e,t])=>f(e,t)),c=await q(e.store,i),l=c?.source===`repo`&&c.repo===t,u=l?await K(e.store,i):void 0;return{id:i,name:typeof o.name==`string`?o.name:i,...s.length?{warnings:s}:{},...typeof o.description==`string`?{description:o.description}:{},...l?{version:c.currentVersion,...u?.source?{commit:u.source.commit}:{}}:{},...c&&!l?{taken:!0}:{}}}));return D({repo:t,agents:a.filter(Boolean)})}async function na(e,t,n,r){let i=r.searchParams.get(`repo`);return i?ta(t,i,r.searchParams.get(`ref`)||`HEAD`):D({error:`repo is required`},400)}async function ra(e,t,n,r){let i=await e.json().catch(()=>void 0),a=i?.agents;if(typeof i?.repo!=`string`||i.ref!==void 0&&typeof i.ref!=`string`||a!==void 0&&!(Array.isArray(a)&&a.every(e=>typeof e==`string`)))return D({error:`repo is required, ref must be a string and agents a list of ids`},400);try{let e=await ea(t,i.repo);if(!e)return D({error:`No installed app can read ${i.repo}`},400);let n=i.ref??`HEAD`,r=a??await e.contents.repos.listDir(i.repo,`.coder/agents`,e.token,n);for(let e of r){let n=await q(t.store,e);if(n&&(n.source!==`repo`||n.repo!==i.repo))return D({error:`Agent id "${e}" is already taken`},409)}let o=await Fe(t.store,e.contents,i.repo,n,e.token,(t.now??Date.now)(),{slugs:r});return await Ue(t,o),D({imported:o.map(e=>e.agent)})}catch(e){return D({error:e instanceof Error?e.message:String(e)},400)}}function ia(e){if(!e||Array.isArray(e)||typeof e!=`object`)return!1;let t=Object.entries(e);if(t.length>100)return!1;let n=0;for(let[e,r]of t){if(typeof r!=`string`||e.startsWith(`/`)||e.includes(`\\`)||e.includes(`\0`)||e.split(`/`).includes(`..`)||e===`agent.json`||e===`system.md`)return!1;n+=Buffer.byteLength(e)+Buffer.byteLength(r)}return n<=262144}async function aa(e,t){return(await St(e,[t])).flatMap(({app:e,error:t,check:n})=>{let r={id:e.id,integration:e.integration,name:e.name};return t?[{...r,error:t}]:n?n.changed?[{...r,drift:!0}]:[]:[{...r,updated:!0}]})}async function oa(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),c=await e.json().catch(()=>void 0);try{let e=S({[i]:c})[i];if(!e||typeof e!=`object`)throw Error(`settings must be an object`);let{disabled:n,...r}=e,a=n?{...r,disabled:n}:r,{record:o,version:l}=await s();if(!o||!l)throw Error(`No agent named "${i}".`);if(vr({...o,settings:void 0},l,r,t.integrations),t.local){let e=x(t.local.cwd,i,!!n);return e?D({error:`Agent "${i}" is ${n?`enabled`:`disabled`} by agents.${i} in ${e}. Change it there.`},409):(await Ot(t,e=>{e.agents={...e.agents,[i]:a}}),await Cr(t.store,t.local.cwd,t.integrations),D(await q(t.store,i)))}return D(await Dr(t.store,i,a,(t.now??Date.now)()))}catch(e){return D({error:e instanceof Error?e.message:String(e)},400)}}async function sa(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),{record:c}=await s();return c?c.source===`builtin`?D({error:`Built-in agents cannot be deleted.`},400):t.local&&!await Tr(t.local.cwd,t.integrations,i)?D({error:`Delete .coder/agents/${i} in the repo`},409):(await t.store.delete(`agent`,i),D({ok:!0})):D({error:`No agent named "${i}"`},404)}async function ca(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),c=await e.json().catch(()=>void 0);if(!c||typeof c.systemPrompt!=`string`||c.files!==void 0&&!ia(c.files)||c.name!==void 0&&typeof c.name!=`string`||c.description!==void 0&&typeof c.description!=`string`)return D({error:`definition and systemPrompt are required; files must contain strings`},400);try{ee([i]);let[e]=w({definitions:{[i]:{json:c.definition,builtin:!1}},usage:void 0},t.integrations);if(!e)throw Error(`No agent named "${i}".`);let n=t.local?await q(t.store,i):void 0,r=t.local&&n?await K(t.store,i):void 0,a=c.files;t.local&&(await br(t.local.cwd,t.integrations,i,{definition:{...c.definition,...c.name===void 0?{}:{name:c.name},...c.description===void 0?{}:{description:c.description}},systemPrompt:c.systemPrompt,...a?{files:a}:{}}),await Cr(t.store,t.local.cwd,t.integrations));let o=t.local?void 0:await yr(t.store,{id:i,name:c.name??e.name,description:c.description??e.definition.description,source:`upload`,definition:e.definition,systemPrompt:c.systemPrompt,files:a,importedFrom:`upload`},(t.now??Date.now)()),s=o?.version??await K(t.store,i),l=o?.unchanged??Fr(r&&{...r,createdAt:0},{...s,createdAt:0}),u=await aa(t,s),d=o?.record??await q(t.store,i);return D({...d,definition:s.definition,version:s.version,unchanged:l,apps:u})}catch(e){return D({error:e instanceof Error?e.message:String(e)},400)}}async function la(e,t,n,r){let i=n.id,a=Number(r.searchParams.get(`after`)??-1),o=Number.isFinite(a)?a:-1;r.searchParams.has(`limit`)&&O(r,500,2e3);let s=await t.store.get(`task`,i);if(!s||t.local&&s.handle?.startsWith(`cli:`)&&s.task.flow==="default"){let n=s?.task.cwd??t.local?.cwd;if(!n||!M(n,i,!1))return D({error:`No task "${i}"`},404);{let r=Number(e.headers.get(`last-event-id`)??o);return _a(e,t,`cli:${n}:${i}`,Number.isFinite(r)?r:o,async e=>{let t=M(n,i);if(t)return{status:t,lines:Xe(n,i,e,500),pendingResult:ua(n,t,!t.result)}})}}let c=Number(e.headers.get(`last-event-id`)??o),l=t.statementTimeout??((e,t)=>t());return _a(e,t,i,Number.isFinite(c)?c:o,e=>l(ha,async()=>{let n=await t.store.get(`task`,i);if(n)return{status:await pt(t,n),lines:await en(t.store,i,e,500)}}))}function ua(e,t,n=!1){if(!Tt.has(t.status)||t.error||t.status===`cancelled`)return!1;let r=c(e,t.task.id),i=Date.parse(r?.resumedAt??r?.createdAt??``)||0;return n||(Ar.statSync(J.join(p(e,t.task.id),`result.json`),{throwIfNoEntry:!1})?.mtimeMs??0)<i}const da=1e3,$=3e4;function fa(e,t,n,r){let i=[...new Set((r.searchParams.get(`tasks`)??``).split(`,`).filter(Boolean))].slice(0,100),a=Date.now(),o=t.taskWatcher??new ma,s=o.tag(t),[c,l]=(e.headers.get(`last-event-id`)??``).split(`-`),u=Number(c),d=u>0&&`-${l}`===s,f=d?Math.min(Math.max(u,a-29e4),a):a,p=u>0&&(!d||u<f)?`event: reset
|
|
1
|
+
import{qi as e}from"./core-DwsAMCnL.js";import{At as t,D as n,E as r,H as i,M as a,U as o,V as s,Vt as c,Y as l,cr as u,j as d,kt as f,lt as p,nn as m,nt as h,q as g,v as _,x as v}from"./prompts-Bj4Fbd_n.js";import{U as y}from"./dispatch-CFZ9Crvg.js";import{a as b,c as x,h as S,i as C,n as w,r as ee}from"./load-Q9fL4VC6.js";import{d as T,m as E}from"./slack-DhPhLuWb.js";import{n as te}from"./integrations-IGnXBrPw.js";import{t as ne}from"./history-C53URBjs.js";import{n as re}from"./models-Cb0ZTKZ7.js";import{a as D,d as O,f as k,l as ie,n as ae,o as oe,p as se,r as ce,s as le,t as ue,u as de,y as fe}from"./http-CDZKt5ln.js";import{$ as pe,$n as me,$t as he,A as ge,An as _e,At as ve,Bn as ye,Bt as be,C as xe,Cn as Se,Cr as Ce,Ct as we,D as Te,Dn as Ee,E as De,En as Oe,Et as ke,F as Ae,Fn as je,G as A,Gn as Me,Gt as Ne,H as Pe,Hn as Fe,Ht as j,I as Ie,In as Le,It as Re,J as ze,Jn as Be,Jt as Ve,K as He,Kn as Ue,Kt as We,L as Ge,Ln as Ke,Lt as qe,M as Je,Mn as Ye,Mt as Xe,N as Ze,Nn as Qe,Nt as M,O as N,On as $e,Ot as et,P as tt,Pn as nt,Pt as P,Q as rt,Qn as it,Qt as at,R as ot,Rn as st,Rt as ct,S as F,Sn as lt,Sr as ut,St as dt,T as ft,Tn as pt,Tt as mt,U as ht,Un as gt,Ut as _t,V as vt,Vn as yt,Vt as bt,W as xt,Wn as St,Wt as I,X as Ct,Xn as wt,Xt as Tt,Y as Et,Yn as Dt,Yt as Ot,Z as kt,Zn as At,Zt as jt,_ as Mt,_n as Nt,_t as Pt,a as Ft,an as It,ar as Lt,at as Rt,b as zt,br as L,c as R,cn as Bt,cr as Vt,ct as Ht,d as Ut,dn as Wt,dr as Gt,en as Kt,er as qt,et as Jt,f as Yt,fn as Xt,fr as Zt,ft as Qt,g as $t,gn as en,gt as z,h as B,hn as tn,hr as nn,ht as rn,i as an,in as on,ir as sn,it as cn,j as V,jn as ln,jt as un,k as dn,kn as fn,kt as pn,l as mn,ln as hn,lr as gn,lt as _n,m as vn,mn as yn,mr as bn,mt as xn,nn as Sn,nr as Cn,nt as wn,o as Tn,on as En,or as Dn,ot as On,p as kn,pn as An,pr as jn,pt as Mn,q as Nn,qn as Pn,qt as Fn,r as In,rn as Ln,rr as Rn,rt as zn,s as Bn,sn as Vn,sr as Hn,st as Un,tn as Wn,tr as Gn,tt as Kn,u as qn,un as Jn,ur as Yn,ut as Xn,v as Zn,vn as Qn,vr as $n,vt as er,w as tr,x as nr,xr as H,xt as rr,y as ir,yr as U,yt as ar,z as or,zn as sr,zt as cr}from"./apps-BNe86LfS.js";import{n as lr,r as ur}from"./env-BgE9ipvN.js";import{C as W,S as dr,a as fr,g as pr,i as mr,m as hr,n as gr,o as _r,x as G}from"./runners-DyLnqHKy.js";import{S as vr,_ as yr,a as br,b as xr,f as Sr,g as K,h as q,i as Cr,m as wr,n as Tr,p as Er,x as Dr}from"./local-Bzdmzc1o.js";import{X as Or}from"./schema-CjHmulYJ.js";import{r as kr}from"./client-sqXb-y09.js";import J from"node:path";import Y from"node:process";import Ar from"node:fs";import{spawnSync as jr}from"node:child_process";import{createHash as Mr,randomBytes as Nr,randomUUID as Pr}from"node:crypto";import X from"node:fs/promises";import{isDeepStrictEqual as Fr,promisify as Ir}from"node:util";import Lr from"node:http";import{gunzip as Rr,gzip as zr}from"node:zlib";async function Br(e){try{return await X.readdir(e,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}}async function Vr(e){try{return await X.lstat(e),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}}async function Hr(e,t){if(e===t||!await Vr(e))return 0;let n=await Br(e),r=n.filter(e=>e.isDirectory()).length;if(!await Vr(t))return await u(e,t),r;for(let r of n)await u(J.join(e,r.name),J.join(t,r.name));return await X.rmdir(e),r}async function Ur(e){let t=J.dirname(e),n=J.basename(e);for(let e of await Br(t)){let r=e.name.startsWith(n)?e.name.slice(n.length):``;if(!e.isFile()||!(r===`.tmp`||/^\.\d+(?:\.[a-f0-9-]{36})?\.tmp$/.test(r)))continue;let i=Number(e.name.slice(n.length+1).split(`.`)[0]);if(Number.isInteger(i)&&i>0)try{process.kill(i,0);continue}catch(e){if(e.code!==`ESRCH`)continue}await X.unlink(J.join(t,e.name)).catch(e=>{if(e.code!==`ENOENT`)throw e})}}async function Wr(e,t){if(await Ur(e),e===t||!await Vr(e))return 0;if(!await Vr(t))return await u(e,t),1;let n=JSON.parse(await X.readFile(e,`utf8`)),r=JSON.parse(await X.readFile(t,`utf8`)),i={...n,...r,...n.rows||r.rows?{rows:{...n.rows,...r.rows}}:{}},a=`${t}.${process.pid}.${Pr()}.tmp`;try{await X.writeFile(a,`${JSON.stringify(i)}\n`,{mode:384,flag:`wx`}),await X.rename(a,t),await X.unlink(e)}finally{await X.rm(a,{force:!0})}return 1}async function Gr(){let e=f(),n=t(`state`),r=f(`archive`),i=f(`flows-archived`),a=f(`usage.json`),o=f(`runner`,`usage.json`),s={from:t(`checkouts`),to:f(`checkouts`)},c={from:t(`update-check.json`),to:f(`update-check.json`)},l={cache:e,tasks:0,flows:0,files:0},u=(await Br(n)).filter(e=>e.isDirectory()).map(e=>({archive:t(`state`,e.name,`archive`),flows:t(`state`,e.name,`flows-archived`),usage:t(`state`,e.name,`usage.json`),runnerUsage:t(`state`,e.name,`runner`,`usage.json`)}));await Ur(a),await Ur(o);for(let e of u)l.tasks+=await Hr(e.archive,r),l.flows+=await Hr(e.flows,i),l.files+=await Wr(e.usage,a),l.files+=await Wr(e.runnerUsage,o);return await Hr(s.from,s.to),l.files+=await Wr(c.from,c.to),l}async function Kr(e){let t=(e.now??Date.now)(),n=await e.store.list(`runner`);return{online:1+n.filter(({value:e})=>e.lastSeen!==void 0&&t-e.lastSeen<3e5).length,total:1+n.length}}async function qr(e){let t=(e.now??Date.now)(),n=e.healthyAt!==void 0&&t-e.healthyAt<5e3,r=n||await Jr(e);return e.healthyAt=r?n?e.healthyAt:t:void 0,D({ok:r},r?200:503,{"cache-control":`no-store`})}async function Jr(e){return e.config.store===`postgres`?e.databaseHealth?e.databaseHealth().then(()=>!0,()=>!1):!1:!0}async function Yr(e){let t=(e.now??Date.now)();if(!e.local)return{...await e.queue.metrics(e.organizationId,t-864e5),runnersOnline:(await Kr(e)).online,requests:e.limits?.requests??0,rateLimitRejections:e.limits?.rejections??0};let n=await e.queue.list(e.organizationId),r=e.local?[...P(e.local.cwd,!1),...P(e.local.cwd,!0)]:[],i=new Map([...r,...n.map(e=>e.status===`queued`?e:r.find(t=>t.task.id===e.task.id)??e)].map(e=>[e.task.id,e])),a={queued:0,running:0,waiting:0,completed:0,failed:0,cancelled:0},o=0;for(let e of i.values())e.createdAt>=t-864e5&&a[e.status]++,e.status===`queued`&&o++;return{tasks:a,queueDepth:o,runnersOnline:(await Kr(e)).online,requests:e.limits?.requests??0,rateLimitRejections:e.limits?.rejections??0}}const Xr=Ir(Rr),Zr=Ir(zr);async function Qr(e,t,n){return D(await t.store.listHistory(n.id))}async function $r(e,t,n){let r=await t.store.get(`history`,`${n.id}:${n.conversation}`);if(!r)return D({error:`No saved history`},404);try{return D({engine:r.engine,conversation:r.conversation,data:G(t.config,r.data),...r.state?{state:G(t.config,r.state)}:{}})}catch(e){return console.error(`coder server: history ${n.id}/${n.conversation} could not be decrypted`,e),D({error:`The saved history cannot be read`},422)}}async function ei(e,t,n){let r=await e.json().catch(()=>void 0);if(r?.engine!==`claude`&&r?.engine!==`codex`||typeof r.conversation!=`string`||!ne.test(r.conversation)||typeof r.data!=`string`||r.state!==void 0&&(!r.state||typeof r.state!=`object`||Array.isArray(r.state)))return D({error:`Invalid history`},400);let i;try{i=(await Xr(Buffer.from(r.data,`base64`),{maxOutputLength:67108864})).toString(`utf8`)}catch{return D({error:`Invalid history`},400)}let a=await Nt(t,t.callbackTask,!0);return await t.store.put(`history`,`${n.id}:${r.conversation}`,{engine:r.engine,conversation:r.conversation,data:W(t.config,(await Zr(a(i))).toString(`base64`)),...r.state?{state:W(t.config,JSON.parse(a(JSON.stringify(r.state))))}:{},savedAt:(t.now??Date.now)()}),D({ok:!0})}async function ti(e,t,n,r){let i=t.session.user.id;n.id;let a=(await e.json().catch(()=>({}))).engine??``;if(!oi.has(a)||!t.config.subscriptions?.[a])return D({error:`Sign in with ${a||`that engine`} is off on this server.`},403);let o=t.runners[t.config.runner];if(!o||o.kind===`github-actions`)return D({error:`Sign-in cannot run on the ${t.config.runner} runner.`},409);let s=(await t.store.list(`login`)).find(({value:e})=>e.owner===i&&e.engine===a&&e.state!==`done`&&e.state!==`failed`&&e.expiresAt>si(t));if(s)return D(li(s.id,s.value));let c=`login-${Nr(12).toString(`base64url`)}`,l=Qn(c,t.organizationId,0),u={owner:i,engine:a,state:`starting`,tokenHash:l.hash,runner:o.kind,createdAt:si(t),expiresAt:si(t)+ai};await ci(t,c,u);let d;try{let e=await o.start({id:c},{CODER_SERVER:t.config.publicUrl??``,CODER_TASK_TOKEN:l.token,CODER_LOGIN:a},void 0,{timeoutMs:ai,hosts:[hr[a].api,...hr[a].account]}),n=await t.store.patchLogin(c,{handle:e},{tokenHash:u.tokenHash});if(!n)return await o.stop(e).catch(()=>{}),D({error:`This sign-in is gone. Start again.`},409);d=n}catch(e){return await t.store.delete(`login`,c),D({error:e instanceof Error?e.message:String(e)},502)}return D(li(c,d),201)}async function ni(e,t,n,r){t.session.user.id;let i=n.id??``;if(!r.searchParams.has(`state`)){let e=i&&!i.includes(`/`)?await Z(t,i):void 0;return e?D(li(i,e)):D({error:`This sign-in is gone. Start again.`},404)}let a=await t.store.watch(`login`,i);try{let n=i&&!i.includes(`/`)?await Z(t,i):void 0;if(!n)return D({error:`This sign-in is gone. Start again.`},404);let o=r.searchParams.get(`state`),s=Date.now()+25e3;for(;o&&n.state===o&&Date.now()<s&&!e.signal.aborted;)if(await a.wait(Math.min(1e4,s-Date.now()),e.signal),n=await Z(t,i),!n)return D({error:`This sign-in is gone. Start again.`},404);return D(li(i,n))}finally{a.close()}}async function ri(e,t,n,r){t.session.user.id;let i=n.id??``,a=i&&!i.includes(`/`)?await Z(t,i):void 0;if(!a)return D({error:`This sign-in is gone. Start again.`},404);let o=await e.json().catch(()=>({})),s=typeof o.code==`string`?o.code.trim():``;return a.engine!==`claude`||a.state!==`open`||!s||!await t.store.patchLogin(i,{state:`verifying`,input:W(t.config,s)},{state:`open`,tokenHash:a.tokenHash})?D({error:`This sign-in is not waiting for a code.`},409):D({ok:!0})}async function ii(e,t,n,r){t.session.user.id;let i=n.id??``,a=i&&!i.includes(`/`)?await Z(t,i):void 0;return a?(await t.store.delete(`login`,i),a.handle&&await t.runners[a.runner]?.stop(a.handle).catch(()=>{}),D({ok:!0})):D({error:`This sign-in is gone. Start again.`},404)}const ai=6e5,oi=new Set([`claude`,`codex`]),si=e=>(e.now??Date.now)();function ci(e,t,n){return e.store.put(`login`,t,n,{ttlMs:Math.max(1,n.expiresAt-si(e))})}function li(e,t){return{id:e,engine:t.engine,state:t.state,expiresAt:t.expiresAt,...t.url?{url:t.url}:{},...t.code?{code:t.code}:{},...t.error?{error:t.error}:{}}}async function Z(e,t){let n=await e.store.get(`login`,t);return n&&n.owner===e.session?.user.id?n:void 0}function ui(e,t){let n=t.handle&&e.runners[t.runner]?.stop(t.handle);if(!n)return;let r=n.catch(e=>console.error(`coder server: could not stop the machine of a finished ${t.engine} sign-in`,e));e.waitUntil?.(r)}async function di(e,t,n,r){let i=n.id,a=await t.store.watch(`login`,i),o=Date.now()+25e3;try{for(;;){if(e.signal.aborted)return D({});let n=await t.store.get(`login`,i);if(!n||n.tokenHash!==t.callbackLogin.tokenHash)return new Response(`Unauthorized`,{status:401});if(n.input){let e=await t.store.patchLogin(i,{input:null},{input:n.input,tokenHash:n.tokenHash});return D(e?{code:G(t.config,n.input)}:{})}if(n.state===`verifying`||n.state===`done`||n.state===`failed`||Date.now()>=o)return D({});await a.wait(Math.min(1e4,o-Date.now()),e.signal)}}finally{a.close()}}async function fi(e,t,n,r){return D({engine:t.callbackLogin.engine})}async function pi(e,t,n,r){let i=n.id,a=t.callbackLogin,o=await e.json().catch(()=>({}));if(a.state===`done`||a.state===`failed`)return D({ok:!0});let s={state:[`starting`,`open`,`verifying`],tokenHash:a.tokenHash};if(typeof o.error==`string`)return await t.store.patchLogin(i,{state:`failed`,error:o.error.slice(0,500)},s)&&ui(t,a),D({ok:!0});let c=o.result?.env;if(c){let e=a.engine===`claude`?`CLAUDE_CODE_OAUTH_TOKEN`:`CODEX_AUTH_JSON`;if(Object.keys(c).join()!==e||typeof c[e]!=`string`)return D({error:`Invalid sign-in result`},400);let n=o.result?.account;return await t.store.completeLogin(i,a.tokenHash,{...dr(t.config,{env:c}),createdAt:(t.now??Date.now)(),...n?.email||n?.plan?{account:{...typeof n.email==`string`?{email:n.email}:{},...typeof n.plan==`string`?{plan:n.plan}:{}}}:{}})?(ui(t,a),D({ok:!0})):D({error:`This sign-in changed. Try again.`},409)}let l={...typeof o.url==`string`&&/^https:\/\//.test(o.url)?{url:o.url}:{},...typeof o.code==`string`?{code:o.code.slice(0,64)}:{}};return await t.store.patchLogin(i,l.url?{...l,state:`open`}:l,s)?D({ok:!0}):D({error:`This sign-in changed. Try again.`},409)}const mi=e=>`audit:${String(9999999999999-e).padStart(13,`0`)}:${Nr(4).toString(`hex`)}`,hi=e=>e.config.name??`Wular`,gi=e=>Hn(e,e.serverOrganizationId??e.organizationId);async function _i(e,t,n){let r=(e.now??Date.now)(),i=e.session?.user,a={at:r,actor:i?{id:i.id,name:i.name,email:i.email}:{id:`admin-token`},action:t,target:n};await gi(e).store.put(`snapshot`,mi(r),a)}async function vi(e,t){let n=await gi(t).store.list(`app`),r=Object.values(t.integrations).filter(e=>e.app.builtin===`shared`).map(e=>{let t=n.find(({value:t})=>t.builtin&&t.integration===e.id)?.value;return{integration:e.id,name:e.name,brand:e.brand,organizationApps:e.organizationApps===!0,...t?{app:{id:t.id,name:t.name,createdAt:t.createdAt}}:{}}}),i=t.config.publicUrl,a=!!i&&B.has(new URL(i).hostname);return D({name:hi(t),platforms:r,...a?{unreachable:!0}:{}})}async function yi(e,t,n){let r=t.integrations[n.integration];if(!r)return D({error:`Unknown integration "${n.integration}".`},404);if(r.app.builtin!==`shared`)return D({error:`Create ${r.name} apps in your workspace from the agent's Platforms tab.`},400);if(!t.config.publicUrl)return D({error:`Set PUBLIC_URL on this server first. Platforms call it.`},400);let i=await e.json().catch(()=>void 0),a=e=>typeof e==`string`&&e.trim()||void 0,o=a(i?.name)??hi(t),s=r.organizationApps?a(i?.owner):void 0,c=await In(gi(t),r.id,{name:o,owner:s});return await _i(t,`Started setting up a shared app`,`${o} on ${r.name}`),D({url:c})}async function bi(e,t){let n=await gi(t).store.list(`snapshot`,{prefix:`audit:`,limit:100});return D(n.map(e=>e.value))}const xi=e=>`create-finished:${E(e)}`;async function Si(e,t){let n=await e.store.get(`delivery`,xi(t));return n&&`target`in n?n.target:void 0}async function Ci(e,t,n){let r=e.operatorApp??!1,i=r?`*`:e.session?.user.id??`anonymous`;if(!e.integrations[t])return{error:`Unknown integration "${t}"; run coder agent integrations list to see them`,status:404};if(!e.config.publicUrl)return{error:`PUBLIC_URL is not set on this server; set it to the address platforms should call and restart`,status:400};if(r&&e.integrations[t].app.builtin!==`shared`)return{error:`Create this app in your workspace from the agent's Platforms tab.`,status:400};let a=qn(n);if(!a)return{error:`Setup link is missing or malformed; start again from the agent's Platforms tab`,status:400};if(!a.definition.integrations[t])return{error:`This agent declares no ${t} integration in its agent.json`,status:400};if(a.state.public&&!r&&!e.integrations[t].publicApps)return{error:`${e.integrations[t].name} apps cannot be public here. Create a private one.`,status:400};let o=Tn(t,a.state),s=a.state.tx?await ut(e,a.state.tx,`create`,i)===o?a.state.tx:void 0:await Ce(e,`create`,i,o);return s?{state:{...a.state,tx:s},definition:a.definition}:{error:`This app creation link is invalid, expired, or already used`,status:403}}async function wi(e,t,n,r){let i=r.searchParams.get(`tx`);if(t.operatorApp&&i&&(await ut(t,i,`create`,`*`)||await Si(t,i)===n.id))return await bn(e,t.dashboardHosts)??jn();let a=new URLSearchParams(r.searchParams);return a.set(`create`,n.id),se(`${Bn(t)}${Yt(vn(t),`/setup`)}?${a}`)}async function Ti(e,t,n){let r=await Ci(e,t,n);if(`error`in r)return D({error:r.error},r.status);let{app:i}=e.integrations[t],a=r.state.tx,o=i.createStep&&(e.operatorApp||r.state.public)?i.createStep(e.config.publicUrl,{saved:await Be(e,t),name:r.definition.name,public:r.state.public}):void 0,s=e.config.publicUrl;if(i.createPost&&B.has(new URL(s).hostname))return D({error:`${e.integrations[t].name} cannot reach ${s}. Set a public address first.`},400);let c=e.operatorApp?void 0:mn(e,r.state.agent),l=i.createPost?.({publicUrl:s,...r,encodedState:fe({tx:a,...c?{back:c}:{}})});return D({tx:a,...l?{post:l}:{},...o?{create:o}:{}})}async function Ei(e,t,n,r){return Ti(t,n.id,r.searchParams)}async function Di(e,t,n){let r=await e.json().catch(()=>void 0);return Ti(t,n.integration,new URLSearchParams(r&&typeof r==`object`?r:{}))}async function Oi(e,t,n,r,i){let a=t.operatorApp??!1,o=a?`*`:t.session?.user.id??`anonymous`,s=t.integrations[n];if(!s)return R(t,`unknown-integration`,{platform:n},i);if(a&&s.app.builtin!==`shared`)return D({error:`Create this app in your workspace from the agent's Platforms tab.`},400);let c=t.config.publicUrl;if(!c)return R(t,`no-public-url`,{},i);let l=r?await Ut(t,r,n,o):void 0;if(!l)return R(t,`create-expired`,{platform:n},i);a&&await t.store.put(`delivery`,xi(r),{at:t.now?.()??Date.now(),target:n},{ttlMs:6e5});let u=a?`/create/${n}`:mn(t,l.state.agent),d=a?{tx:r}:{},f=a?void 0:(await an(t)).find(e=>e.integration===n),p=await s.app.createCallback(e,{publicUrl:c,...l,fetch:t.fetch??fetch,tokens:Pn(t,n),...f?{shared:G(t.config,f.credentials)}:{}}).catch(r=>r instanceof T&&r.code===`invalid-field`&&e.headers.get(`accept`)===`application/json`?D({error:r.message},400):r instanceof T?R(t,r.code,{platform:n,error:r.error,...d},u):(console.error(`coder server: creating the ${n} app failed`,r),R(t,`failed`,{platform:n,...d},u)));if(p instanceof Response)return p;let m={id:`${n}:${p.platformAppId}`,integration:n,agent:l.state.agent,name:p.name,...l.state.repo?{agentsRepo:l.state.repo}:{},...l.state.repo?{branch:l.state.branch??`main`}:{},...a?{builtin:!0}:{},...`shared`in p?{shared:f.id,credentials:``}:{credentials:W(t.config,p.credentials)},createdAt:t.now?.()??Date.now()};if(await t.store.put(`app`,m.id,m),s.app.values&&await t.store.put(`delivery`,Me(m.id),{version:0,manifest:s.app.values(m,{publicUrl:c,definition:l.definition}).lines,changed:!1}),a)return await _i(t,`Created the shared app`,`${p.name} on ${s.name}`),R(t,`created`,{platform:n,app:p.name,...d},u);let h=await Ce(t,`install`,o,m.id);return se(`${c}/install/${n}?app=${encodeURIComponent(m.id)}&state=${fe({tx:h,back:u})}`)}async function ki(e,t,n,r){let i=ce(r.searchParams.get(`state`));return Oi(e,t,n.id,i?.tx,Ft(i?.back))}async function Ai(e,t,n,r){let i=new URLSearchParams(await e.clone().text()).get(`tx`),a=await Oi(e,t,n.id,i,void 0),o=a.headers.get(`location`);return o&&e.headers.get(`accept`)===`application/json`?D({url:o}):a}async function ji(e,t,n,r){if(t.source!==`repo`||!t.repo)return;let i=(await(r??e.store.list(`app`))).find(({value:e})=>e.agent===t.id&&e.agentsRepo===t.repo)?.value;return((i&&e.integrations[i.integration])??Object.values(e.integrations).find(e=>e.repos))?.repos?.url(t.repo,t.path,i?.branch??n?.commit)}async function Mi(e,t,n){return C()[t]&&await wr(e,n),Er(e.store,t)}async function Q(e,t){let n=(e.now??Date.now)();(!t||C()[t])&&await wr(e,n);let r=e.local?await Cr(e.store,e.local.cwd,e.integrations,t).catch(()=>void 0):void 0;return{now:n,local:r,loadCurrent:()=>r?Promise.resolve(r.find(({record:e})=>e.id===t)??{}):Mi(e,t,n)}}async function Ni(e,t,{after:n,q:r,source:i,platform:a,limit:o}){return t?(t??[]).filter(({version:e})=>!a||!!e?.definition?.integrations?.[a]).map(({record:e})=>e).filter(e=>(!n||e.id>n)&&(!i||e.source===i)&&(!r||[e.id,e.name,e.description,e.repo].some(e=>e?.toLowerCase().includes(r)))).sort((e,t)=>e.id.localeCompare(t.id)).slice(0,o):(await e.store.listAgentSummaries({after:n,q:r,source:i,platform:a,limit:o})).map(({record:e})=>e)}async function Pi(e,t,n,r){let i=r.searchParams.get(`fields`);if(i&&![`id`,`id,name`].includes(i))return D({error:`Invalid fields`},400);let{local:a}=await Q(t);if(!a&&k(r)&&!i)return D(await zi(t,r));let o=O(r,200);if(i){let e=await Ni(t,a,{after:ae(r),q:r.searchParams.get(`q`)?.trim().toLowerCase(),source:Ri[r.searchParams.get(`type`)??``],platform:r.searchParams.get(`platform`)??void 0,limit:o+ +!!k(r)}),n=e=>i===`id`?{id:e.id}:{id:e.id,name:e.name},s=de(e,o,e=>e.id);return D(k(r)?{...s,items:s.items.map(n)}:e.map(n))}let s=a??await t.store.listAgentSummaries({limit:o});if(k(r))return D(await zi(t,r,s));let c,l=b();return D(await Promise.all(s.slice(0,o).map(async({record:e,version:n})=>{e.source===`repo`&&e.repo&&(c??=t.store.list(`app`));let r=await ji(t,e,n,c);return{...e,problems:Sr(e,n,t.integrations),...e.id===l?{default:!0}:{},definition:n?.definition,...r?{sourceUrl:r}:{}}})))}async function Fi(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),c=O(r,10,50),l=ae(r),[u,d]=await Promise.all([o?s().then(e=>e.record):q(t.store,i),o?Promise.resolve(o.flatMap(({version:e})=>e?[{value:e}]:[])):t.store.listVersions(i,c+1,l)]);return u?D(await Bi(t,u,c,l??u.currentVersion+1,d)):D({error:`No agent named "${i}"`},404)}async function Ii(e,t,n,r){let i=n.slug,a=n.version?Number(n.version):void 0;if(n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return ie();let{now:o,local:s,loadCurrent:c}=await Q(t,i),l=s?s.find(({version:e})=>e?.version===a)?.version:await K(t.store,i,a);return l?D(l):D({error:`No version ${a} for agent "${i}"`},404)}async function Li(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),c=r.searchParams.get(`versions`)!==`0`,l=r.searchParams.get(`content`)!==`0`,u=r.searchParams.get(`handles`)===`1`,d=t.session?.user.id,[{record:f,version:p},m,h,g]=await Promise.all([!l&&!o?t.store.listAgentSummaries({slug:i}).then(e=>e[0]??{}):s(),c?o?o.flatMap(({version:e})=>e?[{value:e}]:[]):t.store.listVersions(i):[],u?Ye(t,i):[],u?tn(t.store,i):void 0]);if(!f)return D({error:`No agent named "${i}"`},404);let _=u?await et(t,{engine:f.settings?.engine??p?.definition.engine,model:f.settings?.model??p?.definition.model},d):void 0,v=p?.definition.integrations??{},y=e=>{let t=v[e]?.events;return Array.isArray(t)?t.includes(`mention`):!!(t&&`mention`in t)},b=[],x=Object.keys(t.integrations),S=(e,t)=>x.indexOf(e.value.integration)-x.indexOf(t.value.integration);for(let{value:e}of[...h].sort(S))y(e.integration)&&!b.some(t=>t.integration===e.integration&&t.name.toLowerCase()===e.name.toLowerCase())&&b.push({name:e.name,integration:e.integration,platform:t.integrations[e.integration]?.name??e.integration});let C=m.map(({value:e})=>{let{systemPrompt:t,files:n,...r}=e;return r}),w=await ji(t,f,p);return D({...f,problems:Sr(f,p,t.integrations),...p?{definition:p.definition,...l&&`systemPrompt`in p?{systemPrompt:p.systemPrompt,...p.files?{files:p.files}:{}}:{}}:{},...w?{sourceUrl:w}:{},...c?{versions:C}:{},...b.length?{handles:b}:{},...g?.failed?{deliveries:{failed:g.failed,recent:g.recent.map(e=>({at:e.at,platform:t.integrations[e.integration]?.name??e.integration,...e.type?{type:e.type}:{},error:e.error,...e.url?{url:e.url}:{}}))}}:{},..._?{..._.usable?{}:{needsModel:!0}}:{}})}const Ri={builtin:`builtin`,dashboard:`upload`,repository:`repo`};async function zi(e,t,n){let r=O(t,24,100),i=ae(t),a=t.searchParams.get(`q`)?.trim().toLowerCase(),o=Ri[t.searchParams.get(`type`)??``],s=t.searchParams.get(`platform`),c=t.searchParams.get(`connect`)===`1`,l=e.serverOrganizationId,u=e.store.list(`app`),[d,f,p,m]=await Promise.all([u,e.store.list(`installation`),c&&l!==void 0&&l!==e.organizationId&&e.scope?e.scope(l).store.list(`app`):[],n?n.filter(({record:e})=>(!i||e.id>i)&&(!o||e.source===o)&&(!a||[e.id,e.name,e.description,e.repo].some(e=>e?.toLowerCase().includes(a)))):e.store.listAgentSummaries({after:i,source:o,q:a,platform:s??void 0,limit:r+1})]),h=new Set(f.filter(({value:e})=>!e.deletedAt&&!e.uninstalled).map(({value:e})=>e.app)),g=(e,t)=>{let n=d.filter(({value:n})=>n.agent===e&&n.integration===t);return n.length?n.some(({value:e})=>h.has(e.id))?`installed`:`created`:`none`},_=[];for(let{record:e,version:t}of m){let n=Object.keys(t?.definition?.integrations??{}).sort();if(!(s&&!n.includes(s))&&(_.push({record:e,version:t,ids:n}),_.length>r))break}let v=de(_,r,e=>e.record.id),y=b();return{...v,...c?{connectable:[...d,...p].filter(({value:t})=>t.builtin&&e.integrations[t.integration]?.app.builtin===`shared`&&!h.has(t.id)).map(({value:e})=>({id:e.id,integration:e.integration,agent:e.agent}))}:{},items:await Promise.all(v.items.map(async({record:t,version:n,ids:r})=>{let i=await ji(e,t,n,u);return{...t,problems:Sr(t,n,e.integrations),...t.id===y?{default:!0}:{},definition:n?.definition,...i?{sourceUrl:i}:{},platforms:r.map(e=>({id:e,state:g(t.id,e)}))}}))}}async function Bi(e,t,n,r,i){let a=(i??await e.store.listVersions(t.id,n+1,r)).map(({value:e})=>{let{systemPrompt:t,files:n,definition:r,...i}=e;return i}).filter(e=>e.version<r).reverse();return de(a,n,e=>e.version)}var Vi=class{options;entries=new Map;pending=new Map;constructor(e){this.options=e}async get(e,t){let n=this.options.now??Date.now,r=n(),i=this.entries.get(e);if(i&&r-i.at<this.options.ttlMs)return i.value;let a=this.pending.get(e);return a||(a=Promise.resolve().then(t).then(t=>{if(t===void 0)return i?.value;if(this.options.accept&&!this.options.accept(t))return i?.value??t;this.entries.set(e,{value:t,at:n()});let r=this.entries.keys().next().value;return this.entries.size>this.options.max&&r!==void 0&&this.entries.delete(r),t}).catch(t=>(console.error(`coder server: model probe failed for ${e}`,t),i?.value)).finally(()=>this.pending.delete(e)),this.pending.set(e,a)),a}};const Hi=/^[a-z0-9][a-z0-9-]*$/,Ui=new Set([`openrouter.ai`,`ai-gateway.vercel.sh`,`api.groq.com`,`api.together.xyz`]);function Wi(e){return{builtin:{codex:a,claude:n},models:e.models??{}}}async function Gi(e,t){let{baseUrl:n,envKey:r,key:i}=await _t(e);if(!n||!/^https?:\/\//.test(n)||!URL.canParse(n))return D({error:`An http or https base URL is required`},400);let a=!i&&r&&await Ki(t,n,r)?await we(t,r):void 0,o=i||a,s=t.settings??={},c=s.probes??=new Vi({ttlMs:6e5,max:100,now:t.now,accept:e=>e.reachable}),l=`${new URL(n).host}|${r??``}|${E(String(o??``))}`;return D(await c.get(l,()=>re({baseUrl:n},{key:o,fetch:t.fetch})))}async function Ki(e,t,n){let r=new URL(t).host;if(Ui.has(r))return!0;let i=(await Ve(e)).models??{};return Object.values(i).some(e=>`baseUrl`in e&&e.envKey===n&&new URL(e.baseUrl).host===r)}async function qi(e,t,n,r){return D(Wi(await Ve(t)))}async function Ji(e,t,n,r){let{name:a=``,...o}=await _t(e);return!Hi.test(a)||i(a)?D({error:`Invalid model name "${a}"`},400):I(t,e=>{if(e.models?.[a])throw new j(`"${a}" already exists`);e.models={...e.models,[a]:o}})}async function Yi(e,t,n,r){let i=n.name;return I(t,e=>{if(!e.models?.[i])throw new j(`No model "${i}"`);l(e,i)})}async function Xi(e,t,i,s){let c=i.name,{spec:l}=await _t(e);return I(t,e=>{if(!Hi.test(c))throw new j(`Invalid alias name "${c}"`);let t=e.models?.[c];if(t&&o(t))throw new j(`"${c}" is a custom model name`);let i=g(l,h(e));if(!i?.model||i.engine===`custom`)throw new j(`"${l}" does not name a codex or claude model`);let s=i.engine===`claude`?n:a,u=l.split(`:`).some(e=>d.has(e)||r.has(e));e.models={...e.models,[c]:{provider:i.engine,model:s[i.model]??i.model,...u&&i.effort?{effort:i.effort}:{}}}})}async function Zi(e,t,n,r){let i=n.name;return I(t,e=>{let t=e.models??={},n=t[i];n&&(o(n)||s(n))?n.disabled=!0:t[i]={disabled:!0}})}async function Qi(e,t,n,r){let i=n.name;return I(t,e=>{let t=e.models??={},n=t[i];n&&(o(n)||s(n))?delete n.disabled:delete t[i]})}async function $i(e,t){let{now:n,local:r}=await Q(t),[i,a,o]=await Promise.all([Ni(t,r,{limit:200}),Ve(t),t.store.list(`runner`)]),s=b(),c=i.filter(e=>!e.settings?.disabled).sort((e,t)=>Number(t.id===s)-Number(e.id===s)).map(({id:e,name:t})=>({id:e,name:t,...e===s?{default:!0}:{}})),l=Ne(t,a),u=Object.values(t.integrations).find(e=>e.repos);return D({agents:c,...l.chain?.[0]?{engine:l.chain[0]}:{},engines:l.engines??{},models:Wi(a),runners:Ht(t,o,n).map(({id:e,name:t,default:n})=>({id:e,name:t,default:n})),flows:v(_(),`builtin`).map(e=>e.name),...t.local?{folders:At(t.local.cwd)}:{},...u?{connectLabel:u.installLabel??`Connect ${u.id}`}:{}})}async function ea(e,t){let n=(await e.store.list(`installation`)).filter(({value:t})=>!t.deletedAt&&e.integrations[t.integration]?.repos),r=new Map((await ye(e.store,n.map(({value:e})=>e.app))).map(({id:e,value:t})=>[e,t]));for(let{value:i}of n){let n=e.integrations[i.integration];if(i.deletedAt||!n?.repos)continue;let a=r.get(i.app);if(!(!a||a.integration!==n.id))try{let r=await be(e,n,i,G(e.config,a.credentials));if(i.repos?.includes(t)||(await n.repos.list(bt(e,i),r)).includes(t))return{contents:n,token:r,app:a,installation:i}}catch(e){console.error(`coder server: repository access for ${i.id} failed`,e)}}}async function ta(e,t,n){let r=await ea(e,t);if(!r)return D({error:`No installed app can read ${t}`},400);let i=await r.contents.repos.listDir(t,yt,r.token,n).catch(()=>[]),a=await Promise.all(i.map(async i=>{let a=await r.contents.repos.readFile(t,`${yt}/${i}/agent.json`,r.token,n).catch(()=>void 0);if(a===void 0)return;let o={};try{let e=JSON.parse(a);e&&typeof e==`object`&&(o=e)}catch{}let s=Object.entries(o.mcp&&typeof o.mcp==`object`&&!Array.isArray(o.mcp)?o.mcp:{}).flatMap(([e,t])=>p(e,t)),c=await q(e.store,i),l=c?.source===`repo`&&c.repo===t,u=l?await K(e.store,i):void 0;return{id:i,name:typeof o.name==`string`?o.name:i,...s.length?{warnings:s}:{},...typeof o.description==`string`?{description:o.description}:{},...l?{version:c.currentVersion,...u?.source?{commit:u.source.commit}:{}}:{},...c&&!l?{taken:!0}:{}}}));return D({repo:t,agents:a.filter(Boolean)})}async function na(e,t,n,r){let i=r.searchParams.get(`repo`);return i?ta(t,i,r.searchParams.get(`ref`)||`HEAD`):D({error:`repo is required`},400)}async function ra(e,t,n,r){let i=await e.json().catch(()=>void 0),a=i?.agents;if(typeof i?.repo!=`string`||i.ref!==void 0&&typeof i.ref!=`string`||a!==void 0&&!(Array.isArray(a)&&a.every(e=>typeof e==`string`)))return D({error:`repo is required, ref must be a string and agents a list of ids`},400);try{let e=await ea(t,i.repo);if(!e)return D({error:`No installed app can read ${i.repo}`},400);let n=i.ref??`HEAD`,r=a??await e.contents.repos.listDir(i.repo,`.coder/agents`,e.token,n);for(let e of r){let n=await q(t.store,e);if(n&&(n.source!==`repo`||n.repo!==i.repo))return D({error:`Agent id "${e}" is already taken`},409)}let o=await Fe(t.store,e.contents,i.repo,n,e.token,(t.now??Date.now)(),{slugs:r});return await Ue(t,o),D({imported:o.map(e=>e.agent)})}catch(e){return D({error:e instanceof Error?e.message:String(e)},400)}}function ia(e){if(!e||Array.isArray(e)||typeof e!=`object`)return!1;let t=Object.entries(e);if(t.length>100)return!1;let n=0;for(let[e,r]of t){if(typeof r!=`string`||e.startsWith(`/`)||e.includes(`\\`)||e.includes(`\0`)||e.split(`/`).includes(`..`)||e===`agent.json`||e===`system.md`)return!1;n+=Buffer.byteLength(e)+Buffer.byteLength(r)}return n<=262144}async function aa(e,t){return(await St(e,[t])).flatMap(({app:e,error:t,check:n})=>{let r={id:e.id,integration:e.integration,name:e.name};return t?[{...r,error:t}]:n?n.changed?[{...r,drift:!0}]:[]:[{...r,updated:!0}]})}async function oa(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),c=await e.json().catch(()=>void 0);try{let e=S({[i]:c})[i];if(!e||typeof e!=`object`)throw Error(`settings must be an object`);let{disabled:n,...r}=e,a=n?{...r,disabled:n}:r,{record:o,version:l}=await s();if(!o||!l)throw Error(`No agent named "${i}".`);if(vr({...o,settings:void 0},l,r,t.integrations),t.local){let e=x(t.local.cwd,i,!!n);return e?D({error:`Agent "${i}" is ${n?`enabled`:`disabled`} by agents.${i} in ${e}. Change it there.`},409):(await Ot(t,e=>{e.agents={...e.agents,[i]:a}}),await Cr(t.store,t.local.cwd,t.integrations),D(await q(t.store,i)))}return D(await Dr(t.store,i,a,(t.now??Date.now)()))}catch(e){return D({error:e instanceof Error?e.message:String(e)},400)}}async function sa(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),{record:c}=await s();return c?c.source===`builtin`?D({error:`Built-in agents cannot be deleted.`},400):t.local&&!await Tr(t.local.cwd,t.integrations,i)?D({error:`Delete .coder/agents/${i} in the repo`},409):(await t.store.delete(`agent`,i),D({ok:!0})):D({error:`No agent named "${i}"`},404)}async function ca(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),c=await e.json().catch(()=>void 0);if(!c||typeof c.systemPrompt!=`string`||c.files!==void 0&&!ia(c.files)||c.name!==void 0&&typeof c.name!=`string`||c.description!==void 0&&typeof c.description!=`string`)return D({error:`definition and systemPrompt are required; files must contain strings`},400);try{ee([i]);let[e]=w({definitions:{[i]:{json:c.definition,builtin:!1}},usage:void 0},t.integrations);if(!e)throw Error(`No agent named "${i}".`);let n=t.local?await q(t.store,i):void 0,r=t.local&&n?await K(t.store,i):void 0,a=c.files;t.local&&(await br(t.local.cwd,t.integrations,i,{definition:{...c.definition,...c.name===void 0?{}:{name:c.name},...c.description===void 0?{}:{description:c.description}},systemPrompt:c.systemPrompt,...a?{files:a}:{}}),await Cr(t.store,t.local.cwd,t.integrations));let o=t.local?void 0:await yr(t.store,{id:i,name:c.name??e.name,description:c.description??e.definition.description,source:`upload`,definition:e.definition,systemPrompt:c.systemPrompt,files:a,importedFrom:`upload`},(t.now??Date.now)()),s=o?.version??await K(t.store,i),l=o?.unchanged??Fr(r&&{...r,createdAt:0},{...s,createdAt:0}),u=await aa(t,s),d=o?.record??await q(t.store,i);return D({...d,definition:s.definition,version:s.version,unchanged:l,apps:u})}catch(e){return D({error:e instanceof Error?e.message:String(e)},400)}}async function la(e,t,n,r){let i=n.id,a=Number(r.searchParams.get(`after`)??-1),o=Number.isFinite(a)?a:-1;r.searchParams.has(`limit`)&&O(r,500,2e3);let s=await t.store.get(`task`,i);if(!s||t.local&&s.handle?.startsWith(`cli:`)&&s.task.flow==="default"){let n=s?.task.cwd??t.local?.cwd;if(!n||!M(n,i,!1))return D({error:`No task "${i}"`},404);{let r=Number(e.headers.get(`last-event-id`)??o);return _a(e,t,`cli:${n}:${i}`,Number.isFinite(r)?r:o,async e=>{let t=M(n,i);if(t)return{status:t,lines:Xe(n,i,e,500),pendingResult:ua(n,t,!t.result)}})}}let c=Number(e.headers.get(`last-event-id`)??o),l=t.statementTimeout??((e,t)=>t());return _a(e,t,i,Number.isFinite(c)?c:o,e=>l(ha,async()=>{let n=await t.store.get(`task`,i);if(n)return{status:await pt(t,n),lines:await en(t.store,i,e,500)}}))}function ua(e,t,n=!1){if(!Tt.has(t.status)||t.error||t.status===`cancelled`)return!1;let r=c(e,t.task.id),i=Date.parse(r?.resumedAt??r?.createdAt??``)||0;return n||(Ar.statSync(J.join(m(e,t.task.id),`result.json`),{throwIfNoEntry:!1})?.mtimeMs??0)<i}const da=1e3,$=3e4;function fa(e,t,n,r){let i=[...new Set((r.searchParams.get(`tasks`)??``).split(`,`).filter(Boolean))].slice(0,100),a=Date.now(),o=t.taskWatcher??new ma,s=o.tag(t),[c,l]=(e.headers.get(`last-event-id`)??``).split(`-`),u=Number(c),d=u>0&&`-${l}`===s,f=d?Math.min(Math.max(u,a-29e4),a):a,p=u>0&&(!d||u<f)?`event: reset
|
|
2
2
|
data: {}
|
|
3
3
|
|
|
4
4
|
`:``,m=new TextEncoder,h=()=>{},g=new ReadableStream({start(n){n.enqueue(m.encode(`retry: ${da}\nid: ${f}${s}\n\n${p}`)),h=o.watch(t,i,f,e=>n.enqueue(m.encode(e)),()=>n.close(),d);let r=()=>{h();try{n.close()}catch{}};e.signal.aborted?r():e.signal.addEventListener(`abort`,r)},cancel(){h()}});return new Response(g,{headers:{"content-type":`text/event-stream; charset=utf-8`,"cache-control":`no-cache, no-transform`}})}function pa(e,t){let{task:n,approval:r,archivedAt:i,createdAt:a,startedAt:o,finishedAt:s}=e;return{id:n.id,agent:n.agent,status:e.status,approval:r??null,archivedAt:e.autoArchived&&!t?void 0:i,createdAt:a,startedAt:o,finishedAt:s,...xn(e),...t?{result:e.result??null,error:e.error??null,answer:e.answer??null}:{}}}var ma=class{options;watches=new Set;timer;counts=new Map;runners=new Map;reading=!1;closed=!1;last=Date.now();scans=new Map;left=new Map;archived=new Map;reads=0;generation=Pr().slice(0,8);constructor(e={}){this.options=e}watch(e,t,n,r,i,a=!1){if(this.closed)return queueMicrotask(i),()=>{};let o=Date.now();this.watches.size||(this.last=o);let s={ctx:e,ids:new Set(t),sent:new Map,gone:new Set,from:n,fresh:!0,...a?{runners:``}:{},tag:this.tag(e),beat:o,marked:o,until:o+(this.options.lifeMs??29e4),send:r,close:i};return this.watches.add(s),this.timer||(this.timer=setInterval(()=>this.tick(),this.options.pollMs??1e3),this.timer.unref?.()),this.tick(),()=>this.drop(s)}tag(e){return`-${Mr(`sha256`).update(e.organizationId).digest(`hex`).slice(0,8)}${e.queue instanceof Xn?`.${this.generation}`:``}`}runnersChanged(e){this.runners.delete(e)}close(){this.closed=!0;for(let e of[...this.watches]){this.drop(e);try{e.close()}catch{}}}drop(e){this.watches.delete(e)&&([...this.watches].some(t=>t.ctx.organizationId===e.ctx.organizationId)||(this.counts.delete(e.ctx.organizationId),this.runners.delete(e.ctx.organizationId)),this.watches.size||(clearInterval(this.timer),this.timer=void 0,this.counts.clear(),this.runners.clear()))}tick(){let e=Date.now();for(let t of[...this.watches])if(e>=t.until){this.drop(t);try{t.close()}catch{}}else e-t.beat>=(this.options.heartbeatMs??2e4)&&(t.beat=e,this.send(t,`: ping
|
|
@@ -8,5 +8,5 @@ data: {}
|
|
|
8
8
|
`),this.options.heartbeatMs??2e4)];for(let e of s.timers)e.unref?.();return a.watches.add(s),a.reading===void 0&&t<a.head&&(clearTimeout(a.timer),this.read(a)),()=>this.drop(s)}close(){this.closed=!0;for(let e of[...this.feeds.values()])for(let t of[...e.watches])this.end(t)}drop(e){let{feed:t}=e;for(let t of e.timers)clearTimeout(t);!t.watches.delete(e)||t.watches.size||(clearTimeout(t.timer),this.feeds.get(t.key)===t&&this.feeds.delete(t.key))}end(e,t=``){try{t&&e.send(t),e.close()}catch{}this.drop(e)}send(e,t){try{e.send(t)}catch{this.drop(e)}}async read(e){if(e.timer=void 0,this.feeds.get(e.key)!==e||!e.watches.size)return;let t=[...e.watches],n=Math.min(...t.map(e=>e.cursor));e.reading=Date.now(),this.reads++;let r=await e.read(n).catch(e=>(console.error(`coder server: task log read failed`,e),null));if(e.reading=void 0,this.feeds.get(e.key)!==e)return;let i=t.filter(t=>e.watches.has(t)),a=i.length<e.watches.size?0:this.options.pollMs??1e3;if(r===void 0)for(let e of i)this.end(e);else if(r){let{status:t,lines:o,pendingLogs:s,pendingResult:c}=r,l=o.length===500,u=Tt.has(t.status)&&!l&&!s&&!c,d=o.map(e=>[e.seq,`id: ${e.seq}\nevent: log\ndata: ${JSON.stringify(e)}\n\n`]);e.head=Math.max(n,o.at(-1)?.seq??n),l&&(a=0);for(let e of i){let t=d.flatMap(([t,n])=>t>e.cursor?[n]:[]).join(``);!l&&!u&&!e.caught&&(e.caught=!0,t+=`event: caught-up
|
|
9
9
|
data: {}
|
|
10
10
|
|
|
11
|
-
`),e.cursor=Math.max(e.cursor,o.at(-1)?.seq??-1),u?this.end(e,`${t}event: end\ndata: {}\n\n`):t&&this.send(e,t)}}this.feeds.get(e.key)===e&&(e.timer=setTimeout(()=>void this.read(e),a),e.timer.unref?.())}};function _a(e,t,n,r,i){let a=t.logWatcher??new ga,o=new TextEncoder,s=()=>{},c=new ReadableStream({start(c){c.enqueue(o.encode(`retry: ${da}\n\n`)),s=a.watch(`${t.organizationId}:${n}`,r,i,e=>c.enqueue(o.encode(e)),()=>c.close());let l=()=>{s();try{c.close()}catch{}};e.signal.aborted?l():e.signal.addEventListener(`abort`,l)},cancel(){s()}});return new Response(c,{headers:{"content-type":`text/event-stream; charset=utf-8`,"cache-control":`no-cache, no-transform`}})}const va={npm:[`npx`,`-y`],pypi:[`uvx`],oci:[`docker`,`run`,`-i`,`--rm`]},ya=(e=[])=>e.map(({name:e,description:t,isRequired:n,isSecret:r,value:i,default:a})=>({name:e,...t?{description:t}:{},...i??a?{placeholder:i??a}:{},required:n===!0,secret:r===!0}));function ba(e=[],t,n){return e.flatMap((e,r)=>{let i=`${t}:${r}`,a=Object.entries(e.variables??{}),o=e.value??e.default,s=(e,t,r)=>{let[i]=ya([{...r,name:e}]);return n.push({...i,label:t}),`{${e}}`};if(a.length)for(let[e,t]of a)o=o?.replaceAll(`{${e}}`,s(`${i}:${e}`,e,t));else o===void 0&&(e.valueHint||e.isRequired)&&(o=s(i,e.valueHint??e.name??i,e));return[...e.type===`named`&&e.name?[e.name]:[],...o===void 0?[]:[o]]})}function xa(e){let t=e.remotes?.find(e=>e.type===`streamable-http`||e.type===`sse`);if(t)return{type:t.type===`sse`?`sse`:`http`,url:t.url,env:[],headers:ya(t.headers)};let n=e.packages?.find(e=>va[e.registryType]&&(e.transport?.type??`stdio`)===`stdio`);if(!n)return;let[r,...i]=va[n.registryType],a=[],o=ba(n.runtimeArguments,`runtime`,a),s=ba(n.packageArguments,`package`,a);return{type:`stdio`,command:n.runtimeHint??r,args:[...!n.runtimeHint||n.runtimeHint===r?i:[],...o,n.identifier,...s],...a.length?{argumentInputs:a}:{},env:ya(n.environmentVariables),headers:[]}}function Sa(e,t){let[n=``,r]=e.replace(/^v/,``).split(`+`)[0].split(/-(.*)/),[i=``,a]=t.replace(/^v/,``).split(`+`)[0].split(/-(.*)/),o=n.localeCompare(i,`en`,{numeric:!0});if(o)return o;if(r===void 0||a===void 0)return Number(r===void 0)-Number(a===void 0);let s=r.split(`.`),c=a.split(`.`);for(let e=0;e<Math.max(s.length,c.length);e++){let t=s[e],n=c[e];if(t===void 0||n===void 0)return Number(t!==void 0)-Number(n!==void 0);let r=/^\d+$/.test(t),i=/^\d+$/.test(n),a=r===i?t.localeCompare(n,`en`,{numeric:r}):Number(i)-Number(r);if(a)return a}return 0}var Ca=class{sources=[{url:`https://api.mcp.github.com/v0.1/servers`,curated:!0,rows:new Map,ready:!1,failed:!1},{url:`https://registry.modelcontextprotocol.io/v0.1/servers`,curated:!1,rows:new Map,ready:!1,failed:!1}];refreshAt=0;timer;controller;closed=!1;inFlight;response(e,t){if((e.now??Date.now)()>=this.refreshAt&&this.refresh(e),!this.inFlight&&this.sources.some(e=>e.failed)&&!this.sources.some(e=>[...e.rows.values()].some(e=>e.found)))return D({error:`The MCP registry did not answer. Try again.`},502);let n=t.trim().toLowerCase(),r=new Set,i=this.sources.flatMap(e=>[...e.rows].flatMap(([t,{found:i}],a)=>{if(r.has(t)||(r.add(t),!i))return[];let o=[i.name.split(`/`).pop(),i.title].map(e=>e.toLowerCase()),s=!n||o.includes(n)?0:o.some(e=>e.startsWith(n))?1:o.some(e=>e.includes(n))?2:i.description.toLowerCase().includes(n)?3:4;if(s===4)return[];let c=n&&i.verified&&s<3?0:1;return[{found:i,curated:e.curated,order:a,vendor:c,quality:s}]})),a=e=>Number(e===3);return i.sort((e,t)=>a(e.quality)-a(t.quality)||Number(t.curated)-Number(e.curated)||(e.curated?e.order-t.order:e.vendor-t.vendor||e.quality-t.quality||e.found.name.localeCompare(t.found.name))),D(i.slice(0,30).map(({found:e})=>e),200,this.sources.every(e=>e.ready)?{}:{partial:`true`})}refresh(e){if(this.inFlight||this.closed)return;this.timer&&clearTimeout(this.timer);let t=this.controller=new AbortController;this.inFlight=Promise.all(this.sources.map(n=>this.fill(e,n,t.signal))).then(()=>{}).finally(()=>{this.inFlight=void 0,this.refreshAt=(e.now??Date.now)()+36e5,this.closed||(this.timer=setTimeout(()=>this.refresh(e),36e5),this.timer.unref())}),e.waitUntil?.(this.inFlight)}async fill(e,t,n){let r=new Map,i=new Set,a;try{do{let o=new URLSearchParams({limit:`100`});a&&o.set(`cursor`,a);let s=await(e.fetch??fetch)(`${t.url}?${o}`,{headers:{accept:`application/json`},signal:AbortSignal.any([n,AbortSignal.timeout(2e4)])});if(!s.ok)throw Error(`Registry unavailable`);let{servers:c,metadata:l}=await s.json();for(let{server:e,_meta:n}of c){let i=n?.[`io.modelcontextprotocol.registry/official`]?.isLatest===!0,a=e.version??``,o=r.get(e.name);if(o&&(o.latest===i?Sa(o.version,a)>=0:o.latest))continue;let s=xa(e),c=/^[a-z0-9-]+(?:\.[a-z0-9-]+)+\//i.test(e.name)&&!/^io\.github(?:\.|\/)/i.test(e.name);r.set(e.name,{version:a,latest:i,found:s?{name:e.name,title:e._meta?.[`io.modelcontextprotocol.registry/publisher-provided`]?.github?.displayName??e.title??e.name.split(`/`).pop()??e.name,description:e.description??``,...c?{verified:!0}:{},...t.curated?{curated:!0}:{},...s}:void 0})}if(t.ready||(t.rows=new Map(r)),a=l?.nextCursor,a&&i.has(a))throw Error(`Registry cursor repeated`);a&&i.add(a)}while(a);t.rows=r,t.ready=!0,t.failed=!1}catch{t.failed=!0}}close(){this.closed=!0,this.timer&&clearTimeout(this.timer),this.controller?.abort()}};async function wa(e,t,n){let r=t.settings??={};return(r.registry??=new Ca).response(t,n.searchParams.get(`q`)??``)}const Ta=`/api/auth/callback`,Ea=`/.well-known/oauth-client.json`,Da=`/.well-known/oauth-cli-client.json`,Oa=`openid profile email offline_access organizations:read`;function ka(e,t){return{client_id:`${e}${Ea}`,client_name:`Coder at ${new URL(e).host}`,redirect_uris:[`${e}${Ta}`],post_logout_redirect_uris:[`${e}/?signed_out=1`],grant_types:[`authorization_code`,`refresh_token`],response_types:[`code`],token_endpoint_auth_method:`private_key_jwt`,token_endpoint_auth_signing_alg:`ES256`,jwks:t,scope:Oa}}function Aa(e){return{client_id:`${e}${Da}`,client_name:`Coder CLI for ${new URL(e).host}`,redirect_uris:[`http://127.0.0.1/callback`],grant_types:[`authorization_code`,`refresh_token`,`urn:ietf:params:oauth:grant-type:device_code`],response_types:[`code`],token_endpoint_auth_method:`none`,scope:Oa}}function ja(e,t){return{resource:new URL(e).origin,authorization_servers:[t],bearer_methods_supported:[`header`],scopes_supported:Oa.split(` `)}}function Ma(e){let t=D(e);return t.headers.set(`cache-control`,`public, max-age=3600`),t}function Na(e,t,n,r){return Ma(ka(t.config.publicUrl,t.auth.jwks))}function Pa(e,t,n,r){return Ma(Aa(t.config.publicUrl))}function Fa(e,t,n,r){return Ma(ja(t.config.publicUrl,t.auth.issuer))}const Ia=[H(`GET`,`/runner/:file`,fr),H(`GET`,me,Gn),H(`GET`,Ea,Na,tt),H(`GET`,Da,Pa,tt),H(`GET`,`/.well-known/oauth-protected-resource`,Fa,tt),H(`GET`,`/health`,(e,t)=>qr(t)),H(`GET`,`/`,Gt,ot),H(`GET`,`/login`,nn,ht),...L(`/login`,Zt,ht).filter(e=>e.method!==`GET`),H(`POST`,`/dash/token`,Yn,ft),...L(`/dash/:org/operator`,gn,Ge),...L(`/dash`,gn,tr)],La=[H(`GET`,`/api/auth/capabilities`,(e,t)=>D({wular:t.auth?.issuer??null})),...L(`/api/auth`,(e,t)=>t.auth.handler(e),ir),H(`GET`,`/me`,kn,$t)],Ra=[...U(`/tasks`,[H(`GET`,`/:id/messages`,Ct,Te),H(`POST`,`/:id/ack`,Nn,Te),H(`POST`,`/:id/heartbeat`,ze,Te),H(`POST`,`/:id/logs`,rt,Ze),H(`POST`,`/:id/result`,pe,vt),H(`POST`,`/:id/credential`,kt,vt),H(`POST`,`/:id/reply`,Kn,A),H(`POST`,`/:id/react`,Jt,A),H(`GET`,`/:id/history`,Qr,A),H(`GET`,`/:id/history/:conversation`,$r,A),H(`POST`,`/:id/history`,ei,vt),H(`GET`,`/:id`,Et,nr)]),...U(`/logins`,[H(`GET`,`/:id/input`,di,Je),H(`GET`,`/:id`,fi,Je),H(`POST`,`/:id`,pi,Je)]),...U(`/runners`,[H(`POST`,`/register`,Un)])],za=[...U(`/create`,[H(`GET`,`/:id`,wi,F),H(`POST`,`/:id`,Ei,F),H(`GET`,`/:id/callback`,ki,F),H(`POST`,`/:id/callback`,Ai,F)]),...U(`/install`,[H(`GET`,`/:id`,yn,N),H(`POST`,`/:id`,yn,N),H(`GET`,`/:id/callback`,An,N),H(`POST`,`/:id/callback`,An,N)])],Ba=U(`/connect`,[H(`GET`,``,Lt,He),H(`POST`,``,Rn,He),H(`GET`,`/:integration`,sn,Ae),H(`GET`,`/:integration/callback`,Cn,Ae)]),Va=[...U(`/hooks`,[H(`POST`,`/*`,(e,t,n)=>Bt(e,t,n[`*`]),(e,t,n)=>t.integrations[n[`*`]]?t:ie())]),...za,...Ba],Ha=[H(`GET`,`/metrics`,async(e,t)=>D(await Yr(t),200,{"cache-control":`no-store`}),Zn),H(`GET`,`/usage`,lt),H(`GET`,`/usage/totals`,Se)],Ua=U(``,[H(`GET`,`/folders`,(e,t)=>D(At(t.local.cwd))),H(`POST`,`/folders/check`,async(e,t)=>{let n=await e.json().catch(()=>void 0);return D(Dt(n?.path))}),H(`POST`,`/folders/clone`,async(e,t)=>{let n=await e.json().catch(()=>void 0);return D(await wt(n?.url))}),H(`POST`,`/folders/pick`,async(e,t)=>D(await it()))],ge),Wa=U(``,[H(`GET`,`/engines/status`,async(e,t)=>D(await un(t))),H(`POST`,`/engines/:engine/login`,pn),H(`POST`,`/engines/:engine/logout`,ve)],De),Ga=[H(`POST`,`/apps/:id/install`,(e,t,n,r)=>_e(e,t,n.id,r.searchParams.get(`back`),r.searchParams.get(`link`))),H(`POST`,`/apps/create/:integration`,Di),H(`GET`,`/apps`,nt),H(`DELETE`,`/apps/:id`,Ke),H(`GET`,`/apps/:id/drift`,Le),H(`POST`,`/apps/:id/update`,st),H(`GET`,`/installations`,je),H(`GET`,`/connections`,ar,z),H(`POST`,`/connections`,Pt,z),H(`PATCH`,`/connections/:id`,rr,z),H(`DELETE`,`/connections/:id`,er,z),H(`POST`,`/connections/:id/authorize`,rn,z),H(`GET`,`/integrations`,(e,t,n,r)=>Qe(t,r)),H(`GET`,`/repositories`,(e,t)=>ln(t)),H(`POST`,`/repositories/refresh`,(e,t)=>ln(t,!0))],Ka=[H(`GET`,`/agents/import`,na),H(`POST`,`/agents/import`,ra),H(`GET`,`/agents`,Pi),H(`PATCH`,`/agents/:slug/settings`,oa),H(`GET`,`/agents/:slug/versions`,Fi),H(`GET`,`/agents/:slug/versions/:version`,Ii),H(`GET`,`/agents/:slug`,Li),H(`DELETE`,`/agents/:slug`,sa,(e,t)=>or(t,`Only an owner or admin can delete an agent.`)),H(`PUT`,`/agents/:slug`,ca)],qa=[H(`GET`,`/credentials`,ke),H(`POST`,`/credentials`,dt,xe),H(`DELETE`,`/credentials/:name`,mt),H(`POST`,`/logins`,ti,V),H(`GET`,`/logins/:id`,ni,V),H(`POST`,`/logins/:id`,ri,V),H(`DELETE`,`/logins/:id`,ii,V)],Ja=[H(`GET`,`/runners`,Rt),H(`POST`,`/runners`,zn),H(`POST`,`/runners/pair`,On),H(`POST`,`/runners/:id/test`,wn),H(`PATCH`,`/runners/:id`,_n),H(`DELETE`,`/runners/:id`,cn)],Ya=[H(`GET`,`/composer`,$i),H(`GET`,`/tasks`,Sn),H(`POST`,`/tasks`,jt),H(`GET`,`/tasks/:id`,on),H(`DELETE`,`/tasks/:id`,It),H(`GET`,`/tasks/:id/logs`,Vn),H(`GET`,`/tasks/:id/stream`,la),H(`POST`,`/tasks/:id/steer`,En),H(`POST`,`/tasks/:id/ask`,Kt),H(`POST`,`/tasks/:id/approve`,at),H(`POST`,`/tasks/:id/cancel`,Wn),H(`POST`,`/tasks/:id/archive`,he),H(`GET`,`/events`,fa)],Xa=[H(`GET`,`/config`,Fn),H(`PATCH`,`/config`,We)],Za=[H(`POST`,`/models/probe`,(e,t)=>Gi(e,t)),H(`GET`,`/models`,qi),H(`POST`,`/models`,Ji),H(`DELETE`,`/models/:name`,Yi),H(`POST`,`/models/:name/alias`,Xi),H(`POST`,`/models/:name/disable`,Zi),H(`POST`,`/models/:name/enable`,Qi)],Qa=[H(`GET`,`/mcp-registry`,(e,t,n,r)=>wa(e,t,r))],$a=U(`/operator`,[H(`GET`,`/apps`,vi),H(`POST`,`/apps/:integration`,yi),H(`GET`,`/audit`,bi)],Ie),eo=[H(`GET`,`/flows`,hn),H(`GET`,`/pulls`,Jn),H(`POST`,`/flows/:name/run`,Xt),H(`POST`,`/review`,Wt)],to=U(`/admin`,[...Ha,...Ua,...Wa,...Ga,...Ka,...qa,...Ja,...Ya,...Xa,...Za,...Qa,...eo,...$a]).map(e=>({...e,guard:Mt(e.guard)})),no=[H(`GET`,`/connections/oauth/callback`,(e,t,n,r)=>qt(e,t,r),zt),...Ra,...to,...La,...Va,...Ia];async function ro(e,t,n){if(!dn(e,t))return ie();let r=new URL(e.url);return n.scope instanceof Response?n.scope:(t=n.scope??t,await $n(no,e,t,r)??gn(e,t))}const io=`x-coder-request-scope`;function ao(e,{sessions:t,operators:n,cookies:r}){let i=e.auth;return i?{...e,auth:{...i,session(e,n){let a=JSON.stringify([...[`cookie`,`authorization`].map(t=>e.get(t)),!!n]),o=t.get(a);if(!o){let s=new Headers(e);s.delete(`x-coder-organization`),o=i.session(s,n,r),t.set(a,o)}let s=e.get(`x-coder-organization`);return s?o.then(e=>e&&(e.stale?e:Dn(e,s))):o},setOrganization:(e,t)=>i.setOrganization(e,t,r),operator(e){let t=e.get(`cookie`)??``,a=n.get(t);return a||(a=i.operator(e,r),n.set(t,a)),a}}}:e}function oo(e,t,n){let r=t.requestScopes??=new Map,i=e.headers.get(io),a=n&&i?r.get(i):void 0;if(a)return{req:e,ctx:ao(t,a),end(){}};let o=new Headers(e.headers);if(o.delete(io),!t.auth)return{req:i?new Request(e,{headers:o}):e,ctx:t,end(){}};let s=Pr(),c={sessions:new Map,operators:new Map,cookies:[]};return r.set(s,c),o.set(io,s),{req:new Request(e,{headers:o}),ctx:ao(t,c),cookies:c.cookies,end:()=>r.delete(s)}}async function so(e,t,n={}){t.limits??=new $e((t.now??Date.now)()),t.limits.requests++,t.settings??={},t.taskWatcher??=new ma,t.logWatcher??=new ga,t.dashboardHosts??=new Vt;let r=()=>co(e,t,n);return t.dbProfile?t.dbProfile.request(n.inProcess===!0,r):r()}async function co(e,t,n){let r=await oe(e,ue(new URL(e.url).pathname));if(r instanceof Response)return r;let i=oo(r,t,n.inProcess===!0),a=!1;try{let r=n.clientIp??`unknown`,o=await fn(i.req,i.ctx,r),s=lo(o instanceof Response?o:await ro(i.req,i.ctx,o),i.cookies),c=new URL(e.url).pathname.split(`/`),l=c[1]===`tasks`,u=c[1]===`admin`&&c[2]===`tasks`;if(e.method!==`GET`&&s.ok&&![`hooks`,`tasks`,`logins`].includes(c[1])&&!(o instanceof Response)){let e=o.scope instanceof Response?void 0:o.scope??i.ctx;e&&Mn(e,e.organizationId)}return e.method!==`GET`&&s.ok&&!(l&&c.length===4&&c[2]&&[`heartbeat`,`logs`].includes(c[3]))&&!(u&&c.length===5&&c[3]&&[`steer`,`ask`,`approve`,`archive`].includes(c[4]))&&(l||u||c[1]===`admin`&&c[2]===`review`||c[1]===`admin`&&c[2]===`flows`&&c.length===5&&c[3]&&c[4]===`run`)&&Ee(t,u&&c.length===3&&e.method===`POST`),a=!!s.body&&(s.headers.get(`content-type`)??``).includes(`text/html`),a?uo(s,i.end):s}finally{a||i.end()}}function lo(e,t=[]){if(!t.length)return e;let n=new Headers(e.headers);for(let e of t)n.append(`set-cookie`,e);return new Response(e.body,{status:e.status,statusText:e.statusText,headers:n})}function uo(e,t){let n=e.body.getReader(),r=new ReadableStream({async pull(e){try{let{done:r,value:i}=await n.read();r?(t(),e.close()):e.enqueue(i)}catch(n){t(),e.error(n)}},cancel(e){return t(),n.cancel(e)}});return new Response(r,e)}async function fo(e={}){let t=e.env??Y.env,n=lr(t,e.host??`node`),r=e.runner??n.runner;if((e.host===`vercel`||t.VERCEL)&&(r===`local`||r===`local-docker`))throw new y(`invalid-option`,`The ${r} runner cannot run on Vercel.`,{hint:`Leave RUNNER unset to use vercel-sandbox.`});if(n.store===`memory`&&r!==`local`&&r!==`local-docker`)throw new y(`invalid-option`,`The ${r} runner needs a database.`,{hint:`Set DATABASE_URL, or use RUNNER=local for a memory server.`});if(!n.publicUrl)throw new y(`invalid-option`,`PUBLIC_URL is required to start a Coder server.`,{hint:`Set PUBLIC_URL to the address platforms and browsers use.`});let i=[];if(n.store===`memory`&&!e.local&&i.push(`test server, not for production: everything is in memory, nothing survives a restart, no sign-in; set DATABASE_URL for a real deployment`),!t.SERVER_ENCRYPTION_KEY&&!e.local&&i.push(`secrets are stored unencrypted; set SERVER_ENCRYPTION_KEY (openssl rand -base64 32)`),n.store===`postgres`&&!n.encryptionKey)throw new y(`invalid-option`,`SERVER_ENCRYPTION_KEY is required for a Postgres server.`,{hint:`Set SERVER_ENCRYPTION_KEY (openssl rand -base64 32); sign-in keys derive from it.`});let a=te(n.integrations),o=n.store===`memory`&&!n.adminToken?Nr(18).toString(`base64url`):void 0;n.store===`postgres`&&n.adminToken&&i.push(`ADMIN_TOKEN is ignored with Postgres; owners and admins sign in with coder auth login`);let s={...n,...n.store===`postgres`?{adminToken:void 0}:{},...o?{adminToken:o}:{},...e.runner?{runner:e.runner}:{}},c=await sr(s,{local:!!e.local});try{s.store===`memory`&&await xr(c.store(c.defaultOrganizationId),Date.now());let n=c.connection&&s.auth?await(await import(`./auth-C3KrIUf1.js`)).createAuth(c.connection.db,s):void 0,r=e.cwd??Y.cwd(),l=c.store(c.defaultOrganizationId),u=mr({kind:s.runner,workDir:s.workDir,config:s.runnerConfig,local:!(e.host===`vercel`||t.VERCEL),sandbox:{region:pr(s.databaseUrl),snapshots:_r(l)}});if(!u[s.runner])throw await c.close(),new y(`invalid-option`,`Runner ${s.runner} is not configured.`,{hint:`Set RUNNER_CONFIG to JSON containing url and secret.`});let d=new Vt,f=new $e,p=new Ca,m=new Map,h=new Map,g=new ma,_=new ga,v=t=>{let i=m.get(t);if(i)return i;let o=c.store(t),l=new Map,y={registry:p},b={limits:f,...c.connection?{databaseHealth:async()=>{await c.connection.db.execute(Or`select 1`)},statementTimeout:c.connection.statementTimeout}:{},config:s,settings:y,organizationId:t,integrations:a,runners:u,store:o,queue:c.queue,requestScopes:h,taskWatcher:g,logWatcher:_,dashboardHosts:d,dbProfile:c.connection?.profile,chatState:c.chatState,fileReads:l,repositoryLists:new Map,loadAgent:gt(a,{...e.local?{cwd:r}:{},config:s,store:o,fileReads:l,settings:y}),...n?{auth:n}:{},scope:v,webhookTarget:(e,t)=>c.webhookTarget(e,t),appRecord:e=>c.appRecord(e),apps:e=>c.apps(e),installationOrganization:e=>c.installationOrganization(e),installations:e=>c.installations(e),serverOrganizationId:c.defaultOrganizationId,taskOrganization:(e,t)=>c.taskOrganization(e,t),...e.local?{local:e.local}:{}};return m.set(t,b),b};globalThis.__coder={handle:e=>so(e,v(c.defaultOrganizationId),{inProcess:!0})};let b=v(c.defaultOrganizationId);b.local&&un(b).catch(()=>{});let x;return e.local&&(await Re(b),x=setImmediate(()=>{cr(b).catch(()=>void 0)})),{config:s,context:v,defaultContext:b,warnings:i,...o?{mintedToken:o}:{},sweep:c.sweep,close:async()=>{p.close(),g.close(),_.close(),x&&clearImmediate(x),await b.local?.usageSync?.catch(()=>void 0),await qe(b),await c.close()}}}catch(e){throw await c.close(),e}}var po=e({serve:()=>bo,serverHandler:()=>go});const mo=36e5;function ho(e){try{let t=new URL(e);return B.has(t.hostname)?Number(t.port||(t.protocol===`https:`?443:80)):void 0}catch{return}}function go(e=Y.env,t=e.VERCEL?`vercel`:`node`){ur();let n,r,i=()=>n??=fo({env:e,host:t}).catch(e=>{throw n=void 0,e}),a=e=>Promise.all([e.sweep(),Oe(e.defaultContext,!1,!0),Qt(e.defaultContext)]).then(()=>void 0);return Object.assign(async(t,n)=>{let o=await i(),s=n?e=>n(e):e=>void e.catch(()=>{}),c=Date.now();(r===void 0||c-r>=mo)&&(r=c,s(o.defaultContext.store.create(`delivery`,`maintenance:${o.config.publicUrl}`,{at:c},{ttlMs:mo}).then(e=>e?a(o):void 0).catch(e=>console.error(`coder server: maintenance failed`,e))));let l=e=>({...o.context(e),waitUntil:s,scope:l});return so(t,l(o.defaultContext.organizationId),{clientIp:e.VERCEL?t.headers.get(`x-forwarded-for`)?.split(`,`,1)[0]?.trim():void 0})},{scheduled:async()=>{let e=await i();await a(e)},close:async()=>{let e=n;n=void 0,r=void 0,await(await e)?.close()}})}function _o(e){let t=jr(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-t`],{encoding:`utf8`}),n=Number(t.stdout?.split(`
|
|
11
|
+
`),e.cursor=Math.max(e.cursor,o.at(-1)?.seq??-1),u?this.end(e,`${t}event: end\ndata: {}\n\n`):t&&this.send(e,t)}}this.feeds.get(e.key)===e&&(e.timer=setTimeout(()=>void this.read(e),a),e.timer.unref?.())}};function _a(e,t,n,r,i){let a=t.logWatcher??new ga,o=new TextEncoder,s=()=>{},c=new ReadableStream({start(c){c.enqueue(o.encode(`retry: ${da}\n\n`)),s=a.watch(`${t.organizationId}:${n}`,r,i,e=>c.enqueue(o.encode(e)),()=>c.close());let l=()=>{s();try{c.close()}catch{}};e.signal.aborted?l():e.signal.addEventListener(`abort`,l)},cancel(){s()}});return new Response(c,{headers:{"content-type":`text/event-stream; charset=utf-8`,"cache-control":`no-cache, no-transform`}})}const va={npm:[`npx`,`-y`],pypi:[`uvx`],oci:[`docker`,`run`,`-i`,`--rm`]},ya=(e=[])=>e.map(({name:e,description:t,isRequired:n,isSecret:r,value:i,default:a})=>({name:e,...t?{description:t}:{},...i??a?{placeholder:i??a}:{},required:n===!0,secret:r===!0}));function ba(e=[],t,n){return e.flatMap((e,r)=>{let i=`${t}:${r}`,a=Object.entries(e.variables??{}),o=e.value??e.default,s=(e,t,r)=>{let[i]=ya([{...r,name:e}]);return n.push({...i,label:t}),`{${e}}`};if(a.length)for(let[e,t]of a)o=o?.replaceAll(`{${e}}`,s(`${i}:${e}`,e,t));else o===void 0&&(e.valueHint||e.isRequired)&&(o=s(i,e.valueHint??e.name??i,e));return[...e.type===`named`&&e.name?[e.name]:[],...o===void 0?[]:[o]]})}function xa(e){let t=e.remotes?.find(e=>e.type===`streamable-http`||e.type===`sse`);if(t)return{type:t.type===`sse`?`sse`:`http`,url:t.url,env:[],headers:ya(t.headers)};let n=e.packages?.find(e=>va[e.registryType]&&(e.transport?.type??`stdio`)===`stdio`);if(!n)return;let[r,...i]=va[n.registryType],a=[],o=ba(n.runtimeArguments,`runtime`,a),s=ba(n.packageArguments,`package`,a);return{type:`stdio`,command:n.runtimeHint??r,args:[...!n.runtimeHint||n.runtimeHint===r?i:[],...o,n.identifier,...s],...a.length?{argumentInputs:a}:{},env:ya(n.environmentVariables),headers:[]}}function Sa(e,t){let[n=``,r]=e.replace(/^v/,``).split(`+`)[0].split(/-(.*)/),[i=``,a]=t.replace(/^v/,``).split(`+`)[0].split(/-(.*)/),o=n.localeCompare(i,`en`,{numeric:!0});if(o)return o;if(r===void 0||a===void 0)return Number(r===void 0)-Number(a===void 0);let s=r.split(`.`),c=a.split(`.`);for(let e=0;e<Math.max(s.length,c.length);e++){let t=s[e],n=c[e];if(t===void 0||n===void 0)return Number(t!==void 0)-Number(n!==void 0);let r=/^\d+$/.test(t),i=/^\d+$/.test(n),a=r===i?t.localeCompare(n,`en`,{numeric:r}):Number(i)-Number(r);if(a)return a}return 0}var Ca=class{sources=[{url:`https://api.mcp.github.com/v0.1/servers`,curated:!0,rows:new Map,ready:!1,failed:!1},{url:`https://registry.modelcontextprotocol.io/v0.1/servers`,curated:!1,rows:new Map,ready:!1,failed:!1}];refreshAt=0;timer;controller;closed=!1;inFlight;response(e,t){if((e.now??Date.now)()>=this.refreshAt&&this.refresh(e),!this.inFlight&&this.sources.some(e=>e.failed)&&!this.sources.some(e=>[...e.rows.values()].some(e=>e.found)))return D({error:`The MCP registry did not answer. Try again.`},502);let n=t.trim().toLowerCase(),r=new Set,i=this.sources.flatMap(e=>[...e.rows].flatMap(([t,{found:i}],a)=>{if(r.has(t)||(r.add(t),!i))return[];let o=[i.name.split(`/`).pop(),i.title].map(e=>e.toLowerCase()),s=!n||o.includes(n)?0:o.some(e=>e.startsWith(n))?1:o.some(e=>e.includes(n))?2:i.description.toLowerCase().includes(n)?3:4;if(s===4)return[];let c=n&&i.verified&&s<3?0:1;return[{found:i,curated:e.curated,order:a,vendor:c,quality:s}]})),a=e=>Number(e===3);return i.sort((e,t)=>a(e.quality)-a(t.quality)||Number(t.curated)-Number(e.curated)||(e.curated?e.order-t.order:e.vendor-t.vendor||e.quality-t.quality||e.found.name.localeCompare(t.found.name))),D(i.slice(0,30).map(({found:e})=>e),200,this.sources.every(e=>e.ready)?{}:{partial:`true`})}refresh(e){if(this.inFlight||this.closed)return;this.timer&&clearTimeout(this.timer);let t=this.controller=new AbortController;this.inFlight=Promise.all(this.sources.map(n=>this.fill(e,n,t.signal))).then(()=>{}).finally(()=>{this.inFlight=void 0,this.refreshAt=(e.now??Date.now)()+36e5,this.closed||(this.timer=setTimeout(()=>this.refresh(e),36e5),this.timer.unref())}),e.waitUntil?.(this.inFlight)}async fill(e,t,n){let r=new Map,i=new Set,a;try{do{let o=new URLSearchParams({limit:`100`});a&&o.set(`cursor`,a);let s=await(e.fetch??fetch)(`${t.url}?${o}`,{headers:{accept:`application/json`},signal:AbortSignal.any([n,AbortSignal.timeout(2e4)])});if(!s.ok)throw Error(`Registry unavailable`);let{servers:c,metadata:l}=await s.json();for(let{server:e,_meta:n}of c){let i=n?.[`io.modelcontextprotocol.registry/official`]?.isLatest===!0,a=e.version??``,o=r.get(e.name);if(o&&(o.latest===i?Sa(o.version,a)>=0:o.latest))continue;let s=xa(e),c=/^[a-z0-9-]+(?:\.[a-z0-9-]+)+\//i.test(e.name)&&!/^io\.github(?:\.|\/)/i.test(e.name);r.set(e.name,{version:a,latest:i,found:s?{name:e.name,title:e._meta?.[`io.modelcontextprotocol.registry/publisher-provided`]?.github?.displayName??e.title??e.name.split(`/`).pop()??e.name,description:e.description??``,...c?{verified:!0}:{},...t.curated?{curated:!0}:{},...s}:void 0})}if(t.ready||(t.rows=new Map(r)),a=l?.nextCursor,a&&i.has(a))throw Error(`Registry cursor repeated`);a&&i.add(a)}while(a);t.rows=r,t.ready=!0,t.failed=!1}catch{t.failed=!0}}close(){this.closed=!0,this.timer&&clearTimeout(this.timer),this.controller?.abort()}};async function wa(e,t,n){let r=t.settings??={};return(r.registry??=new Ca).response(t,n.searchParams.get(`q`)??``)}const Ta=`/api/auth/callback`,Ea=`/.well-known/oauth-client.json`,Da=`/.well-known/oauth-cli-client.json`,Oa=`openid profile email offline_access organizations:read`;function ka(e,t){return{client_id:`${e}${Ea}`,client_name:`Coder at ${new URL(e).host}`,redirect_uris:[`${e}${Ta}`],post_logout_redirect_uris:[`${e}/?signed_out=1`],grant_types:[`authorization_code`,`refresh_token`],response_types:[`code`],token_endpoint_auth_method:`private_key_jwt`,token_endpoint_auth_signing_alg:`ES256`,jwks:t,scope:Oa}}function Aa(e){return{client_id:`${e}${Da}`,client_name:`Coder CLI for ${new URL(e).host}`,redirect_uris:[`http://127.0.0.1/callback`],grant_types:[`authorization_code`,`refresh_token`,`urn:ietf:params:oauth:grant-type:device_code`],response_types:[`code`],token_endpoint_auth_method:`none`,scope:Oa}}function ja(e,t){return{resource:new URL(e).origin,authorization_servers:[t],bearer_methods_supported:[`header`],scopes_supported:Oa.split(` `)}}function Ma(e){let t=D(e);return t.headers.set(`cache-control`,`public, max-age=3600`),t}function Na(e,t,n,r){return Ma(ka(t.config.publicUrl,t.auth.jwks))}function Pa(e,t,n,r){return Ma(Aa(t.config.publicUrl))}function Fa(e,t,n,r){return Ma(ja(t.config.publicUrl,t.auth.issuer))}const Ia=[H(`GET`,`/runner/:file`,fr),H(`GET`,me,Gn),H(`GET`,Ea,Na,tt),H(`GET`,Da,Pa,tt),H(`GET`,`/.well-known/oauth-protected-resource`,Fa,tt),H(`GET`,`/health`,(e,t)=>qr(t)),H(`GET`,`/`,Gt,ot),H(`GET`,`/login`,nn,ht),...L(`/login`,Zt,ht).filter(e=>e.method!==`GET`),H(`POST`,`/dash/token`,Yn,ft),...L(`/dash/:org/operator`,gn,Ge),...L(`/dash`,gn,tr)],La=[H(`GET`,`/api/auth/capabilities`,(e,t)=>D({wular:t.auth?.issuer??null})),...L(`/api/auth`,(e,t)=>t.auth.handler(e),ir),H(`GET`,`/me`,kn,$t)],Ra=[...U(`/tasks`,[H(`GET`,`/:id/messages`,Ct,Te),H(`POST`,`/:id/ack`,Nn,Te),H(`POST`,`/:id/heartbeat`,ze,Te),H(`POST`,`/:id/logs`,rt,Ze),H(`POST`,`/:id/result`,pe,vt),H(`POST`,`/:id/credential`,kt,vt),H(`POST`,`/:id/reply`,Kn,A),H(`POST`,`/:id/react`,Jt,A),H(`GET`,`/:id/history`,Qr,A),H(`GET`,`/:id/history/:conversation`,$r,A),H(`POST`,`/:id/history`,ei,vt),H(`GET`,`/:id`,Et,nr)]),...U(`/logins`,[H(`GET`,`/:id/input`,di,Je),H(`GET`,`/:id`,fi,Je),H(`POST`,`/:id`,pi,Je)]),...U(`/runners`,[H(`POST`,`/register`,Un)])],za=[...U(`/create`,[H(`GET`,`/:id`,wi,F),H(`POST`,`/:id`,Ei,F),H(`GET`,`/:id/callback`,ki,F),H(`POST`,`/:id/callback`,Ai,F)]),...U(`/install`,[H(`GET`,`/:id`,yn,N),H(`POST`,`/:id`,yn,N),H(`GET`,`/:id/callback`,An,N),H(`POST`,`/:id/callback`,An,N)])],Ba=U(`/connect`,[H(`GET`,``,Lt,He),H(`POST`,``,Rn,He),H(`GET`,`/:integration`,sn,Ae),H(`GET`,`/:integration/callback`,Cn,Ae)]),Va=[...U(`/hooks`,[H(`POST`,`/*`,(e,t,n)=>Bt(e,t,n[`*`]),(e,t,n)=>t.integrations[n[`*`]]?t:ie())]),...za,...Ba],Ha=[H(`GET`,`/metrics`,async(e,t)=>D(await Yr(t),200,{"cache-control":`no-store`}),Zn),H(`GET`,`/usage`,lt),H(`GET`,`/usage/totals`,Se)],Ua=U(``,[H(`GET`,`/folders`,(e,t)=>D(At(t.local.cwd))),H(`POST`,`/folders/check`,async(e,t)=>{let n=await e.json().catch(()=>void 0);return D(Dt(n?.path))}),H(`POST`,`/folders/clone`,async(e,t)=>{let n=await e.json().catch(()=>void 0);return D(await wt(n?.url))}),H(`POST`,`/folders/pick`,async(e,t)=>D(await it()))],ge),Wa=U(``,[H(`GET`,`/engines/status`,async(e,t)=>D(await un(t))),H(`POST`,`/engines/:engine/login`,pn),H(`POST`,`/engines/:engine/logout`,ve)],De),Ga=[H(`POST`,`/apps/:id/install`,(e,t,n,r)=>_e(e,t,n.id,r.searchParams.get(`back`))),H(`POST`,`/apps/create/:integration`,Di),H(`GET`,`/apps`,nt),H(`DELETE`,`/apps/:id`,Ke),H(`GET`,`/apps/:id/drift`,Le),H(`POST`,`/apps/:id/update`,st),H(`GET`,`/installations`,je),H(`GET`,`/connections`,ar,z),H(`POST`,`/connections`,Pt,z),H(`PATCH`,`/connections/:id`,rr,z),H(`DELETE`,`/connections/:id`,er,z),H(`POST`,`/connections/:id/authorize`,rn,z),H(`GET`,`/integrations`,(e,t,n,r)=>Qe(t,r)),H(`GET`,`/repositories`,(e,t)=>ln(t)),H(`POST`,`/repositories/refresh`,(e,t)=>ln(t,!0))],Ka=[H(`GET`,`/agents/import`,na),H(`POST`,`/agents/import`,ra),H(`GET`,`/agents`,Pi),H(`PATCH`,`/agents/:slug/settings`,oa),H(`GET`,`/agents/:slug/versions`,Fi),H(`GET`,`/agents/:slug/versions/:version`,Ii),H(`GET`,`/agents/:slug`,Li),H(`DELETE`,`/agents/:slug`,sa,(e,t)=>or(t,`Only an owner or admin can delete an agent.`)),H(`PUT`,`/agents/:slug`,ca)],qa=[H(`GET`,`/credentials`,ke),H(`POST`,`/credentials`,dt,xe),H(`DELETE`,`/credentials/:name`,mt),H(`POST`,`/logins`,ti,V),H(`GET`,`/logins/:id`,ni,V),H(`POST`,`/logins/:id`,ri,V),H(`DELETE`,`/logins/:id`,ii,V)],Ja=[H(`GET`,`/runners`,Rt),H(`POST`,`/runners`,zn),H(`POST`,`/runners/pair`,On),H(`POST`,`/runners/:id/test`,wn),H(`PATCH`,`/runners/:id`,_n),H(`DELETE`,`/runners/:id`,cn)],Ya=[H(`GET`,`/composer`,$i),H(`GET`,`/tasks`,Sn),H(`POST`,`/tasks`,jt),H(`GET`,`/tasks/:id`,on),H(`DELETE`,`/tasks/:id`,It),H(`GET`,`/tasks/:id/logs`,Vn),H(`GET`,`/tasks/:id/stream`,la),H(`POST`,`/tasks/:id/steer`,En),H(`POST`,`/tasks/:id/ask`,Kt),H(`POST`,`/tasks/:id/approve`,at),H(`POST`,`/tasks/:id/cancel`,Wn),H(`POST`,`/tasks/:id/archive`,he),H(`GET`,`/events`,fa)],Xa=[H(`GET`,`/config`,Fn),H(`PATCH`,`/config`,We)],Za=[H(`POST`,`/models/probe`,(e,t)=>Gi(e,t)),H(`GET`,`/models`,qi),H(`POST`,`/models`,Ji),H(`DELETE`,`/models/:name`,Yi),H(`POST`,`/models/:name/alias`,Xi),H(`POST`,`/models/:name/disable`,Zi),H(`POST`,`/models/:name/enable`,Qi)],Qa=[H(`GET`,`/mcp-registry`,(e,t,n,r)=>wa(e,t,r))],$a=U(`/operator`,[H(`GET`,`/apps`,vi),H(`POST`,`/apps/:integration`,yi),H(`GET`,`/audit`,bi)],Ie),eo=[H(`GET`,`/flows`,hn),H(`GET`,`/pulls`,Jn),H(`POST`,`/flows/:name/run`,Xt),H(`POST`,`/review`,Wt)],to=U(`/admin`,[...Ha,...Ua,...Wa,...Ga,...Ka,...qa,...Ja,...Ya,...Xa,...Za,...Qa,...eo,...$a]).map(e=>({...e,guard:Mt(e.guard)})),no=[H(`GET`,`/connections/oauth/callback`,(e,t,n,r)=>qt(e,t,r),zt),...Ra,...to,...La,...Va,...Ia];async function ro(e,t,n){if(!dn(e,t))return ie();let r=new URL(e.url);return n.scope instanceof Response?n.scope:(t=n.scope??t,await $n(no,e,t,r)??gn(e,t))}const io=`x-coder-request-scope`;function ao(e,{sessions:t,operators:n,cookies:r}){let i=e.auth;return i?{...e,auth:{...i,session(e,n){let a=JSON.stringify([...[`cookie`,`authorization`].map(t=>e.get(t)),!!n]),o=t.get(a);if(!o){let s=new Headers(e);s.delete(`x-coder-organization`),o=i.session(s,n,r),t.set(a,o)}let s=e.get(`x-coder-organization`);return s?o.then(e=>e&&(e.stale?e:Dn(e,s))):o},setOrganization:(e,t)=>i.setOrganization(e,t,r),operator(e){let t=e.get(`cookie`)??``,a=n.get(t);return a||(a=i.operator(e,r),n.set(t,a)),a}}}:e}function oo(e,t,n){let r=t.requestScopes??=new Map,i=e.headers.get(io),a=n&&i?r.get(i):void 0;if(a)return{req:e,ctx:ao(t,a),end(){}};let o=new Headers(e.headers);if(o.delete(io),!t.auth)return{req:i?new Request(e,{headers:o}):e,ctx:t,end(){}};let s=Pr(),c={sessions:new Map,operators:new Map,cookies:[]};return r.set(s,c),o.set(io,s),{req:new Request(e,{headers:o}),ctx:ao(t,c),cookies:c.cookies,end:()=>r.delete(s)}}async function so(e,t,n={}){t.limits??=new $e((t.now??Date.now)()),t.limits.requests++,t.settings??={},t.taskWatcher??=new ma,t.logWatcher??=new ga,t.dashboardHosts??=new Vt;let r=()=>co(e,t,n);return t.dbProfile?t.dbProfile.request(n.inProcess===!0,r):r()}async function co(e,t,n){let r=await oe(e,ue(new URL(e.url).pathname));if(r instanceof Response)return r;let i=oo(r,t,n.inProcess===!0),a=!1;try{let r=n.clientIp??`unknown`,o=await fn(i.req,i.ctx,r),s=lo(o instanceof Response?o:await ro(i.req,i.ctx,o),i.cookies),c=new URL(e.url).pathname.split(`/`),l=c[1]===`tasks`,u=c[1]===`admin`&&c[2]===`tasks`;if(e.method!==`GET`&&s.ok&&![`hooks`,`tasks`,`logins`].includes(c[1])&&!(o instanceof Response)){let e=o.scope instanceof Response?void 0:o.scope??i.ctx;e&&Mn(e,e.organizationId)}return e.method!==`GET`&&s.ok&&!(l&&c.length===4&&c[2]&&[`heartbeat`,`logs`].includes(c[3]))&&!(u&&c.length===5&&c[3]&&[`steer`,`ask`,`approve`,`archive`].includes(c[4]))&&(l||u||c[1]===`admin`&&c[2]===`review`||c[1]===`admin`&&c[2]===`flows`&&c.length===5&&c[3]&&c[4]===`run`)&&Ee(t,u&&c.length===3&&e.method===`POST`),a=!!s.body&&(s.headers.get(`content-type`)??``).includes(`text/html`),a?uo(s,i.end):s}finally{a||i.end()}}function lo(e,t=[]){if(!t.length)return e;let n=new Headers(e.headers);for(let e of t)n.append(`set-cookie`,e);return new Response(e.body,{status:e.status,statusText:e.statusText,headers:n})}function uo(e,t){let n=e.body.getReader(),r=new ReadableStream({async pull(e){try{let{done:r,value:i}=await n.read();r?(t(),e.close()):e.enqueue(i)}catch(n){t(),e.error(n)}},cancel(e){return t(),n.cancel(e)}});return new Response(r,e)}async function fo(e={}){let t=e.env??Y.env,n=lr(t,e.host??`node`),r=e.runner??n.runner;if((e.host===`vercel`||t.VERCEL)&&(r===`local`||r===`local-docker`))throw new y(`invalid-option`,`The ${r} runner cannot run on Vercel.`,{hint:`Leave RUNNER unset to use vercel-sandbox.`});if(n.store===`memory`&&r!==`local`&&r!==`local-docker`)throw new y(`invalid-option`,`The ${r} runner needs a database.`,{hint:`Set DATABASE_URL, or use RUNNER=local for a memory server.`});if(!n.publicUrl)throw new y(`invalid-option`,`PUBLIC_URL is required to start a Coder server.`,{hint:`Set PUBLIC_URL to the address platforms and browsers use.`});let i=[];if(n.store===`memory`&&!e.local&&i.push(`test server, not for production: everything is in memory, nothing survives a restart, no sign-in; set DATABASE_URL for a real deployment`),!t.SERVER_ENCRYPTION_KEY&&!e.local&&i.push(`secrets are stored unencrypted; set SERVER_ENCRYPTION_KEY (openssl rand -base64 32)`),n.store===`postgres`&&!n.encryptionKey)throw new y(`invalid-option`,`SERVER_ENCRYPTION_KEY is required for a Postgres server.`,{hint:`Set SERVER_ENCRYPTION_KEY (openssl rand -base64 32); sign-in keys derive from it.`});let a=te(n.integrations),o=n.store===`memory`&&!n.adminToken?Nr(18).toString(`base64url`):void 0;n.store===`postgres`&&n.adminToken&&i.push(`ADMIN_TOKEN is ignored with Postgres; owners and admins sign in with coder auth login`);let s={...n,...n.store===`postgres`?{adminToken:void 0}:{},...o?{adminToken:o}:{},...e.runner?{runner:e.runner}:{}},c=await sr(s,{local:!!e.local});try{s.store===`memory`&&await xr(c.store(c.defaultOrganizationId),Date.now());let n=c.connection&&s.auth?await(await import(`./auth-BSMPjhnz.js`)).createAuth(c.connection.db,s):void 0,r=e.cwd??Y.cwd(),l=c.store(c.defaultOrganizationId),u=mr({kind:s.runner,workDir:s.workDir,config:s.runnerConfig,local:!(e.host===`vercel`||t.VERCEL),sandbox:{region:pr(s.databaseUrl),snapshots:_r(l)}});if(!u[s.runner])throw await c.close(),new y(`invalid-option`,`Runner ${s.runner} is not configured.`,{hint:`Set RUNNER_CONFIG to JSON containing url and secret.`});let d=new Vt,f=new $e,p=new Ca,m=new Map,h=new Map,g=new ma,_=new ga,v=t=>{let i=m.get(t);if(i)return i;let o=c.store(t),l=new Map,y={registry:p},b={limits:f,...c.connection?{databaseHealth:async()=>{await c.connection.db.execute(Or`select 1`)},statementTimeout:c.connection.statementTimeout}:{},config:s,settings:y,organizationId:t,integrations:a,runners:u,store:o,queue:c.queue,requestScopes:h,taskWatcher:g,logWatcher:_,dashboardHosts:d,dbProfile:c.connection?.profile,chatState:c.chatState,fileReads:l,repositoryLists:new Map,loadAgent:gt(a,{...e.local?{cwd:r}:{},config:s,store:o,fileReads:l,settings:y}),...n?{auth:n}:{},scope:v,webhookTarget:(e,t)=>c.webhookTarget(e,t),appRecord:e=>c.appRecord(e),apps:e=>c.apps(e),installationOrganization:e=>c.installationOrganization(e),installations:e=>c.installations(e),serverOrganizationId:c.defaultOrganizationId,taskOrganization:(e,t)=>c.taskOrganization(e,t),...e.local?{local:e.local}:{}};return m.set(t,b),b};globalThis.__coder={handle:e=>so(e,v(c.defaultOrganizationId),{inProcess:!0})};let b=v(c.defaultOrganizationId);b.local&&un(b).catch(()=>{});let x;return e.local&&(await Re(b),x=setImmediate(()=>{cr(b).catch(()=>void 0)})),{config:s,context:v,defaultContext:b,warnings:i,...o?{mintedToken:o}:{},sweep:c.sweep,close:async()=>{p.close(),g.close(),_.close(),x&&clearImmediate(x),await b.local?.usageSync?.catch(()=>void 0),await qe(b),await c.close()}}}catch(e){throw await c.close(),e}}var po=e({serve:()=>bo,serverHandler:()=>go});const mo=36e5;function ho(e){try{let t=new URL(e);return B.has(t.hostname)?Number(t.port||(t.protocol===`https:`?443:80)):void 0}catch{return}}function go(e=Y.env,t=e.VERCEL?`vercel`:`node`){ur();let n,r,i=()=>n??=fo({env:e,host:t}).catch(e=>{throw n=void 0,e}),a=e=>Promise.all([e.sweep(),Oe(e.defaultContext,!1,!0),Qt(e.defaultContext)]).then(()=>void 0);return Object.assign(async(t,n)=>{let o=await i(),s=n?e=>n(e):e=>void e.catch(()=>{}),c=Date.now();(r===void 0||c-r>=mo)&&(r=c,s(o.defaultContext.store.create(`delivery`,`maintenance:${o.config.publicUrl}`,{at:c},{ttlMs:mo}).then(e=>e?a(o):void 0).catch(e=>console.error(`coder server: maintenance failed`,e))));let l=e=>({...o.context(e),waitUntil:s,scope:l});return so(t,l(o.defaultContext.organizationId),{clientIp:e.VERCEL?t.headers.get(`x-forwarded-for`)?.split(`,`,1)[0]?.trim():void 0})},{scheduled:async()=>{let e=await i();await a(e)},close:async()=>{let e=n;n=void 0,r=void 0,await(await e)?.close()}})}function _o(e){let t=jr(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-t`],{encoding:`utf8`}),n=Number(t.stdout?.split(`
|
|
12
12
|
`)[0]);if(n)return{pid:n,command:jr(`ps`,[`-o`,`command=`,`-p`,String(n)],{encoding:`utf8`}).stdout?.trim().slice(0,120)||`another process`}}function vo(e){let t=_o(e),n=t&&/\bcoder (dash|server serve)\b/.test(t.command);return new y(`server`,t?n?`Coder is already running on port ${e} (pid ${t.pid}): http://localhost:${e}`:`Port ${e} is in use by ${t.command} (pid ${t.pid}).`:`Port ${e} is in use.`,{hint:t?`Stop it with \`kill ${t.pid}\`, or use another port: --port ${e+1}`:`Use another port: --port ${e+1}`})}async function yo(e={}){ur();let t=e.env??Y.env;if(e.runner&&!gr.includes(e.runner))throw new y(`invalid-option`,`Invalid --runner value: use ${gr.join(`, `)}`);if(e.port!==void 0&&(!Number.isInteger(e.port)||e.port<1||e.port>65535))throw new y(`invalid-option`,`Invalid port: use 1 through 65535.`);let n=t.PORT&&/^\d+$/.test(t.PORT)?Number(t.PORT):void 0,r=ho(t.PUBLIC_URL),i=e.port??n??r??8787;if(!Number.isInteger(i)||i<1||i>65535)throw new y(`invalid-option`,`Invalid PORT: use 1 through 65535.`);let a=t.PUBLIC_URL?t:{...t,PUBLIC_URL:`http://localhost:${i}`},o=!!(t.DATABASE_URL||t.POSTGRES_URL);if(o&&e.memory)throw new y(`invalid-option`,`A memory server cannot use DATABASE_URL.`,{hint:`Unset DATABASE_URL, or drop --memory.`});let s=(e.host??t.HOST??(o?void 0:`127.0.0.1`))?.replace(/^\[(.*)\]$/,`$1`),c=!o&&!e.memory;if(c&&!B.has(s))throw new y(`invalid-option`,`A local server listens on loopback only.`,{hint:`Reach it through a tunnel or a proxy on this machine; set DATABASE_URL for a deployment, or use --memory for a test server.`});if(e.memory&&t.VERCEL)throw new y(`invalid-option`,`A memory server cannot run on Vercel.`,{hint:`Set DATABASE_URL for a real deployment.`});let l,u,d=c?new Promise((e,t)=>{u=t,l=()=>{Gr().then(e,t)}}):void 0,f=d?.then(()=>void 0).catch(()=>void 0),p=c?{cwd:e.cwd??Y.cwd(),port:i,cacheMaintenance:f}:void 0,m=await fo({cwd:e.cwd,env:a,runner:e.runner,...p?{local:p}:{}}),h=m.defaultContext,g=()=>{m.sweep().catch(e=>console.error(`coder server: sweep failed`,e))};g();let _=setInterval(g,mo);_.unref();let v=setInterval(()=>{Oe(h,!1,!0).catch(e=>console.error(`coder server: scheduled kick failed`,e)),Qt(h).catch(e=>console.error(`coder server: inbox flush failed`,e))},6e4);v.unref();let b=Lr.createServer(le((e,t)=>so(e,h,{clientIp:t}),{admit:e=>o||xt(e.socket.remoteAddress,e.url??`/`)})),x=m.config.publicUrl;r!==void 0&&r!==i&&m.warnings.push(`PUBLIC_URL points at port ${r} but the server listens on ${i}`),await new Promise((e,t)=>{b.once(`error`,t),b.listen(i,s,e)}).catch(async e=>{throw u?.(e),clearInterval(v),clearInterval(_),await m.close(),e.code===`EADDRINUSE`?vo(i):e}),l?.();let S=!1,C=async()=>{S||(S=!0,clearInterval(v),clearInterval(_),h.taskWatcher?.close(),h.logWatcher?.close(),await new Promise((e,t)=>b.close(n=>n?t(n):e())),await f,await m.close())},w=h.auth?`Wular Auth (${h.auth.issuer})`:void 0,ee=`http://localhost:${i}`,T=Pe(h),E=T===`local`?ee:x,te=m.config.store===`memory`?m.mintedToken??t.ADMIN_TOKEN:void 0;return{address:ee,publicUrl:x,warnings:m.warnings,close:C,runner:m.config.runner,store:m.config.store,mode:T,...d?{cacheMigration:d}:{},maxTasks:m.config.maxTasks??m.config.limits?.concurrentTasks??10,...w?{signIn:w}:{},...m.mintedToken?{mintedToken:m.mintedToken}:{},...m.config.store===`postgres`&&t.DATABASE_URL?{database:kr(t.DATABASE_URL)}:{},...B.has(new URL(E).hostname)?{dashboard:`${E}/dash${te?`#token=${encodeURIComponent(te)}`:``}`}:{}}}async function bo(e={}){try{return await yo(e)}catch(e){if(e instanceof y)throw e;let t=e instanceof Error&&e.cause instanceof Error?`: ${e.cause.message}`:``;throw new y(`server`,`${e instanceof Error?e.message:String(e)}${t}`)}}export{Oa as a,Ta as i,po as n,Ea as o,go as r,bo as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{qi as e}from"./core-DwsAMCnL.js";import{At as t}from"./prompts-
|
|
1
|
+
import{qi as e}from"./core-DwsAMCnL.js";import{At as t}from"./prompts-Bj4Fbd_n.js";import{U as n}from"./dispatch-CFZ9Crvg.js";import{a as r,t as i}from"./remote-D3JZ4MMQ.js";import{p as a}from"./slack-DhPhLuWb.js";import{h as o,o as s,s as c,t as l}from"./http-CDZKt5ln.js";import u from"node:path";import d from"node:fs";import{createHmac as f,randomBytes as p}from"node:crypto";import m from"node:os";import h from"node:http";var g=e({runnerController:()=>w,serveRunner:()=>x});const _=()=>t(`runners.json`);function v(){try{return JSON.parse(d.readFileSync(_(),`utf8`))}catch{return{}}}function y(e){d.mkdirSync(u.dirname(_()),{recursive:!0}),d.writeFileSync(_(),JSON.stringify(e,null,2),{mode:384})}const b=e=>[`cloudflared tunnel --url http://localhost:${e}`,`ngrok http ${e}`,`tailscale funnel ${e}`,`VS Code: forward port ${e} in the Ports view and set its visibility to Public`];async function x(e={}){let a=e.port??4100,u=e.token?e.runnerUrl??process.env.CODER_RUNNER_URL:e.url;if(!u)throw new n(`invalid-option`,e.token?`Expose this runner and set CODER_RUNNER_URL or --runner-url to its public HTTPS address.`:`Expose this runner with a tunnel, then pass its public URL with --url.`,{hint:b(a)});let d=e.token?r({...e,server:e.url??e.server,yes:!0}):r(e),f=v(),g=f[d]??{secret:p(32).toString(`base64url`)},_=new o(t(`runner`)),x=w({secret:g.secret,server:d,runner:_}),S=h.createServer(c(async e=>{let t=await s(e,l(new URL(e.url).pathname));return t instanceof Response?t:x(t)}));await new Promise((e,t)=>{S.once(`error`,t),S.listen(a,`127.0.0.1`,e)});let C=()=>new Promise(e=>S.close(()=>e())),T=e.name??m.hostname(),E=async(e,t)=>{let r=await fetch(`${d}/runners/register`,{method:`POST`,redirect:`manual`,signal:AbortSignal.timeout(5e3),headers:{"content-type":`application/json`},body:JSON.stringify({...e?{token:e}:{id:g.id,organizationId:g.organizationId},name:T,url:u,secret:g.secret,...t?{offline:t}:{}})});if(!r.ok)throw new n(`server`,`Runner registration failed`,{status:r.status});return r.json()},D;try{if(e.token){let t=await E(e.token);D=t,g.organizationId=t.organizationId}else{let t=g.id&&g.organizationId?await E().catch(e=>{if(!(e instanceof n&&e.status===401))throw e}):void 0;if(t)D=t;else{let t=i(e),n=await t.me();D=await t.runners.add({kind:`http`,name:T,scope:e.workspace||!n.user?`workspace`:`personal`,config:{url:u,secret:g.secret}}),g.organizationId=n.organization?.id,g.id=D.id,D=await E()}}g.id=D.id,y({...f,[d]:g})}catch(e){throw await C(),e}let O=Promise.resolve(),k=setInterval(()=>{O=O.then(()=>E().then(()=>{})).catch(()=>{})},6e4);return{...D,port:a,server:d,close:async()=>{clearInterval(k),await O,await E(void 0,!0).catch(()=>{}),await C()}}}const S=3e5,C=(e,t=200)=>new Response(JSON.stringify(e),{status:t,headers:{"content-type":`application/json`}});function w(e){let t=e.now??Date.now,n=new Map,r=(r,i)=>{let o=r.headers.get(`x-coder-timestamp`)??``,s=r.headers.get(`x-coder-nonce`)??``,c=r.headers.get(`x-coder-signature`)??``,l=Number(o);if(!s||!Number.isFinite(l)||Math.abs(t()-l)>S)return!1;let u=f(`sha256`,e.secret).update(`${i}.${o}.${s}`).digest(`base64url`);if(!a(c,u))return!1;for(let[e,r]of n)r<t()&&n.delete(e);return!n.has(s)&&(n.set(s,l+S),!0)};return async t=>{let n=t.method===`GET`?``:await t.text();if(!r(t,n))return C({error:`Unauthorized`},401);let[,i,a]=new URL(t.url).pathname.split(`/`).map(decodeURIComponent);try{if(t.method===`POST`&&i===`start`&&!a){let t=JSON.parse(n);if(typeof t.task!=`string`||!t.env)return C({error:`Invalid start`},400);let r=t.env.CODER_TASK_TOKEN;if(typeof r!=`string`)return C({error:`Invalid start`},400);let i={CODER_SERVER:e.server,CODER_TASK_TOKEN:r,CODER_INBOX_MODE:e.runner.push?`push`:`poll`,...t.env.CODER_LOGIN===`claude`||t.env.CODER_LOGIN===`codex`?{CODER_LOGIN:t.env.CODER_LOGIN}:{}};return C({handle:await e.runner.start({id:t.task},i)})}if(t.method===`GET`&&i===`health`&&!a)return C({ok:!0});if(!a)return C({error:`Not found`},404);if(t.method===`POST`&&i===`messages`&&e.runner.push){let{entries:t}=JSON.parse(n);return!Array.isArray(t)||!t.length?C({error:`Invalid messages`},400):C(await e.runner.push(a,t))}return t.method===`GET`&&i===`status`?C(await e.runner.status(a)):t.method===`POST`&&i===`stop`?(await e.runner.stop(a),new Response(null,{status:204})):C({error:`Not found`},404)}catch(e){return C({error:e instanceof Error?e.message:String(e)},400)}}}export{g as n,x as t};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Zt as e}from"./core-DwsAMCnL.js";import{At as t,
|
|
2
|
-
`);for(let t of e.warnings)p.stdout.write(` ${n.yellow(`!`)} ${t}\n`);if(e.cacheMigration?.then(e=>{(e.tasks||e.flows||e.files)&&p.stdout.write(`\n moved ${e.tasks.toLocaleString(`en-US`)} archived tasks to ${e.cache}\n`)}).catch(e=>p.stderr.write(`\n Cache migration failed: ${e instanceof Error?e.message:String(e)}\n`)),e.mode===`memory`&&p.stdout.write(`\n${l([`the CLI reaches this server with its token in ADMIN_TOKEN: coder task list --server ${e.publicUrl}`],n)}\n`),e.dashboard){let t=p.stdout.isTTY&&o(e.dashboard);p.stdout.write(t?`\nOpening the dashboard in your browser. If it doesn't open, go to:\n ${e.dashboard}\n`:`\n ${n.light(`dashboard`)} ${e.dashboard}\n`)}}const h=s({name:`server serve`,help:{usage:`coder server serve [--port <n>] [--host <address>] [--memory] [--runner <name>] [--json] [--cwd <dir>]`,summary:`Run the Coder server on Bun: the address platforms deliver events to, the dashboard, and the worker that runs tasks. With DATABASE_URL it is a full server with sign-in and workspaces. Without one it is the dashboard for this machine's CLI: its config, agents, tasks and engine logins, on loopback only. --memory makes a throwaway test server that keeps everything in memory. Configured through the environment; every variable is in coder docs self-host.`,flags:[[`--port <n>`,`listen port (default: PORT, else the port in a localhost PUBLIC_URL, else 8787)`],[`--host <address>`,`listen address (default: HOST, else 127.0.0.1 without a database, else every interface)`],[`--memory`,`a throwaway test server: everything in memory, no sign-in, admin token only`],[`--runner <name>`,`local, local-docker, vercel-sandbox, github-actions, or http`]],env:[[`PUBLIC_URL`,`the address platforms and browsers reach the server at (default http://localhost:<port>)`],[`PORT`,`listen port, as hosts set it (default 8787)`],[`HOST`,`listen address, as --host`],[`DATABASE_URL`,`Postgres, set up with drizzle-kit push; turns on sign-in and workspaces`],[`AUTH_WULAR_URL`,`the Wular Auth issuer people sign in with (default https://auth.wular.ai)`],[`SERVER_ENCRYPTION_KEY`,`encrypts stored secrets and derives the sign-in keys; required with DATABASE_URL (openssl rand -base64 32)`],[`RUNNER`,`where tasks run: local (default), local-docker, vercel-sandbox, github-actions, http`],[`MAX_TASKS, TASK_TIMEOUT, TASK_STALL, TASK_ATTEMPTS`,`runner capacity and lifecycle limits`],[`ADMIN_TOKEN`,`local and memory servers: the dashboard and CLI key; minted and shown when unset`],[`CODER_CACHE_HOME`,`archived tasks, flows and usage (default OS cache directory/wular-coder)`],[`WORK_DIR`,`where tasks check out repositories`],[`SERVER_NAME`,`what the dashboard calls this server (default Coder)`]],examples:[[`PUBLIC_URL=https://abc.ngrok.app coder server serve`,`receive GitHub and Slack events through a tunnel; the tunnel serves only their webhooks and callbacks`],[`PUBLIC_URL=https://agents.example.com DATABASE_URL=postgres://... coder server serve`,`on your own host, backed by Postgres`]]},options:{...f,port:n(
|
|
1
|
+
import{Zt as e}from"./core-DwsAMCnL.js";import{At as t,mr as n,wr as r,yr as i}from"./prompts-Bj4Fbd_n.js";import{U as a}from"./dispatch-CFZ9Crvg.js";import{i as o}from"./prompt-PEgcMJO7.js";import{i as s}from"./cli-BBlH53hA.js";import{p as c,s as l}from"./output-BKeyLbvt.js";import{c as u,n as d,t as f}from"./args-CURX44CA.js";import p from"node:process";function m(e){let n=c,r=[...e.publicUrl===e.address?[]:[[`public`,e.publicUrl]],[`store`,e.database??(e.mode===`local`?t():e.store)],[`runner`,e.runner],...e.signIn?[[`sign-in`,e.signIn]]:[],...e.mintedToken?[[`token`,e.mintedToken]]:[]],i=Math.max(...r.map(([e])=>e.length))+2;p.stdout.write(`${n.bold({local:`Coder local server`,memory:`Coder test server`,cloud:`Coder server`}[e.mode])} ${n.dim(`listening on ${e.address}`)}\n`);for(let[e,t]of r)p.stdout.write(` ${n.light(e.padEnd(i))}${t}\n`);e.warnings.length&&p.stdout.write(`
|
|
2
|
+
`);for(let t of e.warnings)p.stdout.write(` ${n.yellow(`!`)} ${t}\n`);if(e.cacheMigration?.then(e=>{(e.tasks||e.flows||e.files)&&p.stdout.write(`\n moved ${e.tasks.toLocaleString(`en-US`)} archived tasks to ${e.cache}\n`)}).catch(e=>p.stderr.write(`\n Cache migration failed: ${e instanceof Error?e.message:String(e)}\n`)),e.mode===`memory`&&p.stdout.write(`\n${l([`the CLI reaches this server with its token in ADMIN_TOKEN: coder task list --server ${e.publicUrl}`],n)}\n`),e.dashboard){let t=p.stdout.isTTY&&o(e.dashboard);p.stdout.write(t?`\nOpening the dashboard in your browser. If it doesn't open, go to:\n ${e.dashboard}\n`:`\n ${n.light(`dashboard`)} ${e.dashboard}\n`)}}const h=s({name:`server serve`,help:{usage:`coder server serve [--port <n>] [--host <address>] [--memory] [--runner <name>] [--json] [--cwd <dir>]`,summary:`Run the Coder server on Bun: the address platforms deliver events to, the dashboard, and the worker that runs tasks. With DATABASE_URL it is a full server with sign-in and workspaces. Without one it is the dashboard for this machine's CLI: its config, agents, tasks and engine logins, on loopback only. --memory makes a throwaway test server that keeps everything in memory. Configured through the environment; every variable is in coder docs self-host.`,flags:[[`--port <n>`,`listen port (default: PORT, else the port in a localhost PUBLIC_URL, else 8787)`],[`--host <address>`,`listen address (default: HOST, else 127.0.0.1 without a database, else every interface)`],[`--memory`,`a throwaway test server: everything in memory, no sign-in, admin token only`],[`--runner <name>`,`local, local-docker, vercel-sandbox, github-actions, or http`]],env:[[`PUBLIC_URL`,`the address platforms and browsers reach the server at (default http://localhost:<port>)`],[`PORT`,`listen port, as hosts set it (default 8787)`],[`HOST`,`listen address, as --host`],[`DATABASE_URL`,`Postgres, set up with drizzle-kit push; turns on sign-in and workspaces`],[`AUTH_WULAR_URL`,`the Wular Auth issuer people sign in with (default https://auth.wular.ai)`],[`SERVER_ENCRYPTION_KEY`,`encrypts stored secrets and derives the sign-in keys; required with DATABASE_URL (openssl rand -base64 32)`],[`RUNNER`,`where tasks run: local (default), local-docker, vercel-sandbox, github-actions, http`],[`MAX_TASKS, TASK_TIMEOUT, TASK_STALL, TASK_ATTEMPTS`,`runner capacity and lifecycle limits`],[`ADMIN_TOKEN`,`local and memory servers: the dashboard and CLI key; minted and shown when unset`],[`CODER_CACHE_HOME`,`archived tasks, flows and usage (default OS cache directory/wular-coder)`],[`WORK_DIR`,`where tasks check out repositories`],[`SERVER_NAME`,`what the dashboard calls this server (default Coder)`]],examples:[[`PUBLIC_URL=https://abc.ngrok.app coder server serve`,`receive GitHub and Slack events through a tunnel; the tunnel serves only their webhooks and callbacks`],[`PUBLIC_URL=https://agents.example.com DATABASE_URL=postgres://... coder server serve`,`on your own host, backed by Postgres`]]},options:{...f,port:r(n().check(i(),e())),host:u,runner:u,memory:d},async run({options:e,cwd:t}){let{rerunUnderBun:n}=await import(`./env-BgE9ipvN.js`).then(e=>e.t);if(await n(),e.memory&&!p.env.ADMIN_TOKEN&&!p.stdout.isTTY)throw new a(`invalid-option`,`Memory server needs an admin token: set ADMIN_TOKEN, or run in a terminal to get a printed one.`);let{serve:r}=await import(`./serve-BApfeXk8.js`).then(e=>e.n),i=await r({cwd:t,port:e.port,...e.host?{host:e.host}:{},...e.runner?{runner:e.runner}:{},...e.memory?{memory:!0}:{}}),o=()=>void i.close().finally(()=>p.exit(0));return p.once(`SIGINT`,o),p.once(`SIGTERM`,o),i},json:e=>({ok:!0,address:e.address,publicUrl:e.publicUrl,runner:e.runner,store:e.store,mode:e.mode,maxTasks:e.maxTasks,...e.signIn?{signIn:e.signIn}:{},...e.mintedToken?{adminToken:e.mintedToken}:{},warnings:e.warnings}),print:m});export{h as commandServerServe};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Zt as e}from"./core-DwsAMCnL.js";import{
|
|
1
|
+
import{Zt as e}from"./core-DwsAMCnL.js";import{mr as t,wr as n,yr as r}from"./prompts-Bj4Fbd_n.js";import{i,t as a}from"./cli-BBlH53hA.js";import{p as o,s}from"./output-BKeyLbvt.js";import{c,n as l,o as u,t as d}from"./args-CURX44CA.js";import f from"node:process";const p=i({name:`runner serve`,help:{usage:`coder runner serve --url <public url> [--token <token>] [--runner-url <url>] [--port <n>] [--name <name>] [--workspace] [--server [url]] [--json]`,summary:`Run tasks on this machine with its own claude and codex logins. Expose the port with any tunnel (cloudflared, ngrok, Tailscale Funnel or a public VS Code port) and pass the tunnel's URL; each start registers the current URL, so a changing tunnel URL is fine. Choose a default with coder runner default. Tasks use their named runner, the agent setting, your default, the workspace default, then the server default.`,flags:[[`--url <public url>`,`the HTTPS address the server reaches this runner at`],[`--token <token>`,`one-use pairing token, --url is the Coder server`],[`--runner-url <url>`,`public tunnel address when pairing, or CODER_RUNNER_URL`],[`--port <n>`,`local port the tunnel forwards to (default 4100)`],[`--name <name>`,`shown in the dashboard (default: this machine's hostname)`],[`--workspace`,`run every member's tasks, not only yours (owners and admins)`],a],examples:[[`cloudflared tunnel --url http://localhost:4100`,`expose the port in one terminal`],[`coder runner serve --url https://abc.trycloudflare.com`,`then serve through it`]]},options:{...d,port:n(t().check(r(),e())),url:c,name:c,token:c,"runner-url":c,workspace:l,server:u,yes:l},async run({options:e}){let{serveRunner:t}=await import(`./serve-DE1cKoGa.js`).then(e=>e.n),n=await t({...e,runnerUrl:e[`runner-url`]}),r=()=>void n.close().finally(()=>f.exit(0));return f.once(`SIGINT`,r),f.once(`SIGTERM`,r),n},json:({server:e,close:t,...n})=>({ok:!0,...n}),print:e=>f.stdout.write(`Runner ${o.bold(e.name)} serves ${e.server} at ${o.cyan(e.config.url??``)} (${e.scope}), listening on localhost:${e.port}.\n${s([`Tasks run here with this machine's own claude and codex logins`,`Stop with Ctrl-C; the server marks the runner offline`],o,o.cyan)}\n`)});export{p as commandRunnerServe};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as e}from"./cli-
|
|
1
|
+
import{s as e}from"./cli-BBlH53hA.js";const t=e(`server`,{serve:async()=>(await import(`./serve-lF97RlpX.js`)).commandServerServe,"rotate-key":async()=>(await import(`./rotate-key-CS1G6ReH.js`)).commandServerRotateKey,app:async()=>(await import(`./app-CaxTL1H3.js`)).commandServerApp,workflow:async()=>(await import(`./workflow-C21qQ4rT.js`)).commandServerWorkflow},{menu:[{usage:`serve [--port <n>]`,blurb:`run the server`},{usage:`rotate-key`,blurb:`re-seal secrets with SERVER_ENCRYPTION_KEY`},{usage:`app create <integration>`,blurb:`create the built-in agent's public app`},{usage:`workflow`,blurb:`print the GitHub Actions workflow for RUNNER=github-actions`}],description:[`Self-host Coder: the server your agents and platform apps talk to, with a dashboard and sign-in. We run one as the hosted service; you can run your own.`],exampleCommand:`server serve`},{nested:[`app`]});export{t as commandServer};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{E as e}from"./dispatch-
|
|
1
|
+
import{E 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{t as a}from"./args-CURX44CA.js";import o from"node:process";const s=t({name:`setup-host`,help:{usage:`coder setup-host [claude] [agents] [--json]`,summary:`Set up coder in your host: check engines and auth, seed the config, and
|
|
2
2
|
install the host plugin/skill for the named host(s). Claude Code gets its
|
|
3
3
|
marketplace plugin; "agents" installs a skill into ~/.agents/skills for
|
|
4
4
|
every host that reads the Agent Skills standard dir (Codex, Pi, OpenCode,
|
|
@@ -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}from"./output-BKeyLbvt.js";import{n as r}from"./args-CURX44CA.js";import i from"node:process";function a(e){let r=n,a=[...Object.entries(e.events).map(([e,t])=>({kind:`event`,name:e,does:t})),...Object.entries(e.tools).map(([e])=>({kind:`tools`,name:e===`read`?`Read-only`:`Read-write`,does:e===`read`?`Platform tools marked read-only`:`All platform tools`}))];i.stdout.write(t([{header:`kind`,value:e=>e.kind,paint:e=>r.light(e)},{header:`name`,value:e=>e.name},{header:`does`,value:e=>e.does}],a,r))}const o=e({name:`agent integrations show`,globalFlags:{cwd:!1},help:{usage:`coder agent integrations show <id> [--json]`,summary:`Describe one integration: each event with what triggers it, and the tools each preset (read, write) allows.`,examples:[[`coder agent integrations show github`,`the GitHub integration in full`]]},options:{json:r},args:1,run:async({args:[e]})=>{let{agents:t}=await import(`./agent-6GooVMsq.js`).then(e=>e.t);return t.integrations.show(e)},print:a});export{o as commandIntegrationsShow};
|
|
@@ -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{s as i,t as a}from"./args-CURX44CA.js";import{isLocal as o}from"./list-gFnOS9Hk.js";import s from"node:path";import c from"node:process";function l(e,t){return o(e)?{id:e.id,name:e.name,source:e.builtin?`builtin`:`repo`,...e.dir&&!e.builtin?{dir:s.relative(t,e.dir)}:{},definition:e.definition,...e.usage?{usage:e.usage}:{}}:{id:e.id,name:e.name,source:e.source,definition:e.definition,...e.settings?{usage:e.settings}:{}}}function u(e){let t=r,{definition:i,usage:a}=e,o=`dir`in e?e.dir:void 0,s=[[`name`,e.name],[`source`,o?`${e.source} (${o})`:e.source],[`description`,i.description],[`permissions`,a?.permissions??i.permissions],[`access`,a?.access===`read`||i.access===`read`?`Read-only`:`Read-write`],[`engine`,a?.engine??i.engine],[`model`,a?.model??i.model],[`effort`,a?.effort??i.effort]],l=Math.max(...s.map(([e])=>e.length))+2;for(let[e,n]of s)n&&c.stdout.write(`${t.dim(e.padEnd(l))}${n}\n`);let u=Object.entries(i.integrations).map(([e,t])=>{let n=a?.integrations?.[e],r=Array.isArray(t.events)?t.events:Object.keys(t.events??{});return{id:e,events:(n?.allowedEvents?r.filter(e=>n.allowedEvents.includes(e)):r).join(`, `)||`-`}});c.stdout.write(`\n${n([{header:`integration`,value:e=>e.id,paint:e=>t.cyan(e)},{header:`events`,value:e=>e.events}],u,{style:t,border:!0})}`)}const d=e({name:`agent show`,help:{usage:`coder agent show <id> [--server [url]] [--json] [--cwd <dir>]`,summary:`Describe one agent as it will run here, or its active version on a server: its settings, access and per-integration events.`,flags:[t],examples:[[`coder agent show coder`,`what the built-in agent listens to and may do`]]},options:{...a,...i},args:1,run:async({options:e,args:[t],cwd:n})=>{let{agents:r}=await import(`./agent-6GooVMsq.js`).then(e=>e.t);return r.show(t,{...e,cwd:n,organization:e.workspace})},json:(e,{cwd:t})=>l(e,t),print:(e,{cwd:t})=>u(l(e,t))});export{d as commandAgentShow};
|