@wular/coder 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -70
- package/dist/{add-ej0X9e3a.js → add-C2y-mVzl.js} +1 -1
- package/dist/{add-U-pty9qJ.js → add-CLYTF_up.js} +1 -1
- package/dist/{add-CE-70LFs.js → add-DRsPpQFl.js} +1 -1
- package/dist/{add-BxpLHnvD.js → add-DkpUwhtO.js} +1 -1
- package/dist/{add-json-CEa-6luW.js → add-json-5uPnWPoD.js} +1 -1
- package/dist/{agent-BsYx3Odz.js → agent-hw3zKw8y.js} +1 -1
- package/dist/{agent-JdtZozvP.js → agent-r5mMcehf.js} +1 -1
- package/dist/{alias-DX-Bm86x.js → alias-_0Rwf2cA.js} +1 -1
- package/dist/{app-BT5f7zL5.js → app-oE8G1-bi.js} +1 -1
- package/dist/{approvals-C-AvFt6s.js → approvals-DbVrsxec.js} +1 -1
- package/dist/{approve-DOmpQRNd.js → approve-DeAhFL-m.js} +1 -1
- package/dist/{apps-CjfrZyM5.js → apps-eujHiNca.js} +1 -1
- package/dist/{archive-BziJ1rQ-.js → archive-BCUfymIB.js} +1 -1
- package/dist/{archive-BUB8gFKD.js → archive-DZ6vpMHb.js} +1 -1
- package/dist/{archive-sweep-CtBcARgN.js → archive-sweep-Cxbh8yAI.js} +1 -1
- package/dist/{ask-dE3U3ss2.js → ask-BU2WVxVM.js} +1 -1
- package/dist/auth-CBWTmAPA.js +1 -0
- package/dist/{auth-BFny--17.js → auth-Dmn2U7rr.js} +1 -1
- package/dist/{cli-BilSDkvE.js → cli-DWCR7iqa.js} +1 -1
- package/dist/cli.js +1 -1
- package/dist/{config-Da_cwoxI.js → config-12pK4qW7.js} +1 -1
- package/dist/{create-C_iMJV4Y.js → create-D3f6q0Yq.js} +1 -1
- package/dist/credentials-l6dsrZLL.js +1 -0
- package/dist/dash/manifest.json +744 -858
- package/dist/dash/public/assets/chunks/{agent-pills-c9c4ac4d4a10df83.js → agent-pills-dd0b7643e125bbf1.js} +1 -1
- package/dist/dash/public/assets/chunks/{agent-settings-form-8be2ddab074aba6d.js → agent-settings-form-45ae6aeaaed2b568.js} +1 -1
- package/dist/dash/public/assets/chunks/{agents-grid-951584b6f4c4314e.js → agents-grid-b906da80c31fc035.js} +1 -1
- package/dist/dash/public/assets/chunks/{combo-41234c24668b1db1.js → combo-952a457d52360d88.js} +1 -1
- package/dist/dash/public/assets/chunks/{composer-d10d4b1d54c4f751.js → composer-49f9e7c5c4dfda3b.js} +1 -1
- package/dist/dash/public/assets/chunks/{composer-5534be50bc12385e.js → composer-f331d00837143aee.js} +1 -1
- package/dist/dash/public/assets/chunks/{connect-apps-aa2a3d82e48ed8c3.js → connect-apps-661f3b3a85f1776a.js} +1 -1
- package/dist/dash/public/assets/chunks/{credentials-list-bc5bfcab058176c5.js → credentials-list-e6177d0943517929.js} +2 -2
- package/dist/dash/public/assets/chunks/{custom-range-4761ab14f05149df.js → custom-range-03ba6fb2ade7d282.js} +1 -1
- package/dist/dash/public/assets/chunks/{editor-bfe8cd854f8001be.js → editor-34cb529d6d8a4b09.js} +1 -1
- package/dist/dash/public/assets/chunks/{engines-list-f1191390f5715b39.js → engines-list-2f1acee3ecc8461a.js} +1 -1
- package/dist/dash/public/assets/chunks/{heads-f3bcd289663d48fa.js → heads-1570a3a6db331979.js} +1 -1
- package/dist/dash/public/assets/chunks/{list-1d259660d7612c5f.js → list-87b359bebd26986a.js} +1 -1
- package/dist/dash/public/assets/chunks/{mcp-list-e3bebbbe831393b8.js → mcp-list-b42f0d2ee463b37d.js} +1 -1
- package/dist/dash/public/assets/chunks/{models-list-44f857a469ca04d5.js → models-list-0669d26fd662aec3.js} +1 -1
- package/dist/dash/public/assets/chunks/{platform-actions-d1426602049926d2.js → platform-actions-c92ca3c6198a9387.js} +1 -1
- package/dist/dash/public/assets/chunks/{runners-list-1901af8a5dea1f09.js → runners-list-9fffa50432c470c9.js} +1 -1
- package/dist/dash/public/assets/chunks/{select-7ae25fd8a7d6c338.js → select-1013702bdfb1ade4.js} +1 -1
- package/dist/dash/public/assets/chunks/shared-init-20e199043ff5d00f.js +2 -0
- package/dist/dash/public/assets/chunks/{task-actions-8e1d93c788d001df.js → task-actions-a9603d520434baab.js} +1 -1
- package/dist/dash/public/assets/chunks/{task-view-6d7618d2820a5cb4.js → task-view-f7039cb330bcb0b5.js} +3 -3
- package/dist/dash/public/assets/chunks/{tasks-list-f4784e5cbd0ed785.js → tasks-list-2a905b4a0c3a9042.js} +1 -1
- package/dist/dash/public/assets/chunks/{toolbar-a75d2570f07cbb70.js → toolbar-f964fa864699f095.js} +1 -1
- package/dist/dash/public/assets/dash-49ca85b59ac65c20.css +1 -0
- package/dist/dash/public/assets/dash-account-96fc41be318839fa.css +1 -0
- package/dist/dash/public/assets/dash-agents-290a7b21c7dc0c92.css +1 -0
- package/dist/dash/public/assets/dash-agents-new-a7a07bf4ebda24c2.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-69a72fb0bbd14cc2.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-edit-397bdfb2f0ca328c.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-platforms-a7b3b7247c27f1d2.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-settings-8389b7d0555e8ccf.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-tasks-5987b8aea5e8f30d.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-usage-19abc69e1d4e6b0a.css +1 -0
- package/dist/dash/public/assets/dash-settings-53b8e6a8f656fa1a.css +1 -0
- package/dist/dash/public/assets/dash-settings-param-tab-ac61fdfdd6fd533f.css +1 -0
- package/dist/dash/public/assets/dash-tasks-cc0b1d32874b731c.css +1 -0
- package/dist/dash/public/assets/dash-tasks-param-id-02b8c7bd99cc1090.css +1 -0
- package/dist/dash/public/assets/dash-usage-884943221f76ad93.css +1 -0
- package/dist/dash/public/assets/pnext-client-17ba55bb57a1f4da.js +1 -0
- package/dist/dash/public/assets/{pnext-client-1b9ab0963a8ff77b.js → pnext-client-1afa4148bea69ad2.js} +1 -1
- package/dist/dash/public/assets/pnext-client-2693db10b197ade1.js +1 -0
- package/dist/dash/public/assets/pnext-client-43f52a07f8067b1b.js +1 -0
- package/dist/dash/public/assets/pnext-client-4594b693fe612835.js +1 -0
- package/dist/dash/public/assets/pnext-client-73f73e24f8141fb6.js +1 -0
- package/dist/dash/public/assets/pnext-client-7574da4651b40eae.js +1 -0
- package/dist/dash/public/assets/pnext-client-7b3a2c1092cbbb02.js +1 -0
- package/dist/dash/public/assets/pnext-client-816fe5fc96d3f768.js +1 -0
- package/dist/dash/public/assets/pnext-client-86cb956b448b0887.js +1 -0
- package/dist/dash/public/assets/pnext-client-8b64e3c030164288.js +1 -0
- package/dist/dash/public/assets/pnext-client-8f6161084c595a22.js +1 -0
- package/dist/dash/public/assets/pnext-client-9203ec11926e5d04.js +1 -0
- package/dist/dash/public/assets/pnext-client-a38b446f941d44df.js +1 -0
- package/dist/dash/public/assets/pnext-client-bd8d51aaa095e8a4.js +1 -0
- package/dist/dash/public/assets/pnext-client-e9821d1f1bdb281d.js +1 -0
- package/dist/dash/server/bundle-0.1.6-b29ec45cb963d47f/entry.js +2 -0
- package/dist/{default-vYPT26DR.js → default-CwQXCtoB.js} +1 -1
- package/dist/{default-Bobztoxf.js → default-De8FXiWz.js} +1 -1
- package/dist/{delete-z1_86nf6.js → delete-BD6AnCLg.js} +1 -1
- package/dist/{delete-D8gEwoOj.js → delete-cS01oOIb.js} +1 -1
- package/dist/{disable-DVKd-0Xb.js → disable-BMWWeYFQ.js} +1 -1
- package/dist/{discover-Df-a8K4R.js → discover-Cfx5RPU7.js} +1 -1
- package/dist/{docs-DKJnqZqt.js → docs-DWegDRiu.js} +1 -1
- package/dist/{enable-C8Zf_wpN.js → enable-Cfzeau2x.js} +1 -1
- package/dist/{flow-17k25MHt.js → flow-kAxxVOiR.js} +1 -1
- package/dist/{init-CoMfFxbG.js → init-C4tDFH4G.js} +1 -1
- package/dist/integrations-D-L3uQRj.js +1 -0
- package/dist/{list-BYiG8Zav.js → list-5Ljf9TxF.js} +2 -2
- package/dist/{list-BAKvxSbh.js → list-COAo7eZd.js} +1 -1
- package/dist/{list-DX-z3SBp.js → list-DuPqU3fk.js} +1 -1
- package/dist/{list-C5w01-8q.js → list-DzGuMkQy.js} +1 -1
- package/dist/{list-VToARh3C.js → list-J8d_zh-o.js} +1 -1
- package/dist/{list-BxEywhHU.js → list-vOvIpbOH.js} +1 -1
- package/dist/{list-CIW2joV1.js → list-vpyS-hv8.js} +1 -1
- package/dist/{list-DpCf4G-H.js → list-way5oLO0.js} +1 -1
- package/dist/{login-DkkslfBx.js → login-BBw95-S3.js} +1 -1
- package/dist/{login-BFxX4jJy.js → login-CNmeRAL7.js} +1 -1
- package/dist/{logout-BHAtw4Z8.js → logout-j0dTo_Ib.js} +1 -1
- package/dist/{maintenance-C5FklUw3.js → maintenance-DkLVtqM7.js} +1 -1
- package/dist/{mcp-CCZOAo06.js → mcp-CsmBtlW9.js} +1 -1
- package/dist/{migrate-C4vM7DQN.js → migrate-D4nzYhk8.js} +1 -1
- package/dist/{model-Bs1StDo3.js → model-B79MFtRV.js} +1 -1
- package/dist/{push-CUC55Bqd.js → push-DbdnbZYt.js} +1 -1
- package/dist/{queue-6io_NOP3.js → queue-C9fSdE_X.js} +27 -27
- package/dist/refresh-BDmap1RA.js +1 -0
- package/dist/{remove-B93LNkZI.js → remove-BNzbUhaK.js} +1 -1
- package/dist/{remove-eQ8y5C5p.js → remove-CLpL12Ya.js} +1 -1
- package/dist/{remove-CuH8a3L9.js → remove-CaYH9Cna.js} +1 -1
- package/dist/{remove-C5_xggx7.js → remove-D-QeeZQL.js} +1 -1
- package/dist/{rename-CYfy03FE.js → rename-Bhcb4t9F.js} +1 -1
- package/dist/{result-BEtQZHaY.js → result-BfTfJayl.js} +1 -1
- package/dist/{result-BzaM3inj.js → result-D8DsvJDu.js} +1 -1
- package/dist/{resume-DYzKvyEw.js → resume-aZ8yWDBh.js} +1 -1
- package/dist/{review-oIBeECZE.js → review-BEhDcX4b.js} +1 -1
- package/dist/{rotate-key-IdMYH7gg.js → rotate-key-BqnKhTK8.js} +1 -1
- package/dist/{run-CTtd0Znc.js → run-BWbabvub.js} +1 -1
- package/dist/{run-CawRGnOg.js → run-BdPjxaZU.js} +1 -1
- package/dist/{run-BDYl0CKl.js → run-Dqe38jX8.js} +1 -1
- package/dist/runner-BPpiJvHx.js +1 -0
- package/dist/sdk.js +1 -1
- package/dist/{serve-CPnmrKyf.js → serve-C0WC-QrV.js} +2 -2
- package/dist/{serve-GmRO89s5.js → serve-CcObDKKQ.js} +1 -1
- package/dist/{serve-CE8YV2e9.js → serve-Ck95047c.js} +1 -1
- package/dist/{serve-CQKZxzFE.js → serve-DA5I2qXj.js} +2 -2
- package/dist/{server-Kb22cWfF.js → server-BxLFZL80.js} +1 -1
- package/dist/{setup-host-GFTUzzZJ.js → setup-host-DLd_j2Uw.js} +1 -1
- package/dist/{shared-DVtzWhUT.js → shared-BLkGRKty.js} +1 -1
- package/dist/{show-COTZEYgc.js → show-DzoQIs75.js} +1 -1
- package/dist/{show-CMUg8SJu.js → show-FC3dJcD-.js} +1 -1
- package/dist/{status-D26U--p8.js → status-BU3DR1XU.js} +1 -1
- package/dist/{steer-C6uARLp5.js → steer-P_38hRRD.js} +1 -1
- package/dist/{stop-BrGI3hSS.js → stop-BJGDRPsp.js} +1 -1
- package/dist/{stop-ByCAlbmN.js → stop-BWY6k6v5.js} +1 -1
- package/dist/{store-DzqXS2wT.js → store-B3ZHoBJY.js} +4 -4
- package/dist/{store-B94tSate.js → store-BLi19UDE.js} +1 -1
- package/dist/{task-CgOKgkEG.js → task-b2BK481M.js} +1 -1
- package/dist/{test-NEbhlxvo.js → test-BrSrhop9.js} +1 -1
- package/dist/{tools-D0Zfs8Hx.js → tools-CgswhJzh.js} +1 -1
- package/dist/{unalias-C9NqmSDq.js → unalias-mMHXqok7.js} +1 -1
- package/dist/{update-BTxYQj7Z.js → update-DbOWToPy.js} +1 -1
- package/dist/{upgrade-hA0yWBvx.js → upgrade-D6oC9HQI.js} +2 -2
- package/dist/{usage-BhqoCjvE.js → usage-Cb8Dtv9V.js} +1 -1
- package/dist/{usage-C4d9X2Uq.js → usage-DMs-IIJC.js} +1 -1
- package/dist/{watch-DtRuC0Wc.js → watch-BcMQXGYO.js} +1 -1
- package/dist/{watch-CSdj24ct.js → watch-eE2XiwsC.js} +1 -1
- package/dist/{worker-DX7P9kWl.js → worker-DrucI22w.js} +1 -1
- package/dist/{workflow-Dcmdooi8.js → workflow-Cshghoas.js} +1 -1
- package/docs/cli.md +145 -0
- package/package.json +3 -2
- package/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/plugins/cursor/.cursor-plugin/plugin.json +1 -1
- package/src/core/defaults.ts +25 -0
- package/src/server/dash/app/dash/layout.css +58 -1
- package/src/server/dash/app/dash/layout.tsx +16 -4
- package/src/server/dash/app/dash/settings/[tab]/page.tsx +1 -1
- package/src/server/dash/comps/nav/side-toggle.tsx +1 -1
- package/src/server/dash/comps/ui/menu.tsx +5 -1
- package/src/server/dash/comps/ui/toast.css +3 -2
- package/dist/auth-DWHIzqbA.js +0 -1
- package/dist/credentials-B1jv6dkg.js +0 -1
- package/dist/dash/public/assets/chunks/shared-init-ffb3397e494137c9.js +0 -2
- package/dist/dash/public/assets/dash-9e02d5d1a6d42ee3.css +0 -1
- package/dist/dash/public/assets/dash-account-04859899c1838ada.css +0 -1
- package/dist/dash/public/assets/dash-agents-9e678137267dec07.css +0 -1
- package/dist/dash/public/assets/dash-agents-new-26fa27b17ef9b8d8.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-b975c48f8abf3444.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-edit-e13fda599bb04843.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-platforms-70292932cb27bc96.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-settings-71f9a86251723fcc.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-tasks-fb8eb2ed71006601.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-usage-7c8740f1cdd52c71.css +0 -1
- package/dist/dash/public/assets/dash-settings-8eb818da462227e8.css +0 -1
- package/dist/dash/public/assets/dash-settings-param-tab-849a1a9542e273f5.css +0 -1
- package/dist/dash/public/assets/dash-tasks-81e510e0b6931b42.css +0 -1
- package/dist/dash/public/assets/dash-tasks-param-id-bbd2a83342f2ec10.css +0 -1
- package/dist/dash/public/assets/dash-usage-8e0259e03eaed1bd.css +0 -1
- package/dist/dash/public/assets/pnext-client-03b03b254e525e82.js +0 -1
- package/dist/dash/public/assets/pnext-client-1c7859bb888f4ef0.js +0 -1
- package/dist/dash/public/assets/pnext-client-3c748afe963fb05d.js +0 -1
- package/dist/dash/public/assets/pnext-client-4f47c2cae220f107.js +0 -1
- package/dist/dash/public/assets/pnext-client-6ab9fd9b53b794d2.js +0 -1
- package/dist/dash/public/assets/pnext-client-6c241786342498e4.js +0 -1
- package/dist/dash/public/assets/pnext-client-80b56d420f02b808.js +0 -1
- package/dist/dash/public/assets/pnext-client-83135c17bae850a3.js +0 -1
- package/dist/dash/public/assets/pnext-client-8e6fa4302ae0396f.js +0 -1
- package/dist/dash/public/assets/pnext-client-932c9d8cc0717fc8.js +0 -1
- package/dist/dash/public/assets/pnext-client-a42ae63d4de113f9.js +0 -1
- package/dist/dash/public/assets/pnext-client-d2ee6f8c1e337032.js +0 -1
- package/dist/dash/public/assets/pnext-client-d513f65ec23b7f20.js +0 -1
- package/dist/dash/public/assets/pnext-client-ecb88e2a8a109954.js +0 -1
- package/dist/dash/public/assets/pnext-client-f1545ee6270bbf9a.js +0 -1
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/boot-B2MFTRO2.js +0 -30
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/build-tier-XJJSL5FR.js +0 -2704
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-2HFY3DQT.js +0 -208
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-2ICEVELW.js +0 -834
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-3UPROT2C.js +0 -35
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-4P5CMIYT.js +0 -1582
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-4TKZKZ3Q.js +0 -131
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-5RDEILQB.js +0 -437
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-62KEQM43.js +0 -25
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-6KQSWT6D.js +0 -831
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-7DCNCW6O.js +0 -724
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-B4THCTQP.js +0 -22
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-C2LIV2MM.js +0 -172
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-CCATPVTW.js +0 -378
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-COXJAPTU.js +0 -89
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-E6IXL2NJ.js +0 -6270
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-FLGRBFAH.js +0 -1198
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-FTJVHFWD.js +0 -61
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-H523KSIH.js +0 -5151
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-HT6KKX6A.js +0 -20
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-JESFYECC.js +0 -438
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-JRPJM2XY.js +0 -17
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-L2IWDUXG.js +0 -107
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-L5P4Y4UC.js +0 -183
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-NQE46AZN.js +0 -647
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-PA4QEARJ.js +0 -129
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-PZ5AXOLW.js +0 -7146
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-SNVPTULL.js +0 -2397
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-T3QZT3PG.js +0 -220
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-VC5O2SDP.js +0 -72
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-WZX4V6CM.js +0 -231
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-XUUIDXY5.js +0 -627
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-ZHFDO3PR.js +0 -265
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/compile-CE2DN7ZA.js +0 -18
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/config-UREY7XJT.js +0 -16
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/config-loader-UI2XE3PZ.js +0 -17
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/entry.js +0 -219
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/generate-I2PPTDFD.js +0 -16
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/modules-UVOCE4C2.js +0 -48
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/pipeline-UW47K537.js +0 -963
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/proxy-ITGOVJBW.js +0 -26
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/register-4SA55SWT.js +0 -12579
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/router-JNKHLBCZ.js +0 -505
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/routes-PD6J2NXW.js +0 -54
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/tsconfig-defaults-ZXEH7RQK.js +0 -15
- package/dist/integrations-5xCaXSd-.js +0 -1
- package/dist/refresh-BIrmrWYq.js +0 -1
- package/dist/runner-D7ScbIHJ.js +0 -1
- package/src/server/dash/app/dash/token-from-hash.tsx +0 -17
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{$ as t,At as n,K as r,Qt as i,Tn as a,U as o,W as s,bn as c,dt as l,et as u,kt as d,lt as f,q as p,tt as m,vt as h,xt as g,zt as _}from"./dispatch-BKeAch9E.js";import{i as v,n as y,r as b,u as x}from"./load-BpEsAn51.js";import{c as S,d as C,l as ee,n as te}from"./integrations-BAgdVDhj.js";import{c as ne}from"./models-_5LVGC3m.js";import{o as w}from"./local-H3uvqEbq.js";import{a as T,d as E,f as re,l as D,n as ie,o as ae,p as O,r as k,s as oe,t as se,u as ce}from"./http-Bkg_OQ6r.js";import{$ as le,$t as ue,A as de,An as fe,At as pe,B as me,Bn as he,Bt as ge,C as _e,Cn as ve,Ct as ye,D as be,Dn as xe,Dt as Se,E as Ce,En as we,Et as Te,F as Ee,Fn as De,G as Oe,Gn as ke,Gt as Ae,H as je,Hn as Me,Ht as Ne,I as Pe,In as A,It as Fe,J as Ie,Jn as Le,Jt as Re,K as ze,Kn as j,Kt as Be,L as Ve,Lt as He,M as Ue,Mn as We,Mt as Ge,N as Ke,Nn as qe,Nt as Je,O as Ye,On as Xe,Ot as M,P as Ze,Pn as N,Pt as Qe,Q as $e,Qn as et,Qt as tt,R as nt,Rt as rt,S as it,Sn as at,St as ot,T as P,Tn as st,Tt as F,U as ct,Un as lt,Ut as ut,V as dt,Vn as ft,Vt as pt,W as mt,Wn as ht,Wt as gt,X as _t,Xn as I,Xt as vt,Y as yt,Yn as bt,Yt as xt,Z as St,Zn as L,Zt as Ct,_ as R,_n as wt,_t as Tt,an as Et,b as Dt,bn as Ot,bt as kt,cn as At,ct as jt,d as Mt,dt as Nt,en as Pt,et as Ft,f as It,fn as Lt,ft as Rt,g as zt,gn as Bt,gt as Vt,h as Ht,hn as z,ht as Ut,i as Wt,in as Gt,it as Kt,j as qt,jn as Jt,jt as Yt,k as Xt,kn as Zt,kt as Qt,l as $t,ln as en,m as tn,mn as nn,mt as rn,nn as an,o as on,on as sn,ot as cn,pn as B,pt as ln,qn as V,qt as un,r as dn,rn as fn,rt as pn,s as mn,sn as hn,st as gn,t as _n,tn as vn,u as yn,v as H,vn as U,vt as bn,w as xn,wn as Sn,wt as Cn,x as wn,xn as Tn,xt as En,y as W,yn as G,yt as K,z as Dn,zn as On,zt as kn}from"./store-DzqXS2wT.js";import{n as An,r as jn}from"./env-CRf6wkM2.js";import{l as Mn}from"./schema-CU2iFkp8.js";import{r as Nn,t as Pn}from"./migrate-N-85_N7J.js";import{n as Fn,r as In}from"./usage-BhqoCjvE.js";import q from"node:path";import J from"node:process";import*as Y from"zod/mini";import Ln from"node:fs";import{randomBytes as Rn,randomUUID as zn}from"node:crypto";import X from"node:fs/promises";import{isDeepStrictEqual as Bn}from"node:util";import Vn from"node:http";import{sql as Hn}from"drizzle-orm";async function Un(e){try{return await X.readdir(e,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}}async function Z(e){try{return await X.lstat(e),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}}async function Wn(e,t){if(e===t||!await Z(e))return 0;let n=await Un(e),r=n.filter(e=>e.isDirectory()).length;if(!await Z(t))return await a(e,t),r;for(let r of n)await a(q.join(e,r.name),q.join(t,r.name));return await X.rmdir(e),r}async function Gn(e){let t=q.dirname(e),n=q.basename(e);for(let e of await Un(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(q.join(t,e.name)).catch(e=>{if(e.code!==`ENOENT`)throw e})}}async function Kn(e,t){if(await Gn(e),e===t||!await Z(e))return 0;if(!await Z(t))return await a(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}}:{}},o=`${t}.${process.pid}.${zn()}.tmp`;try{await X.writeFile(o,`${JSON.stringify(i)}\n`,{mode:384,flag:`wx`}),await X.rename(o,t),await X.unlink(e)}finally{await X.rm(o,{force:!0})}return 1}async function qn(){let e=d(),t=n(`state`),r=d(`archive`),i=d(`flows-archived`),a=d(`usage.json`),o=d(`runner`,`usage.json`),s={from:n(`checkouts`),to:d(`checkouts`)},c={from:n(`update-check.json`),to:d(`update-check.json`)},l={cache:e,tasks:0,flows:0,files:0},u=(await Un(t)).filter(e=>e.isDirectory()).map(e=>({archive:n(`state`,e.name,`archive`),flows:n(`state`,e.name,`flows-archived`),usage:n(`state`,e.name,`usage.json`),runnerUsage:n(`state`,e.name,`runner`,`usage.json`)}));await Gn(a),await Gn(o);for(let e of u)l.tasks+=await Wn(e.archive,r),l.flows+=await Wn(e.flows,i),l.files+=await Kn(e.usage,a),l.files+=await Kn(e.runnerUsage,o);return await Wn(s.from,s.to),l.files+=await Kn(c.from,c.to),l}async function Jn(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 Yn(e){let t=(e.now??Date.now)(),n=e.health,{body:r,status:i}=n&&t-n.at<5e3?n:await Xn(e);e.health=i===200?{at:n&&t-n.at<5e3?n.at:t,body:r,status:i}:void 0;let a=Math.max(0,t-(e.limits?.startedAt??t))/1e3;return T({...r,uptime:a},i,{"cache-control":`no-store`})}async function Xn(e){let t=e.config.store===`postgres`?`down`:`none`,n={online:0,total:0},r=!0;try{if(e.config.store===`postgres`){if(!e.databaseHealth)throw Error(`Database health probe is unavailable`);await e.databaseHealth(),t=`ok`}n=e.healthRunners?await e.healthRunners():await Jn(e)}catch{r=!1,e.config.store===`postgres`&&(t=`down`)}return{body:{ok:r,version:c(),db:t,runners:n},status:r?200:503}}async function Zn(e){let t=(e.now??Date.now)();if(e.queue.metrics&&!e.local)return{...await e.queue.metrics(e.organizationId,t-864e5),runnersOnline:(await Jn(e)).online,requests:e.limits?.requests??0,rateLimitRejections:e.limits?.rejections??0};let n=await e.queue.list(e.organizationId),r=e.local?[...It(e.local.cwd,!1),...It(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 Jn(e)).online,requests:e.limits?.requests??0,rateLimitRejections:e.limits?.rejections??0}}async function Qn(e,t,n,r){if(!t.auth)return T({mode:Fe(t),organization:{id:t.organizationId},server:$n(t)});let i=t.session;return T({mode:Fe(t),user:i.user,organization:i.organizations.find(e=>e.id===i.organizationId)??null,organizations:i.organizations,manageMembersUrl:`${t.auth.issuer}/auth/onboarding`,server:$n(t)})}function $n(e){return{name:e.config.name??`Coder`,store:e.config.store,...e.config.publicUrl?{url:e.config.publicUrl}:{},subscriptions:{claude:!!e.config.subscriptions?.claude,codex:!!e.config.subscriptions?.codex}}}async function er(e,t,n,r){let i=e.headers.get(`content-type`)??``,a=i.includes(`application/json`)?await e.json().catch(()=>void 0):await e.formData().then(e=>Object.fromEntries(e.entries()),()=>void 0);if(!a||typeof a!=`object`)return T({error:`Send the workspace as a form or JSON body.`},400);let o=typeof a.organization==`string`?a.organization:``,s=o?await t.auth.setOrganization(e.headers,o):void 0;if(!s)return T({error:`You are not a member of that workspace.`},403);let{cookies:c,...l}=s,u=i.includes(`application/json`)?T({organization:l}):O(`/dash`,303);for(let e of c)u.headers.append(`set-cookie`,e);return u}async function tr(e,t,n,r){let i=t.session.user.id;n.id;let a=(await e.json().catch(()=>({}))).engine??``;if(!or.has(a)||!t.config.subscriptions?.[a])return T({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 T({error:`Sign-in cannot run on the ${t.config.runner} runner.`},409);let s=`login-${Rn(12).toString(`base64url`)}`,c=he(s,t.organizationId,0),l={owner:i,engine:a,state:`starting`,tokenHash:c.hash,runner:o.kind,createdAt:sr(t),expiresAt:sr(t)+ar};await cr(t,s,l);let u;try{let e=await o.start({id:s},{CODER_SERVER:t.config.publicUrl??``,CODER_TASK_TOKEN:c.token,CODER_LOGIN:a}),n=await t.store.patchLogin(s,{handle:e},{tokenHash:l.tokenHash});if(!n)return await o.stop(e).catch(()=>{}),T({error:`This sign-in is gone. Start again.`},409);u=n}catch(e){return await t.store.delete(`login`,s),T({error:e instanceof Error?e.message:String(e)},502)}return T(lr(s,u),201)}async function nr(e,t,n,r){t.session.user.id;let i=n.id??``,a=i&&!i.includes(`/`)?await ur(t,i):void 0;return a?T(lr(i,a)):T({error:`This sign-in is gone. Start again.`},404)}async function rr(e,t,n,r){t.session.user.id;let i=n.id??``,a=i&&!i.includes(`/`)?await ur(t,i):void 0;if(!a)return T({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:A(t.config,s)},{state:`open`,tokenHash:a.tokenHash})?T({error:`This sign-in is not waiting for a code.`},409):T({ok:!0})}async function ir(e,t,n,r){t.session.user.id;let i=n.id??``,a=i&&!i.includes(`/`)?await ur(t,i):void 0;return a?(await t.store.delete(`login`,i),a.handle&&await t.runners[a.runner]?.stop(a.handle).catch(()=>{}),T({ok:!0})):T({error:`This sign-in is gone. Start again.`},404)}const ar=6e5,or=new Set([`claude`,`codex`]),sr=e=>(e.now??Date.now)();function cr(e,t,n){return e.store.put(`login`,t,n,{ttlMs:Math.max(1,n.expiresAt-sr(e))})}function lr(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}:{},...t.label?{label:t.label}:{}}}async function ur(e,t){let n=await e.store.get(`login`,t);return n&&n.owner===e.session?.user.id?n:void 0}async function dr(e,t,n,r){let i=n.id,a=t.callbackLogin,o=Date.now()+25e3;for(;!a.input&&Date.now()<o&&!e.signal.aborted;){await new Promise(e=>setTimeout(e,250));let e=await t.store.get(`login`,i);if(!e)return new Response(`Unauthorized`,{status:401});a=e}if(!a.input)return T({});let s=await t.store.patchLogin(i,{input:null},{input:a.input,tokenHash:a.tokenHash});return T(s?{code:N(t.config,a.input)}:{})}async function fr(e,t,n,r){n.id;let i=t.callbackLogin;return T({engine:i.engine})}async function pr(e,t,n,r){let i=n.id,a=t.callbackLogin,o=await e.json().catch(()=>({}));if(a.state===`done`||a.state===`failed`)return T({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),T({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 T({error:`Invalid sign-in result`},400);let n=`${a.engine}-subscription`,r=o.result?.account;return await t.store.completeLogin(i,a.tokenHash,n,{...De(t.config,{env:c}),engine:a.engine,createdAt:(t.now??Date.now)(),...r?.email||r?.plan?{account:{...typeof r.email==`string`?{email:r.email}:{},...typeof r.plan==`string`?{plan:r.plan}:{}}}:{}})?T({ok:!0}):T({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(a.state===`starting`?await t.store.patchLogin(i,{...l,state:`open`},{state:`starting`,tokenHash:a.tokenHash})??await t.store.patchLogin(i,l,{...s,state:[`open`,`verifying`]}):await t.store.patchLogin(i,l,s))?T({ok:!0}):T({error:`This sign-in changed. Try again.`},409)}async function mr(e,t,n,r){let i=n.id,a=t.operatorApp??!1;if(!/^[a-z0-9_-]+$/.test(r.pathname.split(`/`)[2]))return;let o=a?`*`:t.session?.user.id??`anonymous`,s=t.integrations[i];if(!s)return j(`Unknown integration "${i}"; run coder agent integrations list to see them`,404);let c=t.config.publicUrl;if(!c)return j(`PUBLIC_URL is not set on this server; set it to the address platforms should call and restart`,400);t.fetch,t.now?.();let l=V(r.searchParams);if(!l)return j(`Setup link is missing or malformed; start again from the agent's Platforms tab`,400);if(!l.definition.integrations[i])return j(`This agent declares no ${i} integration in its agent.json`,400);if(l.state.public&&!a)return j(`Only the server operator creates public apps`,403);let u=lt(i,l.state),d=l.state.tx?await I(t,l.state.tx,`create`,o)===u?l.state.tx:void 0:await L(t,`create`,o,u);if(!d)return j(`This app creation link is invalid, expired, or already used`,403);let f={...l.state,tx:d};return s.app.createPage({publicUrl:c,state:f,definition:l.definition,encodedState:w(f)})}async function hr(e,t,n,r){let i=n.id,a=t.operatorApp??!1;if(!/^[a-z0-9_-]+$/.test(r.pathname.split(`/`)[2]))return;let o=a?`*`:t.session?.user.id??`anonymous`,s=t.integrations[i];if(!s)return j(`Unknown integration "${i}"; run coder agent integrations list to see them`,404);let c=t.config.publicUrl;if(!c)return j(`PUBLIC_URL is not set on this server; set it to the address platforms should call and restart`,400);let l=t.fetch??fetch,u=t.now?.()??Date.now(),d=k(r.searchParams.get(`state`)),f=V(r.searchParams)??(d&&V(new URLSearchParams(Object.entries(d).filter(([,e])=>e!==void 0))))??void 0;if(!f)return j(`Setup state was lost between the platform and this server; start again`,400);if(!f.state.tx||!await bt(t,f.state.tx,`create`,o,lt(i,f.state)))return j(`This app creation link is invalid, expired, or already used`,403);let p=await s.app.createCallback(e,{publicUrl:c,...f,fetch:l}).catch(e=>j(`Creating the ${i} app failed: ${e instanceof Error?e.message:e}`,400));if(p instanceof Response)return p;let m={id:`${i}:${p.platformAppId}`,integration:i,agent:f.state.agent,name:p.name,...f.state.repo?{agentsRepo:f.state.repo}:{},...f.state.repo?{branch:f.state.branch??`main`}:{},...a?{builtin:!0}:{},credentials:A(t.config,p.credentials),createdAt:u};if(await t.store.put(`app`,m.id,m),a)return j(`Created ${p.name}. Every workspace on this server can now connect it from its dashboard.`);let h=await L(t,`install`,o,m.id),g=`/dash/agents/${encodeURIComponent(m.agent)}/platforms`;return O(`${c}/install/${i}?app=${encodeURIComponent(m.id)}&state=${w({tx:h,back:g})}`)}async function gr(e,t,n,r){let i=n.id,a=t.operatorApp??!1;if(!/^[a-z0-9_-]+$/.test(r.pathname.split(`/`)[2]))return;let o=a?`*`:t.session?.user.id??`anonymous`,s=t.integrations[i];if(!s)return j(`Unknown integration "${i}"; run coder agent integrations list to see them`,404);let c=t.config.publicUrl;if(!c)return j(`PUBLIC_URL is not set on this server; set it to the address platforms should call and restart`,400);let l=t.fetch??fetch,u=t.now?.()??Date.now(),d=new URLSearchParams(await e.clone().text()),f=k(r.searchParams.get(`state`)),p=V(r.searchParams)??(f&&V(new URLSearchParams(Object.entries(f).filter(([,e])=>e!==void 0))))??(d&&V(d));if(!p)return j(`Setup state was lost between the platform and this server; start again`,400);if(!p.state.tx||!await bt(t,p.state.tx,`create`,o,lt(i,p.state)))return j(`This app creation link is invalid, expired, or already used`,403);let m=await s.app.createCallback(e,{publicUrl:c,...p,fetch:l}).catch(e=>j(`Creating the ${i} app failed: ${e instanceof Error?e.message:e}`,400));if(m instanceof Response)return m;let h={id:`${i}:${m.platformAppId}`,integration:i,agent:p.state.agent,name:m.name,...p.state.repo?{agentsRepo:p.state.repo}:{},...p.state.repo?{branch:p.state.branch??`main`}:{},...a?{builtin:!0}:{},credentials:A(t.config,m.credentials),createdAt:u};if(await t.store.put(`app`,h.id,h),a)return j(`Created ${m.name}. Every workspace on this server can now connect it from its dashboard.`);let g=await L(t,`install`,o,h.id),_=`/dash/agents/${encodeURIComponent(h.agent)}/platforms`;return O(`${c}/install/${i}?app=${encodeURIComponent(h.id)}&state=${w({tx:g,back:_})}`)}async function _r(e,t,n,r){let i=n.id,a=t.operatorApp??!1;if(!/^[a-z0-9_-]+$/.test(r.pathname.split(`/`)[2]))return;let o=a?`*`:t.session?.user.id??`anonymous`,s=t.integrations[i];if(!s)return j(`Unknown integration "${i}"; run coder agent integrations list to see them`,404);let c=t.config.publicUrl;if(!c)return j(`PUBLIC_URL is not set on this server; set it to the address platforms should call and restart`,400);t.fetch,t.now?.();let l=k(r.searchParams.get(`state`)),u=r.searchParams.get(`app`),d=l?.tx?await I(t,l.tx,`install`,o):void 0;if(!d||u&&u!==d)return j(`This installation link is invalid, expired, or already used`,403);let f=await t.store.get(`app`,u??d);if(!f)return j(`This app is not known to this server; create it first`,400);let p=N(t.config,f.credentials);return O(s.app.installUrl(f,p,{publicUrl:c,state:r.searchParams.get(`state`)??w({})}))}async function vr(e,t,n,r){let i=n.id,a=t.operatorApp??!1;if(!/^[a-z0-9_-]+$/.test(r.pathname.split(`/`)[2]))return;let o=a?`*`:t.session?.user.id??`anonymous`,s=t.integrations[i];if(!s)return j(`Unknown integration "${i}"; run coder agent integrations list to see them`,404);let c=t.config.publicUrl;if(!c)return j(`PUBLIC_URL is not set on this server; set it to the address platforms should call and restart`,400);let l=t.fetch??fetch,u=t.now?.()??Date.now(),d=k(r.searchParams.get(`state`)),f=r.searchParams.get(`app`),p=d?.tx?await I(t,d.tx,`install`,o):void 0;if(!p||f&&f!==p||!await bt(t,d.tx,`install`,o,p))return j(`This installation link is invalid, expired, or already used`,403);let m=await t.store.get(`app`,f??p),h=d?.link?await t.store.get(`installation`,d.link):void 0,g=m??(h&&await ke(t,h,i));if(!g)return d&&!d.link?j(`Connected.`):j(`This install does not match any app on this server; create the app first`,400);let _=N(t.config,g.credentials),v=await s.app.installCallback(e,{app:g,credentials:_,publicUrl:c,fetch:l,connect:Me(t,g,c)}).catch(e=>j(e instanceof Error?e.message:String(e),400));if(v instanceof Response)return v;let y=`${g.id}:${v.platformInstallId}`,b=t.session;v.user&&b&&t.auth&&await t.auth.link(b.user,i,v.user.id,{organizations:b.organizations.map(e=>e.id),...v.user.token?{token:A(t.config,v.user.token)}:{}});let x=await t.store.get(`installation`,y),S={...x,id:y,app:g.id,integration:i,account:v.account??x?.account??h?.account??{login:`unknown`},...v.token?{token:A(t.config,v.token)}:{},...v.installer?{installer:v.installer}:{},createdAt:x?.createdAt??u};delete S.deletedAt;let C=h&&!h.deletedAt?h:void 0;C&&(S=ht(S,C.integration,C.id));try{await t.store.put(`installation`,y,S)}catch{return j(`This ${i} installation is already connected to another workspace; disconnect it there first`,409)}if(C&&await t.store.put(`installation`,C.id,ht(C,i,y)),s.renew){let e=await(await import(`./store-DzqXS2wT.js`).then(e=>e.q)).renewInstallation({...t,fetch:l},g,v.platformInstallId).then(()=>void 0,e=>e instanceof Error?e.message:String(e));if(e)return j(`Connected, but ${i} did not start sending events yet. ${e}. Coder tries again within the hour.`,502)}let ee=ft(d?.back);return ee?O(`${c.replace(/\/$/,``)}${ee}`):v.response}const Q=(e,t=200)=>ee(`<title>Coder</title><p>${S(e)}</p>`,t);function yr(e,t,n){return n&&t.organizations.some(e=>e.id===n)?{...On(e,n),session:t}:void 0}async function br(e,t){let n=await e.store.get(`installation`,t);return n&&!n.deletedAt?e.store.get(`app`,n.app):void 0}async function xr(e,t,n,r){let i=t.linkContext,a=i.session,o=e=>{let t=et(i,e);return t&&a.organizations.some(e=>e.id===t)?{...On(i,t),session:a}:i},s=r.searchParams.get(`token`)??``,c=o(s);if(await I(c,s,`link`,a.user.id))return await At(e,void 0,t.dashboardHosts)??new Response(`UI is not built`,{status:503});let l=await Le(c,s,`link-start`,a.user.id);if(!l)return new Response(`This link is invalid or has expired.`,{status:400});let u=await L(c,`link`,a.user.id,l,3e5);return O(`/connect?token=${encodeURIComponent(u)}`)}async function Sr(e,t,n,r){let i=t.linkContext,a=i.session,o=e=>{let t=et(i,e);return t&&a.organizations.some(e=>e.id===t)?{...On(i,t),session:a}:i},s=await e.json().catch(()=>({})),c=typeof s.token==`string`?await Le(o(s.token),s.token,`link`,a.user.id):void 0;if(!c)return T({error:`This link is invalid or has expired.`},400);let l=JSON.parse(c);return await t.auth.link(a.user,l.platform,l.platformUserId,{organizations:a.organizations.map(e=>e.id)})===`taken`?T({error:`That platform account is connected to someone else.`},409):T({ok:!0,...l})}async function Cr(e,t,n,r){let i=t.integrations[n.integration].auth.user,a=t.config.publicUrl,o=t.linkContext.session,s=r.searchParams.get(`installation`)??``,c=yr(t,o,s?await t.installationOrganization?.(s):void 0);if(!c)return Q(`Only members of the workspace this agent works for can link here.`,403);let l=await br(c,s);if(!l)return Q(`This installation is no longer connected.`,404);let u=await L(c,`link-oauth`,o.user.id,s);return O(i.authorizeUrl(N(t.config,l.credentials),{publicUrl:a,state:u}))}async function wr(e,t,n,r){let i=t.integrations[n.integration],a=i.auth.user,o=t.config.publicUrl,s=t.linkContext.session,c=r.searchParams.get(`state`)??``,l=yr(t,s,et(t,c)),u=l&&await Le(l,c,`link-oauth`,s.user.id),d=l&&u?await br(l,u):void 0;if(!l||!d)return Q(`This link is invalid or has expired.`,400);let f=await a.exchange(e,N(t.config,d.credentials),{publicUrl:o,fetch:t.fetch??fetch}).catch(e=>e instanceof Error?e:Error(String(e)));return f instanceof Error?Q(f.message,400):await t.auth.link(s.user,i.id,f.id,{organizations:s.organizations.map(e=>e.id),...f.token?{token:A(t.config,f.token)}:{}})===`taken`?Q(`That ${i.id} account is connected to someone else.`,409):Q(`Linked ${f.login??f.id} on ${i.id} to your Coder account. Mention the agent again to start.`)}const Tr=Y.object({installation:Y.string().check(Y.minLength(1)),integration:Y.string().check(Y.minLength(1)),token:Y.string().check(Y.minLength(1)),account:Y.optional(Y.string())});async function Er(e,t){let n;try{n=await e.json()}catch{return new Response(`Invalid JSON`,{status:400})}let r=Tr.safeParse(n);if(!r.success)return new Response(`Invalid connection`,{status:400});let{installation:i,integration:a,token:o,account:s}=r.data,c=await t.store.get(`installation`,i);if(!c||c.deletedAt)return new Response(`Unknown installation`,{status:404});let l={kind:`oauth`,token:A(t.config,o),...s?{account:s}:{}};return await Wt(t.store,`installation`,i,{connections:{...c.connections,[a]:l}}),T({ok:!0})}async function Dr(e,t,n,r){let i=await t.store.get(`app`,n);if(!i)return T({error:`Unknown app`},404);let a=t.config.publicUrl;if(!a)return T({error:`PUBLIC_URL is not set on this server`},400);let o=await L(t,`install`,t.session?.user.id??`anonymous`,i.id),s=w({tx:o,...r?{back:r}:{}});return T({url:`${a.replace(/\/$/,``)}/install/${i.integration}?app=${encodeURIComponent(i.id)}&state=${s}`})}async function Or(e,t,n,r){let i=r.searchParams.get(`agent`),a=t.serverOrganizationId,[o,s]=await Promise.all([t.store.list(`app`),a!==void 0&&a!==t.organizationId&&t.scope?t.scope(a).store.list(`app`).then(e=>e.map(({id:e,value:t})=>({id:e,value:{...t,builtin:!0}}))):[]]),c=[...o,...s];return T(c.filter(({value:e})=>!i||e.agent===i).map(({id:e,value:t})=>{let{credentials:n,...r}=t;return{id:e,value:r}}))}async function kr(e,t,n,r){let i=r.searchParams.get(`agent`),[a,o]=await Promise.all([t.store.list(`installation`),i?t.store.list(`app`):[]]),s=new Set(o.filter(({value:e})=>e.agent===i).map(({id:e})=>e));return T(a.filter(({value:e})=>!i||s.has(e.app)).map(({id:e,value:t})=>{let{token:n,connections:r,...i}=t;return{id:e,value:i}}))}function Ar(e){return T(Object.values(e.integrations).map(e=>({id:e.id,name:e.name,brand:e.brand,description:e.description,installLabel:e.installLabel??`Connect ${e.id}`,organizationApps:e.organizationApps===!0,events:Object.fromEntries(Object.entries(e.events).map(([e,{description:t,noisy:n,addressed:r}])=>[e,{description:t,...n?{noisy:n}:{},...r?{addressed:r}:{}}])),presets:e.tools.presets,repositories:!!e.repos})))}async function jr(e){let t=new Map;for(let{value:n}of await e.store.list(`installation`)){let r=e.integrations[n.integration];if(n.deletedAt||!r?.repos)continue;let i=await e.store.get(`app`,n.app);if(i)try{let a=await r.auth.token(n.token?{...n,token:N(e.config,n.token)}:n,N(e.config,i.credentials));for(let e of await r.repos.list(n,a))t.has(e)||t.set(e,{repo:e,integration:r.id})}catch{}}return T([...t.values()].sort((e,t)=>e.repo.localeCompare(t.repo)))}async function Mr(e,t){let n=(await e.store.list(`installation`)).filter(({value:t})=>!t.deletedAt&&e.integrations[t.integration]?.repos),r=new Map((await dn(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=i.token?{...i,token:N(e.config,i.token)}:i,o=await n.auth.token(r,N(e.config,a.credentials));if((await n.repos.list(r,o)).includes(t))return{contents:n,token:o,app:a,installation:i}}catch{}}}async function Nr(e,t,n){let r=await Mr(e,t);if(!r)return T({error:`No installed app can read ${t}`},400);let i=await r.contents.repos.listDir(t,ct,r.token,n).catch(()=>[]),a=await Promise.all(i.map(async i=>{let a=await r.contents.repos.readFile(t,`${ct}/${i}/agent.json`,r.token,n).catch(()=>void 0);if(a===void 0)return;let o={};try{o=JSON.parse(a)}catch{}let s=await U(e.store,i),c=s?.source===`repo`&&s.repo===t,l=c?await G(e.store,i):void 0;return{id:i,name:typeof o.name==`string`?o.name:i,...typeof o.description==`string`?{description:o.description}:{},...c?{version:s.currentVersion,...l?.source?{commit:l.source.commit}:{}}:{},...s&&!c?{taken:!0}:{}}}));return T({repo:t,agents:a.filter(Boolean)})}async function Pr(e,t,n,r){let i=r.searchParams.get(`repo`);return i?Nr(t,i,r.searchParams.get(`ref`)||`HEAD`):T({error:`repo is required`},400)}async function Fr(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 T({error:`repo is required, ref must be a string and agents a list of ids`},400);try{let e=await Mr(t,i.repo);if(!e)return T({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 U(t.store,e);if(n&&(n.source!==`repo`||n.repo!==i.repo))return T({error:`Agent id "${e}" is already taken`},409)}let o=await mt(t.store,e.contents,i.repo,n,e.token,(t.now??Date.now)(),{slugs:r});return await ze(t,o),T({imported:o.map(e=>e.agent)})}catch(e){return T({error:e instanceof Error?e.message:String(e)},400)}}async function Ir(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 Lr(e,t,n){let r=await Bt(e.store,t);return await Tn(e.store,n,t,r)?Bt(e.store,t):r}async function $(e,t){let n=(e.now??Date.now)(),r=e.local?await le(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)??{}):Lr(e,t,n)}}async function Rr(e,t,n,r){let i=n.slug;if(n.version&&Number(n.version),n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return D();let{now:a,local:o,loadCurrent:s}=await $(t,i);if(!o&&t.store.listAgentSummaries&&(await at(t.store,a),re(r)))return T(await Ur(t,r));let c=o??(t.store.listAgentSummaries?await t.store.listAgentSummaries():await wt(t.store));if(!o&&!t.store.listAgentSummaries&&await at(t.store,a,c)&&(c=await wt(t.store)),re(r))return T(await Ur(t,r,c));let l;return T(await Promise.all(c.map(async({record:e,version:n})=>{e.source===`repo`&&e.repo&&(l??=t.store.list(`app`));let r=await Ir(t,e,n,l);return{...e,definition:n?.definition,...r?{sourceUrl:r}:{}}})))}async function zr(e,t,n,r){let i=n.slug;if(n.version&&Number(n.version),n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return D();let{now:a,local:o,loadCurrent:s}=await $(t,i),c=E(r,10,50),l=ie(r),[u,d]=await Promise.all([o?s().then(e=>e.record):U(t.store,i),o?Promise.resolve(o.flatMap(({version:e})=>e?[{value:e}]:[])):t.store.listVersions?.(i,c+1,l)]);return u?T(await Wr(t,u,c,l??u.currentVersion+1,d)):T({error:`No agent named "${i}"`},404)}async function Br(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 D();let{now:o,local:s,loadCurrent:c}=await $(t,i),l=s?s.find(({version:e})=>e?.version===a)?.version:await G(t.store,i,a);return l?T(l):T({error:`No version ${a} for agent "${i}"`},404)}async function Vr(e,t,n,r){let i=n.slug;if(n.version&&Number(n.version),n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return D();let{now:a,local:o,loadCurrent:s}=await $(t,i),c=r.searchParams.get(`versions`)!==`0`,l=r.searchParams.get(`content`)!==`0`,[{record:u,version:d},f]=await Promise.all([!l&&!o&&t.store.listAgentSummaries&&!v()[i]?t.store.listAgentSummaries({slug:i}).then(e=>e[0]??{}):s(),c?o?o.flatMap(({version:e})=>e?[{value:e}]:[]):t.store.listVersions?t.store.listVersions(i):t.store.list(`agentversion`,{prefix:`${i}:`}):[]]);if(!u)return T({error:`No agent named "${i}"`},404);let p=f.map(({value:e})=>{let{systemPrompt:t,files:n,...r}=e;return r}),m=await Ir(t,u,d);return T({...u,...d?{definition:d.definition,...l&&`systemPrompt`in d?{systemPrompt:d.systemPrompt,...d.files?{files:d.files}:{}}:{}}:{},...m?{sourceUrl:m}:{},...c?{versions:p}:{}})}const Hr={builtin:`builtin`,dashboard:`upload`,repository:`repo`};async function Ur(e,t,n){let r=E(t,24,100),i=ie(t),a=t.searchParams.get(`q`)?.trim().toLowerCase(),o=Hr[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).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=ce(_,r,e=>e.record.id);return{...v,...c?{connectable:[...d,...p.map(e=>({...e,value:{...e.value,builtin:!0}}))].filter(({value:e})=>e.builtin&&!h.has(e.id)).map(({value:e})=>({id:e.id,integration:e.integration}))}:{},items:await Promise.all(v.items.map(async({record:t,version:n,ids:r})=>{let i=await Ir(e,t,n,u);return{...t,definition:n?.definition,...i?{sourceUrl:i}:{},platforms:r.map(e=>({id:e,state:g(t.id,e)}))}}))}}async function Wr(e,t,n,r,i){let a=r-n-2,o=(i??await e.store.list(`agentversion`,{prefix:`${t.id}:`,...a>0?{after:st(t.id,a)}:{},limit:n+1})).map(({value:e})=>{let{systemPrompt:t,files:n,definition:r,...i}=e;return i}).filter(e=>e.version<r).reverse();return ce(o,n,e=>e.version)}function Gr(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 Kr(e,t,n,r){let i=n.slug;if(n.version&&Number(n.version),n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return D();let{now:a,local:o,loadCurrent:s}=await $(t,i),c=await e.json().catch(()=>void 0);try{let e=x({[i]:c})[i];if(!e||typeof e!=`object`)throw Error(`settings must be an object`);let{record:n,version:r}=await s();if(!n||!r)throw Error(`No agent named "${i}".`);return Sn({...n,settings:void 0},r,e,t.integrations),t.local?(await xn(t,t=>{t.agents={...t.agents,[i]:e}}),await le(t.store,t.local.cwd,t.integrations),T(await U(t.store,i))):T(await ve(t.store,i,e,(t.now??Date.now)()))}catch(e){return T({error:e instanceof Error?e.message:String(e)},400)}}async function qr(e,t,n,r){let i=n.slug;if(n.version&&Number(n.version),n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return D();let{now:a,local:o,loadCurrent:s}=await $(t,i),{record:c}=await s();if(!c)return T({error:`No agent named "${i}"`},404);if(c.source===`builtin`)return T({error:`Built-in agents cannot be deleted.`},400);if(t.local&&!await $e(t.local.cwd,t.integrations,i))return T({error:`Delete .coder/agents/${i} in the repo`},409);for(let{id:e}of await t.store.list(`agentversion`,{prefix:`${i}:`}))await t.store.delete(`agentversion`,e);return await t.store.delete(`agent`,i),T({ok:!0})}async function Jr(e,t,n,r){let i=n.slug;if(n.version&&Number(n.version),n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return D();let{now:a,local:o,loadCurrent:s}=await $(t,i),c=await e.json().catch(()=>void 0);if(!c||typeof c.systemPrompt!=`string`||c.files!==void 0&&!Gr(c.files)||c.name!==void 0&&typeof c.name!=`string`||c.description!==void 0&&typeof c.description!=`string`)return T({error:`definition and systemPrompt are required; files must contain strings`},400);try{b([i]);let[e]=y({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 U(t.store,i):void 0,r=t.local&&n?await G(t.store,i):void 0,a=c.files;t.local&&(await Ft(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 le(t.store,t.local.cwd,t.integrations));let o=t.local?void 0:await Ot(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 G(t.store,i),l=o?.unchanged??Bn(r&&{...r,createdAt:0},{...s,createdAt:0});await ze(t,[s]);let u=o?.record??await U(t.store,i);return T({...u,definition:s.definition,version:s.version,unchanged:l})}catch(e){return T({error:e instanceof Error?e.message:String(e)},400)}}async function Yr(e,t,n,r){let a=n.id,o=Number(r.searchParams.get(`after`)??-1),s=Number.isFinite(o)?o:-1;r.searchParams.has(`limit`)&&E(r,500,2e3);let c=await t.store.get(`task`,a);if(!c||t.local&&c.handle?.startsWith(`cli:`)&&c.task.flow==="default"){let n=c?.task.cwd??t.local?.cwd;if(!n||!Mt(n,a,!1))return T({error:`No task "${a}"`},404);{let t=Number(e.headers.get(`last-event-id`)??s);return Qr(e,Number.isFinite(t)?t:s,async e=>{let t=Mt(n,a);if(!t)return;let r=_(n,a),o=Math.max(t.finishedAt??0,Date.parse(r?.resumedAt??r?.createdAt??``)||0),s=P.has(t.status)&&!t.error&&t.status!==`cancelled`&&(!t.result||(Ln.statSync(q.join(i(n,a),`result.json`),{throwIfNoEntry:!1})?.mtimeMs??0)<o);return{status:t,lines:yn(n,a,e,500),pendingResult:s}})}}let l=Number(e.headers.get(`last-event-id`)??s);return Qr(e,Number.isFinite(l)?l:s,async e=>{let n=await t.store.get(`task`,a);if(!n)return;let r=n.task.runner===`github-actions`&&n.handle,i=r&&P.has(n.status)?(await(await We(t,n.task))?.status(n.handle).catch(()=>void 0))?.state===`running`:!1;return{status:n,lines:([`running`,`waiting`].includes(n.status)||r)&&n.handle?await un(t,n,e,500).catch(()=>Re(t.store,a,e,500)):await Re(t.store,a,e,500),pendingLogs:i}})}const Xr=1e3;function Zr(e){let{status:t,approval:n,answer:r,result:i,error:a,startedAt:o,finishedAt:s}=e;return{status:t,approval:n??null,answer:r,result:i,error:a,startedAt:o,finishedAt:s,turns:Ze(e).turns}}function Qr(e,t,n){let r=new TextEncoder,i=Date.now()+5e4,a=t,o=``,s=!1,c=new ReadableStream({async start(t){let c=e=>t.enqueue(r.encode(e));c(`retry: ${Xr}\n\n`);try{for(;!s&&!e.signal.aborted&&Date.now()<i;){let e=await n(a);if(!e)break;let{status:t,lines:r,pendingLogs:i,pendingResult:s}=e;for(let e of r)c(`id: ${e.seq}\nevent: log\ndata: ${JSON.stringify(e)}\n\n`),a=e.seq;let l=JSON.stringify(Zr(t)),u=i||s||P.has(t.status)&&r.length===500;if(l!==o&&!u&&(c(`event: status\ndata: ${l}\n\n`),o=l),r.length!==500){if(P.has(t.status)&&!u){c(`event: end
|
|
1
|
+
import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{$ as t,At as n,K as r,Qt as i,Tn as a,U as o,W as s,bn as c,dt as l,et as u,kt as d,lt as f,q as p,tt as m,vt as h,xt as g,zt as _}from"./dispatch-BKeAch9E.js";import{i as v,n as y,r as b,u as x}from"./load-BpEsAn51.js";import{c as S,d as C,l as ee,n as te}from"./integrations-BAgdVDhj.js";import{c as ne}from"./models-_5LVGC3m.js";import{o as w}from"./local-H3uvqEbq.js";import{a as T,d as E,f as re,l as D,n as ie,o as ae,p as O,r as k,s as oe,t as se,u as ce}from"./http-Bkg_OQ6r.js";import{$ as le,$t as ue,A as de,An as fe,At as pe,B as me,Bn as he,Bt as ge,C as _e,Cn as ve,Ct as ye,D as be,Dn as xe,Dt as Se,E as Ce,En as we,Et as Te,F as Ee,Fn as De,G as Oe,Gn as ke,Gt as Ae,H as je,Hn as Me,Ht as Ne,I as Pe,In as A,It as Fe,J as Ie,Jn as Le,Jt as Re,K as ze,Kn as j,Kt as Be,L as Ve,Lt as He,M as Ue,Mn as We,Mt as Ge,N as Ke,Nn as qe,Nt as Je,O as Ye,On as Xe,Ot as M,P as Ze,Pn as N,Pt as Qe,Q as $e,Qn as et,Qt as tt,R as nt,Rt as rt,S as it,Sn as at,St as ot,T as P,Tn as st,Tt as F,U as ct,Un as lt,Ut as ut,V as dt,Vn as ft,Vt as pt,W as mt,Wn as ht,Wt as gt,X as _t,Xn as I,Xt as vt,Y as yt,Yn as bt,Yt as xt,Z as St,Zn as L,Zt as Ct,_ as R,_n as wt,_t as Tt,an as Et,b as Dt,bn as Ot,bt as kt,cn as At,ct as jt,d as Mt,dt as Nt,en as Pt,et as Ft,f as It,fn as Lt,ft as Rt,g as zt,gn as Bt,gt as Vt,h as Ht,hn as z,ht as Ut,i as Wt,in as Gt,it as Kt,j as qt,jn as Jt,jt as Yt,k as Xt,kn as Zt,kt as Qt,l as $t,ln as en,m as tn,mn as nn,mt as rn,nn as an,o as on,on as sn,ot as cn,pn as B,pt as ln,qn as V,qt as un,r as dn,rn as fn,rt as pn,s as mn,sn as hn,st as gn,t as _n,tn as vn,u as yn,v as H,vn as U,vt as bn,w as xn,wn as Sn,wt as Cn,x as wn,xn as Tn,xt as En,y as W,yn as G,yt as K,z as Dn,zn as On,zt as kn}from"./store-B3ZHoBJY.js";import{n as An,r as jn}from"./env-CRf6wkM2.js";import{l as Mn}from"./schema-CU2iFkp8.js";import{r as Nn,t as Pn}from"./migrate-N-85_N7J.js";import{n as Fn,r as In}from"./usage-Cb8Dtv9V.js";import q from"node:path";import J from"node:process";import*as Y from"zod/mini";import Ln from"node:fs";import{randomBytes as Rn,randomUUID as zn}from"node:crypto";import X from"node:fs/promises";import{isDeepStrictEqual as Bn}from"node:util";import Vn from"node:http";import{sql as Hn}from"drizzle-orm";async function Un(e){try{return await X.readdir(e,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}}async function Z(e){try{return await X.lstat(e),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}}async function Wn(e,t){if(e===t||!await Z(e))return 0;let n=await Un(e),r=n.filter(e=>e.isDirectory()).length;if(!await Z(t))return await a(e,t),r;for(let r of n)await a(q.join(e,r.name),q.join(t,r.name));return await X.rmdir(e),r}async function Gn(e){let t=q.dirname(e),n=q.basename(e);for(let e of await Un(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(q.join(t,e.name)).catch(e=>{if(e.code!==`ENOENT`)throw e})}}async function Kn(e,t){if(await Gn(e),e===t||!await Z(e))return 0;if(!await Z(t))return await a(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}}:{}},o=`${t}.${process.pid}.${zn()}.tmp`;try{await X.writeFile(o,`${JSON.stringify(i)}\n`,{mode:384,flag:`wx`}),await X.rename(o,t),await X.unlink(e)}finally{await X.rm(o,{force:!0})}return 1}async function qn(){let e=d(),t=n(`state`),r=d(`archive`),i=d(`flows-archived`),a=d(`usage.json`),o=d(`runner`,`usage.json`),s={from:n(`checkouts`),to:d(`checkouts`)},c={from:n(`update-check.json`),to:d(`update-check.json`)},l={cache:e,tasks:0,flows:0,files:0},u=(await Un(t)).filter(e=>e.isDirectory()).map(e=>({archive:n(`state`,e.name,`archive`),flows:n(`state`,e.name,`flows-archived`),usage:n(`state`,e.name,`usage.json`),runnerUsage:n(`state`,e.name,`runner`,`usage.json`)}));await Gn(a),await Gn(o);for(let e of u)l.tasks+=await Wn(e.archive,r),l.flows+=await Wn(e.flows,i),l.files+=await Kn(e.usage,a),l.files+=await Kn(e.runnerUsage,o);return await Wn(s.from,s.to),l.files+=await Kn(c.from,c.to),l}async function Jn(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 Yn(e){let t=(e.now??Date.now)(),n=e.health,{body:r,status:i}=n&&t-n.at<5e3?n:await Xn(e);e.health=i===200?{at:n&&t-n.at<5e3?n.at:t,body:r,status:i}:void 0;let a=Math.max(0,t-(e.limits?.startedAt??t))/1e3;return T({...r,uptime:a},i,{"cache-control":`no-store`})}async function Xn(e){let t=e.config.store===`postgres`?`down`:`none`,n={online:0,total:0},r=!0;try{if(e.config.store===`postgres`){if(!e.databaseHealth)throw Error(`Database health probe is unavailable`);await e.databaseHealth(),t=`ok`}n=e.healthRunners?await e.healthRunners():await Jn(e)}catch{r=!1,e.config.store===`postgres`&&(t=`down`)}return{body:{ok:r,version:c(),db:t,runners:n},status:r?200:503}}async function Zn(e){let t=(e.now??Date.now)();if(e.queue.metrics&&!e.local)return{...await e.queue.metrics(e.organizationId,t-864e5),runnersOnline:(await Jn(e)).online,requests:e.limits?.requests??0,rateLimitRejections:e.limits?.rejections??0};let n=await e.queue.list(e.organizationId),r=e.local?[...It(e.local.cwd,!1),...It(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 Jn(e)).online,requests:e.limits?.requests??0,rateLimitRejections:e.limits?.rejections??0}}async function Qn(e,t,n,r){if(!t.auth)return T({mode:Fe(t),organization:{id:t.organizationId},server:$n(t)});let i=t.session;return T({mode:Fe(t),user:i.user,organization:i.organizations.find(e=>e.id===i.organizationId)??null,organizations:i.organizations,manageMembersUrl:`${t.auth.issuer}/auth/onboarding`,server:$n(t)})}function $n(e){return{name:e.config.name??`Coder`,store:e.config.store,...e.config.publicUrl?{url:e.config.publicUrl}:{},subscriptions:{claude:!!e.config.subscriptions?.claude,codex:!!e.config.subscriptions?.codex}}}async function er(e,t,n,r){let i=e.headers.get(`content-type`)??``,a=i.includes(`application/json`)?await e.json().catch(()=>void 0):await e.formData().then(e=>Object.fromEntries(e.entries()),()=>void 0);if(!a||typeof a!=`object`)return T({error:`Send the workspace as a form or JSON body.`},400);let o=typeof a.organization==`string`?a.organization:``,s=o?await t.auth.setOrganization(e.headers,o):void 0;if(!s)return T({error:`You are not a member of that workspace.`},403);let{cookies:c,...l}=s,u=i.includes(`application/json`)?T({organization:l}):O(`/dash`,303);for(let e of c)u.headers.append(`set-cookie`,e);return u}async function tr(e,t,n,r){let i=t.session.user.id;n.id;let a=(await e.json().catch(()=>({}))).engine??``;if(!or.has(a)||!t.config.subscriptions?.[a])return T({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 T({error:`Sign-in cannot run on the ${t.config.runner} runner.`},409);let s=`login-${Rn(12).toString(`base64url`)}`,c=he(s,t.organizationId,0),l={owner:i,engine:a,state:`starting`,tokenHash:c.hash,runner:o.kind,createdAt:sr(t),expiresAt:sr(t)+ar};await cr(t,s,l);let u;try{let e=await o.start({id:s},{CODER_SERVER:t.config.publicUrl??``,CODER_TASK_TOKEN:c.token,CODER_LOGIN:a}),n=await t.store.patchLogin(s,{handle:e},{tokenHash:l.tokenHash});if(!n)return await o.stop(e).catch(()=>{}),T({error:`This sign-in is gone. Start again.`},409);u=n}catch(e){return await t.store.delete(`login`,s),T({error:e instanceof Error?e.message:String(e)},502)}return T(lr(s,u),201)}async function nr(e,t,n,r){t.session.user.id;let i=n.id??``,a=i&&!i.includes(`/`)?await ur(t,i):void 0;return a?T(lr(i,a)):T({error:`This sign-in is gone. Start again.`},404)}async function rr(e,t,n,r){t.session.user.id;let i=n.id??``,a=i&&!i.includes(`/`)?await ur(t,i):void 0;if(!a)return T({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:A(t.config,s)},{state:`open`,tokenHash:a.tokenHash})?T({error:`This sign-in is not waiting for a code.`},409):T({ok:!0})}async function ir(e,t,n,r){t.session.user.id;let i=n.id??``,a=i&&!i.includes(`/`)?await ur(t,i):void 0;return a?(await t.store.delete(`login`,i),a.handle&&await t.runners[a.runner]?.stop(a.handle).catch(()=>{}),T({ok:!0})):T({error:`This sign-in is gone. Start again.`},404)}const ar=6e5,or=new Set([`claude`,`codex`]),sr=e=>(e.now??Date.now)();function cr(e,t,n){return e.store.put(`login`,t,n,{ttlMs:Math.max(1,n.expiresAt-sr(e))})}function lr(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}:{},...t.label?{label:t.label}:{}}}async function ur(e,t){let n=await e.store.get(`login`,t);return n&&n.owner===e.session?.user.id?n:void 0}async function dr(e,t,n,r){let i=n.id,a=t.callbackLogin,o=Date.now()+25e3;for(;!a.input&&Date.now()<o&&!e.signal.aborted;){await new Promise(e=>setTimeout(e,250));let e=await t.store.get(`login`,i);if(!e)return new Response(`Unauthorized`,{status:401});a=e}if(!a.input)return T({});let s=await t.store.patchLogin(i,{input:null},{input:a.input,tokenHash:a.tokenHash});return T(s?{code:N(t.config,a.input)}:{})}async function fr(e,t,n,r){n.id;let i=t.callbackLogin;return T({engine:i.engine})}async function pr(e,t,n,r){let i=n.id,a=t.callbackLogin,o=await e.json().catch(()=>({}));if(a.state===`done`||a.state===`failed`)return T({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),T({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 T({error:`Invalid sign-in result`},400);let n=`${a.engine}-subscription`,r=o.result?.account;return await t.store.completeLogin(i,a.tokenHash,n,{...De(t.config,{env:c}),engine:a.engine,createdAt:(t.now??Date.now)(),...r?.email||r?.plan?{account:{...typeof r.email==`string`?{email:r.email}:{},...typeof r.plan==`string`?{plan:r.plan}:{}}}:{}})?T({ok:!0}):T({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(a.state===`starting`?await t.store.patchLogin(i,{...l,state:`open`},{state:`starting`,tokenHash:a.tokenHash})??await t.store.patchLogin(i,l,{...s,state:[`open`,`verifying`]}):await t.store.patchLogin(i,l,s))?T({ok:!0}):T({error:`This sign-in changed. Try again.`},409)}async function mr(e,t,n,r){let i=n.id,a=t.operatorApp??!1;if(!/^[a-z0-9_-]+$/.test(r.pathname.split(`/`)[2]))return;let o=a?`*`:t.session?.user.id??`anonymous`,s=t.integrations[i];if(!s)return j(`Unknown integration "${i}"; run coder agent integrations list to see them`,404);let c=t.config.publicUrl;if(!c)return j(`PUBLIC_URL is not set on this server; set it to the address platforms should call and restart`,400);t.fetch,t.now?.();let l=V(r.searchParams);if(!l)return j(`Setup link is missing or malformed; start again from the agent's Platforms tab`,400);if(!l.definition.integrations[i])return j(`This agent declares no ${i} integration in its agent.json`,400);if(l.state.public&&!a)return j(`Only the server operator creates public apps`,403);let u=lt(i,l.state),d=l.state.tx?await I(t,l.state.tx,`create`,o)===u?l.state.tx:void 0:await L(t,`create`,o,u);if(!d)return j(`This app creation link is invalid, expired, or already used`,403);let f={...l.state,tx:d};return s.app.createPage({publicUrl:c,state:f,definition:l.definition,encodedState:w(f)})}async function hr(e,t,n,r){let i=n.id,a=t.operatorApp??!1;if(!/^[a-z0-9_-]+$/.test(r.pathname.split(`/`)[2]))return;let o=a?`*`:t.session?.user.id??`anonymous`,s=t.integrations[i];if(!s)return j(`Unknown integration "${i}"; run coder agent integrations list to see them`,404);let c=t.config.publicUrl;if(!c)return j(`PUBLIC_URL is not set on this server; set it to the address platforms should call and restart`,400);let l=t.fetch??fetch,u=t.now?.()??Date.now(),d=k(r.searchParams.get(`state`)),f=V(r.searchParams)??(d&&V(new URLSearchParams(Object.entries(d).filter(([,e])=>e!==void 0))))??void 0;if(!f)return j(`Setup state was lost between the platform and this server; start again`,400);if(!f.state.tx||!await bt(t,f.state.tx,`create`,o,lt(i,f.state)))return j(`This app creation link is invalid, expired, or already used`,403);let p=await s.app.createCallback(e,{publicUrl:c,...f,fetch:l}).catch(e=>j(`Creating the ${i} app failed: ${e instanceof Error?e.message:e}`,400));if(p instanceof Response)return p;let m={id:`${i}:${p.platformAppId}`,integration:i,agent:f.state.agent,name:p.name,...f.state.repo?{agentsRepo:f.state.repo}:{},...f.state.repo?{branch:f.state.branch??`main`}:{},...a?{builtin:!0}:{},credentials:A(t.config,p.credentials),createdAt:u};if(await t.store.put(`app`,m.id,m),a)return j(`Created ${p.name}. Every workspace on this server can now connect it from its dashboard.`);let h=await L(t,`install`,o,m.id),g=`/dash/agents/${encodeURIComponent(m.agent)}/platforms`;return O(`${c}/install/${i}?app=${encodeURIComponent(m.id)}&state=${w({tx:h,back:g})}`)}async function gr(e,t,n,r){let i=n.id,a=t.operatorApp??!1;if(!/^[a-z0-9_-]+$/.test(r.pathname.split(`/`)[2]))return;let o=a?`*`:t.session?.user.id??`anonymous`,s=t.integrations[i];if(!s)return j(`Unknown integration "${i}"; run coder agent integrations list to see them`,404);let c=t.config.publicUrl;if(!c)return j(`PUBLIC_URL is not set on this server; set it to the address platforms should call and restart`,400);let l=t.fetch??fetch,u=t.now?.()??Date.now(),d=new URLSearchParams(await e.clone().text()),f=k(r.searchParams.get(`state`)),p=V(r.searchParams)??(f&&V(new URLSearchParams(Object.entries(f).filter(([,e])=>e!==void 0))))??(d&&V(d));if(!p)return j(`Setup state was lost between the platform and this server; start again`,400);if(!p.state.tx||!await bt(t,p.state.tx,`create`,o,lt(i,p.state)))return j(`This app creation link is invalid, expired, or already used`,403);let m=await s.app.createCallback(e,{publicUrl:c,...p,fetch:l}).catch(e=>j(`Creating the ${i} app failed: ${e instanceof Error?e.message:e}`,400));if(m instanceof Response)return m;let h={id:`${i}:${m.platformAppId}`,integration:i,agent:p.state.agent,name:m.name,...p.state.repo?{agentsRepo:p.state.repo}:{},...p.state.repo?{branch:p.state.branch??`main`}:{},...a?{builtin:!0}:{},credentials:A(t.config,m.credentials),createdAt:u};if(await t.store.put(`app`,h.id,h),a)return j(`Created ${m.name}. Every workspace on this server can now connect it from its dashboard.`);let g=await L(t,`install`,o,h.id),_=`/dash/agents/${encodeURIComponent(h.agent)}/platforms`;return O(`${c}/install/${i}?app=${encodeURIComponent(h.id)}&state=${w({tx:g,back:_})}`)}async function _r(e,t,n,r){let i=n.id,a=t.operatorApp??!1;if(!/^[a-z0-9_-]+$/.test(r.pathname.split(`/`)[2]))return;let o=a?`*`:t.session?.user.id??`anonymous`,s=t.integrations[i];if(!s)return j(`Unknown integration "${i}"; run coder agent integrations list to see them`,404);let c=t.config.publicUrl;if(!c)return j(`PUBLIC_URL is not set on this server; set it to the address platforms should call and restart`,400);t.fetch,t.now?.();let l=k(r.searchParams.get(`state`)),u=r.searchParams.get(`app`),d=l?.tx?await I(t,l.tx,`install`,o):void 0;if(!d||u&&u!==d)return j(`This installation link is invalid, expired, or already used`,403);let f=await t.store.get(`app`,u??d);if(!f)return j(`This app is not known to this server; create it first`,400);let p=N(t.config,f.credentials);return O(s.app.installUrl(f,p,{publicUrl:c,state:r.searchParams.get(`state`)??w({})}))}async function vr(e,t,n,r){let i=n.id,a=t.operatorApp??!1;if(!/^[a-z0-9_-]+$/.test(r.pathname.split(`/`)[2]))return;let o=a?`*`:t.session?.user.id??`anonymous`,s=t.integrations[i];if(!s)return j(`Unknown integration "${i}"; run coder agent integrations list to see them`,404);let c=t.config.publicUrl;if(!c)return j(`PUBLIC_URL is not set on this server; set it to the address platforms should call and restart`,400);let l=t.fetch??fetch,u=t.now?.()??Date.now(),d=k(r.searchParams.get(`state`)),f=r.searchParams.get(`app`),p=d?.tx?await I(t,d.tx,`install`,o):void 0;if(!p||f&&f!==p||!await bt(t,d.tx,`install`,o,p))return j(`This installation link is invalid, expired, or already used`,403);let m=await t.store.get(`app`,f??p),h=d?.link?await t.store.get(`installation`,d.link):void 0,g=m??(h&&await ke(t,h,i));if(!g)return d&&!d.link?j(`Connected.`):j(`This install does not match any app on this server; create the app first`,400);let _=N(t.config,g.credentials),v=await s.app.installCallback(e,{app:g,credentials:_,publicUrl:c,fetch:l,connect:Me(t,g,c)}).catch(e=>j(e instanceof Error?e.message:String(e),400));if(v instanceof Response)return v;let y=`${g.id}:${v.platformInstallId}`,b=t.session;v.user&&b&&t.auth&&await t.auth.link(b.user,i,v.user.id,{organizations:b.organizations.map(e=>e.id),...v.user.token?{token:A(t.config,v.user.token)}:{}});let x=await t.store.get(`installation`,y),S={...x,id:y,app:g.id,integration:i,account:v.account??x?.account??h?.account??{login:`unknown`},...v.token?{token:A(t.config,v.token)}:{},...v.installer?{installer:v.installer}:{},createdAt:x?.createdAt??u};delete S.deletedAt;let C=h&&!h.deletedAt?h:void 0;C&&(S=ht(S,C.integration,C.id));try{await t.store.put(`installation`,y,S)}catch{return j(`This ${i} installation is already connected to another workspace; disconnect it there first`,409)}if(C&&await t.store.put(`installation`,C.id,ht(C,i,y)),s.renew){let e=await(await import(`./store-B3ZHoBJY.js`).then(e=>e.q)).renewInstallation({...t,fetch:l},g,v.platformInstallId).then(()=>void 0,e=>e instanceof Error?e.message:String(e));if(e)return j(`Connected, but ${i} did not start sending events yet. ${e}. Coder tries again within the hour.`,502)}let ee=ft(d?.back);return ee?O(`${c.replace(/\/$/,``)}${ee}`):v.response}const Q=(e,t=200)=>ee(`<title>Coder</title><p>${S(e)}</p>`,t);function yr(e,t,n){return n&&t.organizations.some(e=>e.id===n)?{...On(e,n),session:t}:void 0}async function br(e,t){let n=await e.store.get(`installation`,t);return n&&!n.deletedAt?e.store.get(`app`,n.app):void 0}async function xr(e,t,n,r){let i=t.linkContext,a=i.session,o=e=>{let t=et(i,e);return t&&a.organizations.some(e=>e.id===t)?{...On(i,t),session:a}:i},s=r.searchParams.get(`token`)??``,c=o(s);if(await I(c,s,`link`,a.user.id))return await At(e,void 0,t.dashboardHosts)??new Response(`UI is not built`,{status:503});let l=await Le(c,s,`link-start`,a.user.id);if(!l)return new Response(`This link is invalid or has expired.`,{status:400});let u=await L(c,`link`,a.user.id,l,3e5);return O(`/connect?token=${encodeURIComponent(u)}`)}async function Sr(e,t,n,r){let i=t.linkContext,a=i.session,o=e=>{let t=et(i,e);return t&&a.organizations.some(e=>e.id===t)?{...On(i,t),session:a}:i},s=await e.json().catch(()=>({})),c=typeof s.token==`string`?await Le(o(s.token),s.token,`link`,a.user.id):void 0;if(!c)return T({error:`This link is invalid or has expired.`},400);let l=JSON.parse(c);return await t.auth.link(a.user,l.platform,l.platformUserId,{organizations:a.organizations.map(e=>e.id)})===`taken`?T({error:`That platform account is connected to someone else.`},409):T({ok:!0,...l})}async function Cr(e,t,n,r){let i=t.integrations[n.integration].auth.user,a=t.config.publicUrl,o=t.linkContext.session,s=r.searchParams.get(`installation`)??``,c=yr(t,o,s?await t.installationOrganization?.(s):void 0);if(!c)return Q(`Only members of the workspace this agent works for can link here.`,403);let l=await br(c,s);if(!l)return Q(`This installation is no longer connected.`,404);let u=await L(c,`link-oauth`,o.user.id,s);return O(i.authorizeUrl(N(t.config,l.credentials),{publicUrl:a,state:u}))}async function wr(e,t,n,r){let i=t.integrations[n.integration],a=i.auth.user,o=t.config.publicUrl,s=t.linkContext.session,c=r.searchParams.get(`state`)??``,l=yr(t,s,et(t,c)),u=l&&await Le(l,c,`link-oauth`,s.user.id),d=l&&u?await br(l,u):void 0;if(!l||!d)return Q(`This link is invalid or has expired.`,400);let f=await a.exchange(e,N(t.config,d.credentials),{publicUrl:o,fetch:t.fetch??fetch}).catch(e=>e instanceof Error?e:Error(String(e)));return f instanceof Error?Q(f.message,400):await t.auth.link(s.user,i.id,f.id,{organizations:s.organizations.map(e=>e.id),...f.token?{token:A(t.config,f.token)}:{}})===`taken`?Q(`That ${i.id} account is connected to someone else.`,409):Q(`Linked ${f.login??f.id} on ${i.id} to your Coder account. Mention the agent again to start.`)}const Tr=Y.object({installation:Y.string().check(Y.minLength(1)),integration:Y.string().check(Y.minLength(1)),token:Y.string().check(Y.minLength(1)),account:Y.optional(Y.string())});async function Er(e,t){let n;try{n=await e.json()}catch{return new Response(`Invalid JSON`,{status:400})}let r=Tr.safeParse(n);if(!r.success)return new Response(`Invalid connection`,{status:400});let{installation:i,integration:a,token:o,account:s}=r.data,c=await t.store.get(`installation`,i);if(!c||c.deletedAt)return new Response(`Unknown installation`,{status:404});let l={kind:`oauth`,token:A(t.config,o),...s?{account:s}:{}};return await Wt(t.store,`installation`,i,{connections:{...c.connections,[a]:l}}),T({ok:!0})}async function Dr(e,t,n,r){let i=await t.store.get(`app`,n);if(!i)return T({error:`Unknown app`},404);let a=t.config.publicUrl;if(!a)return T({error:`PUBLIC_URL is not set on this server`},400);let o=await L(t,`install`,t.session?.user.id??`anonymous`,i.id),s=w({tx:o,...r?{back:r}:{}});return T({url:`${a.replace(/\/$/,``)}/install/${i.integration}?app=${encodeURIComponent(i.id)}&state=${s}`})}async function Or(e,t,n,r){let i=r.searchParams.get(`agent`),a=t.serverOrganizationId,[o,s]=await Promise.all([t.store.list(`app`),a!==void 0&&a!==t.organizationId&&t.scope?t.scope(a).store.list(`app`).then(e=>e.map(({id:e,value:t})=>({id:e,value:{...t,builtin:!0}}))):[]]),c=[...o,...s];return T(c.filter(({value:e})=>!i||e.agent===i).map(({id:e,value:t})=>{let{credentials:n,...r}=t;return{id:e,value:r}}))}async function kr(e,t,n,r){let i=r.searchParams.get(`agent`),[a,o]=await Promise.all([t.store.list(`installation`),i?t.store.list(`app`):[]]),s=new Set(o.filter(({value:e})=>e.agent===i).map(({id:e})=>e));return T(a.filter(({value:e})=>!i||s.has(e.app)).map(({id:e,value:t})=>{let{token:n,connections:r,...i}=t;return{id:e,value:i}}))}function Ar(e){return T(Object.values(e.integrations).map(e=>({id:e.id,name:e.name,brand:e.brand,description:e.description,installLabel:e.installLabel??`Connect ${e.id}`,organizationApps:e.organizationApps===!0,events:Object.fromEntries(Object.entries(e.events).map(([e,{description:t,noisy:n,addressed:r}])=>[e,{description:t,...n?{noisy:n}:{},...r?{addressed:r}:{}}])),presets:e.tools.presets,repositories:!!e.repos})))}async function jr(e){let t=new Map;for(let{value:n}of await e.store.list(`installation`)){let r=e.integrations[n.integration];if(n.deletedAt||!r?.repos)continue;let i=await e.store.get(`app`,n.app);if(i)try{let a=await r.auth.token(n.token?{...n,token:N(e.config,n.token)}:n,N(e.config,i.credentials));for(let e of await r.repos.list(n,a))t.has(e)||t.set(e,{repo:e,integration:r.id})}catch{}}return T([...t.values()].sort((e,t)=>e.repo.localeCompare(t.repo)))}async function Mr(e,t){let n=(await e.store.list(`installation`)).filter(({value:t})=>!t.deletedAt&&e.integrations[t.integration]?.repos),r=new Map((await dn(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=i.token?{...i,token:N(e.config,i.token)}:i,o=await n.auth.token(r,N(e.config,a.credentials));if((await n.repos.list(r,o)).includes(t))return{contents:n,token:o,app:a,installation:i}}catch{}}}async function Nr(e,t,n){let r=await Mr(e,t);if(!r)return T({error:`No installed app can read ${t}`},400);let i=await r.contents.repos.listDir(t,ct,r.token,n).catch(()=>[]),a=await Promise.all(i.map(async i=>{let a=await r.contents.repos.readFile(t,`${ct}/${i}/agent.json`,r.token,n).catch(()=>void 0);if(a===void 0)return;let o={};try{o=JSON.parse(a)}catch{}let s=await U(e.store,i),c=s?.source===`repo`&&s.repo===t,l=c?await G(e.store,i):void 0;return{id:i,name:typeof o.name==`string`?o.name:i,...typeof o.description==`string`?{description:o.description}:{},...c?{version:s.currentVersion,...l?.source?{commit:l.source.commit}:{}}:{},...s&&!c?{taken:!0}:{}}}));return T({repo:t,agents:a.filter(Boolean)})}async function Pr(e,t,n,r){let i=r.searchParams.get(`repo`);return i?Nr(t,i,r.searchParams.get(`ref`)||`HEAD`):T({error:`repo is required`},400)}async function Fr(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 T({error:`repo is required, ref must be a string and agents a list of ids`},400);try{let e=await Mr(t,i.repo);if(!e)return T({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 U(t.store,e);if(n&&(n.source!==`repo`||n.repo!==i.repo))return T({error:`Agent id "${e}" is already taken`},409)}let o=await mt(t.store,e.contents,i.repo,n,e.token,(t.now??Date.now)(),{slugs:r});return await ze(t,o),T({imported:o.map(e=>e.agent)})}catch(e){return T({error:e instanceof Error?e.message:String(e)},400)}}async function Ir(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 Lr(e,t,n){let r=await Bt(e.store,t);return await Tn(e.store,n,t,r)?Bt(e.store,t):r}async function $(e,t){let n=(e.now??Date.now)(),r=e.local?await le(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)??{}):Lr(e,t,n)}}async function Rr(e,t,n,r){let i=n.slug;if(n.version&&Number(n.version),n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return D();let{now:a,local:o,loadCurrent:s}=await $(t,i);if(!o&&t.store.listAgentSummaries&&(await at(t.store,a),re(r)))return T(await Ur(t,r));let c=o??(t.store.listAgentSummaries?await t.store.listAgentSummaries():await wt(t.store));if(!o&&!t.store.listAgentSummaries&&await at(t.store,a,c)&&(c=await wt(t.store)),re(r))return T(await Ur(t,r,c));let l;return T(await Promise.all(c.map(async({record:e,version:n})=>{e.source===`repo`&&e.repo&&(l??=t.store.list(`app`));let r=await Ir(t,e,n,l);return{...e,definition:n?.definition,...r?{sourceUrl:r}:{}}})))}async function zr(e,t,n,r){let i=n.slug;if(n.version&&Number(n.version),n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return D();let{now:a,local:o,loadCurrent:s}=await $(t,i),c=E(r,10,50),l=ie(r),[u,d]=await Promise.all([o?s().then(e=>e.record):U(t.store,i),o?Promise.resolve(o.flatMap(({version:e})=>e?[{value:e}]:[])):t.store.listVersions?.(i,c+1,l)]);return u?T(await Wr(t,u,c,l??u.currentVersion+1,d)):T({error:`No agent named "${i}"`},404)}async function Br(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 D();let{now:o,local:s,loadCurrent:c}=await $(t,i),l=s?s.find(({version:e})=>e?.version===a)?.version:await G(t.store,i,a);return l?T(l):T({error:`No version ${a} for agent "${i}"`},404)}async function Vr(e,t,n,r){let i=n.slug;if(n.version&&Number(n.version),n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return D();let{now:a,local:o,loadCurrent:s}=await $(t,i),c=r.searchParams.get(`versions`)!==`0`,l=r.searchParams.get(`content`)!==`0`,[{record:u,version:d},f]=await Promise.all([!l&&!o&&t.store.listAgentSummaries&&!v()[i]?t.store.listAgentSummaries({slug:i}).then(e=>e[0]??{}):s(),c?o?o.flatMap(({version:e})=>e?[{value:e}]:[]):t.store.listVersions?t.store.listVersions(i):t.store.list(`agentversion`,{prefix:`${i}:`}):[]]);if(!u)return T({error:`No agent named "${i}"`},404);let p=f.map(({value:e})=>{let{systemPrompt:t,files:n,...r}=e;return r}),m=await Ir(t,u,d);return T({...u,...d?{definition:d.definition,...l&&`systemPrompt`in d?{systemPrompt:d.systemPrompt,...d.files?{files:d.files}:{}}:{}}:{},...m?{sourceUrl:m}:{},...c?{versions:p}:{}})}const Hr={builtin:`builtin`,dashboard:`upload`,repository:`repo`};async function Ur(e,t,n){let r=E(t,24,100),i=ie(t),a=t.searchParams.get(`q`)?.trim().toLowerCase(),o=Hr[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).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=ce(_,r,e=>e.record.id);return{...v,...c?{connectable:[...d,...p.map(e=>({...e,value:{...e.value,builtin:!0}}))].filter(({value:e})=>e.builtin&&!h.has(e.id)).map(({value:e})=>({id:e.id,integration:e.integration}))}:{},items:await Promise.all(v.items.map(async({record:t,version:n,ids:r})=>{let i=await Ir(e,t,n,u);return{...t,definition:n?.definition,...i?{sourceUrl:i}:{},platforms:r.map(e=>({id:e,state:g(t.id,e)}))}}))}}async function Wr(e,t,n,r,i){let a=r-n-2,o=(i??await e.store.list(`agentversion`,{prefix:`${t.id}:`,...a>0?{after:st(t.id,a)}:{},limit:n+1})).map(({value:e})=>{let{systemPrompt:t,files:n,definition:r,...i}=e;return i}).filter(e=>e.version<r).reverse();return ce(o,n,e=>e.version)}function Gr(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 Kr(e,t,n,r){let i=n.slug;if(n.version&&Number(n.version),n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return D();let{now:a,local:o,loadCurrent:s}=await $(t,i),c=await e.json().catch(()=>void 0);try{let e=x({[i]:c})[i];if(!e||typeof e!=`object`)throw Error(`settings must be an object`);let{record:n,version:r}=await s();if(!n||!r)throw Error(`No agent named "${i}".`);return Sn({...n,settings:void 0},r,e,t.integrations),t.local?(await xn(t,t=>{t.agents={...t.agents,[i]:e}}),await le(t.store,t.local.cwd,t.integrations),T(await U(t.store,i))):T(await ve(t.store,i,e,(t.now??Date.now)()))}catch(e){return T({error:e instanceof Error?e.message:String(e)},400)}}async function qr(e,t,n,r){let i=n.slug;if(n.version&&Number(n.version),n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return D();let{now:a,local:o,loadCurrent:s}=await $(t,i),{record:c}=await s();if(!c)return T({error:`No agent named "${i}"`},404);if(c.source===`builtin`)return T({error:`Built-in agents cannot be deleted.`},400);if(t.local&&!await $e(t.local.cwd,t.integrations,i))return T({error:`Delete .coder/agents/${i} in the repo`},409);for(let{id:e}of await t.store.list(`agentversion`,{prefix:`${i}:`}))await t.store.delete(`agentversion`,e);return await t.store.delete(`agent`,i),T({ok:!0})}async function Jr(e,t,n,r){let i=n.slug;if(n.version&&Number(n.version),n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return D();let{now:a,local:o,loadCurrent:s}=await $(t,i),c=await e.json().catch(()=>void 0);if(!c||typeof c.systemPrompt!=`string`||c.files!==void 0&&!Gr(c.files)||c.name!==void 0&&typeof c.name!=`string`||c.description!==void 0&&typeof c.description!=`string`)return T({error:`definition and systemPrompt are required; files must contain strings`},400);try{b([i]);let[e]=y({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 U(t.store,i):void 0,r=t.local&&n?await G(t.store,i):void 0,a=c.files;t.local&&(await Ft(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 le(t.store,t.local.cwd,t.integrations));let o=t.local?void 0:await Ot(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 G(t.store,i),l=o?.unchanged??Bn(r&&{...r,createdAt:0},{...s,createdAt:0});await ze(t,[s]);let u=o?.record??await U(t.store,i);return T({...u,definition:s.definition,version:s.version,unchanged:l})}catch(e){return T({error:e instanceof Error?e.message:String(e)},400)}}async function Yr(e,t,n,r){let a=n.id,o=Number(r.searchParams.get(`after`)??-1),s=Number.isFinite(o)?o:-1;r.searchParams.has(`limit`)&&E(r,500,2e3);let c=await t.store.get(`task`,a);if(!c||t.local&&c.handle?.startsWith(`cli:`)&&c.task.flow==="default"){let n=c?.task.cwd??t.local?.cwd;if(!n||!Mt(n,a,!1))return T({error:`No task "${a}"`},404);{let t=Number(e.headers.get(`last-event-id`)??s);return Qr(e,Number.isFinite(t)?t:s,async e=>{let t=Mt(n,a);if(!t)return;let r=_(n,a),o=Math.max(t.finishedAt??0,Date.parse(r?.resumedAt??r?.createdAt??``)||0),s=P.has(t.status)&&!t.error&&t.status!==`cancelled`&&(!t.result||(Ln.statSync(q.join(i(n,a),`result.json`),{throwIfNoEntry:!1})?.mtimeMs??0)<o);return{status:t,lines:yn(n,a,e,500),pendingResult:s}})}}let l=Number(e.headers.get(`last-event-id`)??s);return Qr(e,Number.isFinite(l)?l:s,async e=>{let n=await t.store.get(`task`,a);if(!n)return;let r=n.task.runner===`github-actions`&&n.handle,i=r&&P.has(n.status)?(await(await We(t,n.task))?.status(n.handle).catch(()=>void 0))?.state===`running`:!1;return{status:n,lines:([`running`,`waiting`].includes(n.status)||r)&&n.handle?await un(t,n,e,500).catch(()=>Re(t.store,a,e,500)):await Re(t.store,a,e,500),pendingLogs:i}})}const Xr=1e3;function Zr(e){let{status:t,approval:n,answer:r,result:i,error:a,startedAt:o,finishedAt:s}=e;return{status:t,approval:n??null,answer:r,result:i,error:a,startedAt:o,finishedAt:s,turns:Ze(e).turns}}function Qr(e,t,n){let r=new TextEncoder,i=Date.now()+5e4,a=t,o=``,s=!1,c=new ReadableStream({async start(t){let c=e=>t.enqueue(r.encode(e));c(`retry: ${Xr}\n\n`);try{for(;!s&&!e.signal.aborted&&Date.now()<i;){let e=await n(a);if(!e)break;let{status:t,lines:r,pendingLogs:i,pendingResult:s}=e;for(let e of r)c(`id: ${e.seq}\nevent: log\ndata: ${JSON.stringify(e)}\n\n`),a=e.seq;let l=JSON.stringify(Zr(t)),u=i||s||P.has(t.status)&&r.length===500;if(l!==o&&!u&&(c(`event: status\ndata: ${l}\n\n`),o=l),r.length!==500){if(P.has(t.status)&&!u){c(`event: end
|
|
2
2
|
data: {}
|
|
3
3
|
|
|
4
|
-
`);break}await new Promise(e=>setTimeout(e,Xr))}}}finally{s||t.close()}},cancel(){s=!0}});return new Response(c,{headers:{"content-type":`text/event-stream; charset=utf-8`,"cache-control":`no-cache, no-transform`}})}var $r=class{options;entries=new Map;pending=new Map;constructor(e={ttlMs:6e5,max:100}){this.options=e}get size(){return this.entries.size}get inFlight(){return this.pending.size}has(e){return this.entries.has(e)}keys(){return this.entries.keys()}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;for(let[t,n]of this.entries)t!==e&&r-n.at>=this.options.ttlMs&&this.entries.delete(t);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(()=>i?.value).finally(()=>this.pending.delete(e)),this.pending.set(e,a)),a}};const ei=/^[a-z0-9][a-z0-9-]*$/,ti=new Set([`openrouter.ai`,`ai-gateway.vercel.sh`,`api.groq.com`,`api.together.xyz`]);function ni(e){return{builtin:{codex:p,claude:s},models:e.models??{}}}async function ri(e,t){let{baseUrl:n,envKey:r,key:i}=await H(e);if(!n||!/^https?:\/\//.test(n)||!URL.canParse(n))return T({error:`An http or https base URL is required`},400);let a=!i&&r&&await ii(t,n,r)?await Kt(t,r):void 0,o=i||a,s=t.settings??={},c=s.probes??=new $r({ttlMs:6e5,max:100,now:t.now,accept:e=>e.reachable}),l=`${new URL(n).host}|${r??``}|${C(String(o??``))}`;return T(await c.get(l,()=>ne({baseUrl:n},{key:o,fetch:t.fetch})))}async function ii(e,t,n){let r=new URL(t).host;if(ti.has(r))return!0;let i=(await _e(e)).models??{};return Object.values(i).some(e=>`baseUrl`in e&&e.envKey===n&&new URL(e.baseUrl).host===r)}async function ai(e,t,n,r){return T(ni(await _e(t)))}async function oi(e,t,n,r){let{name:i=``,...a}=await H(e);return!ei.test(i)||u(i)?T({error:`Invalid model name "${i}"`},400):W(t,e=>{if(e.models?.[i])throw new R(`"${i}" already exists`);e.models={...e.models,[i]:a}})}async function si(e,t,n,r){let i=n.name;return W(t,e=>{if(!e.models?.[i])throw new R(`No model "${i}"`);l(e,i)})}async function ci(e,t,n,i){let a=n.name,{spec:c}=await H(e);return W(t,e=>{if(!ei.test(a))throw new R(`Invalid alias name "${a}"`);let t=e.models?.[a];if(t&&m(t))throw new R(`"${a}" is a custom model name`);let n=f(c,h(e));if(!n?.model||n.engine===`custom`)throw new R(`"${c}" does not name a codex or claude model`);let i=n.engine===`claude`?s:p,l=c.split(`:`).some(e=>r.has(e)||o.has(e));e.models={...e.models,[a]:{provider:n.engine,model:i[n.model]??n.model,...l&&n.effort?{effort:n.effort}:{}}}})}async function li(e,n,r,i){let a=r.name;return W(n,e=>{let n=e.models??={},r=n[a];r&&(m(r)||t(r))?r.disabled=!0:n[a]={disabled:!0}})}async function ui(e,n,r,i){let a=r.name;return W(n,e=>{let n=e.models??={},r=n[a];r&&(m(r)||t(r))?delete r.disabled:delete n[a]})}const di=/^[a-z0-9][a-z0-9_-]*$/i;async function fi(e,t,n,r){return T((await _e(t)).mcp??{})}async function pi(e,t,n,r){let{name:i=``,...a}=await H(e);return di.test(i)?W(t,e=>{e.mcp={...e.mcp,[i]:a}}):T({error:`Invalid server name "${i}"`},400)}async function mi(e,t,n,r){let i=n.name;return W(t,e=>{if(!e.mcp?.[i])throw new R(`No MCP server "${i}"`);delete e.mcp[i]})}const hi={npm:[`npx`,`-y`],pypi:[`uvx`],oci:[`docker`,`run`,`-i`,`--rm`]},gi=(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 _i(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]=gi([{...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 vi(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:gi(t.headers)};let n=e.packages?.find(e=>hi[e.registryType]&&(e.transport?.type??`stdio`)===`stdio`);if(!n)return;let[r,...i]=hi[n.registryType],a=[],o=_i(n.runtimeArguments,`runtime`,a),s=_i(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:gi(n.environmentVariables),headers:[]}}async function yi(e,t,n){let r=n.searchParams.get(`q`)?.trim()??``,i=t.settings??={},a=await(i.registry??=new $r({ttlMs:6e5,max:100,now:t.now})).get(r,()=>bi(t,r));return a?T(a):T({error:`The MCP registry did not answer. Try again.`},502)}async function bi(e,t){let n=new URLSearchParams({version:`latest`,limit:`30`});t&&n.set(`search`,t);try{let t=await(e.fetch??fetch)(`https://registry.modelcontextprotocol.io/v0.1/servers?${n}`,{headers:{accept:`application/json`},signal:AbortSignal.timeout(2e4)});if(!t.ok)return;let{servers:r=[]}=await t.json();return r.flatMap(({server:e})=>{let t=vi(e);return t?[{name:e.name,title:e.title??e.name.split(`/`).pop()??e.name,description:e.description??``,...t}]:[]})}catch{return}}const xi=`/api/auth/callback`,Si=`/.well-known/oauth-client.json`,Ci=`/.well-known/oauth-cli-client.json`,wi=`openid profile email offline_access organizations:read`;function Ti(e,t){return{client_id:`${e}${Si}`,client_name:`Coder at ${new URL(e).host}`,redirect_uris:[`${e}${xi}`],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:wi}}function Ei(e){return{client_id:`${e}${Ci}`,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:wi}}function Di(e,t){return{resource:new URL(e).origin,authorization_servers:[t],bearer_methods_supported:[`header`],scopes_supported:wi.split(` `)}}function Oi(e){let t=T(e);return t.headers.set(`cache-control`,`public, max-age=3600`),t}function ki(e,t,n,r){return t.config.publicUrl&&t.auth?Oi(Ti(t.config.publicUrl,t.auth.jwks)):void 0}function Ai(e,t,n,r){return t.config.publicUrl&&t.auth?Oi(Ei(t.config.publicUrl)):void 0}function ji(e,t,n,r){return t.config.publicUrl&&t.auth?Oi(Di(t.config.publicUrl,t.auth.issuer)):void 0}const Mi=[z(`GET`,Si,ki,pe),z(`GET`,Ci,Ai,pe),z(`GET`,`/.well-known/oauth-protected-resource`,ji,pe),z(`GET`,`/health`,(e,t)=>Yn(t)),z(`GET`,`/`,Et,Je),z(`GET`,`/login`,en,He),...nn(`/login`,sn,He).filter(e=>e.method!==`GET`),z(`POST`,`/dash/token`,Gt,ot),...nn(`/dash`,fn,En)],Ni=[z(`GET`,`/api/auth/capabilities`,(e,t)=>T({wular:t.auth?.issuer??null})),...nn(`/api/auth`,(e,t)=>t.auth.handler(e),Tt),z(`GET`,`/me`,Qn,rn),z(`POST`,`/me/organization`,er,Ge)],Pi=[...B(`/tasks`,[z(`GET`,`/:id/messages`,gt,Cn),z(`POST`,`/:id/ack`,pt,Cn),z(`POST`,`/:id/heartbeat`,Ne,Cn),z(`POST`,`/:id/result`,Be,bn),z(`POST`,`/:id/credential`,Ae,bn),z(`GET`,`/:id`,ut,kn)]),...B(`/logins`,[z(`GET`,`/:id/input`,dr,Qt),z(`GET`,`/:id`,fr,Qt),z(`POST`,`/:id`,pr,Qt)]),...B(`/runners`,[z(`POST`,`/register`,Pt)])],Fi=[...B(`/create`,[z(`GET`,`/:id`,mr,K),z(`POST`,`/:id`,mr,K),z(`GET`,`/:id/callback`,hr,K),z(`POST`,`/:id/callback`,gr,K)]),...B(`/install`,[z(`GET`,`/:id`,_r,F),z(`POST`,`/:id`,_r,F),z(`GET`,`/:id/callback`,vr,F),z(`POST`,`/:id/callback`,vr,F)])],Ii=B(`/connect`,[z(`GET`,``,xr,ge),z(`POST`,``,Sr,ge),z(`GET`,`/:integration`,Cr,Yt),z(`GET`,`/:integration/callback`,wr,Yt)]),Li=[...B(`/hooks`,[z(`POST`,`/*`,(e,t,n)=>nt(e,t,n[`*`]),(e,t,n)=>t.integrations[n[`*`]]?t:D())]),...Fi,...Ii],Ri=[z(`GET`,`/metrics`,async(e,t)=>T(await Zn(t),200,{"cache-control":`no-store`}),Vt),z(`GET`,`/usage`,Fn),z(`GET`,`/usage/totals`,In)],zi=B(``,[z(`GET`,`/folders`,(e,t)=>T(Xe(t.local.cwd))),z(`POST`,`/folders/check`,async(e,t)=>{let n=await e.json().catch(()=>void 0);return T(we(n?.path))}),z(`POST`,`/folders/clone`,async(e,t)=>{let n=await e.json().catch(()=>void 0);return T(await xe(n?.url))}),z(`POST`,`/folders/pick`,async(e,t)=>T(await Zt()))],Se),Bi=B(``,[z(`GET`,`/engines/status`,async(e,t)=>T(await $t())),z(`POST`,`/engines/:engine/login`,Nt),z(`POST`,`/engines/:engine/logout`,Rt)],ye),Vi=[z(`POST`,`/apps/:id/install`,(e,t,n,r)=>Dr(e,t,n.id,r.searchParams.get(`back`))),z(`GET`,`/apps`,Or),z(`GET`,`/installations`,kr),z(`POST`,`/connections`,(e,t)=>Er(e,t)),z(`GET`,`/integrations`,(e,t)=>Ar(t)),z(`GET`,`/repositories`,(e,t)=>jr(t))],Hi=[z(`GET`,`/agents/import`,Pr),z(`POST`,`/agents/import`,Fr),z(`GET`,`/agents`,Rr),z(`PATCH`,`/agents/:slug/settings`,Kr),z(`GET`,`/agents/:slug/versions`,zr),z(`GET`,`/agents/:slug/versions/:version`,Br),z(`GET`,`/agents/:slug`,Vr),z(`DELETE`,`/agents/:slug`,qr,(e,t)=>Qe(t,`Only an owner or admin can delete an agent.`)),z(`PUT`,`/agents/:slug`,Jr)],Ui=[z(`GET`,`/credentials`,jt),z(`POST`,`/credentials`,pn,kt),z(`POST`,`/credentials/:label/default`,cn),z(`DELETE`,`/credentials/:label`,gn),z(`POST`,`/logins`,tr,M),z(`GET`,`/logins/:id`,nr,M),z(`POST`,`/logins/:id`,rr,M),z(`DELETE`,`/logins/:id`,ir,M)],Wi=[z(`GET`,`/runners`,tt),z(`POST`,`/runners`,vt),z(`POST`,`/runners/pair`,ue),z(`POST`,`/runners/:id/test`,xt),z(`PATCH`,`/runners/:id`,vn),z(`DELETE`,`/runners/:id`,Ct)],Gi=[z(`GET`,`/tasks`,Ue),z(`POST`,`/tasks`,Ce),z(`GET`,`/tasks/:id`,Ke),z(`DELETE`,`/tasks/:id`,Ee),z(`GET`,`/tasks/:id/logs`,Ve),z(`GET`,`/tasks/:id/stream`,Yr),z(`POST`,`/tasks/:id/steer`,Pe),z(`POST`,`/tasks/:id/ask`,Xt),z(`POST`,`/tasks/:id/continue`,qt),z(`POST`,`/tasks/:id/approve`,be),z(`POST`,`/tasks/:id/cancel`,de),z(`POST`,`/tasks/:id/archive`,Ye)],Ki=[z(`GET`,`/config`,wn),z(`PATCH`,`/config`,Dt),z(`PUT`,`/config`,it)],qi=[z(`POST`,`/models/probe`,(e,t)=>ri(e,t)),z(`GET`,`/models`,ai),z(`POST`,`/models`,oi),z(`DELETE`,`/models/:name`,si),z(`POST`,`/models/:name/alias`,ci),z(`POST`,`/models/:name/disable`,li),z(`POST`,`/models/:name/enable`,ui)],Ji=[z(`GET`,`/mcp`,fi),z(`POST`,`/mcp`,pi),z(`DELETE`,`/mcp/:name`,mi),z(`GET`,`/mcp-registry`,(e,t,n,r)=>yi(e,t,r))],Yi=[z(`GET`,`/flows`,Dn),z(`GET`,`/pulls`,me),z(`POST`,`/flows/:name/run`,je),z(`POST`,`/review`,dt)],Xi=B(`/admin`,[...Ri,...zi,...Bi,...Vi,...Hi,...Ui,...Wi,...Gi,...Ki,...qi,...Ji,...Yi]).map(e=>({...e,guard:Ut(e.guard)})),Zi=[...Pi,...Xi,...Ni,...Li,...Mi];async function Qi(e,t,n){if(!Te(e,t))return D();let r=new URL(e.url);return n.scope instanceof Response?n.scope:(t=n.scope??t,await Lt(Zi,e,t,r)??hn(e,t,r))}const $i=`x-coder-request-scope`;function ea(e,{sessions:t,cookies:n}){let r=e.auth;return r?{...e,auth:{...r,session(e,i){let a=JSON.stringify([...[`cookie`,`authorization`,`x-coder-organization`].map(t=>e.get(t)),!!i]),o=t.get(a);return o||(o=r.session(e,i).then(e=>(e?.cookies&&n.push(...e.cookies),e)),t.set(a,o)),o}}}:e}function ta(e,t,n){let r=t.requestScopes??=new Map,i=e.headers.get($i),a=n&&i?r.get(i):void 0;if(a)return{req:e,ctx:ea(t,a),end(){}};let o=new Headers(e.headers);if(o.delete($i),!t.auth)return{req:i?new Request(e,{headers:o}):e,ctx:t,end(){}};let s=zn(),c={sessions:new Map,cookies:[]};return r.set(s,c),o.set($i,s),{req:new Request(e,{headers:o}),ctx:ea(t,c),cookies:c.cookies,end:()=>r.delete(s)}}async function na(e,t,n={}){t.limits??=new _t((t.now??Date.now)()),t.limits.requests++,t.settings??={},t.dashboardHosts??=new an;let r=()=>ra(e,t,n);return t.dbProfile?t.dbProfile.request(n.inProcess===!0,r):r()}async function ra(e,t,n){let r=await ae(e,se(new URL(e.url).pathname));if(r instanceof Response)return r;let i=ta(r,t,n.inProcess===!0),a=!1;try{let r=n.clientIp??`unknown`,o=await St(i.req,i.ctx,r),s=ia(o instanceof Response?o:await Qi(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`;return e.method!==`GET`&&s.ok&&![`hooks`,`tasks`,`logins`].includes(c[1])&&mn(t),e.method!==`GET`&&s.ok&&!(l&&c.length===4&&c[2]&&c[3]===`heartbeat`)&&!(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`)&&yt(t,u&&c.length===3&&e.method===`POST`||u&&c.length===5&&!!c[3]&&c[4]===`continue`),a=!!s.body&&(s.headers.get(`content-type`)??``).includes(`text/html`),a?aa(s,i.end):s}finally{a||i.end()}}function ia(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 aa(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 oa(e={}){let t=e.env??J.env,n=An(t,e.host??`node`),r=e.runner??n.runner;if((e.host===`vercel`||t.VERCEL)&&(r===`local`||r===`local-docker`))throw new g(`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 g(`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 g(`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 g(`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?Rn(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 _n(s,{local:!!e.local});if(c.connection)try{let e=await Nn(c.connection.db);if(!e.applied)throw new g(`server`,`The database is not set up yet.`,{hint:`Create the tables: coder server migrate`});e.pending&&i.push(`database is ${e.pending} migration${e.pending===1?``:`s`} behind; run coder server migrate`)}catch(e){throw await c.close(),e}try{s.store===`memory`&&await at(c.store(c.defaultOrganizationId),Date.now());let n=c.connection&&s.auth?await(await import(`./auth-BFny--17.js`)).createAuth(c.connection.db,s):void 0,r=e.cwd??J.cwd(),l=c.store(c.defaultOrganizationId),u=Jt({kind:s.runner,workDir:s.workDir,config:s.runnerConfig,local:!(e.host===`vercel`||t.VERCEL),sandbox:{region:qe(s.databaseUrl),snapshots:{get:e=>l.get(`snapshot`,e),put:(e,t)=>l.put(`snapshot`,e,t)}}});if(!u[s.runner])throw await c.close(),new g(`invalid-option`,`Runner ${s.runner} is not configured.`,{hint:`Set RUNNER_CONFIG to JSON containing url and secret.`});let d=new an,f=new _t,p=new Map,m=new Map,h=t=>{let i=p.get(t);if(i)return i;let o=c.store(t),l={limits:f,...c.connection?{databaseHealth:async()=>{await c.connection.db.execute(Hn`select 1`)},healthRunners:async()=>{let[e]=await c.connection.db.select({total:Hn`count(*)::int`,online:Hn`count(*) filter (where ${Mn.lastSeen} > clock_timestamp() - interval '5 minutes')::int`}).from(Mn);return e??{online:0,total:0}}}:{},config:s,settings:{},organizationId:t,integrations:a,runners:u,store:o,queue:c.queue,requestScopes:m,dashboardHosts:d,dbProfile:c.connection?.profile,chatState:c.chatState,loadAgent:Oe(a,{cwd:r,config:s,store:o}),...n?{auth:n}:{},scope:h,webhookTarget:(e,t)=>c.webhookTarget(e,t),appRecord:e=>c.appRecord(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 p.set(t,l),l};globalThis.__coder={handle:e=>na(e,h(c.defaultOrganizationId),{inProcess:!0})};let _=h(c.defaultOrganizationId),v;return e.local&&(await tn(_),v=setImmediate(()=>{zt(_).catch(()=>void 0)})),{config:s,context:h,defaultContext:_,warnings:i,...o?{mintedToken:o}:{},sweep:c.sweep,close:async()=>{v&&clearImmediate(v),await _.local?.usageSync?.catch(()=>void 0),await Ht(_),await c.close()}}}catch(e){throw await c.close(),e}}var sa=e({serve:()=>da,serverHandler:()=>la});function ca(e){try{let t=new URL(e);return ln.has(t.hostname)?Number(t.port||(t.protocol===`https:`?443:80)):void 0}catch{return}}function la(e=J.env,t=e.VERCEL?`vercel`:`node`){jn();let n,r=()=>n??=oa({env:e,host:t}).catch(e=>{throw n=void 0,e});return Object.assign(async(t,n)=>{let i=await r(),a=n?e=>n(e):e=>void e.catch(()=>{}),o=e=>({...i.context(e),waitUntil:a,scope:o});return na(t,o(i.defaultContext.organizationId),{clientIp:e.VERCEL?t.headers.get(`x-forwarded-for`)?.split(`,`,1)[0]?.trim():void 0})},{scheduled:async()=>{let e=await r();await Promise.all([e.sweep(),import(`./store-DzqXS2wT.js`).then(e=>e.q).then(t=>t.renewInstallations(e.defaultContext)),Ie(e.defaultContext,!1,!0),on(e.defaultContext)])},close:async()=>{let e=n;n=void 0,await(await e)?.close()}})}async function ua(e={}){jn();let t=e.env??J.env;if(e.runner&&!fe.includes(e.runner))throw new g(`invalid-option`,`Invalid --runner value: use ${fe.join(`, `)}`);if(e.port!==void 0&&(!Number.isInteger(e.port)||e.port<1||e.port>65535))throw new g(`invalid-option`,`Invalid port: use 1 through 65535.`);let n=t.PORT&&/^\d+$/.test(t.PORT)?Number(t.PORT):void 0,r=ca(t.PUBLIC_URL),i=e.port??n??r??8787;if(!Number.isInteger(i)||i<1||i>65535)throw new g(`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 g(`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&&!ln.has(s))throw new g(`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 g(`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=()=>{qn().then(e,t)}}):void 0,f=d?.then(()=>void 0).catch(()=>void 0),p=c?{cwd:e.cwd??J.cwd(),port:i,cacheMaintenance:f}:void 0,m=await oa({cwd:e.cwd,env:a,runner:e.runner,...p?{local:p}:{}}),h=m.defaultContext,_=()=>{m.sweep().catch(()=>{}),import(`./store-DzqXS2wT.js`).then(e=>e.q).then(e=>e.renewInstallations(h)).catch(()=>{})};_();let v=setInterval(_,36e5);v.unref();let y=setInterval(()=>{Ie(h,!1,!0).catch(()=>{}),on(h).catch(()=>{}),t.PUBLIC_URL||import(`./store-DzqXS2wT.js`).then(e=>e.q).then(e=>e.renewInstallations(h,`sync`)).catch(()=>{})},6e4);y.unref();let b=Vn.createServer(oe((e,t)=>na(e,h,{clientIp:t}),{limit:se,admit:e=>o||rt(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(y),clearInterval(v),await m.close(),e});let S=l?setTimeout(l,0):void 0,C=!1,ee=async()=>{C||(C=!0,clearInterval(y),clearInterval(v),await new Promise((e,t)=>b.close(n=>n?t(n):e())),await f,S&&clearTimeout(S),await m.close())},te=h.auth?`Wular Auth (${h.auth.issuer})`:void 0,ne=`http://localhost:${i}`,w=Fe(h),T=w===`local`?ne:x,E=m.config.store===`memory`?m.mintedToken??t.ADMIN_TOKEN:void 0;return{address:ne,publicUrl:x,warnings:m.warnings,close:ee,runner:m.config.runner,store:m.config.store,mode:w,...d?{cacheMigration:d}:{},maxTasks:m.config.maxTasks??m.config.limits?.concurrentTasks??10,...te?{signIn:te}:{},...m.mintedToken?{mintedToken:m.mintedToken}:{},...m.config.store===`postgres`&&t.DATABASE_URL?{database:Pn(t.DATABASE_URL)}:{},...ln.has(new URL(T).hostname)?{dashboard:`${T}/dash${E?`#token=${encodeURIComponent(E)}`:``}`}:{}}}async function da(e={}){try{return await ua(e)}catch(e){if(e instanceof g)throw e;let t=e instanceof Error&&e.cause instanceof Error?`: ${e.cause.message}`:``;throw new g(`server`,`${e instanceof Error?e.message:String(e)}${t}`)}}export{wi as a,xi as i,sa as n,Si as o,la as r,da as t};
|
|
4
|
+
`);break}await new Promise(e=>setTimeout(e,Xr))}}}finally{s||t.close()}},cancel(){s=!0}});return new Response(c,{headers:{"content-type":`text/event-stream; charset=utf-8`,"cache-control":`no-cache, no-transform`}})}var $r=class{options;entries=new Map;pending=new Map;constructor(e={ttlMs:6e5,max:100}){this.options=e}get size(){return this.entries.size}get inFlight(){return this.pending.size}has(e){return this.entries.has(e)}keys(){return this.entries.keys()}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;for(let[t,n]of this.entries)t!==e&&r-n.at>=this.options.ttlMs&&this.entries.delete(t);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(()=>i?.value).finally(()=>this.pending.delete(e)),this.pending.set(e,a)),a}};const ei=/^[a-z0-9][a-z0-9-]*$/,ti=new Set([`openrouter.ai`,`ai-gateway.vercel.sh`,`api.groq.com`,`api.together.xyz`]);function ni(e){return{builtin:{codex:p,claude:s},models:e.models??{}}}async function ri(e,t){let{baseUrl:n,envKey:r,key:i}=await H(e);if(!n||!/^https?:\/\//.test(n)||!URL.canParse(n))return T({error:`An http or https base URL is required`},400);let a=!i&&r&&await ii(t,n,r)?await Kt(t,r):void 0,o=i||a,s=t.settings??={},c=s.probes??=new $r({ttlMs:6e5,max:100,now:t.now,accept:e=>e.reachable}),l=`${new URL(n).host}|${r??``}|${C(String(o??``))}`;return T(await c.get(l,()=>ne({baseUrl:n},{key:o,fetch:t.fetch})))}async function ii(e,t,n){let r=new URL(t).host;if(ti.has(r))return!0;let i=(await _e(e)).models??{};return Object.values(i).some(e=>`baseUrl`in e&&e.envKey===n&&new URL(e.baseUrl).host===r)}async function ai(e,t,n,r){return T(ni(await _e(t)))}async function oi(e,t,n,r){let{name:i=``,...a}=await H(e);return!ei.test(i)||u(i)?T({error:`Invalid model name "${i}"`},400):W(t,e=>{if(e.models?.[i])throw new R(`"${i}" already exists`);e.models={...e.models,[i]:a}})}async function si(e,t,n,r){let i=n.name;return W(t,e=>{if(!e.models?.[i])throw new R(`No model "${i}"`);l(e,i)})}async function ci(e,t,n,i){let a=n.name,{spec:c}=await H(e);return W(t,e=>{if(!ei.test(a))throw new R(`Invalid alias name "${a}"`);let t=e.models?.[a];if(t&&m(t))throw new R(`"${a}" is a custom model name`);let n=f(c,h(e));if(!n?.model||n.engine===`custom`)throw new R(`"${c}" does not name a codex or claude model`);let i=n.engine===`claude`?s:p,l=c.split(`:`).some(e=>r.has(e)||o.has(e));e.models={...e.models,[a]:{provider:n.engine,model:i[n.model]??n.model,...l&&n.effort?{effort:n.effort}:{}}}})}async function li(e,n,r,i){let a=r.name;return W(n,e=>{let n=e.models??={},r=n[a];r&&(m(r)||t(r))?r.disabled=!0:n[a]={disabled:!0}})}async function ui(e,n,r,i){let a=r.name;return W(n,e=>{let n=e.models??={},r=n[a];r&&(m(r)||t(r))?delete r.disabled:delete n[a]})}const di=/^[a-z0-9][a-z0-9_-]*$/i;async function fi(e,t,n,r){return T((await _e(t)).mcp??{})}async function pi(e,t,n,r){let{name:i=``,...a}=await H(e);return di.test(i)?W(t,e=>{e.mcp={...e.mcp,[i]:a}}):T({error:`Invalid server name "${i}"`},400)}async function mi(e,t,n,r){let i=n.name;return W(t,e=>{if(!e.mcp?.[i])throw new R(`No MCP server "${i}"`);delete e.mcp[i]})}const hi={npm:[`npx`,`-y`],pypi:[`uvx`],oci:[`docker`,`run`,`-i`,`--rm`]},gi=(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 _i(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]=gi([{...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 vi(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:gi(t.headers)};let n=e.packages?.find(e=>hi[e.registryType]&&(e.transport?.type??`stdio`)===`stdio`);if(!n)return;let[r,...i]=hi[n.registryType],a=[],o=_i(n.runtimeArguments,`runtime`,a),s=_i(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:gi(n.environmentVariables),headers:[]}}async function yi(e,t,n){let r=n.searchParams.get(`q`)?.trim()??``,i=t.settings??={},a=await(i.registry??=new $r({ttlMs:6e5,max:100,now:t.now})).get(r,()=>bi(t,r));return a?T(a):T({error:`The MCP registry did not answer. Try again.`},502)}async function bi(e,t){let n=new URLSearchParams({version:`latest`,limit:`30`});t&&n.set(`search`,t);try{let t=await(e.fetch??fetch)(`https://registry.modelcontextprotocol.io/v0.1/servers?${n}`,{headers:{accept:`application/json`},signal:AbortSignal.timeout(2e4)});if(!t.ok)return;let{servers:r=[]}=await t.json();return r.flatMap(({server:e})=>{let t=vi(e);return t?[{name:e.name,title:e.title??e.name.split(`/`).pop()??e.name,description:e.description??``,...t}]:[]})}catch{return}}const xi=`/api/auth/callback`,Si=`/.well-known/oauth-client.json`,Ci=`/.well-known/oauth-cli-client.json`,wi=`openid profile email offline_access organizations:read`;function Ti(e,t){return{client_id:`${e}${Si}`,client_name:`Coder at ${new URL(e).host}`,redirect_uris:[`${e}${xi}`],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:wi}}function Ei(e){return{client_id:`${e}${Ci}`,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:wi}}function Di(e,t){return{resource:new URL(e).origin,authorization_servers:[t],bearer_methods_supported:[`header`],scopes_supported:wi.split(` `)}}function Oi(e){let t=T(e);return t.headers.set(`cache-control`,`public, max-age=3600`),t}function ki(e,t,n,r){return t.config.publicUrl&&t.auth?Oi(Ti(t.config.publicUrl,t.auth.jwks)):void 0}function Ai(e,t,n,r){return t.config.publicUrl&&t.auth?Oi(Ei(t.config.publicUrl)):void 0}function ji(e,t,n,r){return t.config.publicUrl&&t.auth?Oi(Di(t.config.publicUrl,t.auth.issuer)):void 0}const Mi=[z(`GET`,Si,ki,pe),z(`GET`,Ci,Ai,pe),z(`GET`,`/.well-known/oauth-protected-resource`,ji,pe),z(`GET`,`/health`,(e,t)=>Yn(t)),z(`GET`,`/`,Et,Je),z(`GET`,`/login`,en,He),...nn(`/login`,sn,He).filter(e=>e.method!==`GET`),z(`POST`,`/dash/token`,Gt,ot),...nn(`/dash`,fn,En)],Ni=[z(`GET`,`/api/auth/capabilities`,(e,t)=>T({wular:t.auth?.issuer??null})),...nn(`/api/auth`,(e,t)=>t.auth.handler(e),Tt),z(`GET`,`/me`,Qn,rn),z(`POST`,`/me/organization`,er,Ge)],Pi=[...B(`/tasks`,[z(`GET`,`/:id/messages`,gt,Cn),z(`POST`,`/:id/ack`,pt,Cn),z(`POST`,`/:id/heartbeat`,Ne,Cn),z(`POST`,`/:id/result`,Be,bn),z(`POST`,`/:id/credential`,Ae,bn),z(`GET`,`/:id`,ut,kn)]),...B(`/logins`,[z(`GET`,`/:id/input`,dr,Qt),z(`GET`,`/:id`,fr,Qt),z(`POST`,`/:id`,pr,Qt)]),...B(`/runners`,[z(`POST`,`/register`,Pt)])],Fi=[...B(`/create`,[z(`GET`,`/:id`,mr,K),z(`POST`,`/:id`,mr,K),z(`GET`,`/:id/callback`,hr,K),z(`POST`,`/:id/callback`,gr,K)]),...B(`/install`,[z(`GET`,`/:id`,_r,F),z(`POST`,`/:id`,_r,F),z(`GET`,`/:id/callback`,vr,F),z(`POST`,`/:id/callback`,vr,F)])],Ii=B(`/connect`,[z(`GET`,``,xr,ge),z(`POST`,``,Sr,ge),z(`GET`,`/:integration`,Cr,Yt),z(`GET`,`/:integration/callback`,wr,Yt)]),Li=[...B(`/hooks`,[z(`POST`,`/*`,(e,t,n)=>nt(e,t,n[`*`]),(e,t,n)=>t.integrations[n[`*`]]?t:D())]),...Fi,...Ii],Ri=[z(`GET`,`/metrics`,async(e,t)=>T(await Zn(t),200,{"cache-control":`no-store`}),Vt),z(`GET`,`/usage`,Fn),z(`GET`,`/usage/totals`,In)],zi=B(``,[z(`GET`,`/folders`,(e,t)=>T(Xe(t.local.cwd))),z(`POST`,`/folders/check`,async(e,t)=>{let n=await e.json().catch(()=>void 0);return T(we(n?.path))}),z(`POST`,`/folders/clone`,async(e,t)=>{let n=await e.json().catch(()=>void 0);return T(await xe(n?.url))}),z(`POST`,`/folders/pick`,async(e,t)=>T(await Zt()))],Se),Bi=B(``,[z(`GET`,`/engines/status`,async(e,t)=>T(await $t())),z(`POST`,`/engines/:engine/login`,Nt),z(`POST`,`/engines/:engine/logout`,Rt)],ye),Vi=[z(`POST`,`/apps/:id/install`,(e,t,n,r)=>Dr(e,t,n.id,r.searchParams.get(`back`))),z(`GET`,`/apps`,Or),z(`GET`,`/installations`,kr),z(`POST`,`/connections`,(e,t)=>Er(e,t)),z(`GET`,`/integrations`,(e,t)=>Ar(t)),z(`GET`,`/repositories`,(e,t)=>jr(t))],Hi=[z(`GET`,`/agents/import`,Pr),z(`POST`,`/agents/import`,Fr),z(`GET`,`/agents`,Rr),z(`PATCH`,`/agents/:slug/settings`,Kr),z(`GET`,`/agents/:slug/versions`,zr),z(`GET`,`/agents/:slug/versions/:version`,Br),z(`GET`,`/agents/:slug`,Vr),z(`DELETE`,`/agents/:slug`,qr,(e,t)=>Qe(t,`Only an owner or admin can delete an agent.`)),z(`PUT`,`/agents/:slug`,Jr)],Ui=[z(`GET`,`/credentials`,jt),z(`POST`,`/credentials`,pn,kt),z(`POST`,`/credentials/:label/default`,cn),z(`DELETE`,`/credentials/:label`,gn),z(`POST`,`/logins`,tr,M),z(`GET`,`/logins/:id`,nr,M),z(`POST`,`/logins/:id`,rr,M),z(`DELETE`,`/logins/:id`,ir,M)],Wi=[z(`GET`,`/runners`,tt),z(`POST`,`/runners`,vt),z(`POST`,`/runners/pair`,ue),z(`POST`,`/runners/:id/test`,xt),z(`PATCH`,`/runners/:id`,vn),z(`DELETE`,`/runners/:id`,Ct)],Gi=[z(`GET`,`/tasks`,Ue),z(`POST`,`/tasks`,Ce),z(`GET`,`/tasks/:id`,Ke),z(`DELETE`,`/tasks/:id`,Ee),z(`GET`,`/tasks/:id/logs`,Ve),z(`GET`,`/tasks/:id/stream`,Yr),z(`POST`,`/tasks/:id/steer`,Pe),z(`POST`,`/tasks/:id/ask`,Xt),z(`POST`,`/tasks/:id/continue`,qt),z(`POST`,`/tasks/:id/approve`,be),z(`POST`,`/tasks/:id/cancel`,de),z(`POST`,`/tasks/:id/archive`,Ye)],Ki=[z(`GET`,`/config`,wn),z(`PATCH`,`/config`,Dt),z(`PUT`,`/config`,it)],qi=[z(`POST`,`/models/probe`,(e,t)=>ri(e,t)),z(`GET`,`/models`,ai),z(`POST`,`/models`,oi),z(`DELETE`,`/models/:name`,si),z(`POST`,`/models/:name/alias`,ci),z(`POST`,`/models/:name/disable`,li),z(`POST`,`/models/:name/enable`,ui)],Ji=[z(`GET`,`/mcp`,fi),z(`POST`,`/mcp`,pi),z(`DELETE`,`/mcp/:name`,mi),z(`GET`,`/mcp-registry`,(e,t,n,r)=>yi(e,t,r))],Yi=[z(`GET`,`/flows`,Dn),z(`GET`,`/pulls`,me),z(`POST`,`/flows/:name/run`,je),z(`POST`,`/review`,dt)],Xi=B(`/admin`,[...Ri,...zi,...Bi,...Vi,...Hi,...Ui,...Wi,...Gi,...Ki,...qi,...Ji,...Yi]).map(e=>({...e,guard:Ut(e.guard)})),Zi=[...Pi,...Xi,...Ni,...Li,...Mi];async function Qi(e,t,n){if(!Te(e,t))return D();let r=new URL(e.url);return n.scope instanceof Response?n.scope:(t=n.scope??t,await Lt(Zi,e,t,r)??hn(e,t,r))}const $i=`x-coder-request-scope`;function ea(e,{sessions:t,cookies:n}){let r=e.auth;return r?{...e,auth:{...r,session(e,i){let a=JSON.stringify([...[`cookie`,`authorization`,`x-coder-organization`].map(t=>e.get(t)),!!i]),o=t.get(a);return o||(o=r.session(e,i).then(e=>(e?.cookies&&n.push(...e.cookies),e)),t.set(a,o)),o}}}:e}function ta(e,t,n){let r=t.requestScopes??=new Map,i=e.headers.get($i),a=n&&i?r.get(i):void 0;if(a)return{req:e,ctx:ea(t,a),end(){}};let o=new Headers(e.headers);if(o.delete($i),!t.auth)return{req:i?new Request(e,{headers:o}):e,ctx:t,end(){}};let s=zn(),c={sessions:new Map,cookies:[]};return r.set(s,c),o.set($i,s),{req:new Request(e,{headers:o}),ctx:ea(t,c),cookies:c.cookies,end:()=>r.delete(s)}}async function na(e,t,n={}){t.limits??=new _t((t.now??Date.now)()),t.limits.requests++,t.settings??={},t.dashboardHosts??=new an;let r=()=>ra(e,t,n);return t.dbProfile?t.dbProfile.request(n.inProcess===!0,r):r()}async function ra(e,t,n){let r=await ae(e,se(new URL(e.url).pathname));if(r instanceof Response)return r;let i=ta(r,t,n.inProcess===!0),a=!1;try{let r=n.clientIp??`unknown`,o=await St(i.req,i.ctx,r),s=ia(o instanceof Response?o:await Qi(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`;return e.method!==`GET`&&s.ok&&![`hooks`,`tasks`,`logins`].includes(c[1])&&mn(t),e.method!==`GET`&&s.ok&&!(l&&c.length===4&&c[2]&&c[3]===`heartbeat`)&&!(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`)&&yt(t,u&&c.length===3&&e.method===`POST`||u&&c.length===5&&!!c[3]&&c[4]===`continue`),a=!!s.body&&(s.headers.get(`content-type`)??``).includes(`text/html`),a?aa(s,i.end):s}finally{a||i.end()}}function ia(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 aa(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 oa(e={}){let t=e.env??J.env,n=An(t,e.host??`node`),r=e.runner??n.runner;if((e.host===`vercel`||t.VERCEL)&&(r===`local`||r===`local-docker`))throw new g(`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 g(`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 g(`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 g(`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?Rn(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 _n(s,{local:!!e.local});if(c.connection)try{let e=await Nn(c.connection.db);if(!e.applied)throw new g(`server`,`The database is not set up yet.`,{hint:`Create the tables: coder server migrate`});e.pending&&i.push(`database is ${e.pending} migration${e.pending===1?``:`s`} behind; run coder server migrate`)}catch(e){throw await c.close(),e}try{s.store===`memory`&&await at(c.store(c.defaultOrganizationId),Date.now());let n=c.connection&&s.auth?await(await import(`./auth-Dmn2U7rr.js`)).createAuth(c.connection.db,s):void 0,r=e.cwd??J.cwd(),l=c.store(c.defaultOrganizationId),u=Jt({kind:s.runner,workDir:s.workDir,config:s.runnerConfig,local:!(e.host===`vercel`||t.VERCEL),sandbox:{region:qe(s.databaseUrl),snapshots:{get:e=>l.get(`snapshot`,e),put:(e,t)=>l.put(`snapshot`,e,t)}}});if(!u[s.runner])throw await c.close(),new g(`invalid-option`,`Runner ${s.runner} is not configured.`,{hint:`Set RUNNER_CONFIG to JSON containing url and secret.`});let d=new an,f=new _t,p=new Map,m=new Map,h=t=>{let i=p.get(t);if(i)return i;let o=c.store(t),l={limits:f,...c.connection?{databaseHealth:async()=>{await c.connection.db.execute(Hn`select 1`)},healthRunners:async()=>{let[e]=await c.connection.db.select({total:Hn`count(*)::int`,online:Hn`count(*) filter (where ${Mn.lastSeen} > clock_timestamp() - interval '5 minutes')::int`}).from(Mn);return e??{online:0,total:0}}}:{},config:s,settings:{},organizationId:t,integrations:a,runners:u,store:o,queue:c.queue,requestScopes:m,dashboardHosts:d,dbProfile:c.connection?.profile,chatState:c.chatState,loadAgent:Oe(a,{cwd:r,config:s,store:o}),...n?{auth:n}:{},scope:h,webhookTarget:(e,t)=>c.webhookTarget(e,t),appRecord:e=>c.appRecord(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 p.set(t,l),l};globalThis.__coder={handle:e=>na(e,h(c.defaultOrganizationId),{inProcess:!0})};let _=h(c.defaultOrganizationId),v;return e.local&&(await tn(_),v=setImmediate(()=>{zt(_).catch(()=>void 0)})),{config:s,context:h,defaultContext:_,warnings:i,...o?{mintedToken:o}:{},sweep:c.sweep,close:async()=>{v&&clearImmediate(v),await _.local?.usageSync?.catch(()=>void 0),await Ht(_),await c.close()}}}catch(e){throw await c.close(),e}}var sa=e({serve:()=>da,serverHandler:()=>la});function ca(e){try{let t=new URL(e);return ln.has(t.hostname)?Number(t.port||(t.protocol===`https:`?443:80)):void 0}catch{return}}function la(e=J.env,t=e.VERCEL?`vercel`:`node`){jn();let n,r=()=>n??=oa({env:e,host:t}).catch(e=>{throw n=void 0,e});return Object.assign(async(t,n)=>{let i=await r(),a=n?e=>n(e):e=>void e.catch(()=>{}),o=e=>({...i.context(e),waitUntil:a,scope:o});return na(t,o(i.defaultContext.organizationId),{clientIp:e.VERCEL?t.headers.get(`x-forwarded-for`)?.split(`,`,1)[0]?.trim():void 0})},{scheduled:async()=>{let e=await r();await Promise.all([e.sweep(),import(`./store-B3ZHoBJY.js`).then(e=>e.q).then(t=>t.renewInstallations(e.defaultContext)),Ie(e.defaultContext,!1,!0),on(e.defaultContext)])},close:async()=>{let e=n;n=void 0,await(await e)?.close()}})}async function ua(e={}){jn();let t=e.env??J.env;if(e.runner&&!fe.includes(e.runner))throw new g(`invalid-option`,`Invalid --runner value: use ${fe.join(`, `)}`);if(e.port!==void 0&&(!Number.isInteger(e.port)||e.port<1||e.port>65535))throw new g(`invalid-option`,`Invalid port: use 1 through 65535.`);let n=t.PORT&&/^\d+$/.test(t.PORT)?Number(t.PORT):void 0,r=ca(t.PUBLIC_URL),i=e.port??n??r??8787;if(!Number.isInteger(i)||i<1||i>65535)throw new g(`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 g(`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&&!ln.has(s))throw new g(`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 g(`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=()=>{qn().then(e,t)}}):void 0,f=d?.then(()=>void 0).catch(()=>void 0),p=c?{cwd:e.cwd??J.cwd(),port:i,cacheMaintenance:f}:void 0,m=await oa({cwd:e.cwd,env:a,runner:e.runner,...p?{local:p}:{}}),h=m.defaultContext,_=()=>{m.sweep().catch(()=>{}),import(`./store-B3ZHoBJY.js`).then(e=>e.q).then(e=>e.renewInstallations(h)).catch(()=>{})};_();let v=setInterval(_,36e5);v.unref();let y=setInterval(()=>{Ie(h,!1,!0).catch(()=>{}),on(h).catch(()=>{}),t.PUBLIC_URL||import(`./store-B3ZHoBJY.js`).then(e=>e.q).then(e=>e.renewInstallations(h,`sync`)).catch(()=>{})},6e4);y.unref();let b=Vn.createServer(oe((e,t)=>na(e,h,{clientIp:t}),{limit:se,admit:e=>o||rt(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(y),clearInterval(v),await m.close(),e});let S=l?setTimeout(l,0):void 0,C=!1,ee=async()=>{C||(C=!0,clearInterval(y),clearInterval(v),await new Promise((e,t)=>b.close(n=>n?t(n):e())),await f,S&&clearTimeout(S),await m.close())},te=h.auth?`Wular Auth (${h.auth.issuer})`:void 0,ne=`http://localhost:${i}`,w=Fe(h),T=w===`local`?ne:x,E=m.config.store===`memory`?m.mintedToken??t.ADMIN_TOKEN:void 0;return{address:ne,publicUrl:x,warnings:m.warnings,close:ee,runner:m.config.runner,store:m.config.store,mode:w,...d?{cacheMigration:d}:{},maxTasks:m.config.maxTasks??m.config.limits?.concurrentTasks??10,...te?{signIn:te}:{},...m.mintedToken?{mintedToken:m.mintedToken}:{},...m.config.store===`postgres`&&t.DATABASE_URL?{database:Pn(t.DATABASE_URL)}:{},...ln.has(new URL(T).hostname)?{dashboard:`${T}/dash${E?`#token=${encodeURIComponent(E)}`:``}`}:{}}}async function da(e={}){try{return await ua(e)}catch(e){if(e instanceof g)throw e;let t=e instanceof Error&&e.cause instanceof Error?`: ${e.cause.message}`:``;throw new g(`server`,`${e instanceof Error?e.message:String(e)}${t}`)}}export{wi as a,xi as i,sa as n,Si as o,la as r,da as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as e}from"./cli-
|
|
1
|
+
import{s as e}from"./cli-DWCR7iqa.js";const t=e(`server`,{serve:async()=>(await import(`./serve-C0WC-QrV.js`)).commandServerServe,migrate:async()=>(await import(`./migrate-D4nzYhk8.js`)).commandServerMigrate,"rotate-key":async()=>(await import(`./rotate-key-BqnKhTK8.js`)).commandServerRotateKey,app:async()=>(await import(`./app-oE8G1-bi.js`)).commandServerApp,workflow:async()=>(await import(`./workflow-Cshghoas.js`)).commandServerWorkflow},{menu:[{usage:`serve [--port <n>]`,blurb:`run the server`},{usage:`migrate`,blurb:`apply pending database migrations`},{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{w as e}from"./dispatch-BKeAch9E.js";import{i as t}from"./cli-
|
|
1
|
+
import{w as e}from"./dispatch-BKeAch9E.js";import{i as t}from"./cli-DWCR7iqa.js";import{f as n,p as r,t as i}from"./output-BKeyLbvt.js";import{n as a,t as o}from"./args-BOEEdpWk.js";import s from"node:process";const c=t({name:`setup-host`,help:{usage:`coder setup-host [claude] [codex] [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{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{Rn as t}from"./store-
|
|
1
|
+
import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{Rn as t}from"./store-B3ZHoBJY.js";import{d as n,n as r,o as i,p as a,s as o,t as s}from"./schema-CU2iFkp8.js";import{and as c,eq as l,or as u}from"drizzle-orm";var d=e({UNSCOPED_ORGANIZATION:()=>``,addSecret:()=>N,agentRowId:()=>O,agentValue:()=>S,app:()=>m,appRowId:()=>D,date:()=>_,defined:()=>y,escapeLike:()=>v,install:()=>h,installationRowId:()=>k,ms:()=>g,opaque:()=>M,rows:()=>L,setSecret:()=>P,splitKey:()=>p,stateKey:()=>I,statePrefix:()=>F,taskRecord:()=>E,taskRowId:()=>A,versionColumns:()=>w,versionSummary:()=>T,versionValue:()=>C});const f=``;function p(e){let t=e.lastIndexOf(`:`),n=e.slice(t+1);return t>0&&/^\d+$/.test(n)?[e.slice(0,t),Number(n)]:void 0}const m=i,h=o,g=e=>e.getTime(),_=e=>new Date(e),v=e=>e.replace(/[\\%_]/g,`\\$&`),y=e=>Object.fromEntries(Object.entries(e).filter(([,e])=>e!=null)),b=e=>e?g(e):void 0,x=(e,t)=>{let n=/^repo:([^@]+)@(.+)$/.exec(e);return n&&t?{repo:n[1],ref:n[2],commit:t}:void 0},S=e=>y({id:e.slug,name:e.name,description:e.description,source:e.source,repo:e.repo,path:e.path,currentVersion:e.currentVersion,settings:e.settings,createdAt:g(e.createdAt),updatedAt:g(e.updatedAt)}),C=(e,t)=>y({agent:t,version:e.version,definition:e.definition,systemPrompt:e.systemPrompt,files:e.files,commit:e.commit,source:x(e.importedFrom,e.commit),importedFrom:e.importedFrom,createdAt:g(e.createdAt)}),w={id:r.id,agentId:r.agentId,version:r.version,definition:r.definition,commit:r.commit,importedFrom:r.importedFrom,createdAt:r.createdAt},T=(e,t)=>{let{systemPrompt:n,files:r,...i}=C({...e,systemPrompt:``,files:null},t);return i};function E(e){return y({task:y({id:e.publicId,source:e.source,agent:e.agent,flow:e.flow,runner:e.runner,permissions:e.permissions,event:e.event,prompt:e.prompt,args:e.args,mcp:e.mcp,author:e.author,definition:e.definition,credential:e.credential,requester:e.requester,runnerId:e.runnerId,usage:e.usage,tools:e.tools,toolScopes:e.toolScopes,context:e.context,files:e.files}),status:e.status,attempts:e.attempts,generation:e.generation,inboxSeq:e.inboxSeq,inboxAck:e.inboxAck<0?void 0:{generation:e.generation,seq:e.inboxAck},result:e.result,error:e.error,tokens:e.tokens,handle:e.handle,tokenHash:e.tokenHash,lastSeenAt:b(e.lastSeenAt),logCursor:e.logCursor??void 0,logSeq:e.logSeq??void 0,logBytes:e.logBytes??void 0,archivedAt:b(e.archivedAt),approval:e.approval,answer:Array.isArray(e.answer)?e.answer:void 0,createdAt:g(e.createdAt),startedAt:b(e.startedAt),finishedAt:b(e.finishedAt),cancelRequestedAt:b(e.cancelRequestedAt),updatedAt:g(e.updatedAt)})}async function D(e,t){let[n]=await e.db.select({id:m.id}).from(m).where(c(u(e.mine(m.organizationId),l(m.organizationId,``)),l(m.key,t)));if(!n)throw Error(`Unknown app "${t}".`);return n.id}async function O(e,t){let[n]=await e.db.select({id:s.id}).from(s).where(c(e.mine(s.organizationId),l(s.slug,t)));if(!n)throw Error(`Unknown agent "${t}".`);return n.id}async function k(e,t){let[n]=await e.db.select({id:h.id}).from(h).where(c(e.mine(h.organizationId),l(h.key,t)));if(!n)throw Error(`Unknown installation "${t}".`);return n.id}async function A(e,t){let[n]=await e.db.select({id:a.id}).from(a).where(c(e.mine(a.organizationId),l(a.publicId,t)));if(!n)throw Error(`Unknown task "${t}".`);return n.id}function j(e,n){if(n.startsWith(`plain.`))return{iv:`plain`,tag:``,ciphertext:n.slice(6),keyVersion:0};let[r,i,a]=n.split(`.`);if(!r||!i||!a)throw Error(`Invalid encrypted secret`);return{iv:r,tag:i,ciphertext:a,keyVersion:t(e.encryption,n)}}function M(e){return e.iv===`plain`?`plain.${e.ciphertext}`:`${e.iv}.${e.tag}.${e.ciphertext}`}async function N(e,t,r){let[i]=await e.db.insert(n).values({organizationId:e.organizationId,kind:t,...j(e,r)}).returning({id:n.id});return i.id}async function P(e,t,r){await e.db.update(n).set({...j(e,r),updatedAt:e.at()}).where(c(e.mine(n.organizationId),l(n.id,t)))}const F=(e,t)=>`o:${JSON.stringify([e,t])}:`,I=(e,t,n)=>F(e,t)+n;async function L(e,t){let n=await e.execute(t);return Array.isArray(n)?n:n.rows}export{T as C,w as S,p as _,m as a,E as b,y as c,k as d,g as f,d as g,P as h,S as i,v as l,L as m,N as n,D as o,M as p,O as r,_ as s,f as t,h as u,I as v,C as w,A as x,F as y};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./cli-
|
|
1
|
+
import{i as e}from"./cli-DWCR7iqa.js";import{g as t,p as n}from"./output-BKeyLbvt.js";import{n as r}from"./args-BOEEdpWk.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,t])=>({kind:`tools`,name:e,does:t.join(`, `)}))];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 (observe, comment, 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-hw3zKw8y.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-DWCR7iqa.js";import{g as n,p as r}from"./output-BKeyLbvt.js";import{i,n as a,s as o,t as s}from"./args-BOEEdpWk.js";import{isLocal as c}from"./list-5Ljf9TxF.js";import l from"node:path";import u from"node:process";const d={server:i,workspace:o,yes:a};function f(e,t){return c(e)?{id:e.id,name:e.name,source:e.builtin?`builtin`:`repo`,...e.dir&&!e.builtin?{dir:l.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 p(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],[`engine`,a?.engine??i.engine],[`model`,a?.model??i.model],[`effort`,a?.effort??i.effort]],c=Math.max(...s.map(([e])=>e.length))+2;for(let[e,n]of s)n&&u.stdout.write(`${t.dim(e.padEnd(c))}${n}\n`);let l=Object.entries(i.integrations).map(([e,t])=>{let n=a?.integrations?.[e],r=Array.isArray(t.triggers)?t.triggers:Object.keys(t.triggers??{}),i=n?.allowedEvents?r.filter(e=>n.allowedEvents.includes(e)):r,o=n?.allowedTools??t.tools;return{id:e,events:i.join(`, `)||`-`,tools:Array.isArray(o)?o.join(`, `):o??`-`}});u.stdout.write(`\n${n([{header:`integration`,value:e=>e.id,paint:e=>t.cyan(e)},{header:`events`,value:e=>e.events},{header:`tools`,value:e=>e.tools}],l,{style:t,border:!0})}`)}const m=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 and per-integration triggers and tools.`,flags:[t],examples:[[`coder agent show coder`,`what the built-in agent listens to and may do`]]},options:{...s,...d},args:1,run:async({options:e,args:[t],cwd:n})=>{let{agents:r}=await import(`./agent-hw3zKw8y.js`).then(e=>e.t);return r.show(t,{...e,cwd:n,organization:e.workspace})},json:(e,{cwd:t})=>f(e,t),print:(e,{cwd:t})=>p(f(e,t))});export{m as commandAgentShow};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./cli-
|
|
1
|
+
import{i as e}from"./cli-DWCR7iqa.js";import{g as t,p as n,s as r}from"./output-BKeyLbvt.js";import{n as i}from"./args-BOEEdpWk.js";import a from"node:process";const o=e({name:`auth status`,globalFlags:{cwd:!1},help:{usage:`coder auth status [--json]`,summary:`List saved sessions with their server, user, and workspace.`,env:[[`CODER_SERVER`,`the server to use instead of https://coder.wular.ai`]]},options:{json:i},run:async()=>{let{sessions:e}=await import(`./remote-miQNTVRa.js`).then(e=>e.c);return e.status()},print:e=>{let i=n,o=Object.entries(e);if(!o.length)return void a.stdout.write(`${i.dim(`Not signed in`)}\n\n${r([`Sign in: coder auth login`],i)}\n`);a.stdout.write(`${t([{header:`server`,value:([e])=>e,paint:e=>i.cyan(e)},{header:`user`,value:([,e])=>e.user.email},{header:`workspace`,value:([,e])=>e.organization?`${e.organization.name} (${e.organization.slug})`:`-`}],o,i)}\n`)}});export{o as commandStatus};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{xt as e}from"./dispatch-BKeAch9E.js";import{i as t,r as n}from"./cli-
|
|
1
|
+
import{xt as e}from"./dispatch-BKeAch9E.js";import{i as t,r as n}from"./cli-DWCR7iqa.js";import{p as r,s as i}from"./output-BKeyLbvt.js";import{i as a,n as o,s,t as c}from"./args-BOEEdpWk.js";import l from"node:process";const u={server:a,workspace:s,yes:o};function d(t,n,r){let[i,...a]=t,o=a.join(` `).trim();if(!i||!o)throw new e(`invalid-option`,n,{hint:r});return{id:i,text:o}}function f(e,t=!1){let{taskId:n,steered:a}=e;if(a===`queued`){l.stdout.write(`${r.dim(`[coder]`)} follow-up queued for task ${r.cyan(n)}; it runs when the current turn finishes.\n`),t&&l.stdout.write(`\n${r.dim(`[coder] --wait is not available for a queued follow-up.`)}\n\n${i([`Wait for the answer: coder task result ${n} --wait`],r)}\n`);return}if(!t){l.stdout.write(a===`live`?`${r.dim(`[coder]`)} steered follow-up into running task ${r.cyan(n)}.\n`:`${r.dim(`[coder]`)} resumed task ${r.cyan(n)} with the follow-up (same thread, same id).\n`),l.stdout.write(`\n${i([`Wait for the answer: coder task result ${n} --wait`],r)}\n`);return}l.stdout.write(`\n${e.finalMessage||`(no final message)`}\n\n`),l.stderr.write(`${r.dim(`[coder] task=${n} status=${e.status??`unknown`}`)}\n`)}const p=t({name:`task steer`,help:{usage:`coder task steer <task-id> "<follow-up instructions>" [--wait] [--server [url]]`,summary:`Continue a task's thread with new instructions. They are injected into a live Codex or
|
|
2
2
|
Claude turn at its next tool boundary and queued across a startup or completion race.
|
|
3
3
|
A stopped task resumes on the same task id. It reuses the task's engine, model, and
|
|
4
4
|
permissions unless overridden.`,flags:[[`--wait`,`run in the foreground and block until the answer is ready`],[`--model <alias|slug>`,`override the task's model for this follow-up`],[`--effort <low|medium|high>`,`override the task's reasoning effort`],[`--permissions <mode>`,`read-only · workspace-write · auto`],n],examples:[[`coder task steer task-abc "now add tests"`,`continue that task with a follow-up`]]},options:{...c,model:s,effort:s,permissions:s,background:o,wait:o,...u},args:1/0,async run({options:e,args:t}){let{tasks:n}=await import(`./task-C6VAg5WU.js`).then(e=>e.t),{id:r,text:i}=d(t,`Missing task id or follow-up text.`,[`Usage: coder task steer <task-id> "<follow-up>" [--wait]`,`Help: coder task steer --help`]);return n.steer(r,i,{...e,organization:e.workspace})},json(e,{options:t}){let n=e;return t.server!==void 0||!t.wait||n.steered===`queued`?e:{taskId:n.taskId,status:n.status??null,finalMessage:n.finalMessage??null}},print:(e,{options:t,args:[n]})=>t.server===void 0?f(e,t.wait):l.stdout.write(`Steered server task ${r.cyan(n)}.\n`),exit(e,{options:t}){let n=e;if(t.server===void 0&&t.wait&&n.steered!==`queued`)return n.status===`completed`?0:1}});export{p as commandSteer,d as idAndText};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e,r as t}from"./cli-
|
|
1
|
+
import{i as e,r as t}from"./cli-DWCR7iqa.js";import{p as n}from"./output-BKeyLbvt.js";import{i as r,n as i,s as a,t as o}from"./args-BOEEdpWk.js";import s from"node:process";const c={server:r,workspace:a,yes:i},l=e({name:`task stop`,help:{usage:`coder task stop <task-id> [--server [url]]`,summary:`Interrupt a running task and mark it cancelled.`,flags:[t]},options:{...o,...c},args:1,run:async({options:e,args:[t]})=>{let{tasks:n}=await import(`./task-C6VAg5WU.js`).then(e=>e.t);return n.stop(t,{...e,organization:e.workspace})},print:(e,{options:t,args:[r]})=>s.stdout.write(t.server===void 0?`Stopped task ${n.cyan(e.taskId)} ${n.dim(`(${e.interrupt})`)}\n`:`Stopped server task ${n.cyan(r)}.\n`)});export{l as commandStop};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{i as e}from"./cli-
|
|
1
|
+
import{i as e}from"./cli-DWCR7iqa.js";import{m as t,p as n,s as r}from"./output-BKeyLbvt.js";import{n as i,t as a}from"./args-BOEEdpWk.js";import o from"node:process";const s=e({name:`flow stop`,help:{usage:`coder flow stop [run-id] [--keep-tasks] [--json]`,summary:`Stop a running flow: signal the orchestrator so it stops dispatching, stamp the
|
|
2
2
|
run stopped, and stop its still-running tasks. Defaults to the most recent run;
|
|
3
3
|
the journal stays ready for \`coder flow resume\`.`,flags:[[`--keep-tasks`,`leave the run's still-running tasks running`]]},options:{...a,"keep-tasks":i},args:1,run:async({options:e,args:[t]})=>{let{stopRun:n}=await import(`./executor-BvAA7Cgw.js`).then(e=>e.t);return n(t,{keepTasks:e[`keep-tasks`]})},print:c});function c(e){let i=n;e.status===`failed`?o.stdout.write(`${i.dim(`[flow]`)} Run ${i.cyan(e.runId)} orchestrator died. Marked ${t(`failed`)}.\n`):o.stdout.write(`${i.dim(`[flow]`)} run ${i.cyan(e.runId)} ${t(e.status)}.\n`),e.stoppedTasks.length&&o.stdout.write(`${i.dim(`[flow]`)} stopped tasks: ${e.stoppedTasks.join(`, `)}\n`),e.keptTasks.length&&o.stdout.write(`${i.dim(`[flow]`)} left running: ${e.keptTasks.join(`, `)}\n`),o.stdout.write(`\n${r([`Resume: coder flow resume ${e.runId}`],i)}\n`)}export{s as commandStop};
|