@wular/coder 0.4.1 → 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/README.md +69 -70
- 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-CE-70LFs.js → add-B50dIJGd.js} +1 -1
- package/dist/{add-BxpLHnvD.js → add-D7X3gxap.js} +1 -1
- package/dist/{add-ej0X9e3a.js → add-DOEUHIe7.js} +1 -1
- package/dist/{add-U-pty9qJ.js → add-QExQhTzi.js} +1 -1
- package/dist/{add-json-CEa-6luW.js → add-json-Ck4KIZrT.js} +1 -1
- package/dist/{agent-JdtZozvP.js → agent-BPtnEf1q.js} +1 -1
- package/dist/{agent-BsYx3Odz.js → agent-BlQ_dNNm.js} +2 -2
- package/dist/{alias-DX-Bm86x.js → alias-BwQBovke.js} +1 -1
- package/dist/{app-BT5f7zL5.js → app-y6BYm2eH.js} +1 -1
- package/dist/{approvals-C-AvFt6s.js → approvals-Cc9cq5T1.js} +2 -2
- package/dist/{approve-DOmpQRNd.js → approve-oO9k2fnK.js} +2 -2
- package/dist/{apps-CjfrZyM5.js → apps-CU2YalX8.js} +1 -1
- package/dist/{archive-BziJ1rQ-.js → archive-C5c_HQS1.js} +2 -2
- package/dist/{archive-BUB8gFKD.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-dE3U3ss2.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-BilSDkvE.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-Da_cwoxI.js → config-DAE_qHYA.js} +1 -1
- package/dist/{create-C_iMJV4Y.js → create-CM8B8JxD.js} +1 -1
- package/dist/credentials-BXD4Qptk.js +1 -0
- package/dist/dash/manifest.json +934 -1014
- package/dist/dash/public/assets/chunks/{agent-pills-c9c4ac4d4a10df83.js → agent-pills-b6a6da91c9559d9f.js} +1 -1
- package/dist/dash/public/assets/chunks/{agent-settings-form-8be2ddab074aba6d.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-41234c24668b1db1.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-aa2a3d82e48ed8c3.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-4761ab14f05149df.js → custom-range-463e119af4681c61.js} +1 -1
- package/dist/dash/public/assets/chunks/{editor-bfe8cd854f8001be.js → editor-804b84f4fe6539cd.js} +4 -4
- package/dist/dash/public/assets/chunks/{engines-list-f1191390f5715b39.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-1d259660d7612c5f.js → list-7270361464fc3c04.js} +1 -1
- package/dist/dash/public/assets/chunks/{mcp-list-e3bebbbe831393b8.js → mcp-list-2e715d48666b54ad.js} +1 -1
- package/dist/dash/public/assets/chunks/{models-list-44f857a469ca04d5.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-d1426602049926d2.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-7ae25fd8a7d6c338.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-a75d2570f07cbb70.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-49ca85b59ac65c20.css +1 -0
- package/dist/dash/public/assets/dash-account-edc56e85dbaaabe0.css +1 -0
- 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-cf1997cd7f72e518.css +1 -0
- 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-40940b289f85e0b6.css +1 -0
- 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-61db65dc4223217a.js +1 -0
- 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-1b9ab0963a8ff77b.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/dash/server/bundle-0.1.6-b29ec45cb963d47f/entry.js +2 -0
- package/dist/{default-vYPT26DR.js → default-BMvUMTFp.js} +1 -1
- package/dist/default-B_nKaX0-.js +1 -0
- package/dist/{delete-D8gEwoOj.js → delete-Bjteibld.js} +2 -2
- package/dist/{delete-z1_86nf6.js → delete-riCIKZwj.js} +2 -2
- package/dist/{disable-DVKd-0Xb.js → disable-DQC56YFy.js} +1 -1
- package/dist/{discover-Dvr_3_Xr.js → discover-Qanr5TEO.js} +1 -1
- package/dist/{discover-Df-a8K4R.js → discover-lgTYwoQp.js} +2 -2
- package/dist/dispatch-BsW_1m7e.js +14 -0
- package/dist/{docs-DKJnqZqt.js → docs-DFs7lOJp.js} +1 -1
- package/dist/{docs-BX65z2Iu.js → docs-DKROso-4.js} +2 -2
- package/dist/{enable-C8Zf_wpN.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-17k25MHt.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-CoMfFxbG.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-DX-z3SBp.js → list-4Uo-0v9s.js} +1 -1
- package/dist/{list-BAKvxSbh.js → list-B0ujEZhd.js} +3 -3
- package/dist/{list-BYiG8Zav.js → list-B5oa1Bhy.js} +2 -2
- package/dist/{list-BxEywhHU.js → list-BjE_l6la.js} +1 -1
- package/dist/{list-VToARh3C.js → list-Ck9ibCs1.js} +1 -1
- package/dist/{list-CIW2joV1.js → list-DhgK4Zc4.js} +1 -1
- package/dist/{list-DpCf4G-H.js → list-KvL7AUhD.js} +2 -2
- package/dist/{list-C5w01-8q.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-DkkslfBx.js → login-C-ahtDKV.js} +1 -1
- package/dist/{login-BFxX4jJy.js → login-zpwke8g1.js} +1 -1
- package/dist/{logout-BHAtw4Z8.js → logout-CI6Kf-T6.js} +1 -1
- package/dist/{maintenance-C5FklUw3.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-CCZOAo06.js → mcp-mhXwtGQT.js} +1 -1
- package/dist/{migrate-N-85_N7J.js → migrate-Czh3TEK5.js} +1 -1
- package/dist/{migrate-C4vM7DQN.js → migrate-w7KfzUAR.js} +1 -1
- package/dist/{model-Bs1StDo3.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-CUC55Bqd.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-B93LNkZI.js → remove-C15WLaXT.js} +1 -1
- package/dist/{remove-C5_xggx7.js → remove-CTZYjjSr.js} +1 -1
- package/dist/{remove-eQ8y5C5p.js → remove-CTl-H0f0.js} +1 -1
- package/dist/{remove-CuH8a3L9.js → remove-DX2FVo5b.js} +1 -1
- package/dist/rename-D1g4TnHQ.js +1 -0
- package/dist/{result-BEtQZHaY.js → result-D49VN8PM.js} +3 -3
- package/dist/result-DGWyUHYU.js +18 -0
- package/dist/{resume-DYzKvyEw.js → resume-ywzc7z6A.js} +2 -2
- package/dist/{review-oIBeECZE.js → review-ZC0xG8XY.js} +2 -2
- package/dist/{rotate-key-IdMYH7gg.js → rotate-key-Bf8_99ck.js} +1 -1
- package/dist/{run-CTtd0Znc.js → run-D7SJ-ieT.js} +2 -2
- package/dist/run-DoRQSC_K.js +2 -0
- package/dist/{run-CawRGnOg.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-CPnmrKyf.js → serve-C1MMhM1F.js} +2 -2
- package/dist/{serve-GmRO89s5.js → serve-DtrOHaoS.js} +2 -2
- package/dist/{serve-CE8YV2e9.js → serve-P9pFkEnE.js} +1 -1
- package/dist/{serve-BTeomYxW.js → serve-yjSw0B1a.js} +1 -1
- package/dist/{server-Kb22cWfF.js → server-DDWTnmbx.js} +1 -1
- package/dist/{setup-host-GFTUzzZJ.js → setup-host-L6Rnn5Cz.js} +1 -1
- package/dist/{shared-DVtzWhUT.js → shared-XsUX_ZZb.js} +1 -1
- package/dist/{show-COTZEYgc.js → show-CU-jqJ90.js} +1 -1
- package/dist/{show-CMUg8SJu.js → show-DVJmB2u-.js} +1 -1
- package/dist/{status-D26U--p8.js → status-CBydR7LE.js} +1 -1
- package/dist/{steer-C6uARLp5.js → steer-Cm_sHZqs.js} +2 -2
- package/dist/{stop-BrGI3hSS.js → stop-DJS7DAPJ.js} +1 -1
- package/dist/{stop-ByCAlbmN.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-NEbhlxvo.js → test-CDKz4jY_.js} +1 -1
- package/dist/{tools-D0Zfs8Hx.js → tools-DBFeoosk.js} +1 -1
- package/dist/{types-I5Cwtl_K.d.ts → types-DMGBYB_K.d.ts} +3 -1
- package/dist/{unalias-C9NqmSDq.js → unalias-BfQFBnuK.js} +1 -1
- package/dist/{update-BTxYQj7Z.js → update-C4FFOie8.js} +1 -1
- package/dist/{upgrade-hA0yWBvx.js → upgrade-DLJqMnUQ.js} +2 -2
- package/dist/{usage-BhqoCjvE.js → usage-CSh-xwQ2.js} +1 -1
- package/dist/{usage-C4d9X2Uq.js → usage-D8mc4qXK.js} +1 -1
- package/dist/{watch-DtRuC0Wc.js → watch-CQu-tJKZ.js} +2 -2
- package/dist/{watch-CSdj24ct.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-Dcmdooi8.js → workflow-IrouAus_.js} +1 -1
- package/docs/cli.md +145 -0
- 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 +3 -2
- 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 +36 -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.css +58 -1
- package/src/server/dash/app/dash/layout.tsx +29 -7
- package/src/server/dash/app/dash/settings/[tab]/credentials-list.tsx +20 -13
- package/src/server/dash/app/dash/settings/[tab]/page.tsx +1 -1
- 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 +16 -5
- 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 +9 -1
- package/src/server/dash/comps/ui/select.tsx +2 -2
- package/src/server/dash/comps/ui/toast.css +3 -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-CtBcARgN.js +0 -1
- package/dist/auth-BFny--17.js +0 -1
- package/dist/auth-DWHIzqbA.js +0 -1
- package/dist/credentials-B1jv6dkg.js +0 -1
- package/dist/dash/public/assets/chunks/agents-grid-951584b6f4c4314e.js +0 -1
- package/dist/dash/public/assets/chunks/composer-5534be50bc12385e.js +0 -1
- package/dist/dash/public/assets/chunks/composer-d10d4b1d54c4f751.js +0 -1
- package/dist/dash/public/assets/chunks/credentials-list-bc5bfcab058176c5.js +0 -2
- package/dist/dash/public/assets/chunks/format-eb03fc9d9744d960.js +0 -1
- package/dist/dash/public/assets/chunks/heads-f3bcd289663d48fa.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-1901af8a5dea1f09.js +0 -1
- package/dist/dash/public/assets/chunks/shared-init-88cce66bb3cfe1e5.js +0 -5
- package/dist/dash/public/assets/chunks/shared-init-ffb3397e494137c9.js +0 -2
- package/dist/dash/public/assets/chunks/task-actions-8e1d93c788d001df.js +0 -1
- package/dist/dash/public/assets/chunks/task-fa8b82e95e771c4a.js +0 -1
- package/dist/dash/public/assets/chunks/task-view-6d7618d2820a5cb4.js +0 -3
- package/dist/dash/public/assets/chunks/tasks-list-f4784e5cbd0ed785.js +0 -1
- package/dist/dash/public/assets/dash-9e02d5d1a6d42ee3.css +0 -1
- package/dist/dash/public/assets/dash-account-04859899c1838ada.css +0 -1
- package/dist/dash/public/assets/dash-agents-9e678137267dec07.css +0 -1
- package/dist/dash/public/assets/dash-agents-new-26fa27b17ef9b8d8.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-b975c48f8abf3444.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-edit-e13fda599bb04843.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-platforms-70292932cb27bc96.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-settings-71f9a86251723fcc.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-tasks-fb8eb2ed71006601.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-usage-7c8740f1cdd52c71.css +0 -1
- package/dist/dash/public/assets/dash-settings-8eb818da462227e8.css +0 -1
- package/dist/dash/public/assets/dash-settings-param-tab-849a1a9542e273f5.css +0 -1
- package/dist/dash/public/assets/dash-tasks-81e510e0b6931b42.css +0 -1
- package/dist/dash/public/assets/dash-tasks-param-id-bbd2a83342f2ec10.css +0 -1
- package/dist/dash/public/assets/dash-usage-8e0259e03eaed1bd.css +0 -1
- package/dist/dash/public/assets/pnext-client-03b03b254e525e82.js +0 -1
- package/dist/dash/public/assets/pnext-client-1c7859bb888f4ef0.js +0 -1
- package/dist/dash/public/assets/pnext-client-3c748afe963fb05d.js +0 -1
- package/dist/dash/public/assets/pnext-client-4f47c2cae220f107.js +0 -1
- package/dist/dash/public/assets/pnext-client-6ab9fd9b53b794d2.js +0 -1
- package/dist/dash/public/assets/pnext-client-6c241786342498e4.js +0 -1
- package/dist/dash/public/assets/pnext-client-80b56d420f02b808.js +0 -1
- package/dist/dash/public/assets/pnext-client-83135c17bae850a3.js +0 -1
- package/dist/dash/public/assets/pnext-client-8e6fa4302ae0396f.js +0 -1
- package/dist/dash/public/assets/pnext-client-932c9d8cc0717fc8.js +0 -1
- package/dist/dash/public/assets/pnext-client-a42ae63d4de113f9.js +0 -1
- package/dist/dash/public/assets/pnext-client-d2ee6f8c1e337032.js +0 -1
- package/dist/dash/public/assets/pnext-client-d513f65ec23b7f20.js +0 -1
- package/dist/dash/public/assets/pnext-client-ecb88e2a8a109954.js +0 -1
- package/dist/dash/public/assets/pnext-client-f1545ee6270bbf9a.js +0 -1
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/boot-B2MFTRO2.js +0 -30
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/build-tier-XJJSL5FR.js +0 -2704
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-2HFY3DQT.js +0 -208
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-2ICEVELW.js +0 -834
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-3UPROT2C.js +0 -35
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-4P5CMIYT.js +0 -1582
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-4TKZKZ3Q.js +0 -131
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-5RDEILQB.js +0 -437
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-62KEQM43.js +0 -25
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-6KQSWT6D.js +0 -831
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-7DCNCW6O.js +0 -724
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-B4THCTQP.js +0 -22
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-C2LIV2MM.js +0 -172
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-CCATPVTW.js +0 -378
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-COXJAPTU.js +0 -89
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-E6IXL2NJ.js +0 -6270
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-FLGRBFAH.js +0 -1198
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-FTJVHFWD.js +0 -61
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-H523KSIH.js +0 -5151
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-HT6KKX6A.js +0 -20
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-JESFYECC.js +0 -438
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-JRPJM2XY.js +0 -17
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-L2IWDUXG.js +0 -107
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-L5P4Y4UC.js +0 -183
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-NQE46AZN.js +0 -647
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-PA4QEARJ.js +0 -129
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-PZ5AXOLW.js +0 -7146
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-SNVPTULL.js +0 -2397
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-T3QZT3PG.js +0 -220
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-VC5O2SDP.js +0 -72
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-WZX4V6CM.js +0 -231
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-XUUIDXY5.js +0 -627
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-ZHFDO3PR.js +0 -265
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/compile-CE2DN7ZA.js +0 -18
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/config-UREY7XJT.js +0 -16
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/config-loader-UI2XE3PZ.js +0 -17
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/entry.js +0 -219
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/generate-I2PPTDFD.js +0 -16
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/modules-UVOCE4C2.js +0 -48
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/pipeline-UW47K537.js +0 -963
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/proxy-ITGOVJBW.js +0 -26
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/register-4SA55SWT.js +0 -12579
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/router-JNKHLBCZ.js +0 -505
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/routes-PD6J2NXW.js +0 -54
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/tsconfig-defaults-ZXEH7RQK.js +0 -15
- package/dist/default-Bobztoxf.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-5xCaXSd-.js +0 -1
- package/dist/integrations-BAgdVDhj.js +0 -5
- package/dist/log-view-dg0TlKLA.js +0 -1
- package/dist/models-_5LVGC3m.js +0 -1
- package/dist/queue-6io_NOP3.js +0 -116
- package/dist/refresh-BIrmrWYq.js +0 -1
- package/dist/rename-CYfy03FE.js +0 -1
- package/dist/result-BzaM3inj.js +0 -15
- package/dist/run-BDYl0CKl.js +0 -2
- package/dist/runner-D7ScbIHJ.js +0 -1
- package/dist/schema-CU2iFkp8.js +0 -1
- package/dist/serve-CQKZxzFE.js +0 -4
- package/dist/store-B94tSate.js +0 -42
- package/dist/store-DzqXS2wT.js +0 -8
- package/dist/task-C6VAg5WU.js +0 -1
- package/dist/task-CgOKgkEG.js +0 -1
- package/dist/worker-CXndxmGF.js +0 -9
- package/dist/worker-DX7P9kWl.js +0 -1
- package/src/server/dash/app/dash/token-from-hash.tsx +0 -17
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{Bt as t,Ct as n,Ht as r,J as i,Jt as a,Kt as o,Lt as s,Mt as c,Nn as l,Nt as u,Ot as d,Pt as f,St as p,Tn as m,Vt as h,Yt as g,Zt as _,_t as v,an as ee,bt as te,cn as ne,d as re,fn as ie,g as ae,ht as oe,in as se,jn as ce,kt as le,mn as ue,nn as y,nt as de,o as fe,pn as b,r as pe,rn as x,tn as me,vt as he,x as ge,xt as _e}from"./dispatch-BsW_1m7e.js";import{t as ve}from"./types-D0q15RJa.js";import{a as ye,i as be,l as xe,n as Se,o as Ce,r as we,s as Te,t as Ee}from"./load-SnZd7xG1.js";import{c as De,d as Oe,i as ke,l as Ae,t as je,u as Me}from"./integrations-B2CavXR1.js";import{i as Ne,t as Pe}from"./discover-Qanr5TEO.js";import{a as Fe,c as Ie,l as Le,n as Re,o as ze}from"./actions-FzDNxMFf.js";import{g as Be,h as Ve,i as He,r as Ue}from"./executor-vMppVLB6.js";import{n as We,r as Ge,t as Ke}from"./exec-DuUkLMqg.js";import{f as qe,n as Je,r as Ye,t as Xe}from"./task-CpUI19o2.js";import{t as Ze}from"./match-DxV1d49D.js";import{a as Qe,i as $e,n as et,o as tt,r as nt,t as rt}from"./local-BRy1EUq2.js";import{a as S,c as it,d as C,f as at,i as ot,l as w,m as st,n as ct,p as lt,r as ut,u as dt}from"./http-D01Udu4u.js";import{n as ft}from"./github-actions-C_NkHVJq.js";import{t as pt}from"./log-view-DeJstSkw.js";import{n as mt,t as ht}from"./chat-3Znsevah.js";import T from"node:path";import E from"node:process";import{fileURLToPath as gt,pathToFileURL as _t}from"node:url";import*as D from"zod/mini";import O,{accessSync as vt,constants as yt,cpSync as bt,existsSync as xt,readFileSync as St,readdirSync as Ct,realpathSync as wt,rmSync as Tt,statSync as Et,symlinkSync as Dt}from"node:fs";import{execFile as Ot,spawn as kt}from"node:child_process";import{createCipheriv as At,createDecipheriv as jt,createHash as Mt,createHmac as Nt,randomBytes as k,randomUUID as Pt}from"node:crypto";import Ft,{tmpdir as It}from"node:os";import{isIP as Lt}from"node:net";import{isDeepStrictEqual as Rt,promisify as zt}from"node:util";import{lookup as Bt}from"node:dns/promises";import{request as Vt}from"node:https";import{brotliDecompressSync as Ht,constants as Ut,createGzip as Wt,gunzipSync as Gt,gzipSync as Kt,inflateSync as qt}from"node:zlib";import{Chat as Jt,Message as Yt}from"chat";const Xt=e=>`nonce:${Oe(e)}`;function Zt(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 Nt(`sha256`,Zt(e)).update(t).digest(`base64url`)}async function $t(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=tt(o),c=`${s}.${Qt(e,s)}`;return await e.store.put(`delivery`,Xt(c),{at:a},{ttlMs:i}),c}function en(e,t){let[n,r,i]=t.split(`.`);if(!(!n||!r||i!==void 0)&&Me(Qt(e,n),r))try{return Qe(n)}catch{return}}function tn(e,t){return en(e,t)?.organization}function nn(e,t){return en(e,t)?.user}async function rn(e,t,n,r,i){let a=en(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`,Xt(t))}async function an(e,t,n,r){let i=en(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`,Xt(t))))return i.target}async function on(e,t,n,r){let i=en(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`,Xt(t))))return i.target}const sn=(e,t=200)=>Ae(`<title>Coder</title><p>${De(e)}</p>`+(t>=400?`<p><a href="/dash">Back to the dashboard</a> to start again.</p>`:``),t);function cn(e){let t=e.get(`agent`),n=e.get(`def`),r=ut(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 ln=e=>typeof e==`string`&&/^\/dash(?:[/?#]|$)/.test(e)?e:void 0,un=(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 dn(e,t,n){return(await e.store.list(`app`,{prefix:`${n}:`})).find(e=>e.value.integration===n&&e.value.agent===t.agent)?.value}function fn(e,t,n){let r={kind:`installation`,id:n};return{...e,connections:{...e.connections,[t]:r}}}function pn(e,t,n){return async r=>{let i={};for(let a of Object.keys(e.integrations)){if(a===t.integration)continue;let o=await dn(e,t,a);if(o){let t=await $t(e,`install`,e.session?.user.id??`anonymous`,o.id);i[a]=`${n}/install/${a}?app=${encodeURIComponent(o.id)}&state=${tt({link:r,tx:t})}`}}return i}}async function mn(e,t,n){let r=await e.store.get(`app`,t.app);return r&&dn(e,r,n)}function hn(e){return`${e.appId}:${e.installationId}:${e.chat?.thread.id??e.deliveryId}`}async function gn(e,t,n,r){return e.repos.readFile(t,`.coder/${n}.md`,r)}function A(e){return e.event&&e.source===e.event.integration?hn(e.event):`task:${e.id}`}async function _n(e,t,n,r,i,a,o,s){let c={},l=ke(e.integrations),[u,d,f]=await Promise.all([o?.().catch(()=>void 0),e.store.get(`note`,hn(r)).catch(()=>void 0),l&&n.settings?.configRepo&&i[l.id]?gn(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 j=Oe;function vn(e,t,n,r=k(32).toString(`base64url`)){let i=`${tt({task:e,organization:t,attempt:n})}.${r}`;return{token:i,hash:j(i)}}function M(e){try{return Qe(e.slice(0,e.indexOf(`.`)))}catch{return{}}}function N(e,t){return t===e.organizationId||!e.scope?e:e.scope(t)}async function yn(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:N(e,n.organizationId),app:n.app}}async function bn(e,t){if(e.boundInstallation?.installation.id===t)return{...N(e,e.boundInstallation.organizationId),boundInstallation:e.boundInstallation};if(!e.installationOrganization)return e;let n=await e.installationOrganization(t);return n===void 0?void 0:N(e,n)}const xn=D.object({env:D.record(D.string(),D.string().check(D.minLength(1)))}),Sn=`plain`;function Cn(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 wn(e){return Cn(e.encryptionKey)}function Tn(e){let t=Cn(e);return t?Mt(`sha256`).update(t).digest().readInt32BE(0):0}function En(e){return[[e.encryptionKey,`SERVER_ENCRYPTION_KEY`],[e.previousEncryptionKey,`SERVER_ENCRYPTION_KEY_PREVIOUS`]].filter(e=>!!e[0]).map(([e,t])=>({value:Cn(e,t),version:Tn(e)}))}function Dn(e){let t=xn.safeParse(e);if(!t.success||!Object.keys(t.data.env).length)throw Error(`Invalid engine credential`);return t.data}function On(e,t){let n=wn(e);if(!n)return{iv:Sn,tag:``,ciphertext:Buffer.from(JSON.stringify(Dn(t))).toString(`base64`)};let r=k(12),i=At(`aes-256-gcm`,n,r),a=Buffer.concat([i.update(JSON.stringify(Dn(t)),`utf8`),i.final()]);return{iv:r.toString(`base64`),tag:i.getAuthTag().toString(`base64`),ciphertext:a.toString(`base64`)}}function kn(e,t){if(t.iv===Sn)return Dn(JSON.parse(Buffer.from(t.ciphertext,`base64`).toString(`utf8`)));for(let n of En(e))try{let e=jt(`aes-256-gcm`,n.value,Buffer.from(t.iv,`base64`));return e.setAuthTag(Buffer.from(t.tag,`base64`)),Dn(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 P(e,t){let n=wn(e);if(!n)return`${Sn}.${Buffer.from(JSON.stringify(t)).toString(`base64`)}`;let r=k(12),i=At(`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 F(e,t){if(t.startsWith(`${Sn}.`))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 En(e))try{let e=jt(`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 An(e,t){if(t.startsWith(`${Sn}.`))return 0;let[n,r,i]=t.split(`.`).map(e=>Buffer.from(e,`base64`));for(let t of En(e))try{let e=jt(`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 jn=`node:22`;function Mn(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??jn,`coder`,`agent`,`run`,`--task`,e.id],env:t}}var Nn=class{options;kind=`local-docker`;constructor(e={}){this.options=e}async start(e,t){let n=this.options.image??jn,r=await nt(`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=Mn(e,{...t,CODER_INBOX_SOCKET:Je},this.options),a=await nt(`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 nt(`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 nt(`docker`,[`logs`,`--timestamps`,e],{PATH:E.env.PATH??``});if(n.code!==0)throw Error(n.stderr.trim()||`docker logs failed`);let r=[...et(n.stdout),...et(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 nt(`docker`,[`rm`,`-f`,e],{PATH:E.env.PATH??``})}async push(e,t){let n=await nt(`docker`,[`exec`,`-e`,`CODER_INBOX_MESSAGES`,e,`node`,`-e`,Xe],{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 Pn(e){if(!Lt(e))return!0;if(Lt(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 Fn=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??Bt}async safe(){let e=this.base.hostname.replace(/^\[|\]$/g,``),t=Lt(e)?[{address:e,family:Lt(e)}]:await this.resolver(e,{all:!0});if(!t.length)throw Error(`The http runner resolved no address`);if(t.some(e=>Pn(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??Vt)(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=Nt(`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 In=e=>Qe(e),Ln=18e5,Rn=2097152,zn=Rn/4,Bn={"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 Vn(e){if(!e)return;let t=(()=>{try{return new URL(e).hostname}catch{return``}})();return Object.entries(Bn).find(([e])=>t.includes(e))?.[1]}const Hn={ANTHROPIC_API_KEY:{host:`api.anthropic.com`,header:`x-api-key`,prefix:``},OPENAI_API_KEY:{host:`api.openai.com`,header:`authorization`,prefix:`Bearer `}};function Un(e={}){let t=Object.entries(Hn).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 Wn(){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 Gn(e){return e&&typeof e==`object`&&`response`in e&&e.response instanceof Response?e.response.status:void 0}function Kn(e){if(Gn(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 qn=class extends Error{snapshotId;constructor(e,t,n){super(e,n),this.snapshotId=t}},Jn=class{options;kind=`vercel-sandbox`;streams=new Map;constructor(e={}){this.options=e}api(){return this.options.sandbox?Promise.resolve(this.options.sandbox):Wn()}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??``}:${Oe(JSON.stringify(r))}`}baseKey(){let e=[m(),this.options.image??null,this.options.tools??[]];return`base:${this.options.region??``}:${Oe(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 qn(`Vercel Sandbox ${n.name} is ${n.status}`);return await t(n)}catch(t){let r=Gn(t);throw r===410||!n&&typeof e==`string`&&r===404?new qn(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<Ln)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 qn){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 qn)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&&Kn(t)?new qn(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(Ln)})}}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@${m()}`,...this.options.tools??[]].join(` `)}`,...$e()].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=Un(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:Je}),o?{networkPolicy:o}:{});return tt({sandbox:l.sandbox,command:l.command})}catch(e){if(!(e instanceof qn))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=In(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:In(e).sandbox})).runCommand({cmd:`node`,args:[`-e`,Xe],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=In(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)<=zn)return e;let t=Buffer.from(e),n=t.length-zn;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>Rn/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:In(e).sandbox})).stop()}};const Yn=[`local`,`local-docker`,`vercel-sandbox`,`github-actions`,`http`];function Xn(e){let t=e.kind;return e.local===!1&&(t===`local`||t===`local-docker`)?{}:{[t]:Zn(t,e)}}function Zn(e,t){let n=t.config??{};if(e===`local`)return new rt(t.workDir);if(e===`local-docker`)return new Nn(n);if(e===`vercel-sandbox`)return new Jn({...t.sandbox,...n});if(e===`github-actions`)return new ft({...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 Fn({url:n.url,secret:n.secret,...t.fetch?{fetch:t.fetch}:{}})}function Qn(e,t){return e.scope===`workspace`||!!(t&&e.owner===t)}function $n(e){return e.local?`local`:`default`}async function er(e,t={}){let n=(await e.store.list(`runner`)).filter(({value:n})=>Qn(n,t.requester)&&(e.local||n.kind!==`local`&&n.kind!==`local-docker`)),r=t.runner??t.agent;if(r===$n(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 tr(e,t,n){let r={...t.config,...F(e.config,t.secret)};return Zn(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 nr(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}F(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:tr(e,n,t.runnerId)},r.set(t.runnerId,a)),a.runner}function rr(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 Fn({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 I=class extends Error{};async function ir(e,t){let n=Date.now(),r=new AbortController,i,a=new Promise((e,t)=>{i=setTimeout(()=>{r.abort(),t(new I(`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,...F(e.config,t.secret)}:e.config.runnerConfig??{};if(n===`local`){if(!e.local)throw new I(`Local runners require a local server`);return`This machine is available`}if(n===`http`){let n=t?tr(e,t):e.runners.http;if(!(n instanceof Fn)||!(await n.health(r.signal)).ok)throw new I(`Runner health check failed`);return`Runner is reachable`}if(n===`local-docker`){if(!e.local)throw new I(`Docker runners require a local server`);return await new Promise((t,n)=>{(e.runnerExec??Ot)(`docker`,[`info`],{timeout:5e3,signal:r.signal},e=>e?n(new I(`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 I(`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 I(`Invalid team response`);if(i.team&&!o.teams.some(e=>e.id===i.team||e.slug===i.team))throw new I(`Team is not accessible`);return`Teams are accessible`})()]),ms:Date.now()-n}}catch(e){return{ok:!1,detail:e instanceof I?e.message:`Runner check failed`,ms:Date.now()-n}}finally{clearTimeout(i)}}function ar(e){if(typeof e!=`string`||!e)return{ok:!1,detail:`A folder path is required`};let t=e===`~`?Ft.homedir():e.startsWith(`~/`)?T.join(Ft.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 or(e){let n=new Map,r=[...h(e),...t(e,{migrate:!1})].sort((e,t)=>Date.parse(t.createdAt)-Date.parse(e.createdAt));for(let e of r){let t=ar(e.cwd);if(!(!t.ok||n.has(t.folder.path))&&(n.set(t.folder.path,{...t.folder,recent:Date.parse(e.createdAt)}),n.size===8))break}return{current:{path:e,name:T.basename(e)},recent:[...n.values()],picker:!!cr()}}const sr=e=>(process.env.PATH??``).split(T.delimiter).some(t=>t&&O.existsSync(T.join(t,e)));function cr(){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(sr(`zenity`))return[`zenity`,[`--file-selection`,`--directory`,`--title=${e}`]];if(sr(`kdialog`))return[`kdialog`,[`--getexistingdirectory`,Ft.homedir(),`--title`,e]]}async function lr(){let e=cr();if(!e)return{ok:!1,detail:`This machine has no folder dialog; type a path instead`};try{let{stdout:t}=await zt(Ot)(e[0],e[1],{timeout:6e5}),n=t.trim().replace(/(.)[\\/]+$/,`$1`);return n?ar(n):{ok:!1,detail:``}}catch{return{ok:!1,detail:``}}}function ur(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 dr(e){let t=typeof e==`string`?e.trim():``,n=ur(t);if(!n)return{ok:!1,detail:`Use an https or ssh git URL, like https://github.com/owner/repo`};let r=c(`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=>zt(Ot)(`git`,e,{env:a,signal:i,maxBuffer:67108864});try{await qe(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 fr=(e,t)=>`${e}:${String(t).padStart(6,`0`)}`;function L(e,t){return e.get(`agent`,t)}async function pr(e){return(await e.list(`agent`)).map(e=>e.value)}async function mr(e,t,n){let r=n??(await L(e,t))?.currentVersion;return r===void 0?void 0:e.get(`agentversion`,fr(t,r))}async function R(e,t){if(e.listAgentsWithVersions)return(await e.listAgentsWithVersions(t))[0]??{};let n=await L(e,t);return{record:n,version:n&&await mr(e,t,n.currentVersion)}}async function hr(e){if(e.listAgentsWithVersions)return e.listAgentsWithVersions();let t=await pr(e);return Promise.all(t.map(async t=>({record:t,version:await mr(e,t.id,t.currentVersion)})))}async function gr(e,t,n){if(e.publishAgent){let r=xe(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 R(e,t.id),i=await _r(e,t,n,r);return{record:await L(e,t.id),version:i,unchanged:r.record?.currentVersion===i.version}}async function _r(e,t,n,r){if(!r&&e.publishAgent)return(await gr(e,t,n)).version;let i=xe(t.id,t.definition),a=t.files&&Object.keys(t.files).length?t.files:void 0,o=r?r.record:await L(e,t.id),s=r?r.version:o?await mr(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=>Rt(e.definition,i)&&e.systemPrompt===t.systemPrompt&&Rt(e.files,a);if(s&&l(s)){let r=c(s.version,o.updatedAt);return Rt(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`,fr(t.id,r),u);r++){let n=await e.get(`agentversion`,fr(t.id,r));if(n&&l(n)){u=n;break}}let d=await L(e,t.id);return(!d||d.currentVersion<u.version)&&await e.put(`agent`,t.id,c(u.version,n)),u}async function vr(e,t,n,r=Date.now()){let i=await L(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 yr=[`read-only`,`workspace-write`,`auto`];function br(e,t){if(Array.isArray(e))return[...new Set(e)];let n=ve.indexOf(e);return[...new Set(ve.slice(0,n+1).flatMap(e=>t?.tools.presets[e]??[]))]}function xr(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?br(t.allowedTools,r[e]).filter(t=>new Set(br(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&&yr.indexOf(l)<=yr.indexOf(c)?l:c;return{...i,...a,permissions:u,...o.size?{integrations:s}:{}}}function Sr(e,t,n,r=je){let i=xr(t.definition,void 0,e.settings,r),a=xr(t.definition,i,n,r),[o]=Se({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 Cr(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,Cr(e,i)):r.isFile()&&i!==`agent.json`&&i!==`system.md`&&(n[i]=O.readFileSync(T.join(e,i),`utf8`))}return n}async function wr(e,t,n,r){let i=be()[n];return i?await _r(e,{id:n,source:`builtin`,definition:i.json,systemPrompt:O.readFileSync(T.join(i.dir,`system.md`),`utf8`),files:Cr(i.dir),importedFrom:`builtin:${m()}`},t,r)!==r.version:!1}async function Tr(e,t,n){let r=n??await Promise.all(Object.keys(be()).map(t=>R(e,t))),i=!1;for(let n of Object.keys(be()))await wr(e,t,n,r.find(({record:e})=>e?.id===n)??{})&&(i=!0);return i}const Er=[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`];function Dr(e,t,n,r){return{method:e,pattern:t,handler:n,...r?{guard:r}:{}}}function Or(e,t,n){return t.map(t=>({...t,pattern:e+t.pattern,...n&&!t.guard?{guard:n}:{}}))}function kr(e,t,n){return[e,`${e}/*`].flatMap(e=>Er.map(r=>Dr(r,e,t,n)))}function Ar(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 jr(e,t,n,r){for(let i of e){let a=Ar(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=it();return l.headers.set(`allow`,[...new Set(o.map(e=>e.method))].join(`, `)),l}}const Mr=`coder`;function Nr(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 Pr=`The Coder dashboard is not built; run bun run build.`,Fr=[`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 Ir(e){let t=T.dirname(gt(e));for(;;){let e=T.join(t,`package.json`);if(xt(e))try{if(JSON.parse(St(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 Lr(e=import.meta.url){let t=T.dirname(gt(e)),n=Ir(e);return[T.join(n,`dist/dash`),T.join(t,`../dash`)].find(e=>xt(T.join(e,`manifest.json`)))}function Rr(e){let t=T.join(e,`server`);if(!xt(t))throw Error(`The Coder dashboard server bundle is missing.`);let n=Ct(t,{withFileTypes:!0}).filter(e=>e.isDirectory()&&e.name.startsWith(`bundle-`)).map(e=>T.join(t,e.name,`entry.js`)).filter(xt);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 zr(e,t){let n=T.join(It(),`coder-dash`,Mt(`sha256`).update(e).digest(`hex`).slice(0,12));for(let e of xt(n)?Ct(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)&&Tt(T.join(n,e),{recursive:!0,force:!0})}let r=T.join(n,`${process.pid}-${t}`);bt(T.join(e,`src`),T.join(r,`src`),{recursive:!0});for(let t of[`dist`,`node_modules`])Dt(T.join(e,t),T.join(r,t),`dir`);return wt(T.join(r,`src/server/dash`))}async function Br(e,t=0){let n=Ir(e),r=Lr(e);if(!r)throw Error(Pr);let i=JSON.parse(St(T.join(r,`manifest.json`),`utf8`)),a=t?zr(n,t):T.join(n,`src/server/dash`),o={...i,outDir:r},s=Rr(r);return{handler:await(await import(_t(s).href)).createRequestHandler({root:a,manifest:o}),manifest:o}}var Vr=class{hosts=new Map;made=new Map};function Hr(e){let t=Lr(e);if(t)try{return Et(T.join(t,`manifest.json`)).mtimeMs}catch{return}}function Ur(e,{hosts:t,made:n}){let r=Date.now(),i=t.get(e);if(i&&r-i.checked<1e3)return i.host;let a=Hr(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:Br(e,o)};return t.set(e,s),s.host}function Wr(e,t){let n=e.length>1&&e.endsWith(`/`)?e.slice(0,-1):e;return!!(Ar(`/assets/*`,n)||Ar(`/dash/*`,n)||t.routes.some(e=>Ar(e.route,n)))}const Gr=/<script(?![^>]*\bsrc=)[^>]*>([\s\S]*?)<\/script>/gi,Kr=e=>`'sha256-${Mt(`sha256`).update(e).digest(`base64`)}'`;function qr(e){let t=[...e.matchAll(Gr)].map(e=>Kr(e[1]));return[...Fr,`script-src 'self' ${t.join(` `)}`.trim()].join(`; `)}function Jr(e,t){return t===`gzip`?Gt(e).toString(`utf8`):t===`br`?Ht(e).toString(`utf8`):t===`deflate`?qt(e).toString(`utf8`):e.toString(`utf8`)}const Yr=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 Xr(e){e.set(`content-encoding`,`gzip`),/accept-encoding/i.test(e.get(`vary`)??``)||e.append(`vary`,`accept-encoding`)}function Zr(e){let t=Wt(),n=e=>new Promise(n=>{t.write(e),t.flush(Ut.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 Qr(e,t,n,r){n.set(`content-security-policy`,[...Fr,`script-src 'self' 'nonce-${r}'`].join(`; `));let i=t.body;return Yr(e)&&(Xr(n),i=Zr(i.getReader())),new Response(i,{status:t.status,statusText:t.statusText,headers:n})}async function $r(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 Qr(e,t,r,n);let a=Buffer.from(await t.arrayBuffer()),o=Jr(a,i);r.set(`content-security-policy`,qr(o));let s=i?new Uint8Array(a):o;return!i&&o.length>1024&&Yr(e)&&(s=new Uint8Array(Kt(o)),Xr(r)),new Response(s,{status:t.status,statusText:t.statusText,headers:r})}async function ei(e,t=import.meta.url,n=new Vr){let r;try{r=await Ur(t,n)}catch(e){if(n.hosts.delete(t),e instanceof Error&&e.message===Pr)return;throw e}if(!Wr(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}'`),$r(e,await r.handler(new Request(e,{headers:a})),i)}const ti=(e,t,n=!1)=>`coder_admin=${encodeURIComponent(t)}; HttpOnly; SameSite=Strict; Path=/${new URL(e.url).protocol===`https:`?`; Secure`:``}${n?`; Max-Age=0`:``}`;function ni(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 ri(e,t,n,r){let i=await e.formData(),a=i.get(`token`),o=i.get(`return`),s=Nr(typeof o==`string`&&o.startsWith(`/`)?o:null,new URL(e.url).origin);return typeof a==`string`?a?Wi(a,t.config.adminToken)?new Response(null,{status:303,headers:{location:s,"set-cookie":ti(e,a)}}):lt(`/dash?token=rejected`,303):new Response(null,{status:303,headers:{location:s,"set-cookie":ti(e,``,!0)}}):lt(`/dash?token=rejected`,303)}async function ii(e,t,n,r){return lt(!t.auth||t.session?`/dash`:r.searchParams.has(`signed_out`)?`/login?signed_out=1`:`/login`)}async function ai(e,t,n,r){let i=`/api/auth/sign-in?return=${encodeURIComponent(Nr(r,n.origin))}`,a=t.config.publicUrl;return a&&new URL(ni(e,n)).host!==new URL(a).host?lt(new URL(i,a).href):t.auth.handler(new Request(`${n.origin}${i}`))}async function oi(e,t,n,r){return t.auth&&!r.searchParams.has(`signed_out`)&&!r.searchParams.has(`error`)?ai(e,t,r,r.searchParams.get(`return`)):await ei(li(e,t),void 0,t.dashboardHosts)??new Response(`UI is not built`,{status:503})}async function si(e,t,n,r){return await ei(li(e,t),void 0,t.dashboardHosts)??new Response(`UI is not built`,{status:503})}async function ci(e,t,n,r){return await ei(li(e,t),void 0,t.dashboardHosts)??w()}function li(e,t){let n=new Headers(e.headers);return n.set(`x-coder-mode`,qi(t)),new Request(e,{headers:n})}async function ui(e,t,n){return await ei(li(e,t),void 0,t.dashboardHosts)??w()}function di(){return(process.env.PATH??``).split(T.delimiter).some(e=>{try{let t=T.join(e,`docker`);return vt(t,yt.X_OK),Et(t).isFile()}catch{return!1}})}function fi(e){let t=!!e.local,n=t&&di();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 pi=D.string().check(D.minLength(1),D.maxLength(80)),mi=D.enum([`personal`,`workspace`]),hi=D.record(D.string(),D.string()),gi=D.strictObject({kind:D.enum([`local`,`local-docker`,`github-actions`,`vercel-sandbox`,`http`]),name:pi,scope:mi,config:hi}),_i=D.strictObject({name:D.optional(pi),default:D.optional(D.literal(!0)),config:D.optional(hi)});function vi(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 yi(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})=>Qn(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 vi(t,r,n,r.default&&(r.scope===`personal`||!o))}}}async function bi(e,t,n,r){n.id;let{user:i,now:a,canCreate:o,rows:s,row:c}=yi(t),l=await s(),u=l.find(({value:e})=>e.scope===`personal`&&e.default)??l.find(({value:e})=>e.default),d={id:$n(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})=>vi(e,t,a,e===u?.id))],catalog:fi(t)})}async function xi(e,t,n,r){n.id;let{user:i,now:a,canCreate:o,rows:s,row:c}=yi(t);{let n=gi.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=fi(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{rr(r,n.data.config)}catch(e){return S({error:e.message},400)}let s=Ti(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 Si(e,t,n,r){let i=n.id,{user:a,now:o,canCreate:s,rows:c,row:l}=yi(t);if(i===$n(t))return S(await ir(t));let u=e=>{if(!e||!Qn(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 ir(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 Ci(e,t,n,r){let i=n.id,{user:a,now:o,canCreate:s,rows:c,row:l}=yi(t);if(i===$n(t)){if(B(t)){let n=_i.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||!Qn(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=_i.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,...F(t.config,r.secret),...a.data.config};try{rr(fi(t).find(e=>e.kind===r.kind),e)}catch(e){return S({error:e.message},400)}s=Ti(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 wi(e,t,n,r){let i=n.id,{user:a,now:o,canCreate:s,rows:c,row:l}=yi(t);if(i===$n(t))return S({error:`The server default cannot be renamed or removed.`},403);let u=e=>{if(!e||!Qn(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 Ti(e,t,n){let r=new Set(fi(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:P(n.config,Object.fromEntries(i.filter(([e])=>r.has(e))))}}const Ei=D.strictObject({name:D.optional(pi),scope:mi});async function Di(e,t,n,r){n.id;let{user:i,now:a,canCreate:o,rows:s,row:c}=yi(t),l=Ei.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:${Oe(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 Oi=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 ki(e,t,n,r){let i=Oi.safeParse(await e.json().catch(()=>void 0));if(!i.success)return S({error:`Invalid runner registration`},400);let a=i.data;try{new Fn({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=N(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:${Oe(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,...Ti(`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`||!Me(F(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({...vi(r,n,s),organizationId:o})})}const Ai=(e,t)=>`${e}:${String(t).padStart(6,`0`)}`;function ji(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:Ai(t,n)}:{},...r?{limit:r}:{}})).map(e=>{let t=pt(e.value.line);return{seq:Number(e.id.slice(e.id.lastIndexOf(`:`)+1)),...e.value,...t?{entry:t}:{}}})}async function Mi(e,t,n=-1,r){if(!t.handle)return z(e.store,t.task.id,n,r);let i=await nr(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),Bc(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=ji(f.lines.map(({level:e,line:t})=>{let n=pt(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 Ni(e,t,n,r=!1){let i=V(e);if(!i)return new Response(`Unauthorized`,{status:401});let a=M(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,j(i),a.attempt,(t.now??Date.now)(),r)??new Response(`Unauthorized`,{status:401})}function Pi(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 Fi(e,t,n,r){let i=n.id,a=V(e),o=M(a),s=j(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 Ii(e,t,n,r){let i=n.id,a=V(e),o=M(a),s=j(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 Li(e,t,n,r){let i=n.id,a=V(e),o=M(a),s=j(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 Ri(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 Mi(t,a).catch(()=>{}),s=(t.now??Date.now)();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:A(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:Pi(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 zi(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 qa(t.store,t.config,i.task.credential,a.authJson)})}async function Bi(e,t,n,r){n.id,V(e);let i=t.callbackTask;try{return S({...await Bc(t,i),generation:i.generation??0})}catch(e){return S({error:e instanceof Error?e.message:String(e)},409)}}async function Vi(e,t){if(!t.auth)return t;let n=await t.auth.session(e.headers);if(!(!n?.organizationId||n.organizationDenied))return{...N(t,n.organizationId),session:n}}const Hi=new Set([`owner`,`admin`]);function B(e){return!e.auth||Hi.has(e.session?.role??``)}function Ui(e,t){return B(e)?e:S({error:t},403)}function Wi(e,t){return!!(e&&t&&Me(e,t))}function V(e){let t=e.headers.get(`authorization`);return t?.startsWith(`Bearer `)?t.slice(7):null}const Gi=new Set([`localhost`,`127.0.0.1`,`::1`,`[::1]`]);function Ki(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 Gi.has(new URL(`http://${t}`).hostname)}catch{return!1}}const qi=e=>e.local?`local`:e.config.store===`postgres`?`cloud`:`memory`,Ji=e=>e.startsWith(`/tasks/`)||e.startsWith(`/logins/`)||e===`/runners/register`,Yi=[`/hooks/`,`/create/`,`/install/`,`/connect/`];function Xi(e,t){let n=e?.replace(/^::ffff:/,``)??``;if(Gi.has(n)||n.startsWith(`127.`))return!0;let r=URL.parse(`http://localhost${t}`)?.pathname??``;return Ji(r)||Yi.some(e=>r.startsWith(e))}function Zi(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(Ki(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&&!Ki(e)&&(Ji(n.pathname)||Yi.some(e=>n.pathname.startsWith(e)))}function Qi(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 $i(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 ea(e,t){if(!t.auth){let n=()=>new Response(`Unauthorized`,{status:401,headers:{"www-authenticate":`Bearer`}});if(t.config.store!==`memory`||!Ki(e))return n();let r=$i(e),i=Wi(V(e),t.config.adminToken),a=Wi(r,t.config.adminToken);return i?{...t,authorizedRequest:e}:a?e.method===`GET`||Qi(e)?{...t,authorizedRequest:e}:ot():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`)&&!Qi(e,t.config.publicUrl)?ot():{...N(t,n.organizationId),session:n,authorizedRequest:e}}async function ta(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?st(new URL(e.url)):{...N(t,i.organizationId),session:i}}async function na(e,t){if(e.method!==`POST`)return;let n=Oi.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=N(t,i),s=await o.store.get(`runner`,r);if(s?.kind===`http`&&Me(F(o.config,s.secret).secret??``,a))return`runner:${i}:${r}`}async function ra(e,t,n,r){let i=n.id,a=V(e);if(!a)return new Response(`Unauthorized`,{status:401});let o=M(a);return o.task!==i||typeof o.organization!=`string`||!o.organization||!Number.isInteger(o.attempt)||(t.scope&&(t=N(t,o.organization)),t.organizationId!==o.organization)?new Response(`Unauthorized`,{status:401}):t}async function ia(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,j(o));e&&(t=N(t,e))}let s=await Ni(e,t,a,i);return s instanceof Response?s:{...t,callbackTask:s}}function aa(e,t,n,r){return ia(e,t,n,r,e.method===`POST`)}function oa(e){let{organization:t}=M(e);return typeof t==`string`?t:void 0}async function sa(e,t,n){let r=V(e);if(!r)return new Response(`Unauthorized`,{status:401});let i=oa(r),a=i&&t.scope&&i!==t.organizationId?N(t,i):t,o=n.id,s=await a.store.get(`login`,o);return!s||!Me(j(r),s.tokenHash)?new Response(`Unauthorized`,{status:401}):{...a,callbackLogin:s}}async function ca(e,t){let n=e.method===`POST`?new URLSearchParams(await e.clone().text()):void 0;return t.searchParams.get(`tx`)??ut(t.searchParams.get(`state`))?.tx??n?.get(`tx`)??void 0}async function la(e,t,n,r){let i=await ca(e,r),a=t.serverOrganizationId??t.organizationId;return i&&nn(t,i)===`*`&&tn(t,i)===a?{...N(t,a),operatorApp:!0}:ta(e,t)}function ua(e,t,n,r){return ta(e,t)}async function da(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 Vi(e,t);return a?.session?{...t,linkContext:a}:st(r)}function fa(e,t){return Ui(t,`Workspace admin access is required.`)}function pa(e,t){return t.local?t:w()}function ma(e,t){return t.local?S({error:ll},400):t.session?.user.id?t:S({error:`Sign in to use a subscription.`},403)}function ha(e){return async(t,n,r,i)=>{let a=n.authorizedRequest===t?n:await ea(t,n);return a instanceof Response?a:e?e(t,a,r,i):a}}function ga(e,t,n,r){return e.method===(n.engine?`POST`:`GET`)&&(!t.local||n.engine&&!ul(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 _a(e,t,n,r){return t.config.publicUrl&&t.auth?t:ui(e,t,r)}async function va(e,t,n,r){if(!t.auth)return ea(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 ya(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`)&&!Qi(e,t.config.publicUrl)?ot():{...t,session:i}:S({error:`Sign in first.`},401)}function ba(e,t,n,r){return e.method===`POST`?t.auth||t.config.store!==`memory`||!Ki(e)?w():Qi(e)?t:ot():t}async function xa(e,t,n,r){return e.method===`GET`?{...t,session:(await Vi(e,t))?.session}:t}async function Sa(e,t,n,r){return[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`].includes(e.method)&&t.auth&&(await Vi(e,t))?.session?lt(`/dash`):t}async function Ca(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&&!i?ai(e,t,r,r.pathname+r.search):t.auth&&!(await Vi(e,t))?.session?st(r):t}function wa(e,t,n,r){return e.method===`POST`&&t.local?S({error:ll},400):t}async function Ta(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 Vi(e,t);return i?.session?{...t,linkContext:i}:e.method===`GET`?st(r):S({error:`Sign in first.`},401)}function Ea(e,t,n,r){return![`GET`,`POST`,`PUT`,`PATCH`,`DELETE`].includes(e.method)||t.auth?t:w()}function Da(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 Oa=class extends Error{status;constructor(e,t){super(`Credential check failed: ${e}${t?` ${t}`:``}`),this.status=e}};function ka(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 Aa(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=ka(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 Oa(i.status,i.statusText)}async function ja(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 Ma(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 Na(e,t){let n=e.session?.user.id,r=await Ma(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=>Ua(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 Pa(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 Fa=(e,t,n)=>e.filter(e=>e.id!==t&&e.value.engine===n),Ia=(e,t)=>({id:e.id,value:{...e.value,isDefault:t}});function La(e,t,n){return Fa(e,t,n).filter(e=>e.value.isDefault).map(e=>Ia(e,!1))}function Ra(e,t,n){let r=Fa(e,t,n)[0];return r?[Ia(r,!0)]:[]}async function za(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`,Da(i,s),async(e,c)=>{o||(s=Pa(c,s));let l=Da(i,s),u=c.find(e=>e.id===l)?.value,d=!!(n.makeDefault||u?.isDefault&&u.engine===a||!Fa(c,l,a).some(e=>e.value.isDefault));return[{id:l,value:{...On(t,{env:n.credential.env}),engine:a,...i?{owner:i}:{},...n.account?{account:n.account}:{},isDefault:d,createdAt:u?.createdAt??r()}},...d?La(c,l,a):[],...u?.isDefault&&u.engine!==a?Ra(c,l,u.engine):[]]}),s}function Ba(e,t){return e.withCredential(`credential`,t,async(e,n)=>e&&[{id:t,value:null},...e.isDefault?Ra(n,t,e.engine):[]])}function Va(e,t){return e.withCredential(`credential`,t,async(e,n)=>e&&[Ia({id:t,value:e},!0),...La(n,t,e.engine)])}async function Ha(e,t,n,r,i){let a=await e.get(`login`,t);if(!a)return!1;let o=Da(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},...La(s,o,a.engine)]})}function Ua(e,t){return{...kn(e,t),engine:t.engine}}function Wa(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 Ga(e,t,n){let r=Ua(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:Wa(r.env),...n.account?{account:n.account}:{}}}const Ka=e=>{try{return Date.parse(JSON.parse(e??``).last_refresh??``)}catch{return NaN}};function qa(e,t,n,r){return e.withCredential(`credential`,n,async e=>{if(!e)return;let{env:i}=Ua(t,e);if(!(!i.CODEX_AUTH_JSON||!(Ka(r)>(Ka(i.CODEX_AUTH_JSON)||0))))return[{id:n,value:{...e,...On(t,{env:{...i,CODEX_AUTH_JSON:r}})}}]})}function Ja(e,t){return An(e,t.iv===`plain`?`plain.${t.ciphertext}`:`${t.iv}.${t.tag}.${t.ciphertext}`)}async function Ya(e,t){if(!t.encryptionKey)throw Error(`SERVER_ENCRYPTION_KEY is required to rotate keys`);let n=Tn(t.encryptionKey),r=e=>An(t,e)!==n,i=e=>r(e)?P(t,F(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||Ja(t,e)===n))return[{id:r,value:{...e,...On(t,{env:Ua(t,e).env})}}]})&&o++;return o+await Tc(e,t)}function Xa(e,t){return`${e.config.publicUrl?.replace(/\/$/,``)??``}/dash/settings/credentials?engine=${encodeURIComponent(t)}`}const Za=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())}),Qa=`Only an owner or admin of this workspace can change workspace credentials.`;function $a(e,t,n){let r=e.session?.user.id,i=t.searchParams.has(`workspace`)||!r;return{workspace:i,id:Da(i?void 0:r,n)}}async function eo(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 Ma(t.store,i)).map(e=>Ga(t.config,e.id,e.value)).sort((e,t)=>o(a(e),a(t)));if(!at(r))return S(s);let c=ct(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(dt(u,C(r),a))}async function to(e,t,n,r){n.label;let i=t.session?.user.id,a=await e.json().catch(()=>void 0),o=Za.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:Qa},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 Aa({engine:c,env:s},t.fetch??fetch);let e=await za(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 Oa?e.status:400)}}async function no(e,t,n,r){let i=n.label;t.session?.user.id;let{workspace:a,id:o}=$a(t,r,i);return a&&!B(t)?S({error:Qa},403):await Ba(t.store,o)?S({ok:!0}):S({error:`Unknown credential`},404)}async function ro(e,t,n,r){let i=n.label;t.session?.user.id;let{workspace:a,id:o}=$a(t,r,i);return a&&!B(t)?S({error:Qa},403):await Va(t.store,o)?S({ok:!0}):S({error:`Unknown credential`},404)}async function io(e,t,n,r){let i=n.engine;return dl(i),S(await ml())}async function ao(e,t,n,r){let i=n.engine;return await fl(i),S(await ml())}const oo=(e,t)=>e===`credential`?`credential:${H(t).owner??``}`:e===`runner`?`runners:`:`installation:${t}`;async function so(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 co=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(oo(e,t),()=>so(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 Ha(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`&&!r.unarchive?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 lo=new Set([`app`,`installation`,`runner`]),uo=new Set([`task`,`tasklog`,`inbox`,`usage`]),fo=new Set([`agent`,`agentversion`]);function po(e,t){try{return JSON.parse(O.readFileSync(e,`utf8`))}catch(e){if(e.code===`ENOENT`)return t;throw e}}function mo(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 ho=class{now;derived=new co;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(oo(e,t),()=>so(this,e,t,n))}get appsFile(){return u(`apps.json`)}get deliveriesFile(){return T.join(y(``),`deliveries.json`)}get notesDir(){return T.join(y(``),`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 po(this.appsFile,{})}recordsFile(e){return e===`delivery`?this.deliveriesFile:e===`usage`?me():e===`snapshot`?T.join(y(``),`snapshots.json`):T.join(y(``),`runner`,`${e}.json`)}deliveries(e=`delivery`){let t=this.now();return Object.fromEntries(Object.entries(po(this.recordsFile(e),{})).filter(([,e])=>e.expiresAt===void 0||e.expiresAt>t))}entries(e){if(lo.has(e))return Object.entries(this.apps()[e]??{});if(e===`delivery`||e===`snapshot`||uo.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(fo.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(fo.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(lo.has(e)){let r=this.apps();r[e]={...r[e],[t]:n},mo(this.appsFile,`${JSON.stringify(r,null,2)}\n`)}else if(e===`delivery`||e===`snapshot`||uo.has(e)){let i=this.deliveries(e);i[t]={value:n,...r===void 0?{}:{expiresAt:this.now()+r}},mo(this.recordsFile(e),`${JSON.stringify(i)}\n`)}else e===`note`?mo(this.noteFile(t),String(n)):this.refuse(e)}remove(e,t){if(lo.has(e)){let n=this.apps(),r=n[e];return!r||!(t in r)?!1:(delete r[t],mo(this.appsFile,`${JSON.stringify(n,null,2)}\n`),!0)}if(e===`delivery`||e===`snapshot`||uo.has(e)){let n=this.deliveries(e);return t in n&&(delete n[t],mo(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 fo.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(fo.has(e))return this.derived.delete(e,t);await this.serial(()=>this.remove(e,t))}async create(e,t,n,r={}){return fo.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 fo.has(e)?this.derived.take(e,t):this.serial(()=>this.remove(e,t))}};function go(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=>Ot(`git`,[`log`,`-1`,`--format=%H`,`--`,`.`],{cwd:e},(e,n)=>t(e?void 0:n.trim()||void 0)))}async function _o(e,t,n,r){let i=await ye(t,n),a=await Promise.all(i.filter(e=>!r||e.id===r).map(async t=>{let n=t.usage?{settings:t.usage}:{};if(t.builtin){let{record:r,version:i}=await R(e,t.id);if(!r)return;let a={...r,settings:void 0,...n,local:!0};return await e.put(`agent`,t.id,a),{record:a,version:i}}if(!t.dir)return;let r=await go(t.dir),i=O.statSync(T.join(t.dir,`agent.json`)),a=T.join(t.dir,`system.md`),o={agent:t.id,version:1,definition:t.definition,systemPrompt:O.existsSync(a)?O.readFileSync(a,`utf8`):``,files:Cr(t.dir),...r?{commit:r}:{},importedFrom:`local:${t.dir}`,createdAt:i.mtimeMs},s={id:t.id,name:t.name,...t.definition.description?{description:t.definition.description}:{},source:T.resolve(t.dir)===u(`agents`,t.id)?`home`:`repo`,path:t.dir,currentVersion:1,...n,local:!0,...r?{commit:r}:{},createdAt:i.birthtimeMs||i.mtimeMs,updatedAt:i.mtimeMs};return await e.put(`agentversion`,fr(t.id,1),o),await e.put(`agent`,t.id,s),{record:s,version:o}}));if(!r){let t=new Set(i.map(e=>e.id));for(let n of await pr(e))n.local&&n.path&&!t.has(n.id)&&await e.delete(`agent`,n.id)}return a.filter(e=>!!e).sort((e,t)=>e.record.id<t.record.id?-1:+(e.record.id>t.record.id))}async function vo(e,t,n,r){let i=(await ye(e,t)).find(e=>e.id===n&&!e.builtin)?.dir??u(`agents`,n),a={...r.files,"agent.json":`${JSON.stringify(r.definition,null,2)}\n`,"system.md":r.systemPrompt};for(let[e,t]of Object.entries(a))O.mkdirSync(T.dirname(T.join(i,e)),{recursive:!0}),O.writeFileSync(T.join(i,e),t)}async function yo(e,t,n){let r=(await ye(e,t)).find(e=>e.id===n&&!e.builtin);if(!r?.dir)throw Error(`No local agent named "${n}".`);return T.resolve(r.dir)===u(`agents`,n)&&(O.rmSync(r.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 bo(e,t){if(t.cwd===void 0)return;if(!e.local)throw new U(`cwd is available on a local server only`);let n=ar(t.cwd);if(!n.ok)throw new U(n.detail);return n.folder.path}const xo=65536,So=/^[a-z0-9][a-z0-9_-]*$/i,Co=new Set([`claude`,`codex`,`custom`]),wo=new Set([`low`,`medium`,`high`]);function To(e){let t=e.flow??`default`;if(!So.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)>xo)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&&!Co.has(e.engine))throw new U(`Unknown engine "${e.engine}"`);if(e.effort!==void 0&&!wo.has(e.effort))throw new U(`Unknown effort "${e.effort}"`);if(e.permissions!==void 0&&!(e.permissions in i))throw new U(`Unknown permissions "${e.permissions}"`);if(e.mcp!==void 0&&(!Array.isArray(e.mcp)||!e.mcp.every(e=>So.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 Eo(e,t){let n=(await e.store.list(`installation`)).filter(({value:t})=>!t.deletedAt&&e.integrations[t.integration]?.repos),r=new Map((await Nl(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(jc(e,i),F(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 Do(e,t,n,r){let i=n.repo,{integration:a,installation:o,app:s,token:c}=await Eo(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 Oo(e,t,n){To(n);let r=bo(e,n),i=(e.now??Date.now)(),a=e.session?.user.id,o=n.agent??`coder`;e.local&&await _o(e.store,e.local.cwd,e.integrations);let s=()=>e.store.taskInputs?e.store.taskInputs(o,a,n.engine):R(e.store,o),c=await s();await wr(e.store,i,o,c)&&(c=await s());let{record:l,version:u}=c,d=await er(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=Sr(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=Ce(f),m=e.store.taskInputs?c.credential:(await ja(e.store,p.engine,a))?.id,h=p.engine??`claude`;if(!m&&d.runner!==`http`&&!await hl(e,h))throw new U(`No ${h} credential is connected`,409,Xa(e,h));let g=`${i.toString(36)}-${k(4).toString(`hex`)}`,_=n.repo?await Do(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?$c(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 ko(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 Ao(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>xo)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=ko(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 jo={principalPerMinute:300,ipPerMinute:60,authPerMinute:20,registerPerMinute:10,pairingPerMinute:5,concurrentTasks:10};var Mo=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 No=[[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 Po(e,t,n){let r=new URL(e.url).pathname,i=No.find(([e])=>e(r));if(!i)return(r===`/dash`||r.startsWith(`/dash/`))&&t.auth&&!await t.auth.session(e.headers)?Fo(t,void 0,n,`auth`)??{}:{};let a=r.startsWith(`/admin/`)?await ea(e,t):void 0;return Fo(t,r===`/runners/register`?await na(e,t):a&&!(a instanceof Response)?a.session?`user:${a.session.user.id}`:`admin`:void 0,n,i[1])??{scope:a}}function Fo(e,t,n,r){let i=e.limits??=new Mo((e.now??Date.now)()),a={...jo,...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 Io(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 Lo(e,t,n){try{await Io(e.stop(t),1e4,`runner stop`)}catch(e){console.error(`coder server: runner stop ${n} failed`,e)}}async function Ro(e,t,n,r={}){try{await Io(Mi(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 zo(e,t,n){if(e.local&&t.handle?.startsWith(`cli:`))return Yc(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)?Ro(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 nr(e,t.task);if(t.startedAt!==void 0&&n-t.startedAt>=e.config.taskTimeoutMs)return i&&await Lo(i,t.handle,t.task.id),Ro(e,t,`timeout`);if(!i||n-(t.lastSeenAt??t.startedAt??t.updatedAt)<(e.config.taskStallMs??3e5))return!1;let a=await Io(i.status(t.handle),1e4,`runner status`);return a.state===`exited`&&Ro(e,t,`runner exited${a.code===void 0?``:` with code ${a.code}`}`,{handle:t.handle,lastSeenAt:t.lastSeenAt??null})}async function Bo(e,t,n){let i=e.now??Date.now,a=e.config.limits?.concurrentTasks??jo.concurrentTasks,o=e.config.store===`postgres`?e.config.maxTasks:Math.min(a,e.config.maxTasks??a);if(t){let t=await e.queue.running(),n=0;for(let r of t)await zo(N(e,r.organizationId),r.status,i()).catch(()=>!1)&&n++;if(o!==void 0&&t.length-n>=o)return}let s=[];for(;;){let t=e.local?Wc(e.local.cwd,!1).filter(e=>e.status===`running`||e.status===`waiting`):[],c=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,l=t.filter(t=>!c.has(t.task.id)&&!c.has(r(t.task.cwd??e.local.cwd,t.task.id)?.flowRunId??``)).length,u=o===void 0?void 0:o-l;if(u!==void 0&&u<=0)break;let d=await e.queue.claim(i(),u,n,a);if(n=!1,!d)break;let f=N(e,d.organizationId),p=d.status;if(await Jc(f,p)){if(n=d.more,!d.more)break;continue}let m=await nr(f,p.task);if(!m){await Ro(f,p,`No runner available: ${p.task.runner}`);continue}let h=p,g={generation:p.generation??0,attempts:p.attempts,tokenHash:p.tokenHash??null,statuses:[`running`,`waiting`]},_;try{let e=m.start(p.task,{CODER_SERVER:f.local&&m.kind===`local`?`http://localhost:${f.local.port}`:f.config.publicUrl??``,CODER_TASK_TOKEN:d.token,CODER_INBOX_MODE:m.push?`push`:`poll`},m.kind===`vercel-sandbox`?(await Vc(f,p.task)).env:void 0);if(_=await Io(e,3e4,`runner start`).catch(t=>{throw e.then(e=>Lo(m,e,p.task.id),()=>{}),t}),await f.queue.patchTask(d.organizationId,p.task.id,{handle:_},i(),g)||await Lo(m,_,p.task.id),n=d.more,!d.more)break}catch(e){_!==void 0&&await Lo(m,_,p.task.id);let t=e instanceof Error?e.message:String(e);if(p.attempts<(f.config.taskAttempts??2)){s.push({...d,status:h});continue}await Ro(f,h,t)}}for(let t of s)await N(e,t.organizationId).queue.requeue(t.organizationId,t.status.task.id,i(),{attempts:t.status.attempts,tokenHash:t.status.tokenHash})}function Vo(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,Bo(e,n,r)),c=o.then(s,s);return i.waiting=c,i.running=c.catch(()=>{}),c}function Ho(e,t=!1){let n=Vo(e,!0,!1,t).catch(()=>{});e.waitUntil&&e.waitUntil(n)}function Uo(e,t){return $t(e,`link-start`,`*`,JSON.stringify(t),3e5)}const Wo=6e4,Go=864e5,Ko=262144,qo=[`model`,`engine`,`effort`],Jo=[`Usage:`,"• `/setup model <name>`. Sets the engine model. Also accepts `engine` and `effort`.","• `/setup show`. Shows the current settings."].join(`
|
|
5
|
+
`);function Yo(e){return e.type===`command`}function Xo(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 Zo(e){let[t=``,...n]=e.text.trim().split(/\s+/);return qo.includes(t)&&n.join(` `).trim()!==``}async function Qo(e,t,n){let[r=``,...i]=e.text.trim().split(/\s+/),a=i.join(` `).trim(),o={...t.settings},s;return r?r===`show`?s=Xo(t.settings):qo.includes(r)?a?(o[r]=a,s=`${r} set to \`${a}\`.`):s=`Give a value: \`/setup ${r} <name>\`.`:s=`Unknown setting \`${r}\`.\n${Jo}`:s=Jo,JSON.stringify(o)!==JSON.stringify(t.settings??{})&&await Ml(n,`installation`,t.id,{settings:o}),s}async function $o(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 es(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 ts(e,t,n,r,i,a,o=!1){let s=e.config.publicUrl?.replace(/\/$/,``),c=Pt(),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 Uo(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 ns(e,t){return Object.fromEntries(Object.entries(e).filter(([e])=>e in t.definition.integrations))}async function rs(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 is(e,t){return`<!-- coder:setup -->\nCoder is installed, but no engine is connected. [Connect ${t}](${Xa(e,t)}).`}async function as(e,t,n,i){let a=Q({agent:n,requester:i,event:t}),o=await ss(e,a)??await e.store.get(`snapshot`,`session:${a}`);if(!o||o.requester!==i||!t.actor.id||o.actor!==t.actor.id)return;let s=await e.store.get(`task`,o.id);if(s&&[`queued`,`running`,`waiting`].includes(s.status)&&Q(s.task)===a)return s.task.id;let c=r(e.local.cwd,o.id);if(!c){let t=(await e.store.list(`delivery`,{prefix:`delivery:`})).find(e=>e.value.session?.key===a&&e.value.session.id===o.id)?.value.pending;if(!t?.task||t.taskId!==o.id||Q(t.task)!==a)return;await $c(e,t.task,t.taskId),c=r(e.local.cwd,o.id)}if(!c||c.agentId!==n)return;let l=g(e.local.cwd,c);return l.status===`running`||l.status===`queued`?l.id:void 0}async function os(e,t,n,r,i,a,o){let s=`delivery:${t.id}:${n.id}:${i.installationId}:${i.chat?.thread.id??``}:${i.deliveryId}`,c=await $o(e,n,i);if(!c||e.local&&await e.store.get(`delivery`,s).then(e=>e&&!e.pending))return{};if(!e.local)return ls(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 ls(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 ss(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 cs(e,t,n,r,i,a,o=!1){let c=Pt(),l={event:n,...a?{task:a,taskId:a.flow==="default"?s():Ve()}:{}},u;if(e.local&&!n.repo){let n=await e.store.get(`delivery`,t);if(n&&!n.pending)return{};if(l=n?.pending??l,l.task&&!l.taskId)throw Error(`Local delivery has no task binding`);if(u=n?.session,!u&&o&&l.task){let t=Q(l.task);u={key:t,id:l.taskId,version:((await ss(e,t))?.version??0)+1,requester:l.task.requester,actor:l.task.event.actor.id}}await e.store.put(`delivery`,t,{at:r(),owner:c,pending:l,...u?{session:u}:{}})}else if(!await e.store.create(`delivery`,t,{at:r(),owner:c,pending:l},{ttlMs:Wo}))return{};return{work:(async()=>{let n=Promise.resolve(),a=e.local?void 0:setInterval(()=>{n=n.then(async()=>{await e.store.updateDelivery(t,c,{at:r(),owner:c,pending:l},{ttlMs:Wo})}).catch(()=>{})},Wo/3);try{await i(l),a&&clearInterval(a),await n,await e.store.updateDelivery(t,c,{at:r(),...u?{session:u}:{}},{ttlMs:Go})}catch(r){throw a&&clearInterval(a),await n,(!e.local||!l.task)&&await e.store.updateDelivery(t,c,void 0).catch(()=>{}),r}})()}}async function ls(e,t,n,i,a,o,s,c,l){let u=t=>cs(e,l,a,s,t);if(Yo(a))return e.auth&&Zo(a)&&!await es(e,t,a)?u(()=>ts(e,t,o,a,c,s(),!0)):u(()=>Qo(a,o,e.store).then(e=>c.whisper(e)).then(()=>{}));let d=await Mc(e,t,o,i,Pc(a.repo,t.tools.presets.observe)),p=await Rc(e,o,a,d),[m,h]=await Promise.all([e.loadAgent(n,o,a,p),e.auth&&a.actor.id?es(e,t,a):void 0]);if(!h&&e.auth&&a.actor.id&&t.events[a.type]?.addressed)return u(()=>ts(e,t,o,a,c,s()));let g=h?.id,_=Ze(a,m);if(!_)return{};let v=a.chat&&_.flow==="default"&&t.events[a.type]?.steers,ee=t=>cs(e,l,a,s,async t=>{let n=t.task,r=await $c(e,n,t.taskId);if(v){let i=await ss(e,Q(n));i&&i.id===t.taskId&&await e.store.put(`snapshot`,`session:${i.key}`,{...i,id:r.task.id})}},t,!!v);if(e.local&&!a.repo){let t=await e.store.get(`delivery`,l);if(t?.pending?.task){let e=t.pending.task;return Q(e)!==Q({agent:m.id,requester:g,event:a})||e.flow!==_.flow?{}:ee(e)}}let te=e.local&&!a.repo&&v?await as(e,a,m.id,g):void 0;if(te){let t=await e.store.get(`task`,te),n=r(e.local.cwd,te);return!n||t?.status===`queued`?u(async()=>{t&&await Cl(e,te,`steer`,{text:a.text},t.generation??0)}):n.threadId?u(()=>Ie(e.local.cwd,n,a.text).then(()=>{})):u(async()=>{f(e.local.cwd,te,a.text)})}let ne=Ce(m),re=ns(p,m),[ie,ae,oe,se]=await Promise.all([er(e,{requester:g,agent:m.definition.runner}),ja(e.store,ne.engine,g),rs(e,o,a),_n(e,t,o,a,re,m,t.events[a.type]?.addressed&&t.history!==!1?c.recent:void 0,h??null)]);if(!ae&&ie.runner!==`http`&&!await hl(e,ne.engine??`claude`))return(!e.local||a.repo)&&v&&(await e.queue.deliver(e.organizationId,{id:`${a.deliveryId}-${m.id}`,source:a.integration,agent:m.id,flow:_.flow,...ie,event:a,requester:g,definition:m.definition,tools:{}},s(),{key:l,ttlMs:864e5},!0,void 0,!1)).steered?{}:u(()=>c.post(is(e,ne.engine??`claude`)).then(()=>{}));let ce=new Set(t.tools.presets.observe),le=_.tools[a.integration]??[];h&&t.auth.canWrite&&le.some(e=>!ce.has(e))&&!await t.auth.canWrite(a,d)&&(_.tools[a.integration]=le.filter(e=>ce.has(e)));let ue=Object.fromEntries(Object.entries(_.tools).filter(([e])=>e in re).map(([t,n])=>{if(oe[t])return[t,n];if(t!==a.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(a))>Ko)throw Error(`Event exceeds 256 KB`);if(Buffer.byteLength(JSON.stringify(se))>Ko)throw Error(`Task context exceeds 256 KB`);let y={id:`${a.deliveryId}-${m.id}`,source:a.integration,agent:m.id,flow:_.flow,...ie,permissions:_.permissions??ne.permissions,event:a,author:t.author?.(n.name)??n.name,definition:m.definition,...ae?{credential:ae.id}:{},...g?{requester:g}:{},...m.files?{files:m.files}:{},...m.usage?{usage:m.usage}:{},tools:ue,...Object.keys(oe).length?{toolScopes:oe}:{},...Object.keys(se).length?{context:se}:{}};return e.local&&!a.repo&&ie.runner===`local`&&!ie.runnerId?ee(y):e.queue.deliver(e.organizationId,y,s(),{key:l,ttlMs:Go},!!v,e.config.maxQueued??1e3)}var us=e({addressedTo:()=>vs,chatFor:()=>ws,deliver:()=>bs,eventReplies:()=>Ss,later:()=>ys,renewInstallation:()=>Ts,renewInstallations:()=>Es,threadReplies:()=>xs});async function ds(e,t,n,r,i){let a=`${t.id}:${r}`,o=await bn(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 Mc(o,e.integrations[t.integration],s,n,i)}function fs(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 ps=e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),ms=(e,t)=>Object.keys(e.events).find(n=>e.events[n].on===t),hs=`(?![\\w-]|\\.\\w)`,gs=e=>e.replace(/[ \t]{2,}/g,` `).trim();function _s(e,t){let n=t.reduce((e,t)=>e.replace(RegExp(`(^|[^\\w-])@${ps(t)}${hs}`,`gi`),`$1`),e);return n===e?void 0:gs(n)}function vs(e,t){let n=_s(e,[t]);if(n!==void 0)return n;let r=RegExp(`^\\s*${ps(t)}${hs}[\\s,:;!.?-]*`,`i`);return r.test(e)?gs(e.replace(r,``)):void 0}function ys(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 bs(e,t,n,r,i,a){let o=await bn(e,`${n.id}:${i.installationId}`);if(!o||!n.builtin&&o.organizationId!==e.organizationId)return;let s=await os(o,t,n,r,i,e.now??Date.now,a);return await s.work,s.taskId&&await Vo(o,!0,!1,!0),s.taskId}function xs(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 Ss(e,t,n){if(!n.chat)return{post:async()=>{},whisper:async()=>{}};let r=await ws(e,t,{id:n.installationId,...n.repo?{repo:n.repo}:{}});return await r.initialize(),xs(r.thread(n.chat.thread.id),n.actor.id||void 0,n.chat.message?.id||void 0)}function Cs(e,t,n,r,i,a,o=a.id){let s=r===`message`&&t.agent===`coder`?vs(a.text,Ee):void 0;if(r===`message`&&t.agent===`coder`&&s===void 0)return;let c=ms(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)===ms(e,`mention`)?s??_s(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:Mt(`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:fs(i.toJSON()),message:fs(a.toJSON())},...n.repo?{repo:n.repo}:{},...l}}async function ws(e,t,n){let r=e.integrations[t.integration];if(!r)throw Error(`Unknown integration "${t.integration}"`);let i=F(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)=>ds(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 bn(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=mt(e.chatState??new ht,t.id),s=new Jt({userName:t.name,adapters:{[r.id]:a},state:{...o,isSubscribed:async()=>!1},concurrency:`concurrent`,dedupeTtlMs:Go,logger:`error`});if(!n)return s;let c=async(a,o,s,c)=>{let l=Cs(r,t,n,a,o,s,c);l&&ys(e,t,l,bs(e,r,t,i,l,xs(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 Yt({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=ms(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:Mt(`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()};ys(e,t,c,bs(e,r,t,i,c,{post:s,whisper:s}))}),s}async function Ts(e,t,n,r=`renew`){let i=e.integrations[t.integration];if(!i?.[r])return;let a=[],o=await ws({...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 Es(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 N(e,i).store.get(`installation`,r),a=n&&await yn(e,n.app);a&&await Ts(a.ctx,a.app,r.slice(a.app.id.length+1),t).catch(()=>{})}}const Ds=`.coder/agents`;function Os(e){return e.repo?`${e.repo.owner}/${e.repo.name}`:void 0}async function ks(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 As(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:F(t.config,s.token)}:s;return{contents:i,token:await i.auth.token(e,F(t.config,r.credentials),{...a&&o?{repo:{owner:a,name:o}}:{},tools:i.tools.presets.observe}),app:r,installation:s}}catch{continue}}}function js(e,t){let n=t.cwd??E.cwd(),r=t.now??Date.now,i=new Map;async function a(t,n,r){let i=ke(e),a=i&&r[i.id];if(!i?.repos||!a)return;let o=Os(n);if(n.integration===i.id&&o)return ks(i,o,a,n.repo?.ref);let s=t.settings?.configRepo;if(s)return ks(i,s,a)}function o(e,t,n,o){let s=`${e.id}@${Os(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 R(t.store,n.agent);c.record&&await wr(t.store,r(),n.agent,c)&&(c=await R(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 ${Os(a)??i.settings?.configRepo??n.agentsRepo}.`);return Sr(l,u,f&&typeof f==`object`?f:void 0,e)}return async(i,a,o,c)=>{let l=(await ye(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 As(e,t,i.agentsRepo,o,c);if(n){await Ns(t.store,n.contents,i.agentsRepo,Os(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 wr(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 Ms(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&&!Rt(a,l)&&Object.assign(c,await Ms(e,t,n,r,i,u,a,s+1))}}return c}async function Ns(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);we(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]=Se({definitions:{[o]:{json:p,builtin:!1}},usage:void 0},{...je,[t.id]:t});m&&d.push(await _r(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 Ms(t,n,u,i,r),commit:c,origin:l,importedFrom:`repo:${n}@${l.ref}`},a))}return d}async function Ps(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 mr(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&&Rt(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,F(e.config,a.credentials),{publicUrl:n,definition:o.definition,fetch:e.fetch??fetch,saveCredentials:async t=>{await i.put(`app`,a.id,{...a,credentials:P(e.config,t)})}});t&&await i.put(`app`,a.id,{...a,credentials:P(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 Fs(){return{integration:`source`,type:`import`,appId:``,installationId:``,deliveryId:``,actor:{id:`admin`},text:``}}async function Is(e,t,n,r=Fs(),i){let a=await As(e.integrations,{config:e.config,store:e.store},t,r);if(!a)return;let o=await Ns(e.store,a.contents,t,n,a.token,(e.now??Date.now)(),i?{branch:i}:{});return await Ps(e,o),o}const Ls=/^[a-z0-9][a-z0-9_-]*$/i;async function Rs(e,t){let n=Ne(Pe(),`builtin`).map(({name:e})=>({name:e,scope:`builtin`}));if(!t)return S(n);try{let{integration:r,token:i}=await Eo(e,t),a=(r.repos?await r.repos.listDir(t,`.coder/flows`,i):[]).map(e=>e.replace(/\.(ts|mjs|js)$/,``)).filter(e=>Ls.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 zs(e,t){if(!t)throw new U(`repo is required`);let{integration:n,token:r}=await Eo(e,t);return S(await n.repos?.pullRequests(t,r)??[])}async function Bs(e,t){try{return S(Xs(await Oo(e,`dashboard`,t)),201)}catch(e){return W(e)}}async function Vs(e,t,n,r){try{return Rs(t,r.searchParams.get(`repo`))}catch(e){return e instanceof G?S({error:e.message},400):W(e)}}async function Hs(e,t,n,r){try{return await zs(t,r.searchParams.get(`repo`))}catch(e){return e instanceof G?S({error:e.message},400):W(e)}}async function Us(e,t,n,r){let i=n.name;try{return Bs(t,{...await Ec(e),flow:i})}catch(e){return e instanceof G?S({error:e.message},400):W(e)}}async function Ws(e,t,n,r){try{{let{post:n,...r}=await Ec(e);if(!r.repo||!r.pr)throw new U(`repo and pr are required`);return Bs(t,{...r,flow:`review`,args:{post:n===!0}})}}catch(e){return e instanceof G?S({error:e.message},400):W(e)}}function Gs(e,t,n){return(e.waitUntil??(e=>void e.catch(()=>{})))(t),Promise.resolve(S({tasks:n},202))}async function Ks(e,t,n,r,i,a){if(`installation`in i){let t=await bn(e,i.installation.installation.id),n=await t?.store.get(`installation`,i.installation.installation.id);return!t||!n||await Ml(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 Ml(e.store,`app`,n.id,{branch:r.branch});let i=await Is(e,r.repo,r.ref,{...Fs(),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)ys(e,n,a,Ss(e,n,a).then(i=>bs(e,t,n,r,a,i)));return S({accepted:i.events.length},202)}async function qs(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:{...N(t,s.organizationId),...s.bound?{boundInstallation:s.bound}:{}},app:s.app}:await yn(t,o);if(!c)return new Response(`Unknown app`,{status:404});let{ctx:l,app:u}=c,d=F(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 Ks(l,r,u,d,f,(l.now??Date.now)());let p=(await ws(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 Js=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 Ys(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 Xs(e){let{tokenHash:t,handle:n,...r}=e;return{...r,...e.status===`queued`?{statusReason:`Waiting for a task slot`}:{},turns:ko(e),...e.task.credential?{credential:H(e.task.credential).label}:{}}}async function Zs(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:tl(e,i,-1,s??500)}):S({error:`No task "${i}"`},404)}let u=l.task.runner===`github-actions`&&l.handle?await Mi(t,l,o,s??500).catch(()=>c):await c;return S({...Xs(l),logs:u})}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;if(!n)return S({error:`No task "${i}"`},404);let r=await Y(e,n,i,void 0,t);return r.ok&&t.queue instanceof Tl&&t.queue.tombstone(i),r}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 Yc(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 nr(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 Sl(t,a)?(t.local&&(await t.store.delete(`snapshot`,`local-start:${i}`),await t.store.delete(`snapshot`,`completion:${i}`)),Ho(t,!0),S({ok:!0})):S({error:`Task changed while deleting. Try again.`},409)}async function $s(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(tl(e,i,o,s))}return S(([`running`,`waiting`].includes(l.status)||l.task.runner===`github-actions`)&&l.handle?await Mi(t,l,o,s).catch(()=>z(t.store,i,o,s)):await c)}async function ec(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 Cl(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 tc(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 Cl(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 nc(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(!Js.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(Xs(await Ao(t,a,String(o.text??``),o.outputSchema)))}catch(e){return W(e)}}async function rc(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 Cl(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 ic(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 Dl(t,i),o?S({ok:!0}):S({error:`No running or queued task "${i}"`},404)}async function ac(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,autoArchived:void 0},o),S({ok:!0})}async function oc(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()}-${Pt()}`},l=await os(t,n,i,F(t.config,i.credentials),c,s,await Ss(t,i,c));return Gs(t,l.work??Promise.resolve(),l.taskId?[l.taskId]:[])}const sc=new Set([`queued`,`running`,`waiting`,`completed`,`failed`,`cancelled`]);async function cc(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(bo(t,i),i.event)return oc(i,t);let e=(i.source===`cli`?void 0:await Kc(t,i))??await Oo(t,i.source===`cli`?`cli`:`dashboard`,i);return S(Xs(e),201)}catch(e){return W(e)}}function lc(e,t,n){let r=new Map(t.map(e=>[e.task.id,e]));for(let t of n)o(e,t,r.has(t.task.id))&&r.set(t.task.id,t);return[...r.values()]}async function uc(e,t,n,r){n.id;let i=r.searchParams.get(`status`);if(i&&i!==`active`&&!sc.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(Ys):e.map(Xs);if(t.local){await Gc(t,t.local.cwd);let e=lc(t.local.cwd,Wc(t.local.cwd,c.archived),await t.queue.list(t.organizationId)).filter(e=>gl(e,{...c,...l})).sort(vl),n=C(r,at(r)?void 0:20);if(!at(r))return S(u(e.slice(0,n)));let i=ct(r),a=e.filter(e=>yl(e,i)),o=dt(a.slice(0,n+1),n,_l);return S({...o,items:u(o.items),...r.searchParams.get(`counts`)===`1`?{counts:{all:e.length,active:e.filter(e=>Z.includes(e.status)).length,waiting:e.filter(e=>e.status===`waiting`).length}}:{}})}if(await t.queue.archiveStopped(t.organizationId,(t.now??Date.now)()),!at(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=ct(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=dt(m,d,_l);return S({...g,items:u(g.items),...h?{counts:h}:{}})}var G=class extends Error{};const dc=async e=>await e.get(`config`,`workspace`)??{};async function fc(e,t){let{sealed:n,...r}=await dc(e);if(!n)return r;let i=F(t,n);return{...r,mcp:Object.fromEntries(Object.entries(r.mcp??{}).map(([e,t])=>[e,{...t,...i[e]}]))}}function pc(){let e=oe();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 mc(e){return e.mcp?{...e,mcp:Object.fromEntries(Object.entries(e.mcp).map(([e,t])=>[e,wc(t)]))}:e}async function hc(e){if(e.local)return mc(pc());let{sealed:t,...n}=await dc(e.store);return n}async function gc(e,t){return _c(e,e=>yc(e,t))}async function _c(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 vc(e){let t=v(e);if(t.length)throw new G(t.join(`; `))}async function yc(e,t){vc(t);let n=e.local?pc():await fc(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===Cc?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,wc(t)]}));if(e.local)return te({...t,...t.mcp?{mcp:r}:{}}),hc(e);let o={...t,...t.mcp?{mcp:a}:{},...Object.keys(i).length?{sealed:P(e.config,i)}:{}};return await e.store.put(`config`,`workspace`,o),hc(e)}async function bc(e,t){return _c(e,async e=>{let n=structuredClone(e.local?pc():await fc(e.store,e.config));return t(n),yc(e,n)})}function xc(e,t){return _c(e,async e=>yc(e,Sc(e.local?pc():await fc(e.store,e.config),t)))}function Sc(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:Sc(Object.hasOwn(n,e)?n[e]:void 0,r),writable:!0,enumerable:!0,configurable:!0});return n}const Cc=`********`;function wc(e){let t=e=>e&&Object.fromEntries(Object.keys(e).map(e=>[e,Cc]));return{...e,...e.env?{env:t(e.env)}:{},...e.headers?{headers:t(e.headers)}:{}}}async function Tc(e,t){return e.withConfigLock(async e=>{let n=await dc(e);return!n.sealed||An(t,n.sealed)===Tn(t.encryptionKey)?0:(await e.put(`config`,`workspace`,{...n,sealed:P(t,F(t,n.sealed))}),1)})}async function Ec(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 Dc(e,t){try{return S(await bc(e,t))}catch(e){if(e instanceof G)return S({error:e.message},400);throw e}}async function Oc(e,t,n,r){try{{let e=await hc(t);return S({config:e,effective:t.local?mc(de(t.local.cwd)):he(e)})}}catch(e){return e instanceof G?S({error:e.message},400):W(e)}}async function kc(e,t,n,r){try{{let n=await e.json().catch(()=>{throw new G(`A JSON body is required`)});return S(await xc(t,n))}}catch(e){return e instanceof G?S({error:e.message},400):W(e)}}async function Ac(e,t,n,r){try{return S(await gc(t,await Ec(e)))}catch(e){return e instanceof G?S({error:e.message},400):W(e)}}function jc(e,t){return t.token?{...t,token:F(e.config,t.token)}:t}function Mc(e,t,n,r,i){return t.auth.token(jc(e,n),r,i,async t=>{let r=await e.store.get(`installation`,n.id);if(r){let i=P(e.config,t);await e.store.put(`installation`,n.id,{...r,token:i}),n.token=i}})}async function Nc(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(F(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:P(e.config,a.refreshed)}),a.accessToken}function Pc(e,t){return{...e?{repo:{owner:e.owner,name:e.name}}:{},tools:t}}async function Fc(e,t,n,r,i,a,o){return(o===`requester`?await Nc(e,t,r,i).catch(()=>void 0):void 0)??Mc(e,t,n,i,a)}const Ic=e=>{let t=e&&/^([^/]+)\/([^/]+)$/.exec(e);return t?{owner:t[1],name:t[2]}:void 0};async function Lc(e,t,n,r){if(n.kind===`oauth`)return F(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:Ic(i.settings?.configRepo);if(s)return o.auth.token(jc(e,i),F(e.config,a.credentials),Pc(s,r?r.tools[t]??[]:o.tools.presets.observe))}async function Rc(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 Lc(e,t,r,i);n&&(a[t]=n)}catch{}})),a}async function zc(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 Fc(e,r,a,n,F(e.config,i.credentials),Pc(t.toolScopes?.[n.integration]?.repo??n.repo,t.tools[n.integration]??(o?r.tools.presets.comment:[])),Te(t.definition.integrations[n.integration],n.type)?.actAs),c=await Rc(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 Bc(e,t){let n=t.task,[r,i,a]=await Promise.all([n.event?zc(e,t.task):{},e.local?{}:fc(e.store,e.config),Vc(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 Hn?`brokered`:t]));return{task:n,tokens:r,credential:{...a,env:o},config:i}}async function Vc(e,t){let n=t.credential?await e.store.get(`credential`,t.credential):(await ja(e.store,t.usage?.engine??t.definition.engine,t.requester))?.value;if(n)return Ua(e.config,n);if(!t.runnerId&&!e.local)throw Error(`no-credential`);return{engine:t.usage?.engine??t.definition.engine??`claude`,env:{}}}var Hc=e({LOCAL_LOGINS:()=>ll,engineSignIn:()=>dl,engineSignOut:()=>fl,engineStatus:()=>ml,inspectLocalTask:()=>Yc,isLoginEngine:()=>ul,localLog:()=>tl,localTask:()=>J,localTaskAction:()=>Y,localTasks:()=>Wc,localUsage:()=>nl,machineSignedIn:()=>hl,pushLocalInbox:()=>el,recoverLocalTasks:()=>Zc,runLocalTask:()=>$c,startLocalTask:()=>Kc,startQueuedLocalTask:()=>Jc,stopLocalTasks:()=>Qc,sweepLocalQueue:()=>Gc,syncLocalUsage:()=>al});const Uc=e=>!e.name?.startsWith(Ke),K=e=>e?Date.parse(e):void 0;function q(e,t,n=!1){let r=K(t.createdAt)??0,i=ce(T.join(x(e,t.id),`answers.json`)),o=t.status===`running`?ge(x(e,t.id)).find(e=>!e.response):void 0,s=n&&!b.includes(t.status)?fe(e,t.id):null,c=n?a(e,t.id).filter(e=>!b.includes(t.status)||(K(e.at)??0)<(K(t.resumedAt)??r)).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&&(b.includes(t.status)||!c.length||(c.at(-1)?.finishedAt??0)<(K(t.resumedAt)??r))&&c.push({prompt:t.currentPrompt??t.prompt??``,...s?{result:{ok:s.status===0,output:s.finalMessage??s.error?.message??``}}:{},...t.error?{error:t.error}:{},...b.includes(t.status)?{}:{finishedAt:K(t.completedAt)}});let l=t.flowRunId?Be(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}:{},...t.effort?{effort:t.effort}:{}}}:{},tools:{}},status:o?`waiting`:t.status,attempts:1,...o?{approval:o}:{},...i?{answer:i}:{},...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)}:{},...t.autoArchived?{autoArchived:!0}:{},createdAt:r,startedAt:K(t.resumedAt)??r,...t.completedAt&&!b.includes(t.status)?{finishedAt:K(t.completedAt)}:{},updatedAt:K(t.updatedAt)??r,local:!0,...n?{turns:c}:{}}}function Wc(e,n){let r=ze(e);return(n?t(e,{migrate:!1}):r).filter(Uc).map(t=>{let r=q(e,t);return n?{...r,archivedAt:r.archivedAt??r.updatedAt}:r})}async function Gc(e,t){let n=(e.now??Date.now)(),r=(await e.queue.list(e.organizationId,{archived:!1,statuses:[...ue]})).filter(e=>d(e.finishedAt??e.updatedAt,n)&&o(t,e)).map(e=>e.task.id);r.length&&await e.queue.archiveStopped(e.organizationId,n,r)}async function Kc(e,t,r){if(!e.local||t.repo||(t.flow??`default`)!=="default"||t.runner&&t.runner!==`local`)return;let i=bo(e,t)??e.local.cwd;await _o(e.store,i,e.integrations);let{version:a}=await R(e.store,t.agent??`coder`),o=await er(e,{requester:e.session?.user.id,runner:t.runner,agent:a?.definition.runner}).catch(e=>{throw new U(e.message)});if(!(o.runner!==`local`||o.runnerId)){if(To(t),!r)return qc(e,{id:s(),source:`dashboard`,agent:t.agent??`coder`,flow:`default`,runner:`local`,cwd:i,prompt:t.prompt,definition:{integrations:{}},tools:{}},{input:t,cwd:i});try{let e=t.agent&&t.agent!==`coder`?await We(i,t.agent,t.mcp?.join(`,`)):void 0,n=[],a=await pe({taskId:r,prompt:t.prompt??``,outputSchema:t.outputSchema,cwd:i,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?.join(`,`),nativeMcp:e?.nativeMcp,...e?{agentId:t.agent}:{},source:`dashboard`,onFallback:e=>n.push(e)},{waitForStartup:!1});return q(i,n.length?ie(i,a.taskId,{fallbacks:n}):a.task)}catch(e){throw e instanceof n?new U(e.message,409):e}}}async function qc(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 Vo(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 Jc(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 i=t.task.id,a=t.task.flow==="default"?r(n.cwd,t.task.id):void 0;if(a&&!n.resume)i=a.id;else if(n.resume){let e=r(n.cwd,t.task.id);if(!e)throw Error(`Local task is missing`);await Ie(n.cwd,e,t.task.prompt??``,{outputSchema:t.task.context?.outputSchema})}else n.input?await Kc(e,{...n.input,prompt:t.task.prompt,outputSchema:t.task.context?.outputSchema??n.input.outputSchema},t.task.id):i=(await $c(e,t.task,t.task.id,!0)).task.id;await e.store.put(`snapshot`,`local-start:${t.task.id}`,{...n,startedId:i});let o={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:${i}`},(e.now??Date.now)(),o)){let e=r(n.cwd,i);return e&&await Le(n.cwd,e),!0}if(t.task.flow==="default"){let r={task:t.task,cwd:n.cwd,fence:o};await e.store.put(`snapshot`,`completion:${i}`,r),Xc(e,i,r);let a=Dl(e,t.task.id);e.waitUntil&&e.waitUntil(a)}}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 Yc(e,t,n){if(t.status!==`running`&&t.status!==`waiting`)return!1;let i=await e.store.get(`snapshot`,`local-start:${t.task.id}`);if(!i)return!1;let a={attempts:t.attempts,tokenHash:t.tokenHash,generation:t.generation??0,statuses:[`running`,`waiting`]};if(t.task.flow!=="default"){let r=Be(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 He(t.task.id),r=Be(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,a)}let o=J(i.cwd,i.startedId??t.task.id);if(!o)return!1;if([`queued`,`running`,`waiting`].includes(o.status))if(t.cancelRequestedAt!==void 0||t.startedAt!==void 0&&n-t.startedAt>=e.config.taskTimeoutMs){let e=r(i.cwd,i.startedId??t.task.id);e&&await Le(i.cwd,e),o=J(i.cwd,t.task.id)}else return!1;let s=o.status;return s!==`completed`&&s!==`failed`&&s!==`cancelled`?!1:e.queue.finish(e.organizationId,t.task.id,{status:s,result:o.result,error:o.error},n,a)}function Xc(e,t,n){let i=e.store.completionWatches??=new Map;if(i.has(t))return;let a={stopped:!1,work:Promise.resolve()};i.set(t,a),a.work=(async()=>{let i=`completion:${t}:${n.fence?.generation??0}`,o=await e.store.get(`delivery`,i);if(o&&!o.owner)return;if(o?.pid)try{process.kill(o.pid,0);return}catch(e){if(e.code!==`ESRCH`)return}let s=Pt(),c={owner:s,pid:process.pid,pending:!0,posted:o?.posted??!1};if(o?.owner){if(!await e.store.updateDelivery(i,o.owner,c))return}else if(!await e.store.create(`delivery`,i,c))return;try{for(let o=0;o<5;o++)try{let o=null;for(;;){if(a.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 i=r(n.cwd,t);if(!i)return;let s=g(n.cwd,i);if(!b.includes(s.status)){let e=T.join(x(n.cwd,t),`result.json`),r=Math.max(K(s.completedAt)??0,K(s.resumedAt)??K(s.createdAt)??0);if(O.existsSync(e)&&O.statSync(e).mtimeMs>=r&&(o=fe(n.cwd,t)),o)break;if(s.error||s.status===`cancelled`){o={status:1,threadId:s.threadId??null,error:{message:s.error??`Task cancelled`}};break}}await new Promise(e=>setTimeout(e,100))}let l=await e.store.get(`task`,n.task.id);if(n.fence&&l&&(l.generation??0)===n.fence.generation&&l.attempts===n.fence.attempts&&l.tokenHash===n.fence.tokenHash&&await Yc(e,l,(e.now??Date.now)())&&Ho(e,!0),!await e.store.updateDelivery(i,s,c))return;if(!c.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:r}=await Promise.resolve().then(()=>us),a=await r(e,t,n.task.event);if(!await e.store.updateDelivery(i,s,c)||(await a.post((o.finalMessage??o.error?.message??``).trim()),c={...c,posted:!0},!await e.store.updateDelivery(i,s,c)))return}let u=T.join(x(n.cwd,t),`agent-note`),d=O.existsSync(u)?O.readFileSync(u,`utf8`).trim():(n.task.context?.note??``).trim();if(!await e.store.updateDelivery(i,s,c))return;d!==(n.task.context?.note??``).trim()&&(d?await e.store.put(`note`,A(n.task),d):await e.store.delete(`note`,A(n.task))),await e.store.updateDelivery(i,s,{posted:c.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(o===4)throw e;console.error(`coder server: local completion ${t} attempt ${o+1} failed, retrying`,e);let n=Date.now()+5e3*2**o;for(;!a.stopped&&Date.now()<n;)await new Promise(e=>setTimeout(e,Math.min(100,n-Date.now())))}}finally{await e.store.updateDelivery(i,s,{...c,pid:void 0})}})().catch(e=>{console.error(`coder server: local completion ${t} failed`,e)}).finally(()=>{i.delete(t)})}async function Zc(e){if(e.local)for(let{id:t,value:n}of await e.store.list(`snapshot`,{prefix:`completion:`}))r(n.cwd,t.slice(11))&&Xc(e,t.slice(11),n)}async function Qc(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 $c(e,t,n,i=!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 Vo(e,!1,!1,!0),await e.store.get(`task`,i)}if(!i){let r=bo(e,t)??e.local.cwd;return qc(e,{...t,id:n??s(),cwd:r},{cwd:r})}let a=t.event?await zc(e,t):{},o=t.event&&a[t.event.integration],c=bo(e,t)??e.local.cwd,l=await e.store.get(`task`,n??t.id),u={task:t,cwd:c,...l?{fence:{generation:l.generation??0,attempts:l.attempts,tokenHash:l.tokenHash,statuses:[`running`,`waiting`]}}:{}},d=t.flow!=="default"&&n?Be(n):void 0;if(d){let r=h(c).find(e=>e.flowRunId===n),i=(e.now??Date.now)();return r?q(c,r):{task:t,status:d.status===`running`?`running`:d.status===`completed`?`completed`:`failed`,attempts:1,createdAt:i,updatedAt:i,local:!0}}if(t.flow==="default"){n??=s();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,u);let a=T.join(x(c,n),`agent-note`);O.existsSync(a)||(O.mkdirSync(T.dirname(a),{recursive:!0}),O.writeFileSync(a,t.context?.note??``,{mode:384}))}let f=t.flow==="default"&&n?r(c,n):void 0;if(f)return f.status===`queued`&&!f.pid&&re(c,f.id),Xc(e,f.id,u),q(c,f);let p,m=new Promise(e=>p=e),g;g=Ge({cwd:c,agent:t.agent,flow:t.flow,task:t,taskId:n,toolEnvironment:{tokens:a},post:t.flow!=="default"&&t.source===t.event?.integration,...t.flow==="default"?{noteFile:T.join(x(c,n),`agent-note`)}:{},...o?{postToken:o}:{},source:t.source,onStart:n=>{(e.store.localFlows??=new Map).set(t.id,{stop:async()=>{n.requestStop(),await Ue(n.runId,n.runningIds())},work:g}),p(t.id)},onTask:n=>{t.flow==="default"&&Xc(e,n,u),p(n)}}).then(async n=>{t.flow!=="default"&&n.note!==void 0&&(n.note?await e.store.put(`note`,A(t),n.note):await e.store.delete(`note`,A(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===u.fence?.attempts&&n.tokenHash===u.fence?.tokenHash&&(n.generation??0)===u.fence?.generation&&await Yc(e,n,(e.now??Date.now)()),Ho(e,!0)}}),g.catch(()=>{});let _=await Promise.race([m,g.then(()=>void 0)]),v=_?r(c,_):void 0,ee=(e.now??Date.now)();return v&&q(c,v)||{task:t,status:t.flow!=="default"&&Be(t.id)?.status===`running`?`running`:`completed`,attempts:1,createdAt:ee,updatedAt:ee,local:!0}}async function el(e,t,n){let i=t.handle.slice(4),a=await e.store.get(`snapshot`,`local-start:${t.task.id}`);if(!a)throw Error(`Local task launch is missing`);let o={generation:t.generation??0,seq:-1,answers:[]};for(let s 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)!==s.generation||![`running`,`waiting`].includes(n.status))break;let c=r(a.cwd,i);if(!c)throw Error(`Local task is missing`);let l=s.kind===`cancel`?await Le(a.cwd,c):await Ye(a.cwd,{...c,name:void 0},s);s.kind===`ask`&&o.answers.push({seq:s.seq,value:l}),o.seq=s.seq}return o}function tl(e,t,n=-1,r){let i=``;try{i=O.readFileSync(T.join(x(e,t),`log.jsonl`),`utf8`)}catch{}let a=i.split(`
|
|
8
|
+
`).flatMap((e,t)=>{if(!e||t<=n)return[];let r=pt(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 i=r(e,t);return i&&Uc(i)?q(e,g(e,i),n):void 0}async function Y(e,t,n,i,a){let o=r(t,n);if(!o||!Uc(o))return Response.json({error:`No task "${n}"`},{status:404});let s=g(t,o),c=b.includes(s.status),u=e.method===`POST`?await e.json().catch(()=>({})):{},d=(e,t=409)=>Response.json({error:e},{status:t});if(e.method===`DELETE`&&!i){if(c&&await Le(t,s),Fe(t,s),a){let e=a.store.completionWatches?.get(n);e&&(e.stopped=!0,await e.work),await a.store.delete(`task`,n),await a.store.delete(`snapshot`,`local-start:${n}`),await a.store.delete(`snapshot`,`completion:${n}`),Ho(a,!0)}return Response.json({ok:!0})}if(e.method!==`POST`)return new Response(`Method not allowed`,{status:405});if(i===`cancel`)return c?(await Le(t,s),Response.json({ok:!0})):d(`No running or queued task "${n}"`,404);if(i===`archive`)return le(t,s),a&&await a.queue.patchTask(a.organizationId,n,{archivedAt:(a.now??Date.now)(),autoArchived:void 0},(a.now??Date.now)()),Response.json({ok:!0});if(i===`steer`||i===`continue`){let e=String(u.text??``);if(!e.trim())return d(`text is required`,400);if(i===`steer`&&!c)return d(`Task "${n}" is not active`);if(i===`continue`&&c)return d(`Task "${n}" is still active; steer or ask it instead`);let r=i===`continue`?u.outputSchema:void 0;if(r!==void 0&&(!r||typeof r!=`object`||Array.isArray(r)))return d(`outputSchema must be an object`,400);try{if(i===`continue`&&a){let i=a.store.completionWatches?.get(n);i&&await i.work;let o=(a.now??Date.now)(),c=await a.store.get(`task`,n);c&&[`running`,`waiting`].includes(c.status)&&(await Yc(a,c,o),c=await a.store.get(`task`,n));let l={prompt:e,context:{...c?.task.context,...r?{outputSchema:r}:{}}};if(await a.store.put(`snapshot`,`local-start:${n}`,{cwd:t,resume:!0}),c){if(!await a.queue.continueTask(a.organizationId,n,l,o,{attempts:c.attempts,generation:c.generation??0}))return d(`Task is already active`)}else await a.queue.enqueue(a.organizationId,{...q(t,s).task,...l},o,void 0,a.config.maxQueued??1e3);await Vo(a,!1,!0,!0);let u=await a.store.get(`task`,n);return Response.json(u?.status===`queued`?{...u,statusReason:`Waiting for a task slot`}:J(t,n))}let o=await Ie(t,s,e,{...typeof r==`object`&&r?{outputSchema:r}:{}});return Response.json(i===`continue`?J(t,n):o)}catch(e){return d(e.message)}}if(i===`ask`){let e=String(u.question??u.text??``);if(!e.trim())return d(`question is required`,400);let r=await Re(t,s,e),i=r.finalMessage??r.error?.message??``,a=T.join(x(t,n),`answers.json`);return l(a,[...ce(a)??[],i]),Response.json({ok:!0,answer:i})}if(i===`approve`){let e=ge(x(t,n)).filter(e=>!e.response),r=String(u.approvalId??u.id??e[0]?.id??``);return e.some(e=>e.id===r)?(ae(x(t,n),r,u.decision===`deny`||u.decision===`decline`?`decline`:`accept`),Response.json({ok:!0})):d(`Task "${n}" has no pending approval`)}return new Response(`Not found`,{status:404})}function nl(e,n=new Set,r=!0){let i=rl(n);return[...h(e),...r?t(e,{migrate:!1}):[]].filter(Uc).flatMap(t=>{let n=a(e,t.id);return il(t,n,!n.length&&!b.includes(t.status)?fe(e,t.id):null,i)})}function rl(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 il(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 al(e){let t=e.local;return t.usageSync??=cl(e).finally(()=>t.usageSync=void 0)}async function ol(e){try{return JSON.parse(await O.promises.readFile(e,`utf8`))}catch{return null}}async function sl(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 cl(e){let t=e.local;await t.cacheMaintenance;let n=se(),r=await ol(n),i=await e.store.list(`usage`,{prefix:`cli:`}),a=new Set(i.map(e=>e.id)),o=0,s=async()=>{++o%4==0&&await new Promise(e=>setImmediate(e))};if(t.archiveScan===void 0)for(let[t,n]of Object.entries(r?.rows??{}))a.has(t)||(await e.store.put(`usage`,t,n),a.add(t)),await s();let c=rl(a),l=(await O.promises.stat(_(t.cwd)).catch(()=>void 0))?.mtimeMs??0,u={},d=new Set,f=!1;for await(let{id:n,dir:i,archived:a}of ne(t.cwd)){if(await s(),d.has(n))continue;let t=a?await sl(i):void 0;if(a&&r?.counted?.[n]===t){u[n]=t,d.add(n);continue}let o=await ol(T.join(i,`job.json`));if(o){if(o.agent&&(o.engine=o.agent),d.add(n),Uc(o)){let t=(await O.promises.readFile(T.join(i,`results.jsonl`),`utf8`).catch(()=>``)).split(/\r?\n/).flatMap(e=>{try{return e?[JSON.parse(e)]:[]}catch{return[]}}),n=!t.length&&!b.includes(o.status)?await ol(T.join(i,`result.json`)):null;for(let[r,i]of il(o,t,n,c))await e.store.put(`usage`,r,i),f=!0,await s()}a&&(u[n]=t)}}if(f||r?.archive!==l||JSON.stringify(r?.counted)!==JSON.stringify(u)){let t=await e.store.list(`usage`,{prefix:`cli:`});await O.promises.mkdir(T.dirname(n),{recursive:!0});let r=ee(n);try{await O.promises.writeFile(r,`${JSON.stringify({archive:l,counted:u,rows:Object.fromEntries(t.map(e=>[e.id,e.value]))})}\n`),await O.promises.rename(r,n)}finally{await O.promises.rm(r,{force:!0})}}t.archiveScan=l}const ll=`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}},ul=e=>e in X;function dl(e){let t=X[e];kt(t.file,t.login,{detached:!0,stdio:`ignore`}).on(`error`,()=>{}).unref()}function fl(e){let t=X[e];return new Promise(e=>Ot(t.file,t.logout,{timeout:15e3},()=>e()))}function pl(e){return new Promise(t=>Ot(e.file,e.args,{timeout:15e3},(n,r)=>{try{t(!n&&e.ok(r))}catch{t(!1)}}))}async function ml(){let[e,t]=await Promise.all([pl(X.claude),pl(X.codex)]);return{claude:{signedIn:e,command:X.claude.command},codex:{signedIn:t,command:X.codex.command}}}async function hl(e,t){return!!e.local&&(t===`custom`||(await ml())[t]?.signedIn===!0)}const Z=[`queued`,`running`,`waiting`];function gl(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 _l=e=>({rank:p(e.status),createdAt:e.createdAt,id:e.task.id}),vl=(e,t)=>_e(_l(e),_l(t)),yl=(e,t)=>!t||_e(_l(e),t)>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 bl(e,t){return e.flow==="default"&&!!e.event?.actor.id&&Q(e)===Q(t)}const xl=6e5;async function Sl(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 Tl)return e.queue.deleteTask(e.organizationId,n,i);let[{DrizzleStore:a},{task:o,taskTombstone:s},{and:c,eq:l,isNull:u,sql:d},{rows:f}]=await Promise.all([import(`./store-BrNMqJgk.js`),import(`./schema-DoNO0dPh.js`).then(e=>e.u),import(`drizzle-orm`),import(`./shared-XsUX_ZZb.js`).then(e=>e.g)]);if(!(e.store instanceof a))throw Error(`Task store does not support fenced deletion`);let p=(e.now??Date.now)(),[m]=await f(e.store.db,d`with gone as (
|
|
9
|
+
delete from ${o}
|
|
10
|
+
where ${c(l(o.organizationId,e.organizationId),l(o.publicId,n),l(o.generation,r),l(o.attempts,i.attempts),i.tokenHash===null?u(o.tokenHash):l(o.tokenHash,i.tokenHash),i.handle===null?u(o.handle):l(o.handle,i.handle))}
|
|
11
|
+
returning organization_id, public_id
|
|
12
|
+
), marked as (
|
|
13
|
+
insert into ${s} (organization_id, public_id, deleted_at)
|
|
14
|
+
select organization_id, public_id, ${new Date(p).toISOString()}::timestamptz from gone
|
|
15
|
+
), pruned as (
|
|
16
|
+
delete from ${s}
|
|
17
|
+
where deleted_at < ${new Date(p-xl).toISOString()}::timestamptz
|
|
18
|
+
)
|
|
19
|
+
select count(*)::int as deleted from gone`);return!!m?.deleted}async function Cl(e,t,n,r,i){let a=await e.queue.appendInbox(e.organizationId,t,n,r,(e.now??Date.now)(),i);return a&&await Dl(e,t),a}const wl=new Set([`completed`,`failed`,`cancelled`]);var Tl=class{store;lock=Promise.resolve();tombstones=new Map;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&&bl(o.task,t))return await this.store.put(`task`,e,{...o,inboxSeq:Math.max(o.inboxSeq??-1,a.seq),updatedAt:n}),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=>bl(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,updatedAt:n}),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=vn(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&&wl.has(e.status)||e.status===`queued`)return;if(wl.has(e.status))return e;let o={...e,lastSeenAt:i,updatedAt:i};return await this.store.put(`task`,t,o),o})}async archiveStopped(e,t,n){let r=e=>e!==void 0&&wl.has(e.status)&&e.archivedAt===void 0&&(!n||n.includes(e.task.id))&&d(e.finishedAt??e.updatedAt,t);for(let{value:e}of await this.store.list(`task`))r(e)&&await this.serial(async()=>{let n=await this.read(e.task.id);r(n)&&await this.store.put(`task`,n.task.id,{...n,archivedAt:t,autoArchived:!0})})}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),this.tombstone(t),!0)})}continueTask(e,t,n,r,i){return this.serial(async()=>{let e=await this.read(t);if(!e||!wl.has(e.status)||!this.allowed(e,i))return!1;let{note:a,...o}=n.context??{},s=await this.store.get(`note`,A(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,generation:(e.generation??0)+1,inboxSeq:e.inboxSeq,createdAt:e.createdAt,updatedAt:r},{unarchive:!0}),!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||wl.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=>gl(e,t)).filter(e=>yl(e,n)).sort(vl).slice(0,t.limit)}tombstone(e){this.tombstones.set(e,Date.now())}async changes(e,t){let n=e[0]?.organizationId;if(!n)return{rows:[],deleted:[]};for(let[e,t]of this.tombstones)t<Date.now()-6e5&&this.tombstones.delete(e);return{rows:(await this.store.list(`task`)).map(e=>({organizationId:n,status:e.value})),deleted:[...this.tombstones].filter(([,e])=>e>t).map(([e,t])=>({organizationId:n,id:e,at:t}))}}async counts(e,t={}){let n=(await this.store.list(`task`)).map(e=>e.value).filter(e=>gl(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(wl.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()}:{},updatedAt: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,updatedAt:i}),s})}};const El=3e4;function Dl(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=Pt(),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 nr(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,El);if(t===void 0)return;n=d,i=t}else if(!await e.store.updateDeliveryLease(n,r,{owner:r,failures:i},{ttlMs:El}))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 el(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 Ol(e){let t=await e.queue.pendingInbox();await Promise.allSettled(t.map(({organizationId:t,status:n})=>Dl(N(e,t),n.task.id)))}function kl(e){let t=Ol(e).catch(()=>{});e.waitUntil&&e.waitUntil(t)}const $=`default`;async function Al(e){if(!e.databaseUrl)throw Error(`DATABASE_URL is required for the Postgres store`);let{connect:t}=await import(`./client-31YzOj-i.js`).then(e=>e.n);return t(e.databaseUrl,e.databasePool)}async function jl(e,t={}){if(e.store!==`postgres`){let e=t.local?new ho:new co;return{store:()=>e,queue:new Tl(e),chatState:new ht(t.local?T.join(y(``),`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 Al(e),[{DrizzleStore:r},{DrizzleQueue:i},{UNSCOPED_ORGANIZATION:a},{PgChatState:o}]=await Promise.all([import(`./store-BrNMqJgk.js`),import(`./queue-CirjEskI.js`),import(`./shared-XsUX_ZZb.js`).then(e=>e.g),import(`./chat-cknlIhVh.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 Ml(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 Nl(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{Mo as $,on as $n,xi as $t,rc as A,dr as An,pa as At,$s as B,Tn as Bn,Sa as Bt,kc as C,gr as Cn,wa as Ct,bc as D,Sr as Dn,ra as Dt,hc as E,vr as En,ga as Et,uc as F,nr as Fn,ya as Ft,Us as G,pn as Gn,Li as Gt,Vs as H,N as Hn,ia as Ht,lc as I,Vn as In,xa as It,js as J,mn as Jn,zi as Jt,Ds as K,un as Kn,Bi as Kt,Zs as L,F as Ln,Ui as Lt,tc as M,lr as Mn,sa as Mt,ic as N,Yn as Nn,_a as Nt,Js as O,fr as On,ua as Ot,nc as P,Xn as Pn,da as Pt,Ho as Q,rn as Qn,Si as Qt,Qs as R,On as Rn,Qi as Rt,Dc as S,mr as Sn,la as St,Ac as T,Tr as Tn,ba as Tt,Hs as U,vn as Un,Ta as Ut,qs as V,An as Vn,Xi as Vt,Ws as W,ln as Wn,Ii as Wt,us as X,cn as Xn,Mi as Xt,Ps as Y,sn as Yn,Ri as Yt,Vo as Z,an as Zn,z as Zt,Qc as _,kr as _n,va as _t,Z as a,Vr as an,Ha as at,G as b,hr as bn,Ea as bt,Ol as c,ii as cn,Da as ct,ml as d,ei as dn,eo as dt,wi as en,$t as er,Po as et,tl as f,oi as fn,H as ft,Zc as g,Or as gn,Gi as gt,Hc as h,jr as hn,ao as ht,Ml as i,Ci as in,so as it,ac as j,or as jn,ma as jt,cc as k,ar as kn,Zi as kt,kl as l,si as ln,ro as lt,Wc as m,Nr as mn,io as mt,Al as n,Di as nn,_o as nt,Tl as o,ci as on,to as ot,J as p,Mr as pn,Ya as pt,Ns as q,fn as qn,Fi as qt,Nl as r,ki as rn,vo as rt,xl as s,ri as sn,Na as st,jl as t,bi as tn,tn as tr,yo as tt,Q as u,ui as un,no as ut,Gc as v,Dr as vn,ha as vt,Oc as w,wr as wn,Ca as wt,Ec as x,L as xn,aa as xt,al as y,R as yn,fa as yt,ec as z,P as zn,qi as zt};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{s as e}from"./cli-B1ObVrL4.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"}]; none by default, all adds your engine\'s own MCP servers'],[`--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-ehg-fWIt.js`)).commandArchiveSweep,worker:async()=>(await import(`./worker-BLKTMLqa.js`)).commandWorker,run:async()=>(await import(`./run-DoRQSC_K.js`)).commandTask,list:async()=>(await import(`./list-B0ujEZhd.js`)).commandTasks,ls:async()=>(await import(`./list-B0ujEZhd.js`)).commandTasks,watch:async()=>(await import(`./watch-CQu-tJKZ.js`)).commandWatch,stream:async()=>(await import(`./watch-CQu-tJKZ.js`)).commandWatch,result:async()=>(await import(`./result-DGWyUHYU.js`)).commandResult,steer:async()=>(await import(`./steer-Cm_sHZqs.js`)).commandSteer,ask:async()=>(await import(`./ask-Chu7Twu_.js`)).commandAsk,stop:async()=>(await import(`./stop-DJS7DAPJ.js`)).commandStop,archive:async()=>(await import(`./archive-CemlWlVY.js`)).commandArchive,delete:async()=>(await import(`./delete-riCIKZwj.js`)).commandDelete,approvals:async()=>(await import(`./approvals-Cc9cq5T1.js`)).commandApprovals,approve:async()=>(await import(`./approve-oO9k2fnK.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};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{B as t,
|
|
1
|
+
import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{B as t,Ht as n,L as r,Mt as i,Nn as a,Pt as o,Y as s,g as c,jn as l,qt as u,rn as d,z as f}from"./dispatch-BsW_1m7e.js";import{t as p}from"./integrations-B2CavXR1.js";import{c as m,l as h,n as g}from"./actions-FzDNxMFf.js";import{i as _}from"./mcp-CmcL1MCG.js";import{r as v}from"./exec-DuUkLMqg.js";import y from"node:path";import b from"node:process";import{execFile as x}from"node:child_process";import{createHash as S,randomUUID as C}from"node:crypto";import w from"node:os";import T from"node:net";import E from"node:fs/promises";import{promisify as D}from"node:util";import O from"node:http";var k=e({INBOX_COMMAND:()=>Q,INBOX_SOCKET:()=>Y,applyTaskMessage:()=>K,checkout:()=>P,checkoutCache:()=>F,inboxSocket:()=>X,prepareRepo:()=>U,receiveInbox:()=>$,releaseCheckout:()=>L,requestInboxControl:()=>G,runTask:()=>q,sendInbox:()=>Z,startInboxControl:()=>W,taskServer:()=>j,withCheckoutLock:()=>I});const A=D(x);function j(){let e=b.env.CODER_SERVER?.replace(/\/+$/,``),t=b.env.CODER_TASK_TOKEN;if(!e||!t)throw Error(`CODER_SERVER and CODER_TASK_TOKEN are required with --task`);return{server:e,token:t}}async function M(e,t,n,r=``,i={}){let a=await fetch(`${e}/tasks/${encodeURIComponent(n)}${r}`,{...i,signal:i.signal?AbortSignal.any([i.signal,AbortSignal.timeout(3e4)]):AbortSignal.timeout(3e4),headers:{authorization:`Bearer ${t}`,...i.body?{"content-type":`application/json`}:{},...i.headers}}),o=await a.json().catch(()=>({}));if(!a.ok)throw Object.assign(Error(o.error??`Coder server answered ${a.status}`),{status:a.status});return o}function N(e){return e.length>0&&!e.startsWith(`-`)&&!e.endsWith(`/`)&&!e.endsWith(`.`)&&!e.endsWith(`.lock`)&&!/[\x00-\x20\x7f~^:?*[\\]/.test(e)&&!e.includes(`..`)&&!e.includes(`@{`)&&!e.includes(`//`)}async function P(e,t,n,r){let i=e.event?.repo;if(!i)return t;let a=y.join(t,`repo`);if(!N(i.ref)||!N(i.defaultBranch))throw Error(`Invalid repository ref`);let o=new URL(i.cloneUrl),s=p[e.event.integration]?.repos?.cloneHosts??[];if(o.protocol!==`https:`||!s.includes(o.hostname))throw Error(`Repository clone host does not match the integration`);await E.mkdir(t,{recursive:!0});let c=await E.mkdtemp(y.join(t,`.git-credential-`)),l=y.join(c,`token`),u=y.join(c,`askpass.sh`);n&&(await E.writeFile(l,n,{mode:384}),await E.writeFile(u,`#!/bin/sh
|
|
2
2
|
case "$1" in *Username*) printf x-access-token;; *) command cat "$CODER_GIT_TOKEN_FILE";; esac
|
|
3
|
-
`,{mode:448}));let d=n?{env:{...b.env,GIT_ASKPASS:u,CODER_GIT_TOKEN_FILE:l,GIT_TERMINAL_PROMPT:`0`}}:void 0;try{let e={...d,maxBuffer:67108864};if(r)return await I(r,async()=>{if(!await E.stat(y.join(r,`.git`)).catch(()=>void 0)){let t=await E.mkdtemp(`${r}-clone-`);try{await A(`git`,[`clone`,`--depth`,`50`,i.cloneUrl,t],e),await E.rename(t,r)}finally{await E.rm(t,{recursive:!0,force:!0})}}await A(`git`,[`-C`,r,`worktree`,`prune`,`--expire`,`now`],e),await A(`git`,[`-C`,r,`remote`,`set-url`,`origin`,i.cloneUrl],e),await A(`git`,[`-C`,r,`fetch`,`--depth`,`50`,`origin`,i.defaultBranch],e),await A(`git`,[`-C`,r,`fetch`,`--depth`,`50`,`origin`,i.ref],e),await A(`git`,[`-C`,r,`worktree`,`add`,`--detach`,a,`FETCH_HEAD`],e)}),a;await E.stat(y.join(a,`.git`)).then(()=>!0).catch(()=>!1)||await A(`git`,[`clone`,`--depth`,`50`,i.cloneUrl,a],e),await A(`git`,[`-C`,a,`fetch`,`--depth`,`50`,`origin`,i.ref],e),await A(`git`,[`-C`,a,`checkout`,`--detach`,`FETCH_HEAD`],e),await A(`git`,[`-C`,a,`fetch`,`--depth`,`50`,`origin`,i.defaultBranch],e)}finally{await E.rm(c,{recursive:!0,force:!0})}return a}function F(e){let t=e.event?.repo;if(t){if(![t.owner,t.name].every(e=>/^[\w.-]+$/.test(e)&&!/^\.+$/.test(e)))throw Error(`Invalid repository name`);return
|
|
4
|
-
`)){if(!e.trim())continue;let t;try{t=JSON.parse(e)}catch{continue}if(
|
|
5
|
-
`)}async function q(e,t){let n=j(),r=await M(n.server,n.token,e),i=r.task.event,a=i&&r.tokens[i.integration],o=b.env.CODER_INBOX_MODE===`poll`;delete b.env.CODER_INBOX_MODE;let c=b.env.CODER_CHECKOUT_CACHE;delete b.env.CODER_CHECKOUT_CACHE;let l=await B(r,t),u;try{return u=await P(r.task,t,a,c),await J(e,t,n,r,u,a,o)}finally{try{u&&await L(u)}finally{await V(n,e,r,l),delete b.env[s]}}}async function J(e,t,i,s,c
|
|
3
|
+
`,{mode:448}));let d=n?{env:{...b.env,GIT_ASKPASS:u,CODER_GIT_TOKEN_FILE:l,GIT_TERMINAL_PROMPT:`0`}}:void 0;try{let e={...d,maxBuffer:67108864};if(r)return await I(r,async()=>{if(!await E.stat(y.join(r,`.git`)).catch(()=>void 0)){let t=await E.mkdtemp(`${r}-clone-`);try{await A(`git`,[`clone`,`--depth`,`50`,i.cloneUrl,t],e),await E.rename(t,r)}finally{await E.rm(t,{recursive:!0,force:!0})}}await A(`git`,[`-C`,r,`worktree`,`prune`,`--expire`,`now`],e),await A(`git`,[`-C`,r,`remote`,`set-url`,`origin`,i.cloneUrl],e),await A(`git`,[`-C`,r,`fetch`,`--depth`,`50`,`origin`,i.defaultBranch],e),await A(`git`,[`-C`,r,`fetch`,`--depth`,`50`,`origin`,i.ref],e),await A(`git`,[`-C`,r,`worktree`,`add`,`--detach`,a,`FETCH_HEAD`],e)}),a;await E.stat(y.join(a,`.git`)).then(()=>!0).catch(()=>!1)||await A(`git`,[`clone`,`--depth`,`50`,i.cloneUrl,a],e),await A(`git`,[`-C`,a,`fetch`,`--depth`,`50`,`origin`,i.ref],e),await A(`git`,[`-C`,a,`checkout`,`--detach`,`FETCH_HEAD`],e),await A(`git`,[`-C`,a,`fetch`,`--depth`,`50`,`origin`,i.defaultBranch],e)}finally{await E.rm(c,{recursive:!0,force:!0})}return a}function F(e){let t=e.event?.repo;if(t){if(![t.owner,t.name].every(e=>/^[\w.-]+$/.test(e)&&!/^\.+$/.test(e)))throw Error(`Invalid repository name`);return i(`checkouts`,new URL(t.cloneUrl).hostname,t.owner,t.name)}}async function I(e,t){await E.mkdir(y.dirname(e),{recursive:!0});let n=`${e}.lock`,r=await E.mkdtemp(`${n}-`),i=`${b.pid}-${C()}`,a=Date.now()+3e5,o=!1;try{for(await E.mkdir(y.join(r,i));;)try{await E.rename(r,n),o=!0;break}catch(e){if(![`EEXIST`,`ENOTEMPTY`].includes(e.code??``))throw e;for(let e of await E.readdir(n).catch(()=>[])){let t=Number(e.split(`-`)[0]);if(!(!Number.isInteger(t)||t<=0))try{b.kill(t,0)}catch(t){t.code===`ESRCH`&&await E.rmdir(y.join(n,e)).catch(()=>{})}}if(await E.rmdir(n).catch(()=>{}),Date.now()>=a)throw Error(`Repository cache lock timed out`);await new Promise(e=>setTimeout(e,100))}return await t()}finally{o?(await E.rmdir(y.join(n,i)),await E.rmdir(n).catch(()=>{})):await E.rm(r,{recursive:!0,force:!0})}}async function L(e){if(!(await E.stat(y.join(e,`.git`)).catch(()=>void 0))?.isFile())return;let t=await A(`git`,[`-C`,e,`rev-parse`,`--git-common-dir`]).catch(async t=>{if(await E.stat(y.join(e,`.git`)).catch(()=>void 0))throw t});if(!t)return;let{stdout:n}=t,r=y.resolve(e,n.trim());await I(y.dirname(r),async()=>{await E.stat(y.join(e,`.git`)).catch(()=>void 0)&&await A(`git`,[`--git-dir`,r,`worktree`,`remove`,`--force`,e])})}const R=1048576;async function z(e){let t={maxBuffer:67108864};await A(`git`,[`-C`,e,`add`,`--intent-to-add`,`--all`],t);let{stdout:n}=await A(`git`,[`-C`,e,`diff`,`HEAD`],t);return Buffer.byteLength(n)>R?`${Buffer.from(n).subarray(0,R).toString()}\n[diff truncated]`:n}async function B(e,t){delete b.env.CODER_SERVER,delete b.env.CODER_TASK_TOKEN,delete b.env.APP_TOKEN;for(let t of Object.keys(e.tokens))delete b.env[_(t)];let{CODEX_AUTH_JSON:n,...r}=e.credential.env;if(Object.assign(b.env,r),b.env[s]=JSON.stringify(e.config??{}),!n)return;let i=await E.mkdtemp(y.join(t,`.codex-`));return await E.writeFile(y.join(i,`auth.json`),n,{mode:384}),b.env.CODEX_HOME=i,i}async function V(e,t,n,r){if(!r)return;let i=await E.readFile(y.join(r,`auth.json`),`utf8`).catch(()=>``);i&&i!==n.credential.env.CODEX_AUTH_JSON&&await M(e.server,e.token,t,`/credential`,{method:`POST`,body:JSON.stringify({authJson:i})}).catch(()=>{}),await E.rm(r,{recursive:!0,force:!0})}const H=[[`bun.lock`,`bun`,[`install`,`--frozen-lockfile`]],[`bun.lockb`,`bun`,[`install`,`--frozen-lockfile`]],[`pnpm-lock.yaml`,`npx`,[`-y`,`pnpm`,`install`,`--frozen-lockfile`]],[`yarn.lock`,`npx`,[`-y`,`yarn`,`install`,`--frozen-lockfile`]],[`package-lock.json`,`npm`,[`ci`]]];async function U(e,t){let n=j(),r=await M(n.server,n.token,e),i=r.task.event;if(!i?.repo)throw Error(`The task has no repository`);let a=await P({...r.task,event:{...i,repo:{...i.repo,ref:i.repo.defaultBranch}}},t,r.tokens[i.integration]);for(let[e,t,n]of H)if(await E.stat(y.join(a,e)).catch(()=>void 0)){await A(t,n,{cwd:a,maxBuffer:67108864}).catch(()=>{});break}let o=(await A(`git`,[`-C`,a,`rev-parse`,`HEAD`])).stdout.trim();return console.log(`coder-snapshot ${o}`),{sha:o}}function W(e,n,r){let i=new Set,a=t(y.join(e,`inbox-control`),{apply(e){let t=e.entry;if(e.task!==n||!Number.isInteger(t?.seq)||t.seq<0||!Number.isInteger(t.generation)||t.generation<0||![`steer`,`ask`,`approve`].includes(t.kind))throw Error(`Invalid engine inbox command`);let a=r(t);return i.add(a),a.finally(()=>i.delete(a)).catch(()=>{}),a}});return{close:async()=>{a(),await Promise.allSettled([...i])}}}function G(e,t,n){let i=f({task:t,generation:n.generation,seq:n.seq});return r(`apply`,{task:t,entry:n},{dir:y.join(e,`inbox-control`),id:i,keepReply:!0,timeoutMs:3e4})}async function K(e,t,n){let r={task:t.name?.slice(6)??t.id,generation:n.generation,seq:n.seq},i=y.join(d(e,t.id),`inbox-control`,`${f(r)}.transcript.jsonl`),a=await E.readFile(i,`utf8`).catch(e=>{if(e.code===`ENOENT`)return``;throw e});for(let e of a.split(`
|
|
4
|
+
`)){if(!e.trim())continue;let t;try{t=JSON.parse(e)}catch{continue}if(f(t.command)===f(r)&&Object.hasOwn(t,`result`))return t.result}let s=n.value;if(n.kind===`steer`){let i=String(s?.text??n.value??``);t.threadId?await m(e,t,i,{command:r}):o(e,t.id,i)}else if(n.kind===`ask`){let i=await g(e,t,String(s?.question??n.value??``),{command:r});return i.finalMessage??i.error?.message??``}else n.kind===`approve`&&c(d(e,t.id),String(s?.approvalId??s?.id??``),s?.decision===`deny`||s?.decision===`decline`?`decline`:`accept`);await E.mkdir(y.dirname(i),{recursive:!0}),await E.appendFile(i,JSON.stringify({command:r,result:null})+`
|
|
5
|
+
`)}async function q(e,t){let n=j(),r=await M(n.server,n.token,e),i=r.task.event,a=i&&r.tokens[i.integration],o=b.env.CODER_INBOX_MODE===`poll`;delete b.env.CODER_INBOX_MODE;let c=b.env.CODER_CHECKOUT_CACHE;delete b.env.CODER_CHECKOUT_CACHE;let l=await B(r,t),u;try{return u=await P(r.task,t,a,c),await J(e,t,n,r,u,a,o)}finally{try{u&&await L(u)}finally{await V(n,e,r,l),delete b.env[s]}}}async function J(e,t,r,i,o,s,c){let f=i.task.event,p=new AbortController,m,g=!1,_=await $({root:t,generation:i.generation,apply:async t=>{let r=m&&n(o,m);if(!r)throw Error(`The task is not ready`);if(t.kind===`cancel`){await h(o,r),g=!0;return}return G(d(o,r.id),e,t)}}),x=_.ack().seq>=0?_.ack():void 0,S,C=()=>{if(S)return S;if(!x)return Promise.resolve();let t=x;return S=M(r.server,r.token,e,`/ack`,{method:`POST`,body:JSON.stringify(t),signal:p.signal}).then(()=>{x&&x.seq<=t.seq&&(x=void 0)}).catch(e=>{throw(e.status===401||e.status===403)&&(x=void 0),e}).finally(()=>{S=void 0}),S},w=async()=>{let t=await M(r.server,r.token,e,`/messages?after=${_.ack().seq}`,{signal:p.signal});try{t.length&&await _.apply(t)}finally{t.length&&_.ack().seq>=0&&(x=_.ack()),await C().catch(()=>{})}},T=setInterval(()=>{C().catch(()=>{})},1e3),D=l(y.join(t,`.runner-task.json`));D?.generation!==i.generation&&await E.writeFile(y.join(t,`.runner-note`),i.task.context?.note??``,{mode:384});let O,k,A=new Map,j=()=>{for(let[e,t]of A){let n=u(o,e,1/0);for(let e of n.slice(t))b.stdout.write(`${JSON.stringify(e)}\n`);A.set(e,n.length)}},N,P;try{let n=await v({cwd:o,...D?.generation===i.generation?{resumeTaskId:D.id}:{},noteFile:y.join(t,`.runner-note`),agent:i.task.agent,flow:i.task.flow,task:i.task,toolEnvironment:{tokens:i.tokens},post:i.task.source===f?.integration,...s?{postToken:s}:{},async onTask(n){m=n,A.has(n)||A.set(n,0),j(),k??=setInterval(j,1e3),a(y.join(t,`.runner-task.json`),{generation:i.generation,id:n}),await C().catch(()=>{}),await w().catch(()=>{}),clearInterval(O),O=setInterval(()=>{M(r.server,r.token,e,`/heartbeat`,{method:`POST`,signal:p.signal}).catch(()=>{})},3e4),clearInterval(N),c&&(N=setInterval(()=>{P||=w().catch(()=>{}).finally(()=>{P=void 0})},4e3))},onApproval(t){return M(r.server,r.token,e,`/result`,{method:`POST`,body:JSON.stringify({status:`waiting`,approval:t})})}});for(j();x;)await C().catch(()=>{}),x&&await new Promise(e=>setTimeout(e,1e3));return await M(r.server,r.token,e,`/result`,{method:`POST`,body:JSON.stringify({status:g?`cancelled`:n.ok?`completed`:`failed`,result:n.reply??n.result,tokens:n.tokens,...n.note===void 0?{}:{note:n.note},...o===t?{}:{diff:await z(o).catch(()=>void 0)}})}),n}catch(t){let n=t;throw j(),await M(r.server,r.token,e,`/result`,{method:`POST`,body:JSON.stringify({status:`failed`,error:n.message??String(t)})}),t}finally{clearInterval(k),j(),clearInterval(T),clearInterval(O),clearInterval(N),p.abort(),await Promise.allSettled([P,S]),await _.close()}}const Y=`/tmp/coder-inbox.sock`,X=e=>y.join(w.tmpdir(),`coder-${S(`sha256`).update(e).digest(`hex`).slice(0,24)}.sock`);function Z(e,t){return new Promise((n,r)=>{let i=O.request({socketPath:e,path:`/messages`,method:`POST`,headers:{"content-type":`application/json`}},e=>{let t=``;e.on(`data`,e=>{t+=e}),e.on(`end`,()=>{if(e.statusCode!==200)return r(Error(`Task inbox answered ${e.statusCode}`));try{n(JSON.parse(t))}catch(e){r(e)}}),e.on(`error`,r)});i.setTimeout(1e4,()=>i.destroy(Error(`Task inbox timed out`))),i.on(`error`,r),i.end(JSON.stringify({entries:t}))})}const Q=`const http=require('node:http');const req=http.request({socketPath:process.env.CODER_INBOX_SOCKET||'/tmp/coder-inbox.sock',path:'/messages',method:'POST',headers:{'content-type':'application/json'}},res=>{res.pipe(process.stdout);res.on('end',()=>{if(res.statusCode!==200)process.exitCode=1})});req.on('error',()=>{process.exitCode=1});req.setTimeout(10000,()=>req.destroy());req.end(JSON.stringify({entries:JSON.parse(process.env.CODER_INBOX_MESSAGES)}));`;async function $(e){let t=y.join(e.root,`.runner-inbox.json`),n=l(t),r=n?.generation===e.generation?n:{generation:e.generation,seq:-1,answers:[]},i=Promise.resolve(),o=n=>{let o=async()=>{if(!Array.isArray(n)||n.some(t=>!Number.isInteger(t.seq)||t.seq<0||t.generation!==e.generation||![`steer`,`ask`,`approve`,`cancel`].includes(t.kind)))throw Error(`Invalid task messages`);for(let i of[...n].sort((e,t)=>e.seq-t.seq)){if(i.seq<=r.seq)continue;let n=await e.apply(i),o={generation:e.generation,seq:i.seq,answers:[...r.answers??[],...i.kind===`ask`?[{seq:i.seq,value:n}]:[]]};a(t,o),r=o}return r},s=i.then(o,o);return i=s.then(()=>{},()=>{}),s},s=e.socketPath??b.env.CODER_INBOX_SOCKET??X(e.root);if(await E.lstat(s).then(()=>!0,()=>!1)){if(!await new Promise((e,t)=>{let n=T.connect(s);n.once(`connect`,()=>{n.destroy(),e(!1)}),n.once(`error`,n=>n.code===`ECONNREFUSED`?e(!0):t(n))}))throw Error(`The task inbox is already running`);await E.unlink(s)}let c=O.createServer(async(e,t)=>{if(e.method!==`POST`||e.url!==`/messages`){t.writeHead(404).end();return}let n=``;try{for await(let t of e)if(n+=t,Buffer.byteLength(n)>1048576)throw Error(`Messages too large`);let r=await o(JSON.parse(n).entries);t.writeHead(200,{"content-type":`application/json`}).end(JSON.stringify(r))}catch{t.writeHead(409).end()}});return await E.mkdir(e.root,{recursive:!0}),await new Promise((e,t)=>{c.once(`error`,t),c.listen(s,e)}),await E.chmod(s,384),{apply:o,ack:()=>r,close:async()=>{await i,await new Promise(e=>c.close(()=>e()))}}}export{X as a,q as c,k as d,I as f,F as i,Z as l,Y as n,U as o,K as r,L as s,Q as t,j as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{Bt as t,Ct as n,Et as r,Ft as i,Ht as a,Jt as o,Vt as s,Yt as c,a as l,dn as u,g as d,h as f,i as p,jn as m,kt as h,m as g,mn as _,nt as v,p as y,pn as b,qt as x,r as S,rn as C,s as w,t as T,x as E,zt as D}from"./dispatch-BsW_1m7e.js";import{n as O}from"./remote-CxFnEjZl.js";import{a as k,c as A,i as j,l as ee,n as M,r as N,u as P}from"./actions-FzDNxMFf.js";import F from"node:path";import I from"node:process";var L=e({tasks:()=>$});function R(e){return{cwd:e.cwd?F.resolve(e.cwd):I.cwd(),...e.server===void 0?{}:{api:O(e)}}}function z(e,t){let r=i(e,t);if(r)return r;throw new n(`invalid-option`,t?`No task found for "${t}".`:`No tasks found for this workspace.`,{hint:t?[`List tasks: coder task list`,`Start one: coder run "<text>"`]:[`Start one: coder run "<text>"`]})}async function B(e,t){if(t)return e.tasks.get(t);let[r]=await e.tasks.list({limit:1});if(!r)throw new n(`server`,`No server tasks found.`);return r}function V(e){throw new n(`invalid-option`,`Missing task id.`,{hint:e})}async function H(e,t={}){if(t.outputSchema!==void 0&&(!t.outputSchema||typeof t.outputSchema!=`object`||Array.isArray(t.outputSchema)))throw new n(`invalid-option`,`outputSchema must be an object.`);let{cwd:r,api:i}=R(t);if(i){let n=t.resume?await i.tasks.continue(t.resume,e,{outputSchema:t.outputSchema}):await i.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?i.tasks.wait(n.task.id,{onLog:t.onLog}):n}let a=t.agent?await(await import(`./exec-DuUkLMqg.js`).then(e=>e.i)).agentTaskOptions(r,t.agent,t.mcp):void 0,o={...f({prompt:e,outputSchema:t.outputSchema,cwd:r,cwdExplicit:!!t.cwd,engine:t.engine??a?.engine,model:t.model??(t.engine?void 0:a?.model),effort:t.effort??(t.engine?void 0:a?.effort),permissions:t.permissions??a?.permissions,name:t.name,system:t.system??a?.system,resume:t.resume,wait:t.wait,simulateApproval:t.simulateApproval,addDirs:t.addDirs}),...t.agent?{agentId:t.agent}:{},mcp:a?.mcp??t.mcp,nativeMcp:a?.nativeMcp,...t.onFallback?{onFallback:t.onFallback}:{},...t.onNote?{onNote:t.onNote}:{}},s=await S(o);if(!t.wait){let e=s.taskId;return{taskId:e,status:s.task.status,startupCheck:s.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 i=s.taskId;t.onWaiting?.(i);let{task:a,result:c}=await g(r,i),u=c?.error?.message??``;if(a.status===`failed`&&p(a.permissions??`auto`,u))throw new n(`read-only-unavailable`,u);if(a.status===`failed`&&l(u)){let i=v(r).chain,c=i[i.indexOf(s.engine)+1];if(!c)throw new n(`chain-exhausted`,u,{payload:T(s.engine,u,a.permissions??`auto`,t.system,e)});t.onFallback?.({engine:s.engine,detail:u,next:c}),s=await S({...o,engine:c,model:void 0,effort:void 0,name:void 0,resume:void 0,simulateApproval:void 0});continue}return{taskId:i,status:a.status,finalMessage:c?.finalMessage,...u?{error:u}:{},tokens:c?.tokens??null,model:c?.model??a.model??null}}}async function U(e,t={}){let{cwd:i,api:a}=R(t);if(a){let n=await B(a,e);return t.wait?a.tasks.wait(n.task.id):n}let s=z(i,e);if(t.wait){b.includes(s.status)&&t.onWaiting?.(s.id);let e=await y(i,s);if(s=e.task,e.reason===`approval`)throw new n(`approval-pending`,`Approval needed for task ${s.id}: ${e.approval.summary}`,{taskId:s.id,approval:e.approval})}let{steps:c,result:l}=w(i,s.id,{tail:t.tail}),u=E(C(i,s.id)).filter(e=>!e.response),d=b.includes(s.status),f=d?D(i,s):s.updatedAt,p=r(f);return{taskId:s.id,status:d&&u.length?`waiting-approval`:s.status,task:s,result:l,steps:c,turns:o(i,s.id),pendingApprovals:u.map(e=>({id:e.id,summary:e.summary,cwd:e.cwd??null})),...d?{idleMs:p,lastActivityAt:f??null,stalled:u.length===0&&p>6e5,lastLog:x(i,s.id,1)[0],liveTokens:x(i,s.id,200).reverse().find(e=>e.kind===`usage`&&String(e.at??``)>=(s.resumedAt??``))?.tokens??null}:{}}}async function W(e={}){let{cwd:n,api:i}=R(e);if(i){let t=await i.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:a,clipped:o}=j(n,{...e,dir:e.dir??e.cwd}),s=a.map(e=>{let t=b.includes(e.status)?E(C(n,e.id)).filter(e=>!e.response).length:0;return{taskId:e.id,status:t?`waiting-approval`:e.status,pendingApprovals:t,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:b.includes(e.status)?r(D(n,e)):null}}),c=!s.length&&!e.archived?t(n,{migrate:!1}).length:0;return Object.assign(s,{clipped:o,archived:c})}async function*G(e,t){let n=-1;for(;;){let r=await e.tasks.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 K(e,t={}){let{cwd:n,api:r}=R(t);if(r){let t=await B(r,e);return{task:t,events:G(r,t.task.id),final:()=>r.tasks.get(t.task.id)}}let i=z(n,e);return{task:i,events:P(n,i.id,{tail:t.tail}),async final(){let e=c(n,a(n,i.id)??i),t=m(F.join(C(n,i.id),`result.json`));return{taskId:i.id,status:e.status,result:t,task:e}}}}async function q(e,t,n={}){let{cwd:r,api:i}=R(n);if(i)return i.tasks.steer(e,t);let o=await A(r,z(r,e),t,{model:n.model,effort:n.effort,permissions:n.permissions});if(!n.wait||o.steered===`queued`)return o;let s=a(r,o.taskId),c=s?await u(r,s):null,l=m(F.join(C(r,o.taskId),`result.json`));return{...o,status:c?.status??null,finalMessage:l?.finalMessage??null}}async function J(e,t,n={}){let{cwd:r,api:i}=R(n);if(i)return i.tasks.ask(e,t);let a=z(r,e);n.onAsking?.(a.id);let o=await M(r,a,t,{model:n.model,effort:n.effort});return{taskId:a.id,answer:o.finalMessage||null,...o.error?{error:o.error.message}:{},ok:o.status===0}}async function Y(e,t={}){let{cwd:n,api:r}=R(t);if(r)return(e?[await r.tasks.get(e)]:await r.tasks.list({limit:200})).flatMap(e=>e.approval?[{taskId:e.task.id,...e.approval}]:[]);if(!e)return N(n);let i=z(n,e);return E(C(n,i.id)).map(e=>({taskId:i.id,id:e.id,summary:e.summary,cwd:e.cwd??null,createdAt:e.createdAt,answered:e.response?.decision??null}))}async function X(e,t,r={}){let{cwd:i,api:a}=R(r),o=r.deny?`decline`:`accept`;if(a){if(!e||!t)throw new n(`invalid-option`,`Server approvals need a task id and approval id.`,{hint:`Usage: coder task approve <task-id> <approval-id> --server <url>`});return a.tasks.approve(e,t,o)}if(e&&!t&&e.startsWith(`apr-`)&&(t=e,e=N(i).find(e=>e.id===t)?.taskId,!e))throw new n(`invalid-option`,`No pending approval "${t}".`,{hint:`List them: coder task approvals`});if(!e||!t)throw new n(`invalid-option`,`Missing approval id.`,{hint:[`List them: coder task approvals`,`Usage: coder task approve [task-id] <approval-id> [--deny]`]});let s=z(i,e);return d(C(i,s.id),t,o),{taskId:s.id,approvalId:t,decision:o}}async function Z(e,t={}){let{cwd:n,api:r}=R(t);if(r)return r.tasks.cancel(e??V([]));let i=z(n,e),{interrupt:a}=await ee(n,i);return{taskId:i.id,status:`cancelled`,interrupt:a}}async function Q(e,t={}){let{cwd:n,api:r}=R(t);if(r){let n=t.allStopped?(await r.tasks.list({limit:200})).filter(e=>_.includes(e.status)).map(e=>e.task.id):[e??V([])];return await Promise.all(n.map(e=>r.tasks.archive(e))),{archived:n,count:n.length}}if(t.allStopped){let e=s(n).filter(e=>_.includes(e.status));for(let t of e)h(n,t);return{archived:e.map(e=>e.id),count:e.length}}e||V([`Archive one: coder task archive <task-id>`,`Archive all stopped: coder task archive --all-stopped`]);let i=z(n,e);return h(n,i),{taskId:i.id,archived:!0}}async function te(e,r={}){let{cwd:i,api:a}=R(r);if(a){let t=r.allArchived?(await a.tasks.list({limit:200,archived:!0})).map(e=>e.task.id):[e??V([])];return await Promise.all(t.map(e=>a.tasks.delete(e))),{deleted:t,count:t.length}}if(r.allArchived){let e=t(i).filter(e=>k(i,e)).map(e=>e.id);return{deleted:e,count:e.length}}e||V([`Delete one: coder task delete <task-id>`,`Delete all archived: coder task delete --all-archived`]);let o=z(i,e);if(o.status===`running`)throw new n(`invalid-option`,`Task ${o.id} is still running.`,{hint:`Stop it first: coder task stop ${o.id}`});return k(i,o),{taskId:o.id,deleted:!0}}async function*ne(e,t={}){yield*(await K(e,t)).events}const $={run:H,result:U,list:W,watch:K,stream:ne,steer:q,ask:J,approvals:Y,approve:X,stop:Z,archive:Q,delete:te};export{$ as n,L as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Ct as e}from"./dispatch-BsW_1m7e.js";import{i as t,t as n}from"./cli-B1ObVrL4.js";import{runnerOptions as r}from"./remove-C15WLaXT.js";import i from"node:process";const a=t({name:`runner test`,globalFlags:{cwd:!1},args:1,help:{usage:`coder runner test <id> [--server [url]] [--json]`,summary:`Check the runner connection.`,flags:[n]},options:r,async run({options:t,args:[n]}){if(!n)throw new e(`invalid-option`,`Missing runner id.`);let{testRunner:r}=await import(`./runner-wDYhkVsM.js`).then(e=>e.a);return r(n,t)},print:e=>i.stdout.write(`${e.ok?`OK`:`Failed`} ${e.detail} (${e.ms} ms).\n`)});export{a as commandRunnerTest};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./cli-
|
|
1
|
+
import{i as e}from"./cli-B1ObVrL4.js";import{n as t}from"./mcp-server-DGzme0YX.js";import n from"node:process";const r=e({name:`agent tools`,options:{},args:1,async run({args:e}){let{INTEGRATIONS:r}=await import(`./integrations-B2CavXR1.js`).then(e=>e.r),{agentTools:i}=await import(`./mcp-CmcL1MCG.js`).then(e=>e.t),a=e[0]??``,o=i(a);if(!o)throw Error(`Unknown tool set "${a}"; known: ${[...Object.keys(r).filter(e=>r[e].tools.serve),`note`].join(`, `)}`);let s=n.env.APP_TOKEN??``;if(!s&&a!==`note`)throw Error(`APP_TOKEN is not set`);let c=n.env.CODER_AGENT_SCOPE?JSON.parse(n.env.CODER_AGENT_SCOPE):void 0;await t(`coder-${a}`,o,{token:s,fetch,tools:(n.env.CODER_AGENT_TOOLS??``).split(`,`).filter(Boolean),...c?{scope:c}:{}})}});export{r as commandTools};
|
|
@@ -328,6 +328,7 @@ interface Task {
|
|
|
328
328
|
}>;
|
|
329
329
|
archived?: boolean;
|
|
330
330
|
archivedAt?: string;
|
|
331
|
+
autoArchived?: boolean;
|
|
331
332
|
simulateApproval?: boolean;
|
|
332
333
|
flowRunId?: string;
|
|
333
334
|
agentId?: string;
|
|
@@ -335,6 +336,7 @@ interface Task {
|
|
|
335
336
|
author?: string;
|
|
336
337
|
repo?: string;
|
|
337
338
|
mcp?: McpServerSpec[];
|
|
339
|
+
nativeMcp?: boolean;
|
|
338
340
|
addDirs?: string[];
|
|
339
341
|
}
|
|
340
342
|
/** The outcome of running one engine turn. status 0 == success. */
|
|
@@ -386,4 +388,4 @@ interface CommandHelpSpec {
|
|
|
386
388
|
/** A subcommand handler. Receives the argv slice after the command name. */
|
|
387
389
|
type CommandHandler = (argv: string[]) => Promise<void> | void;
|
|
388
390
|
//#endregion
|
|
389
|
-
export {
|
|
391
|
+
export { CoderConfig as C, McpConfigEntry as D, McpAddOptions as E, Permission as O, TaskTurn as S, Effort as T, RunnerPairing as _, HelpRow as a, RunnerTest as b, TaskStatus as c, TokenUsage as d, LocalFolder as f, RunnerKind as g, RunnerInput as h, CommandHelpSpec as i, TurnResult as l, ProbeResult as m, Availability as n, McpServerSpec as o, LocalFolders as p, CommandHandler as r, Task as s, Approval as t, TaskLogEntry as u, RunnerRow as v, CustomModelConfig as w, RunnerUpdate as x, RunnerSpec as y };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./cli-
|
|
1
|
+
import{i as e}from"./cli-B1ObVrL4.js";import{o as t}from"./models-C-S7HqSb.js";import{n}from"./add-QExQhTzi.js";import{t as r}from"./remove-CTZYjjSr.js";const i=e({name:`model unalias`,help:{usage:`coder model unalias <name> [--workspace]`,summary:`Remove a user-defined alias.`,flags:[[`--workspace`,`target <repo>/.coder/config.json instead of the user file`]]},options:n,args:1,run:({options:e,args:[n],cwd:r})=>t(r,n,e),print:e=>r(`unaliased`,e.unaliased,e.file)});export{i as commandModelUnalias};
|