@wular/coder 0.4.2 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions-FzDNxMFf.js +20 -0
- package/dist/{adapter-BKVzTDnn.js → adapter-7SEiVsmp.js} +1 -1
- package/dist/{adapter-B0oYCI0S.js → adapter-BLEfUqoQ.js} +1 -1
- package/dist/{adapter-DPInwbJG.js → adapter-H4GlcKQz.js} +1 -1
- package/dist/{add-DRsPpQFl.js → add-B50dIJGd.js} +1 -1
- package/dist/{add-DkpUwhtO.js → add-D7X3gxap.js} +1 -1
- package/dist/{add-C2y-mVzl.js → add-DOEUHIe7.js} +1 -1
- package/dist/{add-CLYTF_up.js → add-QExQhTzi.js} +1 -1
- package/dist/{add-json-5uPnWPoD.js → add-json-Ck4KIZrT.js} +1 -1
- package/dist/{agent-r5mMcehf.js → agent-BPtnEf1q.js} +1 -1
- package/dist/{agent-hw3zKw8y.js → agent-BlQ_dNNm.js} +2 -2
- package/dist/{alias-_0Rwf2cA.js → alias-BwQBovke.js} +1 -1
- package/dist/{app-oE8G1-bi.js → app-y6BYm2eH.js} +1 -1
- package/dist/{approvals-DbVrsxec.js → approvals-Cc9cq5T1.js} +2 -2
- package/dist/{approve-DeAhFL-m.js → approve-oO9k2fnK.js} +2 -2
- package/dist/{apps-eujHiNca.js → apps-CU2YalX8.js} +1 -1
- package/dist/{archive-BCUfymIB.js → archive-C5c_HQS1.js} +2 -2
- package/dist/{archive-DZ6vpMHb.js → archive-CemlWlVY.js} +2 -2
- package/dist/archive-sweep-ehg-fWIt.js +1 -0
- package/dist/{args-BOEEdpWk.js → args-DcBCtXhz.js} +1 -1
- package/dist/{ask-BU2WVxVM.js → ask-Chu7Twu_.js} +2 -2
- package/dist/auth-BOyXPOtu.js +1 -0
- package/dist/auth-XbqKSbcD.js +1 -0
- package/dist/{chat-bridge-BS9WtP3X.js → chat-bridge-DXgZItGP.js} +1 -1
- package/dist/{chat-B_yhNTo0.js → chat-cknlIhVh.js} +1 -1
- package/dist/{cli-DWCR7iqa.js → cli-B1ObVrL4.js} +5 -5
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +1 -1
- package/dist/{client-D9IoAuDD.js → client-31YzOj-i.js} +1 -1
- package/dist/{config-12pK4qW7.js → config-DAE_qHYA.js} +1 -1
- package/dist/{create-D3f6q0Yq.js → create-CM8B8JxD.js} +1 -1
- package/dist/credentials-BXD4Qptk.js +1 -0
- package/dist/dash/manifest.json +949 -915
- package/dist/dash/public/assets/chunks/{agent-pills-dd0b7643e125bbf1.js → agent-pills-b6a6da91c9559d9f.js} +1 -1
- package/dist/dash/public/assets/chunks/{agent-settings-form-45ae6aeaaed2b568.js → agent-settings-form-b615c677046cd6f2.js} +1 -1
- package/dist/dash/public/assets/chunks/agents-grid-f2e7b4ff9e11b6e3.js +1 -0
- package/dist/dash/public/assets/chunks/{badge-676b01e0c615bf7b.js → badge-215c7b2631dafc69.js} +1 -1
- package/dist/dash/public/assets/chunks/{card-e0901d68b79dfa93.js → card-e86dcc81326d2b14.js} +1 -1
- package/dist/dash/public/assets/chunks/{combo-952a457d52360d88.js → combo-09e246dc9a517fa8.js} +1 -1
- package/dist/dash/public/assets/chunks/composer-417166b029f48c47.js +1 -0
- package/dist/dash/public/assets/chunks/composer-645ae8fa97a35280.js +1 -0
- package/dist/dash/public/assets/chunks/{confirm-f2fe4ba9905a89c6.js → confirm-5ae484241ad888fd.js} +1 -1
- package/dist/dash/public/assets/chunks/{connect-apps-661f3b3a85f1776a.js → connect-apps-4147c45f45fde2b1.js} +1 -1
- package/dist/dash/public/assets/chunks/{connect-repositories-5389ec8701a3deac.js → connect-repositories-77591110836bdf03.js} +1 -1
- package/dist/dash/public/assets/chunks/credentials-list-e005a0783ec93465.js +2 -0
- package/dist/dash/public/assets/chunks/{custom-range-03ba6fb2ade7d282.js → custom-range-463e119af4681c61.js} +1 -1
- package/dist/dash/public/assets/chunks/{editor-34cb529d6d8a4b09.js → editor-804b84f4fe6539cd.js} +4 -4
- package/dist/dash/public/assets/chunks/{engines-list-2f1acee3ecc8461a.js → engines-list-ceab51f13c690e8c.js} +1 -1
- package/dist/dash/public/assets/chunks/{field-901f1f35c18c39c9.js → field-aa0a4b98a976781e.js} +1 -1
- package/dist/dash/public/assets/chunks/filter-91144ac2eec6297f.js +1 -0
- package/dist/dash/public/assets/chunks/format-105c706345987fb2.js +1 -0
- package/dist/dash/public/assets/chunks/heads-a42817b32d2d7f08.js +1 -0
- package/dist/dash/public/assets/chunks/{instructions-052fa45a9daf6db6.js → instructions-3a1dcaff2d868aa5.js} +1 -1
- package/dist/dash/public/assets/chunks/instructions-6c6f981fffaa31e4.js +1 -0
- package/dist/dash/public/assets/chunks/{list-87b359bebd26986a.js → list-7270361464fc3c04.js} +1 -1
- package/dist/dash/public/assets/chunks/{mcp-list-b42f0d2ee463b37d.js → mcp-list-2e715d48666b54ad.js} +1 -1
- package/dist/dash/public/assets/chunks/{models-list-0669d26fd662aec3.js → models-list-d3c40f94c761a6e5.js} +1 -1
- package/dist/dash/public/assets/chunks/paged-3ddb6077bef42752.js +1 -0
- package/dist/dash/public/assets/chunks/{platform-actions-c92ca3c6198a9387.js → platform-actions-271ec3b99a64280b.js} +1 -1
- package/dist/dash/public/assets/chunks/runners-list-767e49c7d0ec833a.js +1 -0
- package/dist/dash/public/assets/chunks/{segmented-358ff2b4992b8384.js → segmented-de4386ccaac7304d.js} +1 -1
- package/dist/dash/public/assets/chunks/{select-1013702bdfb1ade4.js → select-a90307706cffa6e0.js} +1 -1
- package/dist/dash/public/assets/chunks/{sentinel-c972a33dc69a5135.js → sentinel-b5e032b38604dfd3.js} +1 -1
- package/dist/dash/public/assets/chunks/shared-init-7f81ae7bc8c82438.js +2 -0
- package/dist/dash/public/assets/chunks/shared-init-933c7f9ee85be766.js +5 -0
- package/dist/dash/public/assets/chunks/{tail-7c27aab8ba268bd9.js → tail-4891e727ee526792.js} +1 -1
- package/dist/dash/public/assets/chunks/task-actions-ce854925a2dc78fd.js +1 -0
- package/dist/dash/public/assets/chunks/task-ddfddeaf07fb684c.js +1 -0
- package/dist/dash/public/assets/chunks/task-view-c37dcee08f21a279.js +5 -0
- package/dist/dash/public/assets/chunks/tasks-list-baef587999f322d8.js +1 -0
- package/dist/dash/public/assets/chunks/{toolbar-f964fa864699f095.js → toolbar-8d98313606ad8a2d.js} +1 -1
- package/dist/dash/public/assets/chunks/{versions-list-fc2e0d2a7382e049.js → versions-list-532690efd9f1b0ea.js} +1 -1
- package/dist/dash/public/assets/{dash-account-96fc41be318839fa.css → dash-account-edc56e85dbaaabe0.css} +1 -1
- package/dist/dash/public/assets/dash-agents-edba57b67e4005d0.css +1 -0
- package/dist/dash/public/assets/dash-agents-new-fe22253fbada2fbf.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-adf52e9dacb2d825.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-edit-a2937a347689ef29.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-platforms-265ba13db32a460d.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-settings-8afc52eb0372bc4b.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-tasks-6193e646be68dbd2.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-usage-ceadb3a1c911c402.css +1 -0
- package/dist/dash/public/assets/{dash-settings-53b8e6a8f656fa1a.css → dash-settings-cf1997cd7f72e518.css} +1 -1
- package/dist/dash/public/assets/dash-settings-param-tab-b44dac8e79a560e6.css +1 -0
- package/dist/dash/public/assets/dash-tasks-916c7100a8058aa3.css +1 -0
- package/dist/dash/public/assets/dash-tasks-param-id-194a6ffc20e872f2.css +1 -0
- package/dist/dash/public/assets/{dash-usage-884943221f76ad93.css → dash-usage-40940b289f85e0b6.css} +1 -1
- package/dist/dash/public/assets/pnext-client-13aee92bef5c9e3f.js +1 -0
- package/dist/dash/public/assets/pnext-client-1f2686b2044f0df6.js +1 -0
- package/dist/dash/public/assets/pnext-client-26130234ebad7067.js +1 -0
- package/dist/dash/public/assets/pnext-client-311e35b0076bf406.js +1 -0
- package/dist/dash/public/assets/pnext-client-4ade1bf75c9c3d87.js +1 -0
- package/dist/dash/public/assets/pnext-client-61cd31b687ede1da.js +1 -0
- package/dist/dash/public/assets/{pnext-client-2693db10b197ade1.js → pnext-client-61db65dc4223217a.js} +1 -1
- package/dist/dash/public/assets/pnext-client-6ea656e7705e3f2a.js +1 -0
- package/dist/dash/public/assets/pnext-client-7fd0f793f0322cb9.js +1 -0
- package/dist/dash/public/assets/pnext-client-88159c0840fcfa4a.js +1 -0
- package/dist/dash/public/assets/pnext-client-b03f0c47c066b4f3.js +1 -0
- package/dist/dash/public/assets/{pnext-client-1afa4148bea69ad2.js → pnext-client-d6478835f543f901.js} +1 -1
- package/dist/dash/public/assets/pnext-client-dadb8359021ed590.js +1 -0
- package/dist/dash/public/assets/pnext-client-de07532d6aaebf2c.js +1 -0
- package/dist/dash/public/assets/pnext-client-f87a31890c8ff224.js +1 -0
- package/dist/dash/public/assets/pnext-client-ffe1c123a8e2a350.js +1 -0
- package/dist/{default-CwQXCtoB.js → default-BMvUMTFp.js} +1 -1
- package/dist/default-B_nKaX0-.js +1 -0
- package/dist/{delete-cS01oOIb.js → delete-Bjteibld.js} +2 -2
- package/dist/{delete-BD6AnCLg.js → delete-riCIKZwj.js} +2 -2
- package/dist/{disable-BMWWeYFQ.js → disable-DQC56YFy.js} +1 -1
- package/dist/{discover-Dvr_3_Xr.js → discover-Qanr5TEO.js} +1 -1
- package/dist/{discover-Cfx5RPU7.js → discover-lgTYwoQp.js} +2 -2
- package/dist/dispatch-BsW_1m7e.js +14 -0
- package/dist/{docs-DWegDRiu.js → docs-DFs7lOJp.js} +1 -1
- package/dist/{docs-BX65z2Iu.js → docs-DKROso-4.js} +2 -2
- package/dist/{enable-Cfzeau2x.js → enable-D2DqZvcU.js} +1 -1
- package/dist/{env-CRf6wkM2.js → env-YRY3I60r.js} +1 -1
- package/dist/exec-DuUkLMqg.js +11 -0
- package/dist/executor-vMppVLB6.js +10 -0
- package/dist/flow/builtin/review.js +1 -1
- package/dist/flow/index.d.ts +1 -1
- package/dist/flow/index.js +1 -1
- package/dist/{flow-kAxxVOiR.js → flow-DmERAnR8.js} +1 -1
- package/dist/{github-actions-DwUzm4hC.js → github-actions-C_NkHVJq.js} +1 -1
- package/dist/http-D01Udu4u.js +1 -0
- package/dist/{index-CZjFX5zV.d.ts → index-B1L4zXZH.d.ts} +2 -1
- package/dist/{init-C4tDFH4G.js → init-Bd6JHzBc.js} +1 -1
- package/dist/integrations-B2CavXR1.js +5 -0
- package/dist/integrations-D1Dwy1kt.js +1 -0
- package/dist/lib/broker.js +2 -2
- package/dist/{list-DuPqU3fk.js → list-4Uo-0v9s.js} +1 -1
- package/dist/{list-COAo7eZd.js → list-B0ujEZhd.js} +3 -3
- package/dist/{list-5Ljf9TxF.js → list-B5oa1Bhy.js} +2 -2
- package/dist/{list-vOvIpbOH.js → list-BjE_l6la.js} +1 -1
- package/dist/{list-J8d_zh-o.js → list-Ck9ibCs1.js} +1 -1
- package/dist/{list-vpyS-hv8.js → list-DhgK4Zc4.js} +1 -1
- package/dist/{list-way5oLO0.js → list-KvL7AUhD.js} +2 -2
- package/dist/{list-DzGuMkQy.js → list-byYLBl1U.js} +1 -1
- package/dist/{load-BpEsAn51.js → load-SnZd7xG1.js} +1 -1
- package/dist/{local-H3uvqEbq.js → local-BRy1EUq2.js} +1 -1
- package/dist/log-view-DeJstSkw.js +3 -0
- package/dist/{login-BBw95-S3.js → login-C-ahtDKV.js} +1 -1
- package/dist/{login-CNmeRAL7.js → login-zpwke8g1.js} +1 -1
- package/dist/{logout-j0dTo_Ib.js → logout-CI6Kf-T6.js} +1 -1
- package/dist/{maintenance-DkLVtqM7.js → maintenance-BAzr9Jlr.js} +1 -1
- package/dist/{match-CXAjDhg7.js → match-DxV1d49D.js} +1 -1
- package/dist/{mcp-BgKb2Cdk.js → mcp-CmcL1MCG.js} +1 -1
- package/dist/{mcp-CsmBtlW9.js → mcp-mhXwtGQT.js} +1 -1
- package/dist/{migrate-N-85_N7J.js → migrate-Czh3TEK5.js} +1 -1
- package/dist/{migrate-D4nzYhk8.js → migrate-w7KfzUAR.js} +1 -1
- package/dist/{model-B79MFtRV.js → model-JRoTH9QK.js} +1 -1
- package/dist/models-C-S7HqSb.js +1 -0
- package/dist/{prompt-CEuBMNhk.js → prompt-CMXmt2l9.js} +4 -4
- package/dist/{push-DbdnbZYt.js → push-B8BhTyZs.js} +1 -1
- package/dist/queue-CirjEskI.js +117 -0
- package/dist/refresh-Bmy2r1Ee.js +1 -0
- package/dist/{remote-miQNTVRa.js → remote-CxFnEjZl.js} +1 -1
- package/dist/{remove-BNzbUhaK.js → remove-C15WLaXT.js} +1 -1
- package/dist/{remove-D-QeeZQL.js → remove-CTZYjjSr.js} +1 -1
- package/dist/{remove-CLpL12Ya.js → remove-CTl-H0f0.js} +1 -1
- package/dist/{remove-CaYH9Cna.js → remove-DX2FVo5b.js} +1 -1
- package/dist/rename-D1g4TnHQ.js +1 -0
- package/dist/{result-BfTfJayl.js → result-D49VN8PM.js} +3 -3
- package/dist/result-DGWyUHYU.js +18 -0
- package/dist/{resume-aZ8yWDBh.js → resume-ywzc7z6A.js} +2 -2
- package/dist/{review-BEhDcX4b.js → review-ZC0xG8XY.js} +2 -2
- package/dist/{rotate-key-BqnKhTK8.js → rotate-key-Bf8_99ck.js} +1 -1
- package/dist/{run-BWbabvub.js → run-D7SJ-ieT.js} +2 -2
- package/dist/run-DoRQSC_K.js +2 -0
- package/dist/{run-BdPjxaZU.js → run-ukCf2Mdy.js} +1 -1
- package/dist/runner-D-REfOUe.js +1 -0
- package/dist/{runner-sUpWJ_k0.js → runner-wDYhkVsM.js} +1 -1
- package/dist/schema-DoNO0dPh.js +1 -0
- package/dist/sdk.d.ts +4 -2
- package/dist/sdk.js +1 -1
- package/dist/serve-BJ_Mbm2m.js +8 -0
- package/dist/{serve-C0WC-QrV.js → serve-C1MMhM1F.js} +2 -2
- package/dist/{serve-CcObDKKQ.js → serve-DtrOHaoS.js} +2 -2
- package/dist/{serve-Ck95047c.js → serve-P9pFkEnE.js} +1 -1
- package/dist/{serve-BTeomYxW.js → serve-yjSw0B1a.js} +1 -1
- package/dist/{server-BxLFZL80.js → server-DDWTnmbx.js} +1 -1
- package/dist/{setup-host-DLd_j2Uw.js → setup-host-L6Rnn5Cz.js} +1 -1
- package/dist/{shared-BLkGRKty.js → shared-XsUX_ZZb.js} +1 -1
- package/dist/{show-DzoQIs75.js → show-CU-jqJ90.js} +1 -1
- package/dist/{show-FC3dJcD-.js → show-DVJmB2u-.js} +1 -1
- package/dist/{status-BU3DR1XU.js → status-CBydR7LE.js} +1 -1
- package/dist/{steer-P_38hRRD.js → steer-Cm_sHZqs.js} +2 -2
- package/dist/{stop-BJGDRPsp.js → stop-DJS7DAPJ.js} +1 -1
- package/dist/{stop-BWY6k6v5.js → stop-TrebIIuv.js} +2 -2
- package/dist/store-BrNMqJgk.js +42 -0
- package/dist/store-j8icrG0v.js +19 -0
- package/dist/task-C8lmcNsf.js +1 -0
- package/dist/{task-DeglY79z.js → task-CpUI19o2.js} +4 -4
- package/dist/task-CvSqiwxo.js +1 -0
- package/dist/{test-BrSrhop9.js → test-CDKz4jY_.js} +1 -1
- package/dist/{tools-CgswhJzh.js → tools-DBFeoosk.js} +1 -1
- package/dist/{types-I5Cwtl_K.d.ts → types-DMGBYB_K.d.ts} +3 -1
- package/dist/{unalias-mMHXqok7.js → unalias-BfQFBnuK.js} +1 -1
- package/dist/{update-DbOWToPy.js → update-C4FFOie8.js} +1 -1
- package/dist/{upgrade-D6oC9HQI.js → upgrade-DLJqMnUQ.js} +2 -2
- package/dist/{usage-Cb8Dtv9V.js → usage-CSh-xwQ2.js} +1 -1
- package/dist/{usage-DMs-IIJC.js → usage-D8mc4qXK.js} +1 -1
- package/dist/{watch-BcMQXGYO.js → watch-CQu-tJKZ.js} +2 -2
- package/dist/{watch-eE2XiwsC.js → watch-DmwaEvoi.js} +2 -2
- package/dist/{wire-BeT1Axeo.js → wire-DzGLZ3-O.js} +1 -1
- package/dist/worker-BLKTMLqa.js +1 -0
- package/dist/worker-nHemduM_.js +9 -0
- package/dist/{workflow-Cshghoas.js → workflow-IrouAus_.js} +1 -1
- package/docs/mcp.md +1 -1
- package/migrations/0000_initial.sql +8 -0
- package/migrations/meta/0000_snapshot.json +75 -1
- package/migrations/meta/_journal.json +1 -1
- package/package.json +1 -1
- package/plugins/agents/skills/coder/SKILL.md +1 -0
- package/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/plugins/claude/skills/dispatch/SKILL.md +1 -1
- package/plugins/cursor/.cursor-plugin/plugin.json +1 -1
- package/plugins/cursor/skills/coder/SKILL.md +1 -0
- package/src/client/index.ts +10 -2
- package/src/client/types.ts +18 -0
- package/src/core/defaults.ts +11 -0
- package/src/core/task/log-view.ts +120 -6
- package/src/server/dash/app/dash/agents/(list)/agent-menu.tsx +4 -0
- package/src/server/dash/app/dash/agents/(list)/agents-grid.tsx +18 -35
- package/src/server/dash/app/dash/agents/(list)/loading.tsx +7 -1
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/layout.tsx +2 -1
- package/src/server/dash/app/dash/layout.tsx +13 -3
- package/src/server/dash/app/dash/settings/[tab]/credentials-list.tsx +20 -13
- package/src/server/dash/app/dash/settings/[tab]/runners-list.tsx +13 -12
- package/src/server/dash/app/dash/tasks/[id]/activity.tsx +49 -4
- package/src/server/dash/app/dash/tasks/[id]/task-actions.tsx +43 -6
- package/src/server/dash/app/dash/tasks/[id]/task-view.css +52 -31
- package/src/server/dash/app/dash/tasks/[id]/task-view.tsx +143 -51
- package/src/server/dash/app/dash/tasks/composer.css +4 -0
- package/src/server/dash/app/dash/tasks/composer.tsx +6 -5
- package/src/server/dash/app/dash/tasks/list/task.ts +29 -1
- package/src/server/dash/app/dash/tasks/list/tasks-list.css +20 -7
- package/src/server/dash/app/dash/tasks/list/tasks-list.tsx +256 -109
- package/src/server/dash/app/dash/tasks/list/tasks-section.tsx +9 -13
- package/src/server/dash/app/dash/tasks/page.tsx +3 -35
- package/src/server/dash/comps/frame/loading-card.tsx +4 -3
- package/src/server/dash/comps/frame/page-head.css +10 -0
- package/src/server/dash/comps/frame/page-head.tsx +3 -2
- package/src/server/dash/comps/frame/task-toasts.tsx +196 -50
- package/src/server/dash/comps/nav/side-toggle.tsx +15 -4
- package/src/server/dash/comps/ui/card.css +1 -0
- package/src/server/dash/comps/ui/filter.css +64 -0
- package/src/server/dash/comps/ui/filter.tsx +336 -0
- package/src/server/dash/comps/ui/icons.ts +2 -0
- package/src/server/dash/comps/ui/menu.tsx +4 -0
- package/src/server/dash/comps/ui/select.tsx +2 -2
- package/src/server/dash/comps/ui/toolbar.css +14 -0
- package/src/server/dash/utils/client.ts +21 -0
- package/src/server/dash/utils/format.ts +12 -4
- package/src/server/dash/utils/paged.ts +14 -6
- package/dist/actions-Mk3FSlpJ.js +0 -20
- package/dist/archive-sweep-Cxbh8yAI.js +0 -1
- package/dist/auth-CBWTmAPA.js +0 -1
- package/dist/auth-Dmn2U7rr.js +0 -1
- package/dist/credentials-l6dsrZLL.js +0 -1
- package/dist/dash/public/assets/chunks/agents-grid-b906da80c31fc035.js +0 -1
- package/dist/dash/public/assets/chunks/composer-49f9e7c5c4dfda3b.js +0 -1
- package/dist/dash/public/assets/chunks/composer-f331d00837143aee.js +0 -1
- package/dist/dash/public/assets/chunks/credentials-list-e6177d0943517929.js +0 -2
- package/dist/dash/public/assets/chunks/format-eb03fc9d9744d960.js +0 -1
- package/dist/dash/public/assets/chunks/heads-1570a3a6db331979.js +0 -1
- package/dist/dash/public/assets/chunks/instructions-d0a4b0d95009c262.js +0 -1
- package/dist/dash/public/assets/chunks/paged-bc6fa0c2b9d52ed7.js +0 -1
- package/dist/dash/public/assets/chunks/runners-list-9fffa50432c470c9.js +0 -1
- package/dist/dash/public/assets/chunks/shared-init-20e199043ff5d00f.js +0 -2
- package/dist/dash/public/assets/chunks/shared-init-88cce66bb3cfe1e5.js +0 -5
- package/dist/dash/public/assets/chunks/task-actions-a9603d520434baab.js +0 -1
- package/dist/dash/public/assets/chunks/task-fa8b82e95e771c4a.js +0 -1
- package/dist/dash/public/assets/chunks/task-view-f7039cb330bcb0b5.js +0 -3
- package/dist/dash/public/assets/chunks/tasks-list-2a905b4a0c3a9042.js +0 -1
- package/dist/dash/public/assets/dash-agents-290a7b21c7dc0c92.css +0 -1
- package/dist/dash/public/assets/dash-agents-new-a7a07bf4ebda24c2.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-69a72fb0bbd14cc2.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-edit-397bdfb2f0ca328c.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-platforms-a7b3b7247c27f1d2.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-settings-8389b7d0555e8ccf.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-tasks-5987b8aea5e8f30d.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-usage-19abc69e1d4e6b0a.css +0 -1
- package/dist/dash/public/assets/dash-settings-param-tab-ac61fdfdd6fd533f.css +0 -1
- package/dist/dash/public/assets/dash-tasks-cc0b1d32874b731c.css +0 -1
- package/dist/dash/public/assets/dash-tasks-param-id-02b8c7bd99cc1090.css +0 -1
- package/dist/dash/public/assets/pnext-client-17ba55bb57a1f4da.js +0 -1
- package/dist/dash/public/assets/pnext-client-43f52a07f8067b1b.js +0 -1
- package/dist/dash/public/assets/pnext-client-4594b693fe612835.js +0 -1
- package/dist/dash/public/assets/pnext-client-73f73e24f8141fb6.js +0 -1
- package/dist/dash/public/assets/pnext-client-7574da4651b40eae.js +0 -1
- package/dist/dash/public/assets/pnext-client-7b3a2c1092cbbb02.js +0 -1
- package/dist/dash/public/assets/pnext-client-816fe5fc96d3f768.js +0 -1
- package/dist/dash/public/assets/pnext-client-86cb956b448b0887.js +0 -1
- package/dist/dash/public/assets/pnext-client-8b64e3c030164288.js +0 -1
- package/dist/dash/public/assets/pnext-client-8f6161084c595a22.js +0 -1
- package/dist/dash/public/assets/pnext-client-9203ec11926e5d04.js +0 -1
- package/dist/dash/public/assets/pnext-client-a38b446f941d44df.js +0 -1
- package/dist/dash/public/assets/pnext-client-bd8d51aaa095e8a4.js +0 -1
- package/dist/dash/public/assets/pnext-client-e9821d1f1bdb281d.js +0 -1
- package/dist/default-De8FXiWz.js +0 -1
- package/dist/dispatch-BKeAch9E.js +0 -14
- package/dist/exec-RZFLclKX.js +0 -11
- package/dist/executor-BvAA7Cgw.js +0 -10
- package/dist/http-Bkg_OQ6r.js +0 -1
- package/dist/integrations-BAgdVDhj.js +0 -5
- package/dist/integrations-D-L3uQRj.js +0 -1
- package/dist/log-view-dg0TlKLA.js +0 -1
- package/dist/models-_5LVGC3m.js +0 -1
- package/dist/queue-C9fSdE_X.js +0 -116
- package/dist/refresh-BDmap1RA.js +0 -1
- package/dist/rename-Bhcb4t9F.js +0 -1
- package/dist/result-D8DsvJDu.js +0 -15
- package/dist/run-Dqe38jX8.js +0 -2
- package/dist/runner-BPpiJvHx.js +0 -1
- package/dist/schema-CU2iFkp8.js +0 -1
- package/dist/serve-DA5I2qXj.js +0 -4
- package/dist/store-B3ZHoBJY.js +0 -8
- package/dist/store-BLi19UDE.js +0 -42
- package/dist/task-C6VAg5WU.js +0 -1
- package/dist/task-b2BK481M.js +0 -1
- package/dist/worker-CXndxmGF.js +0 -9
- package/dist/worker-DrucI22w.js +0 -1
package/dist/store-B3ZHoBJY.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{$t as t,At as n,En as r,Et as i,J as a,Kt as o,Lt as s,On as c,Pt as l,Qt as u,Rt as d,Ut as f,Wt as p,Xt as m,Zt as h,_t as g,bn as _,bt as v,cn as y,d as ee,en as b,g as te,ht as ne,jt as re,kt as ie,nt as ae,o as oe,r as se,rn as ce,s as le,sn as ue,vt as de,x as fe,xt as pe,zt as x}from"./dispatch-BKeAch9E.js";import{t as me}from"./types-D0q15RJa.js";import{a as he,i as ge,l as _e,n as ve,o as ye,r as be,s as xe,t as Se}from"./load-BpEsAn51.js";import{c as Ce,d as we,i as Te,l as Ee,t as De,u as Oe}from"./integrations-BAgdVDhj.js";import{i as ke,t as Ae}from"./discover-Dvr_3_Xr.js";import{a as je,c as Me,n as Ne,s as Pe}from"./actions-Mk3FSlpJ.js";import{g as Fe,h as Ie,i as Le,r as Re}from"./executor-BvAA7Cgw.js";import{n as ze,r as Be,t as Ve}from"./exec-RZFLclKX.js";import{f as He,n as Ue,r as We,t as Ge}from"./task-DeglY79z.js";import{t as Ke}from"./match-CXAjDhg7.js";import{a as qe,i as Je,n as Ye,o as Xe,r as Ze,t as Qe}from"./local-H3uvqEbq.js";import{a as S,c as $e,d as C,f as et,i as tt,l as w,m as nt,n as rt,p as it,r as at,u as ot}from"./http-Bkg_OQ6r.js";import{n as st}from"./github-actions-DwUzm4hC.js";import{t as ct}from"./log-view-dg0TlKLA.js";import{n as lt,t as ut}from"./chat-3Znsevah.js";import T from"node:path";import E from"node:process";import{fileURLToPath as dt,pathToFileURL as ft}from"node:url";import*as D from"zod/mini";import O,{accessSync as pt,constants as mt,cpSync as ht,existsSync as gt,readFileSync as _t,readdirSync as vt,realpathSync as yt,rmSync as bt,statSync as xt,symlinkSync as St}from"node:fs";import{execFile as Ct,spawn as wt}from"node:child_process";import{createCipheriv as Tt,createDecipheriv as Et,createHash as Dt,createHmac as Ot,randomBytes as k,randomUUID as kt}from"node:crypto";import At,{tmpdir as jt}from"node:os";import{isIP as Mt}from"node:net";import{isDeepStrictEqual as Nt,promisify as Pt}from"node:util";import{lookup as Ft}from"node:dns/promises";import{request as It}from"node:https";import{brotliDecompressSync as Lt,constants as Rt,createGzip as zt,gunzipSync as Bt,gzipSync as Vt,inflateSync as Ht}from"node:zlib";import{Chat as Ut,Message as Wt}from"chat";const Gt=e=>`nonce:${we(e)}`;function Kt(e){let t=e.config.encryptionKey??e.config.adminToken;if(!t)throw Error(`A server secret is required to issue browser transactions.`);return t}function qt(e,t){return Ot(`sha256`,Kt(e)).update(t).digest(`base64url`)}async function Jt(e,t,n,r,i=6e5){let a=(e.now??Date.now)(),o={kind:t,user:n,organization:e.organizationId,target:r,nonce:k(18).toString(`base64url`),exp:a+i},s=Xe(o),c=`${s}.${qt(e,s)}`;return await e.store.put(`delivery`,Gt(c),{at:a},{ttlMs:i}),c}function Yt(e,t){let[n,r,i]=t.split(`.`);if(!(!n||!r||i!==void 0)&&Oe(qt(e,n),r))try{return qe(n)}catch{return}}function Xt(e,t){return Yt(e,t)?.organization}function Zt(e,t){return Yt(e,t)?.user}async function Qt(e,t,n,r,i){let a=Yt(e,t),o=(e.now??Date.now)();return!a||a.kind!==n||a.user!==r||a.organization!==e.organizationId||a.target!==i||a.exp<o?!1:e.store.take(`delivery`,Gt(t))}async function $t(e,t,n,r){let i=Yt(e,t),a=(e.now??Date.now)();if(!(!i||i.kind!==n||i.user!==`*`&&i.user!==r||i.organization!==e.organizationId||i.exp<a||!await e.store.take(`delivery`,Gt(t))))return i.target}async function en(e,t,n,r){let i=Yt(e,t),a=(e.now??Date.now)();if(!(!i||i.kind!==n||i.user!==`*`&&i.user!==r||i.organization!==e.organizationId||i.exp<a||!await e.store.get(`delivery`,Gt(t))))return i.target}const tn=(e,t=200)=>Ee(`<title>Coder</title><p>${Ce(e)}</p>`+(t>=400?`<p><a href="/dash">Back to the dashboard</a> to start again.</p>`:``),t);function nn(e){let t=e.get(`agent`),n=e.get(`def`),r=at(n);if(!(!t||!n||!r?.integrations))return{state:{agent:t,repo:e.get(`repo`)??void 0,branch:e.get(`branch`)??void 0,def:n,tx:e.get(`tx`)??void 0,owner:e.get(`owner`)||void 0,...[`1`,`true`].includes(e.get(`public`)??``)?{public:!0}:{}},definition:r}}const rn=e=>typeof e==`string`&&/^\/dash(?:[/?#]|$)/.test(e)?e:void 0,an=(e,t)=>JSON.stringify({integration:e,agent:t.agent,repo:t.repo??null,branch:t.branch??null,def:t.def,owner:t.owner??null,public:t.public??!1});async function on(e,t,n){return(await e.store.list(`app`,{prefix:`${n}:`})).find(e=>e.value.integration===n&&e.value.agent===t.agent)?.value}function sn(e,t,n){let r={kind:`installation`,id:n};return{...e,connections:{...e.connections,[t]:r}}}function cn(e,t,n){return async r=>{let i={};for(let a of Object.keys(e.integrations)){if(a===t.integration)continue;let o=await on(e,t,a);if(o){let t=await Jt(e,`install`,e.session?.user.id??`anonymous`,o.id);i[a]=`${n}/install/${a}?app=${encodeURIComponent(o.id)}&state=${Xe({link:r,tx:t})}`}}return i}}async function ln(e,t,n){let r=await e.store.get(`app`,t.app);return r&&on(e,r,n)}function un(e){return`${e.appId}:${e.installationId}:${e.chat?.thread.id??e.deliveryId}`}async function dn(e,t,n,r){return e.repos.readFile(t,`.coder/${n}.md`,r)}function fn(e){return e.event&&e.source===e.event.integration?un(e.event):`task:${e.id}`}async function pn(e,t,n,r,i,a,o,s){let c={},l=Te(e.integrations),[u,d,f]=await Promise.all([o?.().catch(()=>void 0),e.store.get(`note`,un(r)).catch(()=>void 0),l&&n.settings?.configRepo&&i[l.id]?dn(l,n.settings.configRepo,a.id,i[l.id]).catch(()=>void 0):void 0]);if(u?.length&&(c.messages=u),d&&(c.note=d),f?.trim()&&(c.instructions=f.trim()),s)c.user={name:s.name,email:s.email};else if(s===void 0&&e.auth&&r.actor.id){let n=await e.auth.linkedUser(t.id,r.actor.id).catch(()=>void 0);n&&(c.user={name:n.name,email:n.email})}return c}const A=we;function mn(e,t,n,r=k(32).toString(`base64url`)){let i=`${Xe({task:e,organization:t,attempt:n})}.${r}`;return{token:i,hash:A(i)}}function j(e){try{return qe(e.slice(0,e.indexOf(`.`)))}catch{return{}}}function M(e,t){return t===e.organizationId||!e.scope?e:e.scope(t)}async function hn(e,t){if(!e.appRecord){let n=await e.store.get(`app`,t);return n&&{ctx:e,app:n}}let n=await e.appRecord(t);return n&&{ctx:M(e,n.organizationId),app:n.app}}async function gn(e,t){if(e.boundInstallation?.installation.id===t)return{...M(e,e.boundInstallation.organizationId),boundInstallation:e.boundInstallation};if(!e.installationOrganization)return e;let n=await e.installationOrganization(t);return n===void 0?void 0:M(e,n)}const _n=D.object({env:D.record(D.string(),D.string().check(D.minLength(1)))}),vn=`plain`;function yn(e,t=`SERVER_ENCRYPTION_KEY`){if(!e)return;let n=Buffer.from(e,`base64`);if(n.length!==32)throw Error(`${t} must be a base64-encoded 32-byte key`);return n}function bn(e){return yn(e.encryptionKey)}function xn(e){let t=yn(e);return t?Dt(`sha256`).update(t).digest().readInt32BE(0):0}function Sn(e){return[[e.encryptionKey,`SERVER_ENCRYPTION_KEY`],[e.previousEncryptionKey,`SERVER_ENCRYPTION_KEY_PREVIOUS`]].filter(e=>!!e[0]).map(([e,t])=>({value:yn(e,t),version:xn(e)}))}function Cn(e){let t=_n.safeParse(e);if(!t.success||!Object.keys(t.data.env).length)throw Error(`Invalid engine credential`);return t.data}function wn(e,t){let n=bn(e);if(!n)return{iv:vn,tag:``,ciphertext:Buffer.from(JSON.stringify(Cn(t))).toString(`base64`)};let r=k(12),i=Tt(`aes-256-gcm`,n,r),a=Buffer.concat([i.update(JSON.stringify(Cn(t)),`utf8`),i.final()]);return{iv:r.toString(`base64`),tag:i.getAuthTag().toString(`base64`),ciphertext:a.toString(`base64`)}}function Tn(e,t){if(t.iv===vn)return Cn(JSON.parse(Buffer.from(t.ciphertext,`base64`).toString(`utf8`)));for(let n of Sn(e))try{let e=Et(`aes-256-gcm`,n.value,Buffer.from(t.iv,`base64`));return e.setAuthTag(Buffer.from(t.tag,`base64`)),Cn(JSON.parse(Buffer.concat([e.update(Buffer.from(t.ciphertext,`base64`)),e.final()]).toString(`utf8`)))}catch{}throw Error(`Stored credential was sealed with an unavailable encryption key`)}function N(e,t){let n=bn(e);if(!n)return`${vn}.${Buffer.from(JSON.stringify(t)).toString(`base64`)}`;let r=k(12),i=Tt(`aes-256-gcm`,n,r),a=Buffer.concat([i.update(JSON.stringify(t),`utf8`),i.final()]);return[r,i.getAuthTag(),a].map(e=>e.toString(`base64`)).join(`.`)}function P(e,t){if(t.startsWith(`${vn}.`))return JSON.parse(Buffer.from(t.slice(6),`base64`).toString(`utf8`));let[n,r,i]=t.split(`.`).map(e=>Buffer.from(e,`base64`));for(let t of Sn(e))try{let e=Et(`aes-256-gcm`,t.value,n);return e.setAuthTag(r),JSON.parse(Buffer.concat([e.update(i),e.final()]).toString(`utf8`))}catch{}throw Error(`Stored secret was sealed with an unavailable encryption key`)}function En(e,t){if(t.startsWith(`${vn}.`))return 0;let[n,r,i]=t.split(`.`).map(e=>Buffer.from(e,`base64`));for(let t of Sn(e))try{let e=Et(`aes-256-gcm`,t.value,n);return e.setAuthTag(r),e.update(i),e.final(),t.version}catch{}throw Error(`Stored secret was sealed with an unavailable encryption key`)}const Dn=`node:22`;function On(e,t,n={}){let r=`coder-${e.id.replace(/[^a-zA-Z0-9_.-]/g,`-`).slice(0,48)}-${Date.now()}`,i=Object.keys(t).flatMap(e=>[`-e`,e]);return{args:[`run`,`-d`,`--name`,r,`--memory`,String(n.memory??`4g`),`--cpus`,String(n.cpus??2),`--pids-limit`,String(n.pidsLimit??512),`--network`,n.network??`bridge`,...i,n.image??Dn,`coder`,`agent`,`run`,`--task`,e.id],env:t}}var kn=class{options;kind=`local-docker`;constructor(e={}){this.options=e}async start(e,t){let n=this.options.image??Dn,r=await Ze(`docker`,[`run`,`--rm`,`--network`,`none`,`--entrypoint`,`sh`,n,`-c`,`for binary in node coder claude codex; do command -v "$binary" >/dev/null 2>&1 || { printf "%s\\n" "$binary"; exit 127; }; done`],{PATH:E.env.PATH??``});if(r.code!==0)throw r.code===127&&r.stdout.trim()?Error(`Docker image ${n} is missing required binary ${r.stdout.trim()}`):Error(`Docker image ${n} validation failed: ${r.stderr.trim()||`docker run failed`}`);let i=On(e,{...t,CODER_INBOX_SOCKET:Ue},this.options),a=await Ze(`docker`,i.args,{PATH:E.env.PATH??``,...i.env});if(a.code!==0)throw Error(a.stderr.trim()||`docker run failed`);return a.stdout.trim()}async status(e){let t=await Ze(`docker`,[`inspect`,`--format`,`{{.State.Running}} {{.State.ExitCode}}`,e],{PATH:E.env.PATH??``});if(t.code!==0)return{state:`exited`};let[n,r]=t.stdout.trim().split(/\s+/);return n===`true`?{state:`running`}:{state:`exited`,code:Number(r)||0}}async logs(e,t=-1){let n=await Ze(`docker`,[`logs`,`--timestamps`,e],{PATH:E.env.PATH??``});if(n.code!==0)throw Error(n.stderr.trim()||`docker logs failed`);let r=[...Ye(n.stdout),...Ye(n.stderr,`err`)].map(({level:e,line:t})=>{let n=t.indexOf(` `),r=t.slice(0,n);return{level:e,line:t.slice(n+1),timestamp:r,at:Date.parse(r)}}).sort((e,t)=>e.timestamp.localeCompare(t.timestamp)).map(({timestamp:e,...t})=>t);return{lines:r.slice(t+1),next:r.length-1}}async stop(e){await Ze(`docker`,[`rm`,`-f`,e],{PATH:E.env.PATH??``})}async push(e,t){let n=await Ze(`docker`,[`exec`,`-e`,`CODER_INBOX_MESSAGES`,e,`node`,`-e`,Ge],{PATH:E.env.PATH??``,CODER_INBOX_MESSAGES:JSON.stringify(t)});if(n.code!==0)throw Error(`Docker inbox delivery failed`);return JSON.parse(n.stdout)}};function An(e){if(!Mt(e))return!0;if(Mt(e)===6){let t=new URL(`https://[${e}]/`).hostname.slice(1,-1).split(`::`),n=t[0]?t[0].split(`:`):[],r=t[1]?t[1].split(`:`):[],i=[...n,...Array(8-n.length-r.length).fill(`0`),...r].map(e=>parseInt(e,16));if(i.every(e=>e===0)||i.slice(0,7).every(e=>e===0)&&i[7]===1||(i[0]&65024)==64512||(i[0]&65472)==65152||(i[0]&65280)==65280)return!0;let a;if(i.slice(0,5).every(e=>e===0)&&(i[5]===0||i[5]===65535))a=i.slice(6);else if(i.slice(0,4).every(e=>e===0)&&i[4]===65535&&i[5]===0)a=i.slice(6);else if((i[4]===0||i[4]===512)&&i[5]===24318)a=i.slice(6);else if(i[0]===100&&i[1]===65435&&i.slice(2,6).every(e=>e===0))a=i.slice(6);else if(i[0]===8194)a=i.slice(1,3);else if(i[0]===8193&&(i[1]===0||i[1]===3512)||i[0]===100&&i[1]===65435&&i[2]===1)return!0;if(!a)return!1;e=a.flatMap(e=>[e>>8,e&255]).join(`.`)}let t=e.split(`.`).map(Number);return t[0]===0||t[0]===10||t[0]===127||t[0]===169&&t[1]===254||t[0]===172&&t[1]>=16&&t[1]<=31||t[0]===192&&t[1]===168||t[0]===192&&t[1]===0&&(t[2]===0||t[2]===2)||t[0]===198&&t[1]>=18&&t[1]<=19||t[0]===198&&t[1]===51&&t[2]===100||t[0]===203&&t[1]===0&&t[2]===113||t[0]===100&&t[1]>=64&&t[1]<=127||t[0]>=224}var jn=class{options;kind=`http`;base;fetcher;resolver;constructor(e){if(this.options=e,!e?.url)throw Error(`The http runner requires RUNNER_CONFIG.url`);if(this.base=new URL(`${e.url.replace(/\/+$/,``)}/`),this.base.protocol!==`https:`)throw Error(`The http runner requires an HTTPS URL`);if(this.base.username||this.base.password)throw Error(`The http runner URL cannot contain credentials`);if(!e.secret)throw Error(`RUNNER_CONFIG.secret is required for the http runner`);this.fetcher=e.fetch,this.resolver=e.lookup??Ft}async safe(){let e=this.base.hostname.replace(/^\[|\]$/g,``),t=Mt(e)?[{address:e,family:Mt(e)}]:await this.resolver(e,{all:!0});if(!t.length)throw Error(`The http runner resolved no address`);if(t.some(e=>An(e.address)))throw Error(`The http runner refuses private and metadata addresses`);return t[0]}send(e,t,n){return this.fetcher?this.fetcher(e,t):new Promise((r,i)=>{let a=(this.options.request??It)(e,{method:t.method,headers:t.headers,signal:t.signal??void 0,agent:!1,lookup:(e,t,r)=>{t.all?r(null,[n]):r(null,n.address,n.family)}},e=>{let t=[];e.on(`data`,e=>t.push(Buffer.from(e))),e.on(`error`,i),e.on(`end`,()=>r(new Response(e.statusCode===204?null:Buffer.concat(t),{status:e.statusCode})))});a.on(`error`,i),a.end(t.body)})}async request(e,t=`GET`,n,r){let i=await this.safe(),a=n===void 0?``:JSON.stringify(n),o=String(Date.now()),s=k(16).toString(`base64url`),c=Ot(`sha256`,this.options.secret).update(`${a}.${o}.${s}`).digest(`base64url`),l=await this.send(new URL(e.replace(/^\//,``),this.base),{method:t,redirect:`manual`,headers:{...this.options.headers,"content-type":`application/json`,"x-coder-timestamp":o,"x-coder-nonce":s,"x-coder-signature":c},...a?{body:a}:{},signal:r??AbortSignal.timeout(e===`/start`?3e4:1e4)},i);if(l.status>=300&&l.status<400)throw Error(`The http runner refuses redirects`);if(!l.ok)throw Error(`HTTP runner request failed: ${l.status}`);if(l.status===204)return;let u=await l.text();return u?JSON.parse(u):void 0}health(e){return this.request(`/health`,`GET`,void 0,e)}async start(e,t){let n=await this.request(`/start`,`POST`,{task:e.id,env:t});if(!n.handle)throw Error(`HTTP runner returned no handle`);return n.handle}status(e){return this.request(`/status/${encodeURIComponent(e)}`)}logs(e,t=-1){return this.request(`/logs/${encodeURIComponent(e)}?after=${t}`)}async stop(e){await this.request(`/stop/${encodeURIComponent(e)}`,`POST`,{})}push(e,t){return this.request(`/messages/${encodeURIComponent(e)}`,`POST`,{entries:t})}};const Mn=e=>qe(e),Nn=18e5,Pn=2097152,Fn=Pn/4,In={"eu-north-1":`arn1`,"ap-south-1":`bom1`,"eu-west-3":`cdg1`,"us-east-2":`cle1`,"af-south-1":`cpt1`,"eu-west-1":`dub1`,"eu-central-1":`fra1`,"sa-east-1":`gru1`,"ap-east-1":`hkg1`,"ap-northeast-1":`hnd1`,"us-east-1":`iad1`,"ap-northeast-2":`icn1`,"ap-northeast-3":`kix1`,"eu-west-2":`lhr1`,"us-west-2":`pdx1`,"us-west-1":`sfo1`,"ap-southeast-1":`sin1`,"ap-southeast-2":`syd1`,"ca-central-1":`yul1`};function Ln(e){if(!e)return;let t=(()=>{try{return new URL(e).hostname}catch{return``}})();return Object.entries(In).find(([e])=>t.includes(e))?.[1]}const Rn={ANTHROPIC_API_KEY:{host:`api.anthropic.com`,header:`x-api-key`,prefix:``},OPENAI_API_KEY:{host:`api.openai.com`,header:`authorization`,prefix:`Bearer `}};function zn(e={}){let t=Object.entries(Rn).filter(([t])=>e[t]).map(([t,n])=>[n.host,[{transform:[{headers:{[n.header]:`${n.prefix}${e[t]}`}}]}]]);return t.length?{allow:{...Object.fromEntries(t),"*":[]}}:void 0}async function Bn(){try{return(await Function(`name`,`return import(name)`)(`@vercel/sandbox`)).Sandbox}catch{throw Error(`The vercel-sandbox runner requires @vercel/sandbox in the adapter app.`)}}function Vn(e){return e&&typeof e==`object`&&`response`in e&&e.response instanceof Response?e.response.status:void 0}function Hn(e){if(Vn(e)!==410||!e||typeof e!=`object`||!(`json`in e))return!1;let t=e.json;if(!t||typeof t!=`object`||!(`error`in t))return!1;let n=t.error;return!!n&&typeof n==`object`&&`code`in n&&n.code===`snapshot_not_found`}var Un=class extends Error{snapshotId;constructor(e,t,n){super(e,n),this.snapshotId=t}},Wn=class{options;kind=`vercel-sandbox`;streams=new Map;constructor(e={}){this.options=e}api(){return this.options.sandbox?Promise.resolve(this.options.sandbox):Bn()}now(){return(this.options.now??Date.now)()}auth(){return{...this.options.token?{token:this.options.token,projectId:this.options.projectId??process.env.VERCEL_PROJECT_ID,teamId:this.options.team??process.env.VERCEL_TEAM_ID}:{}}}base(e){return{...e?{source:{type:`snapshot`,snapshotId:e}}:this.options.image?{image:this.options.image}:{},...this.options.region?{region:this.options.region}:{},...this.auth(),resources:{vcpus:this.options.vcpus??2},persistent:!1}}snapshotKey(e,t){let n=e.event?.repo;if(!n)return;let r=[this.baseKey(),t??null,e.event.appId,e.event.installationId,n.owner,n.name];return`repo:${this.options.region??``}:${we(JSON.stringify(r))}`}baseKey(){let e=[_(),this.options.image??null,this.options.tools??[]];return`base:${this.options.region??``}:${we(JSON.stringify(e))}`}async withSandbox(e,t){let n;try{if(n=typeof e==`string`?await(await this.api()).get({...this.auth(),name:e}):e,n.status!==`running`&&n.status!==`pending`)throw new Un(`Vercel Sandbox ${n.name} is ${n.status}`);return await t(n)}catch(t){let r=Vn(t);throw r===410||!n&&typeof e==`string`&&r===404?new Un(t instanceof Error?t.message:`Vercel Sandbox expired`,void 0,{cause:t}):t}}async finalizeSnapshot(e,t){let n=this.options.snapshots,r=this.now(),{build:i,...a}=t;if(!i)return t;try{t=await this.withSandbox(i.sandbox,async e=>{let n=await e.getCommand(i.command);if(n.exitCode===null&&r-i.startedAt<Nn)return t;if(n.exitCode===0){let i=/^coder-snapshot (\S+)$/m.exec(await n.stdout())?.[1];if(i&&i===t.sha)return await e.stop().catch(()=>{}),{...a,checkedAt:r};let o=await e.snapshot({expiration:2592e6});return{...a,snapshotId:o.snapshotId,...i?{sha:i}:{},checkedAt:r}}return await e.stop().catch(()=>{}),{...a,failedAt:r}})}catch(t){if(t instanceof Un){let{failedAt:t,...r}=a,o=await n.get(e);o?.build?.sandbox===i.sandbox&&o.build.command===i.command&&o.build.startedAt===i.startedAt&&await n.put(e,r)}throw t}if(t.build)return t;let o=await n.get(e);return o?.build?.sandbox!==i.sandbox||o.build.command!==i.command||o.build.startedAt!==i.startedAt?o??{}:(await n.put(e,t),t)}async snapshot(e,t,n,r){let i=this.options.snapshots;if(!i)return;let a=this.now(),o=await this.finalizeSnapshot(e,await i.get(e)??{});if(o.build)return o.snapshotId;let s=!o.snapshotId||n&&a-(o.checkedAt??0)>=9e5,c=o.failedAt!==void 0&&a-o.failedAt<36e5;if(s&&!c){let n=await t(o.snapshotId??r).catch(e=>{if(e instanceof Un)throw e});if(n){let t={sandbox:n.sandbox,command:n.command,startedAt:a};await i.put(e,{...o,build:t}),(async()=>{await n.wait();let r=await i.get(e);r?.build?.sandbox===t.sandbox&&r.build.command===t.command&&r.build.startedAt===t.startedAt&&await this.finalizeSnapshot(e,r)})().catch(()=>{})}}return o.snapshotId}async detached(e,t,n={}){let r=await(await this.api()).create({...this.base(e),timeout:this.options.timeoutMs??18e5,...n}).catch(t=>{throw e&&Hn(t)?new Un(t.message,e,{cause:t}):t});try{let e=await this.withSandbox(r,e=>e.runCommand({...t,cwd:`/vercel/sandbox`,detached:!0}));return{sandbox:r.name,command:e.cmdId,wait:()=>e.wait({signal:AbortSignal.timeout(Nn)})}}catch(e){throw await r.stop().catch(()=>{}),e}}async start(e,t,n){let r=[`npm install -g @anthropic-ai/claude-code @openai/codex bun ${[`@wular/coder@${_()}`,...this.options.tools??[]].join(` `)}`,...Je()].join(` && `),i=(t,n)=>({cmd:t?`coder`:`sh`,args:t?[`agent`,`run`,`--task`,e.id]:[`-c`,`sudo -E sh -c "$1" && exec coder agent run --task "$2"`,`coder-task`,r,e.id],env:n}),a=this.baseKey(),o=zn(n);for(let n=0;;n++){let s;try{let n=await this.snapshot(a,()=>this.detached(void 0,{cmd:`sh`,args:[`-c`,r],sudo:!0}),!1);s=this.snapshotKey(e,n);let c=(s?await this.snapshot(s,e=>this.detached(e,i(e,{...t,CODER_PREPARE:`1`})),!0,n):void 0)??n,l=await this.detached(c,i(c,{...t,CODER_INBOX_SOCKET:Ue}),o?{networkPolicy:o}:{});return Xe({sandbox:l.sandbox,command:l.command})}catch(e){if(!(e instanceof Un))throw e;for(let t of[a,s]){if(!t||!e.snapshotId)continue;let n=await this.options.snapshots?.get(t);n?.snapshotId===e.snapshotId&&await this.options.snapshots.put(t,n.build?{build:n.build}:{})}if(n===2)throw e}}}async status(e){let t=Mn(e),n=await(await this.api()).get({...this.auth(),name:t.sandbox});if(n.status===`pending`)return{state:`running`};if(n.status!==`running`)return{state:`exited`,code:1};let r=await n.getCommand(t.command);return r.exitCode===null?{state:`running`}:{state:`exited`,code:r.exitCode}}async push(e,t){let n=await(await(await this.api()).get({...this.auth(),name:Mn(e).sandbox})).runCommand({cmd:`node`,args:[`-e`,Ge],detached:!1,env:{CODER_INBOX_MESSAGES:JSON.stringify(t)}}),r=await n.stdout();if(n.exitCode!==0)throw Error(`Sandbox inbox delivery failed`);return JSON.parse(r)}async logs(e,t=-1){let n=this.streams.get(e);n||(n=this.readStream(e),this.streams.set(e,n),n.catch(()=>{this.streams.get(e)===n&&this.streams.delete(e)}));let r=await n,i=Date.now()+250;for(;!r.done&&Date.now()<i;)await new Promise(e=>setTimeout(e,Math.min(10,i-Date.now())));if(r.error)throw this.streams.delete(e),r.error;let a=r.lines.slice(Math.max(0,t+1-r.offset)),o=Math.max(t,r.offset+r.lines.length-1);return a.length&&r.dropped&&!r.warned&&(a.unshift({level:`err`,line:`Sandbox log buffer dropped ${r.dropped} bytes; showing the retained tail.`}),r.warned=!0),r.done&&!a.length&&this.streams.delete(e),{lines:a,next:o}}async readStream(e){let t=Mn(e),n=(await(await(await this.api()).get({...this.auth(),name:t.sandbox})).getCommand(t.command)).logs(),r={lines:[],offset:0,dropped:0,warned:!1,done:!1,close:()=>n.close?.()};return(async()=>{let e={stdout:``,stderr:``},t=0,i=e=>{if(Buffer.byteLength(e)<=Fn)return e;let t=Buffer.from(e),n=t.length-Fn;for(;(t[n]&192)==128;)n++;return r.dropped+=n,t.subarray(n).toString()},a=(n,a)=>{let o=(e[n]+a).split(/\r?\n/);e[n]=i(o.pop()??``);for(let e of o.filter(Boolean)){let a=i(e);r.lines.push({level:n===`stdout`?`out`:`err`,line:a}),t+=Buffer.byteLength(a)+32}let s=0;for(;t>Pn/2&&s<r.lines.length;){let e=Buffer.byteLength(r.lines[s++].line);t-=e+32,r.dropped+=e}s&&(r.lines.splice(0,s),r.offset+=s)};for await(let e of n)a(e.stream,e.data);a(`stdout`,`
|
|
2
|
-
`),a(`stderr`,`
|
|
3
|
-
`)})().catch(e=>{r.error=e}).finally(()=>r.done=!0),r}async stop(e){this.streams.get(e)?.then(e=>e.close(),()=>{}),this.streams.delete(e),await(await(await this.api()).get({...this.auth(),name:Mn(e).sandbox})).stop()}};const Gn=[`local`,`local-docker`,`vercel-sandbox`,`github-actions`,`http`];function Kn(e){let t=e.kind;return e.local===!1&&(t===`local`||t===`local-docker`)?{}:{[t]:qn(t,e)}}function qn(e,t){let n=t.config??{};if(e===`local`)return new Qe(t.workDir);if(e===`local-docker`)return new kn(n);if(e===`vercel-sandbox`)return new Wn({...t.sandbox,...n});if(e===`github-actions`)return new st({...n,...t.fetch?{fetch:t.fetch}:{}});if(typeof n.url!=`string`||typeof n.secret!=`string`)throw Error(`HTTP runner requires a URL and secret`);return new jn({url:n.url,secret:n.secret,...t.fetch?{fetch:t.fetch}:{}})}function Jn(e,t){return e.scope===`workspace`||!!(t&&e.owner===t)}function Yn(e){return e.local?`local`:`default`}async function Xn(e,t={}){let n=(await e.store.list(`runner`)).filter(({value:n})=>Jn(n,t.requester)&&(e.local||n.kind!==`local`&&n.kind!==`local-docker`)),r=t.runner??t.agent;if(r===Yn(e))return{runner:e.config.runner};let i=r?n.find(({id:e,value:t})=>e===r||t.name===r):n.find(({value:e})=>e.scope===`personal`&&e.default)??n.find(({value:e})=>e.scope===`workspace`&&e.default);if(r&&!i)throw Error(`Unknown runner "${r}".`);return i?{runner:i.value.kind,runnerId:i.id}:{runner:e.config.runner}}function Zn(e,t,n){let r={...t.config,...P(e.config,t.secret)};return qn(t.kind,{workDir:e.config.workDir,config:r,fetch:e.fetch,sandbox:{...n?{snapshots:{get:t=>e.store.get(`snapshot`,`runner:${n}:${t}`),put:(t,r)=>e.store.put(`snapshot`,`runner:${n}:${t}`,r)}}:{}}})}async function Qn(e,t){if(!t.runnerId)return e.runners[t.runner];let n=await e.store.get(`runner`,t.runnerId);if(!n||n.kind!==t.runner||!e.local&&(n.kind===`local`||n.kind===`local-docker`)){e.settings?.runnerInstances?.delete(t.runnerId);return}P(e.config,n.secret);let r=(e.settings??={}).runnerInstances??=new Map,i=JSON.stringify([n.kind,n.config,n.secret]),a=r.get(t.runnerId);return a?.signature!==i&&(a={signature:i,runner:Zn(e,n,t.runnerId)},r.set(t.runnerId,a)),a.runner}function $n(e,t){if(Object.keys(t).some(t=>!e.fields.some(e=>e.key===t)))throw Error(`Unknown runner field`);for(let n of e.fields)if(!n.optional&&!t[n.key]?.trim())throw Error(`${n.label} is required`);if(e.kind===`http`){if(t.secret.length<32)throw Error(`Secret must contain at least 32 characters`);new jn({url:t.url,secret:t.secret})}if(e.kind===`github-actions`&&!/^[\w.-]+\/[\w.-]+$/.test(t.repo))throw Error(`Repository must be owner/repo`);if(e.kind===`local-docker`&&t.cpus&&!(Number(t.cpus)>0&&Number.isFinite(Number(t.cpus))))throw Error(`CPUs must be positive`)}var F=class extends Error{};async function er(e,t){let n=Date.now(),r=new AbortController,i,a=new Promise((e,t)=>{i=setTimeout(()=>{r.abort(),t(new F(`Runner check timed out`))},5e3)});try{return{ok:!0,detail:await Promise.race([a,(async()=>{let n=t?.kind??e.config.runner,i=t?{...t.config,...P(e.config,t.secret)}:e.config.runnerConfig??{};if(n===`local`){if(!e.local)throw new F(`Local runners require a local server`);return`This machine is available`}if(n===`http`){let n=t?Zn(e,t):e.runners.http;if(!(n instanceof jn)||!(await n.health(r.signal)).ok)throw new F(`Runner health check failed`);return`Runner is reachable`}if(n===`local-docker`){if(!e.local)throw new F(`Docker runners require a local server`);return await new Promise((t,n)=>{(e.runnerExec??Ct)(`docker`,[`info`],{timeout:5e3,signal:r.signal},e=>e?n(new F(`Docker is unavailable`)):t())}),`Docker is available`}let a=async t=>{let n=await(e.fetch??fetch)(t,{signal:r.signal,redirect:`manual`,headers:{authorization:`Bearer ${i.token}`,accept:`application/json`,"user-agent":`coder`}});if(!n.ok)throw new F(`Runner check failed with HTTP ${n.status}`);return n};if(n===`github-actions`){let e=String(i.repo).split(`/`).map(encodeURIComponent).join(`/`);return await a(`https://api.github.com/repos/${e}`),await a(`https://api.github.com/repos/${e}/actions/workflows/${encodeURIComponent(String(i.workflow))}`),`Repository and workflow are accessible`}let o=await(await a(`https://api.vercel.com/v2/teams?limit=100`)).json();if(!Array.isArray(o.teams))throw new F(`Invalid team response`);if(i.team&&!o.teams.some(e=>e.id===i.team||e.slug===i.team))throw new F(`Team is not accessible`);return`Teams are accessible`})()]),ms:Date.now()-n}}catch(e){return{ok:!1,detail:e instanceof F?e.message:`Runner check failed`,ms:Date.now()-n}}finally{clearTimeout(i)}}function tr(e){if(typeof e!=`string`||!e)return{ok:!1,detail:`A folder path is required`};let t=e===`~`?At.homedir():e.startsWith(`~/`)?T.join(At.homedir(),e.slice(2)):e;if(!T.isAbsolute(t))return{ok:!1,detail:`The folder path must be absolute`};let n=T.normalize(t);try{return O.statSync(n).isDirectory()?(O.accessSync(n,O.constants.R_OK),{ok:!0,folder:{path:n,name:T.basename(n)}}):{ok:!1,detail:`The path is not a directory`}}catch{return{ok:!1,detail:`The folder does not exist or is not readable`}}}function nr(e){let t=new Map,n=[...d(e),...s(e,{migrate:!1})].sort((e,t)=>Date.parse(t.createdAt)-Date.parse(e.createdAt));for(let e of n){let n=tr(e.cwd);if(!(!n.ok||t.has(n.folder.path))&&(t.set(n.folder.path,{...n.folder,recent:Date.parse(e.createdAt)}),t.size===8))break}return{current:{path:e,name:T.basename(e)},recent:[...t.values()],picker:!!ir()}}const rr=e=>(process.env.PATH??``).split(T.delimiter).some(t=>t&&O.existsSync(T.join(t,e)));function ir(){let e=`Choose a folder for the task`;if(process.platform===`darwin`)return[`osascript`,[`-e`,`tell application "System Events"`,`-e`,`activate`,`-e`,`POSIX path of (choose folder with prompt "${e}")`,`-e`,`end tell`]];if(process.platform===`win32`)return[`powershell`,[`-NoProfile`,`-Command`,`Add-Type -AssemblyName System.Windows.Forms; $d = New-Object System.Windows.Forms.FolderBrowserDialog; $d.Description = '${e}'; if ($d.ShowDialog() -eq 'OK') { $d.SelectedPath }`]];if(rr(`zenity`))return[`zenity`,[`--file-selection`,`--directory`,`--title=${e}`]];if(rr(`kdialog`))return[`kdialog`,[`--getexistingdirectory`,At.homedir(),`--title`,e]]}async function ar(){let e=ir();if(!e)return{ok:!1,detail:`This machine has no folder dialog; type a path instead`};try{let{stdout:t}=await Pt(Ct)(e[0],e[1],{timeout:6e5}),n=t.trim().replace(/(.)[\\/]+$/,`$1`);return n?tr(n):{ok:!1,detail:``}}catch{return{ok:!1,detail:``}}}function or(e){let t=/^\w[\w.-]*@([\w.-]+):(?!\/)([^?#]+)$/.exec(e),n=t||!URL.canParse(e)?void 0:new URL(e);if(!t&&(!n||![`https:`,`ssh:`].includes(n.protocol)||n.password||n.search||n.hash))return;let[r,i]=t?[t[1],t[2]]:[n.port?`${n.hostname}_${n.port}`:n.hostname,n.pathname],a=i.replace(/(\.git)?\/?$/,``).split(`/`).filter(Boolean);if(!(!/^[a-z0-9][a-z0-9._-]*$/i.test(r)||a.length<2||!a.every(e=>/^[\w.-]+$/.test(e)&&!/^\.+$/.test(e))))return[r.toLowerCase(),...a]}async function sr(e){let t=typeof e==`string`?e.trim():``,n=or(t);if(!n)return{ok:!1,detail:`Use an https or ssh git URL, like https://github.com/owner/repo`};let r=ie(`checkouts`,...n),i=AbortSignal.timeout(6e5),a={...process.env,GIT_TERMINAL_PROMPT:`0`,GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND??`ssh -o BatchMode=yes`},o=e=>Pt(Ct)(`git`,e,{env:a,signal:i,maxBuffer:67108864});try{await He(r,async()=>{if(O.existsSync(T.join(r,`.git`))){await o([`-C`,r,`remote`,`set-url`,`origin`,t]),await o([`-C`,r,`fetch`,`origin`]);return}let e=await O.promises.mkdtemp(`${r}-clone-`);try{await o([`clone`,`--`,t,e]),await O.promises.rename(e,r)}finally{await O.promises.rm(e,{recursive:!0,force:!0})}})}catch(e){let t=e;if(i.aborted)return{ok:!1,detail:`The clone took longer than 10 minutes`};if(t.code===`ENOENT`&&!t.stderr)return{ok:!1,detail:`Git is not installed on this machine`};let n=String(t.stderr??t.message).split(`
|
|
4
|
-
`).map(e=>e.trim()).filter(Boolean),r=(n.find(e=>e.startsWith(`fatal:`))??n.at(-1)??`The clone failed`).replace(/^fatal:\s*/,``);return{ok:!1,detail:r[0].toUpperCase()+r.slice(1)}}return{ok:!0,folder:{path:r,name:n.at(-1),url:t}}}const cr=(e,t)=>`${e}:${String(t).padStart(6,`0`)}`;function I(e,t){return e.get(`agent`,t)}async function lr(e){return(await e.list(`agent`)).map(e=>e.value)}async function ur(e,t,n){let r=n??(await I(e,t))?.currentVersion;return r===void 0?void 0:e.get(`agentversion`,cr(t,r))}async function L(e,t){if(e.listAgentsWithVersions)return(await e.listAgentsWithVersions(t))[0]??{};let n=await I(e,t);return{record:n,version:n&&await ur(e,t,n.currentVersion)}}async function dr(e){if(e.listAgentsWithVersions)return e.listAgentsWithVersions();let t=await lr(e);return Promise.all(t.map(async t=>({record:t,version:await ur(e,t.id,t.currentVersion)})))}async function fr(e,t,n){if(e.publishAgent){let r=_e(t.id,t.definition),i=t.files&&Object.keys(t.files).length?t.files:void 0;return e.publishAgent({id:t.id,name:t.name??r.name??t.id,...t.description??r.description?{description:t.description??r.description}:{},source:t.source,...t.repo?{repo:t.repo}:{},...t.path?{path:t.path}:{},currentVersion:0,createdAt:n,updatedAt:n},{agent:t.id,version:0,definition:r,systemPrompt:t.systemPrompt,...i?{files:i}:{},...t.commit?{commit:t.commit}:{},...t.origin?{source:t.origin}:{},importedFrom:t.importedFrom,createdAt:n})}let r=await L(e,t.id),i=await pr(e,t,n,r);return{record:await I(e,t.id),version:i,unchanged:r.record?.currentVersion===i.version}}async function pr(e,t,n,r){if(!r&&e.publishAgent)return(await fr(e,t,n)).version;let i=_e(t.id,t.definition),a=t.files&&Object.keys(t.files).length?t.files:void 0,o=r?r.record:await I(e,t.id),s=r?r.version:o?await ur(e,t.id,o.currentVersion):void 0,c=(e,r)=>({id:t.id,name:t.name??i.name??t.id,...t.description??i.description?{description:t.description??i.description}:{},source:t.source,...t.repo?{repo:t.repo}:{},...t.path?{path:t.path}:{},currentVersion:e,...o?.settings?{settings:o.settings}:{},createdAt:o?.createdAt??n,updatedAt:r}),l=e=>Nt(e.definition,i)&&e.systemPrompt===t.systemPrompt&&Nt(e.files,a);if(s&&l(s)){let r=c(s.version,o.updatedAt);return Nt(o,r)||await e.put(`agent`,t.id,c(s.version,n)),s}o||await e.put(`agent`,t.id,c(0,n));let u;for(let r=(o?.currentVersion??0)+1;u={agent:t.id,version:r,definition:i,systemPrompt:t.systemPrompt,...a?{files:a}:{},...t.commit?{commit:t.commit}:{},...t.origin?{source:t.origin}:{},importedFrom:t.importedFrom,createdAt:n},!await e.create(`agentversion`,cr(t.id,r),u);r++){let n=await e.get(`agentversion`,cr(t.id,r));if(n&&l(n)){u=n;break}}let d=await I(e,t.id);return(!d||d.currentVersion<u.version)&&await e.put(`agent`,t.id,c(u.version,n)),u}async function mr(e,t,n,r=Date.now()){let i=await I(e,t);if(!i)throw Error(`No agent named "${t}".`);let a={...i,settings:n,updatedAt:r};return await e.put(`agent`,t,a),a}const hr=[`read-only`,`workspace-write`,`auto`];function gr(e,t){if(Array.isArray(e))return[...new Set(e)];let n=me.indexOf(e);return[...new Set(me.slice(0,n+1).flatMap(e=>t?.tools.presets[e]??[]))]}function _r(e,t,n,r){if(!t&&!n)return;let i=t??{},a=n??{},o=new Set([...Object.keys(i.integrations??{}),...Object.keys(a.integrations??{})]),s=Object.fromEntries([...o].map(e=>{let t=i.integrations?.[e],n=a.integrations?.[e],o=t?.allowedEvents&&n?.allowedEvents?t.allowedEvents.filter(e=>n.allowedEvents.includes(e)):n?.allowedEvents??t?.allowedEvents,s=t?.allowedTools&&n?.allowedTools?gr(t.allowedTools,r[e]).filter(t=>new Set(gr(n.allowedTools,r[e])).has(t)):n?.allowedTools??t?.allowedTools;return[e,{...o?{allowedEvents:o}:{},...s?{allowedTools:s}:{}}]})),c=i.permissions??e.permissions??`read-only`,l=a.permissions,u=l&&hr.indexOf(l)<=hr.indexOf(c)?l:c;return{...i,...a,permissions:u,...o.size?{integrations:s}:{}}}function vr(e,t,n,r=De){let i=_r(t.definition,void 0,e.settings,r),a=_r(t.definition,i,n,r),[o]=ve({definitions:{[e.id]:{json:t.definition,builtin:e.source===`builtin`}},usage:a?{[e.id]:a}:void 0},r);if(!o)throw Error(`Agent "${e.id}" is disabled.`);return{...o,files:{...t.files??{},"system.md":t.systemPrompt}}}function yr(e,t=``){let n={};for(let r of O.readdirSync(T.join(e,t),{withFileTypes:!0})){let i=t?`${t}/${r.name}`:r.name;r.isDirectory()?Object.assign(n,yr(e,i)):r.isFile()&&i!==`agent.json`&&i!==`system.md`&&(n[i]=O.readFileSync(T.join(e,i),`utf8`))}return n}async function br(e,t,n,r){let i=ge()[n];return i?await pr(e,{id:n,source:`builtin`,definition:i.json,systemPrompt:O.readFileSync(T.join(i.dir,`system.md`),`utf8`),files:yr(i.dir),importedFrom:`builtin:${_()}`},t,r)!==r.version:!1}async function xr(e,t,n){let r=n??await Promise.all(Object.keys(ge()).map(t=>L(e,t))),i=!1;for(let n of Object.keys(ge()))await br(e,t,n,r.find(({record:e})=>e?.id===n)??{})&&(i=!0);return i}const Sr=[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`];function Cr(e,t,n,r){return{method:e,pattern:t,handler:n,...r?{guard:r}:{}}}function wr(e,t,n){return t.map(t=>({...t,pattern:e+t.pattern,...n&&!t.guard?{guard:n}:{}}))}function Tr(e,t,n){return[e,`${e}/*`].flatMap(e=>Sr.map(r=>Cr(r,e,t,n)))}function Er(e,t){let[n,r]=[e.split(`/`),t.split(`/`)],i=n.at(-1)===`*`;if(i?r.length<n.length:r.length!==n.length)return;let a={};for(let e=0;e<n.length;e++){let[t,o]=[n[e],r[e]];if(t===`*`&&i){a[`*`]=r.slice(e).join(`/`);break}if(t[0]===`:`){if(!o)return;a[t.slice(1)]=o}else if(t!==o)return}return a}async function Dr(e,t,n,r){for(let i of e){let a=Er(i.pattern,r.pathname);if(!a)continue;for(let e of Object.keys(a))e!==`*`&&(a[e]=decodeURIComponent(a[e]));let o=e.filter(e=>e.pattern===i.pattern),s=o.find(e=>e.method===t.method),c=(s??i).guard;if(c){let e=await c(t,n,a,r);if(e instanceof Response)return e;n=e}if(s)return s.handler(t,n,a,r);let l=$e();return l.headers.set(`allow`,[...new Set(o.map(e=>e.method))].join(`, `)),l}}const Or=`coder`;function kr(e,t){let n=e??`/dash`;try{let e=new URL(n,t);return e.origin===t&&!n.includes(`\\`)&&!/^\/[/\\]/.test(e.pathname)?`${e.pathname}${e.search}${e.hash}`:`/dash`}catch{return`/dash`}}const Ar=`The Coder dashboard is not built; run bun run build.`,jr=[`default-src 'self'`,`style-src 'self' 'unsafe-inline'`,`img-src 'self' data:`,`connect-src 'self'`,`object-src 'none'`,`base-uri 'none'`,`frame-ancestors 'none'`,`form-action 'self'`];function Mr(e){let t=T.dirname(dt(e));for(;;){let e=T.join(t,`package.json`);if(gt(e))try{if(JSON.parse(_t(e,`utf8`)).name===`@wular/coder`)return t}catch{}let n=T.dirname(t);if(n===t)break;t=n}throw Error(`Cannot locate the Coder package root.`)}function Nr(e=import.meta.url){let t=T.dirname(dt(e)),n=Mr(e);return[T.join(n,`dist/dash`),T.join(t,`../dash`)].find(e=>gt(T.join(e,`manifest.json`)))}function Pr(e){let t=T.join(e,`server`);if(!gt(t))throw Error(`The Coder dashboard server bundle is missing.`);let n=vt(t,{withFileTypes:!0}).filter(e=>e.isDirectory()&&e.name.startsWith(`bundle-`)).map(e=>T.join(t,e.name,`entry.js`)).filter(gt);if(!n.length)throw Error(`The Coder dashboard server bundle is missing.`);if(n.length!==1)throw Error(`The Coder dashboard has multiple server bundles.`);return n[0]}function Fr(e,t){let n=T.join(jt(),`coder-dash`,Dt(`sha256`).update(e).digest(`hex`).slice(0,12));for(let e of gt(n)?vt(n):[]){let[r,i]=e.split(`-`).map(Number),a=r===process.pid;if(!a)try{process.kill(r,0),a=!0}catch(e){a=e.code===`EPERM`}(!a||r===process.pid&&i<t-1)&&bt(T.join(n,e),{recursive:!0,force:!0})}let r=T.join(n,`${process.pid}-${t}`);ht(T.join(e,`src`),T.join(r,`src`),{recursive:!0});for(let t of[`dist`,`node_modules`])St(T.join(e,t),T.join(r,t),`dir`);return yt(T.join(r,`src/server/dash`))}async function Ir(e,t=0){let n=Mr(e),r=Nr(e);if(!r)throw Error(Ar);let i=JSON.parse(_t(T.join(r,`manifest.json`),`utf8`)),a=t?Fr(n,t):T.join(n,`src/server/dash`),o={...i,outDir:r},s=Pr(r);return{handler:await(await import(ft(s).href)).createRequestHandler({root:a,manifest:o}),manifest:o}}var Lr=class{hosts=new Map;made=new Map};function Rr(e){let t=Nr(e);if(t)try{return xt(T.join(t,`manifest.json`)).mtimeMs}catch{return}}function zr(e,{hosts:t,made:n}){let r=Date.now(),i=t.get(e);if(i&&r-i.checked<1e3)return i.host;let a=Rr(e);if(i&&(i.checked=r,a===void 0||a===i.build))return i.host;let o=n.get(e)??0;n.set(e,o+1);let s={build:a,checked:r,host:Ir(e,o)};return t.set(e,s),s.host}function Br(e,t){let n=e.length>1&&e.endsWith(`/`)?e.slice(0,-1):e;return!!(Er(`/assets/*`,n)||Er(`/dash/*`,n)||t.routes.some(e=>Er(e.route,n)))}const Vr=/<script(?![^>]*\bsrc=)[^>]*>([\s\S]*?)<\/script>/gi,Hr=e=>`'sha256-${Dt(`sha256`).update(e).digest(`base64`)}'`;function Ur(e){let t=[...e.matchAll(Vr)].map(e=>Hr(e[1]));return[...jr,`script-src 'self' ${t.join(` `)}`.trim()].join(`; `)}function Wr(e,t){return t===`gzip`?Bt(e).toString(`utf8`):t===`br`?Lt(e).toString(`utf8`):t===`deflate`?Ht(e).toString(`utf8`):e.toString(`utf8`)}const Gr=e=>(e.headers.get(`accept-encoding`)??``).split(`,`).some(e=>{let[t,...n]=e.split(`;`).map(e=>e.trim()),r=n.find(e=>e.startsWith(`q=`));return t===`gzip`&&(!r||Number(r.slice(2))>0)});function Kr(e){e.set(`content-encoding`,`gzip`),/accept-encoding/i.test(e.get(`vary`)??``)||e.append(`vary`,`accept-encoding`)}function qr(e){let t=zt(),n=e=>new Promise(n=>{t.write(e),t.flush(Rt.Z_SYNC_FLUSH,()=>n())}),r=!1;return new ReadableStream({start(e){t.on(`data`,t=>e.enqueue(new Uint8Array(t))),t.on(`end`,()=>e.close()),t.on(`error`,t=>e.error(t))},async pull(){if(r)return;let{done:i,value:a}=await e.read();if(!i)return n(a);r=!0,t.end()},cancel(n){return t.destroy(),e.cancel(n)}})}function Jr(e,t,n,r){n.set(`content-security-policy`,[...jr,`script-src 'self' 'nonce-${r}'`].join(`; `));let i=t.body;return Gr(e)&&(Kr(n),i=qr(i.getReader())),new Response(i,{status:t.status,statusText:t.statusText,headers:n})}async function Yr(e,t,n){let r=new Headers(t.headers);if(r.set(`x-content-type-options`,`nosniff`),!(r.get(`content-type`)??``).includes(`text/html`))return new Response(t.body,{status:t.status,statusText:t.statusText,headers:r});r.set(`cache-control`,`no-store`),r.delete(`content-length`);let i=r.get(`content-encoding`);if(!i&&t.body)return Jr(e,t,r,n);let a=Buffer.from(await t.arrayBuffer()),o=Wr(a,i);r.set(`content-security-policy`,Ur(o));let s=i?new Uint8Array(a):o;return!i&&o.length>1024&&Gr(e)&&(s=new Uint8Array(Vt(o)),Kr(r)),new Response(s,{status:t.status,statusText:t.statusText,headers:r})}async function Xr(e,t=import.meta.url,n=new Lr){let r;try{r=await zr(t,n)}catch(e){if(n.hosts.delete(t),e instanceof Error&&e.message===Ar)return;throw e}if(!Br(new URL(e.url).pathname,r.manifest))return;let i=k(16).toString(`base64`),a=new Headers(e.headers);return a.set(`content-security-policy`,`script-src 'nonce-${i}'`),Yr(e,await r.handler(new Request(e,{headers:a})),i)}const Zr=(e,t,n=!1)=>`coder_admin=${encodeURIComponent(t)}; HttpOnly; SameSite=Strict; Path=/${new URL(e.url).protocol===`https:`?`; Secure`:``}${n?`; Max-Age=0`:``}`;function Qr(e,t){let n=e.headers.get(`x-forwarded-host`)?.split(`,`,1)[0]?.trim();if(!n)return t.origin;let r=e.headers.get(`x-forwarded-proto`)?.split(`,`,1)[0]?.trim()??t.protocol.slice(0,-1);try{return new URL(`${r}://${n}`).origin}catch{return t.origin}}async function $r(e,t,n,r){let i=await e.formData(),a=i.get(`token`),o=i.get(`return`),s=kr(typeof o==`string`&&o.startsWith(`/`)?o:null,new URL(e.url).origin);return typeof a==`string`?a?Ri(a,t.config.adminToken)?new Response(null,{status:303,headers:{location:s,"set-cookie":Zr(e,a)}}):it(`/dash?token=rejected`,303):new Response(null,{status:303,headers:{location:s,"set-cookie":Zr(e,``,!0)}}):it(`/dash?token=rejected`,303)}async function ei(e,t,n,r){return it(!t.auth||t.session?`/dash`:r.searchParams.has(`signed_out`)?`/login?signed_out=1`:`/login`)}async function ti(e,t,n,r){if(t.auth&&!r.searchParams.has(`signed_out`)&&!r.searchParams.has(`error`)){let n=`/api/auth/sign-in?return=${encodeURIComponent(kr(r.searchParams.get(`return`),r.origin))}`,i=t.config.publicUrl;return i&&new URL(Qr(e,r)).host!==new URL(i).host?it(new URL(n,i).href):t.auth.handler(new Request(`${r.origin}${n}`))}return await Xr(ii(e,t),void 0,t.dashboardHosts)??new Response(`UI is not built`,{status:503})}async function ni(e,t,n,r){return await Xr(ii(e,t),void 0,t.dashboardHosts)??new Response(`UI is not built`,{status:503})}async function ri(e,t,n,r){return await Xr(ii(e,t),void 0,t.dashboardHosts)??w()}function ii(e,t){let n=new Headers(e.headers);return n.set(`x-coder-mode`,Vi(t)),new Request(e,{headers:n})}async function ai(e,t,n){return await Xr(ii(e,t),void 0,t.dashboardHosts)??w()}function oi(){return(process.env.PATH??``).split(T.delimiter).some(e=>{try{let t=T.join(e,`docker`);return pt(t,mt.X_OK),xt(t).isFile()}catch{return!1}})}function si(e){let t=!!e.local,n=t&&oi();return[{kind:`local`,name:t?`Another machine`:`Your machine`,description:t?`Pair another computer; it runs tasks with its own logins.`:`Run tasks with your own machine and logins.`,connect:`pair`,fields:[],available:!0},{kind:`local-docker`,name:`Docker on the server`,description:`Run each task in a Docker container.`,connect:`fields`,help:`Each task runs in a fresh container on this server, using the Docker installed here. Leave fields empty for the defaults.`,fields:[{key:`image`,label:`Image`,placeholder:`node:22`,hint:`node 20 or newer`,optional:!0},{key:`memory`,label:`Memory limit`,placeholder:`4g`,optional:!0},{key:`cpus`,label:`CPU limit`,placeholder:`2`,optional:!0}],available:n,...n?{}:{reason:t?`Docker is not on PATH.`:`Available on a local server only.`}},{kind:`vercel-sandbox`,name:`Vercel Sandbox`,description:`Run tasks in an isolated sandbox.`,connect:`fields`,help:`Each task gets a fresh Vercel Sandbox. Create an access token at vercel.com/account/tokens with Sandbox access for the team that pays for it.`,fields:[{key:`token`,label:`Access token`,placeholder:`vcp_…`,hint:`with Sandbox access`,secret:!0},{key:`team`,label:`Team`,placeholder:`team_…`,hint:`VERCEL_TEAM_ID if empty`,optional:!0},{key:`projectId`,label:`Project`,placeholder:`prj_…`,hint:`VERCEL_PROJECT_ID if empty`,optional:!0},{key:`region`,label:`Region`,placeholder:`iad1`,hint:`nearest if empty`,optional:!0}],available:!0},{kind:`github-actions`,name:`GitHub Actions`,description:`Run tasks through a repository workflow.`,connect:`fields`,help:`Each task starts a workflow run in a repository you choose. Save coder server workflow as .github/workflows/coder-agent.yml. It runs coder agent run --task; the token needs Actions read and write on that repository.`,fields:[{key:`repo`,label:`Repository`,placeholder:`acme/runners`,hint:`owner/name`},{key:`workflow`,label:`Workflow file`,placeholder:`coder-agent.yml`,hint:`in .github/workflows`},{key:`token`,label:`Token`,placeholder:`github_pat_…`,hint:`Actions read and write`,secret:!0},{key:`ref`,label:`Branch`,placeholder:`main`,hint:`default branch if empty`,optional:!0}],available:!0},{kind:`http`,name:`HTTP runner`,description:`Connect a runner at a public HTTPS address.`,connect:`fields`,help:`A machine already running coder runner serve. Copy the address and secret it printed; pairing from the Another machine or Your machine option does this for you.`,fields:[{key:`url`,label:`Address`,placeholder:`https://runner.example.com`,hint:`its https address`},{key:`secret`,label:`Secret`,placeholder:`printed by coder runner serve`,hint:`32 characters or more`,secret:!0}],available:!0}]}const ci=D.string().check(D.minLength(1),D.maxLength(80)),li=D.enum([`personal`,`workspace`]),ui=D.record(D.string(),D.string()),di=D.strictObject({kind:D.enum([`local`,`local-docker`,`github-actions`,`vercel-sandbox`,`http`]),name:ci,scope:li,config:ui}),fi=D.strictObject({name:D.optional(ci),default:D.optional(D.literal(!0)),config:D.optional(ui)});function pi(e,t,n,r=t.default){return{id:e,kind:t.kind,name:t.name,scope:t.scope,default:r,online:t.lastSeen!==void 0&&n-t.lastSeen<3e5,...t.lastSeen===void 0?{}:{lastSeen:t.lastSeen},config:t.config,createdAt:t.createdAt}}function R(e){let t=e.session?.user.id,n=(e.now??Date.now)(),r=n=>n===`workspace`?B(e):!!t,i=async(n=e.store)=>(await n.list(`runner`)).filter(({value:n})=>Jn(n,t)&&(e.local||n.kind!==`local`&&n.kind!==`local-docker`));return{user:t,now:n,canCreate:r,rows:i,row:async(t,r,a=e.store)=>{let o=(await i(a)).some(({value:e})=>e.scope===`personal`&&e.default);return pi(t,r,n,r.default&&(r.scope===`personal`||!o))}}}async function mi(e,t,n,r){n.id;let{user:i,now:a,canCreate:o,rows:s,row:c}=R(t),l=await s(),u=l.find(({value:e})=>e.scope===`personal`&&e.default)??l.find(({value:e})=>e.default),d={id:Yn(t),kind:t.config.runner,name:t.local?`This machine`:`Default runner`,scope:`workspace`,default:!u,online:!0,config:{},createdAt:0};return S({items:[d,...l.map(({id:e,value:t})=>pi(e,t,a,e===u?.id))],catalog:si(t)})}async function hi(e,t,n,r){n.id;let{user:i,now:a,canCreate:o,rows:s,row:c}=R(t);{let n=di.safeParse(await e.json().catch(()=>void 0));if(!n.success)return S({error:`Invalid runner`},400);if(!o(n.data.scope))return S({error:`This scope requires a member or workspace admin.`},403);let r=si(t).find(e=>e.kind===n.data.kind);if(!r.available||r.connect===`pair`)return S({error:r.reason??`Pair this runner with runner serve.`},400);try{$n(r,n.data.config)}catch(e){return S({error:e.message},400)}let s=yi(n.data.kind,n.data.config,t),l=`rnr_${k(9).toString(`base64url`)}`,u={...n.data,...s,owner:n.data.scope===`personal`?i:void 0,createdBy:i,default:!1,createdAt:a,updatedAt:a};return await t.store.put(`runner`,l,u),S(await c(l,u))}}async function gi(e,t,n,r){let i=n.id,{user:a,now:o,canCreate:s,rows:c,row:l}=R(t);if(i===Yn(t))return S(await er(t));let u=e=>{if(!e||!Jn(e,a)||!t.local&&(e.kind===`local`||e.kind===`local-docker`))return S({error:`Unknown runner`},404);if(e.scope===`workspace`&&!B(t))return S({error:`Only a workspace owner or admin can change this runner.`},403)},d=await t.store.get(`runner`,i),f=u(d);if(f)return f;let p=await er(t,d);return await t.store.withAppLock(`runners:${t.organizationId}`,async e=>{let n=await e.get(`runner`,i);n&&n.secret===d.secret&&JSON.stringify(n.config)===JSON.stringify(d.config)&&await e.put(`runner`,i,{...n,lastSeen:p.ok?(t.now??Date.now)():void 0,updatedAt:(t.now??Date.now)()})}),S(p)}async function _i(e,t,n,r){let i=n.id,{user:a,now:o,canCreate:s,rows:c,row:l}=R(t);if(i===Yn(t)){if(B(t)){let n=fi.safeParse(await e.json().catch(()=>void 0));if(!n.success||!n.data.default||n.data.name||n.data.config)return S({error:`Only the default can change for the built-in runner.`},400);await t.store.withAppLock(`runners:${t.organizationId}`,async e=>{for(let{id:t,value:n}of await e.list(`runner`))n.scope===`workspace`&&n.default&&await e.put(`runner`,t,{...n,default:!1,updatedAt:o})});let r=(await c()).some(({value:e})=>e.scope===`personal`&&e.default);return S({id:i,kind:t.config.runner,name:t.local?`This machine`:`Default runner`,scope:`workspace`,default:!r,online:!0,config:{},createdAt:0})}return S({error:`The server default cannot be renamed or removed.`},403)}let u=e=>{if(!e||!Jn(e,a)||!t.local&&(e.kind===`local`||e.kind===`local-docker`))return S({error:`Unknown runner`},404);if(e.scope===`workspace`&&!B(t))return S({error:`Only a workspace owner or admin can change this runner.`},403)};return t.store.withAppLock(`runners:${t.organizationId}`,async n=>{let r=await n.get(`runner`,i),a=u(r);if(a||!r)return a;{let a=fi.safeParse(await e.json().catch(()=>void 0));if(!a.success||!Object.keys(a.data).length)return S({error:`Invalid runner update`},400);let s={};if(a.data.config){let e={...r.config,...P(t.config,r.secret),...a.data.config};try{$n(si(t).find(e=>e.kind===r.kind),e)}catch(e){return S({error:e.message},400)}s=yi(r.kind,e,t)}if(a.data.default)for(let e of await n.list(`runner`))e.id!==i&&e.value.scope===r.scope&&e.value.owner===r.owner&&e.value.default&&await n.put(`runner`,e.id,{...e.value,default:!1,updatedAt:o});let c={...r,...a.data.name?{name:a.data.name}:{},...a.data.default?{default:!0}:{},...s,updatedAt:o};return await n.put(`runner`,i,c),S(await l(i,c,n))}})}async function vi(e,t,n,r){let i=n.id,{user:a,now:o,canCreate:s,rows:c,row:l}=R(t);if(i===Yn(t))return S({error:`The server default cannot be renamed or removed.`},403);let u=e=>{if(!e||!Jn(e,a)||!t.local&&(e.kind===`local`||e.kind===`local-docker`))return S({error:`Unknown runner`},404);if(e.scope===`workspace`&&!B(t))return S({error:`Only a workspace owner or admin can change this runner.`},403)};return t.store.withAppLock(`runners:${t.organizationId}`,async e=>{let n=await e.get(`runner`,i),r=u(n);if(r||!n)return r;{let n=(await e.list(`task`)).filter(({value:e})=>e.task.runnerId===i&&Z.includes(e.status)).length;return n?S({error:n===1?`1 task still runs on this runner. Stop it or wait.`:`${n} tasks still run on this runner. Stop them or wait.`},409):(await e.delete(`runner`,i),t.settings?.runnerInstances?.delete(i),S({ok:!0}))}})}function yi(e,t,n){let r=new Set(si(n).find(t=>t.kind===e).fields.filter(e=>e.secret).map(e=>e.key)),i=Object.entries(t);return{config:Object.fromEntries(i.filter(([e])=>!r.has(e))),secret:N(n.config,Object.fromEntries(i.filter(([e])=>r.has(e))))}}const bi=D.strictObject({name:D.optional(ci),scope:li});async function xi(e,t,n,r){n.id;let{user:i,now:a,canCreate:o,rows:s,row:c}=R(t),l=bi.safeParse(await e.json().catch(()=>void 0));if(!l.success)return S({error:`Invalid pairing`},400);if(!o(l.data.scope))return S({error:`This scope requires a member or workspace admin.`},403);let u=`${Buffer.from(t.organizationId).toString(`base64url`)}.${k(32).toString(`base64url`)}`,d=a+9e5;await t.store.put(`snapshot`,`runner-pair:${we(u)}`,{...l.data,owner:l.data.scope===`personal`?i:void 0,createdBy:i,expiresAt:d},{ttlMs:9e5});let f=t.config.publicUrl??r.origin;return S({token:u,expiresAt:d,command:`coder runner serve --url ${f} --token ${u}`})}const Si=D.strictObject({token:D.optional(D.string()),id:D.optional(D.string()),organizationId:D.optional(D.string()),name:D.optional(D.string().check(D.minLength(1),D.maxLength(80))),url:D.string(),secret:D.string().check(D.minLength(32)),offline:D.optional(D.boolean())});async function Ci(e,t,n,r){let i=Si.safeParse(await e.json().catch(()=>void 0));if(!i.success)return S({error:`Invalid runner registration`},400);let a=i.data;try{new jn({url:a.url,secret:a.secret})}catch{return S({error:`A public HTTPS runner URL is required`},400)}let o=a.token?Buffer.from(a.token.split(`.`)[0],`base64url`).toString():a.organizationId;if(!o||o!==t.organizationId&&!t.scope)return S({error:`Invalid runner token`},401);t=M(t,o);let s=(t.now??Date.now)();return t.store.withAppLock(`runners:${t.organizationId}`,async e=>{let n,r;if(a.token){let i=`runner-pair:${we(a.token)}`,o=await e.get(`snapshot`,i);if(!o||o.expiresAt<=s||!await e.take(`snapshot`,i))return S({error:`Pairing token expired or already used`},401);r=`rnr_${k(9).toString(`base64url`)}`,n={kind:`http`,name:o.name??a.name??`Your machine`,scope:o.scope,owner:o.owner,createdBy:o.createdBy,default:!1,createdAt:s,updatedAt:s,...yi(`http`,{url:a.url,secret:a.secret},t),lastSeen:s}}else{r=a.id??``;let i=await e.get(`runner`,r);if(!i||i.kind!==`http`||!Oe(P(t.config,i.secret).secret??``,a.secret))return S({error:`Invalid runner token`},401);n={...i,config:{...i.config,url:a.url},lastSeen:a.offline?void 0:s,updatedAt:s}}return await e.put(`runner`,r,n),S({...pi(r,n,s),organizationId:o})})}const wi=(e,t)=>`${e}:${String(t).padStart(6,`0`)}`;function Ti(e,t,n,r){let i=t,a=r,o=[];for(let t of e){let e=Buffer.byteLength(t.line);if(a+e>2097152)break;o.push({seq:i,at:n,level:t.level,line:t.line}),a+=e,i+=1}return{lines:o,seq:i,bytes:a}}async function z(e,t,n=-1,r){return(await e.list(`tasklog`,{prefix:`${t}:`,...n>=0?{after:wi(t,n)}:{},...r?{limit:r}:{}})).map(e=>{let t=ct(e.value.line);return{seq:Number(e.id.slice(e.id.lastIndexOf(`:`)+1)),...e.value,...t?{entry:t}:{}}})}async function Ei(e,t,n=-1,r){if(!t.handle)return z(e.store,t.task.id,n,r);let i=await Qn(e,t.task);if(!i)return z(e.store,t.task.id,n,r);let[a,o]=await Promise.all([e.store.get(`task`,t.task.id),Nc(e,t).catch(()=>void 0)]);if(!o)return z(e.store,t.task.id,n,r);let s=a&&a.attempts===t.attempts&&a.tokenHash===t.tokenHash&&a.generation===t.generation&&a.handle===t.handle?a:t,c=s.logCursor??-1,l=s.logSeq??0,u=s.logBytes??0,d=[...Object.values(o.tokens),...Object.values(o.credential.env),...Object.values(o.config.mcp??{}).flatMap(e=>[...Object.values(e.env??{}),...Object.values(e.headers??{})])],f=await i.logs(t.handle,c),p=(e.now??Date.now)(),m=e=>d.reduce((e,t)=>t?e.replaceAll(t,`[REDACTED]`):e,e),h=e=>typeof e==`string`?m(e):Array.isArray(e)?e.map(h):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).map(([e,t])=>[m(e),h(t)])):e,g=Ti(f.lines.map(({level:e,line:t})=>{let n=ct(t);return{level:e,line:n?JSON.stringify(h(n)):m(t)}}),l,p,u);return await e.queue.appendLogs(e.organizationId,t.task.id,g.lines,{seq:l,cursor:c},{cursor:f.next,seq:g.seq,bytes:g.bytes},p,{attempts:t.attempts,tokenHash:t.tokenHash??null,handle:t.handle,generation:t.generation??0}),z(e.store,t.task.id,n,r)}async function Di(e,t,n,r=!1){let i=V(e);if(!i)return new Response(`Unauthorized`,{status:401});let a=j(i);return a.task!==n||a.organization!==t.organizationId||!Number.isInteger(a.attempt)?new Response(`Unauthorized`,{status:401}):await t.queue.touch(t.organizationId,n,A(i),a.attempt,(t.now??Date.now)(),r)??new Response(`Unauthorized`,{status:401})}function Oi(e){let t=e.event;return t?t.repo?`${t.repo.owner}/${t.repo.name}`:t.chat?.thread.channelId??t.integration:e.source}async function ki(e,t,n,r){let i=n.id,a=V(e),o=j(a),s=A(a),c=Number(r.searchParams.get(`after`)??-1);if(!Number.isInteger(c)||c<-1)return S({error:`Invalid cursor`},400);let l=await t.queue.fetchInbox(t.organizationId,i,s,o.attempt,c);return l?S(l):new Response(`Unauthorized`,{status:401})}async function Ai(e,t,n,r){let i=n.id,a=V(e),o=j(a),s=A(a),c=await e.json().catch(()=>void 0);if(!c||!Number.isInteger(c.seq)||c.seq<-1||!Number.isInteger(c.generation)||c.generation<0||c.answers!==void 0&&(!Array.isArray(c.answers)||c.answers.some(e=>!e||!Number.isInteger(e.seq)||e.seq<0||e.seq>c.seq)))return S({error:`Invalid acknowledgement`},400);let l={tokenHash:s,attempts:o.attempt,generation:c.generation};return await t.queue.ackInbox(t.organizationId,i,c,l)?S({ok:!0}):new Response(`Unauthorized`,{status:401})}async function ji(e,t,n,r){let i=n.id,a=V(e),o=j(a),s=A(a);return await t.queue.touch(t.organizationId,i,s,o.attempt,(t.now??Date.now)())?S({ok:!0}):new Response(`Unauthorized`,{status:401})}async function Mi(e,t,n,r){let i=n.id;V(e);let a=t.callbackTask;if([`completed`,`failed`,`cancelled`].includes(a.status))return S({ok:!0});let o=await e.json().catch(()=>void 0);if(!o?.status||![`running`,`waiting`,`completed`,`failed`,`cancelled`].includes(o.status))return S({error:`Invalid task result`},400);let s=(t.now??Date.now)();if(o.status===`running`||o.status===`waiting`)return await t.queue.patchTask(t.organizationId,i,{status:o.status,lastSeenAt:s,...o.approval===void 0?o.status===`running`?{approval:void 0}:{}:{approval:o.approval},...o.answer===void 0?{}:{answer:o.answer}},s,{attempts:a.attempts,tokenHash:a.tokenHash,statuses:[`running`,`waiting`]}),S({ok:!0});await Ei(t,a).catch(()=>{});let c=typeof o.result==`string`?o.result:JSON.stringify(o.result??``),l={ok:o.status===`completed`,exitCode:o.status===`completed`?0:1,output:c,...typeof o.diff==`string`?{diff:o.diff}:{}};return await t.queue.completeTask(t.organizationId,i,{attempts:a.attempts,tokenHash:a.tokenHash,outcome:{status:o.status,result:l,...o.error?{error:o.error}:{},...o.tokens===void 0?{}:{tokens:o.tokens}},...typeof o.note==`string`?{note:{key:fn(a.task),value:o.note,ttlMs:2592e6}}:{},usage:{...a.task.event?{installationId:`${a.task.event.appId}:${a.task.event.installationId}`}:{},taskId:i,agent:a.task.agent,target:Oi(a.task),...a.task.usage?.engine??a.task.definition.engine?{engine:a.task.usage?.engine??a.task.definition.engine}:{},...a.task.usage?.model??a.task.definition.model?{model:a.task.usage?.model??a.task.definition.model}:{},credential:a.task.credential??`unknown`,runnerElapsedMs:Math.max(0,s-(a.startedAt??s)),...o.tokens===void 0?{}:{tokens:o.tokens},at:s}},s),S({ok:!0})}async function Ni(e,t,n,r){n.id,V(e);let i=t.callbackTask,a=await e.json().catch(()=>({}));return typeof a.authJson!=`string`||!i.task.credential?S({error:`Invalid credential update`},400):S({kept:await Va(t.store,t.config,i.task.credential,a.authJson)})}async function Pi(e,t,n,r){n.id,V(e);let i=t.callbackTask;try{return S({...await Nc(t,i),generation:i.generation??0})}catch(e){return S({error:e instanceof Error?e.message:String(e)},409)}}async function Fi(e,t){if(!t.auth)return t;let n=await t.auth.session(e.headers);if(!(!n?.organizationId||n.organizationDenied))return{...M(t,n.organizationId),session:n}}const Ii=new Set([`owner`,`admin`]);function B(e){return!e.auth||Ii.has(e.session?.role??``)}function Li(e,t){return B(e)?e:S({error:t},403)}function Ri(e,t){return!!(e&&t&&Oe(e,t))}function V(e){let t=e.headers.get(`authorization`);return t?.startsWith(`Bearer `)?t.slice(7):null}const zi=new Set([`localhost`,`127.0.0.1`,`::1`,`[::1]`]);function Bi(e){if(e.headers.has(`x-forwarded-for`)||e.headers.has(`x-forwarded-host`))return!1;let t=e.headers.get(`host`)??new URL(e.url).host;try{return zi.has(new URL(`http://${t}`).hostname)}catch{return!1}}const Vi=e=>e.local?`local`:e.config.store===`postgres`?`cloud`:`memory`,Hi=e=>e.startsWith(`/tasks/`)||e.startsWith(`/logins/`)||e===`/runners/register`,Ui=[`/hooks/`,`/create/`,`/install/`,`/connect/`];function Wi(e,t){let n=e?.replace(/^::ffff:/,``)??``;if(zi.has(n)||n.startsWith(`127.`))return!0;let r=URL.parse(`http://localhost${t}`)?.pathname??``;return Hi(r)||Ui.some(e=>r.startsWith(e))}function Gi(e,t){if(!t.local)return!0;let n=new URL(e.url),r=e.headers.get(`host`)??n.host,i=URL.parse(`http://${r}`)?.port||`80`;if(Bi(e)&&i===String(t.local.port))return!0;let a=t.config.publicUrl?new URL(t.config.publicUrl).host:void 0;return(e.headers.get(`x-forwarded-host`)?.split(`,`,1)[0]?.trim()??r)===a&&!Bi(e)&&(Hi(n.pathname)||Ui.some(e=>n.pathname.startsWith(e)))}function Ki(e,t){let n=e.headers.get(`origin`)??e.headers.get(`referer`);if(!n)return!1;try{return new URL(n).origin===new URL(t??e.url).origin}catch{return!1}}function qi(e){let t=e.headers.get(`cookie`)?.split(`;`).map(e=>e.trim()).find(e=>e.startsWith(`coder_admin=`))?.slice(12);if(!t)return null;try{return decodeURIComponent(t)}catch{return null}}async function Ji(e,t){if(!t.auth){let n=()=>new Response(`Unauthorized`,{status:401,headers:{"www-authenticate":`Bearer`}});if(t.config.store!==`memory`||!Bi(e))return n();let r=qi(e),i=Ri(V(e),t.config.adminToken),a=Ri(r,t.config.adminToken);return i?{...t,authorizedRequest:e}:a?e.method===`GET`||Ki(e)?{...t,authorizedRequest:e}:tt():n()}let n=await t.auth.session(e.headers,e.method!==`GET`);if(n?.stale)return S({error:`Token too old for this action.`},401,{"www-authenticate":`Bearer error="invalid_token", error_description="Token too old for this action"`});if(n?.organizationDenied)return S({error:`You are not a member of that workspace.`},403);let r=n?.role;return!n?.organizationId||!r?S({error:`Sign in first.`,hint:`coder auth login`},401,V(e)?{"www-authenticate":`Bearer error="invalid_token"`}:{}):e.method!==`GET`&&e.headers.has(`cookie`)&&!Ki(e,t.config.publicUrl)?tt():{...M(t,n.organizationId),session:n,authorizedRequest:e}}async function Yi(e,t){if(!t.auth)return t;let n=new Headers(e.headers),r=new URL(e.url).searchParams.get(`organization`);r&&n.set(`x-coder-organization`,r);let i=await t.auth.session(n,!0);if(i?.organizationDenied)return new Response(`You are not a member of that workspace.`,{status:403});let a=i?.role;return!i?.organizationId||!a?nt(new URL(e.url)):{...M(t,i.organizationId),session:i}}async function Xi(e,t){if(e.method!==`POST`)return;let n=Si.safeParse(await e.clone().json().catch(()=>void 0));if(!n.success||n.data.token)return;let{id:r,organizationId:i,secret:a}=n.data;if(!r||!i||i!==t.organizationId&&!t.scope)return;let o=M(t,i),s=await o.store.get(`runner`,r);if(s?.kind===`http`&&Oe(P(o.config,s.secret).secret??``,a))return`runner:${i}:${r}`}async function Zi(e,t,n,r){let i=n.id,a=V(e);if(!a)return new Response(`Unauthorized`,{status:401});let o=j(a);return o.task!==i||typeof o.organization!=`string`||!o.organization||!Number.isInteger(o.attempt)||(t.scope&&(t=M(t,o.organization)),t.organizationId!==o.organization)?new Response(`Unauthorized`,{status:401}):t}async function Qi(e,t,n,r,i=!1){let a=n.id,o=V(e);if(o&&t.taskOrganization&&t.scope){let e=await t.taskOrganization(a,A(o));e&&(t=M(t,e))}let s=await Di(e,t,a,i);return s instanceof Response?s:{...t,callbackTask:s}}function $i(e,t,n,r){return Qi(e,t,n,r,e.method===`POST`)}function ea(e){let{organization:t}=j(e);return typeof t==`string`?t:void 0}async function ta(e,t,n){let r=V(e);if(!r)return new Response(`Unauthorized`,{status:401});let i=ea(r),a=i&&t.scope&&i!==t.organizationId?M(t,i):t,o=n.id,s=await a.store.get(`login`,o);return!s||!Oe(A(r),s.tokenHash)?new Response(`Unauthorized`,{status:401}):{...a,callbackLogin:s}}async function na(e,t){let n=e.method===`POST`?new URLSearchParams(await e.clone().text()):void 0;return t.searchParams.get(`tx`)??at(t.searchParams.get(`state`))?.tx??n?.get(`tx`)??void 0}async function ra(e,t,n,r){let i=await na(e,r),a=t.serverOrganizationId??t.organizationId;return i&&Zt(t,i)===`*`&&Xt(t,i)===a?{...M(t,a),operatorApp:!0}:Yi(e,t)}function ia(e,t,n,r){return Yi(e,t)}async function aa(e,t,n,r){let i=r.pathname.split(`/`)[2];if(!(/^[a-z0-9_-]+$/.test(i)?t.integrations[n.integration]:void 0)?.auth.user||!t.auth||!t.config.publicUrl)return w();if(e.method!==`GET`)return t;let a=await Fi(e,t);return a?.session?{...t,linkContext:a}:nt(r)}function oa(e,t){return Li(t,`Workspace admin access is required.`)}function sa(e,t){return t.local?t:w()}function ca(e,t){return t.local?S({error:tl},400):t.session?.user.id?t:S({error:`Sign in to use a subscription.`},403)}function la(e){return async(t,n,r,i)=>{let a=n.authorizedRequest===t?n:await Ji(t,n);return a instanceof Response?a:e?e(t,a,r,i):a}}function ua(e,t,n,r){return e.method===(n.engine?`POST`:`GET`)&&(!t.local||n.engine&&!nl(n.engine))?S({error:n.engine?`Engine sign-in is available on a local server only`:`Engine status is available on a local server only`},404):t}async function da(e,t,n,r){return t.config.publicUrl&&t.auth?t:ai(e,t,r)}async function fa(e,t,n,r){if(!t.auth)return Ji(e,t);if(![`GET`,`POST`,`PUT`,`PATCH`,`DELETE`].includes(e.method))return t;let i=await t.auth.session(e.headers);return i?.organizationDenied?S({error:`You are not a member of that workspace.`},403):i?{...t,session:i}:S({error:`Sign in first.`,hint:`coder auth login`},401)}async function pa(e,t,n,r){if(!t.auth)return w();if(e.method!==`POST`)return t;let i=await t.auth.session(e.headers);return i?e.headers.has(`cookie`)&&!Ki(e,t.config.publicUrl)?tt():{...t,session:i}:S({error:`Sign in first.`},401)}function ma(e,t,n,r){return e.method===`POST`?t.auth||t.config.store!==`memory`||!Bi(e)?w():Ki(e)?t:tt():t}async function ha(e,t,n,r){return e.method===`GET`?{...t,session:(await Fi(e,t))?.session}:t}async function ga(e,t,n,r){return[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`].includes(e.method)&&t.auth&&(await Fi(e,t))?.session?it(`/dash`):t}async function _a(e,t,n,r){if(![`GET`,`POST`,`PUT`,`PATCH`,`DELETE`].includes(e.method))return t;let i=await t.auth?.session(e.headers);return i&&!i.organizations.length?t.auth.handler(new Request(r.origin+`/api/auth/sign-in?return=`+encodeURIComponent(r.pathname+r.search))):t.auth&&!(await Fi(e,t))?.session?nt(r):t}function va(e,t,n,r){return e.method===`POST`&&t.local?S({error:tl},400):t}async function ya(e,t,n,r){if(![`GET`,`POST`].includes(e.method))return t;if(!t.auth)return w();if(e.headers.get(`authorization`)?.startsWith(`Bearer `))return S({error:`Link your account from the browser.`},403);let i=await Fi(e,t);return i?.session?{...t,linkContext:i}:e.method===`GET`?nt(r):S({error:`Sign in first.`},401)}function ba(e,t,n,r){return![`GET`,`POST`,`PUT`,`PATCH`,`DELETE`].includes(e.method)||t.auth?t:w()}function xa(e,t){return e?`${e}/${t}`:t}function H(e){let t=e.lastIndexOf(`/`);return t<0?{label:e}:{owner:e.slice(0,t),label:e.slice(t+1)}}var Sa=class extends Error{status;constructor(e,t){super(`Credential check failed: ${e}${t?` ${t}`:``}`),this.status=e}};function Ca(e){if(e.OPENAI_API_KEY)return e.OPENAI_API_KEY;if(e.CODEX_AUTH_JSON)try{let t=JSON.parse(e.CODEX_AUTH_JSON);return t.OPENAI_API_KEY??t.tokens?.access_token??t.access_token}catch{throw Error(`CODEX_AUTH_JSON is not valid JSON`)}}async function wa(e,t=fetch){if(e.engine===`custom`)return;let n,r;if(e.engine===`claude`){let t=e.env.ANTHROPIC_API_KEY,i=e.env.CLAUDE_CODE_OAUTH_TOKEN;if(!t&&!i)throw Error(`Claude credentials need ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN`);n=`https://api.anthropic.com/v1/models`,r={"anthropic-version":`2023-06-01`,...t?{"x-api-key":t}:{authorization:`Bearer ${i}`,"anthropic-beta":`oauth-2025-04-20`}}}else{let t=Ca(e.env);if(!t)throw Error(`Codex credentials need OPENAI_API_KEY or CODEX_AUTH_JSON`);n=`https://api.openai.com/v1/models`,r={authorization:`Bearer ${t}`}}let i=await t(n,{method:`GET`,headers:r});if(!i.ok)throw new Sa(i.status,i.statusText)}async function Ta(e,t,n){let r=e.listCredentials?await e.listCredentials({owner:n,engine:t}):await e.list(`credential`),i=e=>{let n=r.filter(n=>n.value.owner===e&&(!t||n.value.engine===t));return n.find(e=>e.value.isDefault)??n[0]};return(n?i(n):void 0)??i(void 0)}async function Ea(e,t){return(e.listCredentials?await e.listCredentials({owner:t}):await e.list(`credential`)).filter(e=>!e.value.owner||e.value.owner===t)}async function Da(e,t){let n=e.session?.user.id,r=await Ea(e.store,n),i=n=>r.filter(e=>e.value.owner===n).sort((e,t)=>Number(!!t.value.isDefault)-Number(!!e.value.isDefault)).map(n=>La(e.config,n.value).env[t]).find(Boolean);return(n?i(n):void 0)??i(void 0)??(e.local?E.env[t]:void 0)}function Oa(e,t){let n=new Set(e.map(e=>H(e.id).label)),r=t;for(let e=2;n.has(r);e++)r=`${t}-${e}`;return r}const ka=(e,t,n)=>e.filter(e=>e.id!==t&&e.value.engine===n),Aa=(e,t)=>({id:e.id,value:{...e.value,isDefault:t}});function ja(e,t,n){return ka(e,t,n).filter(e=>e.value.isDefault).map(e=>Aa(e,!1))}function Ma(e,t,n){let r=ka(e,t,n)[0];return r?[Aa(r,!0)]:[]}async function Na(e,t,n,r=Date.now){let i=n.owner||void 0,a=n.credential.engine,o=n.label?.trim(),s=o||(n.credential.env.CLAUDE_CODE_OAUTH_TOKEN?`claude-token`:`${a}-key`);return await e.withCredential(`credential`,xa(i,s),async(e,c)=>{o||(s=Oa(c,s));let l=xa(i,s),u=c.find(e=>e.id===l)?.value,d=!!(n.makeDefault||u?.isDefault&&u.engine===a||!ka(c,l,a).some(e=>e.value.isDefault));return[{id:l,value:{...wn(t,{env:n.credential.env}),engine:a,...i?{owner:i}:{},...n.account?{account:n.account}:{},isDefault:d,createdAt:u?.createdAt??r()}},...d?ja(c,l,a):[],...u?.isDefault&&u.engine!==a?Ma(c,l,u.engine):[]]}),s}function Pa(e,t){return e.withCredential(`credential`,t,async(e,n)=>e&&[{id:t,value:null},...e.isDefault?Ma(n,t,e.engine):[]])}function Fa(e,t){return e.withCredential(`credential`,t,async(e,n)=>e&&[Aa({id:t,value:e},!0),...ja(n,t,e.engine)])}async function Ia(e,t,n,r,i){let a=await e.get(`login`,t);if(!a)return!1;let o=xa(a.owner,r);return e.withCredential(`credential`,o,async(e,s,c)=>{if(!await c.patchLogin(t,{state:`done`,label:r},{state:[`starting`,`open`,`verifying`],tokenHash:n,owner:a.owner}))return;let l={...i,owner:a.owner,engine:a.engine,isDefault:!0,createdAt:e?.createdAt??i.createdAt};return[{id:o,value:l},...ja(s,o,a.engine)]})}function La(e,t){return{...Tn(e,t),engine:t.engine}}function Ra(e){if(e.CODEX_AUTH_JSON)return`auth.json`;let t=Object.values(e)[0]??``;return t.length>16?`${t.slice(0,7)}…${t.slice(-4)}`:`••••`}function za(e,t,n){let r=La(e,n);return{label:H(t).label,engine:n.engine,scope:n.owner?`personal`:`workspace`,isDefault:!!n.isDefault,createdAt:n.createdAt??0,env:Object.keys(r.env).sort(),masked:Ra(r.env),...n.account?{account:n.account}:{}}}const Ba=e=>{try{return Date.parse(JSON.parse(e??``).last_refresh??``)}catch{return NaN}};function Va(e,t,n,r){return e.withCredential(`credential`,n,async e=>{if(!e)return;let{env:i}=La(t,e);if(!(!i.CODEX_AUTH_JSON||!(Ba(r)>(Ba(i.CODEX_AUTH_JSON)||0))))return[{id:n,value:{...e,...wn(t,{env:{...i,CODEX_AUTH_JSON:r}})}}]})}function Ha(e,t){return En(e,t.iv===`plain`?`plain.${t.ciphertext}`:`${t.iv}.${t.tag}.${t.ciphertext}`)}async function Ua(e,t){if(!t.encryptionKey)throw Error(`SERVER_ENCRYPTION_KEY is required to rotate keys`);let n=xn(t.encryptionKey),r=e=>En(t,e)!==n,i=e=>r(e)?N(t,P(t,e)):e,a=e=>{let t=e.token&&i(e.token),n=e.connections&&Object.fromEntries(Object.entries(e.connections).map(([e,t])=>[e,t.kind===`oauth`&&r(t.token)?{...t,token:i(t.token)}:t]));if(!(t===e.token&&!Object.entries(n??{}).some(([t,n])=>n!==e.connections[t])))return{...e,...t?{token:t}:{},...n?{connections:n}:{}}},o=0;for(let{id:t}of await e.list(`app`))await e.withAppLock(t,async e=>{let n=await e.get(`app`,t);return!n||!r(n.credentials)?!1:(await e.put(`app`,t,{...n,credentials:i(n.credentials)}),!0)})&&o++;for(let{id:t}of await e.list(`installation`))await e.withCredential(`installation`,t,async e=>{let n=e&&a(e);return n&&[{id:t,value:n}]})&&o++;for(let{id:t}of await e.list(`runner`))await e.withCredential(`runner`,t,async e=>{if(!(!e||!r(e.secret)))return[{id:t,value:{...e,secret:i(e.secret)}}]})&&o++;for(let{id:r}of await e.list(`credential`))await e.withCredential(`credential`,r,async e=>{if(!(!e||Ha(t,e)===n))return[{id:r,value:{...e,...wn(t,{env:La(t,e).env})}}]})&&o++;return o+await vc(e,t)}function Wa(e,t){return`${e.config.publicUrl?.replace(/\/$/,``)??``}/dash/settings/credentials?engine=${encodeURIComponent(t)}`}const Ga=D.object({label:D.optional(D.string().check(D.regex(/^[^/\s][^/]*$/))),env:D.record(D.string(),D.string().check(D.minLength(1))),engine:D.enum([`claude`,`codex`,`custom`]),workspace:D.optional(D.boolean()),default:D.optional(D.boolean()),noCheck:D.optional(D.boolean())}),Ka=`Only an owner or admin of this workspace can change workspace credentials.`;function qa(e,t,n){let r=e.session?.user.id,i=t.searchParams.has(`workspace`)||!r;return{workspace:i,id:xa(i?void 0:r,n)}}async function Ja(e,t,n,r){n.label;let i=t.session?.user.id,a=e=>`${e.engine}/${e.scope}/${e.label}`,o=(e,t)=>e.localeCompare(t)||(e<t?-1:+(e>t)),s=(await Ea(t.store,i)).map(e=>za(t.config,e.id,e.value)).sort((e,t)=>o(a(e),a(t)));if(!et(r))return S(s);let c=rt(r),l=r.searchParams.get(`q`)?.trim().toLowerCase(),u=s.filter(e=>!l||[e.label,e.engine,e.account?.email??``,...e.env].some(e=>e.toLowerCase().includes(l))).filter(e=>!c||o(a(e),c)>0);return S(ot(u,C(r),a))}async function Ya(e,t,n,r){n.label;let i=t.session?.user.id,a=await e.json().catch(()=>void 0),o=Ga.safeParse(a);if(!o.success||!Object.keys(o.data.env).length||Object.keys(o.data.env).some(e=>!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e)))return S({error:`Invalid credential`},400);let{env:s,engine:c}=o.data,l=!!o.data.workspace||!i;if(l&&!B(t))return S({error:Ka},403);if(s.CODEX_AUTH_JSON)return S({error:`Sign in with Codex on the Credentials page instead.`},400);if(s.CLAUDE_CODE_OAUTH_TOKEN&&(l&&t.auth||t.config.subscriptions?.claude))return S({error:`Sign in with Claude on the Credentials page instead.`},400);let u=l?void 0:i;try{o.data.noCheck||await wa({engine:c,env:s},t.fetch??fetch);let e=await Na(t.store,t.config,{label:o.data.label?.trim()||void 0,...u?{owner:u}:{},credential:{env:s,engine:c},makeDefault:o.data.default},t.now??Date.now);return S({ok:!0,label:e})}catch(e){return S({error:e instanceof Error?e.message:String(e)},e instanceof Sa?e.status:400)}}async function Xa(e,t,n,r){let i=n.label;t.session?.user.id;let{workspace:a,id:o}=qa(t,r,i);return a&&!B(t)?S({error:Ka},403):await Pa(t.store,o)?S({ok:!0}):S({error:`Unknown credential`},404)}async function Za(e,t,n,r){let i=n.label;t.session?.user.id;let{workspace:a,id:o}=qa(t,r,i);return a&&!B(t)?S({error:Ka},403):await Fa(t.store,o)?S({ok:!0}):S({error:`Unknown credential`},404)}async function Qa(e,t,n,r){let i=n.engine;return rl(i),S(await ol())}async function $a(e,t,n,r){let i=n.engine;return await il(i),S(await ol())}const eo=(e,t)=>e===`credential`?`credential:${H(t).owner??``}`:e===`runner`?`runners:`:`installation:${t}`;async function to(e,t,n,r){let i=H(n).owner,a=(await e.list(t)).filter(e=>t===`credential`?H(e.id).owner===i:e.id===n),o=await r(a.find(e=>e.id===n)?.value,a,e);for(let n of o??[])n.value===null?await e.delete(t,n.id):await e.put(t,n.id,n.value);return!!o?.length}var no=class{now;appUpdates=new Map;values=new Map;configUpdate;constructor(e=Date.now){this.now=e}async withAppLock(e,t){e.startsWith(`runners:`)&&(e=`runners:`);let n=(this.appUpdates.get(e)??Promise.resolve()).catch(()=>{}).then(()=>t(this));this.appUpdates.set(e,n);try{return await n}finally{this.appUpdates.get(e)===n&&this.appUpdates.delete(e)}}async withConfigLock(e){let t=(this.configUpdate??Promise.resolve()).catch(()=>{}).then(()=>e(this));this.configUpdate=t;try{return await t}finally{this.configUpdate===t&&delete this.configUpdate}}withCredential(e,t,n){return this.withAppLock(eo(e,t),()=>to(this,e,t,n))}bucket(e){let t=this.values.get(e);return t||(t=new Map,this.values.set(e,t)),t}live(e){let t=this.bucket(e),n=this.now();for(let[e,r]of t)r.expiresAt!==void 0&&r.expiresAt<=n&&t.delete(e);return t}async get(e,t){return this.live(e).get(t)?.value}async patchLogin(e,t,n={}){let r=this.live(`login`).get(e),i=r?.value;if(!i||!(i.expiresAt>this.now())||Object.entries(n).some(([e,t])=>Array.isArray(t)?!t.includes(i[e]):i[e]!==t))return;let a={...i,...t};return a.input===null&&delete a.input,r.value=a,a}completeLogin(e,t,n,r){return Ia(this,e,t,n,r)}async put(e,t,n,r={}){let i=r.ttlMs===void 0?void 0:this.now()+r.ttlMs,a=this.bucket(e),o=e===`task`?a.get(t)?.value?.archivedAt:void 0;a.set(t,{value:o===void 0?n:Object.assign({},n,{archivedAt:o}),expiresAt:i})}async putMany(e,t){if(e===`task`){await Promise.all(t.map(t=>this.put(e,t.id,t.value)));return}let n=this.bucket(e);for(let e of t)n.set(e.id,{value:e.value})}async list(e,t={}){return[...this.live(e).entries()].filter(([e])=>!t.prefix||e.startsWith(t.prefix)).filter(([e])=>!t.after||e>t.after).sort(([e],[t])=>e.localeCompare(t)).slice(0,t.limit).map(([e,t])=>({id:e,value:t.value}))}async delete(e,t){this.bucket(e).delete(t)}async create(e,t,n,r={}){let i=this.live(e);if(i.has(t))return!1;let a=r.ttlMs===void 0?void 0:this.now()+r.ttlMs;return i.set(t,{value:n,expiresAt:a}),!0}async claimDeliveryLease(e,t,n){let r=this.live(`delivery`);if(r.has(e))return;let i=this.live(`snapshot`).get(`delivery:${e}`)?.value?.failures??0;return r.set(e,{value:{owner:t,failures:i},expiresAt:this.now()+n}),i}async updateDeliveryLease(e,t,n,r={ttlMs:3e4}){let i=this.live(`delivery`);if(i.get(e)?.value?.owner!==t)return!1;if(!n)i.delete(e),this.bucket(`snapshot`).delete(`delivery:${e}`);else{let t=n.next===void 0?n:{...n,next:this.now()+r.ttlMs};i.set(e,{value:t,expiresAt:this.now()+r.ttlMs}),n.next!==void 0&&this.bucket(`snapshot`).set(`delivery:${e}`,{value:t,expiresAt:this.now()+864e5})}return!0}async updateDelivery(e,t,n,r={}){let i=this.live(`delivery`);return i.get(e)?.value?.owner===t&&(n===void 0?i.delete(e):i.set(e,{value:n,...r.ttlMs===void 0?{}:{expiresAt:this.now()+r.ttlMs}}),!0)}async take(e,t){let n=this.live(e),r=n.has(t);return r&&n.delete(t),r}};const ro=new Set([`app`,`installation`,`runner`]),io=new Set([`task`,`tasklog`,`inbox`,`usage`]),ao=new Set([`agent`,`agentversion`]);function oo(e,t){try{return JSON.parse(O.readFileSync(e,`utf8`))}catch(e){if(e.code===`ENOENT`)return t;throw e}}function so(e,t){O.mkdirSync(T.dirname(e),{recursive:!0});let n=`${e}.${process.pid}.tmp`;try{O.writeFileSync(n,t,{mode:384}),O.renameSync(n,e)}finally{O.rmSync(n,{force:!0})}}var co=class{now;derived=new no;writes=Promise.resolve();constructor(e=Date.now){this.now=e}withAppLock(e,t){return this.derived.withAppLock(e,()=>t(this))}withConfigLock(e){return this.derived.withConfigLock(()=>e(this))}withCredential(e,t,n){return this.derived.withAppLock(eo(e,t),()=>to(this,e,t,n))}get appsFile(){return n(`apps.json`)}get deliveriesFile(){return T.join(h(``),`deliveries.json`)}get notesDir(){return T.join(h(``),`notes`)}noteFile(e){return T.join(this.notesDir,`${encodeURIComponent(e)}.md`)}serial(e){let t=this.writes.then(e);return this.writes=t.catch(()=>{}),t}apps(){return oo(this.appsFile,{})}recordsFile(e){return e===`delivery`?this.deliveriesFile:e===`usage`?m():e===`snapshot`?T.join(h(``),`snapshots.json`):T.join(h(``),`runner`,`${e}.json`)}deliveries(e=`delivery`){let t=this.now();return Object.fromEntries(Object.entries(oo(this.recordsFile(e),{})).filter(([,e])=>e.expiresAt===void 0||e.expiresAt>t))}entries(e){if(ro.has(e))return Object.entries(this.apps()[e]??{});if(e===`delivery`||e===`snapshot`||io.has(e))return Object.entries(this.deliveries(e)).map(([e,t])=>[e,t.value]);if(e===`note`){let e=[];try{e=O.readdirSync(this.notesDir).filter(e=>e.endsWith(`.md`))}catch{}return e.map(e=>[decodeURIComponent(e.slice(0,-3)),O.readFileSync(T.join(this.notesDir,e),`utf8`)])}return[]}refuse(e){throw Error(`A local server keeps no ${e} records`)}async get(e,t){if(ao.has(e))return this.derived.get(e,t);if(e===`note`)try{return O.readFileSync(this.noteFile(t),`utf8`)}catch{return}return this.entries(e).find(([e])=>e===t)?.[1]}async completeLogin(){return this.refuse(`login`)}async patchLogin(){return this.refuse(`login`)}async put(e,t,n,r={}){if(ao.has(e))return this.derived.put(e,t,n,r);await this.serial(()=>this.write(e,t,n,r.ttlMs))}write(e,t,n,r){if(ro.has(e)){let r=this.apps();r[e]={...r[e],[t]:n},so(this.appsFile,`${JSON.stringify(r,null,2)}\n`)}else if(e===`delivery`||e===`snapshot`||io.has(e)){let i=this.deliveries(e);i[t]={value:n,...r===void 0?{}:{expiresAt:this.now()+r}},so(this.recordsFile(e),`${JSON.stringify(i)}\n`)}else e===`note`?so(this.noteFile(t),String(n)):this.refuse(e)}remove(e,t){if(ro.has(e)){let n=this.apps(),r=n[e];return!r||!(t in r)?!1:(delete r[t],so(this.appsFile,`${JSON.stringify(n,null,2)}\n`),!0)}if(e===`delivery`||e===`snapshot`||io.has(e)){let n=this.deliveries(e);return t in n&&(delete n[t],so(this.recordsFile(e),`${JSON.stringify(n)}\n`),!0)}if(e===`note`){let e=this.noteFile(t),n=O.existsSync(e);return O.rmSync(e,{force:!0}),n}return!1}async putMany(e,t){for(let n of t)await this.put(e,n.id,n.value)}async list(e,t={}){return ao.has(e)?this.derived.list(e,t):this.entries(e).filter(([e])=>(!t.prefix||e.startsWith(t.prefix))&&(!t.after||e>t.after)).sort(([e],[t])=>e.localeCompare(t)).slice(0,t.limit).map(([e,t])=>({id:e,value:t}))}async delete(e,t){if(ao.has(e))return this.derived.delete(e,t);await this.serial(()=>this.remove(e,t))}async create(e,t,n,r={}){return ao.has(e)?this.derived.create(e,t,n,r):this.serial(()=>!this.entries(e).some(([e])=>e===t)&&(this.write(e,t,n,r.ttlMs),!0))}claimDeliveryLease(e,t,n){return this.serial(()=>{if(this.deliveries()[e])return;let r=this.deliveries(`snapshot`)[`delivery:${e}`]?.value?.failures??0;return this.write(`delivery`,e,{owner:t,failures:r},n),r})}updateDeliveryLease(e,t,n,r={ttlMs:3e4}){return this.serial(()=>{if(this.deliveries()[e]?.value?.owner!==t)return!1;if(!n)this.remove(`delivery`,e),this.remove(`snapshot`,`delivery:${e}`);else{let t=n.next===void 0?n:{...n,next:this.now()+r.ttlMs};this.write(`delivery`,e,t,r.ttlMs),n.next!==void 0&&this.write(`snapshot`,`delivery:${e}`,t,864e5)}return!0})}async updateDelivery(e,t,n,r={}){return this.serial(()=>this.entries(`delivery`).find(([t])=>t===e)?.[1]?.owner===t&&(n===void 0?this.remove(`delivery`,e):this.write(`delivery`,e,n,r.ttlMs),!0))}async take(e,t){return ao.has(e)?this.derived.take(e,t):this.serial(()=>this.remove(e,t))}};function lo(e){let t=T.resolve(e);for(;!O.existsSync(T.join(t,`.git`));){let e=T.dirname(t);if(e===t)return Promise.resolve(void 0);t=e}return new Promise(t=>Ct(`git`,[`log`,`-1`,`--format=%H`,`--`,`.`],{cwd:e},(e,n)=>t(e?void 0:n.trim()||void 0)))}async function uo(e,t,r,i){let a=await he(t,r),o=await Promise.all(a.filter(e=>!i||e.id===i).map(async t=>{let r=t.usage?{settings:t.usage}:{};if(t.builtin){let{record:n,version:i}=await L(e,t.id);if(!n)return;let a={...n,settings:void 0,...r,local:!0};return await e.put(`agent`,t.id,a),{record:a,version:i}}if(!t.dir)return;let i=await lo(t.dir),a=O.statSync(T.join(t.dir,`agent.json`)),o=T.join(t.dir,`system.md`),s={agent:t.id,version:1,definition:t.definition,systemPrompt:O.existsSync(o)?O.readFileSync(o,`utf8`):``,files:yr(t.dir),...i?{commit:i}:{},importedFrom:`local:${t.dir}`,createdAt:a.mtimeMs},c={id:t.id,name:t.name,...t.definition.description?{description:t.definition.description}:{},source:T.resolve(t.dir)===n(`agents`,t.id)?`home`:`repo`,path:t.dir,currentVersion:1,...r,local:!0,...i?{commit:i}:{},createdAt:a.birthtimeMs||a.mtimeMs,updatedAt:a.mtimeMs};return await e.put(`agentversion`,cr(t.id,1),s),await e.put(`agent`,t.id,c),{record:c,version:s}}));if(!i){let t=new Set(a.map(e=>e.id));for(let n of await lr(e))n.local&&n.path&&!t.has(n.id)&&await e.delete(`agent`,n.id)}return o.filter(e=>!!e).sort((e,t)=>e.record.id<t.record.id?-1:+(e.record.id>t.record.id))}async function fo(e,t,r,i){let a=(await he(e,t)).find(e=>e.id===r&&!e.builtin)?.dir??n(`agents`,r),o={...i.files,"agent.json":`${JSON.stringify(i.definition,null,2)}\n`,"system.md":i.systemPrompt};for(let[e,t]of Object.entries(o))O.mkdirSync(T.dirname(T.join(a,e)),{recursive:!0}),O.writeFileSync(T.join(a,e),t)}async function po(e,t,r){let i=(await he(e,t)).find(e=>e.id===r&&!e.builtin);if(!i?.dir)throw Error(`No local agent named "${r}".`);return T.resolve(i.dir)===n(`agents`,r)&&(O.rmSync(i.dir,{recursive:!0}),!0)}var U=class extends Error{status;fix;constructor(e,t=400,n){super(e),this.status=t,this.fix=n}};function mo(e,t){if(t.cwd===void 0)return;if(!e.local)throw new U(`cwd is available on a local server only`);let n=tr(t.cwd);if(!n.ok)throw new U(n.detail);return n.folder.path}const ho=65536,go=/^[a-z0-9][a-z0-9_-]*$/i,_o=new Set([`claude`,`codex`,`custom`]),vo=new Set([`low`,`medium`,`high`]);function yo(e){let t=e.flow??`default`;if(!go.test(t))throw new U(`Invalid flow "${t}"`);if(e.prompt!==void 0&&typeof e.prompt!=`string`)throw new U(`prompt must be text`);if(t==="default"&&!e.prompt?.trim())throw new U(`prompt is required`);if((e.prompt?.length??0)>ho)throw new U(`prompt is longer than 64 KB`);if(e.repo!==void 0&&!/^[\w.-]+\/[\w.-]+$/.test(e.repo))throw new U(`repo must be owner/name`);if(e.pr!==void 0&&(!Number.isInteger(e.pr)||e.pr<1||!e.repo))throw new U(`pr needs a repo and a pull request number`);if(e.engine!==void 0&&!_o.has(e.engine))throw new U(`Unknown engine "${e.engine}"`);if(e.effort!==void 0&&!vo.has(e.effort))throw new U(`Unknown effort "${e.effort}"`);if(e.permissions!==void 0&&!(e.permissions in a))throw new U(`Unknown permissions "${e.permissions}"`);if(e.mcp!==void 0&&(!Array.isArray(e.mcp)||!e.mcp.every(e=>go.test(e))))throw new U(`mcp must list server names`);if(e.outputSchema!==void 0&&(!e.outputSchema||typeof e.outputSchema!=`object`||Array.isArray(e.outputSchema)))throw new U(`outputSchema must be an object`);if(e.args!==void 0&&(typeof e.args!=`object`||Array.isArray(e.args)))throw new U(`args must be an object`)}async function bo(e,t){let n=(await e.store.list(`installation`)).filter(({value:t})=>!t.deletedAt&&e.integrations[t.integration]?.repos),r=new Map((await Tl(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)try{let r=await n.auth.token(wc(e,i),P(e.config,a.credentials));if((await n.repos.list(i,r)).includes(t))return{integration:n,installation:i,app:a,token:r}}catch{}}throw new U(`No install in this workspace reaches ${t}`,404)}async function xo(e,t,n,r){let i=n.repo,{integration:a,installation:o,app:s,token:c}=await bo(e,i),l=await a.repos.get(i,c);return{event:{integration:a.id,type:n.pr?`pull_request`:`task`,appId:s.id,installationId:o.id.slice(s.id.length+1),deliveryId:t,actor:{id:r??``},text:n.prompt??``,...n.pr?{chat:{thread:a.repos.pullRequestThread(i,n.pr)}}:{},repo:n.pr?{...l,ref:`refs/pull/${n.pr}/head`}:l},author:a.author?.(s.name)??s.name}}async function So(e,t,n){yo(n);let r=mo(e,n),i=(e.now??Date.now)(),a=e.session?.user.id,o=n.agent??`coder`;e.local&&await uo(e.store,e.local.cwd,e.integrations);let s=()=>e.store.taskInputs?e.store.taskInputs(o,a,n.engine):L(e.store,o),c=await s();await br(e.store,i,o,c)&&(c=await s());let{record:l,version:u}=c,d=await Xn(e,{requester:a,runner:n.runner,agent:u?.definition.runner}).catch(e=>{throw new U(e.message)});if(!l||!u)throw new U(`No agent "${o}"`,404);let f=vr(l,u,{...n.engine?{engine:n.engine}:{},...n.model?{model:n.model}:{},...n.effort?{effort:n.effort}:{},...n.permissions?{permissions:n.permissions}:{}},e.integrations),p=ye(f),m=e.store.taskInputs?c.credential:(await Ta(e.store,p.engine,a))?.id,h=p.engine??`claude`;if(!m&&d.runner!==`http`&&!await sl(e,h))throw new U(`No ${h} credential is connected`,409,Wa(e,h));let g=`${i.toString(36)}-${k(4).toString(`hex`)}`,_=n.repo?await xo(e,g,n,a):void 0,v={id:g,source:t,agent:f.id,flow:n.flow??`default`,...d,permissions:p.permissions,..._?{event:_.event,author:_.author}:{},...r&&!_?{cwd:r}:{},...n.prompt?{prompt:n.prompt}:{},...n.args?{args:n.args}:{},...n.mcp?.length?{mcp:n.mcp}:{},definition:f.definition,...m?{credential:m}:{},...a?{requester:a}:{},...f.files?{files:f.files}:{},...f.usage?{usage:f.usage}:{},tools:{},...e.session||n.outputSchema?{context:{...e.session?{user:{name:e.session.user.name,email:e.session.user.email}}:{},...n.outputSchema?{outputSchema:n.outputSchema}:{}}}:{}};return e.local&&d.runner===`local`&&!d.runnerId?Gc(e,v):(await e.queue.enqueue(e.organizationId,v,i,void 0,e.config.maxQueued??1e3),{task:v,status:`queued`,attempts:0,createdAt:i,updatedAt:i})}function Co(e){return e.turns?e.turns:[...e.task.context?.turns??[],{prompt:e.task.prompt??e.task.event?.text??e.task.name??``,result:e.result,error:e.error,finishedAt:e.finishedAt,...[`completed`,`failed`,`cancelled`].includes(e.status)?{logSeq:e.logSeq}:{}}]}async function wo(e,t,n,r){if(r!==void 0&&(!r||typeof r!=`object`||Array.isArray(r)))throw new U(`outputSchema must be an object`);if(!n.trim())throw new U(`text is required`);if(n.length>ho)throw new U(`text is longer than 64 KB`);if(e.session&&t.task.requester&&t.task.requester!==e.session.user.id)throw new U(`Only the member who asked can continue this task`,403);let i=(e.now??Date.now)(),a=t.task.context?.messages??[],o=String(t.finishedAt??i),s=[...a,{user:`user`,text:t.task.prompt??t.task.event?.text??``,ts:String(t.createdAt)},{user:`agent`,text:t.result?.output??t.error??``,ts:o}].slice(-20),{note:c,...l}=t.task.context??{},u=Co(t);u.at(-1).finishedAt??=i;let d={task:{...t.task,prompt:n,context:{...l,...r?{outputSchema:r}:{},messages:s,turns:u}},status:`queued`,attempts:0,generation:(t.generation??0)+1,...t.logSeq===void 0?{}:{logSeq:t.logSeq},...t.logBytes===void 0?{}:{logBytes:t.logBytes},createdAt:t.createdAt,updatedAt:i};if(!await e.queue.continueTask(e.organizationId,t.task.id,d.task,i,{attempts:t.attempts,tokenHash:t.tokenHash??null,generation:t.generation??0}))throw new U(`Task is already active`,409);return d}const To={principalPerMinute:300,ipPerMinute:60,authPerMinute:20,registerPerMinute:10,pairingPerMinute:5,concurrentTasks:10};var Eo=class{buckets=new Map;sweptAt;startedAt;requests=0;rejections=0;constructor(e=Date.now()){this.startedAt=this.sweptAt=e}consume(e,t,n){if(n-this.sweptAt>=6e4){for(let[e,t]of this.buckets)n-t.at>=6e4&&this.buckets.delete(e);this.sweptAt=n}let r=this.buckets.get(e),i=r?Math.min(t,r.tokens+Math.max(0,n-r.at)*t/6e4):t,a=i<1;if(this.buckets.set(e,{tokens:a?i:i-1,at:n}),!a)return;this.rejections++;let o=Math.max(1,Math.ceil((1-i)*60/t));return S({error:`Too many requests. Try again in ${o} seconds.`},429,{"retry-after":String(o)})}};const Do=[[e=>e===`/admin/runners/pair`,`pairing`],[e=>e===`/runners/register`,`register`],[e=>e.startsWith(`/admin/`)||e.startsWith(`/runners/`)],[e=>e.startsWith(`/api/auth`)||e===`/login`||e===`/dash/token`,`auth`]];async function Oo(e,t,n){let r=new URL(e.url).pathname,i=Do.find(([e])=>e(r));if(!i)return{};let a=r.startsWith(`/admin/`)?await Ji(e,t):void 0;return ko(t,r===`/runners/register`?await Xi(e,t):a&&!(a instanceof Response)?a.session?`user:${a.session.user.id}`:`admin`:void 0,n,i[1])??{scope:a}}function ko(e,t,n,r){let i=e.limits??=new Eo((e.now??Date.now)()),a={...To,...e.config.limits},o=(e.now??Date.now)(),s=t??`ip:${n}`,c=i.consume(s,t?a.principalPerMinute:a.ipPerMinute,o);return c||!r?c:r===`pairing`?i.consume(`pair:${s}`,a.pairingPerMinute,o):i.consume(`${r}:ip:${n}`,r===`auth`?a.authPerMinute:a.registerPerMinute,o)}function Ao(e,t,n){let r;return Promise.race([e,new Promise((e,i)=>{r=setTimeout(()=>i(Error(`${n} timed out`)),t),r.unref?.()})]).finally(()=>clearTimeout(r))}async function jo(e,t,n){try{await Ao(e.stop(t),1e4,`runner stop`)}catch(e){console.error(`coder server: runner stop ${n} failed`,e)}}async function Mo(e,t,n,r={}){try{await Ao(Ei(e,t),1e4,`runner logs`)}catch(e){console.error(`coder server: runner logs ${t.task.id} failed`,e)}return e.queue.finish(e.organizationId,t.task.id,{status:`failed`,error:n},(e.now??Date.now)(),{attempts:t.attempts,tokenHash:t.tokenHash??null,generation:t.generation??0,...r})}async function No(e,t,n){if(e.local&&t.handle?.startsWith(`cli:`))return Vc(e,t,n);let r={handle:t.handle??null,lastSeenAt:t.lastSeenAt??null,updatedAt:t.updatedAt};if(!t.handle)return n-(t.lastSeenAt??t.startedAt??t.updatedAt)<(e.config.taskStallMs??3e5)?!1:t.attempts>=(e.config.taskAttempts??2)?Mo(e,t,`runner start was interrupted`,r):e.queue.requeue(e.organizationId,t.task.id,n,{generation:t.generation??0,attempts:t.attempts,tokenHash:t.tokenHash??null,...r});let i=await Qn(e,t.task);if(t.startedAt!==void 0&&n-t.startedAt>=e.config.taskTimeoutMs)return i&&await jo(i,t.handle,t.task.id),Mo(e,t,`timeout`);if(!i||n-(t.lastSeenAt??t.startedAt??t.updatedAt)<(e.config.taskStallMs??3e5))return!1;let a=await Ao(i.status(t.handle),1e4,`runner status`);return a.state===`exited`&&Mo(e,t,`runner exited${a.code===void 0?``:` with code ${a.code}`}`,{handle:t.handle,lastSeenAt:t.lastSeenAt??null})}async function Po(e,t,n){let r=e.now??Date.now,i=e.config.limits?.concurrentTasks??To.concurrentTasks,a=e.config.store===`postgres`?e.config.maxTasks:Math.min(i,e.config.maxTasks??i);if(t){let t=await e.queue.running(),n=0;for(let i of t)await No(M(e,i.organizationId),i.status,r()).catch(()=>!1)&&n++;if(a!==void 0&&t.length-n>=a)return}let o=[];for(;;){let t=e.local?Lc(e.local.cwd,!1).filter(e=>e.status===`running`||e.status===`waiting`):[],s=t.length?new Set((await e.queue.running()).flatMap(e=>[e.status.task.id,...e.status.handle?.startsWith(`cli:`)?[e.status.handle.slice(4)]:[]])):new Set,c=t.filter(t=>!s.has(t.task.id)&&!s.has(x(t.task.cwd??e.local.cwd,t.task.id)?.flowRunId??``)).length,l=a===void 0?void 0:a-c;if(l!==void 0&&l<=0)break;let u=await e.queue.claim(r(),l,n,i);if(n=!1,!u)break;let d=M(e,u.organizationId),f=u.status;if(await Bc(d,f)){if(n=u.more,!u.more)break;continue}let p=await Qn(d,f.task);if(!p){await Mo(d,f,`No runner available: ${f.task.runner}`);continue}let m=f,h={generation:f.generation??0,attempts:f.attempts,tokenHash:f.tokenHash??null,statuses:[`running`,`waiting`]},g;try{let e=p.start(f.task,{CODER_SERVER:d.local&&p.kind===`local`?`http://localhost:${d.local.port}`:d.config.publicUrl??``,CODER_TASK_TOKEN:u.token,CODER_INBOX_MODE:p.push?`push`:`poll`},p.kind===`vercel-sandbox`?(await Pc(d,f.task)).env:void 0);if(g=await Ao(e,3e4,`runner start`).catch(t=>{throw e.then(e=>jo(p,e,f.task.id),()=>{}),t}),await d.queue.patchTask(u.organizationId,f.task.id,{handle:g},r(),h)||await jo(p,g,f.task.id),n=u.more,!u.more)break}catch(e){g!==void 0&&await jo(p,g,f.task.id);let t=e instanceof Error?e.message:String(e);if(f.attempts<(d.config.taskAttempts??2)){o.push({...u,status:m});continue}await Mo(d,m,t)}}for(let t of o)await M(e,t.organizationId).queue.requeue(t.organizationId,t.status.task.id,r(),{attempts:t.status.attempts,tokenHash:t.status.tokenHash})}function Fo(e,t=!1,n=!1,r=!1){let i=e.queue.scheduler??={},a=t?i.waiting:void 0;if(a)return a;let o=i.running??Promise.resolve(),s=()=>(i.waiting===c&&delete i.waiting,Po(e,n,r)),c=o.then(s,s);return i.waiting=c,i.running=c.catch(()=>{}),c}function Io(e,t=!1){let n=Fo(e,!0,!1,t).catch(()=>{});e.waitUntil&&e.waitUntil(n)}function Lo(e,t){return Jt(e,`link-start`,`*`,JSON.stringify(t),3e5)}const Ro=6e4,zo=864e5,Bo=262144,Vo=[`model`,`engine`,`effort`],Ho=[`Usage:`,"• `/setup model <name>`. Sets the engine model. Also accepts `engine` and `effort`.","• `/setup show`. Shows the current settings."].join(`
|
|
5
|
-
`);function Uo(e){return e.type===`command`}function Wo(e){let t=Object.entries(e??{}).filter(([,e])=>e);return t.length?`Current settings:\n${t.map(([e,t])=>`• ${e}: \`${t}\``).join(`
|
|
6
|
-
`)}`:`No settings yet. A workspace admin can configure this agent in the dashboard.`}function Go(e){let[t=``,...n]=e.text.trim().split(/\s+/);return Vo.includes(t)&&n.join(` `).trim()!==``}async function Ko(e,t,n){let[r=``,...i]=e.text.trim().split(/\s+/),a=i.join(` `).trim(),o={...t.settings},s;return r?r===`show`?s=Wo(t.settings):Vo.includes(r)?a?(o[r]=a,s=`${r} set to \`${a}\`.`):s=`Give a value: \`/setup ${r} <name>\`.`:s=`Unknown setting \`${r}\`.\n${Ho}`:s=Ho,JSON.stringify(o)!==JSON.stringify(t.settings??{})&&await wl(n,`installation`,t.id,{settings:o}),s}async function qo(e,t,n){let r=`${t.id}:${n.installationId}`,i=e.boundInstallation?.installation.id===r?e.boundInstallation.installation:await e.store.get(`installation`,r);return i&&!i.deletedAt?i:void 0}async function Jo(e,t,n){let r=await e.auth.linkedUser(t.id,n.actor.id).catch(()=>void 0);return r?.organizations?.includes(e.organizationId)?r:void 0}async function Yo(e,t,n,r,i,a,o=!1){let s=e.config.publicUrl?.replace(/\/$/,``),c=kt(),l=o||await e.store.create(`delivery`,`link:${t.id}:${r.actor.id}`,{at:a,owner:c},{ttlMs:864e5});if(!s||!l)return;let u=e=>`Link your Coder account so I can work for you here: ${e}`;try{if(t.auth.user){await i.post(u(`${s}/connect/${t.id}?installation=${encodeURIComponent(n.id)}`));return}let a=await Lo(e,{platform:t.id,platformUserId:r.actor.id});await i.whisper(u(`${s}/connect?token=${encodeURIComponent(a)}`))}catch(n){throw o||await e.store.updateDelivery(`link:${t.id}:${r.actor.id}`,c,void 0).catch(()=>{}),n}}function Xo(e,t){return Object.fromEntries(Object.entries(e).filter(([e])=>e in t.definition.integrations))}async function Zo(e,t,n){let r={};n.repo?r[n.integration]={repo:{owner:n.repo.owner,name:n.repo.name}}:n.chat&&(r[n.integration]={thread:n.chat.thread.id});for(let[n,i]of Object.entries(t.connections??{})){if(i.kind!==`installation`)continue;let t=(await e.store.get(`installation`,i.id))?.settings?.configRepo,a=t&&/^([^/]+)\/([^/]+)$/.exec(t);a&&(r[n]={repo:{owner:a[1],name:a[2]}})}return r}function Qo(e,t){return`<!-- coder:setup -->\nCoder is installed, but no engine is connected. [Connect ${t}](${Wa(e,t)}).`}async function $o(e,t,n,r){let i=Q({agent:n,requester:r,event:t}),a=await ts(e,i)??await e.store.get(`snapshot`,`session:${i}`);if(!a||a.requester!==r||!t.actor.id||a.actor!==t.actor.id)return;let o=await e.store.get(`task`,a.id);if(o&&[`queued`,`running`,`waiting`].includes(o.status)&&Q(o.task)===i)return o.task.id;let s=x(e.local.cwd,a.id);if(!s){let t=(await e.store.list(`delivery`,{prefix:`delivery:`})).find(e=>e.value.session?.key===i&&e.value.session.id===a.id)?.value.pending;if(!t?.task||t.taskId!==a.id||Q(t.task)!==i)return;await Gc(e,t.task,t.taskId),s=x(e.local.cwd,a.id)}if(!s||s.agentId!==n)return;let c=p(e.local.cwd,s);return c.status===`running`||c.status===`queued`?c.id:void 0}async function es(e,t,n,r,i,a,o){let s=`delivery:${t.id}:${n.id}:${i.installationId}:${i.chat?.thread.id??``}:${i.deliveryId}`,c=await qo(e,n,i);if(!c||e.local&&await e.store.get(`delivery`,s).then(e=>e&&!e.pending))return{};if(!e.local)return rs(e,t,n,r,i,c,a,o,s);let l=JSON.stringify([i.appId,i.installationId,i.chat?.thread.id]),u=e.store.handoffs??=new Map,d=(u.get(l)??Promise.resolve()).catch(()=>{}).then(async()=>{let l=await rs(e,t,n,r,i,c,a,o,s);return await l.work,l});u.set(l,d);try{return await d}finally{u.get(l)===d&&u.delete(l)}}async function ts(e,t){let n=await e.store.list(`delivery`,{prefix:`delivery:`}),r=await e.store.get(`snapshot`,`session:${t}`);return[...n.map(e=>e.value.session),r&&{...r,key:t}].filter(e=>e?.key===t).sort((e,t)=>(t.version??0)-(e.version??0))[0]}async function ns(e,t,n,r,i,a,o=!1){let s=kt(),c={event:n,...a?{task:a,taskId:a.flow==="default"?l():Ie()}:{}},u;if(e.local&&!n.repo){let n=await e.store.get(`delivery`,t);if(n&&!n.pending)return{};if(c=n?.pending??c,c.task&&!c.taskId)throw Error(`Local delivery has no task binding`);if(u=n?.session,!u&&o&&c.task){let t=Q(c.task);u={key:t,id:c.taskId,version:((await ts(e,t))?.version??0)+1,requester:c.task.requester,actor:c.task.event.actor.id}}await e.store.put(`delivery`,t,{at:r(),owner:s,pending:c,...u?{session:u}:{}})}else if(!await e.store.create(`delivery`,t,{at:r(),owner:s,pending:c},{ttlMs:Ro}))return{};return{work:(async()=>{let n=Promise.resolve(),a=e.local?void 0:setInterval(()=>{n=n.then(async()=>{await e.store.updateDelivery(t,s,{at:r(),owner:s,pending:c},{ttlMs:Ro})}).catch(()=>{})},Ro/3);try{await i(c),a&&clearInterval(a),await n,await e.store.updateDelivery(t,s,{at:r(),...u?{session:u}:{}},{ttlMs:zo})}catch(r){throw a&&clearInterval(a),await n,(!e.local||!c.task)&&await e.store.updateDelivery(t,s,void 0).catch(()=>{}),r}})()}}async function rs(e,t,n,r,i,a,o,s,c){let l=t=>ns(e,c,i,o,t);if(Uo(i))return e.auth&&Go(i)&&!await Jo(e,t,i)?l(()=>Yo(e,t,a,i,s,o(),!0)):l(()=>Ko(i,a,e.store).then(e=>s.whisper(e)).then(()=>{}));let u=await Tc(e,t,a,r,Dc(i.repo,t.tools.presets.observe)),d=await jc(e,a,i,u),[f,p]=await Promise.all([e.loadAgent(n,a,i,d),e.auth&&i.actor.id?Jo(e,t,i):void 0]);if(!p&&e.auth&&i.actor.id&&t.events[i.type]?.addressed)return l(()=>Yo(e,t,a,i,s,o()));let m=p?.id,h=Ke(i,f);if(!h)return{};let g=i.chat&&h.flow==="default"&&t.events[i.type]?.steers,_=t=>ns(e,c,i,o,async t=>{let n=t.task,r=await Gc(e,n,t.taskId);if(g){let i=await ts(e,Q(n));i&&i.id===t.taskId&&await e.store.put(`snapshot`,`session:${i.key}`,{...i,id:r.task.id})}},t,!!g);if(e.local&&!i.repo){let t=await e.store.get(`delivery`,c);if(t?.pending?.task){let e=t.pending.task;return Q(e)!==Q({agent:f.id,requester:m,event:i})||e.flow!==h.flow?{}:_(e)}}let v=e.local&&!i.repo&&g?await $o(e,i,f.id,m):void 0;if(v){let t=await e.store.get(`task`,v),n=x(e.local.cwd,v);return!n||t?.status===`queued`?l(async()=>{t&&await hl(e,v,`steer`,{text:i.text},t.generation??0)}):n.threadId?l(()=>Pe(e.local.cwd,n,i.text).then(()=>{})):l(async()=>{re(e.local.cwd,v,i.text)})}let y=ye(f),ee=Xo(d,f),[b,te,ne,ie]=await Promise.all([Xn(e,{requester:m,agent:f.definition.runner}),Ta(e.store,y.engine,m),Zo(e,a,i),pn(e,t,a,i,ee,f,t.events[i.type]?.addressed&&t.history!==!1?s.recent:void 0,p??null)]);if(!te&&b.runner!==`http`&&!await sl(e,y.engine??`claude`))return(!e.local||i.repo)&&g&&(await e.queue.deliver(e.organizationId,{id:`${i.deliveryId}-${f.id}`,source:i.integration,agent:f.id,flow:h.flow,...b,event:i,requester:m,definition:f.definition,tools:{}},o(),{key:c,ttlMs:864e5},!0,void 0,!1)).steered?{}:l(()=>s.post(Qo(e,y.engine??`claude`)).then(()=>{}));let ae=new Set(t.tools.presets.observe),oe=h.tools[i.integration]??[];p&&t.auth.canWrite&&oe.some(e=>!ae.has(e))&&!await t.auth.canWrite(i,u)&&(h.tools[i.integration]=oe.filter(e=>ae.has(e)));let se=Object.fromEntries(Object.entries(h.tools).filter(([e])=>e in ee).map(([t,n])=>{if(ne[t])return[t,n];if(t!==i.integration)return[t,[]];let r=new Set(e.integrations[t]?.tools.presets.observe??[]);return[t,n.filter(e=>r.has(e))]}).filter(([,e])=>e.length));if(Buffer.byteLength(JSON.stringify(i))>Bo)throw Error(`Event exceeds 256 KB`);if(Buffer.byteLength(JSON.stringify(ie))>Bo)throw Error(`Task context exceeds 256 KB`);let ce={id:`${i.deliveryId}-${f.id}`,source:i.integration,agent:f.id,flow:h.flow,...b,permissions:h.permissions??y.permissions,event:i,author:t.author?.(n.name)??n.name,definition:f.definition,...te?{credential:te.id}:{},...m?{requester:m}:{},...f.files?{files:f.files}:{},...f.usage?{usage:f.usage}:{},tools:se,...Object.keys(ne).length?{toolScopes:ne}:{},...Object.keys(ie).length?{context:ie}:{}};return e.local&&!i.repo&&b.runner===`local`&&!b.runnerId?_(ce):e.queue.deliver(e.organizationId,ce,o(),{key:c,ttlMs:zo},!!g,e.config.maxQueued??1e3)}var is=e({addressedTo:()=>fs,chatFor:()=>vs,deliver:()=>ms,eventReplies:()=>gs,later:()=>ps,renewInstallation:()=>ys,renewInstallations:()=>bs,threadReplies:()=>hs});async function as(e,t,n,r,i){let a=`${t.id}:${r}`,o=await gn(e,a),s=o?.boundInstallation?.installation.id===a?o.boundInstallation.installation:await o?.store.get(`installation`,a);if(!o||!s||s.deletedAt)throw Error(`${t.integration} installation ${r} is not bound to this server`);return Tc(o,e.integrations[t.integration],s,n,i)}function os(e){if(e._type===`chat:Thread`)return{...e,currentMessage:void 0};let{raw:t,replyTo:n,...r}=e;return{...r,raw:null,id:r.id.startsWith(`ephemeral:`)?``:r.id}}const ss=e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),cs=(e,t)=>Object.keys(e.events).find(n=>e.events[n].on===t),ls=`(?![\\w-]|\\.\\w)`,us=e=>e.replace(/[ \t]{2,}/g,` `).trim();function ds(e,t){let n=t.reduce((e,t)=>e.replace(RegExp(`(^|[^\\w-])@${ss(t)}${ls}`,`gi`),`$1`),e);return n===e?void 0:us(n)}function fs(e,t){let n=ds(e,[t]);if(n!==void 0)return n;let r=RegExp(`^\\s*${ss(t)}${ls}[\\s,:;!.?-]*`,`i`);return r.test(e)?us(e.replace(r,``)):void 0}function ps(e,t,n,r){let i=r.catch(e=>console.error(`coder server: dispatch failed for ${t.id} event ${n.deliveryId}`,e));e.waitUntil&&e.waitUntil(i)}async function ms(e,t,n,r,i,a){let o=await gn(e,`${n.id}:${i.installationId}`);if(!o||!n.builtin&&o.organizationId!==e.organizationId)return;let s=await es(o,t,n,r,i,e.now??Date.now,a);return await s.work,s.taskId&&await Fo(o,!0,!1,!0),s.taskId}function hs(e,t,n){return{post:t=>n&&e.adapter.reply?e.reply(n,t):e.post(t),whisper:n=>t?e.postEphemeral(t,n,{fallbackToDM:!1}):Promise.resolve(null),async recent(){let t=[],n=0;for await(let r of e.allMessages)if(t.push({user:r.author.userName||r.author.userId,text:r.text,ts:r.metadata.dateSent.toISOString()}),t.length>10&&t.shift(),++n===1e3)break;return t}}}async function gs(e,t,n){if(!n.chat)return{post:async()=>{},whisper:async()=>{}};let r=await vs(e,t,{id:n.installationId,...n.repo?{repo:n.repo}:{}});return await r.initialize(),hs(r.thread(n.chat.thread.id),n.actor.id||void 0,n.chat.message?.id||void 0)}function _s(e,t,n,r,i,a,o=a.id){let s=r===`message`&&t.agent===`coder`?fs(a.text,Se):void 0;if(r===`message`&&t.agent===`coder`&&s===void 0)return;let c=cs(e,s===void 0?r:`mention`);if(!c||a.author.isBot===!0)return;let l=e.event?e.event(c,i,a,t):{};if(!l)return;let u=(l.type??c)===cs(e,`mention`)?s??ds(a.text,[t.name,...n.self?[n.self]:[]])??a.text:a.text;return{integration:e.id,type:c,appId:t.id,installationId:n.id,deliveryId:Dt(`sha256`).update(`${t.id}\n${n.id}\n${i.id}\n${o}`).digest(`base64url`).slice(0,22),actor:{id:a.author.userId,...a.author.userName?{login:a.author.userName}:{}},text:u,chat:{thread:os(i.toJSON()),message:os(a.toJSON())},...n.repo?{repo:n.repo}:{},...l}}async function vs(e,t,n){let r=e.integrations[t.integration];if(!r)throw Error(`Unknown integration "${t.integration}"`);let i=P(e.config,t.credentials),a=await r.adapter({fetch:e.fetch??fetch,appId:t.id.slice(r.id.length+1),name:t.name,credentials:i,...n?{installationId:n.id,...n.self?{self:n.self}:{}}:{},token:(r,a)=>as(e,t,i,r,{...n?.repo?{repo:{owner:n.repo.owner,name:n.repo.name}}:{},...a}),isBound:async n=>{let r=`${t.id}:${n}`,i=await gn(e,r),a=i?.boundInstallation?.installation.id===r?i.boundInstallation.installation:await i?.store.get(`installation`,r);return!!(a&&!a.deletedAt&&(t.builtin||i?.organizationId===e.organizationId))}}),o=lt(e.chatState??new ut,t.id),s=new Ut({userName:t.name,adapters:{[r.id]:a},state:{...o,isSubscribed:async()=>!1},concurrency:`concurrent`,dedupeTtlMs:zo,logger:`error`});if(!n)return s;let c=async(a,o,s,c)=>{let l=_s(r,t,n,a,o,s,c);l&&ps(e,t,l,ms(e,r,t,i,l,hs(o,s.author,s)))};return s.onNewMention((e,t)=>c(`mention`,e,t)),s.onNewMessage(/[\s\S]*/,(e,t)=>c(`message`,e,t)),s.onReaction(async e=>{if(!e.added)return;let t=r.reactionId?.(e);if(!t)return;let n=new Wt({id:e.messageId,threadId:e.threadId,text:e.message?.text??``,formatted:e.message?.formatted??{type:`root`,children:[]},raw:e.raw,author:e.user,metadata:e.message?.metadata??{dateSent:new Date,edited:!1},attachments:[]});await c(`reaction`,e.thread,n,`reaction\n${t}\n${e.user.userId}\n${e.rawEmoji}`)}),s.onSlashCommand(`/setup`,async a=>{let o=cs(r,`command`);if(!o)return;let s=e=>a.channel.postEphemeral(a.user,e,{fallbackToDM:!1}),c={integration:r.id,type:o,appId:t.id,installationId:n.id,deliveryId:Dt(`sha256`).update(`${t.id}\n${n.id}\n${a.channel.id}\n${a.triggerId??a.text}`).digest(`base64url`).slice(0,22),actor:{id:a.user.userId,...a.user.userName?{login:a.user.userName}:{}},text:a.text.trim()};ps(e,t,c,ms(e,r,t,i,c,{post:s,whisper:s}))}),s}async function ys(e,t,n,r=`renew`){let i=e.integrations[t.integration];if(!i?.[r])return;let a=[],o=await vs({...e,waitUntil:t=>{a.push(t),e.waitUntil?.(t)}},t,{id:n});for(await o.initialize(),await i[r](o.getAdapter(i.id));a.length;)await Promise.all(a.splice(0))}async function bs(e,t=`renew`){for(let n of Object.values(e.integrations))if(n[t])for(let{key:r,organizationId:i}of await e.installations?.(n.id)??[]){let n=await M(e,i).store.get(`installation`,r),a=n&&await hn(e,n.app);a&&await ys(a.ctx,a.app,r.slice(a.app.id.length+1),t).catch(()=>{})}}const xs=`.coder/agents`;function Ss(e){return e.repo?`${e.repo.owner}/${e.repo.name}`:void 0}async function Cs(e,t,n,r){let i=await e.repos.readFile(t,`.coder/config.json`,n,r);return i===void 0?void 0:JSON.parse(i).agents}async function ws(e,t,n,r,i={}){for(let t of Object.values(e))if(!(!r.repo&&t.id===r.integration||!t.repos||!i[t.id]))return{contents:t,token:i[t.id]};let[a,o]=n.split(`/`);for(let{value:r}of await t.store.list(`app`)){if(r.agentsRepo!==n)continue;let i=e[r.integration];if(!i?.repos)continue;let s=(await t.store.list(`installation`,{prefix:`${r.id}:`})).find(e=>!e.value.deletedAt)?.value;if(s)try{let e=s.token?{...s,token:P(t.config,s.token)}:s;return{contents:i,token:await i.auth.token(e,P(t.config,r.credentials),{...a&&o?{repo:{owner:a,name:o}}:{},tools:i.tools.presets.observe}),app:r,installation:s}}catch{continue}}}function Ts(e,t){let n=t.cwd??E.cwd(),r=t.now??Date.now,i=new Map;async function a(t,n,r){let i=Te(e),a=i&&r[i.id];if(!i?.repos||!a)return;let o=Ss(n);if(n.integration===i.id&&o)return Cs(i,o,a,n.repo?.ref);let s=t.settings?.configRepo;if(s)return Cs(i,s,a)}function o(e,t,n,o){let s=`${e.id}@${Ss(n)??t.settings?.configRepo??``}@${n.repo?.ref??``}`,c=r();for(let[e,t]of i)c-t.at>=6e4&&i.delete(e);let l=i.get(s);return l||(l={at:c,usage:a(t,n,o)},i.set(s,l)),l.usage}async function s(n,i,a,s){let c=await L(t.store,n.agent);c.record&&await br(t.store,r(),n.agent,c)&&(c=await L(t.store,n.agent));let{record:l,version:u}=c;if(!l)return;if(!u)throw Error(`No version ${l.currentVersion} for agent "${l.id}".`);let d=await o(n,i,a,s),f=d&&typeof d==`object`?d[n.agent]:void 0;if(f===!1)throw Error(`Agent "${n.agent}" is disabled in ${Ss(a)??i.settings?.configRepo??n.agentsRepo}.`);return vr(l,u,f&&typeof f==`object`?f:void 0,e)}return async(i,a,o,c)=>{let l=(await he(n,e)).find(e=>e.id===i.agent&&!e.builtin);if(l)return l;let u=await s(i,a,o,c);if(u)return u;if(i.agentsRepo){let n=await ws(e,t,i.agentsRepo,o,c);if(n){await Ds(t.store,n.contents,i.agentsRepo,Ss(o)===i.agentsRepo?o.repo?.ref??`HEAD`:`HEAD`,n.token,r());let e=await s(i,a,o,c);if(e)return e;throw Error(`No agent "${i.agent}" in ${i.agentsRepo}.`)}}if(await br(t.store,r(),i.agent,{})){let e=await s(i,a,o,c);if(e)return e}throw Error(i.agentsRepo?`No agent named "${i.agent}".`:`No built-in agent "${i.agent}".`)}}async function Es(e,t,n,r,i,a=``,o,s=0){let c={},l=o??await e.repos.listDir(t,a?`${n}/${a}`:n,r,i);for(let o of l){let u=a?`${a}/${o}`:o;if(u===`agent.json`||u===`system.md`)continue;let d=await e.repos.readFile(t,`${n}/${u}`,r,i);if(d!==void 0)c[u]=d;else if(s<20){let a=await e.repos.listDir(t,`${n}/${u}`,r,i);a.length&&!Nt(a,l)&&Object.assign(c,await Es(e,t,n,r,i,u,a,s+1))}}return c}async function Ds(e,t,n,r,i,a,o={}){let s=o.path??`.coder/agents`,c=/^[0-9a-f]{40}$/i.test(r)?r:await t.repos.commit(n,r,i)??r,l={repo:n,ref:o.branch??r,commit:c};r=c;let u=o.slugs??await t.repos.listDir(n,s,i,r);be(u);let d=[];for(let o of u){let u=`${s}/${o}`,f=await t.repos.readFile(n,`${u}/agent.json`,i,r);if(f===void 0)continue;let p=JSON.parse(f),[m]=ve({definitions:{[o]:{json:p,builtin:!1}},usage:void 0},{...De,[t.id]:t});m&&d.push(await pr(e,{id:o,name:m.name,description:m.definition.description,source:`repo`,repo:n,path:u,definition:m.definition,systemPrompt:await t.repos.readFile(n,`${u}/system.md`,i,r)??``,files:await Es(t,n,u,i,r),commit:c,origin:l,importedFrom:`repo:${n}@${l.ref}`},a))}return d}async function Os(e,t){let n=e.config.publicUrl;if(!n||!t.length)return;let r=new Map(t.map(e=>[e.agent,e])),i=await e.store.list(`app`),a=(await Promise.all(i.filter(({value:e})=>r.has(e.agent)).map(async({id:t})=>e.store.withAppLock(t,async i=>{let a=await i.get(`app`,t);if(!a||!r.has(a.agent))return;let o=await ur(i,a.agent)??r.get(a.agent),s=e.integrations[a.integration]?.app.update;if(!s||!o.definition.integrations[a.integration])return;let c=`app-sync:${t}`,l=await i.get(`delivery`,c);if(l&&!l.pending&&l.version>=o.version&&Nt(l.definition,o.definition)||l&&l.version>o.version)return;let u={version:o.version,definition:o.definition,pending:!0};await i.put(`delivery`,c,u);try{let t=await s(a,P(e.config,a.credentials),{publicUrl:n,definition:o.definition,fetch:e.fetch??fetch,saveCredentials:async t=>{await i.put(`app`,a.id,{...a,credentials:N(e.config,t)})}});t&&await i.put(`app`,a.id,{...a,credentials:N(e.config,t)}),await i.put(`delivery`,c,{...u,pending:!1})}catch(e){let t=`Could not sync ${a.integration} app ${a.id}. ${e instanceof Error?e.message:String(e)}`;return await i.put(`delivery`,c,{...u,error:t}),t}})))).filter(Boolean);if(a.length)throw Error(a.join(`
|
|
7
|
-
`))}function ks(){return{integration:`source`,type:`import`,appId:``,installationId:``,deliveryId:``,actor:{id:`admin`},text:``}}async function As(e,t,n,r=ks(),i){let a=await ws(e.integrations,{config:e.config,store:e.store},t,r);if(!a)return;let o=await Ds(e.store,a.contents,t,n,a.token,(e.now??Date.now)(),i?{branch:i}:{});return await Os(e,o),o}const js=/^[a-z0-9][a-z0-9_-]*$/i;async function Ms(e,t){let n=ke(Ae(),`builtin`).map(({name:e})=>({name:e,scope:`builtin`}));if(!t)return S(n);try{let{integration:r,token:i}=await bo(e,t),a=(r.repos?await r.repos.listDir(t,`.coder/flows`,i):[]).map(e=>e.replace(/\.(ts|mjs|js)$/,``)).filter(e=>js.test(e));return S([...a.map(e=>({name:e,scope:`workspace`})),...n.filter(e=>!a.includes(e.name))])}catch(e){return W(e)}}async function Ns(e,t){if(!t)throw new U(`repo is required`);let{integration:n,token:r}=await bo(e,t);return S(await n.repos?.pullRequests(t,r)??[])}async function Ps(e,t){try{return S(Ws(await So(e,`dashboard`,t)),201)}catch(e){return W(e)}}async function Fs(e,t,n,r){try{return Ms(t,r.searchParams.get(`repo`))}catch(e){return e instanceof G?S({error:e.message},400):W(e)}}async function Is(e,t,n,r){try{return await Ns(t,r.searchParams.get(`repo`))}catch(e){return e instanceof G?S({error:e.message},400):W(e)}}async function Ls(e,t,n,r){let i=n.name;try{return Ps(t,{...await yc(e),flow:i})}catch(e){return e instanceof G?S({error:e.message},400):W(e)}}async function Rs(e,t,n,r){try{{let{post:n,...r}=await yc(e);if(!r.repo||!r.pr)throw new U(`repo and pr are required`);return Ps(t,{...r,flow:`review`,args:{post:n===!0}})}}catch(e){return e instanceof G?S({error:e.message},400):W(e)}}function zs(e,t,n){return(e.waitUntil??(e=>void e.catch(()=>{})))(t),Promise.resolve(S({tasks:n},202))}async function Bs(e,t,n,r,i,a){if(`installation`in i){let t=await gn(e,i.installation.installation.id),n=await t?.store.get(`installation`,i.installation.installation.id);return!t||!n||await wl(t.store,`installation`,n.id,{account:i.installation.installation.account,deletedAt:i.installation.op===`delete`?a:void 0}),S({ok:!0})}if(`changes`in i){let r=i.changes;try{n.branch||await wl(e.store,`app`,n.id,{branch:r.branch});let i=await As(e,r.repo,r.ref,{...ks(),integration:t.id,appId:n.id},r.branch);return i?S({imported:i.map(e=>e.agent)}):S({error:`No installed app can read ${r.repo}`},400)}catch(e){return S({error:e instanceof Error?e.message:String(e)},400)}}for(let a of i.events)ps(e,n,a,gs(e,n,a).then(i=>ms(e,t,n,r,a,i)));return S({accepted:i.events.length},202)}async function Vs(e,t,n){let r=t.integrations[n],i=await e.text(),a=r.target(e,i);if(a instanceof Response)return a;if(!a)return new Response(`Not addressed to an app`,{status:400});let o=`${r.id}:${a.app}`,s=t.webhookTarget?await t.webhookTarget(o,a.installation?`${o}:${a.installation}`:void 0):void 0,c=t.webhookTarget?s&&{ctx:{...M(t,s.organizationId),...s.bound?{boundInstallation:s.bound}:{}},app:s.app}:await hn(t,o);if(!c)return new Response(`Unknown app`,{status:404});let{ctx:l,app:u}=c,d=P(l.config,u.credentials),f=r.ownEvents?.(e,i,u,d);if(f&&`invalid`in f)return new Response(`Invalid signature`,{status:401});if(f)return Bs(l,r,u,d,f,(l.now??Date.now)());let p=(await vs(l,u,a.installation?{...a,id:a.installation}:void 0)).webhooks[r.id];return p(new Request(e.url,{method:`POST`,headers:e.headers,body:i}),{deduplicate:!1,waitUntil:e=>{let t=e.catch(e=>console.error(`coder server: webhook work failed for ${u.id}`,e));l.waitUntil&&l.waitUntil(t)}})}const Hs=new Set([`completed`,`failed`,`cancelled`]);function W(e){if(e instanceof U)return S({error:e.message,...e.fix?{fix:e.fix}:{}},e.status);throw e}function Us(e){let{id:t,name:n,source:r,agent:i,flow:a,event:o,prompt:s,cwd:c}=e.task;return{task:{id:t,...n?{name:n}:{},source:r,agent:i,flow:a,...c?{cwd:c}:{},...s?{prompt:s}:{},...o?{event:{integration:o.integration,type:o.type,text:o.text}}:{}},status:e.status,...e.status===`queued`?{statusReason:`Waiting for a task slot`}:{},attempts:e.attempts,createdAt:e.createdAt,startedAt:e.startedAt,finishedAt:e.finishedAt}}function Ws(e){let{tokenHash:t,handle:n,...r}=e;return{...r,...e.status===`queued`?{statusReason:`Waiting for a task slot`}:{},turns:Co(e),...e.task.credential?{credential:H(e.task.credential).label}:{}}}async function Gs(e,t,n,r){let i=n.id,a=Number(r.searchParams.get(`after`)??-1),o=Number.isFinite(a)?a:-1,s=r.searchParams.has(`limit`)?C(r,500,2e3):void 0,c=z(t.store,i,o,s??500);c?.catch(()=>{});let l=await t.store.get(`task`,i);if(!l||t.local&&l.handle?.startsWith(`cli:`)&&l.task.flow==="default"){let e=l?.task.cwd??t.local?.cwd;if(!e)return S({error:`No task "${i}"`},404);let n=J(e,i,!0);return n?S({...n,...l?.answer?{answer:l.answer}:{},logs:qc(e,i,-1,s??500)}):S({error:`No task "${i}"`},404)}let u=l.task.runner===`github-actions`&&l.handle?await Ei(t,l,o,s??500).catch(()=>c):await c;return S({...Ws(l),logs:u})}async function Ks(e,t,n,r){let i=n.id;Number(r.searchParams.get(`after`)??-1),r.searchParams.has(`limit`)&&C(r,500,2e3);let a=await t.store.get(`task`,i);if(!a||t.local&&a.handle?.startsWith(`cli:`)&&a.task.flow==="default"){let n=a?.task.cwd??t.local?.cwd;return n?Y(e,n,i,void 0,t):S({error:`No task "${i}"`},404)}if(t.local&&a.handle?.startsWith(`cli:`)){let e=(t.now??Date.now)();await t.queue.cancel(t.organizationId,i,e,{attempts:a.attempts,tokenHash:a.tokenHash,generation:a.generation??0});let n=await t.store.get(`task`,i);if(n&&Z.includes(n.status)){await Vc(t,n,e);let r=await t.store.get(`task`,i);if(r&&Z.includes(r.status))return S({error:`Task is still stopping. Try again.`},409)}}else if([`running`,`waiting`].includes(a.status)&&a.handle)try{let e=await Qn(t,a.task);if(!e)return S({error:`Task runner is unavailable. Try again.`},409);await e.stop(a.handle)}catch{return S({error:`Task is still stopping. Try again.`},409)}return await ml(t,a)?(t.local&&(await t.store.delete(`snapshot`,`local-start:${i}`),await t.store.delete(`snapshot`,`completion:${i}`)),Io(t,!0),S({ok:!0})):S({error:`Task changed while deleting. Try again.`},409)}async function qs(e,t,n,r){let i=n.id,a=Number(r.searchParams.get(`after`)??-1),o=Number.isFinite(a)?a:-1,s=r.searchParams.has(`limit`)?C(r,500,2e3):void 0,c=z(t.store,i,o,s??void 0);c?.catch(()=>{});let l=await t.store.get(`task`,i);if(!l||t.local&&l.handle?.startsWith(`cli:`)&&l.task.flow==="default"){let e=l?.task.cwd??t.local?.cwd;return!e||!J(e,i,!1)?S({error:`No task "${i}"`},404):S(qc(e,i,o,s))}return S(([`running`,`waiting`].includes(l.status)||l.task.runner===`github-actions`)&&l.handle?await Ei(t,l,o,s).catch(()=>z(t.store,i,o,s)):await c)}async function Js(e,t,n,r){let i=n.id;Number(r.searchParams.get(`after`)??-1),r.searchParams.has(`limit`)&&C(r,500,2e3);let a=await t.store.get(`task`,i);if(!a||t.local&&a.handle?.startsWith(`cli:`)&&a.task.flow==="default"){let n=a?.task.cwd??t.local?.cwd;return n?Y(e,n,i,`steer`,t):S({error:`No task "${i}"`},404)}if(a.task.flow!=="default")return S({error:`steer is available only for default-flow tasks`},409);if(![`queued`,`running`,`waiting`].includes(a.status))return S({error:`Task "${i}" is not active`},409);let o=await hl(t,i,`steer`,await e.json().catch(()=>void 0),a.generation??0);return o?S(o):S({error:`Task "${i}" is no longer active`},409)}async function Ys(e,t,n,r){let i=n.id;Number(r.searchParams.get(`after`)??-1),r.searchParams.has(`limit`)&&C(r,500,2e3);let a=await t.store.get(`task`,i);if(!a||t.local&&a.handle?.startsWith(`cli:`)&&a.task.flow==="default"){let n=a?.task.cwd??t.local?.cwd;return n?Y(e,n,i,`ask`,t):S({error:`No task "${i}"`},404)}if(a.task.flow!=="default")return S({error:`ask is available only for default-flow tasks`},409);if(![`queued`,`running`,`waiting`].includes(a.status))return S({error:`Task "${i}" is not active`},409);let o=await hl(t,i,`ask`,await e.json().catch(()=>void 0),a.generation??0);return o?S(o):S({error:`Task "${i}" is no longer active`},409)}async function Xs(e,t,n,r){let i=n.id;Number(r.searchParams.get(`after`)??-1),r.searchParams.has(`limit`)&&C(r,500,2e3);let a=await t.store.get(`task`,i);if(!a||t.local&&a.handle?.startsWith(`cli:`)&&a.task.flow==="default"){let n=a?.task.cwd??t.local?.cwd;return n?Y(e,n,i,`continue`,t):S({error:`No task "${i}"`},404)}if(a.task.flow!=="default")return S({error:`continue is available only for default-flow tasks`},409);if(!Hs.has(a.status))return S({error:`Task "${i}" is still active; steer or ask it instead`},409);let o=await e.json().catch(()=>({}));try{return S(Ws(await wo(t,a,String(o.text??``),o.outputSchema)))}catch(e){return W(e)}}async function Zs(e,t,n,r){let i=n.id;Number(r.searchParams.get(`after`)??-1),r.searchParams.has(`limit`)&&C(r,500,2e3);let a=await t.store.get(`task`,i);if(!a||t.local&&a.handle?.startsWith(`cli:`)&&a.task.flow==="default"){let n=a?.task.cwd??t.local?.cwd;return n?Y(e,n,i,`approve`,t):S({error:`No task "${i}"`},404)}if(a.task.flow!=="default")return S({error:`approve is available only for default-flow tasks`},409);if(![`queued`,`running`,`waiting`].includes(a.status))return S({error:`Task "${i}" is not active`},409);if(!a.approval)return S({error:`Task "${i}" has no pending approval`},409);let o=await hl(t,i,`approve`,await e.json().catch(()=>void 0),a.generation??0);return o?S(o):S({error:`Task "${i}" is no longer active`},409)}async function Qs(e,t,n,r){let i=n.id;Number(r.searchParams.get(`after`)??-1),r.searchParams.has(`limit`)&&C(r,500,2e3);let a=await t.store.get(`task`,i);if(!a||t.local&&a.handle?.startsWith(`cli:`)&&a.task.flow==="default"){let n=a?.task.cwd??t.local?.cwd;return n?Y(e,n,i,`cancel`,t):S({error:`No task "${i}"`},404)}let o=await t.queue.cancel(t.organizationId,i,(t.now??Date.now)(),{attempts:a.attempts,tokenHash:a.tokenHash??null,generation:a.generation??0});return o&&a.status!==`queued`&&await yl(t,i),o?S({ok:!0}):S({error:`No running or queued task "${i}"`},404)}async function $s(e,t,n,r){let i=n.id;Number(r.searchParams.get(`after`)??-1),r.searchParams.has(`limit`)&&C(r,500,2e3);let a=await t.store.get(`task`,i);if(!a||t.local&&a.handle?.startsWith(`cli:`)&&a.task.flow==="default"){let n=a?.task.cwd??t.local?.cwd;return n?Y(e,n,i,`archive`,t):S({error:`No task "${i}"`},404)}let o=(t.now??Date.now)();return await t.queue.patchTask(t.organizationId,i,{archivedAt:o},o),S({ok:!0})}async function ec(e,t){if(!e.agent||!e.event?.integration)return S({error:`agent and event are required`},400);let n=t.integrations[e.event.integration];if(!n)return S({error:`Unknown integration "${e.event.integration}"`},400);let r=e.event.actor?.id;if(t.auth&&r){let e=await t.auth.linkedUser(n.id,r);if(e&&e.id!==t.session?.user.id)return S({error:`The event's actor is linked to another member`},403)}let i=(await t.store.list(`app`)).map(e=>e.value).find(t=>t.agent===e.agent&&t.integration===n.id);if(!i)return S({error:`No ${n.id} app for agent "${e.agent}" on this server.`},404);let a=(await t.store.list(`installation`)).map(e=>e.value).filter(e=>e.app===i.id&&!e.deletedAt),o=a.find(t=>t.id===`${i.id}:${e.event.installationId}`)??a[0];if(!o)return S({error:`The ${n.id} app for "${e.agent}" is not installed anywhere yet`},404);let s=t.now??Date.now,c={...e.event,appId:i.id,installationId:o.id.slice(i.id.length+1),deliveryId:`admin-${s()}-${kt()}`},l=await es(t,n,i,P(t.config,i.credentials),c,s,await gs(t,i,c));return zs(t,l.work??Promise.resolve(),l.taskId?[l.taskId]:[])}const tc=new Set([`queued`,`running`,`waiting`,`completed`,`failed`,`cancelled`]);async function nc(e,t,n,r){let i=await e.json().catch(()=>void 0);if(!i||typeof i!=`object`)return S({error:`A JSON body is required`},400);try{if(mo(t,i),i.event)return ec(i,t);let e=(i.source===`cli`?void 0:await Rc(t,i))??await So(t,i.source===`cli`?`cli`:`dashboard`,i);return S(Ws(e),201)}catch(e){return W(e)}}async function rc(e,t,n,r){n.id;let i=r.searchParams.get(`status`);if(i&&i!==`active`&&!tc.has(i))return S({error:`Unknown status "${i}"`},400);let a=r.searchParams.get(`source`);if(a&&![`dashboard`,`cli`,`schedule`,...Object.keys(t.integrations)].includes(a))return S({error:`Unknown source "${a}"`},400);let o=r.searchParams.get(`agent`),s=r.searchParams.get(`q`)?.trim(),c={...o?{agent:o}:{},...a?{source:a}:{},...s?{q:s}:{},archived:r.searchParams.get(`archived`)===`1`},l=i===`active`?{statuses:Z}:i?{status:i}:{},u=e=>r.searchParams.get(`summary`)===`1`?e.map(Us):e.map(Ws);if(t.local){let e=new Map(Lc(t.local.cwd,c.archived).map(e=>[e.task.id,e]));for(let n of await t.queue.list(t.organizationId))e.set(n.task.id,n.status===`queued`||n.status===`waiting`?n:e.get(n.task.id)??n);let n=[...e.values()].filter(e=>cl(e,{...c,...l})).sort(ul),i=C(r,et(r)?void 0:20);if(!et(r))return S(u(n.slice(0,i)));let a=rt(r),o=n.filter(e=>fl(e,a)),s=ot(o.slice(0,i+1),i,dl);return S({...s,items:u(s.items),...r.searchParams.get(`counts`)===`1`?{counts:{all:n.length,active:n.filter(e=>Z.includes(e.status)).length,waiting:n.filter(e=>e.status===`waiting`).length}}:{}})}if(!et(r)){let e=C(r,20),n=await t.queue.list(t.organizationId,{...c,...l,limit:e,summary:r.searchParams.get(`summary`)===`1`});return S(u(n))}let d=C(r),f=rt(r),p=r.searchParams.get(`counts`)===`1`&&!i&&!f&&t.queue.listWithCounts?await t.queue.listWithCounts(t.organizationId,{...c,limit:d+1,summary:r.searchParams.get(`summary`)===`1`}):void 0,[m,h]=await Promise.all([p?p.items:t.queue.list(t.organizationId,{...c,...l,summary:r.searchParams.get(`summary`)===`1`,...f?{before:f}:{},limit:d+1}),p?p.counts:r.searchParams.get(`counts`)===`1`?t.queue.counts(t.organizationId,{...c,...l}):void 0]),g=ot(m,d,dl);return S({...g,items:u(g.items),...h?{counts:h}:{}})}var G=class extends Error{};const ic=async e=>await e.get(`config`,`workspace`)??{};async function ac(e,t){let{sealed:n,...r}=await ic(e);if(!n)return r;let i=P(t,n);return{...r,mcp:Object.fromEntries(Object.entries(r.mcp??{}).map(([e,t])=>[e,{...t,...i[e]}]))}}function oc(){let e=ne();if(!O.existsSync(e))return{};try{return JSON.parse(O.readFileSync(e,`utf8`))}catch(t){throw new G(`Invalid JSON in ${e}: ${t.message}`)}}function sc(e){return e.mcp?{...e,mcp:Object.fromEntries(Object.entries(e.mcp).map(([e,t])=>[e,_c(t)]))}:e}async function cc(e){if(e.local)return sc(oc());let{sealed:t,...n}=await ic(e.store);return n}async function lc(e,t){return uc(e,e=>fc(e,t))}async function uc(e,t){let n=e.settings??={},r=(n.configUpdate??Promise.resolve()).catch(()=>{}).then(()=>e.local?t(e):e.store.withConfigLock(n=>t({...e,store:n})));n.configUpdate=r;try{return await r}finally{n.configUpdate===r&&delete n.configUpdate}}function dc(e){let t=g(e);if(t.length)throw new G(t.join(`; `))}async function fc(e,t){dc(t);let n=e.local?oc():await ac(e.store,e.config),r={},i={},a=Object.fromEntries(Object.entries(t.mcp??{}).map(([e,t])=>{let a=r=>t[r]&&Object.fromEntries(Object.entries(t[r]).map(([t,i])=>[t,i===gc?n.mcp?.[e]?.[r]?.[t]??``:i])),o=a(`env`),s=a(`headers`);return(o||s)&&(i[e]={...o?{env:o}:{},...s?{headers:s}:{}}),r[e]={...t,...i[e]},[e,_c(t)]}));if(e.local)return v({...t,...t.mcp?{mcp:r}:{}}),cc(e);let o={...t,...t.mcp?{mcp:a}:{},...Object.keys(i).length?{sealed:N(e.config,i)}:{}};return await e.store.put(`config`,`workspace`,o),cc(e)}async function pc(e,t){return uc(e,async e=>{let n=structuredClone(e.local?oc():await ac(e.store,e.config));return t(n),fc(e,n)})}function mc(e,t){return uc(e,async e=>fc(e,hc(e.local?oc():await ac(e.store,e.config),t)))}function hc(e,t){if(!t||typeof t!=`object`||Array.isArray(t))return t;let n=e&&typeof e==`object`&&!Array.isArray(e)?Object.fromEntries(Object.entries(e)):{};for(let[e,r]of Object.entries(t))r===null?delete n[e]:Object.defineProperty(n,e,{value:hc(Object.hasOwn(n,e)?n[e]:void 0,r),writable:!0,enumerable:!0,configurable:!0});return n}const gc=`********`;function _c(e){let t=e=>e&&Object.fromEntries(Object.keys(e).map(e=>[e,gc]));return{...e,...e.env?{env:t(e.env)}:{},...e.headers?{headers:t(e.headers)}:{}}}async function vc(e,t){return e.withConfigLock(async e=>{let n=await ic(e);return!n.sealed||En(t,n.sealed)===xn(t.encryptionKey)?0:(await e.put(`config`,`workspace`,{...n,sealed:N(t,P(t,n.sealed))}),1)})}async function yc(e){let t=await e.json().catch(()=>void 0);if(!t||typeof t!=`object`)throw new G(`A JSON body is required`);return t}async function bc(e,t){try{return S(await pc(e,t))}catch(e){if(e instanceof G)return S({error:e.message},400);throw e}}async function xc(e,t,n,r){try{{let e=await cc(t);return S({config:e,effective:t.local?sc(ae(t.local.cwd)):de(e)})}}catch(e){return e instanceof G?S({error:e.message},400):W(e)}}async function Sc(e,t,n,r){try{{let n=await e.json().catch(()=>{throw new G(`A JSON body is required`)});return S(await mc(t,n))}}catch(e){return e instanceof G?S({error:e.message},400):W(e)}}async function Cc(e,t,n,r){try{return S(await lc(t,await yc(e)))}catch(e){return e instanceof G?S({error:e.message},400):W(e)}}function wc(e,t){return t.token?{...t,token:P(e.config,t.token)}:t}function Tc(e,t,n,r,i){return t.auth.token(wc(e,n),r,i,async t=>{let r=await e.store.get(`installation`,n.id);if(r){let i=N(e.config,t);await e.store.put(`installation`,n.id,{...r,token:i}),n.token=i}})}async function Ec(e,t,n,r){if(!t.auth.user||!e.auth)return;let i=await e.auth.linkedUser(t.id,n.actor.id);if(!i?.token||!i.organizations?.includes(e.organizationId))return;let a=await t.auth.user.access(P(e.config,i.token),r,{fetch:e.fetch??fetch,now:(e.now??Date.now)()});return a.refreshed&&await e.auth.link(i,t.id,n.actor.id,{token:N(e.config,a.refreshed)}),a.accessToken}function Dc(e,t){return{...e?{repo:{owner:e.owner,name:e.name}}:{},tools:t}}async function Oc(e,t,n,r,i,a,o){return(o===`requester`?await Ec(e,t,r,i).catch(()=>void 0):void 0)??Tc(e,t,n,i,a)}const kc=e=>{let t=e&&/^([^/]+)\/([^/]+)$/.exec(e);return t?{owner:t[1],name:t[2]}:void 0};async function Ac(e,t,n,r){if(n.kind===`oauth`)return P(e.config,n.token);let i=await e.store.get(`installation`,n.id);if(!i||i.deletedAt)return;let a=await e.store.get(`app`,i.app),o=e.integrations[t];if(!a||!o)return;let s=r?r.toolScopes?.[t]?.repo:kc(i.settings?.configRepo);if(s)return o.auth.token(wc(e,i),P(e.config,a.credentials),Dc(s,r?r.tools[t]??[]:o.tools.presets.observe))}async function jc(e,t,n,r,i){let a={[n.integration]:r};return await Promise.all(Object.entries(t.connections??{}).map(async([t,r])=>{if(t!==n.integration)try{let n=await Ac(e,t,r,i);n&&(a[t]=n)}catch{}})),a}async function Mc(e,t){let n=t.event,r=e.integrations[n.integration];if(!r)throw Error(`Unknown integration "${n.integration}"`);let[i,a]=await Promise.all([e.store.get(`app`,n.appId),e.store.get(`installation`,`${n.appId}:${n.installationId}`)]);if(!i)throw Error(`Unknown app "${n.appId}"`);if(!a||a.deletedAt)throw Error(`Installation is gone`);let o=t.flow===`review`&&t.args?.post===!0,s=await Oc(e,r,a,n,P(e.config,i.credentials),Dc(t.toolScopes?.[n.integration]?.repo??n.repo,t.tools[n.integration]??(o?r.tools.presets.comment:[])),xe(t.definition.integrations[n.integration],n.type)?.actAs),c=await jc(e,a,n,s,t),l=Object.fromEntries(Object.entries(c).filter(([e])=>e in t.tools));return l[n.integration]=s,l}async function Nc(e,t){let n=t.task,[r,i,a]=await Promise.all([n.event?Mc(e,t.task):{},e.local?{}:ac(e.store,e.config),Pc(e,n)]);if(n.runner!==`vercel-sandbox`)return{task:n,tokens:r,credential:a,config:i};let o=Object.fromEntries(Object.entries(a.env).map(([e,t])=>[e,e in Rn?`brokered`:t]));return{task:n,tokens:r,credential:{...a,env:o},config:i}}async function Pc(e,t){let n=t.credential?await e.store.get(`credential`,t.credential):(await Ta(e.store,t.usage?.engine??t.definition.engine,t.requester))?.value;if(n)return La(e.config,n);if(!t.runnerId&&!e.local)throw Error(`no-credential`);return{engine:t.usage?.engine??t.definition.engine??`claude`,env:{}}}var Fc=e({LOCAL_LOGINS:()=>tl,engineSignIn:()=>rl,engineSignOut:()=>il,engineStatus:()=>ol,inspectLocalTask:()=>Vc,isLoginEngine:()=>nl,localLog:()=>qc,localTask:()=>J,localTaskAction:()=>Y,localTasks:()=>Lc,localUsage:()=>Jc,machineSignedIn:()=>sl,pushLocalInbox:()=>Kc,recoverLocalTasks:()=>Uc,runLocalTask:()=>Gc,startLocalTask:()=>Rc,startQueuedLocalTask:()=>Bc,stopLocalTasks:()=>Wc,syncLocalUsage:()=>Zc});const Ic=e=>!e.name?.startsWith(Ve),K=e=>e?Date.parse(e):void 0;function q(e,t,n=!1){let i=K(t.createdAt)??0,a=r(T.join(u(e,t.id),`answers.json`)),o=t.status===`running`?fe(u(e,t.id)).find(e=>!e.response):void 0,s=n&&!y.includes(t.status)?le(e,t.id):null,c=n?f(e,t.id).filter(e=>!y.includes(t.status)||(K(e.at)??0)<(K(t.resumedAt)??i)).map(e=>{let n=e.error&&typeof e.error==`object`?e.error.message:void 0;return{prompt:e.prompt??t.prompt??``,result:{ok:e.status===0,output:e.finalMessage??n??``},...n?{error:n}:{},finishedAt:K(e.at)}}):[];n&&(y.includes(t.status)||!c.length||(c.at(-1)?.finishedAt??0)<(K(t.resumedAt)??i))&&c.push({prompt:t.currentPrompt??t.prompt??``,...s?{result:{ok:s.status===0,output:s.finalMessage??s.error?.message??``}}:{},...t.error?{error:t.error}:{},...y.includes(t.status)?{}:{finishedAt:K(t.completedAt)}});let l=t.flowRunId?Fe(t.flowRunId)?.name:void 0;return{task:{id:t.id,source:t.source??`cli`,agent:t.agentId??`coder`,flow:l??`default`,...t.name?{name:t.name}:l?{name:l===`review`?`Review`:l}:{},runner:`local`,...t.cwd?{cwd:t.cwd}:{},...t.permissions?{permissions:t.permissions}:{},...t.prompt?{prompt:t.currentPrompt??t.prompt}:{},definition:{integrations:{}},...t.engine?{usage:{engine:t.engine,...t.model?{model:t.model}:{}}}:{},tools:{}},status:o?`waiting`:t.status,attempts:1,...o?{approval:o}:{},...a?{answer:a}:{},...s?{result:{ok:s.status===0,exitCode:null,output:s.finalMessage??s.error?.message??``},...s.tokens?{tokens:s.tokens}:{}}:{},...t.error?{error:t.error}:{},...t.fallbacks?.length?{fallbacks:t.fallbacks}:{},...t.archivedAt?{archivedAt:K(t.archivedAt)}:{},createdAt:i,startedAt:i,...t.completedAt?{finishedAt:K(t.completedAt)}:{},updatedAt:K(t.updatedAt)??i,local:!0,...n?{turns:c}:{}}}function Lc(e,t){return(t?s(e,{migrate:!1}):d(e)).filter(Ic).map(n=>{let r=q(e,n);return t?{...r,archivedAt:r.archivedAt??r.updatedAt}:r})}async function Rc(e,t,n){if(!e.local||t.repo||(t.flow??`default`)!=="default"||t.runner&&t.runner!==`local`)return;let r=mo(e,t)??e.local.cwd;await uo(e.store,r,e.integrations);let{version:i}=await L(e.store,t.agent??`coder`),a=await Xn(e,{requester:e.session?.user.id,runner:t.runner,agent:i?.definition.runner}).catch(e=>{throw new U(e.message)});if(!(a.runner!==`local`||a.runnerId)){if(yo(t),!n)return zc(e,{id:l(),source:`dashboard`,agent:t.agent??`coder`,flow:`default`,runner:`local`,cwd:r,prompt:t.prompt,definition:{integrations:{}},tools:{}},{input:t,cwd:r});try{let e=t.agent&&t.agent!==`coder`?await ze(r,t.agent,t.mcp?.join(`,`)):void 0,i=[],a=await se({taskId:n,prompt:t.prompt??``,outputSchema:t.outputSchema,cwd:r,engine:t.engine??e?.engine,model:t.model??(t.engine?void 0:e?.model),effort:t.effort??(t.engine?void 0:e?.effort),permissions:t.permissions??e?.permissions,system:e?.system,mcp:e?e.mcp:t.mcp?.length?oe(t.mcp.join(`,`),ae(r).mcp):void 0,...e?{agentId:t.agent}:{},source:`dashboard`,onFallback:e=>i.push(e)},{waitForStartup:!1});return q(r,i.length?ue(r,a.taskId,{fallbacks:i}):a.task)}catch(e){throw e instanceof pe?new U(e.message,409):e}}}async function zc(e,t,n){let r=(e.now??Date.now)();await e.store.put(`snapshot`,`local-start:${t.id}`,n),await e.queue.enqueue(e.organizationId,t,r,void 0,e.config.maxQueued??1e3),await Fo(e,!1,!0,!0);let i=await e.store.get(`task`,t.id);return i?.status===`queued`?i:J(n.cwd,t.id)??i}async function Bc(e,t){if(!e.local||t.task.runner!==`local`||t.task.runnerId||t.task.event?.repo)return!1;let n=await e.store.get(`snapshot`,`local-start:${t.task.id}`);if(!n)return!1;try{let r=t.task.id,i=t.task.flow==="default"?x(n.cwd,t.task.id):void 0;if(i&&!n.resume)r=i.id;else if(n.resume){let e=x(n.cwd,t.task.id);if(!e)throw Error(`Local task is missing`);await Pe(n.cwd,e,t.task.prompt??``,{outputSchema:t.task.context?.outputSchema})}else n.input?await Rc(e,{...n.input,prompt:t.task.prompt,outputSchema:t.task.context?.outputSchema??n.input.outputSchema},t.task.id):r=(await Gc(e,t.task,t.task.id,!0)).task.id;await e.store.put(`snapshot`,`local-start:${t.task.id}`,{...n,startedId:r});let a={attempts:t.attempts,tokenHash:t.tokenHash,generation:t.generation??0,statuses:[`running`,`waiting`]};if(!await e.queue.patchTask(e.organizationId,t.task.id,{handle:`cli:${r}`},(e.now??Date.now)(),a)){let e=x(n.cwd,r);return e&&await Me(n.cwd,e),!0}if(t.task.flow==="default"){let i={task:t.task,cwd:n.cwd,fence:a};await e.store.put(`snapshot`,`completion:${r}`,i),Hc(e,r,i);let o=yl(e,t.task.id);e.waitUntil&&e.waitUntil(o)}}catch(n){await e.queue.finish(e.organizationId,t.task.id,{status:`failed`,error:n instanceof Error?n.message:String(n)},(e.now??Date.now)(),{attempts:t.attempts,tokenHash:t.tokenHash})}return!0}async function Vc(e,t,n){if(t.status!==`running`&&t.status!==`waiting`)return!1;let r=await e.store.get(`snapshot`,`local-start:${t.task.id}`);if(!r)return!1;let i={attempts:t.attempts,tokenHash:t.tokenHash,generation:t.generation??0,statuses:[`running`,`waiting`]};if(t.task.flow!=="default"){let r=Fe(t.task.id);if(r?.status===`running`&&(t.cancelRequestedAt!==void 0||t.startedAt!==void 0&&n-t.startedAt>=e.config.taskTimeoutMs)){let n=e.store.localFlows?.get(t.task.id);n?(await n.stop(),await n.work.catch(()=>{})):r.pid!==process.pid&&await Le(t.task.id),r=Fe(t.task.id)}return!r||r.status===`running`?!1:e.queue.finish(e.organizationId,t.task.id,{status:t.cancelRequestedAt===void 0?r.status===`completed`?`completed`:`failed`:`cancelled`,error:r.error},n,i)}let a=J(r.cwd,r.startedId??t.task.id);if(!a)return!1;if([`queued`,`running`,`waiting`].includes(a.status))if(t.cancelRequestedAt!==void 0||t.startedAt!==void 0&&n-t.startedAt>=e.config.taskTimeoutMs){let e=x(r.cwd,r.startedId??t.task.id);e&&await Me(r.cwd,e),a=J(r.cwd,t.task.id)}else return!1;let o=a.status;return o!==`completed`&&o!==`failed`&&o!==`cancelled`?!1:e.queue.finish(e.organizationId,t.task.id,{status:o,result:a.result,error:a.error},n,i)}function Hc(e,t,n){let r=e.store.completionWatches??=new Map;if(r.has(t))return;let i={stopped:!1,work:Promise.resolve()};r.set(t,i),i.work=(async()=>{let r=`completion:${t}:${n.fence?.generation??0}`,a=await e.store.get(`delivery`,r);if(a&&!a.owner)return;if(a?.pid)try{process.kill(a.pid,0);return}catch(e){if(e.code!==`ESRCH`)return}let o=kt(),s={owner:o,pid:process.pid,pending:!0,posted:a?.posted??!1};if(a?.owner){if(!await e.store.updateDelivery(r,a.owner,s))return}else if(!await e.store.create(`delivery`,r,s))return;try{for(let a=0;a<5;a++)try{let a=null;for(;;){if(i.stopped)return;if(n.fence){let t=await e.store.get(`task`,n.task.id);if(!t||(t.generation??0)!==n.fence.generation||t.attempts!==n.fence.attempts||t.tokenHash!==n.fence.tokenHash||t.status===`queued`)return}let r=x(n.cwd,t);if(!r)return;let o=p(n.cwd,r);if(!y.includes(o.status)){let e=T.join(u(n.cwd,t),`result.json`),r=Math.max(K(o.completedAt)??0,K(o.resumedAt)??K(o.createdAt)??0);if(O.existsSync(e)&&O.statSync(e).mtimeMs>=r&&(a=le(n.cwd,t)),a)break;if(o.error||o.status===`cancelled`){a={status:1,threadId:o.threadId??null,error:{message:o.error??`Task cancelled`}};break}}await new Promise(e=>setTimeout(e,100))}let c=await e.store.get(`task`,n.task.id);if(n.fence&&c&&(c.generation??0)===n.fence.generation&&c.attempts===n.fence.attempts&&c.tokenHash===n.fence.tokenHash&&await Vc(e,c,(e.now??Date.now)())&&Io(e,!0),!await e.store.updateDelivery(r,o,s))return;if(!s.posted&&n.task.source===n.task.event?.integration){let t=await e.store.get(`app`,n.task.event.appId);if(!t)throw Error(`Local completion has no app`);let{eventReplies:i}=await Promise.resolve().then(()=>is),c=await i(e,t,n.task.event);if(!await e.store.updateDelivery(r,o,s)||(await c.post((a.finalMessage??a.error?.message??``).trim()),s={...s,posted:!0},!await e.store.updateDelivery(r,o,s)))return}let l=T.join(u(n.cwd,t),`agent-note`),d=O.existsSync(l)?O.readFileSync(l,`utf8`).trim():(n.task.context?.note??``).trim();if(!await e.store.updateDelivery(r,o,s))return;d!==(n.task.context?.note??``).trim()&&(d?await e.store.put(`note`,fn(n.task),d):await e.store.delete(`note`,fn(n.task))),await e.store.updateDelivery(r,o,{posted:s.posted,at:Date.now()})&&(await e.store.get(`snapshot`,`completion:${t}`))?.fence?.generation===n.fence?.generation&&await e.store.delete(`snapshot`,`completion:${t}`);return}catch(e){if(a===4)throw e;console.error(`coder server: local completion ${t} attempt ${a+1} failed, retrying`,e);let n=Date.now()+5e3*2**a;for(;!i.stopped&&Date.now()<n;)await new Promise(e=>setTimeout(e,Math.min(100,n-Date.now())))}}finally{await e.store.updateDelivery(r,o,{...s,pid:void 0})}})().catch(e=>{console.error(`coder server: local completion ${t} failed`,e)}).finally(()=>{r.delete(t)})}async function Uc(e){if(e.local)for(let{id:t,value:n}of await e.store.list(`snapshot`,{prefix:`completion:`}))x(n.cwd,t.slice(11))&&Hc(e,t.slice(11),n)}async function Wc(e){await Promise.all([...e.store.localFlows?.values()??[]].map(async e=>{await e.stop(),await e.work.catch(()=>{})}));let t=e.store.completionWatches;if(t){for(let e of t.values())e.stopped=!0;await Promise.all([...t.values()].map(e=>e.work))}}async function Gc(e,t,n,r=!1){if(t.event?.repo){let r=(e.now??Date.now)(),i=n??t.id;return await e.store.get(`task`,i)||await e.queue.enqueue(e.organizationId,{...t,id:i},r,void 0,e.config.maxQueued??1e3),await Fo(e,!1,!1,!0),await e.store.get(`task`,i)}if(!r){let r=mo(e,t)??e.local.cwd;return zc(e,{...t,id:n??l(),cwd:r},{cwd:r})}let i=t.event?await Mc(e,t):{},a=t.event&&i[t.event.integration],o=mo(e,t)??e.local.cwd,s=await e.store.get(`task`,n??t.id),c={task:t,cwd:o,...s?{fence:{generation:s.generation??0,attempts:s.attempts,tokenHash:s.tokenHash,statuses:[`running`,`waiting`]}}:{}},f=t.flow!=="default"&&n?Fe(n):void 0;if(f){let r=d(o).find(e=>e.flowRunId===n),i=(e.now??Date.now)();return r?q(o,r):{task:t,status:f.status===`running`?`running`:f.status===`completed`?`completed`:`failed`,attempts:1,createdAt:i,updatedAt:i,local:!0}}if(t.flow==="default"){n??=l();let r=`completion:${n}`,i=await e.store.get(`snapshot`,r);if(i&&Q(i.task)!==Q(t))throw Error(`Local completion belongs to another session`);i||await e.store.create(`snapshot`,r,c);let a=T.join(u(o,n),`agent-note`);O.existsSync(a)||(O.mkdirSync(T.dirname(a),{recursive:!0}),O.writeFileSync(a,t.context?.note??``,{mode:384}))}let p=t.flow==="default"&&n?x(o,n):void 0;if(p)return p.status===`queued`&&!p.pid&&ee(o,p.id),Hc(e,p.id,c),q(o,p);let m,h=new Promise(e=>m=e),g;g=Be({cwd:o,agent:t.agent,flow:t.flow,task:t,taskId:n,toolEnvironment:{tokens:i},post:t.flow!=="default"&&t.source===t.event?.integration,...t.flow==="default"?{noteFile:T.join(u(o,n),`agent-note`)}:{},...a?{postToken:a}:{},source:t.source,onStart:n=>{(e.store.localFlows??=new Map).set(t.id,{stop:async()=>{n.requestStop(),await Re(n.runId,n.runningIds())},work:g}),m(t.id)},onTask:n=>{t.flow==="default"&&Hc(e,n,c),m(n)}}).then(async n=>{t.flow!=="default"&&n.note!==void 0&&(n.note?await e.store.put(`note`,fn(t),n.note):await e.store.delete(`note`,fn(t)))}).finally(async()=>{if(e.store.localFlows?.delete(t.id),t.flow!=="default"){let n=await e.store.get(`task`,t.id);n&&n.attempts===c.fence?.attempts&&n.tokenHash===c.fence?.tokenHash&&(n.generation??0)===c.fence?.generation&&await Vc(e,n,(e.now??Date.now)()),Io(e,!0)}}),g.catch(()=>{});let _=await Promise.race([h,g.then(()=>void 0)]),v=_?x(o,_):void 0,y=(e.now??Date.now)();return v&&q(o,v)||{task:t,status:t.flow!=="default"&&Fe(t.id)?.status===`running`?`running`:`completed`,attempts:1,createdAt:y,updatedAt:y,local:!0}}async function Kc(e,t,n){let r=t.handle.slice(4),i=await e.store.get(`snapshot`,`local-start:${t.task.id}`);if(!i)throw Error(`Local task launch is missing`);let a={generation:t.generation??0,seq:-1,answers:[]};for(let o of n){let n=await e.store.get(`task`,t.task.id);if(!n||n.attempts!==t.attempts||n.tokenHash!==t.tokenHash||(n.generation??0)!==o.generation||![`running`,`waiting`].includes(n.status))break;let s=x(i.cwd,r);if(!s)throw Error(`Local task is missing`);let c=o.kind===`cancel`?await Me(i.cwd,s):await We(i.cwd,{...s,name:void 0},o);o.kind===`ask`&&a.answers.push({seq:o.seq,value:c}),a.seq=o.seq}return a}function qc(e,t,n=-1,r){let i=``;try{i=O.readFileSync(T.join(u(e,t),`log.jsonl`),`utf8`)}catch{}let a=i.split(`
|
|
8
|
-
`).flatMap((e,t)=>{if(!e||t<=n)return[];let r=ct(e);if(!r)return[{seq:t,at:0,level:`out`,line:e}];let i=r.kind===`error`?`err`:[`status`,`info`,`steer`].includes(r.kind??``)?`sys`:`out`;return[{seq:t,at:K(r.at)??0,level:i,line:r.message??``,entry:r}]});return r===void 0?a:a.slice(0,r)}function J(e,t,n=!0){let r=x(e,t);return r&&Ic(r)?q(e,p(e,r),n):void 0}async function Y(e,t,n,a,o){let s=x(t,n);if(!s||!Ic(s))return Response.json({error:`No task "${n}"`},{status:404});let l=p(t,s),d=y.includes(l.status),f=e.method===`POST`?await e.json().catch(()=>({})):{},m=(e,t=409)=>Response.json({error:e},{status:t});if(e.method===`DELETE`&&!a){if(d&&await Me(t,l),je(t,l),o){let e=o.store.completionWatches?.get(n);e&&(e.stopped=!0,await e.work),await o.store.delete(`task`,n),await o.store.delete(`snapshot`,`local-start:${n}`),await o.store.delete(`snapshot`,`completion:${n}`),Io(o,!0)}return Response.json({ok:!0})}if(e.method!==`POST`)return new Response(`Method not allowed`,{status:405});if(a===`cancel`)return d?(await Me(t,l),Response.json({ok:!0})):m(`No running or queued task "${n}"`,404);if(a===`archive`)return i(t,l),o&&await o.queue.patchTask(o.organizationId,n,{archivedAt:(o.now??Date.now)()},(o.now??Date.now)()),Response.json({ok:!0});if(a===`steer`||a===`continue`){let e=String(f.text??``);if(!e.trim())return m(`text is required`,400);if(a===`steer`&&!d)return m(`Task "${n}" is not active`);if(a===`continue`&&d)return m(`Task "${n}" is still active; steer or ask it instead`);let r=a===`continue`?f.outputSchema:void 0;if(r!==void 0&&(!r||typeof r!=`object`||Array.isArray(r)))return m(`outputSchema must be an object`,400);try{if(a===`continue`&&o){let i=o.store.completionWatches?.get(n);i&&await i.work;let a=(o.now??Date.now)(),s=await o.store.get(`task`,n);s&&[`running`,`waiting`].includes(s.status)&&(await Vc(o,s,a),s=await o.store.get(`task`,n));let c={prompt:e,context:{...s?.task.context,...r?{outputSchema:r}:{}}};if(await o.store.put(`snapshot`,`local-start:${n}`,{cwd:t,resume:!0}),s){if(!await o.queue.continueTask(o.organizationId,n,c,a,{attempts:s.attempts,generation:s.generation??0}))return m(`Task is already active`)}else await o.queue.enqueue(o.organizationId,{...q(t,l).task,...c},a,void 0,o.config.maxQueued??1e3);await Fo(o,!1,!0,!0);let u=await o.store.get(`task`,n);return Response.json(u?.status===`queued`?{...u,statusReason:`Waiting for a task slot`}:J(t,n))}let i=await Pe(t,l,e,{...typeof r==`object`&&r?{outputSchema:r}:{}});return Response.json(a===`continue`?J(t,n):i)}catch(e){return m(e.message)}}if(a===`ask`){let e=String(f.question??f.text??``);if(!e.trim())return m(`question is required`,400);let i=await Ne(t,l,e),a=i.finalMessage??i.error?.message??``,o=T.join(u(t,n),`answers.json`);return c(o,[...r(o)??[],a]),Response.json({ok:!0,answer:a})}if(a===`approve`){let e=fe(u(t,n)).filter(e=>!e.response),r=String(f.approvalId??f.id??e[0]?.id??``);return e.some(e=>e.id===r)?(te(u(t,n),r,f.decision===`deny`||f.decision===`decline`?`decline`:`accept`),Response.json({ok:!0})):m(`Task "${n}" has no pending approval`)}return new Response(`Not found`,{status:404})}function Jc(e,t=new Set,n=!0){let r=Yc(t);return[...d(e),...n?s(e,{migrate:!1}):[]].filter(Ic).flatMap(t=>{let n=f(e,t.id);return Xc(t,n,!n.length&&!y.includes(t.status)?le(e,t.id):null,r)})}function Yc(e){let t=new Map;for(let n of e){let e=n.lastIndexOf(`:`),r=n.slice(4,e),i=t.get(r)??[];i.push(Number(n.slice(e+1))),t.set(r,i)}return t}function Xc(e,t,n,r){let i=t.length?t:n?[{...n,at:e.completedAt??e.updatedAt??e.createdAt}]:[],a=r.get(e.id)??[];r.set(e.id,a);let o=K(e.createdAt)??0;return i.flatMap(t=>{let n=K(t.at);if(n===void 0||!Number.isFinite(n))return[];let r=K(e.resumedAt),i=r!==void 0&&r>=o&&r<=n?r:o,s=a.some(e=>e===n||e>o&&e<=n);return o=n,s?[]:(a.push(n),[[`cli:${e.id}:${n}`,{taskId:e.id,agent:e.agentId??`coder`,target:e.source??`cli`,...e.engine?{engine:e.engine}:{},...t.model??e.model?{model:t.model??e.model}:{},credential:`local`,runnerElapsedMs:Math.max(0,n-i),...t.tokens?{tokens:t.tokens}:{},at:n}]])})}function Zc(e){let t=e.local;return t.usageSync??=el(e).finally(()=>t.usageSync=void 0)}async function Qc(e){try{return JSON.parse(await O.promises.readFile(e,`utf8`))}catch{return null}}async function $c(e){return(await Promise.all([`job.json`,`results.jsonl`,`result.json`].map(async t=>{let n=await O.promises.stat(T.join(e,t)).catch(()=>void 0);return n?`${n.mtimeMs}:${n.ctimeMs}:${n.size}`:``}))).join(`|`)}async function el(e){let n=e.local;await n.cacheMaintenance;let r=t(),i=await Qc(r),a=await e.store.list(`usage`,{prefix:`cli:`}),s=new Set(a.map(e=>e.id)),c=0,l=async()=>{++c%4==0&&await new Promise(e=>setImmediate(e))};if(n.archiveScan===void 0)for(let[t,n]of Object.entries(i?.rows??{}))s.has(t)||(await e.store.put(`usage`,t,n),s.add(t)),await l();let u=Yc(s),d=(await O.promises.stat(o(n.cwd)).catch(()=>void 0))?.mtimeMs??0,f={},p=new Set,m=!1;for await(let{id:t,dir:r,archived:a}of ce(n.cwd)){if(await l(),p.has(t))continue;let n=a?await $c(r):void 0;if(a&&i?.counted?.[t]===n){f[t]=n,p.add(t);continue}let o=await Qc(T.join(r,`job.json`));if(o){if(o.agent&&(o.engine=o.agent),p.add(t),Ic(o)){let t=(await O.promises.readFile(T.join(r,`results.jsonl`),`utf8`).catch(()=>``)).split(/\r?\n/).flatMap(e=>{try{return e?[JSON.parse(e)]:[]}catch{return[]}}),n=!t.length&&!y.includes(o.status)?await Qc(T.join(r,`result.json`)):null;for(let[r,i]of Xc(o,t,n,u))await e.store.put(`usage`,r,i),m=!0,await l()}a&&(f[t]=n)}}if(m||i?.archive!==d||JSON.stringify(i?.counted)!==JSON.stringify(f)){let t=await e.store.list(`usage`,{prefix:`cli:`});await O.promises.mkdir(T.dirname(r),{recursive:!0});let n=b(r);try{await O.promises.writeFile(n,`${JSON.stringify({archive:d,counted:f,rows:Object.fromEntries(t.map(e=>[e.id,e.value]))})}\n`),await O.promises.rename(n,r)}finally{await O.promises.rm(n,{force:!0})}}n.archiveScan=d}const tl=`A local server stores no credentials. Tasks use this machine's own claude and codex sign-in.`,X={claude:{file:`claude`,args:[`auth`,`status`,`--json`],command:`claude auth login`,login:[`auth`,`login`],logout:[`auth`,`logout`],ok:e=>JSON.parse(e).loggedIn===!0},codex:{file:`codex`,args:[`login`,`status`],command:`codex login`,login:[`login`],logout:[`logout`],ok:()=>!0}},nl=e=>e in X;function rl(e){let t=X[e];wt(t.file,t.login,{detached:!0,stdio:`ignore`}).on(`error`,()=>{}).unref()}function il(e){let t=X[e];return new Promise(e=>Ct(t.file,t.logout,{timeout:15e3},()=>e()))}function al(e){return new Promise(t=>Ct(e.file,e.args,{timeout:15e3},(n,r)=>{try{t(!n&&e.ok(r))}catch{t(!1)}}))}async function ol(){let[e,t]=await Promise.all([al(X.claude),al(X.codex)]);return{claude:{signedIn:e,command:X.claude.command},codex:{signedIn:t,command:X.codex.command}}}async function sl(e,t){return!!e.local&&(t===`custom`||(await ol())[t]?.signedIn===!0)}const Z=[`queued`,`running`,`waiting`];function cl(e,t){let n=t.status?[t.status]:t.statuses;if(n&&!n.includes(e.status)||t.agent&&e.task.agent!==t.agent||t.source&&e.task.source!==t.source||t.archived!==void 0&&t.archived!==(e.archivedAt!==void 0))return!1;let r=t.q?.trim().toLowerCase();return!r||[e.task.prompt??e.task.event?.text,e.task.agent,e.task.id].some(e=>e?.toLowerCase().includes(r))}const ll=e=>+!Z.includes(e.status),ul=(e,t)=>ll(e)-ll(t)||t.createdAt-e.createdAt||(t.task.id<e.task.id?-1:+(t.task.id>e.task.id)),dl=e=>({active:Z.includes(e.status),createdAt:e.createdAt,id:e.task.id}),fl=(e,t)=>!t||ul(e,{status:t.active?`running`:`completed`,createdAt:t.createdAt,task:{id:t.id}})>0;function Q(e){let t=e.event;return JSON.stringify([t?.appId,t?.installationId,t?.chat?.thread.id,e.agent,e.requester,t?.actor.id])}function pl(e,t){return e.flow==="default"&&!!e.event?.actor.id&&Q(e)===Q(t)}async function ml(e,t){let n=t.task.id,r=t.generation??0,i={generation:r,attempts:t.attempts,tokenHash:t.tokenHash??null,handle:t.handle??null};if(e.queue instanceof _l)return e.queue.deleteTask(e.organizationId,n,i);let[{DrizzleStore:a},{task:o},{and:s,eq:c,isNull:l}]=await Promise.all([import(`./store-BLi19UDE.js`),import(`./schema-CU2iFkp8.js`).then(e=>e.u),import(`drizzle-orm`)]);if(!(e.store instanceof a))throw Error(`Task store does not support fenced deletion`);let[u]=await e.store.db.delete(o).where(s(c(o.organizationId,e.organizationId),c(o.publicId,n),c(o.generation,r),c(o.attempts,i.attempts),i.tokenHash===null?l(o.tokenHash):c(o.tokenHash,i.tokenHash),i.handle===null?l(o.handle):c(o.handle,i.handle))).returning({id:o.id});return!!u}async function hl(e,t,n,r,i){let a=await e.queue.appendInbox(e.organizationId,t,n,r,(e.now??Date.now)(),i);return a&&await yl(e,t),a}const gl=new Set([`completed`,`failed`,`cancelled`]);var _l=class{store;lock=Promise.resolve();constructor(e){this.store=e}serial(e){let t=this.lock.then(e,e);return this.lock=t.catch(()=>{}),t}async read(e){return this.store.get(`task`,e)}async enqueue(e,t,n,r,i){return this.serial(()=>this.insert(t,n,r,i))}async insert(e,t,n,r){let i=n&&await this.store.get(`delivery`,n.key);if(i&&!i.pending)return!1;e=i?.pending?.task??e;let a=await this.read(e.id);if(!a&&r!==void 0&&(await this.store.list(`task`)).filter(e=>e.value.status===`queued`).length>=r)throw Error(`Organization task queue is full`);return n&&!i&&await this.store.put(`delivery`,n.key,{at:t,pending:{task:e}}),a||await this.store.put(`task`,e.id,{task:e,status:`queued`,attempts:0,createdAt:t,updatedAt:t}),n&&await this.store.put(`delivery`,n.key,{at:t},{ttlMs:n.ttlMs}),!0}async nextSeq(e){let t=await this.store.list(`inbox`,{prefix:`${e}:`}),n=(await this.store.list(`delivery`)).flatMap(t=>t.value.pending?.inbox?.id.startsWith(`${e}:`)?[t.value.pending.inbox.entry.seq]:[]);return Math.max((await this.read(e))?.inboxSeq??-1,...t.map(e=>e.value.seq),...n)+1}deliver(e,t,n,r,i,a,o=!0){return this.serial(async()=>{let s=await this.store.get(`delivery`,r.key);if(s&&!s.pending)return{};if(s?.pending?.inbox){let{taskId:e,id:i,entry:a}=s.pending.inbox,o=await this.read(e);if(o&&Z.includes(o.status)&&(o.generation??0)===a.generation&&pl(o.task,t))return await this.store.put(`task`,e,{...o,inboxSeq:Math.max(o.inboxSeq??-1,a.seq)}),await this.store.put(`inbox`,i,a),await this.store.put(`delivery`,r.key,{at:n},{ttlMs:r.ttlMs}),{steered:!0};await this.store.delete(`delivery`,r.key),s=void 0}let c=i&&!s?.pending?.task?(await this.list(e,{statuses:Z,agent:t.agent,source:t.source})).find(e=>pl(e.task,t)):void 0;if(!c)return o&&await this.insert(t,n,r,a)?{taskId:t.id}:{};let l=await this.nextSeq(c.task.id),u={seq:l,generation:c.generation??0,at:n,kind:`steer`,value:{text:t.event.text}},d=`${c.task.id}:${String(l).padStart(8,`0`)}`;return await this.store.put(`delivery`,r.key,{at:n,pending:{inbox:{taskId:c.task.id,id:d,entry:u}}}),await this.store.put(`task`,c.task.id,{...c,inboxSeq:l}),await this.store.put(`inbox`,d,u),await this.store.put(`delivery`,r.key,{at:n},{ttlMs:r.ttlMs}),{steered:!0}})}claim(e,t){return this.serial(async()=>{let n=(await this.store.list(`task`)).map(e=>e.value);if(t!==void 0&&n.filter(e=>[`running`,`waiting`].includes(e.status)).length>=t)return;let r=n.filter(e=>e.status===`queued`).sort((e,t)=>e.createdAt-t.createdAt),i=r[0];if(!i)return;let a=mn(i.task.id,`default`,i.attempts+1),o={...i,tokenHash:a.hash,lastSeenAt:e,status:`running`,attempts:i.attempts+1,startedAt:e,updatedAt:e};return await this.store.put(`task`,o.task.id,o),{organizationId:`default`,status:o,token:a.token,more:r.length>1&&(t===void 0||n.filter(e=>[`running`,`waiting`].includes(e.status)).length+1<t)}})}allowed(e,t){return(t.generation===void 0||(e.generation??0)===t.generation)&&(t.attempts===void 0||e.attempts===t.attempts)&&(t.tokenHash===void 0||(e.tokenHash??null)===t.tokenHash)&&(t.handle===void 0||(e.handle??null)===t.handle)&&(t.lastSeenAt===void 0||(e.lastSeenAt??null)===t.lastSeenAt)&&(t.updatedAt===void 0||e.updatedAt===t.updatedAt)&&(!t.statuses||t.statuses.includes(e.status))}touch(e,t,n,r,i,a=!1){return this.serial(async()=>{let e=await this.read(t);if(!e||!this.allowed(e,{tokenHash:n,attempts:r})||!a&&gl.has(e.status)||e.status===`queued`)return;if(gl.has(e.status))return e;let o={...e,lastSeenAt:i,updatedAt:i};return await this.store.put(`task`,t,o),o})}patchTask(e,t,n,r,i={}){return this.serial(async()=>{let e=await this.read(t);if(!e||!this.allowed(e,i))return!1;let{answer:a,...o}=n;return await this.store.put(`task`,t,{...e,...o,...a===void 0?{}:{answer:[...e.answer??[],a]},updatedAt:r}),!0})}deleteTask(e,t,n){return this.serial(async()=>{let e=await this.read(t);return!e||!this.allowed(e,n)?!1:(await this.store.delete(`task`,t),!0)})}continueTask(e,t,n,r,i){return this.serial(async()=>{let e=await this.read(t);if(!e||!gl.has(e.status)||!this.allowed(e,i))return!1;let{note:a,...o}=n.context??{},s=await this.store.get(`note`,fn(e.task));return n.context={...o,...s?{note:s}:{}},await this.store.put(`task`,t,{task:{...e.task,...n},status:`queued`,attempts:0,logSeq:e.logSeq,logBytes:e.logBytes,archivedAt:e.archivedAt,generation:(e.generation??0)+1,inboxSeq:e.inboxSeq,createdAt:e.createdAt,updatedAt:r}),!0})}completeTask(e,t,n,r){return this.serial(async()=>{let e=await this.read(t);if(!e||!this.allowed(e,{attempts:n.attempts,tokenHash:n.tokenHash,statuses:[`running`,`waiting`]}))return!1;if(await this.store.put(`usage`,`${t}:${e.generation??0}`,n.usage),n.note){let{key:e,value:t,ttlMs:r}=n.note;t?await this.store.put(`note`,e,t,{ttlMs:r}):await this.store.delete(`note`,e)}for(let n of await this.store.list(`inbox`,{prefix:`${t}:`}))n.value.generation===(e.generation??0)&&await this.store.delete(`inbox`,n.id);return await this.store.put(`task`,t,{...e,...n.outcome,lastSeenAt:r,finishedAt:r,updatedAt:r}),!0})}requeue(e,t,n,r={}){return this.serial(async()=>{let e=await this.read(t);return!e||!this.allowed(e,{...r,statuses:[`running`,`waiting`]})?!1:(await this.store.put(`task`,t,{...e,status:`queued`,handle:void 0,tokenHash:void 0,lastSeenAt:void 0,updatedAt:n}),!0)})}finish(e,t,n,r,i={}){return this.serial(async()=>{let e=await this.read(t);return!e||!this.allowed(e,{...i,statuses:[`queued`,`running`,`waiting`]})?!1:(await this.store.put(`task`,t,{...e,...n,lastSeenAt:r,finishedAt:r,updatedAt:r}),!0)})}cancel(e,t,n,r={}){return this.serial(async()=>{let e=await this.read(t);if(!e||gl.has(e.status)||!this.allowed(e,r))return!1;let i=e.status===`queued`?void 0:{seq:await this.nextSeq(t),generation:e.generation??0,kind:`cancel`,value:null,at:n};return i&&await this.store.put(`inbox`,`${t}:${String(i.seq).padStart(8,`0`)}`,i),await this.store.put(`task`,t,{...e,...e.status===`queued`?{status:`cancelled`,finishedAt:n}:{},cancelRequestedAt:n,...i?{inboxSeq:i.seq}:{},updatedAt:n}),!0})}async cancelRequested(e,t){return(await this.read(t))?.cancelRequestedAt!==void 0}async list(e,t={}){let{before:n}=t;return(await this.store.list(`task`)).map(e=>e.value).filter(e=>cl(e,t)).filter(e=>fl(e,n)).sort(ul).slice(0,t.limit)}async counts(e,t={}){let n=(await this.store.list(`task`)).map(e=>e.value).filter(e=>cl(e,t));return{all:n.length,active:n.filter(e=>Z.includes(e.status)).length,waiting:n.filter(e=>e.status===`waiting`).length}}async runningCount(){return(await this.store.list(`task`)).filter(e=>[`running`,`waiting`].includes(e.value.status)).length}async running(){return(await this.store.list(`task`)).map(e=>e.value).filter(e=>[`running`,`waiting`].includes(e.status)).map(e=>({organizationId:`default`,status:e}))}appendLogs(e,t,n,r,i,a,o){return this.serial(async()=>{let e=await this.read(t);return!e||!this.allowed(e,o)||(e.logSeq??0)!==r.seq||(e.logCursor??-1)!==r.cursor?!1:(await this.store.putMany(`tasklog`,n.map(({seq:e,...n})=>({id:`${t}:${String(e).padStart(6,`0`)}`,value:n}))),await this.store.put(`task`,t,{...e,logCursor:i.cursor,logSeq:i.seq,logBytes:i.bytes,updatedAt:a}),!0)})}readInbox(e,t,n,r){return this.serial(async()=>{let e=await this.read(t);return!e||!Z.includes(e.status)||(e.generation??0)!==n?[]:(await this.store.list(`inbox`,{prefix:`${t}:`})).map(e=>e.value).filter(e=>e.generation===n&&e.seq>r).slice(0,100)})}fetchInbox(e,t,n,r,i){return this.serial(async()=>{let e=await this.read(t);if(!(!e||!this.allowed(e,{tokenHash:n,attempts:r,statuses:[`running`,`waiting`]})))return(await this.store.list(`inbox`,{prefix:`${t}:`})).map(e=>e.value).filter(t=>t.generation===(e.generation??0)&&t.seq>i).sort((e,t)=>e.seq-t.seq)})}ackInbox(e,t,n,r){return this.serial(async()=>{if(r.generation!==void 0&&r.generation!==n.generation)return!1;let e=await this.read(t);if(!e||!this.allowed(e,{...r,generation:n.generation,statuses:void 0})||n.seq>(e.inboxSeq??-1))return!1;let i=e.inboxAck?.generation===n.generation?e.inboxAck.seq:-1;if(gl.has(e.status))return n.seq<=i;if(![`running`,`waiting`].includes(e.status))return!1;let a=(await this.store.list(`inbox`,{prefix:`${t}:`})).filter(e=>e.value.generation===n.generation&&e.value.seq<=n.seq),o=(n.answers??[]).filter(e=>e.seq>i&&a.some(t=>t.value.kind===`ask`&&t.value.seq===e.seq)).map(e=>e.value),s=a.some(e=>e.value.kind===`cancel`),c=e.approval?.id,l=c&&a.some(e=>e.value.kind===`approve`&&e.value.value?.approvalId===c);await this.store.put(`task`,t,{...e,inboxAck:{generation:n.generation,seq:Math.max(i,n.seq)},...o.length?{answer:[...e.answer??[],...o]}:{},...l?{status:`running`,approval:void 0}:{},...s?{status:`cancelled`,finishedAt:Date.now()}:{}});for(let e of a)await this.store.delete(`inbox`,e.id);return!0})}async pendingInbox(){let e=await this.store.list(`inbox`);return(await this.running()).filter(({status:t})=>e.some(e=>e.id.startsWith(`${t.task.id}:`)&&e.value.generation===(t.generation??0)))}appendInbox(e,t,n,r,i,a){return this.serial(async()=>{let e=await this.read(t);if(!e||!Z.includes(e.status)||(e.generation??0)!==a)return;let o=await this.nextSeq(t),s={seq:o,generation:a,at:i,kind:n,value:r};return await this.store.put(`inbox`,`${t}:${String(o).padStart(8,`0`)}`,s),await this.store.put(`task`,t,{...e,inboxSeq:o}),s})}};const vl=3e4;function yl(e,t){let n=e.queue.inboxDelivery??=new Map,r=JSON.stringify([e.organizationId,t]),i=n.get(r);if(i||n.set(r,i={}),i.work)return i.again=!0,i.work;let a=i,o=async()=>{let n,r=kt(),i=0,o=0,s,c=async()=>{for(;;){a.again=!1;let s=await e.store.get(`task`,t);if(!s?.handle||![`running`,`waiting`].includes(s.status))return;let c=await Qn(e,s.task),l=!!(e.local&&s.handle.startsWith(`cli:`));if(!l&&!c?.push)return;o=s.generation??0;let u={generation:o,attempts:s.attempts,tokenHash:s.tokenHash??null,handle:s.handle},d=`inbox:${JSON.stringify([t,u])}`;if(n!==d){n&&await e.store.updateDeliveryLease(n,r),n=void 0;let t=await e.store.claimDeliveryLease(d,r,vl);if(t===void 0)return;n=d,i=t}else if(!await e.store.updateDeliveryLease(n,r,{owner:r,failures:i},{ttlMs:vl}))return;let f=(await e.queue.readInbox(e.organizationId,t,s.generation??0,-1)).slice(0,100);if(!f.length){if(a.again)continue;return}let p=l?await Kc(e,s,f):await c.push(s.handle,f);if(p.generation!==(s.generation??0)||!f.some(e=>e.seq===p.seq))throw Error(`Invalid inbox acknowledgement`);if(!await e.queue.ackInbox(e.organizationId,t,p,u)||(i=0,f.length<100&&!a.again))return}};try{await c()}catch{if(n){let t=Math.min(3e4,1e3*2**Math.min(i,5)),a={owner:r,failures:i+1,next:(e.now??Date.now)()+t};await e.store.updateDeliveryLease(n,r,a,{ttlMs:t}),n=void 0}}finally{n&&(await e.store.updateDeliveryLease(n,r),s=o)}return s};return a.work=(async()=>{for(;;){let n=await o();if(n===void 0||!(await e.queue.readInbox(e.organizationId,t,n,-1)).length&&!a.again)break}n.delete(r)})().finally(()=>{n.get(r)===a&&n.delete(r)}),a.work}async function bl(e){let t=await e.queue.pendingInbox();await Promise.allSettled(t.map(({organizationId:t,status:n})=>yl(M(e,t),n.task.id)))}function xl(e){let t=bl(e).catch(()=>{});e.waitUntil&&e.waitUntil(t)}const $=`default`;async function Sl(e){if(!e.databaseUrl)throw Error(`DATABASE_URL is required for the Postgres store`);let{connect:t}=await import(`./client-D9IoAuDD.js`).then(e=>e.n);return t(e.databaseUrl,e.databasePool)}async function Cl(e,t={}){if(e.store!==`postgres`){let e=t.local?new co:new no;return{store:()=>e,queue:new _l(e),chatState:new ut(t.local?T.join(h(``),`chat.json`):void 0),defaultOrganizationId:$,webhookTarget:async(t,n)=>{let r=await e.get(`app`,t),i=n?await e.get(`installation`,n):void 0;return r&&{organizationId:$,app:r,...i&&i.app===t&&!i.deletedAt?{bound:{organizationId:$,installation:i}}:{}}},appRecord:async t=>{let n=await e.get(`app`,t);return n&&{organizationId:$,app:n}},installationOrganization:async t=>await e.get(`installation`,t)?$:void 0,installations:async t=>(await e.list(`installation`,{prefix:`${t}:`})).filter(e=>!e.value.deletedAt).map(e=>({key:e.id,organizationId:$})),taskOrganization:async(t,n)=>(await e.get(`task`,t))?.tokenHash===n?$:void 0,sweep:async()=>{},close:async()=>{}}}let n=await Sl(e),[{DrizzleStore:r},{DrizzleQueue:i},{UNSCOPED_ORGANIZATION:a},{PgChatState:o}]=await Promise.all([import(`./store-BLi19UDE.js`),import(`./queue-C9fSdE_X.js`),import(`./shared-BLkGRKty.js`).then(e=>e.g),import(`./chat-B_yhNTo0.js`)]);return{store:t=>new r(n.db,t,Date.now,e),queue:new i(n.db),chatState:new o(n.db),defaultOrganizationId:a,webhookTarget:(e,t)=>r.webhookTarget(n.db,e,t),appRecord:e=>r.appRecord(n.db,e),installationOrganization:e=>r.installationOrganization(n.db,e),installations:e=>r.installations(n.db,e),taskOrganization:(e,t)=>r.taskOrganization(n.db,e,t),connection:n,sweep:e=>new r(n.db,a).sweep(e),close:()=>n.close()}}async function wl(e,t,n,r){if(e.updateMetadata)return e.updateMetadata(t,n,r);let i=await e.get(t,n);return i?(await e.put(t,n,{...i,...r}),!0):!1}async function Tl(e,t){let n=[...new Set(t)];return e.getApps?e.getApps(n):(await Promise.all(n.map(async t=>({id:t,value:await e.get(`app`,t)})))).filter(e=>!!e.value)}export{uo as $,xi as $t,Qs as A,Gn as An,da as At,Is as B,mn as Bn,ya as Bt,cc as C,mr as Cn,ua as Ct,Zs as D,sr as Dn,sa as Dt,nc as E,tr as En,Gi as Et,Ks as F,wn as Fn,Ki as Ft,Ts as G,ln as Gn,Ni as Gt,Ls as H,cn as Hn,ji as Ht,Js as I,N as In,Vi as It,Fo as J,$t as Jn,z as Jt,Os as K,tn as Kn,Mi as Kt,qs as L,xn as Ln,ga as Lt,rc as M,Qn as Mn,pa as Mt,Gs as N,Ln as Nn,ha as Nt,$s as O,nr as On,ca as Ot,Ws as P,P as Pn,Li as Pt,po as Q,Xt as Qn,mi as Qt,Vs as R,En as Rn,Wi as Rt,Cc as S,xr as Sn,ma as St,Hs as T,cr as Tn,ia as Tt,xs as U,an as Un,Pi as Ut,Rs as V,rn as Vn,Ai as Vt,Ds as W,sn as Wn,ki as Wt,Eo as X,en as Xn,hi as Xt,Io as Y,Qt as Yn,gi as Yt,Oo as Z,Jt as Zn,vi as Zt,G as _,dr as _n,ba as _t,Z as a,ei as an,xa as at,Sc as b,fr as bn,va as bt,Q as c,Xr as cn,Ja as ct,J as d,kr as dn,Qa as dt,Ci as en,fo as et,Lc as f,Dr as fn,$a as ft,Zc as g,L as gn,oa as gt,Wc as h,Cr as hn,la as ht,wl as i,$r as in,Da as it,Xs as j,Kn as jn,aa as jt,Ys as k,ar as kn,ta as kt,ol as l,ti as ln,H as lt,Uc as m,Tr as mn,fa as mt,Sl as n,Lr as nn,Ia as nt,bl as o,ni as on,Za as ot,Fc as p,wr as pn,zi as pt,is as q,nn as qn,Ei as qt,Tl as r,ri as rn,Ya as rt,xl as s,ai as sn,Xa as st,Cl as t,_i as tn,to as tt,qc as u,Or as un,Ua as ut,yc as v,I as vn,$i as vt,pc as w,vr as wn,Zi as wt,xc as x,br as xn,_a as xt,bc as y,ur as yn,ra as yt,Fs as z,M as zn,Qi as zt};
|
package/dist/store-BLi19UDE.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import{at as e,lt as t,nt as n,tt as r}from"./store-B3ZHoBJY.js";import{a as i,d as a,g as o,h as s,i as c,l,m as u,n as d,p as f,r as p,t as m}from"./schema-CU2iFkp8.js";import{i as h}from"./client-D9IoAuDD.js";import{C as g,S as _,_ as v,a as y,b as ee,c as b,d as x,f as S,h as C,i as w,l as T,n as E,o as D,p as O,r as k,s as A,u as j,v as M,w as N,x as P,y as te}from"./shared-BLkGRKty.js";import{i as ne,t as re}from"./usage-Cb8Dtv9V.js";import{isDeepStrictEqual as F}from"node:util";import{and as I,asc as L,desc as ie,eq as R,gt as z,gte as B,ilike as V,inArray as H,isNull as U,lt as W,lte as G,or as K,sql as q}from"drizzle-orm";import{alias as J}from"drizzle-orm/pg-core";function ae(e,t,n){return e.db.transaction(async r=>{let[i]=await r.insert(m).values({organizationId:e.organizationId,slug:t.id,name:t.name,description:t.description??null,source:t.source,repo:t.repo??null,path:t.path??null,currentVersion:0,createdAt:A(t.createdAt),updatedAt:A(t.updatedAt)}).onConflictDoUpdate({target:[m.organizationId,m.slug],set:{slug:t.id}}).returning(),a=w(i),[o]=a.currentVersion?await r.select().from(d).where(I(R(d.agentId,i.id),R(d.version,a.currentVersion))):[],s=o&&N(o,t.id),c=!!(s&&F(s.definition,n.definition)&&s.systemPrompt===n.systemPrompt&&F(s.files,n.files)),l=c?s:{...n,version:a.currentVersion+1},u={...t,currentVersion:l.version,createdAt:a.createdAt,...a.settings?{settings:a.settings}:{},updatedAt:a.updatedAt};if(c&&F(u,a))return{record:a,version:l,unchanged:c};u={...u,updatedAt:t.updatedAt};let f=c?q``:q`with published as (
|
|
2
|
-
insert into ${d} (agent_id, version, definition, system_prompt, files, commit, imported_from, created_at)
|
|
3
|
-
values (${i.id}, ${l.version}, ${JSON.stringify(l.definition)}::jsonb, ${l.systemPrompt},
|
|
4
|
-
${l.files?JSON.stringify(l.files):null}::jsonb, ${l.commit??null}, ${l.importedFrom}, ${A(l.createdAt).toISOString()}::timestamptz)
|
|
5
|
-
returning version
|
|
6
|
-
)`;return await r.execute(q`${f} update ${m} set
|
|
7
|
-
name = ${u.name}, description = ${u.description??null}, source = ${u.source},
|
|
8
|
-
repo = ${u.repo??null}, path = ${u.path??null},
|
|
9
|
-
current_version = ${c?q`${l.version}`:q`(select version from published)`}, updated_at = ${A(u.updatedAt).toISOString()}::timestamptz
|
|
10
|
-
where id = ${i.id}`),{record:u,version:l,unchanged:c}})}function oe(e){let t=m;return{key:t.slug,rows:async(n,r)=>{let i=e.db.select().from(t).where(I(e.mine(t.organizationId),n)).orderBy(L(t.slug));return(await(r===void 0?i:i.limit(r))).map(e=>({id:e.slug,value:w(e)}))},put:async(n,r)=>{let i={name:r.name,description:r.description??null,source:r.source,repo:r.repo??null,path:r.path??null,currentVersion:r.currentVersion,settings:r.settings??null,createdAt:A(r.createdAt),updatedAt:A(r.updatedAt)};await e.db.insert(t).values({organizationId:e.organizationId,slug:n,...i}).onConflictDoUpdate({target:[t.organizationId,t.slug],set:i})},delete:async n=>{await e.db.delete(t).where(I(e.mine(t.organizationId),R(t.slug,n)))}}}async function Y(e,t,n){let r=t.lastIndexOf(`:`);return(await e.db.insert(d).values({agentId:await k(e,t.slice(0,r)),version:Number(t.slice(r+1)),definition:n.definition,systemPrompt:n.systemPrompt,files:n.files??null,commit:n.commit??null,importedFrom:n.importedFrom,createdAt:A(n.createdAt)}).onConflictDoNothing().returning({id:d.id})).length>0}function se(e){let t=d,n=q`${m.slug} || ':' || lpad(${t.version}::text, 6, '0')`;return{key:n,split:(e,n,r)=>I(R(m.slug,e),n===void 0?void 0:r?R(t.version,n):z(t.version,n)),rows:async(r,i)=>{let a=e.db.select({row:t,slug:m.slug,key:n}).from(t).innerJoin(m,R(m.id,t.agentId)).where(I(e.mine(m.organizationId),r)).orderBy(L(m.slug),L(t.version));return(await(i===void 0?a:a.limit(i))).map(({row:e,slug:t,key:n})=>({id:n,value:N(e,t)}))},put:async(t,n)=>{await Y(e,t,n)},delete:async n=>{let r=n.lastIndexOf(`:`),i=await k(e,n.slice(0,r)).catch(()=>void 0);i!==void 0&&await e.db.delete(t).where(I(R(t.agentId,i),R(t.version,Number(n.slice(r+1)))))}}}const X=(e,t)=>b({id:e.key,integration:e.integration,agent:e.agent,name:e.name,agentsRepo:e.agentsRepo,branch:e.branch,builtin:e.organizationId===``||void 0,credentials:O(t),createdAt:S(e.createdAt)});function ce(e){let t=y;return{key:t.key,rows:async(n,r)=>{let i=e.db.select({row:t,sealed:a}).from(t).innerJoin(a,R(a.id,t.credentialsSecretId)).where(I(e.mine(t.organizationId),n)).orderBy(L(t.key));return(await(r===void 0?i:i.limit(r))).map(({row:e,sealed:t})=>({id:e.key,value:X(e,t)}))},put:(n,r)=>e.transaction(`app:${n}`,async e=>{let[i]=await e.db.select({secretId:t.credentialsSecretId,sealed:a}).from(t).innerJoin(a,R(a.id,t.credentialsSecretId)).where(I(e.mine(t.organizationId),R(t.key,n))),o=i?.secretId??await E(e,`app`,r.credentials);i&&O(i.sealed)!==r.credentials&&await C(e,o,r.credentials);let s={integration:r.integration,platformAppId:n.slice(n.indexOf(`:`)+1),agent:r.agent,name:r.name,agentsRepo:r.agentsRepo??null,branch:r.branch??null,credentialsSecretId:o,createdAt:A(r.createdAt),updatedAt:e.at()};await e.db.insert(t).values({organizationId:e.organizationId,key:n,...s}).onConflictDoUpdate({target:[t.organizationId,t.key],set:s})}),delete:n=>e.transaction(`app:${n}`,async e=>{let[r]=await e.db.delete(t).where(I(e.mine(t.organizationId),R(t.key,n))).returning({secretId:t.credentialsSecretId});r&&await e.db.delete(a).where(R(a.id,r.secretId))})}}function Z(e,t,n){return b({id:e.key,app:t.key,integration:t.integration,account:e.account,token:n?O(n):void 0,installer:e.installer,connections:e.connections,settings:e.settings,createdAt:S(e.createdAt),deletedAt:e.deletedAt?S(e.deletedAt):void 0})}function le(e){let t=j;return{key:t.key,rows:async(n,r)=>{let i=e.db.select({row:t,app:{key:y.key,integration:y.integration},sealed:a}).from(t).innerJoin(y,R(y.id,t.appId)).leftJoin(a,R(a.id,t.tokenSecretId)).where(I(e.mine(t.organizationId),n)).orderBy(L(t.key));return(await(r===void 0?i:i.limit(r))).map(({row:e,app:t,sealed:n})=>({id:e.key,value:Z(e,t,n)}))},put:(n,r)=>e.transaction(`installation:${n}`,async e=>{let[i]=await e.db.select({secretId:t.tokenSecretId,organizationId:t.organizationId,sealed:a}).from(t).leftJoin(a,R(a.id,t.tokenSecretId)).where(R(t.key,n)),o=()=>Error(`Installation "${n}" belongs to another workspace.`);if(i&&i.organizationId!==e.organizationId)throw o();let s=i?.secretId??null;r.token&&(s?(!i?.sealed||O(i.sealed)!==r.token)&&await C(e,s,r.token):s=await E(e,`installation`,r.token));let c={appId:await D(e,r.app),platformInstallId:n.slice(r.app.length+1),account:r.account,tokenSecretId:r.token?s:null,installer:r.installer??null,connections:r.connections??null,settings:r.settings??null,createdAt:A(r.createdAt),updatedAt:e.at(),deletedAt:r.deletedAt===void 0?null:A(r.deletedAt)},[l]=await e.db.insert(t).values({organizationId:e.organizationId,key:n,...c}).onConflictDoUpdate({target:t.key,set:c,setWhere:e.mine(t.organizationId)}).returning({id:t.id});if(!l)throw o();!r.token&&i?.secretId&&await e.db.delete(a).where(R(a.id,i.secretId))}),delete:n=>e.transaction(`installation:${n}`,async e=>{let[r]=await e.db.delete(t).where(I(e.mine(t.organizationId),R(t.key,n))).returning({secretId:t.tokenSecretId});r?.secretId&&await e.db.delete(a).where(R(a.id,r.secretId))})}}async function ue(e,t){let n=J(j,`locked`),[r]=await e.db.select({row:n,app:{key:y.key,integration:y.integration},sealed:a}).from(n).innerJoin(y,R(y.id,n.appId)).leftJoin(a,R(a.id,n.tokenSecretId)).where(I(e.mine(n.organizationId),R(n.key,t))).for(`update`,{of:n});return r&&Z(r.row,r.app,r.sealed)}const Q=(e,t)=>b({iv:t.iv,tag:t.tag,ciphertext:t.ciphertext,engine:e.engine,owner:e.owner,account:e.account,isDefault:e.isDefault,createdAt:S(e.createdAt)}),de=(e,t)=>`credential:${JSON.stringify([e.organizationId,t??null])}`;async function fe(t,n){let r=i;return(await t.db.select({row:r,sealed:a}).from(r).innerJoin(a,R(a.id,r.secretId)).where(I(t.mine(r.organizationId),n?R(r.owner,n):U(r.owner))).orderBy(L(r.label)).for(`update`)).map(({row:t,sealed:n})=>({id:e(t.owner??void 0,t.label),value:Q(t,n),row:t,sealed:n}))}async function pe(e,n,r,o){let s=i;if(!o){if(!n)return;await e.db.delete(s).where(R(s.id,n.row.id)),await e.db.delete(a).where(R(a.id,n.row.secretId));return}let c=O(o),l={engine:o.engine,isDefault:o.isDefault??!1,account:o.account??null,createdAt:o.createdAt===void 0?n?.row.createdAt??e.at():A(o.createdAt),updatedAt:e.at()};if(n){O(n.sealed)!==c&&await C(e,n.row.secretId,c),await e.db.update(s).set(l).where(R(s.id,n.row.id));return}let{owner:u,label:d}=t(r);await e.db.insert(s).values({organizationId:e.organizationId,owner:u??null,label:d,secretId:await E(e,`engine`,c),...l})}function me(n){let r=i,o=(e,r)=>{let{owner:i}=t(e);return n.transaction(de(n,i),async t=>pe(t,(await fe(t,i)).find(t=>t.id===e),e,r))};return{key:q`coalesce(${r.owner} || '/', '') || ${r.label}`,rows:async(t,i)=>{let o=n.db.select({row:r,sealed:a}).from(r).innerJoin(a,R(a.id,r.secretId)).where(I(n.mine(r.organizationId),t)).orderBy(L(r.owner),L(r.label));return(await(i===void 0?o:o.limit(i))).map(({row:t,sealed:n})=>({id:e(t.owner??void 0,t.label),value:Q(t,n)}))},put:(e,t)=>o(e,t),delete:e=>o(e,null)}}function $(e,t){let n=c,r=te(e.organizationId,t),i=n.key;return{key:i,where:e=>I(e.id===void 0?q`${n.key} like ${`${T(r+(e.prefix??``))}%`}`:R(n.key,r+e.id),e.after===void 0?void 0:z(n.key,r+e.after)),rows:async(t,a)=>{let o=e.db.select({id:i,value:q`${n.value}`}).from(n).where(I(q`${n.key} like ${`${T(r)}%`}`,e.live(n.expiresAt),t)).orderBy(L(n.key));return(await(a===void 0?o:o.limit(a))).map(e=>({id:e.id.slice(r.length),value:e.value}))},put:async(i,a,o)=>{let s=t===`login`?o??e.at():o;await e.db.insert(n).values({key:r+(t===`config`?`workspace`:i),value:a,expiresAt:t===`config`?null:s}).onConflictDoUpdate({target:n.key,set:{value:a,expiresAt:t===`config`?null:t===`login`&&!o?q`${n.expiresAt}`:s}})},delete:async i=>{await e.db.delete(n).where(R(n.key,r+(t===`config`?`workspace`:i)))}}}function he(e){let t=l,n=n=>I(e.mine(t.organizationId),R(t.publicId,n));return{key:t.publicId,rows:async(n,r)=>{let i=e.db.select({row:t,sealed:a}).from(t).innerJoin(a,R(a.id,t.secretId)).where(I(e.mine(t.organizationId),n)).orderBy(L(t.publicId));return(await(r===void 0?i:i.limit(r))).map(({row:e,sealed:t})=>({id:e.publicId,value:b({name:e.name,owner:e.owner,kind:e.kind,scope:e.scope,config:e.config,createdBy:e.createdBy,default:e.isDefault,lastSeen:e.lastSeen?S(e.lastSeen):void 0,secret:O(t),createdAt:S(e.createdAt),updatedAt:S(e.updatedAt)})}))},put:(r,i)=>e.transaction(`runner:${e.organizationId}:${r}`,async e=>{let[o]=await e.db.select({id:t.id,secretId:t.secretId,sealed:a}).from(t).innerJoin(a,R(a.id,t.secretId)).where(n(r)),s={owner:i.owner??null,name:i.name,kind:i.kind,scope:i.scope,config:i.config,createdBy:i.createdBy??null,isDefault:i.default,lastSeen:i.lastSeen===void 0?null:A(i.lastSeen),updatedAt:A(i.updatedAt)};if(o){O(o.sealed)!==i.secret&&await C(e,o.secretId,i.secret),await e.db.update(t).set(s).where(R(t.id,o.id));return}await e.db.insert(t).values({organizationId:e.organizationId,publicId:r,secretId:await E(e,`runner`,i.secret),createdAt:A(i.createdAt),...s})}),delete:r=>e.transaction(`runner:${e.organizationId}:${r}`,async e=>{let[i]=await e.db.delete(t).where(n(r)).returning({secretId:t.secretId});i&&await e.db.delete(a).where(R(a.id,i.secretId))})}}function ge(e){let t=f;return{key:t.publicId,rows:async(n,r)=>{let i=e.db.select().from(t).where(I(e.mine(t.organizationId),n)).orderBy(L(t.publicId));return(await(r===void 0?i:i.limit(r))).map(e=>({id:e.publicId,value:ee(e)}))},put:async(n,r)=>{let{task:i}=r,a={source:i.source,status:r.status,agent:i.agent,flow:i.flow,runner:i.runner,permissions:i.permissions??null,appId:i.event?await D(e,i.event.appId):null,installationId:i.event?await x(e,`${i.event.appId}:${i.event.installationId}`):null,event:i.event??null,prompt:i.prompt??null,args:i.args??null,mcp:i.mcp??null,author:i.author??null,definition:i.definition,credential:i.credential??null,requester:i.requester??null,runnerId:i.runnerId??null,usage:i.usage??null,tools:i.tools,toolScopes:i.toolScopes??null,context:i.context??null,files:i.files??null,result:r.result??null,error:r.error??null,tokens:r.tokens??null,handle:r.handle??null,tokenHash:r.tokenHash??null,lastSeenAt:r.lastSeenAt===void 0?null:A(r.lastSeenAt),logCursor:r.logCursor??null,logSeq:r.logSeq??null,logBytes:r.logBytes??null,archivedAt:r.archivedAt===void 0?null:A(r.archivedAt),approval:r.approval??null,answer:r.answer??null,attempts:r.attempts,generation:r.generation??0,inboxSeq:r.inboxSeq??-1,inboxAck:r.inboxAck?.generation===(r.generation??0)?r.inboxAck.seq:-1,createdAt:A(r.createdAt),startedAt:r.startedAt===void 0?null:A(r.startedAt),finishedAt:r.finishedAt===void 0?null:A(r.finishedAt),cancelRequestedAt:r.cancelRequestedAt===void 0?null:A(r.cancelRequestedAt),updatedAt:A(r.updatedAt)};await e.db.insert(t).values({organizationId:e.organizationId,publicId:n,...a}).onConflictDoUpdate({target:[t.organizationId,t.publicId],set:{...a,archivedAt:q`coalesce(${t.archivedAt}, ${a.archivedAt})`}})},delete:async n=>{await e.db.delete(t).where(I(e.mine(t.organizationId),R(t.publicId,n)))}}}function _e(e){let t=s,n=q`${f.publicId} || ':' || lpad(${t.seq}::text, 6, '0')`;return{key:n,split:(n,r,i)=>I(e.mine(f.organizationId),R(f.publicId,n),r===void 0?void 0:i?R(t.seq,r):z(t.seq,r)),rows:async(r,i)=>{let a=e.db.select({row:t,key:n}).from(t).innerJoin(f,R(f.id,t.taskId)).where(I(e.mine(t.organizationId),r)).orderBy(L(f.publicId),L(t.seq));return(await(i===void 0?a:a.limit(i))).map(({row:e,key:t})=>({id:t,value:{at:S(e.at),level:e.level,line:e.line}}))},put:async(n,r)=>{let i=n.lastIndexOf(`:`),a={at:A(r.at),level:r.level,line:r.line};await e.db.insert(t).values({organizationId:e.organizationId,taskId:await P(e,n.slice(0,i)),seq:Number(n.slice(i+1)),...a}).onConflictDoUpdate({target:[t.taskId,t.seq],set:a})},delete:async n=>{let r=n.lastIndexOf(`:`),i=await P(e,n.slice(0,r)).catch(()=>void 0);i!==void 0&&await e.db.delete(t).where(I(R(t.taskId,i),R(t.seq,Number(n.slice(r+1)))))}}}function ve(e){let t=u,n=q`${f.publicId} || ':' || lpad(${t.seq}::text, 8, '0')`;return{key:n,split:(n,r,i)=>I(e.mine(f.organizationId),R(f.publicId,n),r===void 0?void 0:i?R(t.seq,r):z(t.seq,r)),rows:async(r,i)=>{let a=e.db.select({row:t,key:n}).from(t).innerJoin(f,R(f.id,t.taskId)).where(I(e.mine(t.organizationId),r)).orderBy(L(f.publicId),L(t.seq));return(await(i===void 0?a:a.limit(i))).map(({row:e,key:t})=>({id:t,value:{seq:e.seq,generation:e.generation,at:S(e.at),kind:e.kind,value:e.value}}))},put:async(n,r)=>{let i=n.lastIndexOf(`:`);await e.db.insert(t).values({organizationId:e.organizationId,taskId:await P(e,n.slice(0,i)),seq:r.seq,generation:r.generation,kind:r.kind,value:r.value,at:A(r.at)})},delete:async n=>{let r=n.lastIndexOf(`:`),i=await P(e,n.slice(0,r)).catch(()=>void 0);i!==void 0&&await e.db.delete(t).where(I(R(t.taskId,i),R(t.seq,Number(n.slice(r+1)))))}}}function ye(e){let t=o;return{key:f.publicId,rows:async(n,r)=>{let i=e.db.select({row:t,taskId:f.publicId,installationId:j.key}).from(t).innerJoin(f,R(f.id,t.taskId)).leftJoin(j,R(j.id,t.installationId)).where(I(e.mine(t.organizationId),n)).orderBy(L(f.publicId));return(await(r===void 0?i:i.limit(r))).map(({row:e,taskId:t,installationId:n})=>({id:t,value:b({installationId:n,taskId:t,agent:e.agent,target:e.target,engine:e.engine,model:e.model,credential:e.credential,runnerElapsedMs:e.runnerMs,tokens:e.tokens,at:S(e.at)})}))},put:async(n,r)=>{let i=await P(e,n),a={installationId:r.installationId?await x(e,r.installationId):null,agent:r.agent,target:r.target,engine:r.engine??null,model:r.model??null,credential:r.credential,runnerMs:r.runnerElapsedMs,tokens:r.tokens??null,at:A(r.at),updatedAt:e.at()};await e.db.insert(t).values({organizationId:e.organizationId,taskId:i,...a}).onConflictDoUpdate({target:t.taskId,set:a})},delete:async n=>{let r=await P(e,n).catch(()=>void 0);r!==void 0&&await e.db.delete(t).where(R(t.taskId,r))}}}var be=class u{db;organizationId;now;encryption;publishAgent=(e,t)=>ae(this,e,t);kinds;constructor(e,t,n=Date.now,r={}){this.db=e,this.organizationId=t,this.now=n,this.encryption=r,this.kinds={agent:oe(this),agentversion:se(this),app:ce(this),installation:le(this),credential:me(this),task:ge(this),tasklog:_e(this),inbox:ve(this),usage:ye(this),delivery:$(this,`delivery`),note:$(this,`note`),login:$(this,`login`),config:$(this,`config`),runner:he(this),snapshot:$(this,`snapshot`)}}static async webhookTarget(e,t,n){let r=J(a,`installation_secret`),[i]=await h(e,()=>e.select({app:y,credentials:a,installation:j,token:r}).from(y).innerJoin(a,R(a.id,y.credentialsSecretId)).leftJoin(j,I(R(j.appId,y.id),R(j.key,n??``),U(j.deletedAt))).leftJoin(r,R(r.id,j.tokenSecretId)).where(I(R(y.integration,t.slice(0,t.indexOf(`:`))),R(y.platformAppId,t.slice(t.indexOf(`:`)+1)))));return i&&{organizationId:i.app.organizationId,app:X(i.app,i.credentials),...i.installation?{bound:{organizationId:i.installation.organizationId,installation:Z(i.installation,i.app,i.token)}}:{}}}static async appRecord(e,t){let[n]=await h(e,()=>e.select({row:y,sealed:a}).from(y).innerJoin(a,R(a.id,y.credentialsSecretId)).where(I(R(y.integration,t.slice(0,t.indexOf(`:`))),R(y.platformAppId,t.slice(t.indexOf(`:`)+1)))));return n&&{organizationId:n.row.organizationId,app:X(n.row,n.sealed)}}static async installationOrganization(e,t){let[n]=await h(e,()=>e.select({organizationId:j.organizationId}).from(j).where(R(j.key,t)));return n?.organizationId}static async installations(e,t){return h(e,()=>e.select({key:j.key,organizationId:j.organizationId}).from(j).where(I(q`${j.key} like ${`${T(t)}:%`}`,U(j.deletedAt))))}static async taskOrganization(e,t,n){let[r]=await h(e,()=>e.select({organizationId:f.organizationId}).from(f).where(I(R(f.publicId,t),R(f.tokenHash,n))));return r?.organizationId}async getApps(e){return e.length?(await h(this.db,()=>this.db.select({row:y,sealed:a}).from(y).innerJoin(a,R(a.id,y.credentialsSecretId)).where(I(H(y.organizationId,[this.organizationId,``]),H(y.key,e))))).map(e=>({id:e.row.key,value:X(e.row,e.sealed)})):[]}async listCredentials(t){let n=i;return(await h(this.db,()=>this.db.select({row:n,sealed:a}).from(n).innerJoin(a,R(a.id,n.secretId)).where(I(this.mine(n.organizationId),t.owner?K(U(n.owner),R(n.owner,t.owner)):U(n.owner),t.engine?R(n.engine,t.engine):void 0)).orderBy(L(n.owner),L(n.label)))).map(({row:t,sealed:n})=>({id:e(t.owner??void 0,t.label),value:Q(t,n)}))}async updateMetadata(e,t,n){let r=e===`app`?y:e===`installation`?j:l,i=e===`app`?[`name`,`agentsRepo`,`branch`]:e===`installation`?[`account`,`connections`,`settings`,`deletedAt`]:[`name`,`config`,`lastSeen`,`updatedAt`];if(Object.keys(n).some(e=>!i.includes(e)))throw Error(`Invalid metadata fields`);let a=Object.fromEntries(Object.entries(n).map(([e,t])=>[e,t===void 0?null:[`deletedAt`,`updatedAt`,`lastSeen`].includes(e)?A(t):t])),o=e===`runner`?l.publicId:e===`app`?y.key:j.key,[s]=await this.db.update(r).set({...a,updatedAt:typeof n.updatedAt==`number`?A(n.updatedAt):this.at()}).where(I(this.mine(r.organizationId),R(o,t))).returning({id:r.id});return!!s}withAppLock(e,t){return this.transaction(`app:${e}`,t)}withConfigLock(e){return this.db.transaction(async t=>{let n=M(this.organizationId,`config`,`workspace`);return await t.insert(c).values({key:n,value:{},expiresAt:null}).onConflictDoNothing(),await t.select({key:c.key}).from(c).where(R(c.key,n)).for(`update`),e(new u(t,this.organizationId,this.now,this.encryption))})}transaction(e,t){return this.db.transaction(async n=>(await n.execute(q`select pg_advisory_xact_lock(3, hashtext(${e}))`),t(new u(n,this.organizationId,this.now,this.encryption))))}withCredential(e,n,i){if(e===`runner`)return this.withAppLock(`runners:${this.organizationId}`,e=>r(e,`runner`,n,i));if(e===`installation`)return this.transaction(`installation:${n}`,async e=>{let t=await ue(e,n),r=await i(t,t?[{id:n,value:t}]:[],e);for(let t of r??[])t.value===null?await e.delete(`installation`,t.id):await e.put(`installation`,t.id,t.value);return!!r?.length});let{owner:a}=t(n);return this.transaction(de(this,a),async e=>{let t=await fe(e,a),r=t.map(({id:e,value:t})=>({id:e,value:t})),o=await i(r.find(e=>e.id===n)?.value,r,e);for(let n of o??[])await pe(e,t.find(e=>e.id===n.id),n.id,n.value);return!!o?.length})}at(){return A(this.now())}live(e){return K(U(e),z(e,this.at()))}mine(e){return R(e,this.organizationId)}async get(e,t){let n=this.kinds[e],r=v(t),i=n.where?n.where({id:t}):n.split&&r?n.split(r[0],r[1],!0):q`${n.key} = ${t}`,a=(await h(this.db,async()=>await n.rows(i,1)))[0]?.value;return a||e!==`app`||this.organizationId===``?a:new u(this.db,``,this.now,this.encryption).get(e,t)}async patchLogin(e,t,n={}){let[r]=await this.db.update(c).set({value:q`jsonb_strip_nulls(${c.value} || ${JSON.stringify(t)}::jsonb)`}).where(I(R(c.key,M(this.organizationId,`login`,e)),this.live(c.expiresAt),q`(${c.value}->>'expiresAt')::bigint > ${this.now()}`,...Object.entries(n).map(([e,t])=>Array.isArray(t)?H(q`${c.value}->>${e}`,t):q`${c.value}->>${e} = ${t}`))).returning({value:q`${c.value}`});return r?.value}completeLogin(e,t,r,i){return n(this,e,t,r,i)}async taskInputs(t,n,r){let a=q`coalesce(${r??null}, ${m.settings}->>'engine', ${d.definition}->>'engine')`,o=this.db.select({owner:i.owner,label:i.label}).from(i).where(I(this.mine(i.organizationId),n?K(U(i.owner),R(i.owner,n)):U(i.owner),q`(${a} is null or ${i.engine} = ${a})`)).orderBy(q`${i.owner} is not null desc`,ie(i.isDefault),L(i.label)).limit(1).as(`selected_credential`),[s]=await h(this.db,()=>this.db.select({record:m,version:d,credentialLabel:o.label,credentialOwner:o.owner}).from(m).leftJoin(d,I(R(d.agentId,m.id),R(d.version,m.currentVersion))).leftJoinLateral(o,q`true`).where(I(this.mine(m.organizationId),R(m.slug,t))));return s?{record:w(s.record),...s.version?{version:N(s.version,s.record.slug)}:{},...s.credentialLabel?{credential:e(s.credentialOwner??void 0,s.credentialLabel)}:{}}:{}}async listAgentsWithVersions(e){return(await h(this.db,()=>this.db.select({record:m,version:d}).from(m).leftJoin(d,I(R(d.agentId,m.id),R(d.version,m.currentVersion))).where(I(this.mine(m.organizationId),e===void 0?void 0:R(m.slug,e))).orderBy(L(m.slug)))).map(({record:e,version:t})=>({record:w(e),...t?{version:N(t,e.slug)}:{}}))}async listAgentSummaries(e={}){let t=e.q?`%${T(e.q)}%`:void 0,n=this.db.select({record:m,version:_}).from(m).leftJoin(d,I(R(d.agentId,m.id),R(d.version,m.currentVersion))).where(I(this.mine(m.organizationId),e.slug===void 0?void 0:R(m.slug,e.slug),e.after?z(m.slug,e.after):void 0,e.source?R(m.source,e.source):void 0,t?K(V(m.slug,t),V(m.name,t),V(m.description,t),V(m.repo,t)):void 0,e.platform?q`${d.definition}->'integrations' ? ${e.platform}`:void 0)).orderBy(L(m.slug));return(await h(this.db,()=>e.limit===void 0?n:n.limit(e.limit))).map(({record:e,version:t})=>({record:w(e),...t?{version:g(t,e.slug)}:{}}))}async listVersions(e,t,n){let r=this.db.select({version:_}).from(d).innerJoin(m,R(m.id,d.agentId)).where(I(this.mine(m.organizationId),R(m.slug,e),n===void 0?t===void 0?void 0:G(d.version,m.currentVersion):W(d.version,n),t===void 0?void 0:B(d.version,n===void 0?q`${m.currentVersion} + 1 - ${t}`:n-t))).orderBy(L(d.version));return(await h(this.db,()=>r)).map(({version:t})=>({id:`${e}:${String(t.version).padStart(6,`0`)}`,value:g(t,e)}))}async put(e,t,n,r={}){let i=r.ttlMs===void 0?null:A(this.now()+r.ttlMs);await this.kinds[e].put(t,n,i)}async putMany(e,t){if(!t.length)return;if(e!==`tasklog`){await Promise.all(t.map(t=>this.put(e,t.id,t.value)));return}let n=t[0].id.lastIndexOf(`:`),r=t[0].id.slice(0,n),i=t.map(e=>{let t=e.id.lastIndexOf(`:`),n=e.value;if(e.id.slice(0,t)!==r)throw Error(`A log batch must belong to one task`);return{organizationId:this.organizationId,taskId:q`(select ${f.id} from ${f} where ${f.organizationId} = ${this.organizationId} and ${f.publicId} = ${r})`,seq:Number(e.id.slice(t+1)),at:A(n.at),level:n.level,line:n.line}});await this.db.insert(s).values(i).onConflictDoUpdate({target:[s.taskId,s.seq],set:{at:q`excluded.at`,level:q`excluded.level`,line:q`excluded.line`}})}async list(e,t={}){let n=this.kinds[e];if(n.where)return h(this.db,async()=>await n.rows(n.where(t),t.limit));let r=t.prefix?.endsWith(`:`)?t.prefix.slice(0,-1):void 0,i=t.after===void 0?void 0:v(t.after);if(n.split&&r&&!r.includes(`:`)&&(t.after===void 0||i?.[0]===r))return h(this.db,async()=>await n.rows(n.split(r,i?.[1]),t.limit));let a=t.prefix?q`${n.key} like ${`${T(t.prefix)}%`}`:void 0,o=t.after?q`${n.key} > ${t.after}`:void 0,s=a&&o?I(a,o):a??o;return h(this.db,async()=>await n.rows(s,t.limit))}async delete(e,t){await this.kinds[e].delete(t)}async create(e,t,n,r={}){if(e===`agentversion`)return Y(this,t,n);if(e!==`delivery`)throw Error(`Atomic create is not supported for ${e}`);let i=r.ttlMs===void 0?null:A(this.now()+r.ttlMs);return(await this.db.insert(c).values({key:M(this.organizationId,e,t),value:n,expiresAt:i}).onConflictDoUpdate({target:c.key,set:{value:n,expiresAt:i},setWhere:G(c.expiresAt,this.at())}).returning({key:c.key})).length>0}async claimDeliveryLease(e,t,n){let r=q`clock_timestamp() + ${n}::int * interval '1 millisecond'`,[i]=await this.db.insert(c).values({key:M(this.organizationId,`delivery`,e),value:{owner:t,failures:0},expiresAt:r}).onConflictDoUpdate({target:c.key,set:{value:q`${c.value} || ${JSON.stringify({owner:t})}::jsonb`,expiresAt:r},setWhere:q`${c.expiresAt} <= clock_timestamp()`}).returning({value:c.value});return i?i.value.failures:void 0}async updateDeliveryLease(e,t,n,r={ttlMs:3e4}){let i=I(R(c.key,M(this.organizationId,`delivery`,e)),q`${c.value}->>'owner' = ${t} and ${c.expiresAt} > clock_timestamp()`),a=q`clock_timestamp() + ${r.ttlMs}::int * interval '1 millisecond'`;return(n===void 0?await this.db.delete(c).where(i).returning({key:c.key}):await this.db.update(c).set({value:n.next===void 0?n:q`${JSON.stringify(n)}::jsonb || jsonb_build_object('next', floor(extract(epoch from (${a})) * 1000))`,expiresAt:a}).where(i).returning({key:c.key})).length>0}async updateDelivery(e,t,n,r={}){let i=I(R(c.key,M(this.organizationId,`delivery`,e)),q`${c.value}->>'owner' = ${t}`,this.live(c.expiresAt));return(n===void 0?await this.db.delete(c).where(i).returning({key:c.key}):await this.db.update(c).set({value:n,expiresAt:r.ttlMs===void 0?null:A(this.now()+r.ttlMs)}).where(i).returning({key:c.key})).length>0}async take(e,t){return e===`delivery`?(await this.db.delete(c).where(I(R(c.key,M(this.organizationId,e,t)),this.live(c.expiresAt))).returning({key:c.key})).length>0:await this.get(e,t)!==void 0&&(await this.delete(e,t),!0)}async usageTotals(e){let t=o,n=e.by===`agent`?q`${t.agent}`:e.by===`engine`?q`coalesce(${t.engine}, 'unknown')`:e.by===`installation`?q`coalesce(${j.key}, 'none')`:q`to_char(${t.at} at time zone ${ne(e.tz)}, 'YYYY-MM-DD')`,r=I(this.mine(t.organizationId),B(t.at,A(e.since)),e.until===void 0?void 0:W(t.at,A(e.until)),e.agent?R(t.agent,e.agent):void 0),i=q`coalesce(
|
|
11
|
-
case when jsonb_typeof(${t.tokens} -> 'total') = 'number' then (${t.tokens} ->> 'total')::numeric end,
|
|
12
|
-
(select sum((v #>> '{}')::numeric)
|
|
13
|
-
from jsonb_path_query(coalesce(${t.tokens}, 'null'::jsonb), 'strict $.**') v
|
|
14
|
-
where jsonb_typeof(v) = 'number')
|
|
15
|
-
)`,a={tasks:q`count(*)`,runnerMs:q`coalesce(sum(${t.runnerMs}), 0)`,tokenCount:q`coalesce(sum(${i}), 0)`},s=e.top?q`case when ${t.agent} in (
|
|
16
|
-
select ${t.agent} from ${t} where ${r} group by ${t.agent}
|
|
17
|
-
order by ${a[e.top.by]} desc, ${t.agent} limit ${e.top.count}
|
|
18
|
-
) then ${t.agent} end`:e.parts?.length?q`case when ${H(t.agent,e.parts)} then ${t.agent} end`:q`null::text`,c=e.by===`installation`?q`left join ${j} on ${j.id} = ${t.installationId}`:q``,l=await h(this.db,()=>this.db.execute(q`
|
|
19
|
-
select ${n} as key, ${s} as part, ${a.tasks}::int as tasks,
|
|
20
|
-
${a.runnerMs}::float8 as runner_ms,
|
|
21
|
-
${a.tokenCount}::float8 as token_count
|
|
22
|
-
from ${t} ${c}
|
|
23
|
-
where ${r}
|
|
24
|
-
group by 1, 2
|
|
25
|
-
`)),u=Array.isArray(l)?l:l.rows,d=new Map;for(let e of u){let t={tasks:Number(e.tasks),runnerMs:Number(e.runner_ms),tokenCount:Number(e.token_count)},n=d.get(e.key)??{key:e.key,tasks:0,runnerMs:0,tokenCount:0};re(n,t),e.part&&((n.parts??={})[e.part]=t),d.set(e.key,n)}return[...d.values()].sort((e,t)=>e.key.localeCompare(t.key))}async sweep(e=1e3){if(!Number.isInteger(e)||e<1)throw Error(`Sweep batch must be positive`);let t=this.at().toISOString();await this.db.execute(q`
|
|
26
|
-
with expired_state as (
|
|
27
|
-
delete from ${c} where expires_at <= clock_timestamp() and key in (
|
|
28
|
-
select key from ${c} where expires_at <= clock_timestamp() order by expires_at limit ${e}
|
|
29
|
-
)
|
|
30
|
-
), lists as (
|
|
31
|
-
select expired.key from ${p} as expired
|
|
32
|
-
where expired.key like 'k:%' and expired.expires_at <= ${t}::timestamptz
|
|
33
|
-
and not exists (select 1 from ${p} as newer where newer.key = expired.key and newer.seq > expired.seq)
|
|
34
|
-
order by expired.expires_at limit ${e}
|
|
35
|
-
), expired_items as (
|
|
36
|
-
select key, seq from ${p} where key in (select key from lists) order by seq limit ${e}
|
|
37
|
-
), expired_queue as (
|
|
38
|
-
select key, seq from ${p} where key like 'q:%' and expires_at <= ${t}::timestamptz order by expires_at limit ${e}
|
|
39
|
-
)
|
|
40
|
-
delete from ${p} where (key, seq) in (
|
|
41
|
-
select key, seq from expired_items union all select key, seq from expired_queue
|
|
42
|
-
)`)}};export{be as DrizzleStore};
|
package/dist/task-C6VAg5WU.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{En as t,Et as n,Ht as r,It as i,Lt as a,Mt as o,Qt as s,Rt as c,Ut as l,Wt as u,a as d,c as f,cn as p,g as m,h,i as g,ln as _,m as v,nt as y,o as b,on as x,p as S,r as C,t as w,wt as T,x as E,xt as D,zt as O}from"./dispatch-BKeAch9E.js";import{n as k}from"./remote-miQNTVRa.js";import{a as A,c as j,i as ee,l as M,n as N,r as P,s as F}from"./actions-Mk3FSlpJ.js";import I from"node:path";import L from"node:process";var R=e({tasks:()=>$});function z(e){return{cwd:e.cwd?I.resolve(e.cwd):L.cwd(),...e.server===void 0?{}:{api:k(e)}}}function B(e,t){let n=o(e,t);if(n)return n;throw new D(`invalid-option`,t?`No task found for "${t}".`:`No tasks found for this workspace.`,{hint:t?[`List tasks: coder task list`,`Start one: coder run "<text>"`]:[`Start one: coder run "<text>"`]})}async function V(e,t){if(t)return e.tasks.get(t);let[n]=await e.tasks.list({limit:1});if(!n)throw new D(`server`,`No server tasks found.`);return n}function H(e){throw new D(`invalid-option`,`Missing task id.`,{hint:e})}async function U(e,t={}){if(t.outputSchema!==void 0&&(!t.outputSchema||typeof t.outputSchema!=`object`||Array.isArray(t.outputSchema)))throw new D(`invalid-option`,`outputSchema must be an object.`);let{cwd:n,api:r}=z(t);if(r){let n=t.resume?await r.tasks.continue(t.resume,e,{outputSchema:t.outputSchema}):await r.tasks.create({source:`cli`,prompt:e,...t.cwd?{cwd:t.cwd}:{},...t.outputSchema?{outputSchema:t.outputSchema}:{},...t.repo?{repo:t.repo}:{},...t.agent?{agent:t.agent}:{},...t.engine?{engine:t.engine}:{},...t.model?{model:t.model}:{},...t.effort?{effort:t.effort}:{},...t.permissions?{permissions:t.permissions}:{},...t.runner?{runner:t.runner}:{},...t.mcp?{mcp:t.mcp.split(`,`).map(e=>e.trim())}:{}});return t.wait?r.tasks.wait(n.task.id,{onLog:t.onLog}):n}let i=t.agent?await(await import(`./exec-RZFLclKX.js`).then(e=>e.i)).agentTaskOptions(n,t.agent,t.mcp):void 0,a={...h({prompt:e,outputSchema:t.outputSchema,cwd:n,cwdExplicit:!!t.cwd,engine:t.engine??i?.engine,model:t.model??(t.engine?void 0:i?.model),effort:t.effort??(t.engine?void 0:i?.effort),permissions:t.permissions??i?.permissions,name:t.name,system:t.system??i?.system,resume:t.resume,wait:t.wait,simulateApproval:t.simulateApproval,addDirs:t.addDirs}),...t.agent?{agentId:t.agent}:{},mcp:i?.mcp??(t.mcp?b(t.mcp,y(n).mcp):void 0),...t.onFallback?{onFallback:t.onFallback}:{},...t.onNote?{onNote:t.onNote}:{}},o=await C(a);if(!t.wait){let e=o.taskId;return{taskId:e,status:o.task.status,startupCheck:o.startupCheck,commands:{result:`coder task result ${e} --wait`,steer:`coder task steer ${e} "<follow-up>"`,stop:`coder task stop ${e}`,list:`coder task list`}}}for(;;){let r=o.taskId;t.onWaiting?.(r);let{task:i,result:s}=await v(n,r),c=s?.error?.message??``;if(i.status===`failed`&&g(i.permissions??`auto`,c))throw new D(`read-only-unavailable`,c);if(i.status===`failed`&&d(c)){let r=y(n).chain,s=r[r.indexOf(o.engine)+1];if(!s)throw new D(`chain-exhausted`,c,{payload:w(o.engine,c,i.permissions??`auto`,t.system,e)});t.onFallback?.({engine:o.engine,detail:c,next:s}),o=await C({...a,engine:s,model:void 0,effort:void 0,name:void 0,resume:void 0,simulateApproval:void 0});continue}return{taskId:r,status:i.status,finalMessage:s?.finalMessage,...c?{error:c}:{},tokens:s?.tokens??null,model:s?.model??i.model??null}}}async function W(e,t={}){let{cwd:n,api:a}=z(t);if(a){let n=await V(a,e);return t.wait?a.tasks.wait(n.task.id):n}let o=B(n,e);if(t.wait){p.includes(o.status)&&t.onWaiting?.(o.id);let e=await S(n,o);if(o=e.task,e.reason===`approval`)throw new D(`approval-pending`,`Approval needed for task ${o.id}: ${e.approval.summary}`,{taskId:o.id,approval:e.approval})}let{steps:c,result:u}=f(n,o.id,{tail:t.tail}),d=E(s(n,o.id)).filter(e=>!e.response),m=p.includes(o.status),h=m?i(n,o):o.updatedAt,g=T(h);return{taskId:o.id,status:m&&d.length?`waiting-approval`:o.status,task:o,result:u,steps:c,turns:l(n,o.id),pendingApprovals:d.map(e=>({id:e.id,summary:e.summary,cwd:e.cwd??null})),...m?{idleMs:g,lastActivityAt:h??null,stalled:d.length===0&&g>6e5,lastLog:r(n,o.id,1)[0],liveTokens:r(n,o.id,200).reverse().find(e=>e.kind===`usage`&&String(e.at??``)>=(o.resumedAt??``))?.tokens??null}:{}}}async function G(e={}){let{cwd:t,api:n}=z(e);if(n){let t=await n.tasks.list({status:e.running?`running`:void 0,limit:e.limit===`all`?200:e.limit,archived:e.archived});return e.stopped?t.filter(e=>_.includes(e.status)):t}let{tasks:r,clipped:o}=ee(t,{...e,dir:e.dir??e.cwd}),c=r.map(e=>{let n=p.includes(e.status)?E(s(t,e.id)).filter(e=>!e.response).length:0;return{taskId:e.id,status:n?`waiting-approval`:e.status,pendingApprovals:n,engine:e.engine??null,model:e.model??null,effort:e.effort??null,name:e.name??null,cwd:e.cwd??null,prompt:String(e.prompt??``).replace(/\s+/g,` `).trim().slice(0,80),updatedAt:e.updatedAt,archived:e.archived??!1,flowRunId:e.flowRunId??null,idleMs:p.includes(e.status)?T(i(t,e)):null}}),l=!c.length&&!e.archived?a(t,{migrate:!1}).length:0;return Object.assign(c,{clipped:o,archived:l})}async function*K(e,t){let n=-1;for(;;){let r=await e.tasks.get(t);for(let r of await e.tasks.logs(t,n))n=r.seq,yield r;if(_.includes(r.status))return;await new Promise(e=>setTimeout(e,1e3))}}async function q(e,n={}){let{cwd:r,api:i}=z(n);if(i){let t=await V(i,e);return{task:t,events:K(i,t.task.id),final:()=>i.tasks.get(t.task.id)}}let a=B(r,e);return{task:a,events:M(r,a.id,{tail:n.tail}),async final(){let e=u(r,O(r,a.id)??a),n=t(I.join(s(r,a.id),`result.json`));return{taskId:a.id,status:e.status,result:n,task:e}}}}async function J(e,n,r={}){let{cwd:i,api:a}=z(r);if(a)return a.tasks.steer(e,n);let o=await F(i,B(i,e),n,{model:r.model,effort:r.effort,permissions:r.permissions});if(!r.wait||o.steered===`queued`)return o;let c=O(i,o.taskId),l=c?await x(i,c):null,u=t(I.join(s(i,o.taskId),`result.json`));return{...o,status:l?.status??null,finalMessage:u?.finalMessage??null}}async function Y(e,t,n={}){let{cwd:r,api:i}=z(n);if(i)return i.tasks.ask(e,t);let a=B(r,e);n.onAsking?.(a.id);let o=await N(r,a,t,{model:n.model,effort:n.effort});return{taskId:a.id,answer:o.finalMessage||null,...o.error?{error:o.error.message}:{},ok:o.status===0}}async function X(e,t={}){let{cwd:n,api:r}=z(t);if(r)return(e?[await r.tasks.get(e)]:await r.tasks.list({limit:200})).flatMap(e=>e.approval?[{taskId:e.task.id,...e.approval}]:[]);if(!e)return P(n);let i=B(n,e);return E(s(n,i.id)).map(e=>({taskId:i.id,id:e.id,summary:e.summary,cwd:e.cwd??null,createdAt:e.createdAt,answered:e.response?.decision??null}))}async function Z(e,t,n={}){let{cwd:r,api:i}=z(n),a=n.deny?`decline`:`accept`;if(i){if(!e||!t)throw new D(`invalid-option`,`Server approvals need a task id and approval id.`,{hint:`Usage: coder task approve <task-id> <approval-id> --server <url>`});return i.tasks.approve(e,t,a)}if(e&&!t&&e.startsWith(`apr-`)&&(t=e,e=P(r).find(e=>e.id===t)?.taskId,!e))throw new D(`invalid-option`,`No pending approval "${t}".`,{hint:`List them: coder task approvals`});if(!e||!t)throw new D(`invalid-option`,`Missing approval id.`,{hint:[`List them: coder task approvals`,`Usage: coder task approve [task-id] <approval-id> [--deny]`]});let o=B(r,e);return m(s(r,o.id),t,a),{taskId:o.id,approvalId:t,decision:a}}async function Q(e,t={}){let{cwd:n,api:r}=z(t);if(r)return r.tasks.cancel(e??H([]));let i=B(n,e),{interrupt:a}=await j(n,i);return{taskId:i.id,status:`cancelled`,interrupt:a}}async function te(e,t={}){let{cwd:r,api:i}=z(t);if(i){let n=t.allStopped?(await i.tasks.list({limit:200})).filter(e=>_.includes(e.status)).map(e=>e.task.id):[e??H([])];return await Promise.all(n.map(e=>i.tasks.archive(e))),{archived:n,count:n.length}}if(t.allStopped){let e=c(r).filter(e=>_.includes(e.status));for(let t of e)n(r,t);return{archived:e.map(e=>e.id),count:e.length}}e||H([`Archive one: coder task archive <task-id>`,`Archive all stopped: coder task archive --all-stopped`]);let a=B(r,e);return n(r,a),{taskId:a.id,archived:!0}}async function ne(e,t={}){let{cwd:n,api:r}=z(t);if(r){let n=t.allArchived?(await r.tasks.list({limit:200,archived:!0})).map(e=>e.task.id):[e??H([])];return await Promise.all(n.map(e=>r.tasks.delete(e))),{deleted:n,count:n.length}}if(t.allArchived){let e=a(n).filter(e=>A(n,e)).map(e=>e.id);return{deleted:e,count:e.length}}e||H([`Delete one: coder task delete <task-id>`,`Delete all archived: coder task delete --all-archived`]);let i=B(n,e);if(i.status===`running`)throw new D(`invalid-option`,`Task ${i.id} is still running.`,{hint:`Stop it first: coder task stop ${i.id}`});return A(n,i),{taskId:i.id,deleted:!0}}async function*re(e,t={}){yield*(await q(e,t)).events}const $={run:U,result:W,list:G,watch:q,stream:re,steer:J,ask:Y,approvals:X,approve:Z,stop:Q,archive:te,delete:ne};export{$ as n,R as t};
|
package/dist/task-b2BK481M.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as e}from"./cli-DWCR7iqa.js";const t=[[`--wait`,`run in the foreground and block until the answer is ready`],[`--engine <codex|claude|custom>`,`engine to use; custom runs your configured custom models (default: first in the chain)`],[`--model <alias|slug>`,`luna/sol/astra (codex) · sonnet/opus/fable (claude) · a custom model (coder model list)`],[`--effort <low|medium|high>`,`reasoning effort`],[`--permissions <mode>`,`read-only · workspace-write · auto (default: auto)`],[`--resume <task-id>`,`continue that task's thread instead of a fresh run`],[`--mcp <names|all|json>`,'attach MCP servers from `mcp` in .coder/config.json by name (or all), or an inline JSON array [{"name","command","args","env","tools"}]'],[`--add-dir <dir>`,`give the task another directory beyond --cwd (repeatable); read-only can only read it, other modes can also write`]],n=e(`task`,{"archive-sweep":async()=>(await import(`./archive-sweep-Cxbh8yAI.js`)).commandArchiveSweep,worker:async()=>(await import(`./worker-DrucI22w.js`)).commandWorker,run:async()=>(await import(`./run-Dqe38jX8.js`)).commandTask,list:async()=>(await import(`./list-COAo7eZd.js`)).commandTasks,ls:async()=>(await import(`./list-COAo7eZd.js`)).commandTasks,watch:async()=>(await import(`./watch-BcMQXGYO.js`)).commandWatch,stream:async()=>(await import(`./watch-BcMQXGYO.js`)).commandWatch,result:async()=>(await import(`./result-D8DsvJDu.js`)).commandResult,steer:async()=>(await import(`./steer-P_38hRRD.js`)).commandSteer,ask:async()=>(await import(`./ask-BU2WVxVM.js`)).commandAsk,stop:async()=>(await import(`./stop-BJGDRPsp.js`)).commandStop,archive:async()=>(await import(`./archive-DZ6vpMHb.js`)).commandArchive,delete:async()=>(await import(`./delete-BD6AnCLg.js`)).commandDelete,approvals:async()=>(await import(`./approvals-DbVrsxec.js`)).commandApprovals,approve:async()=>(await import(`./approve-DeAhFL-m.js`)).commandApprove},{menu:[{sub:`run`,usage:`run "<text>"`,blurb:`run a task (background; --wait blocks)`,alias:`run`},{sub:`list`,usage:`list`,blurb:`list recent tasks (by default running + just stopped)`,alias:`list`},{sub:`result`,usage:`result [task-id]`,blurb:`status + final answer (--wait blocks)`,alias:`result`},{sub:`watch`,usage:`watch [task-id]`,blurb:`stream a task's live transcript`},{sub:`steer`,usage:`steer <task-id> "<follow-up>"`,blurb:`continue a task's thread`},{sub:`ask`,usage:`ask <task-id> "<question>"`,blurb:`ask about a task without interrupting it`},{sub:`stop`,usage:`stop <task-id>`,blurb:`interrupt a running task`},{sub:`archive`,usage:`archive <task-id>`,blurb:`archive a session (or --all-stopped)`},{sub:`delete`,usage:`delete <task-id>`,blurb:`delete a session (or --all-archived)`},{sub:`approvals`,usage:`approvals [task-id]`,blurb:`pending approvals (all tasks, or one)`},{sub:`approve`,usage:`approve <id>`,blurb:`answer an escalated permission`}].map(e=>({usage:e.usage,blurb:e.blurb,...e.alias?{note:`(coder ${e.alias})`}:{}}))},{aliases:{stream:`watch`,ls:`list`},hint:`Run a task: coder run "<text>"`});export{t as TASK_FLAGS,n as commandTaskGroup};
|
package/dist/worker-CXndxmGF.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import{F as e,I as t,J as n,M as r,O as i,On as a,Ot as o,Qt as s,S as c,Tt as l,_ as u,ft as d,in as f,l as p,mt as m,nt as h,pt as g,sn as _,tn as v,tt as y,ut as b,zt as x}from"./dispatch-BKeAch9E.js";import{t as S}from"./chat-bridge-BS9WtP3X.js";import{t as C}from"./wire-BeT1Axeo.js";import w from"node:path";import T from"node:process";import E from"node:fs";function D(e){if(e.resumeThreadId)return e.currentPrompt??e.prompt??``;let t=e.system?`\n-------\n${e.system}`:``;return`<system>
|
|
2
|
-
You are running inside a coder task: do the work yourself, directly.
|
|
3
|
-
Do not load the coder skill (recursive), and never dispatch through the \`coder\` CLI - nested dispatch is disabled.
|
|
4
|
-
When finished, provide a concise implementation result summary.
|
|
5
|
-
Your turn is one-shot: background processes will not re-invoke you after it ends, so verify synchronously before finishing.
|
|
6
|
-
Never run git write operations (commit, checkout, stash, reset, rebase, merge, push, etc.); leave changes uncommitted for the caller to review.${e.agentId?"\nFlows are the exception: run one from your shell with `coder flow run <name> --wait --json --args '<json>'`; it runs as a script in your sandbox.":``}${t}
|
|
7
|
-
</system>
|
|
8
|
-
|
|
9
|
-
${e.prompt??``}`}function O(e,t){let n=0;return()=>{Date.now()-n>=1e4&&(n=Date.now(),f(e,t))}}function k(e,t,{echo:n}){return r=>{let i=typeof r==`string`?{message:r}:r;l(e,t,i),n&&i.message&&T.stderr.write(`[coder] ${i.message}\n`)}}async function A(i,a,{echo:o}){let c=v(i),f=s(i,a.id),x=h(i),w=k(i,a.id,{echo:o}),E=n[a.permissions??`auto`]??n.auto,A=E.approvalPolicy===`never`?void 0:u({workspaceRoot:c,taskDir:f,mode:E.approvalMode,escalationTimeoutMs:x.approvals.escalationTimeoutMs,allowedNetworkHosts:x.approvals.allowedNetworkHosts,onEvent:e=>{l(i,a.id,e),o&&e.message&&T.stderr.write(`[coder] ${e.message}\n`)}}),j=a.model?x.models?.[a.model]:void 0,N=j&&y(j)?j:void 0;if(N&&!N.wireApi&&a.model){let e=await C(N);e&&(N={...N,...e},x.models[a.model]=N,b(i,a.model,e),l(i,a.id,{kind:`info`,message:`detected wire api for ${a.model}: ${e.wireApi} @ ${N.baseUrl}`}))}if(N?.envKey&&!T.env[N.envKey])throw Error(`Missing environment variable: \`${N.envKey}\`.`);let P=N?await S(N,N.wireApi??`chat`):null,F=m(x,a.model,P??void 0),I=t(i,a);try{let t=await r(i,{prompt:D(a),outputSchema:a.outputSchema,model:F?.model??d(a.model),modelProvider:F?.modelProvider??null,configOverrides:I?{...F?.configOverrides,"shell_environment_policy.set":{[e]:I}}:F?.configOverrides??null,effort:a.effort,sandbox:E.sandbox,approvalPolicy:E.approvalPolicy,networkAccess:g(a.permissions??`auto`,x.engines.codex?.network),approvalsReviewer:E.approvalMode===`auto`?`auto_review`:null,mcpServers:p(a.mcp),writableRoots:[...E.sandbox===`read-only`?[]:a.addDirs??[],...I?[I]:[]],onApprovalRequest:A,onHeartbeat:O(i,a.id),resumeThreadId:a.resumeThreadId??null,onControlReady:(e,t,n)=>{_(i,a.id,{status:`running`,steerEndpoint:e,threadId:t,turnId:n})},onProgress:e=>{w(e);let t=typeof e==`object`?e.threadId:null,n=typeof e==`object`?e.turnId:null;(t||n)&&_(i,a.id,{status:`running`,...t?{threadId:t}:{},...n?{turnId:n}:{}})}});return _(i,a.id,{status:t.status===0?`completed`:`failed`,threadId:t.threadId,turnId:t.turnId,steerEndpoint:null,completedAt:new Date().toISOString()}),M(i,a,f,t),t}finally{_(i,a.id,{steerEndpoint:null}),await P?.close()}}async function j(r,a,{echo:o}){let c=s(r,a.id),l=h(r),u=k(r,a.id,{echo:o}),d=n[a.permissions??`auto`]??n.auto,f=t(r,a);try{let t=await i(r,{prompt:D(a),outputSchema:a.outputSchema,model:a.model,effort:a.effort,permissions:a.permissions,approvalTaskId:d.approvalMode===`auto`?a.id:null,allowedNetworkHosts:l.approvals.allowedNetworkHosts,additionalDirectories:a.addDirs,...f?{writableDirectories:[f],env:{[e]:f}}:{},mcpServers:p(a.mcp),taskRoot:c,resumeSessionId:a.resumeThreadId??null,onHeartbeat:O(r,a.id),onSteerReady:e=>{_(r,a.id,{status:`running`,steerEndpoint:e})},onProgress:e=>{u(e),e.threadId&&_(r,a.id,{status:`running`,threadId:e.threadId})}});return _(r,a.id,{status:t.status===0?`completed`:`failed`,threadId:t.threadId,steerEndpoint:null,completedAt:new Date().toISOString()}),M(r,a,c,t),t}finally{_(r,a.id,{steerEndpoint:null})}}function M(e,t,n,r){a(w.join(n,`result.json`),r);let i={at:new Date().toISOString(),prompt:t.currentPrompt??t.prompt??null,...r};E.appendFileSync(w.join(n,`results.jsonl`),`${JSON.stringify(i)}\n`,`utf8`)}function N(e){return e.engine===`claude`?j:A}async function P(e,t){for(let n=0;n<2;){let r=x(e,t);if(!r||r.status===`failed`||r.status===`cancelled`)return;let i=o(e,t);if(i.length===0){n+=1,await new Promise(e=>setTimeout(e,300));continue}n=0;for(let n of i){let i=_(e,t,{status:`running`,currentPrompt:n,resumeThreadId:r.threadId??null});l(e,t,{message:`Running steered follow-up.`});try{await N(i)(e,i,{echo:!1})}catch(n){let r=n instanceof Error?n.message:String(n);_(e,t,{status:`failed`,error:r}),l(e,t,{kind:`error`,message:r});return}}}}async function F(e,t,n){if(t.dispatchId&&!t.resumedAt)try{E.writeFileSync(w.join(s(e,t.id),`start-${t.dispatchId}`),``,{flag:`wx`})}catch(e){if(e.code===`EEXIST`)return;throw e}_(e,t.id,{status:`running`,pid:T.pid});let r=()=>{},i;try{if(r=n(e,t),t.name?.startsWith(`agent:`)){let{startInboxControl:n,applyTaskMessage:r}=await import(`./task-DeglY79z.js`).then(e=>e.d);i=n(s(e,t.id),t.name.slice(6),n=>r(e,x(e,t.id)??t,n))}if(t.simulateApproval){let n=await c(s(e,t.id),{onEvent:n=>l(e,t.id,n)});if(l(e,t.id,{message:`simulated approval: ${n}`}),n===`decline`){_(e,t.id,{status:`cancelled`,completedAt:new Date().toISOString(),error:`simulated approval denied`});return}}await N(t)(e,t,{echo:!1}),await P(e,t.id)}catch(n){let r=n instanceof Error?n.message:String(n);throw _(e,t.id,{status:`failed`,error:r}),l(e,t.id,{kind:`error`,message:r}),n}finally{r(),await i?.close()}}export{F as runWorker};
|
package/dist/worker-DrucI22w.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{zt as e}from"./dispatch-BKeAch9E.js";import{i as t}from"./cli-DWCR7iqa.js";import{i as n}from"./output-BKeyLbvt.js";import{s as r}from"./args-BOEEdpWk.js";import i from"node:process";const a=t({name:`task worker`,options:{cwd:r},args:1,async run({args:[t],cwd:r}){let{startAgentMailbox:a}=await import(`./exec-RZFLclKX.js`).then(e=>e.i),{runWorker:o}=await import(`./worker-CXndxmGF.js`),s=e(r,t);s||n(`Worker: task ${t} not found.`),await o(r,s,a).catch(()=>i.exit(1))}});export{a as commandWorker};
|