@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
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import e from"node:path";import t from"node:process";import{fileURLToPath as n}from"node:url";import*as r from"zod/mini";import i from"node:fs";import{execFileSync as a,spawn as o,spawnSync as s}from"node:child_process";import{createHash as c,randomUUID as l}from"node:crypto";import u from"node:os";import d from"node:net";import f from"node:readline";function p(t,n){if(!n)return``;if(!e.isAbsolute(n))return n;let r=e.relative(t,n);return r&&!r.startsWith(`..`)?r:n}function m(e){try{return JSON.parse(i.readFileSync(e,`utf8`))}catch{return null}}function h(t,n){i.mkdirSync(e.dirname(t),{recursive:!0});let r=`${t}.${process.pid}.${l()}.tmp`;try{i.writeFileSync(r,`${JSON.stringify(n,null,2)}\n`,{encoding:`utf8`,flag:`wx`}),i.renameSync(r,t)}finally{i.rmSync(r,{force:!0})}}function g(t,n){if(i.mkdirSync(e.dirname(n),{recursive:!0}),i.existsSync(n))throw Object.assign(Error(`Directory already exists: ${n}`),{code:`EEXIST`});try{i.renameSync(t,n);return}catch(e){if(e.code!==`EXDEV`)throw e}let r=`${n}.${process.pid}.${l()}.tmp`;try{i.cpSync(t,r,{recursive:!0,preserveTimestamps:!0,verbatimSymlinks:!0,errorOnExist:!0,force:!1}),i.renameSync(r,n),i.rmSync(t,{recursive:!0})}finally{i.rmSync(r,{recursive:!0,force:!0})}}async function _(t,n){if(await i.promises.mkdir(e.dirname(n),{recursive:!0}),await i.promises.lstat(n).catch(e=>{if(e.code!==`ENOENT`)throw e}))throw Object.assign(Error(`Directory already exists: ${n}`),{code:`EEXIST`});try{await i.promises.rename(t,n);return}catch(e){if(e.code!==`EXDEV`)throw e}let r=`${n}.${process.pid}.${l()}.tmp`;try{await i.promises.cp(t,r,{recursive:!0,preserveTimestamps:!0,verbatimSymlinks:!0,errorOnExist:!0,force:!1}),await i.promises.rename(r,n),await i.promises.rm(t,{recursive:!0})}finally{await i.promises.rm(r,{recursive:!0,force:!0})}}function v(e){let t=0,n=``;return()=>{let r;try{r=i.statSync(e).size}catch{return[]}if(r<t&&(t=0,n=``),r===t)return[];let a;try{a=i.openSync(e,`r`)}catch{return[]}try{let e=Buffer.alloc(r-t),o=i.readSync(a,e,0,e.length,t);t+=o;let s=(n+e.toString(`utf8`,0,o)).split(`
|
|
2
|
-
`);return n=s.pop()??``,s.filter(Boolean)}finally{i.closeSync(a)}}}function y(e){return String(e??``).replace(/[^A-Za-z0-9._-]/g,`-`).replace(/^-+|-+$/g,``)}function b(n,r=t.platform){return r===`win32`?`pipe:\\\\.\\pipe\\${y(`${e.win32.basename(n)}-codex-app-server`)}`:`unix:${e.join(n,`broker.sock`)}`}function x(e){if(typeof e!=`string`||e.length===0)throw Error(`Missing broker endpoint.`);if(e.startsWith(`pipe:`)){let t=e.slice(5);if(!t)throw Error(`Broker pipe endpoint is missing its path.`);return{kind:`pipe`,path:t}}if(e.startsWith(`unix:`)){let t=e.slice(5);if(!t)throw Error(`Broker Unix socket endpoint is missing its path.`);return{kind:`unix`,path:t}}throw Error(`Unsupported broker endpoint: ${e}`)}function S(){let t=e.dirname(n(import.meta.url));for(let n=0;n<10;n++){let n=e.join(t,`package.json`);try{if(JSON.parse(i.readFileSync(n,`utf8`)).name===`@wular/coder`)return t}catch{}let r=e.dirname(t);if(r===t)break;t=r}return e.resolve(e.dirname(n(import.meta.url)),`..`)}const C=S(),w=i.existsSync(e.join(C,`dist/cli.js`))?e.join(C,`dist/cli.js`):e.join(C,`src/cli.ts`);function T(){try{return JSON.parse(i.readFileSync(e.join(C,`package.json`),`utf8`)).version??`unknown`}catch{return`unknown`}}function E(e){try{return JSON.parse(i.readFileSync(e,`utf8`)).version??null}catch{return null}}function ee(){return C}const te={false:`broker.json`,true:`broker-network.json`};function ne(t=`coder-`){return i.mkdtempSync(e.join(u.tmpdir(),t))}function re(e){let t=x(e);return d.createConnection({path:t.path})}async function ie(e,t=2e3){let n=Date.now();for(;Date.now()-n<t;){if(await new Promise(t=>{let n=re(e);n.on(`connect`,()=>{n.end(),t(!0)}),n.on(`error`,()=>t(!1))}))return!0;await new Promise(e=>setTimeout(e,50))}return!1}function ae({scriptPath:e,cwd:n,endpoint:r,pidFile:a,logFile:s,networkAccess:c=!1,env:l=t.env}){let u=i.openSync(s,`a`),d=o(t.execPath,[e,`serve`,`--endpoint`,r,`--cwd`,n,`--pid-file`,a,`--network-access`,String(c)],{cwd:n,env:l,detached:!0,stdio:[`ignore`,u,u]});return d.unref(),i.closeSync(u),d}function oe(){let e=[new URL(`./lib/broker.js`,import.meta.url),new URL(`./main.js`,import.meta.url)];for(let t of e){let e=n(t);if(i.existsSync(e))return e}throw Error("Coder broker script not found next to the runtime. Rebuild with `bun run build`.")}function se(t,n=!1){return e.join(N(t),te[n?`true`:`false`])}function D(e,t=!1){let n=se(e,t);if(!i.existsSync(n))return null;try{let e=JSON.parse(i.readFileSync(n,`utf8`));return(e.networkAccess??!1)===t?e:null}catch{return null}}function ce(e,t,n=t.networkAccess??!1){let r=N(e);i.mkdirSync(r,{recursive:!0}),i.writeFileSync(se(e,n),`${JSON.stringify(t,null,2)}\n`,`utf8`)}function le(e,t=!1){let n=se(e,t);i.existsSync(n)&&i.unlinkSync(n)}async function ue(e){if(!e)return!1;try{return await ie(e,150)}catch{return!1}}async function de(n,r={}){let i=r.scriptPath??oe(),a=T(),o=r.networkAccess??!1,s=D(n,o),c=s?.version===a&&s?.scriptPath===i&&(s?.networkAccess??!1)===o;if(s&&c&&await ue(s.endpoint))return s;s&&(fe({endpoint:s.endpoint??null,pidFile:s.pidFile??null,logFile:s.logFile??null,sessionDir:s.sessionDir??null,pid:s.pid??null,killProcess:r.killProcess??null}),le(n,o));let l=ne(),u=(r.createBrokerEndpoint??b)(l,r.platform),d=e.join(l,`broker.pid`),f=e.join(l,`broker.log`),p=ae({scriptPath:i,cwd:n,endpoint:u,pidFile:d,logFile:f,networkAccess:o,env:r.env??t.env});if(!await ie(u,r.timeoutMs??2e3))return fe({endpoint:u,pidFile:d,logFile:f,sessionDir:l,pid:p.pid??null,killProcess:r.killProcess??null}),null;let m={endpoint:u,pidFile:d,logFile:f,sessionDir:l,pid:p.pid??null,networkAccess:o,version:a,scriptPath:i};return ce(n,m,o),m}function fe({endpoint:t=null,pidFile:n,logFile:r,sessionDir:a=null,pid:o=null,killProcess:s=null}){if(Number.isFinite(o)&&s)try{s(o)}catch{}if(n&&i.existsSync(n)&&i.unlinkSync(n),r&&i.existsSync(r)&&i.unlinkSync(r),t)try{let e=x(t);e.kind===`unix`&&i.existsSync(e.path)&&i.unlinkSync(e.path)}catch{}let c=a??(n?e.dirname(n):r?e.dirname(r):null);if(c&&i.existsSync(c))try{i.rmdirSync(c)}catch{}}function pe(e,n=[],r={}){let i=s(e,n,{cwd:r.cwd,env:r.env,encoding:`utf8`,input:r.input,maxBuffer:r.maxBuffer,stdio:r.stdio??`pipe`,shell:t.platform===`win32`?t.env.SHELL||!0:!1,windowsHide:!0});return{command:e,args:n,status:i.status??0,signal:i.signal??null,stdout:i.stdout??``,stderr:i.stderr??``,error:i.error??null}}function me(e,t=[`--version`],n={}){let r=pe(e,t,n);return r.error&&r.error.code===`ENOENT`?{available:!1,detail:`not found`}:r.error?{available:!1,detail:r.error.message}:r.status===0?{available:!0,detail:r.stdout.trim()||r.stderr.trim()||`ok`}:{available:!1,detail:r.stderr.trim()||r.stdout.trim()||`exit ${r.status}`}}function he(e){return/not found|no running instance|cannot find|does not exist|no such process/i.test(e)}function ge(e,n={}){if(!Number.isFinite(e))return{attempted:!1,delivered:!1,method:null};let r=e,i=n.platform??t.platform,a=n.runCommandImpl??pe,o=n.killImpl??t.kill.bind(t);if(i===`win32`){let e=a(`taskkill`,[`/PID`,String(r),`/T`,`/F`],{cwd:n.cwd,env:n.env});if(!e.error&&e.status===0)return{attempted:!0,delivered:!0,method:`taskkill`,result:e};let t=`${e.stderr}\n${e.stdout}`.trim();if(!e.error&&he(t))return{attempted:!0,delivered:!1,method:`taskkill`,result:e};if(e.error?.code===`ENOENT`)try{return o(r),{attempted:!0,delivered:!0,method:`kill`}}catch(e){if(e?.code===`ESRCH`)return{attempted:!0,delivered:!1,method:`kill`};throw e}throw e.error?e.error:Error(_e(e))}try{return o(-r,`SIGTERM`),{attempted:!0,delivered:!0,method:`process-group`}}catch(e){if(e?.code!==`ESRCH`)try{return o(r,`SIGTERM`),{attempted:!0,delivered:!0,method:`process`}}catch(e){if(e?.code===`ESRCH`)return{attempted:!0,delivered:!1,method:`process`};throw e}return{attempted:!0,delivered:!1,method:`process-group`}}}function _e(e){let t=[`${e.command} ${e.args.join(` `)}`.trim()];e.signal?t.push(`signal=${e.signal}`):t.push(`exit=${e.status}`);let n=(e.stderr||``).trim(),r=(e.stdout||``).trim();return n?t.push(n):r&&t.push(r),t.join(`: `)}function ve(e){return new Promise(n=>{let r=o(e,t.argv.slice(1),{env:t.env,shell:!1,stdio:`inherit`}),i=()=>r.kill(`SIGINT`),a=()=>r.kill(`SIGTERM`);t.once(`SIGINT`,i),t.once(`SIGTERM`,a);let s=e=>{t.off(`SIGINT`,i),t.off(`SIGTERM`,a),n(e)};r.once(`error`,e=>s({error:e,status:null,signal:null})),r.once(`close`,(e,t)=>s({status:e,signal:t}))})}const ye=-32001,be=`coder/notice`,xe=`coder/appServerExited`,Se=`broker/recycle`;function Ce(){let e=pe(`codex`,[`--version`]),t=/(\d+\.\d+\.\d+(?:-[\w.]+)?)/.exec(`${e.stdout} ${e.stderr}`);return t?t[1]:`0.144.1`}function we(){return{title:`Coder`,name:`coder`,version:Ce()}}const Te={experimentalApi:!1,requestAttestation:!1,optOutNotificationMethods:[`item/agentMessage/delta`,`item/reasoning/summaryTextDelta`,`item/reasoning/summaryPartAdded`,`item/reasoning/textDelta`]};function Ee(e,t,n){return n===void 0?{code:e,message:t}:{code:e,message:t,data:n}}function O(e,t){let n=Error(e);return n.data=t,t?.code!==void 0&&(n.rpcCode=t.code),n}var De=class{cwd;options;pending;nextId;stderr;closed;exitError;notificationHandler;serverRequestHandler;noticeHandler;lineBuffer;transport;exitPromise;exitResolved;resolveExit;handleServerRequest;constructor(e,t={}){this.cwd=e,this.options=t,this.pending=new Map,this.nextId=1,this.stderr=``,this.closed=!1,this.exitError=null,this.notificationHandler=null,this.serverRequestHandler=null,this.noticeHandler=null,this.lineBuffer=``,this.transport=`unknown`,this.handleServerRequest=e=>this.defaultHandleServerRequest(e),this.exitPromise=new Promise(e=>{this.resolveExit=e})}setNotificationHandler(e){this.notificationHandler=e}setServerRequestHandler(e){this.serverRequestHandler=e}setNoticeHandler(e){this.noticeHandler=e}request(e,t){if(this.closed)throw Error(`codex app-server client is closed.`);if(this.exitResolved)return Promise.reject(this.exitError??Error(`codex app-server connection closed.`));let n=this.nextId;return this.nextId+=1,new Promise((r,i)=>{this.pending.set(n,{resolve:r,reject:i,method:e}),this.sendMessage({id:n,method:e,params:t})})}notify(e,t={}){this.closed||this.sendMessage({method:e,params:t})}handleChunk(e){this.lineBuffer+=e;let t=this.lineBuffer.indexOf(`
|
|
3
|
-
`);for(;t!==-1;){let e=this.lineBuffer.slice(0,t);this.lineBuffer=this.lineBuffer.slice(t+1),this.handleLine(e),t=this.lineBuffer.indexOf(`
|
|
4
|
-
`)}}handleLine(e){if(!e.trim())return;let t;try{t=JSON.parse(e)}catch(t){this.handleExit(O(`Failed to parse codex app-server JSONL: ${t instanceof Error?t.message:String(t)}`,{line:e}));return}if(t.id!==void 0&&t.method){this.handleServerRequest(t);return}if(t.id!==void 0){let e=this.pending.get(t.id);if(!e)return;this.pending.delete(t.id),t.error?e.reject(O(t.error.message??`codex app-server ${e.method} failed.`,t.error)):e.resolve(t.result??{});return}if(t.method===`coder/notice`){this.noticeHandler?.(String(t.params?.message??``));return}if(t.method===`coder/appServerExited`){this.handleExit(O(String(t.params?.message??`codex app-server exited.`)));return}t.method&&this.notificationHandler&&this.notificationHandler(t)}defaultHandleServerRequest(e){let t=this.serverRequestHandler;if(!t){this.sendMessage({id:e.id,error:Ee(-32601,`Unsupported server request: ${e.method}`)});return}Promise.resolve().then(()=>t(e.method,e.params??{})).then(t=>{this.sendMessage({id:e.id,result:t??{}})}).catch(t=>{this.sendMessage({id:e.id,error:Ee(-32e3,t instanceof Error?t.message:String(t))})})}handleExit(e){if(!this.exitResolved){this.exitResolved=!0,this.exitError=e??null;for(let e of this.pending.values())e.reject(this.exitError??Error(`codex app-server connection closed.`));this.pending.clear(),this.resolveExit(void 0)}}sendMessage(e){throw Error(`sendMessage must be implemented by subclasses.`)}},Oe=class extends De{proc;readline;constructor(e,t={}){super(e,t),this.transport=`direct`}async initialize(){let e=this.options.networkAccess??!1;this.proc=o(`codex`,ke(e),{cwd:this.cwd,env:this.options.env??t.env,stdio:[`pipe`,`pipe`,`pipe`],shell:t.platform===`win32`?t.env.SHELL||!0:!1,windowsHide:!0});let n=this.proc.stdout,r=this.proc.stderr;if(!n||!r)throw Error(`codex app-server did not expose stdio streams.`);n.setEncoding(`utf8`),r.setEncoding(`utf8`),r.on(`data`,e=>{this.stderr+=e}),this.proc.on(`error`,e=>{this.handleExit(e)}),this.proc.stdin?.on(`error`,()=>{}),this.proc.on(`exit`,(e,t)=>{let n=this.stderr.trim(),r=e===0?null:O(`codex app-server exited unexpectedly (${t?`signal ${t}`:`exit ${e}`}).${n?`\n${n}`:``}`);this.handleExit(r)}),this.readline=f.createInterface({input:n}),this.readline.on(`line`,e=>{this.handleLine(e)}),await this.request(`initialize`,{clientInfo:this.options.clientInfo??we(),capabilities:this.options.capabilities??Te}),this.notify(`initialized`,{})}async close(){if(this.closed){await this.exitPromise;return}this.closed=!0,this.readline&&this.readline.close(),this.proc&&!this.proc.killed&&(this.proc.stdin?.end(),setTimeout(()=>{if(this.proc&&!this.proc.killed&&this.proc.exitCode===null)if(t.platform===`win32`)try{ge(this.proc.pid)}catch{}else this.proc.kill(`SIGTERM`)},50).unref?.()),await this.exitPromise}sendMessage(e){let t=`${JSON.stringify(e)}\n`,n=this.proc?.stdin;if(!n)throw Error(`codex app-server stdin is not available.`);n.write(t)}};function ke(e){return[`-c`,`sandbox_workspace_write.network_access=${e}`,`app-server`,`--disable`,`plugins`]}var Ae=class extends De{endpoint;socket;constructor(e,t={}){super(e,t),this.transport=`broker`,this.endpoint=t.brokerEndpoint}async initialize(){await new Promise((e,t)=>{let n=x(this.endpoint);this.socket=d.createConnection({path:n.path}),this.socket.setEncoding(`utf8`),this.socket.on(`connect`,e),this.socket.on(`data`,e=>{this.handleChunk(e)}),this.socket.on(`error`,e=>{this.exitResolved||t(e),this.handleExit(e)}),this.socket.on(`close`,()=>{this.handleExit(this.exitError)})}),await this.request(`initialize`,{clientInfo:this.options.clientInfo??we(),capabilities:this.options.capabilities??Te}),this.notify(`initialized`,{})}async close(){if(this.closed){await this.exitPromise;return}this.closed=!0,this.socket&&this.socket.end(),await this.exitPromise}sendMessage(e){let t=`${JSON.stringify(e)}\n`,n=this.socket;if(!n)throw Error(`codex app-server broker connection is not connected.`);n.write(t)}},k=class{static async connect(e,n={}){let r=n.networkAccess??!1,i=null;n.disableBroker||(i=n.brokerEndpoint??n.env?.CODER_APP_SERVER_ENDPOINT??t.env.CODER_APP_SERVER_ENDPOINT??null,!i&&n.reuseExistingBroker&&(i=D(e,r)?.endpoint??null),!i&&!n.reuseExistingBroker&&(i=(await de(e,{env:n.env,networkAccess:r}))?.endpoint??null));let a=i?new Ae(e,{...n,brokerEndpoint:i}):new Oe(e,n);return await a.initialize(),a}};async function je(e,t,n){for(let r of[!1,!0]){if(!D(e,r))continue;let i=null;try{return i=await k.connect(e,{networkAccess:r,reuseExistingBroker:!0}),await i.request(t,{threadId:n}),!0}catch{}finally{await i?.close().catch(()=>{})}}return!1}function Me(e){try{let t=o(`codex`,e,{detached:!0,stdio:`ignore`});t.on(`error`,()=>{}),t.unref()}catch{}}async function Ne(e,t){await je(e,`thread/archive`,t)||Me([`archive`,t])}function Pe(t){let n=e.join(process.env.CODEX_HOME||e.join(u.homedir(),`.codex`),`archived_sessions`);try{return i.readdirSync(n).some(e=>e.endsWith(`-${t}.jsonl`))}catch{return!1}}function Fe(e){return new Promise(t=>{try{let n=o(`codex`,[`unarchive`,e],{stdio:`ignore`});n.on(`error`,()=>t(!1)),n.on(`close`,e=>t(e===0))}catch{t(!1)}})}async function Ie(e,t){return await je(e,`thread/delete`,t)?!0:s(`codex`,[`delete`,`--force`,t],{encoding:`utf8`}).status===0}const Le=[`completed`,`failed`,`cancelled`],Re=[`queued`,`running`],ze=/^[a-z0-9][a-z0-9_-]*$/i;function Be(e){return ze.test(e)}function Ve(e,t){if(!Be(e))throw Error(`Invalid ${t} "${e}".`)}function A(...t){return e.join(e.resolve(process.env.CODER_HOME||e.join(u.homedir(),`.coder`)),...t)}function j(...t){let n=u.homedir(),r=u.platform(),i=process.env.CODER_CACHE_HOME||(r===`darwin`?e.join(n,`Library`,`Caches`,`wular-coder`):r===`win32`?e.join(process.env.LOCALAPPDATA||e.join(n,`AppData`,`Local`),`wular-coder`,`cache`):e.join(process.env.XDG_CACHE_HOME||e.join(n,`.cache`),`wular-coder`));return e.join(e.resolve(i),...t)}function He(){return A()}function Ue(t){return t?e.join(t,`flows`):A(`state`,`global`,`flows`)}function We(){return j(`flows-archived`)}function Ge(){return j(`usage.json`)}function Ke(e=Ge()){return`${e}.${process.pid}.${l()}.tmp`}function qe(){return j(`runner`,`usage.json`)}function M(e){try{return a(`git`,[`rev-parse`,`--show-toplevel`],{cwd:e,encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim()}catch{return e}}const Je=`global`;function N(e){return A(`state`,Je)}function Ye(){let t=A(`state`),n=[];try{n=i.readdirSync(t,{withFileTypes:!0})}catch{}return n.filter(e=>e.isDirectory()&&e.name!==Je).map(n=>e.join(t,n.name))}function P(t){return e.join(N(t),`jobs`)}const Xe=6e5;function F(e){return j(`archive`)}function I(t,n){Ve(n,`task id`);let r=e.join(P(t),n);if(i.existsSync(e.join(r,`job.json`)))return r;let a=e.join(F(t),n);if(i.existsSync(e.join(a,`job.json`)))return a;for(let t of Ye()){let r=e.join(t,`jobs`,n);if(i.existsSync(e.join(r,`job.json`)))return r}return r}function Ze(e,t){return t.archived?t:L(e,t.id,{archived:!0,archivedAt:new Date().toISOString()})}function Qe(t,n){if(Re.includes(n.status))return Ze(t,n);let r=I(t,n.id),i=e.join(F(t),n.id);r!==i&&g(r,i);let a=Ze(t,n);return n.engine!==`claude`&&n.threadId&&Ne(t,n.threadId),a}function $e(e){return!!e.archived&&(e.resumedAt??``)>(e.archivedAt??``)}function et(t,n){let r=I(t,n.id),i=e.join(P(t),n.id);return r!==i&&g(r,i),L(t,n.id,{archived:void 0,archivedAt:void 0})}function tt(){let e=Math.random().toString(36).slice(2,8);return`task-${Date.now().toString(36)}-${e}`}function L(t,n,r){let a=I(t,n);i.mkdirSync(a,{recursive:!0});let o=e.join(a,`job.json`),s={...R(t,n)??{id:n,createdAt:new Date().toISOString(),status:`queued`},...r,updatedAt:new Date().toISOString()};return i.writeFileSync(o,`${JSON.stringify(s,null,2)}\n`,`utf8`),s}function nt(e){return e.agent&&(e.engine=e.agent),delete e.agent,e}function R(t,n){if(!Be(n))return null;let r=e.join(I(t,n),`job.json`);if(!i.existsSync(r))return null;try{return nt(JSON.parse(i.readFileSync(r,`utf8`)))}catch{return null}}function rt(e,t){let n=I(e,t);return i.existsSync(n)?(i.rmSync(n,{recursive:!0,force:!0}),!0):!1}function it(e){if(!e)return!1;try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function at(e){try{let t=a(`ps`,[`-o`,`lstart=`,`-p`,String(e)],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`],env:{...process.env,TZ:Intl.DateTimeFormat().resolvedOptions().timeZone}}).trim(),n=t?Date.parse(t):NaN;return Number.isFinite(n)?n:null}catch{return null}}function ot(e,t,n){if(!it(e))return!1;let r=n(e),i=Date.parse(t.resumedAt??t.createdAt??``);return r===null||!Number.isFinite(i)||r<=i+6e4}function z(e,t,n=at){if(t.status!==`running`&&t.status!==`queued`)return t;let r;if(t.pid)r=!ot(t.pid,t,n);else{let e=Date.parse(t.updatedAt??t.createdAt??``);r=Number.isFinite(e)&&Date.now()-e>6e4}return r?L(e,t.id,{status:`failed`,error:`worker exited without finishing`,completedAt:new Date().toISOString()}):t}function st(t,n){let r=[];for(let a of t){let t=[];try{t=i.readdirSync(a)}catch{continue}for(let o of t){if(n.has(o))continue;let t=e.join(a,o,`job.json`);try{let e=nt(JSON.parse(i.readFileSync(t,`utf8`)));n.add(o),r.push(e)}catch{}}}return r}async function*ct(t){let n=await i.promises.readdir(e.dirname(N(t)),{withFileTypes:!0}).catch(()=>[]),r=[{dir:P(t),archived:!1},{dir:F(t),archived:!0},...n.filter(e=>e.isDirectory()&&e.name!==Je).map(n=>({dir:e.join(e.dirname(N(t)),n.name,`jobs`),archived:!1}))];for(let{dir:t,archived:n}of r){let r=await i.promises.readdir(t,{withFileTypes:!0}).catch(()=>[]);for(let i of r)i.isDirectory()&&Be(i.name)&&(yield{id:i.name,dir:e.join(t,i.name),archived:n})}}const lt=(e,t)=>String(t.updatedAt??``).localeCompare(String(e.updatedAt??``));function ut(){let e=new Map;return t=>(e.has(t)||e.set(t,at(t)),e.get(t))}function dt(t){let n=ut(),r=[P(t),...Ye().map(t=>e.join(t,`jobs`))],i=[];for(let e of st(r,new Set)){let r=z(t,e,n);r.archived&&!$e(r)?Qe(t,r):i.push(r.archived?et(t,r):r)}return i.sort(lt)}function ft(t,n){let r=ut(),i=n?.migrate??!0,a=new Set,o=[];for(let e of st([F(t)],a))$e(e)?i&&et(t,z(t,e,r)):o.push(z(t,e,r));let s=[P(t),...Ye().map(t=>e.join(t,`jobs`))];for(let e of st(s,a))if(e.archived&&!$e(e)){let n=z(t,e,r);o.push(i?Qe(t,n):n)}return o.sort(lt)}function pt(e,t){let n=ft(e),r=[...dt(e),...n].sort(lt);if(!t)return r[0]??null;let i=r.find(e=>e.id===t);if(i)return i;let a=r.filter(e=>e.id.startsWith(t));if(a.length===1)return a[0];if(a.length>1)throw Error(`Task reference "${t}" is ambiguous. Use a longer id.`);return null}function mt(t,n){let r=I(t,n);try{i.mkdirSync(r,{recursive:!0}),i.writeFileSync(e.join(r,`heartbeat`),``,`utf8`)}catch{}}function ht(t,n){let r=I(t,n.id),a=Date.parse(n.updatedAt??``)||0;for(let t of[`log.jsonl`,`heartbeat`])try{a=Math.max(a,i.statSync(e.join(r,t)).mtimeMs)}catch{}return a?new Date(a).toISOString():void 0}async function gt(e,t,n=400){let r=t;for(;!Le.includes(r.status);)await new Promise(e=>setTimeout(e,n)),r=z(e,R(e,r.id)??r);return r}const _t=`steer-queue.jsonl`;function vt(t,n,r){let a=I(t,n);i.mkdirSync(a,{recursive:!0}),i.appendFileSync(e.join(a,_t),`${JSON.stringify({at:new Date().toISOString(),text:r})}\n`,`utf8`)}function yt(t,n){let r=I(t,n),a=e.join(r,_t),o=e.join(r,`steer-claim-${process.pid}-${Date.now()}.tmp`);try{i.renameSync(a,o)}catch{return[]}try{return i.readFileSync(o,`utf8`).split(/\r?\n/).filter(Boolean).map(e=>{try{return String(JSON.parse(e).text??``)}catch{return``}}).filter(Boolean)}finally{try{i.unlinkSync(o)}catch{}}}function bt(t,n,r){let a=I(t,n);i.mkdirSync(a,{recursive:!0}),i.appendFileSync(e.join(a,`log.jsonl`),`${JSON.stringify({at:new Date().toISOString(),...r})}\n`,`utf8`)}function xt(t,n){let r=e.join(I(t,n),`results.jsonl`);return i.existsSync(r)?i.readFileSync(r,`utf8`).split(/\r?\n/).filter(Boolean).flatMap(e=>{try{return[JSON.parse(e)]}catch{return[]}}):[]}function St(e,t){if(t<=0)return[];let n=0;for(let r=e.length-1;r>=0;--r)if(e[r]?.kind!==`usage`&&(n+=1)===t)return e.slice(r);return e}function B(t,n,r=40){let a=e.join(I(t,n),`log.jsonl`);return i.existsSync(a)?i.readFileSync(a,`utf8`).split(/\r?\n/).filter(Boolean).slice(-r).map(e=>{try{return JSON.parse(e)}catch{return{message:e}}}):[]}function Ct(e){return[e.engine??`-`,e.model,e.model?e.effort:null].filter(Boolean).join(`/`)}function wt(e){let t=Date.parse(e??``);return Number.isFinite(t)?Math.max(0,Date.now()-t):0}const Tt=6e5;var V=class extends Error{code;hint;taskId;payload;approval;result;runId;status;constructor(e,t,n={}){super(t),this.name=`CoderError`,this.code=e,Object.assign(this,n)}};const Et={chain:[`codex`,`claude`],engines:{codex:{model:`gpt-6.1-sol`,effort:`high`,permissions:`auto`},claude:{model:`opus`,effort:`medium`,permissions:`auto`}},models:{},approvals:{escalationTimeoutMs:12e4,allowedNetworkHosts:[]}},H={luna:`gpt-6-luna`,sol:`gpt-6.1-sol`,astra:`gpt-6-astra`},Dt=new Set([`low`,`medium`,`high`]),U={sonnet:`sonnet`,opus:`opus`,fable:`fable`},Ot=new Set([`low`,`medium`,`high`]),kt={"read-only":{sandbox:`read-only`,approvalPolicy:`never`,approvalMode:null},"workspace-write":{sandbox:`workspace-write`,approvalPolicy:`never`,approvalMode:null},auto:{sandbox:`workspace-write`,approvalPolicy:`on-request`,approvalMode:`auto`}},At={"read-only":[`--permission-mode`,`dontAsk`,`--disallowedTools`,`Edit`,`Write`,`NotebookEdit`],"workspace-write":[`--permission-mode`,`acceptEdits`],auto:[`--permission-mode`,`auto`]},jt=[`--permission-mode`,`dontAsk`,`--disallowedTools`,`Edit`,`Write`,`NotebookEdit`,`Bash`,`WebFetch`,`WebSearch`,`Task`],Mt=/failIfUnavailable|sandbox\b[^.\n]*?(?:failed|could ?n[o']t|cannot|unavailable|not available|not supported)/i,Nt=new Set([`localhost`,`127.0.0.1`,`::1`,`[::1]`]);function Pt(e){return e.flatMap(e=>d.isIPv6(e)?[`[${e}]`]:e.startsWith(`[`)||e.includes(`:`)||d.isIP(e)?[e]:[e,`*.${e}`])}function Ft(e,t,n=[],r=[],i=[]){let a=e===`read-only`?r:[...r,...i],o=a.length?{permissions:{additionalDirectories:a}}:{};return JSON.stringify(e===`read-only`?{...o,sandbox:{enabled:!0,failIfUnavailable:!0,autoAllowBashIfSandboxed:!0,filesystem:{denyWrite:[t,...r],...i.length?{allowWrite:i}:{}}}}:{...o,sandbox:{enabled:!0,autoAllowBashIfSandboxed:!0,...e===`auto`&&n.length?{network:{allowedDomains:Pt(n),...n.some(e=>Nt.has(e))?{allowLocalBinding:!0}:{}}}:{}}})}const It=r.enum([`codex`,`claude`]),Lt=r.enum([`codex`,`claude`,`custom`]),Rt=r.enum([`low`,`medium`,`high`]),zt=r.enum([`read-only`,`workspace-write`,`auto`]),Bt=r.partial(r.strictObject({model:r.string().check(r.minLength(1)),effort:Rt,permissions:zt})),Vt=r.partial(r.strictObject({model:r.string().check(r.minLength(1)),effort:Rt,permissions:zt,network:r.boolean()})),Ht=r.strictObject({baseUrl:r.url(),model:r.string().check(r.minLength(1)),envKey:r.optional(r.string().check(r.minLength(1))),wireApi:r.optional(r.enum([`chat`,`responses`])),disabled:r.optional(r.boolean())}),Ut=r.strictObject({provider:It,model:r.string().check(r.minLength(1)),effort:r.optional(Rt),disabled:r.optional(r.boolean())}),Wt=r.strictObject({disabled:r.boolean()}),Gt=r.union([Ht,Ut,Wt]),Kt=r.strictObject({escalationTimeoutMs:r.number().check(r.positive()),allowedNetworkHosts:r.array(r.string())}),qt=r.enum([`observe`,`comment`,`write`]),Jt=r.string().check(r.regex(/^[a-z0-9][a-z0-9_-]*$/i,`agent or flow name`)),Yt=r.strictObject({allowedTools:r.optional(r.union([qt,r.array(r.string())])),allowedEvents:r.optional(r.array(r.string()))}),Xt=r.union([r.boolean(),r.strictObject({engine:r.optional(r.string()),model:r.optional(r.string()),effort:r.optional(Rt),permissions:r.optional(zt),runner:r.optional(r.enum([`local`,`local-docker`,`vercel-sandbox`,`github-actions`])),integrations:r.optional(r.record(r.string(),Yt))})]),Zt=r.strictObject({command:r.optional(r.string().check(r.minLength(1))),args:r.optional(r.array(r.string())),env:r.optional(r.record(r.string(),r.string())),url:r.optional(r.string().check(r.minLength(1))),type:r.optional(r.enum([`stdio`,`http`,`sse`])),headers:r.optional(r.record(r.string(),r.string())),tools:r.optional(r.array(r.string())),description:r.optional(r.string())}).check(r.refine(e=>!!e.command!=!!e.url,`one of command or url`)),Qt=r.strictObject({chain:r.array(Lt).check(r.minLength(1)),engines:r.partial(r.strictObject({codex:Vt,claude:Bt,custom:Bt})),models:r.optional(r.record(r.string().check(r.regex(/^[a-z0-9][a-z0-9./_-]*$/i,`model name`)),Gt)),agents:r.optional(r.record(Jt,Xt)),mcp:r.optional(r.record(Jt,Zt)),approvals:Kt}),$t=r.partial(r.extend(Qt,{approvals:r.partial(Kt)}));function W(e){return`baseUrl`in e}function en(e){return`provider`in e}function tn(e,t){return t??e===`auto`}const nn=/^(?!-)[a-z0-9-]{1,63}(?<!-)(?:\.(?!-)[a-z0-9-]{1,63}(?<!-))*(?::\d{1,5})?$/i;function rn(e){if(d.isIP(e))return!0;let t=/^\[([^\]]+)\](?::\d{1,5})?$/.exec(e);return t?d.isIPv6(t[1]):e.length<=253&&nn.test(e)}function an(e,t){delete e.models?.[t];for(let n of Object.values(e.engines??{}))n?.model===t&&delete n.model}function G(e){let t=Object.keys(e?.agents??{}).filter(e=>[`codex`,`claude`,`custom`].includes(e));if(t.length)return t.map(e=>`agents.${e}: engine defaults moved to engines.${e}`);let n=$t.safeParse(e);if(!n.success)return n.error.issues.map(e=>`${e.path.join(`.`)||`config`}: ${e.message}`);let r=cn(Et,n.data),i=[];for(let[e,t]of(n.data.approvals?.allowedNetworkHosts??[]).entries())rn(t)||i.push(`approvals.allowedNetworkHosts.${e}: "${t}" is not a host name or IP address`);for(let[e,t]of Object.entries(n.data.models??{})){if(e===`codex`||e===`claude`||e===`custom`){i.push(`models.${e}: reserved engine name`);continue}if(en(t)){let n=r.models?.[t.model];n&&!W(n)&&i.push(`models.${e}: alias target "${t.model}" is itself a config entry`)}}return i}function on(e){if(!i.existsSync(e))return null;try{return JSON.parse(i.readFileSync(e,`utf8`))}catch(t){let n=t instanceof Error?t.message:String(t);throw Error(`Invalid JSON in ${e}: ${n}`)}}function sn(e){return cn(Et,e)}function cn(e,t){if(!t||typeof t!=`object`||Array.isArray(t))return t??e;let n={...e},r=e;for(let[e,i]of Object.entries(t))n[e]=i&&typeof i==`object`&&!Array.isArray(i)&&r?.[e]&&typeof r[e]==`object`?cn(r[e],i):i;return n}function K(){return A(`config.json`)}const ln=[`coder.config.json`,`coder.json`];function q(t){let n=e.join(t,`.coder`,`config.json`);if(i.existsSync(n))return n;for(let r of ln){let a=e.join(t,r);if(i.existsSync(a)){i.mkdirSync(e.dirname(n),{recursive:!0}),i.renameSync(a,n),process.stderr.write(`coder: moved ${r} to .coder/config.json\n`);break}}return n}const un=`CODER_WORKSPACE_CONFIG`;function dn(e,t){let n=t.approvals?.allowedNetworkHosts?.filter(t=>e.approvals.allowedNetworkHosts.includes(t)),r=Object.fromEntries(Object.entries(t.engines??{}).map(([e,t])=>[e,{...t?.model?{model:t.model}:{},...t?.effort?{effort:t.effort}:{}}])),i=Object.entries(t.models??{}).filter(([,e])=>e.disabled===!0);return{...t.chain?{chain:t.chain.filter(t=>e.chain.includes(t))}:{},engines:r,models:Object.fromEntries(i.map(([e])=>[e,{disabled:!0}])),...n?{approvals:{...e.approvals,allowedNetworkHosts:n}}:{}}}function J(e){let t=M(e),n=process.env[un],r=[[K(),on(K())],...n?[[`the workspace config`,JSON.parse(n)]]:[]],i=q(t);r.push([i,on(i)]);let a=Et;for(let[e,t]of r){if(!t)continue;let r=G(t);if(r.length)throw Error(`Invalid config in ${e}:\n ${r.join(`
|
|
5
|
-
`)}`);a=cn(a,n&&e===i?dn(a,t):t)}let o=G(a);if(o.length)throw Error(`Invalid merged config:\n ${o.join(`
|
|
6
|
-
`)}`);return a}function fn(e){return e.replace(/\/+$/,``).replace(/\/(chat\/completions|completions|responses)$/,``)}function pn(e,t,n){let r=[q(M(e)),K()];for(let e of r){let r;try{r=on(e)}catch{continue}if(r?.models?.[t])return Object.assign(r.models[t],n),!G(r).length&&(i.writeFileSync(e,`${JSON.stringify(r,null,2)}\n`,`utf8`),!0)}return!1}function mn(e){return/\/(chat\/completions|completions|responses)\/*$/.test(e)}function hn(e,t){let n=fn(e);return mn(e)||/\/v\d+(alpha|beta)?$/.test(n)?[`${n}/${t}`]:[`${n}/${t}`,`${n}/v1/${t}`]}function gn(e,t,n){let r=t?e.models?.[t]:void 0;if(!t||!r||!W(r))return null;let i=`coder-${t}`;return{model:r.model,modelProvider:i,configOverrides:{[`model_providers.${i}`]:{name:t,base_url:n?.url??fn(r.baseUrl),...r.envKey&&!n?{env_key:r.envKey}:{},wire_api:`responses`}}}}function _n(e){return e?H[e]??e:null}function vn(e){return e in H||e in U}function yn(e,t){return!!(t&&e.models?.[t]?.disabled)}function bn(e,t){if(yn(e,t))throw Error(`model "${t}" is disabled in config`)}function xn(e,t){if(!e)return null;let n=String(e).trim().split(`:`).map(e=>e.trim());if(!n.length||n.length>3||n.some(e=>!e))throw Error(`Invalid engine spec "${e}".`);let r=null,i=null,a=null,o=e=>Dt.has(e)||Ot.has(e);for(let t of n)if(t===`codex`||t===`claude`||t===`custom`){if(r)throw Error(`Invalid engine spec "${e}".`);r=t}else if(o(t)&&!a)a=t;else if(!i)i=t;else throw Error(`Invalid engine spec "${e}".`);let s=i?t.models?.[i]:void 0;if(s&&en(s)){if(s.disabled)throw Error(`model "${i}" is disabled in config`);if(r&&r!==s.provider)throw Error(`Alias "${i}" runs on ${s.provider}, not ${r}.`);r=s.provider,a=a??s.effort??null,i=s.model}r||=i&&i in U?`claude`:i&&s&&W(s)?`custom`:`codex`;let c=t.engines[r]??{},l=i??c.model??null;return bn(t,l),{engine:r,model:l,effort:a??c.effort??null}}function Sn(t){let n=K();return i.mkdirSync(e.dirname(n),{recursive:!0}),i.writeFileSync(n,`${JSON.stringify(t,null,2)}\n`,`utf8`),n}function Cn(e,t){return t.split(`.`).reduce((e,t)=>e?.[t],e)}function wn(e,t){return t?q(M(e)):K()}function Tn(e,t){let n=J(e);return t?Cn(n,t):n}function En(e,t,n,r={}){let i=wn(e,r.workspace);Dn(i,e=>{let i=t.split(`.`),a=i.at(-1),o=e;for(let e of i.slice(0,-1))(typeof o[e]!=`object`||o[e]===null)&&(o[e]={}),o=o[e];r.unset?delete o[a]:o[a]=n});let a=Cn(J(e),t)??null;return{file:i,key:t,...r.unset?{unset:!0}:{value:n},effective:a}}function Dn(t,n){let r=i.existsSync(t)?JSON.parse(i.readFileSync(t,`utf8`)):{};n(r),r.models&&Object.keys(r.models).length===0&&delete r.models;let a=G(r);if(a.length)throw Error(`Refusing to write invalid config:\n ${a.join(`
|
|
7
|
-
`)}`);i.mkdirSync(e.dirname(t),{recursive:!0}),i.writeFileSync(t,`${JSON.stringify(r,null,2)}\n`,`utf8`)}function On(e,t){return t?K():q(M(e))}function kn(e,t){let n={};for(let r of(e??``).split(`,`).map(e=>e.trim()).filter(Boolean)){let e=r.indexOf(`=`);if(e<1)throw Error(`Invalid ${t} "${r}": use KEY=VALUE (values may hold \${VAR}).`);n[r.slice(0,e)]=r.slice(e+1)}return n}function An(e,t,n,r){let i=On(e,r);return Dn(i,e=>{e.mcp={...e.mcp,[t]:n}}),{name:t,file:i}}function jn(e,t,n={}){let[r,...i]=n.command??[];if(!t)throw Error(`Usage: coder mcp add <name> [--tools a,b] [--user] (--url <url> [--header K=V] | -- <command> [args...])`);if(!r&&!n.url)throw Error("Give a remote --url, or a command after `--`.");if(r&&n.url)throw Error(`Use either --url or a command, not both.`);let a=n.tools?{tools:n.tools.split(`,`).map(e=>e.trim()).filter(Boolean)}:{},o=kn(n.env,`--env`),s=kn(n.header,`--header`);return An(e,t,n.url?{url:n.url,...n.transport?{type:n.transport}:{},...Object.keys(s).length?{headers:s}:{},...a}:{command:r,...i.length?{args:i}:{},...Object.keys(o).length?{env:o}:{},...a},n.user)}function Mn(e,t,n,r={}){if(!t||!n)throw Error(`Usage: coder mcp add-json <name> '<json entry>' [--user]`);let i=n;if(typeof n==`string`)try{i=JSON.parse(n)}catch(e){throw Error(`Invalid JSON: ${e instanceof Error?e.message:String(e)}`)}if(!i||typeof i!=`object`||Array.isArray(i))throw Error(`The entry must be a JSON object.`);return An(e,t,i,r.user)}function Nn(e){return J(e).mcp??{}}function Pn(e,t,n={}){if(!t)throw Error(`Usage: coder mcp rm <name> [--user]`);let r=On(e,n.user);return Dn(r,e=>{if(!e.mcp?.[t])throw Error(`No MCP server "${t}" in ${r}.`);delete e.mcp[t],Object.keys(e.mcp).length||delete e.mcp}),{name:t,file:r}}const Fn=/access token could not be refreshed/i,In=/model is not supported|Codex cannot run model/i;function Ln(e){return e instanceof Error?e.message:String(e??``)}function Rn(e){return Fn.test(e??``)}function zn(e){return In.test(e??``)}function Bn(e,t){return!zn(e)||/Codex cannot run model/.test(e??``)?null:`Codex cannot run model ${/'([^']+)' model/.exec(e??``)?.[1]??t??`this model`} on the signed-in account. Run \`codex login\` with an account that has it, or pick another alias (coder model list).`}function Vn(t=process.env){return e.join(t.CODEX_HOME||e.join(u.homedir(),`.codex`),`auth.json`)}function Hn(e){try{let t=JSON.parse(Buffer.from(String(e).split(`.`)[1]??``,`base64url`).toString(`utf8`));return String(t.sub??t.email??``)}catch{return``}}function Un(e=process.env,t){let n=Vn(e),r;try{r=i.statSync(n).mtimeMs}catch{return``}if(t?.file===n&&t.mtimeMs===r)return t.fingerprint??``;try{let e=JSON.parse(i.readFileSync(n,`utf8`)),a=e.OPENAI_API_KEY?c(`sha256`).update(String(e.OPENAI_API_KEY)).digest(`hex`):``,o=[e.auth_mode??``,e.tokens?.account_id??``,Hn(e.tokens?.id_token),a].join(`|`);return t&&Object.assign(t,{file:n,mtimeMs:r,fingerprint:o}),o}catch{return t?.file===n?t.fingerprint??``:``}}const Wn=`CODER_MAILBOX`,Gn=/^([a-f0-9-]{36})\.(?:req|applying)\.json$/;function Kn(e){if(!e)return l();if(!e.task||!Number.isInteger(e.generation)||e.generation<0||!Number.isInteger(e.seq)||e.seq<0)throw Error(`Invalid command key`);let t=c(`sha256`).update(JSON.stringify([e.task,e.generation,e.seq])).digest(`hex`).slice(0,32);return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`}const qn=[`hint`,`taskId`,`payload`,`approval`,`result`,`runId`,`status`];function Jn(e=t.env){return e.CODER_MAILBOX||void 0}function Yn(e,t){let n=`${e}.${l()}.tmp`;i.writeFileSync(n,JSON.stringify(t),{encoding:`utf8`,flag:`wx`}),i.renameSync(n,e)}async function Xn(t,n,r={}){let a=r.dir??Jn();if(!a)throw Error(`No mailbox: not inside an agent task.`);let o=r.id??l(),s=e.join(a,`${o}.res.json`);i.existsSync(s)||Yn(e.join(a,`${o}.req.json`),{kind:t,payload:n});let c=Date.now();for(;!i.existsSync(s);){if(r.timeoutMs&&Date.now()-c>=r.timeoutMs)throw Error(`Worker control timed out`);await new Promise(e=>setTimeout(e,100))}let{result:u,error:d}=JSON.parse(i.readFileSync(s,`utf8`));if(r.keepReply||i.rmSync(s,{force:!0}),d){let{code:e,message:t,...n}=d;throw new V(e,t,n)}return u}function Zn(t,n){i.mkdirSync(t,{recursive:!0});let r=new Set,a=async(a,o)=>{let s;try{let r=e.join(t,a);if(!i.lstatSync(r).isFile())throw Error(`mailbox request is not a regular file`);let{kind:c,payload:l}=JSON.parse(i.readFileSync(r,`utf8`)),u=e.join(t,`${o}.applying.json`);i.existsSync(u)||Yn(u,{kind:c,payload:l});let d=Object.hasOwn(n,c)?n[c]:void 0;if(!d)throw Error(`unknown mailbox request "${c}"`);s={result:await d(l??{})??null}}catch(e){let t=e instanceof V?e:void 0;s={error:{code:t?.code??`invalid-option`,message:e instanceof Error?e.message:String(e),...Object.fromEntries(qn.flatMap(e=>t?.[e]===void 0?[]:[[e,t[e]]]))}}}try{Yn(e.join(t,`${o}.res.json`),s),i.rmSync(e.join(t,`${o}.req.json`),{force:!0}),i.rmSync(e.join(t,`${o}.applying.json`),{force:!0}),r.delete(o)}catch{}},o=setInterval(()=>{let n=[];try{n=i.readdirSync(t)}catch{return}for(let o of n){let n=Gn.exec(o)?.[1];if(n){if(i.existsSync(e.join(t,`${n}.res.json`))){i.rmSync(e.join(t,o),{force:!0});continue}r.has(n)||(r.add(n),a(o,n))}}},100);return()=>clearInterval(o)}function Qn(t,n){return n.agentId?e.join(I(t,n.id),`mailbox`):null}function $n(e,t){let n=`${e}.${process.pid}.${l()}.tmp`;i.writeFileSync(n,`${JSON.stringify(t)}\n`,`utf8`),i.renameSync(n,e)}function er(e){let t=e instanceof Error?e.message:String(e);return/no active turn|active turn.*(?:ended|completed)|turn.*(?:already )?(?:ended|completed)|turn.*not active/i.test(t)}function Y(e,t,n){return Object.assign(Error(e),{retryable:t,...n===void 0?{}:{rpcCode:n}})}function tr(e,t,n,r){if(!e||e.id!==t||e.method!==`turn/steer`&&e.method!==`turn/interrupt`)throw Y(`Invalid Codex control request.`,!1);let i=e.params;if(!i||typeof i!=`object`||i.threadId!==n)throw Y(`Codex control request does not match its owning thread.`,!1);if(e.method===`turn/interrupt`){if(i.turnId!==r)throw Y(`Codex turn/interrupt request does not match its owning active turn.`,!1);return{method:e.method,params:i}}if(i.expectedTurnId!==r)throw Y(`Codex turn/steer request does not match its owning active turn.`,!1);let a=i.input;if(!Array.isArray(a)||a.length!==1||a[0]?.type!==`text`||typeof a[0]?.text!=`string`||!a[0].text.trim())throw Y(`Invalid Codex turn/steer input schema.`,!1);return{method:e.method,params:i}}async function nr(t,{threadId:n,turnId:r}){let a=i.mkdtempSync(e.join(u.tmpdir(),`coder-codex-control-`)),o=`file:${a}`,s=new Set,c=new Set,l=!1,d=!1,f=(o=!1)=>{if(!(l&&!o||d)){d=!0;try{for(let o of i.readdirSync(a).filter(e=>e.endsWith(`.request.json`))){let u=o.slice(0,-13),d=e.join(a,o),f=e.join(a,`${u}.response.json`);if(i.existsSync(f)){i.unlinkSync(d);continue}if(c.has(u))continue;let p=`${d}.${process.pid}.processing`;try{i.renameSync(d,p)}catch{continue}c.add(u);let m=(async()=>{let e;try{if(l)throw Y(`Codex owner endpoint is shutting down.`,!0);let a=tr(JSON.parse(i.readFileSync(p,`utf8`)),u,n,r);try{let n=await t.request(a.method,a.params);e={id:u,result:n}}catch(t){let n=t;e={id:u,error:{message:t instanceof Error?t.message:String(t),retryable:er(t),...n.rpcCode===void 0?{}:{rpcCode:n.rpcCode}}}}}catch(t){let n=t;e={id:u,error:{message:n.message,retryable:n.retryable===!0,...n.rpcCode===void 0?{}:{rpcCode:n.rpcCode}}}}try{$n(f,e)}finally{c.delete(u);try{i.unlinkSync(p)}catch{}}})();s.add(m),m.then(()=>s.delete(m),()=>s.delete(m))}}catch{}finally{d=!1}}},p=setInterval(f,10);return p.unref?.(),{endpoint:o,async close(){l||(l=!0,clearInterval(p),f(!0),await Promise.allSettled([...s]),await new Promise(e=>setTimeout(e,50)),i.rmSync(a,{recursive:!0,force:!0}))}}}function rr(t){if(t?.startsWith(`file:`)&&t.length>5){let n=e.resolve(t.slice(5)),r=e.resolve(u.tmpdir());e.dirname(n)===r&&e.basename(n).startsWith(`coder-codex-control-`)&&i.rmSync(n,{recursive:!0,force:!0})}}async function ir(t,n,r,a=3e3,o){if(!t)return{ok:!1,retryable:!0,detail:`Codex owner endpoint is not ready.`};if(!t.startsWith(`file:`)||t.length===5)return{ok:!1,retryable:!1,detail:`Unsupported Codex control endpoint: ${t}`};let s=t.slice(5);if(!i.existsSync(s))return{ok:!1,retryable:!0,detail:`Codex owner endpoint is no longer available.`};let c=Kn(o),l=e.join(s,`${c}.request.json`),u=e.join(s,`${c}.response.json`);try{i.existsSync(u)||$n(l,{id:c,method:n,params:r,command:o})}catch(e){return{ok:!1,retryable:e.code===`ENOENT`,detail:e instanceof Error?e.message:String(e)}}let d=Date.now();for(;Date.now()-d<a;){try{let e=JSON.parse(i.readFileSync(u,`utf8`));try{(!o||e?.error?.retryable)&&i.unlinkSync(u)}catch{}return e?.id===c?e?.error?{ok:!1,retryable:e.error.retryable===!0,detail:String(e.error.message??`Malformed Codex owner error response.`)}:`result`in e?{ok:!0,retryable:!1,result:e.result,detail:`Codex owner accepted control.`}:{ok:!1,retryable:!1,detail:`Malformed Codex owner response.`}:{ok:!1,retryable:!1,detail:`Malformed Codex owner response id.`}}catch(e){if(e.code!==`ENOENT`)return{ok:!1,retryable:!1,detail:`Invalid Codex owner response: ${e instanceof Error?e.message:String(e)}`};if(!i.existsSync(s))return{ok:!1,retryable:!1,detail:`Codex owner endpoint closed after control publication; acceptance is unknown.`}}await new Promise(e=>setTimeout(e,10))}return{ok:!1,retryable:!1,detail:`Timed out waiting for Codex owner acknowledgement.`}}const ar=`Coder Task`;function or(e,t=72){let n=String(e??``).trim().replace(/\s+/g,` `);return n?n.length<=t?n:`${n.slice(0,t-3)}...`:``}function sr(e){let t=or(e,56);return t?`${ar}: ${t}`:ar}function cr(e){return e?.params?.threadId??null}function lr(e){return e?.params?.turnId?e.params.turnId:e?.params?.turn?.id?e.params.turn.id:null}function ur(e){let t=new Set;for(let n of e)for(let e of n.changes??[])e.path&&t.add(e.path);return[...t]}function dr(e,t){let n=[];for(let r of e.matchAll(/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/gm)){let e=t===`delete`,i=Number(e?r[1]:r[3]),a=Number((e?r[2]:r[4])??1);!Number.isFinite(i)||!Number.isFinite(a)||n.push(a<=1?`L${i}`:`L${i}-L${i+a-1}`)}return n}function fr(e){try{let t=i.readFileSync(e,`utf8`),n=t?t.split(/\r\n|\r|\n/).length-+!!t.endsWith(`
|
|
8
|
-
`):0;return n>0?[n===1?`L1`:`L1-L${n}`]:[]}catch{return[]}}function pr(e,t,n){let r=typeof e.kind==`string`?e.kind:e.kind?.type??`change`,i=e.path||`(unknown path)`,a=dr(e.diff??``,r),o=a.length||r!==`add`||!t?a:fr(i),s=typeof e.kind==`object`&&e.kind?.move_path?` -> ${n?p(n,e.kind.move_path):e.kind.move_path}`:``;return`${r} ${n?p(n,i):i}${s}${o.length?` ${o.join(`, `)}`:``}`}function mr(e,t=!1,n){return(e.changes??[]).map(e=>pr(e,t,n)).join(`; `)}function hr(e){let t=e.trim().split(` `)[0]??``;return t===`/dev/null`?``:t.replace(/^[ab]\//,``)}function gr(e,t){let n=new Map,r=``,i=``;for(let t of e.split(/\r?\n/)){if(t.startsWith(`--- `)){r=hr(t.slice(4));continue}if(t.startsWith(`+++ `)){i=hr(t.slice(4));continue}let e=/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/.exec(t);if(!e)continue;let a=Number(e[1]),o=Number(e[2]??1),s=Number(e[3]),c=Number(e[4]??1),l=c===0,u=(l?r:i)||i||r||`(unknown path)`,d=l?a:s,f=l?o:c,p=f<=1?`L${d}`:`L${d}-L${d+f-1}`,m=n.get(u)??[];m.push(p),n.set(u,m)}return[...n].map(([e,n])=>`${t?p(t,e):e} ${n.join(`, `)}`).join(`; `)}function _r(e){if(!e||typeof e!=`object`)return null;let t=e=>typeof e==`number`&&Number.isFinite(e)?e:0,n=t(e.inputTokens),r=t(e.cachedInputTokens),i=t(e.outputTokens);return{input:n,cachedInput:r,output:i,total:t(e.totalTokens)||n+r+i}}function vr(e){if(e.tokenUsageByThread.size===0)return null;let t={input:0,cachedInput:0,output:0,total:0};for(let n of e.tokenUsageByThread.values())t.input+=n.input,t.cachedInput+=n.cachedInput,t.output+=n.output,t.total+=n.total;return t}function yr(e){return String(e??``).replace(/\s+/g,` `).trim()}function X(e){if(!e)return[];if(typeof e==`string`){let t=yr(e);return t?[t]:[]}if(Array.isArray(e))return e.flatMap(e=>X(e));if(typeof e==`object`){let t=e;if(typeof t.text==`string`)return X(t.text);if(`summary`in t)return X(t.summary);if(`content`in t)return X(t.content);if(`parts`in t)return X(t.parts)}return[]}function br(e,t){let n=[];for(let r of[...e,...t]){let e=yr(r);!e||n.includes(e)||n.push(e)}return n}function Z(e,t,n=null,r={}){!e||t==null||e({message:t,phase:n,...r})}function xr(e,t){t&&Z(e,t.message,t.phase??null,t.extra??{})}function Sr(e){return e.replace(/^\/(?:usr\/)?bin\/\w*sh\s+-l?c\s+/,``)}function Cr(e,t){switch(e.type){case`commandExecution`:return{message:Sr(String(e.command??``).trim()),phase:`running`,extra:{kind:`tool`,tool:`command`}};case`fileChange`:return null;case`mcpToolCall`:return{message:`${e.server}/${e.tool}`,phase:`investigating`,extra:{kind:`tool`,tool:String(e.tool??``)}};case`dynamicToolCall`:return{message:String(e.tool??``),phase:`investigating`,extra:{kind:`tool`,tool:String(e.tool??``)}};case`webSearch`:return{message:`search: ${String(e.query??``).trim()}`,phase:`investigating`,extra:{kind:`tool`,tool:`search`}};default:return null}}function wr(e,t){switch(e.type){case`agentMessage`:{let t=String(e.text??``).trim();return t?{message:t,phase:null,extra:{kind:`assistant`}}:null}case`reasoning`:{let t=X(e.summary).join(`
|
|
9
|
-
`);return t?{message:t,phase:null,extra:{kind:`reasoning`}}:null}case`commandExecution`:{let t=typeof e.exitCode==`number`?e.exitCode:null;return{message:String(e.aggregatedOutput??``).trim(),phase:`running`,extra:{kind:`tool-result`,tool:`command`,command:String(e.command??``).trim(),...t===null?{isError:e.status!==`completed`}:{exitCode:t}}}}case`fileChange`:return{message:mr(e,!0,t)||`(details unavailable)`,phase:`editing`,extra:{kind:`tool`,tool:`edit`}};case`mcpToolCall`:return{message:`${e.server}/${e.tool} ${e.status}`,phase:`investigating`,extra:{kind:`tool-result`,isError:e.status!==`completed`}};case`dynamicToolCall`:return{message:`${e.tool} ${e.status}`,phase:`investigating`,extra:{kind:`tool-result`,isError:e.status!==`completed`}};default:return null}}function Tr(e,t={}){let n,r,i=new Promise((e,t)=>{n=e,r=t});return{threadId:e,rootThreadId:e,threadIds:new Set([e]),threadTurnIds:new Map,turnId:null,bufferedNotifications:[],completion:i,resolveCompletion:n,rejectCompletion:r,finalTurn:null,completed:!1,finalAnswerSeen:!1,pendingCollaborations:new Set,activeSubagentTurns:new Set,completionTimer:null,lastAgentMessage:``,reasoningSummary:[],error:null,fileChanges:[],commandExecutions:[],tokenUsageByThread:new Map,lastDiffSummary:``,loggedTokens:0,reportedChanges:new Set,cwd:t.cwd??``,itemIndex:new Map,onProgress:t.onProgress??null,onHeartbeat:t.onHeartbeat??null}}function Er(e){e.completionTimer&&=(clearTimeout(e.completionTimer),null)}function Dr(e,t=null){e.completed||(Er(e),e.completed=!0,t?(e.finalTurn=t,e.turnId||=t.id??null):e.finalTurn||={id:e.turnId??`inferred-turn`,status:`completed`},e.resolveCompletion(e))}function Or(e){e.completed||e.finalTurn||!e.finalAnswerSeen||e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||(Er(e),e.completionTimer=setTimeout(()=>{e.completionTimer=null,!(e.completed||e.finalTurn||!e.finalAnswerSeen)&&(e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||Dr(e,null))},250),e.completionTimer.unref?.())}function kr(e,t){let n=cr(t);if(!n||!e.threadIds.has(n))return!1;let r=e.threadTurnIds.get(n)??null,i=lr(t);return r===null||i===null||i===r}function Ar(e,t,n,r=null){if(t.id&&e.itemIndex.set(t.id,t),t.type===`collabAgentToolCall`){(!r||r===e.threadId)&&(n===`started`||t.status===`inProgress`?e.pendingCollaborations.add(t.id):n===`completed`&&(e.pendingCollaborations.delete(t.id),Or(e)));for(let n of t.receiverThreadIds??[])e.threadIds.add(n)}if(t.type===`agentMessage`){t.text&&(!r||r===e.threadId)&&(e.lastAgentMessage=t.text.trim(),n===`completed`&&t.phase===`final_answer`&&(e.finalAnswerSeen=!0,Or(e)));return}if(t.type===`reasoning`&&n===`completed`){e.reasoningSummary=br(e.reasoningSummary,X(t.summary));return}if(t.type===`fileChange`&&n===`completed`){e.fileChanges.push(t);return}t.type===`commandExecution`&&n===`completed`&&e.commandExecutions.push(t)}function jr(e,t){switch(e.onHeartbeat?.(),t.method){case`thread/started`:e.threadIds.add(t.params.thread.id);break;case`turn/started`:e.threadIds.add(t.params.threadId),e.threadTurnIds.set(t.params.threadId,t.params.turn.id),(t.params.threadId??null)!==e.threadId&&e.activeSubagentTurns.add(t.params.threadId),Z(e.onProgress,`Turn started (${t.params.turn.id}).`,`starting`,{kind:`status`,threadId:t.params.threadId??null,turnId:t.params.turn.id??null});break;case`item/started`:Ar(e,t.params.item,`started`,t.params.threadId??null),xr(e.onProgress,Cr(t.params.item,e.cwd));break;case`item/completed`:{Ar(e,t.params.item,`completed`,t.params.threadId??null);let n=t.params.item;if(n?.type===`fileChange`)for(let t of n.changes??[])t.path&&e.reportedChanges.add(p(e.cwd,t.path));xr(e.onProgress,wr(n,e.cwd));break}case`thread/tokenUsage/updated`:{let n=_r(t.params?.tokenUsage?.total??t.params?.tokenUsage),r=cr(t);if(n&&r){e.tokenUsageByThread.set(r,n);let t=vr(e);t&&(!e.loggedTokens||t.total-e.loggedTokens>=1e3)&&(e.loggedTokens=t.total,e.onProgress?.({kind:`usage`,tokens:t}))}break}case`turn/diff/updated`:{let n=gr(String(t.params?.diff??``),e.cwd).split(`; `).filter(t=>!e.reportedChanges.has(t.split(` `)[0]??``)).join(`; `);n&&n!==e.lastDiffSummary&&(e.lastDiffSummary=n,Z(e.onProgress,`changed: ${n}`,`editing`,{kind:`status`}));break}case`item/autoApprovalReview/completed`:{let n=t.params?.review??{},r=t.params?.action??{},i=Sr(String(r.command??r.type??``).trim());Z(e.onProgress,`Auto-review ${n.status}. ${or(i,48)}${n.rationale?`. ${or(n.rationale,320)}`:``}`,null,{kind:`auto-review`,decision:String(n.status??``),...n.riskLevel?{riskLevel:String(n.riskLevel)}:{},...i?{summary:`run command: ${i}`}:{},...n.rationale?{reason:String(n.rationale)}:{}});break}case`error`:e.error=t.params.error,Z(e.onProgress,`Codex error: ${t.params.error.message}`,`failed`,{kind:`error`});break;case`turn/completed`:if((t.params.threadId??null)!==e.threadId){e.activeSubagentTurns.delete(t.params.threadId),Or(e);break}Z(e.onProgress,`Turn ${t.params.turn.status}.`,`finalizing`,{kind:`status`}),Dr(e,t.params.turn)}}async function Mr(e,t,n,r={}){let i=Tr(t,r),a=e.notificationHandler;e.setNotificationHandler(e=>{if(!i.turnId){i.bufferedNotifications.push(e);return}if(e.method===`thread/started`){jr(i,e);return}if(!kr(i,e)){a?.(e);return}jr(i,e)});let o=r.onApprovalRequest;o&&e.setServerRequestHandler((e,t)=>o(e,t,i));try{let t=await n();i.turnId=t.turn?.id??null,i.turnId&&(i.threadTurnIds.set(i.threadId,i.turnId),await r.onTurnStarted?.(i.turnId));for(let e of i.bufferedNotifications)kr(i,e)?jr(i,e):a?.(e);i.bufferedNotifications.length=0,t.turn?.status&&t.turn.status!==`inProgress`&&Dr(i,t.turn);let o=e.exitPromise?.then(()=>{throw e.exitError??Error(`codex app-server connection closed before the turn completed.`)});return await(o?Promise.race([i.completion,o]):i.completion)}finally{Er(i),e.setNotificationHandler(a??null),e.setServerRequestHandler(null)}}function Nr(e,t,n=[]){return e!==`workspace-write`||!n.length?null:{type:`workspaceWrite`,writableRoots:n,networkAccess:t??!1}}const Pr=`coder_read_only`;function Fr(e,t=[]){return(e??`read-only`)!==`read-only`||!t.length?null:{default_permissions:Pr,[`permissions.${Pr}`]:{extends:`:read-only`,filesystem:Object.fromEntries(t.map(e=>[e,`write`]))}}}function Ir(e=[]){let t={};for(let n of e)t[`mcp_servers.${n.name}`]={...n.url?{url:n.url,...n.headers?{http_headers:n.headers}:{}}:{command:n.command,args:n.args??[],...n.env?{env:n.env}:{}},...n.tools?.length?{enabled_tools:n.tools}:{}};return t}function Lr(e){return e.split(/\r?\n/).map(e=>e.trimEnd()).filter(e=>e&&!e.startsWith(`WARNING: proceeding, even though we could not update PATH:`)).join(`
|
|
10
|
-
`)}async function Rr(e,t,n={}){let r=n.connect??k.connect,i=n.networkAccess===void 0?{}:{networkAccess:n.networkAccess},a=null;try{a=await r(e,i);let n=await t(a);return await a.close(),n}catch(n){let o=n,s=a?.transport===`broker`||!!process.env.CODER_APP_SERVER_ENDPOINT,c=a?.transport===`broker`&&o?.rpcCode===-32001||s&&(o?.code===`ENOENT`||o?.code===`ECONNREFUSED`);if(a&&=(await a.close().catch(()=>{}),null),!c)throw n;let l=await r(e,{...i,disableBroker:!0});try{return await t(l)}finally{await l.close()}}}function Q(t){let n=process.env.CODEX_AUTH_JSON;if(n){let t=e.join(u.homedir(),`.codex`),r=e.join(t,`auth.json`);if(!i.existsSync(r)){i.mkdirSync(t,{recursive:!0,mode:448});try{i.writeFileSync(r,n,{encoding:`utf8`,flag:`wx`,mode:384})}catch(e){if(e.code!==`EEXIST`)throw e}}}let r=me(`codex`,[`--version`],{cwd:t});if(!r.available)return r;let a=me(`codex`,[`app-server`,`--help`],{cwd:t});return a.available?{available:!0,detail:`${r.detail}; app-server runtime available`}:{available:!1,detail:`${r.detail}; app-server runtime unavailable: ${a.detail}`}}async function zr(e){let t=Q(e);if(!t.available)return{available:!1,loggedIn:!1,detail:t.detail};let n=null;try{n=await k.connect(e,{reuseExistingBroker:!0});let t=await n.request(`account/read`,{refreshToken:!1}),r=t?.account??null;return r?.type===`chatgpt`?{available:!0,loggedIn:!0,detail:r.email?`ChatGPT login active for ${r.email}`:`ChatGPT login active`}:r?.type===`apiKey`?{available:!0,loggedIn:!0,detail:`API key configured`}:t?.requiresOpenaiAuth===!1?{available:!0,loggedIn:!0,detail:`Active provider does not require OpenAI authentication`}:{available:!0,loggedIn:!1,detail:"Not authenticated. Run `codex login`."}}catch(e){let t=s(`codex`,[`login`,`status`],{encoding:`utf8`}),n=`${t.stdout??``}${t.stderr??``}`.trim();return t.status===0?{available:!0,loggedIn:!0,detail:n||`Logged in`}:{available:!0,loggedIn:!1,detail:n||(e instanceof Error?e.message:String(e))}}finally{await n?.close().catch(()=>{})}}async function Br(e,{endpoint:t,threadId:n,turnId:r}){if(!n||!r)return{interrupted:!1,detail:`missing threadId or turnId`};let i=await ir(t,`turn/interrupt`,{threadId:n,turnId:r});return i.ok?{interrupted:!0,detail:`Interrupted ${r} on ${n}.`}:{interrupted:!1,detail:i.detail}}async function Vr(e,{endpoint:t,threadId:n,turnId:r,text:i,command:a}){if(!n)return{steered:!1,retryable:!0,detail:`missing active threadId`};if(!r)return{steered:!1,retryable:!0,detail:`missing active turnId`};let o=i.trim();if(!o)return{steered:!1,retryable:!1,detail:`empty follow-up`};let s=await ir(t,`turn/steer`,{threadId:n,input:[{type:`text`,text:o,text_elements:[]}],expectedTurnId:r},3e3,a);return s.ok?s.result?.turnId===r?{steered:!0,retryable:!1,detail:`Steered follow-up into ${r} on ${n}.`}:{steered:!1,retryable:!1,detail:`turn/steer returned unexpected turnId ${String(s.result?.turnId??`(missing)`)}; expected ${r}`}:{steered:!1,retryable:s.retryable,detail:s.detail}}async function Hr(e,t={},n={}){let r=Q(e);if(!r.available)throw Error(`Codex CLI is not available: ${r.detail}`);let i=t.prompt?.trim();if(!i)throw Error(`A prompt is required.`);let a=Ir(t.mcpServers??[]),o=Fr(t.sandbox,t.writableRoots),s=o?{}:{sandbox:t.sandbox??`read-only`},c={...t.configOverrides??{},...o,...a},l=Object.keys(c).length?c:null,u=Nr(t.sandbox,t.networkAccess,t.writableRoots),d=async n=>{let r=null,a;if(t.resumeThreadId)Z(t.onProgress,`Resuming thread ${t.resumeThreadId}.`,`starting`,{kind:`status`}),Pe(t.resumeThreadId)&&await Fe(t.resumeThreadId),a=(await n.request(`thread/resume`,{threadId:t.resumeThreadId,cwd:e,model:t.model??null,modelProvider:t.modelProvider??null,config:l,approvalPolicy:t.approvalPolicy??`never`,...s,...t.approvalsReviewer?{approvalsReviewer:t.approvalsReviewer}:{}})).thread.id;else if(Z(t.onProgress,`Starting Codex task thread.`,`starting`,{kind:`status`}),a=(await n.request(`thread/start`,{cwd:e,model:t.model??null,modelProvider:t.modelProvider??null,config:l,approvalPolicy:t.approvalPolicy??`never`,...s,...t.approvalsReviewer?{approvalsReviewer:t.approvalsReviewer}:{},serviceName:`coder_runtime`,ephemeral:t.ephemeral??!1})).thread.id,!(t.ephemeral??!1))try{await n.request(`thread/name/set`,{threadId:a,name:sr(i)})}catch(e){let t=String(e?.message??e??``);if(!t.includes(`unknown variant`)&&!t.includes(`unknown method`))throw e}Z(t.onProgress,`Thread ready (${a}).`,`starting`,{kind:`status`,threadId:a});let o;try{o=await Mr(n,a,()=>n.request(`turn/start`,{threadId:a,input:[{type:`text`,text:i,text_elements:[]}],model:t.model??null,effort:t.effort??null,outputSchema:t.outputSchema??null,...u?{sandboxPolicy:u}:{}}),{cwd:e,onProgress:t.onProgress,onHeartbeat:t.onHeartbeat,onApprovalRequest:t.onApprovalRequest,onTurnStarted:t.onControlReady?async e=>{r=await nr(n,{threadId:a,turnId:e}),t.onControlReady?.(r.endpoint,a,e)}:void 0}),t.onResult?.({status:o.finalTurn?.status===`completed`?0:1,threadId:a,turnId:o.turnId,finalMessage:o.lastAgentMessage,error:o.error??null})}finally{await r?.close()}return{status:o.finalTurn?.status===`completed`?0:1,threadId:a,turnId:o.turnId,finalMessage:o.lastAgentMessage,reasoningSummary:o.reasoningSummary,turn:o.finalTurn,error:o.error??o.finalTurn?.error??null,stderr:Lr(n.stderr),fileChanges:o.fileChanges,touchedFiles:ur(o.fileChanges),tokens:vr(o),model:t.model??null,commandExecutions:o.commandExecutions}},f=async e=>{e.setNoticeHandler?.(e=>Z(t.onProgress,e,`starting`,{kind:`status`}));try{let t=await d(e);return Rn(t.error?.message)&&await Ur(e),t}catch(t){throw Rn(Ln(t))&&await Ur(e),t}},p=()=>Rr(e,f,{...n,networkAccess:t.networkAccess}),m=!1,h=()=>(m=!0,Z(t.onProgress,`Codex login changed; restarted the Codex app-server and retrying the turn once.`,`starting`,{kind:`status`}),p());try{let e=await p().catch(e=>{if(!Rn(Ln(e)))throw e;return h()}),n=!e.touchedFiles?.length&&!e.commandExecutions.length;!m&&n&&Rn(e.error?.message)&&(e=await h());let r=Bn(e.error?.message,t.model);return r?{...e,error:{...e.error,message:r}}:e}catch(e){let n=Bn(Ln(e),t.model);throw n?Error(n):e}}async function Ur(e){e.transport===`broker`&&await e.request(Se,{}).catch(()=>{})}const Wr=new Set([`Write`,`Edit`,`MultiEdit`,`NotebookEdit`]);function Gr(e){return typeof e==`string`?e:Array.isArray(e)?e.map(e=>typeof e?.text==`string`?e.text:``).join(``):e==null?``:JSON.stringify(e)}function Kr(e){if(!e)return 0;let t=e.split(/\r\n|\r|\n/);return t.at(-1)===``&&t.pop(),Math.max(1,t.length)}function qr(e,t,n=!1){if(!t)return[];let r;try{r=i.readFileSync(e,`utf8`)}catch{return[]}let a=[],o=0;for(;o<=r.length;){let e=r.indexOf(t,o);if(e<0)break;let i=Kr(r.slice(0,e))+1,s=Math.max(1,Kr(t));if(a.push(s===1?`L${i}`:`L${i}-L${i+s-1}`),!n)break;o=e+Math.max(t.length,1)}return a.length>4?[...a.slice(0,4),`+${a.length-4} matches`]:a}function Jr(e){let t=(typeof e==`string`?e:JSON.stringify(e)??String(e)).replace(/\s+/g,` `).trim();return t.length>80?`${t.slice(0,80)}…`:t}function Yr(t,n,r){let i=String(n.file_path??n.notebook_path??n.path??``),a=i?e.isAbsolute(i)?i:e.resolve(r,i):``,o=i?p(r,a)||i:`(unknown path)`,s=n.path?` in ${p(r,String(n.path))}`:``;if(t===`Write`){let e=Kr(String(n.content??``));return`Write ${o} ${e?`L1-L${e}`:`(empty file)`}`}if(t===`Edit`){let e=qr(a,String(n.old_string??``),n.replace_all===!0);return`Edit ${o}${e.length?` ${e.join(`, `)}`:``}`}if(t===`MultiEdit`){let e=Array.isArray(n.edits)?n.edits:[],t=e.flatMap(e=>qr(a,String(e?.old_string??``),e?.replace_all===!0));return`MultiEdit ${o}${t.length?` ${t.join(`, `)}`:``} (${e.length} edits)`}if(t===`NotebookEdit`){let e=n.cell_id??n.cell_number;return`NotebookEdit ${o}${e==null?``:` cell ${e}`}`}if(t===`Read`){let e=Number(n.offset??0),t=Number(n.limit??0);return`Read ${o}${e&&t?` L${e}-L${e+t-1}`:e?` from L${e}`:``}`}if(t===`Bash`)return`Bash ${String(n.command??``).trim()||`(no command)`}`;if(t===`Glob`)return`Glob ${String(n.pattern??``)}${s}`;if(t===`Grep`){let e=n.glob?` (${String(n.glob)})`:``;return`Grep ${String(n.pattern??``)}${s}${e}`}if(t===`Task`)return`Task ${n.subagent_type?`${String(n.subagent_type)}: `:``}${Jr(n.description??n.prompt??``)}`;if(t===`WebFetch`)return`WebFetch ${String(n.url??``)}`;if(t===`WebSearch`)return`WebSearch ${String(n.query??``)}`;if(t===`TodoWrite`){let e=Array.isArray(n.todos)?n.todos:[];return`TodoWrite ${e.length} item${e.length===1?``:`s`}`}let c=Object.entries(n??{}).map(([e,t])=>`${e}=${Jr(t)}`).join(` `);return c?`${t} ${c}`:t}function Xr(e){if(!e||typeof e!=`object`)return null;let t=e=>typeof e==`number`&&Number.isFinite(e)?e:0,n=t(e.input_tokens),r=t(e.cache_read_input_tokens)+t(e.cache_creation_input_tokens),i=t(e.output_tokens);return{input:n,cachedInput:r,output:i,total:n+r+i}}function Zr(){let e=s(`claude`,[`--version`],{encoding:`utf8`});return e.error||e.status!==0?{available:!1,detail:`claude CLI not found on PATH (npm install -g @anthropic-ai/claude-code)`}:{available:!0,detail:String(e.stdout||``).trim()}}function Qr(){if(t.env.CLAUDE_CODE_OAUTH_TOKEN)return{loggedIn:!0,detail:`CLAUDE_CODE_OAUTH_TOKEN configured`};if(t.env.ANTHROPIC_API_KEY)return{loggedIn:!0,detail:`ANTHROPIC_API_KEY configured`};let e=s(`claude`,[`auth`,`status`,`--json`],{encoding:`utf8`});if(e.error||e.status!==0)return{loggedIn:!1,detail:`not logged in`};try{let t=JSON.parse(String(e.stdout||``));return t.loggedIn?{loggedIn:!0,detail:[t.email,t.subscriptionType].filter(Boolean).join(`, `)||`logged in`}:{loggedIn:!1,detail:`not logged in`}}catch{return{loggedIn:!1,detail:`unknown`}}}function $r(e,n){let r=n.permissions??`auto`,i=n.mcpServers??[],a={};r===`auto`&&n.approvalTaskId&&(a.coder={type:`stdio`,command:t.execPath,args:[w,`mcp`,`serve`,n.approvalTaskId,`--cwd`,e]});for(let e of i)a[e.name]=e.url?{type:e.type??`http`,url:e.url,...e.headers?{headers:e.headers}:{}}:{type:`stdio`,command:e.command,args:e.args??[],...e.env?{env:e.env}:{}};return a}function ei(t,n,r,i){let a=[`-p`,`--input-format`,`stream-json`,`--output-format`,`stream-json`,`--verbose`,`--replay-user-messages`];a.push(n.resumeSessionId?`--resume`:`--session-id`,r),n.model&&a.push(`--model`,n.model),n.effort&&a.push(`--effort`,n.effort),n.outputSchema&&a.push(`--json-schema`,JSON.stringify(n.outputSchema));let o=n.permissions??`auto`,s=n.additionalDirectories??[],c=o===`read-only`?n.readOnlyAllowedTools??[]:[],l=n.mcpServers??[],u=$r(t,n),d=o===`auto`&&n.approvalTaskId,f=l.flatMap(e=>e.tools?.length?e.tools.map(t=>`mcp__${e.name}__${t}`):[`mcp__${e.name}`]),p=Object.keys(u).length?[`--mcp-config`,i??e.join(n.taskRoot??t,`.claude-mcp.json`)]:[];d?(a.push(`--permission-mode`,`default`,...p,`--permission-prompt-tool`,`mcp__coder__approval_prompt`),f.length&&a.push(`--allowedTools`,...f)):c.length?a.push(...jt,...p,`--allowedTools`,...c,...f):(a.push(...At[o]??At.auto,...p),f.length&&a.push(`--allowedTools`,...f));let m=n.writableDirectories??[];for(let e of[...s,...o===`read-only`?[]:m])a.push(`--add-dir`,e);let h=Ft(o,t,n.allowedNetworkHosts??[],s,m);return h&&a.push(`--settings`,h),a}function ti(e,t){return Object.assign(Error(e),{retryable:t})}function ni(e,t){let n=t&&Kn(t),r=n&&`${n.slice(0,14)}5${n.slice(15,19)}${(Number.parseInt(n[19],16)&3|8).toString(16)}${n.slice(20)}`;return{type:`user`,...r?{uuid:r}:{},message:{role:`user`,content:[{type:`text`,text:e}]}}}function ri(e){let t=!0;return{sendInitial(t,n){return new Promise((r,i)=>{e(`${JSON.stringify(ni(t,n))}\n`,e=>{e?i(e):r()})})},sendSteer(n,r){return t?new Promise((t,i)=>{e(`${JSON.stringify(ni(n,r))}\n`,e=>{if(!e){t();return}let n=e.code,r=n===`EPIPE`||n===`ERR_STREAM_DESTROYED`||n===`ERR_STREAM_WRITE_AFTER_END`;i(ti(`Failed to write Claude live steer: ${e.message}`,r))})}):Promise.reject(ti(`Claude turn is no longer accepting live input.`,!0))},stopAccepting(){t=!1}}}function ii(e,n){let r=`${e}.${t.pid}.${l()}.tmp`;i.writeFileSync(r,`${JSON.stringify(n)}\n`,`utf8`),i.renameSync(r,e)}async function ai(n){let r=i.mkdtempSync(e.join(u.tmpdir(),`coder-claude-steer-`)),a=`file:${r}`,o=new Set,s=new Set,c=!1,l=!1,d=(a=!1)=>{if(!(c&&!a||l)){l=!0;try{for(let a of i.readdirSync(r).filter(e=>e.endsWith(`.request.json`))){let c=a.slice(0,-13),l=e.join(r,a),u=e.join(r,`${c}.response.json`);if(i.existsSync(u)){i.unlinkSync(l);continue}if(s.has(c))continue;let d=`${l}.${t.pid}.processing`;try{i.renameSync(l,d)}catch{continue}s.add(c);let f=(async()=>{let e;try{let t=JSON.parse(i.readFileSync(d,`utf8`)),r=typeof t?.params?.text==`string`?t.params.text.trim():``;if(t?.method!==`turn/steer`||!r||t?.id!==c)e={id:c,error:{message:`Invalid Claude steer request.`,retryable:!1}};else try{await n(r,t.command),e={id:c,result:{accepted:!0}}}catch(t){let n=t;e={id:c,error:{message:n.message,retryable:n.retryable===!0}}}}catch(t){e={id:c,error:{message:`Invalid Claude steer JSON: ${t instanceof Error?t.message:String(t)}`,retryable:!1}}}try{ii(u,e)}finally{s.delete(c);try{i.unlinkSync(d)}catch{}}})();o.add(f),f.then(()=>o.delete(f),()=>o.delete(f))}}catch{}finally{l=!1}}},f=setInterval(d,10);return{endpoint:a,async close(){c=!0,clearInterval(f),d(!0),await Promise.allSettled([...o]),await new Promise(e=>setTimeout(e,50)),i.rmSync(r,{recursive:!0,force:!0})}}}async function oi(t,n,r=3e3,a){if(!t)return{steered:!1,retryable:!0,detail:`Claude live steer endpoint is not ready.`};let o=n.trim();if(!o)return{steered:!1,retryable:!1,detail:`empty follow-up`};if(!t.startsWith(`file:`)||t.length===5)return{steered:!1,retryable:!1,detail:`Unsupported Claude steer endpoint: ${t}`};let s=t.slice(5);if(!i.existsSync(s))return{steered:!1,retryable:!0,detail:`Claude live steer endpoint is no longer available.`};let c=Kn(a),l=e.join(s,`${c}.request.json`),u=e.join(s,`${c}.response.json`);try{i.existsSync(u)||ii(l,{id:c,method:`turn/steer`,params:{text:o},command:a})}catch(e){return{steered:!1,retryable:e.code===`ENOENT`,detail:e instanceof Error?e.message:String(e)}}let d=Date.now();for(;Date.now()-d<r;){try{let e=JSON.parse(i.readFileSync(u,`utf8`));try{(!a||e?.error?.retryable)&&i.unlinkSync(u)}catch{}return e?.result?.accepted===!0?{steered:!0,retryable:!1,detail:`Claude accepted the live follow-up.`}:{steered:!1,retryable:e?.error?.retryable===!0,detail:String(e?.error?.message??`Malformed Claude steer response.`)}}catch(e){if(e.code!==`ENOENT`)return{steered:!1,retryable:!1,detail:`Invalid Claude steer response: ${e instanceof Error?e.message:String(e)}`}}await new Promise(e=>setTimeout(e,10))}return{steered:!1,retryable:!1,detail:`Timed out waiting for Claude live steer acknowledgement.`}}async function si(n,r){let a=r.resumeSessionId??l(),s=$r(n,r),c=Object.keys(s).length?e.join(r.taskRoot??n,`.claude-mcp-${l()}.json`):void 0;c&&(i.mkdirSync(e.dirname(c),{recursive:!0}),i.writeFileSync(c,`${JSON.stringify({mcpServers:s})}\n`,{encoding:`utf8`,flag:`wx`,mode:384}));let u=ei(n,r,a,c),d=()=>{if(c)try{i.unlinkSync(c)}catch{}};return r.onProgress?.({kind:`status`,message:`claude turn started (session ${a})`,threadId:a}),new Promise((s,c)=>{let l=o(r.executable??`claude`,u,{cwd:n,stdio:[`pipe`,`pipe`,`pipe`],...r.env?{env:{...t.env,...r.env}}:{}}),f=``,p=``,m=[],h=null,g=a,_=null,v=!1,y=ri((e,t)=>l.stdin.write(e,t)),b=Date.now(),x=new Map,S=0,C=0,w=new Set,T=t=>{if(!(!t||typeof t!=`object`)){if(d(),r.onHeartbeat?.(),t.type===`system`&&t.subtype===`init`&&t.session_id)g=t.session_id;else if(t.type===`assistant`){let i=Xr(t.message?.usage);if(i){S+=i.output;let e=i.input+i.cachedInput+S;(!C||e-C>=1e3)&&(C=e,r.onProgress?.({kind:`usage`,tokens:{...i,output:S,total:e},threadId:g}))}for(let i of t.message?.content??[])if(i?.type===`tool_use`){let t=String(i.name??`Tool`);if(i.id&&x.set(String(i.id),{name:t,at:Date.now()}),Wr.has(t)){let t=String(i.input?.file_path??i.input?.notebook_path??``);t&&w.add(e.isAbsolute(t)?t:e.resolve(n,t))}r.onProgress?.({kind:`tool`,tool:t,message:Yr(t,i.input??{},n),threadId:g})}else i?.type===`text`&&typeof i.text==`string`&&i.text.trim()?r.onProgress?.({kind:`assistant`,message:i.text.trim(),threadId:g}):i?.type===`thinking`&&typeof i.thinking==`string`&&i.thinking.trim()&&r.onProgress?.({kind:`reasoning`,message:i.thinking.trim(),durationMs:Math.max(1e3,Date.now()-b),threadId:g})}else if(t.type===`user`){for(let e of t.message?.content??[])if(e?.type===`tool_result`){let t=Gr(e.content).trim(),n=e.is_error===!0;if(!t&&!n)continue;let i=e.tool_use_id?x.get(String(e.tool_use_id)):void 0;e.tool_use_id&&x.delete(String(e.tool_use_id)),r.onProgress?.({kind:`tool-result`,...i?{tool:i.name,durationMs:Date.now()-i.at}:{},...n?{isError:!0}:{},message:t||`(tool failed with no output)`,threadId:g})}}else t.type===`result`&&(h=t,r.onResult?.({status:+!!t.is_error,threadId:t.session_id??g,finalMessage:t.structured_output===void 0?String(t.result??``).trim():JSON.stringify(t.structured_output),error:t.is_error?{message:String(t.result??``)}:null}),t.session_id&&(g=t.session_id),y.stopAccepting(),l.stdin.end());b=Date.now()}};l.stdout.on(`data`,e=>{f+=e;let t;for(;(t=f.indexOf(`
|
|
11
|
-
`))>=0;){let e=f.slice(0,t).trim();if(f=f.slice(t+1),e)try{T(JSON.parse(e))}catch(e){m.push(`Invalid Claude stream-json output: ${e instanceof Error?e.message:String(e)}`)}}}),l.stderr.on(`data`,e=>{p+=e});let E=()=>{y.stopAccepting(),l.kill(`SIGTERM`),d();let e=_?.endpoint;e?.startsWith(`file:`)&&i.rmSync(e.slice(5),{recursive:!0,force:!0}),t.exit(143)};t.on(`SIGTERM`,E),(async()=>{r.onSteerReady&&(_=await ai((e,t)=>y.sendSteer(e,t))),await y.sendInitial(r.prompt,r.command),_&&r.onSteerReady?.(_.endpoint)})().catch(e=>{v||(v=!0,y.stopAccepting(),l.kill(`SIGTERM`),d(),t.removeListener(`SIGTERM`,E),_?.close(),c(e))}),l.on(`error`,e=>{v||(v=!0,y.stopAccepting(),t.removeListener(`SIGTERM`,E),d(),_?.close(),c(Error(`claude spawn failed: ${e.message}`)))}),l.on(`close`,async e=>{if(v)return;v=!0,y.stopAccepting(),t.removeListener(`SIGTERM`,E),d(),await _?.close();let n=f.trim();if(n)try{T(JSON.parse(n))}catch(e){m.push(`Invalid trailing Claude stream-json output: ${e instanceof Error?e.message:String(e)}`)}let i=h?.structured_output===void 0?(h?.result??``).trim():JSON.stringify(h.structured_output),a=e!==0||h?.is_error===!0||h==null||m.length>0;s({status:+!!a,threadId:h?.session_id??g,turnId:null,finalMessage:i,touchedFiles:[...w],tokens:Xr(h?.usage),model:h?.modelUsage&&Object.keys(h.modelUsage).join(`+`)||r.model||null,error:a?{message:m[0]||i||p.trim()||`claude exited ${e}`}:null})})})}const $=`@wular/coder`,ci=`https://registry.npmjs.org/${$}/latest`;function li(){return j(`update-check.json`)}function ui(e,t){let n=String(e).split(`.`).map(e=>parseInt(e,10)||0),r=String(t).split(`.`).map(e=>parseInt(e,10)||0);for(let e=0;e<3;e+=1){if((n[e]??0)>(r[e]??0))return 1;if((n[e]??0)<(r[e]??0))return-1}return 0}function di(){try{return JSON.parse(i.readFileSync(li(),`utf8`))}catch{return null}}function fi(e){try{i.mkdirSync(j(),{recursive:!0}),i.writeFileSync(li(),JSON.stringify(e))}catch{}}function pi(){try{i.rmSync(li(),{force:!0})}catch{}}function mi(e,n){if(t.env.CODER_NO_UPDATE_CHECK||t.env.CI)return;let r=di();if(!r?.checkedAt||Date.now()-r.checkedAt>864e5)try{o(t.execPath,[n,`upgrade`,`refresh`],{detached:!0,stdio:`ignore`}).unref()}catch{}return r?.latest&&ui(r.latest,e)>0?r.latest:void 0}async function hi(e){let t=di()?.latest??null;try{let e=new AbortController,n=setTimeout(()=>e.abort(),3e3),r=await fetch(ci,{signal:e.signal,headers:{accept:`application/json`}});if(clearTimeout(n),r.ok){let e=await r.json();e?.version&&(t=e.version)}}catch{}fi({checkedAt:Date.now(),latest:t,current:e})}function gi(e){let t=e;try{t=i.realpathSync(e)}catch{}let n=t.replace(/\\/g,`/`);return/\/\.bun\//.test(n)?{pm:`bun`,command:[`bun`,`add`,`-g`,`${$}@latest`]}:/\/\.pnpm\//.test(n)||/\/pnpm(-global)?\//i.test(n)||/\/Library\/pnpm\//.test(n)?{pm:`pnpm`,command:[`pnpm`,`add`,`-g`,`${$}@latest`]}:/\/\.config\/yarn\/global\//.test(n)||/\/yarn\/global\//.test(n)||/\/Yarn\/Data\/global\//.test(n)?{pm:`yarn`,command:[`yarn`,`global`,`add`,`${$}@latest`]}:{pm:`npm`,command:[`npm`,`install`,`-g`,`${$}@latest`]}}function _i(e){s(`claude`,[`plugin`,`marketplace`,`remove`,`coder-plugins`],{encoding:`utf8`});let t=s(`claude`,[`plugin`,`marketplace`,`add`,e],{encoding:`utf8`}),n=s(`claude`,[`plugin`,`install`,`coder@coder-plugins`],{encoding:`utf8`}),r=t.status===0&&n.status===0;return{marketplace:e,installed:r,note:r?`Plugin installed; restart any running Claude Code session to load it.`:`Automatic install failed (${(n.stderr||t.stderr||`claude not found`).trim()}); run: claude plugin marketplace add "${e}" && claude plugin install coder@coder-plugins`}}function vi(){return e.join(u.homedir(),`.agents`,`skills`,`coder`)}function yi(){try{let t=i.readFileSync(e.join(vi(),`SKILL.md`),`utf8`);return/^\s*version:\s*(\S+)/m.exec(t)?.[1]??null}catch{return null}}function bi(t){let n=vi();try{let r=e.join(t,`plugins`,`agents`,`skills`,`coder`);i.rmSync(n,{recursive:!0,force:!0}),i.mkdirSync(n,{recursive:!0}),i.cpSync(r,n,{recursive:!0});let a=e.join(n,`SKILL.md`),o=i.readFileSync(a,`utf8`).replace(`
|
|
12
|
-
---
|
|
13
|
-
`,`\nmetadata:\n version: ${T()}\n---\n`);return i.writeFileSync(a,o),{marketplace:n,installed:!0,note:`Skill installed to ~/.agents/skills/coder; restart running sessions to load it.`}}catch(e){return{marketplace:n,installed:!1,note:`Skill install failed: ${e instanceof Error?e.message:String(e)}`}}}function xi(e){if(e.available)return null;let t=s(`npm`,[`install`,`-g`,`@openai/codex@latest`],{encoding:`utf8`});return t.status===0?{installed:!0,note:`codex CLI installed (runs your custom models; no login needed for them)`}:{installed:!1,note:`custom models run on the codex CLI and it is not installed; auto-install failed: ${(t.stderr||`npm not found`).trim()}. Run: npm install -g @openai/codex`}}const Si={codex:{"gpt-6-astra":`0.154.0`,"gpt-6-sol":`0.156.1`,"gpt-6-luna":`0.156.1`,"gpt-6.1-sol":`0.159.1`},claude:{sonnet:`2.1.197`,fable:`2.1.257`,opus:`2.1.280`}};function Ci(e){let t=/(\d+\.\d+\.\d+)/.exec(String(e??``));return t?t[1]:null}function wi(e,t,n){let r=t?Si[e][t]:void 0,i=Ci(n.detail);return!r||!i||ui(i,r)>=0?null:`${e} ${i} predates ${t} (needs ${r}), so it may fail or run another model. Run: ${e} update`}function Ti(e){if(!e.available)return null;let t=Ci(e.detail);if(!t||ui(t,`0.159.1`)>=0)return null;let n=s(`codex`,[`update`],{encoding:`utf8`});return n.status!==0&&(n=s(`npm`,[`install`,`-g`,`@openai/codex@latest`],{encoding:`utf8`})),n.status===0?{updated:!0,from:t}:{updated:!1,from:t,note:`codex ${t} is too old for the default codex model (needs >= 0.159.1); auto-update failed: ${(n.stderr||`codex/npm not found`).trim()}. Run: codex update`}}async function Ei(e,t={},r){let a=t.hosts??[],o=a.find(e=>![`claude`,`codex`,`agents`].includes(e));if(o)throw new V(`invalid-option`,`Unknown host "${o}". Use claude, codex, or agents.`,{hint:`Codex, Pi, OpenCode, and other Agent Skills hosts: coder setup-host agents`});let s=e=>t[e]||a.includes(e);r?.();let c=Q(e),l=Ti(c);l?.updated&&(c=Q(e));let u=c.available?await zr(e):{loggedIn:!1,detail:c.detail},d=Zr(),f=d.available?Qr():{loggedIn:!1,detail:d.detail},p=K();if(!i.existsSync(p)){let e=c.available?[`codex`,`claude`]:d.available?[`claude`,`codex`]:[`codex`,`claude`];Sn({...Et,chain:e})}let m=ee(),h=s(`claude`)?_i(m):null,g=s(`agents`)||s(`codex`)?bi(m):null,_=J(e),v=c.available&&u.loggedIn||d.available&&f.loggedIn;return{codex:{available:c.available,detail:c.detail,auth:u.detail,loggedIn:u.loggedIn},...l?{codexUpdate:l}:{},claude:{available:d.available,detail:d.detail,auth:f.detail,loggedIn:f.loggedIn},configFile:p,runtime:n(new URL(`../bin/coder.mjs`,import.meta.url)),...h?{claudePlugin:h}:{},...g?{agentsSkill:g}:{},config:_,ready:v}}async function Di(t={},n){let r=!t.pluginsOnly,a=!t.cliOnly,o=ee(),c=e.join(o,`plugins/claude/.claude-plugin/plugin.json`),l={cli:T(),claude:E(c)},u={};if(r){let e=gi(w),[r,...i]=t.pm===`npm`?[`npm`,`install`,`-g`,`@wular/coder@latest`]:t.pm===`pnpm`?[`pnpm`,`add`,`-g`,`@wular/coder@latest`]:t.pm===`yarn`?[`yarn`,`global`,`add`,`@wular/coder@latest`]:t.pm===`bun`?[`bun`,`add`,`-g`,`@wular/coder@latest`]:e.command,a=t.pm??e.pm;n?.(`via ${a}`);let o=s(r,i,{encoding:`utf8`});if(o.error?.code===`ENOENT`)throw new V(`invalid-option`,`${a} not found on PATH. Re-run with --pm <npm|pnpm|yarn|bun>, or update manually: ${r} ${i.join(` `)}`);if(o.status!==0){let e=(o.stderr||o.stdout||``).trim();throw new V(`invalid-option`,`CLI update failed (${a}).${e?`\n${e}`:``}\nRun manually: ${r} ${i.join(` `)}`)}pi();let c=T();u.cli={pm:a,from:l.cli,to:c,changed:c!==l.cli}}if(a){if(t.claude||!t.codex&&Zr().available){let e=_i(o);u.claudePlugin={installed:e.installed,note:e.note,from:l.claude,to:E(c)}}if(i.existsSync(vi())){let e=yi(),t=bi(o);u.agentsSkill={installed:t.installed,note:t.note,from:e,to:yi()}}}return u}const Oi=new Set(`commit.checkout.switch.restore.stash.reset.rebase.merge.push.pull.cherry-pick.revert.clean.am.apply.tag.branch.worktree.filter-branch.filter-repo.gc.prune.reflog.remote.submodule.config`.split(`.`)),ki=[/\bsudo\b/,/\brm\s+(-[a-zA-Z]*r[a-zA-Z]*f|-[a-zA-Z]*f[a-zA-Z]*r)\b.*\s(\/\*?|~\/?|\$HOME\/?)(\s|$)/,/\b(shutdown|reboot|halt|poweroff)\b/,/\bmkfs\b|\bdiskutil\s+erase/i,/\b(chmod|chown)\b.*-R.*\s\/(\s|$)/,/\bkill(all)?\s+-9\s+1\b/,/curl[^|;&]*\|\s*(ba|z|da)?sh\b/,/wget[^|;&]*\|\s*(ba|z|da)?sh\b/,/\blaunchctl\b|\bsystemctl\b/,/\bdefaults\s+write\b/,/>\s*\/dev\/(sd|disk)/],Ai=new Set([`status`,`log`,`diff`,`show`,`blame`,`rev-parse`,`ls-files`,`ls-tree`,`cat-file`,`describe`,`shortlog`,`grep`,`branch`,`stash`]);function ji(e){return e.match(/^\s*(?:ba|z|da)?sh\s+(?:-[a-zA-Z]+\s+)*(?:-c\s+)?(["'])([\s\S]*)\1\s*$/)?.[2]??e}function Mi(e){return e.trim().split(/\s+/).filter(Boolean)}function Ni(e){let t=e.find((e,t)=>t>0&&!e.startsWith(`-`));if(!t)return{decision:`accept`,reason:`bare git`};if(t===`branch`&&e.some(e=>/^-(d|D|m|M|c|C|f|u)|^--(delete|move|copy|force|set-upstream)/.test(e)))return{decision:`decline`,reason:`git branch write operation (git is read-only for Coder)`};if(t===`stash`){let t=e.find((e,t)=>t>1&&!e.startsWith(`-`));return t===`list`||t===`show`?{decision:`accept`,reason:`git stash ${t} is read-only`}:{decision:`decline`,reason:`git stash write operation (git is read-only for Coder)`}}return Ai.has(t)?{decision:`accept`,reason:`git ${t} is read-only`}:Oi.has(t)?{decision:`decline`,reason:`git ${t} is a write operation (git is read-only for Coder)`}:{decision:`escalate`,reason:`unrecognized git subcommand: ${t}`}}function Pi(t,n={}){let r=ji(String(t??``));if(!r.trim())return{decision:`escalate`,reason:`empty command`};for(let e of ki)if(e.test(r))return{decision:`decline`,reason:`matches hard-deny pattern ${e}`};if(/\$\(|`|<\(/.test(r))return{decision:`escalate`,reason:`contains command substitution`};let i=r.split(/&&|\|\||;|\||\r?\n/).map(e=>e.trim()).filter(Boolean);if(i.length>1){let e={decision:`accept`,reason:`all segments safe`};for(let t of i){let r=Pi(t,n);if(r.decision===`decline`)return r;r.decision===`escalate`&&(e=r)}return e}let a=Mi(r),o=e.basename(a[0]??``);if(o===`git`)return Ni(a);let s=n.networkHost;return s?(n.allowedNetworkHosts??[]).some(e=>s===e||s.endsWith(`.${e}`))?{decision:`accept`,reason:`network host ${s} is allowlisted`}:{decision:`escalate`,reason:`network access to ${s}`}:{decision:`escalate`,reason:`command needs approval: ${o||`(unknown)`}`}}function Fi(t,n){if(!t.length)return{decision:`escalate`,reason:`file change with no resolvable paths`};for(let r of t){let t=e.resolve(n,r),i=e.relative(n,t);if(i.startsWith(`..`)||e.isAbsolute(i))return{decision:`escalate`,reason:`path outside workspace: ${r}`};if(i===`.git`||i.startsWith(`.git${e.sep}`))return{decision:`decline`,reason:`direct .git modification: ${r}`}}return{decision:`accept`,reason:`all paths inside workspace`}}function Ii(t){return e.join(t,`approvals`)}function Li(t){let n=Ii(t);return i.existsSync(n)?i.readdirSync(n).filter(e=>e.endsWith(`.request.json`)).flatMap(t=>{let r=t.replace(/\.request\.json$/,``),i=m(e.join(n,t));if(!i)return[];let a=m(e.join(n,`${r}.response.json`));return[{...i,id:r,response:a}]}).sort((e,t)=>String(e.createdAt??``).localeCompare(String(t.createdAt??``))):[]}function Ri(t,n,r){let a=Ii(t),o=e.join(a,`${n}.request.json`);if(!i.existsSync(o))throw Error(`No pending approval "${n}" for this task.`);i.writeFileSync(e.join(a,`${n}.response.json`),`${JSON.stringify({decision:r,answeredAt:new Date().toISOString()},null,2)}\n`,`utf8`)}async function zi(t,n,{timeoutMs:r,onEvent:a}){let o=Ii(t);i.mkdirSync(o,{recursive:!0});let s=`apr-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`;i.writeFileSync(e.join(o,`${s}.request.json`),`${JSON.stringify({...n,createdAt:new Date().toISOString()},null,2)}\n`,`utf8`),a?.({kind:`approval-escalated`,approvalId:s,summary:n.summary,message:`Approval needed (${s}): ${n.summary}. Answer with: coder task approve ${e.basename(t)} ${s} [--deny]`});let c=e.join(o,`${s}.response.json`),l=Date.now()+r;for(;Date.now()<l;){if(i.existsSync(c))try{let e=JSON.parse(i.readFileSync(c,`utf8`)).decision===`accept`?`accept`:`decline`;return a?.({kind:`approval-answered`,approvalId:s,decision:e}),e}catch{}await new Promise(e=>setTimeout(e,400))}return a?.({kind:`approval-timeout`,approvalId:s,message:`Approval ${s} timed out; declining.`}),`decline`}function Bi(e,t={}){return zi(e,{method:`simulate`,summary:`simulated approval probe (--simulate-approval)`},{timeoutMs:t.timeoutMs??12e4,onEvent:t.onEvent??null})}function Vi({workspaceRoot:e,taskDir:t,mode:n=`auto`,escalationTimeoutMs:r=12e4,allowedNetworkHosts:i=[],onEvent:a=null}){return async(o,s,c)=>{if(o===`item/commandExecution/requestApproval`){let l=c?.itemIndex?.get(s.itemId??``),u=s.command??l?.command??``,d=s.cwd??l?.cwd??e,f=`Run command. ${u||`Unknown command`}${s.reason?`. ${s.reason}`:``}`;if(n===`deny`)return a?.({kind:`approval-decision`,method:o,decision:`decline`,reason:`deny mode`,summary:f}),{decision:`decline`};let p=Pi(u,{networkHost:s.networkApprovalContext?.host??null,allowedNetworkHosts:i});return a?.({kind:`approval-decision`,method:o,decision:p.decision,reason:p.reason,summary:f}),p.decision===`escalate`?{decision:await zi(t,{method:o,summary:f,command:u,cwd:d,params:s},{timeoutMs:r,onEvent:a})}:{decision:p.decision}}if(o===`item/fileChange/requestApproval`){let i=(c?.itemIndex?.get(s.itemId??``)?.changes??[]).map(e=>e.path).filter(e=>!!e),l=`Apply file changes. ${i.join(`, `)||`Unknown paths`}${s.reason?`. ${s.reason}`:``}`;if(n===`deny`)return a?.({kind:`approval-decision`,method:o,decision:`decline`,reason:`deny mode`,summary:l}),{decision:`decline`};let u=Fi(i,e);return a?.({kind:`approval-decision`,method:o,decision:u.decision,reason:u.reason,summary:l}),u.decision===`escalate`?{decision:await zi(t,{method:o,summary:l,paths:i,params:s},{timeoutMs:r,onEvent:a})}:{decision:u.decision}}throw a?.({kind:`approval-unsupported`,method:o}),Error(`Coder does not handle server request ${o}; treating as denied.`)}}const Hi=/usage|quota|rate.?limit|429|401|unauthorized|not authenticated|login|insufficient|exhausted|not available|ENOENT/i;function Ui(e){return Hi.test(e)&&!zn(e)}var Wi=class extends Error{engine;detail;constructor(e,t){super(t),this.engine=e,this.detail=t}};function Gi(e,t){let n=e.engine,r=!!n,i=e.model,a=e.effort,o=e=>{let n=e?t.models?.[e]:void 0;return n&&en(n)?n:void 0},s=e=>{let n=e?t.models?.[e]:void 0;return n&&W(n)?n:void 0};if(o(i)){let e;try{e=xn(i,t)}catch(e){throw new V(`invalid-option`,e instanceof Error?e.message:String(e))}e&&(r||(n=e.engine),i=e.model??void 0,a=a??e.effort??void 0)}if(!n&&i&&(i in U?n=`claude`:i in H?n=`codex`:s(i)?n=`custom`:/^(?:claude-|opus|sonnet|haiku|fable)/i.test(i)&&(n=`claude`)),n=n??t.chain[0]??`codex`,n!==`codex`&&n!==`claude`&&n!==`custom`){let e=n in H||n in U||n in(t.models??{})?` "${n}" is a model; use --model ${n}.`:``;throw new V(`invalid-option`,`Invalid --engine "${n}". Use codex, claude, or custom.${e}`)}let c=t.engines[n]??{},l=i??c.model??null,u=a??c.effort??null;if(o(l)){let e;try{e=xn(l,t)}catch(e){throw new V(`invalid-option`,e instanceof Error?e.message:String(e))}e&&(r||(n=e.engine),l=e.model,u=a??e.effort??u)}let d=e.permissions??c.permissions??`auto`;try{bn(t,l)}catch(e){throw new V(`invalid-option`,e instanceof Error?e.message:String(e))}if(n===`custom`){let e=Object.entries(t.models??{}).filter(([,e])=>W(e)).map(([e])=>e);if(!l&&e.length===1&&(l=e[0]),!l||!s(l))throw new V(`invalid-option`,l?`No custom model named "${l}". Configured: ${e.join(`, `)||`none`}.`:`No custom model to run: pass --model <name> or set engines.custom.model.`,{hint:`Add one: coder model add <name> --base-url <url> --model <id>`})}let f=n===`claude`;if(!(d in kt))throw new V(`invalid-option`,`Invalid --permissions "${d}". Use one of: ${Object.keys(kt).join(`, `)}`);if(!f&&u&&!Dt.has(u))throw new V(`invalid-option`,`Invalid codex --effort "${u}". Use one of: ${[...Dt].join(`, `)}`);if(f&&u&&!Ot.has(u))throw new V(`invalid-option`,`Invalid claude --effort "${u}". Use one of: ${[...Ot].join(`, `)}`);return{engine:n,model:l,effort:u,permissions:d}}const Ki=r.strictObject({name:r.string().check(r.minLength(1)),command:r.optional(r.string().check(r.minLength(1))),args:r.optional(r.array(r.string())),env:r.optional(r.record(r.string(),r.string())),url:r.optional(r.string().check(r.minLength(1))),type:r.optional(r.enum([`stdio`,`http`,`sse`])),headers:r.optional(r.record(r.string(),r.string())),tools:r.optional(r.array(r.string()))}).check(r.refine(e=>!!e.command!=!!e.url,`one of command or url`)),qi=r.array(Ki);function Ji(e,t={}){let n=e.trim();if(!/^[\[{]/.test(n)){let e=n===`all`?Object.keys(t):n.split(`,`).map(e=>e.trim()).filter(Boolean);if(n===`all`&&!e.length)throw new V(`invalid-option`,"No MCP servers configured under `mcp` in .coder/config.json.");return e.map(e=>{let n=t[e];if(!n)throw new V(`invalid-option`,`Unknown MCP server "${e}".`,{hint:`configured: ${Object.keys(t).join(`, `)||`none`}; or pass a JSON array`});return{name:e,...n}})}return Yi(n)}function Yi(e){let t;try{t=JSON.parse(e)}catch(e){throw new V(`invalid-option`,`Invalid --mcp JSON: ${e instanceof Error?e.message:String(e)}`)}let n=qi.safeParse(t);if(!n.success)throw new V(`invalid-option`,`Invalid --mcp value: ${r.prettifyError(n.error)}`,{hint:`--mcp '[{"name":"docs","command":"npx","args":["-y","docs-mcp"],"tools":["search"]}]'`});return n.data}function Xi(e,n=t.env){let r=e=>e.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\}/g,(e,t,r)=>n[t]??r??``),i=e=>Object.fromEntries(Object.entries(e).map(([e,t])=>[e,r(t)]));return(e??[]).map(e=>({...e,...e.command?{command:r(e.command)}:{},...e.args?{args:e.args.map(r)}:{},...e.url?{url:r(e.url)}:{},...e.env?{env:i(e.env)}:{},...e.headers?{headers:i(e.headers)}:{}}))}function Zi(t,n=[]){let r=[...new Set(n.map(n=>e.resolve(t,n)))];for(let e of r)if(!i.statSync(e,{throwIfNoEntry:!1})?.isDirectory())throw new V(`invalid-option`,`--add-dir ${e} is not a directory.`);return r}function Qi(e,t){return e===`read-only`&&Mt.test(t??``)}const $i=[`read-only`,`workspace-write`,`auto`];function ea(e,t,n){if(!t)return n.permissions;if($i.indexOf(t)>$i.indexOf(n.permissions))throw new V(`invalid-option`,`task "${e??`task`}" asks for ${t} but agent "${n.agent}" is ${n.permissions}: lower the task's permissions or raise the agent's`);return t}function ta(e){if(!e.resume)return e;let t=pt(e.cwd,e.resume);return t?{...e,cwd:e.cwdExplicit===!1?t.cwd??e.cwd:e.cwd,engine:e.engine??t.engine,model:e.model??t.model??void 0,effort:e.effort??t.effort??void 0,permissions:e.permissions??t.permissions??void 0,outputSchema:e.outputSchema??t.outputSchema}:e}function na(n,r){let a=I(n,r),s=i.openSync(e.join(a,`worker.log`),`a`),c=o(t.execPath,[w,`task`,`worker`,r,`--cwd`,n],{cwd:n,detached:!0,stdio:[`ignore`,s,s],env:{...t.env,CODER_WORKER:`1`}});c.unref(),i.closeSync(s),L(n,r,{pid:c.pid??null})}async function ra(t,n,r,i,a){let o=r.cwd,s=n.engine===`claude`?Zr():Q(o),c=n.model?t.models?.[n.model]:void 0;if(!s.available&&c&&W(c)){let e=xi(s);r.onNote?.(e.note),s=Q(o)}if(!s.available)throw new Wi(n.engine,s.detail);let u=c?null:n.engine===`claude`?wi(`claude`,n.model,s):wi(`codex`,_n(n.model),s);u&&r.onNote?.(u);let d=null,f=r.addDirs??[];if(i.resume){let e=pt(o,i.resume);d=e?.threadId??i.resume,f=[...new Set([...e?.addDirs??[],...f])]}let p=r.taskId??tt(),h=L(o,p,{status:`queued`,...r.taskId?{dispatchId:l()}:{},kind:`task`,name:i.name??null,system:r.system??null,engine:n.engine,prompt:r.prompt,...r.outputSchema?{outputSchema:r.outputSchema}:{},model:n.model,effort:n.effort,permissions:n.permissions,resumeThreadId:d,cwd:o,background:!r.wait,...i.simulateApproval?{simulateApproval:!0}:{},...r.flowRunId?{flowRunId:r.flowRunId}:{},...r.agentId?{agentId:r.agentId}:{},...r.source?{source:r.source}:{},...r.author?{author:r.author}:{},...r.repo?{repo:r.repo}:{},...r.mcp?.length?{mcp:r.mcp}:{},...f.length?{addDirs:f}:{}});if(na(o,p),!a)return{taskId:p,task:R(o,p)??h,engine:n.engine,startupCheck:`pending`};let g=2**53-1,_=new Set([`status`,`usage`]),v=()=>B(o,p,g).filter(e=>{let{phase:t,kind:n}=e;return t!==`starting`&&!_.has(String(n??``))}).length,y=Date.now()+15e3,b=h,x=null,S=null;for(;Date.now()<(S??y)&&(b=R(o,p)??b,b.status!==`failed`&&b.status!==`completed`);){if(b.threadId&&x===null&&(x=v(),S=Date.now()+5e3),x!==null&&v()>x){b=R(o,p)??b;break}await new Promise(e=>setTimeout(e,150))}if(b.status===`failed`){let t=m(e.join(I(o,p),`result.json`))?.error?.message??``,r=B(o,p,5).map(e=>e.message??``).join(`
|
|
14
|
-
`),i=t||r;throw Qi(n.permissions,i)?new V(`read-only-unavailable`,i):Ui(i)?new Wi(n.engine,i):new V(`startup-failed`,i,{taskId:p})}return{taskId:p,task:b,engine:n.engine,startupCheck:b.threadId?`passed`:`pending`}}function ia(e,t,n,r,i){return{error:`${e} failed to start: ${t}`,fallback:{action:`run-native-subagent`,reason:`no-engine-available`,permissions:n,instructions:`Mention the engine failure to the user, including any limit reset time. If your harness has a native subagent facility, spawn one subagent with fallback.task verbatim, prefixed with: "NEVER run git write operations (commit, checkout, stash, reset, push, etc.); leave changes uncommitted." If fallback.permissions is "read-only", append: "Investigate and report without modifying anything." If it is "workspace-write", append: "Never touch anything outside the workspace." Relay its output when it completes. If your harness has no native subagent facility, report the failure and stop; do not implement the task yourself.`,note:`Every coder engine failed to start. Spawn your own native subagent and forward the task verbatim; tell it to never run git write operations (commit, checkout, stash, reset, push, ...) and to honor the permissions.`,...r?{system:r}:{},task:i}}}async function aa(e,n={}){if(t.env.CODER_WORKER&&!n.fromMailbox)throw new V(`nested-dispatch`,`Nested dispatch is disabled inside a worker; do the work directly.`);if(e.outputSchema!==void 0&&(!e.outputSchema||typeof e.outputSchema!=`object`||Array.isArray(e.outputSchema)))throw new V(`invalid-option`,`outputSchema must be an object.`);if(!e.prompt.trim())throw new V(`invalid-option`,`Missing task text.`,{hint:[`Usage: coder run "<task text>"`,`Help: coder task run --help`]});e=ta(e),e={...e,addDirs:Zi(e.cwd,e.addDirs)};let r=J(e.cwd),i={engine:e.engine,model:e.model,effort:e.effort,permissions:e.permissions},a={name:e.name,resume:e.resume,simulateApproval:e.simulateApproval};for(;;){let t=Gi(i,r);try{return await ra(r,t,e,a,n.waitForStartup!==!1)}catch(n){if(!(n instanceof Wi))throw n;let o=r.chain[r.chain.indexOf(n.engine)+1];if(!o){let r=ia(n.engine,n.detail,t.permissions,e.system,e.prompt);throw new V(`chain-exhausted`,r.error,{payload:r})}e.onFallback?.({engine:n.engine,detail:n.detail,next:o}),i={engine:o,permissions:e.permissions},a={name:void 0,resume:void 0,simulateApproval:void 0}}}}function oa(e,t){if(t.status!==`failed`)return;let n=t.result;if(!n||!Ui(n.error?.message??``)||!(!n.touchedFiles?.length&&!n.fileChanges?.length&&!n.commandExecutions?.length))return;let r=J(e).chain;return r[r.indexOf(t.task.engine)+1]}function sa(t,n){return m(e.join(I(t,n),`result.json`))}function ca(e,t,n=0){if(n===0)return[];let r=B(e,t,2**53-1);return n===`all`?r:St(r,n)}function la(e,t,n={}){let r=R(e,t);if(!r)throw Error(`No task found for "${t}".`);return{taskId:t,status:r.status,result:Re.includes(r.status)?null:sa(e,t),steps:ca(e,t,n.tail),turns:xt(e,t),task:r}}async function ua(e,t,n={}){let r=R(e,t);if(!r)throw Error(`No task found for "${t}".`);let i=await da(e,r);if(i.reason===`approval`){let e=i.approval;throw new V(`approval-pending`,`Approval needed for task ${t}: ${e.summary}`,{taskId:t,approval:e})}n.onSettle?.();let a=i.task;return{taskId:t,status:a.status,result:sa(e,t),steps:ca(e,t,n.tail),turns:xt(e,t),task:a}}async function da(e,t,n=400){let r=t;for(;;){if(Le.includes(r.status))return{task:r,reason:`terminal`};let t=Li(I(e,r.id)).filter(e=>!e.response);if(t[0]){let e=t[0].params;return{task:r,reason:`approval`,approval:{id:t[0].id,summary:String(t[0].summary??``),cwd:typeof t[0].cwd==`string`?t[0].cwd:null,networkHost:e?.networkApprovalContext?.host??null}}}await new Promise(e=>setTimeout(e,n)),r=z(e,R(e,r.id)??r)}}export{en as $,Ge as $t,Q as A,A as At,Zn as B,Ze as Bt,xi as C,v as Cn,Tt as Ct,hi as D,p as Dn,Ve as Dt,mi as E,m as En,Qe as Et,Wn as F,Be as Ft,jt as G,rt as Gt,Ln as H,B as Ht,Qn as I,ht as It,kt as J,We as Jt,Dt as K,F as Kt,Xn as L,ft as Lt,Hr as M,pt as Mt,Vr as N,Ct as Nt,si as O,h as On,yt as Ot,rr as P,tt as Pt,hn as Q,I as Qt,Jn as R,dt as Rt,Bi as S,x as Sn,Xe as St,Di as T,_ as Tn,bt as Tt,Ot as U,xt as Ut,Un as V,at as Vt,U as W,z as Wt,Tn as X,qe as Xt,un as Y,Ue as Yt,En as Z,N as Zt,Vi as _,D as _n,G as _t,Ui as a,et as an,Zt as at,zi as b,T as bn,Sn as bt,la as c,Re as cn,fn as ct,na as d,xe as dn,an as dt,Ke as en,vn as et,oa as f,ye as fn,_n as ft,Ri as g,ve as gn,q as gt,ta as h,k as hn,K as ht,Qi as i,mt as in,Mn as it,Br as j,vt as jt,oi as k,j as kt,Xi as l,Le as ln,xn as lt,ua as m,Se as mn,gn as mt,ea as n,St as nn,J as nt,Ji as o,gt as on,Nn as ot,da as p,be as pn,tn as pt,H as q,He as qt,aa as r,ct as rn,jn as rt,sa as s,L as sn,Pn as st,ia as t,M as tn,W as tt,Gi as u,Ie as un,pn as ut,Pi as v,w as vn,sn as vt,Ei as w,g as wn,wt,Li as x,ee as xn,V as xt,Fi as y,C as yn,Dn as yt,Kn as z,R as zt};
|
package/dist/exec-RZFLclKX.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{B as t,I as n,f as r,l as i,m as a,n as o,nt as s,o as c,r as l,u,xt as d}from"./dispatch-BKeAch9E.js";import{a as f,f as p,o as m}from"./load-BpEsAn51.js";import{t as h}from"./integrations-BAgdVDhj.js";import{a as g}from"./discover-Dvr_3_Xr.js";import{n as _}from"./executor-BvAA7Cgw.js";import{REVIEW_PLATFORM as v,postReview as y,resolveReviewTarget as b}from"./flow/builtin/review.js";import{a as x,i as S,n as C,r as w}from"./mcp-BgKb2Cdk.js";import T from"node:path";import E from"node:process";import{readFileSync as D,readdirSync as O,realpathSync as k}from"node:fs";import A from"node:os";import j from"node:fs/promises";var M=e({AGENT_TASK_PREFIX:()=>N,agentInstructions:()=>G,agentSystemPrompt:()=>W,agentTaskOptions:()=>H,builtinArgs:()=>V,builtinTaskArgs:()=>z,defaultTask:()=>X,execAgent:()=>L,postReply:()=>F,renderContext:()=>J,startAgentMailbox:()=>Z,taskFromEvent:()=>P,waitForAgentTask:()=>R});const N=`agent:`;function P(e,t,n){let r=h[n.integration];return{id:`local-${n.deliveryId}-${e.id}`,source:n.integration,agent:e.id,flow:t,runner:`local`,event:n,definition:e.definition,...e.usage?{usage:e.usage}:{},tools:r?{[n.integration]:p(e,n.integration,r)}:{}}}async function F(e,t,n,r,i=e.id){if(!t.chat)throw Error(`The ${t.integration} event has no thread to reply in`);let[{Chat:a},{LocalChatState:o}]=await Promise.all([import(`chat`),import(`./chat-3Znsevah.js`).then(e=>e.r)]),s=await e.adapter({fetch,appId:t.appId.slice(e.id.length+1),name:i,installationId:t.installationId,token:async()=>r}),c=new a({userName:i,adapters:{[e.id]:s},state:new o,logger:`error`});await c.initialize();let l=c.thread(t.chat.thread.id);s.reply&&t.chat.message?.id?await l.reply(t.chat.message.id,n):await l.post(n)}function I(e,t){return Object.fromEntries(Object.keys(e.tools).map(n=>[n,t[S(n)]??(n===e.event?.integration?t.APP_TOKEN:void 0)]))}async function L(e){let{cwd:t,flow:n}=e,r=s(t),i=await f(t,h),a=e.task;!a&&e.taskFile&&(a={...JSON.parse(await j.readFile(T.resolve(t,e.taskFile),`utf8`)),flow:n});let o=i.find(t=>t.id===e.agent);if(!o&&a&&(o={id:a.agent,name:a.definition.name??a.agent,definition:a.definition,...a.usage?{usage:a.usage}:{},...a.files?{files:a.files}:{},builtin:!1}),!o)throw Error(`No agent named "${e.agent}".`);a??=await B(t,o,n,e);let d=a.event,p=d&&h[d.integration];if(d&&!p)throw Error(`Unknown integration "${d.integration}".`);if(n==="default"){let i=X(o,a),s=e.noteFile?void 0:await j.mkdtemp(T.join(A.tmpdir(),`coder-note-`)),f=e.noteFile??T.join(s,`note`);e.noteFile||await j.writeFile(f,a.context?.note??``);let h=u(m(o),r),g=[...w(a,e.toolEnvironment?.tokens??I(a,E.env)),C(f),...a.mcp?.length?c(a.mcp.join(`,`),r.mcp):[]],_=e.resumeTaskId?{taskId:e.resumeTaskId}:await l({taskId:e.taskId,mcp:g,cwd:t,agentId:a.agent,...a.author?{author:a.author}:{},...d?.repo?{repo:`${d.repo.owner}/${d.repo.name}`}:{},...e.source?{source:e.source}:{name:`${N}${a.id}`},engine:h.engine,model:h.model??void 0,effort:h.effort??void 0,permissions:a.permissions??h.permissions,system:i.system,prompt:i.prompt,outputSchema:a.context?.outputSchema,wait:!0});await e.onTask?.(_.taskId);let v=await R(t,_.taskId,e.onApproval),y=(v.result?.finalMessage??v.result?.error?.message??``).trim(),b=(await j.readFile(f,`utf8`).catch(()=>``)).trim();s&&await j.rm(s,{recursive:!0,force:!0});let x=e.post!==!1&&!!p;return x&&await F(p,d,y,e.postToken??E.env.APP_TOKEN,a.author),{ok:v.status===`completed`,flow:n,reply:y,posted:x,taskId:_.taskId,tokens:v.result?.tokens??void 0,...b===(a.context?.note??``).trim()?{}:{note:b}}}let v=g(n,t),y=v.scope===`builtin`?{...await z(a,o,e.post!==!1),cwd:t,...a.args}:a.args??d,b=await _(v.path,{cwd:t,...e.taskId?{runId:e.taskId}:{},args:y,ceiling:{agent:o.id,permissions:a.permissions??u(m(o),r).permissions},...e.postToken?{integrationToken:e.postToken}:{}},{...e.onTask?{onTaskStart:t=>e.onTask(t.taskId)}:{},...e.onStart?{onStart:e.onStart}:{}});return{ok:!0,flow:n,runId:b.runId,result:b.result,tokens:b.tokens}}async function R(e,t,n,r=a,i=()=>new Promise(e=>setTimeout(e,100))){let o;for(;;)try{return await r(e,t)}catch(e){if(!(e instanceof d)||e.code!==`approval-pending`||!n)throw e;e.approval?.id!==o&&(o=e.approval?.id,await n(e.approval)),await i()}}async function z(e,t,n=!0){if(!e.event)throw Error(`built-in flows need a GitHub pull request event`);return{...await V(e.event,t,e.context,e.author,n),...m(t),...e.permissions?{permissions:e.permissions}:{}}}async function B(e,t,n,r){if(r.taskFile){let t=JSON.parse(await j.readFile(T.resolve(e,r.taskFile),`utf8`));return{...t,flow:n,tools:t.tools??{}}}if(!r.eventFile)throw Error(`Missing --task or --event file.`);return P(t,n,JSON.parse(await j.readFile(T.resolve(e,r.eventFile),`utf8`)))}function V(e,t,n,r,i=!0){let a=h[e.integration]?.repos?.pullRequest(e);if(!a)throw Error(`built-in flows need a pull request event`);return{pr:a,post:i,...r?{author:r}:{}}}async function H(e,t,n){let r=await f(e,h),i=r.find(e=>e.id===t);if(!i)throw new d(`invalid-option`,`No agent named "${t}".`,{hint:`Agents here: ${r.map(e=>e.id).join(`, `)}`});let{definition:a,usage:o}=i,l=a.mcp??{},u=n?c(n,{...s(e).mcp,...l}):Object.keys(l).length?c(`all`,l):[];return{engine:o?.engine??a.engine,model:o?.model??a.model,effort:o?.effort??a.effort,permissions:o?.permissions??a.permissions,system:G(i)||void 0,mcp:u}}const U=48e3;function W(e){let t=[`You are an agent named "{name}" acting on behalf of a software team. You receive one request, a platform event or a task, and must produce the reply that goes back to its thread verbatim. Be direct and specific, use the attached tools to read context before answering, never invent facts about the repository, and stay within the actions your tools allow. Reply in plain markdown with no preamble.`.replace(`{name}`,e.definition.name??e.id)];e.definition.description&&t.push(`Your role: ${e.definition.description}`);let n=G(e);return n&&t.push(`## Agent instructions\n\n${n}`),t.join(`
|
|
2
|
-
|
|
3
|
-
`)}function G(e){if(!e.dir)return K(e.files??{});let t;try{t=O(e.dir).filter(e=>e.endsWith(`.md`))}catch{return``}t.sort((e,t)=>e===`system.md`?-1:t===`system.md`?1:e.localeCompare(t));let n=``;for(let r of t){let t=`### ${r}\n\n${D(T.join(e.dir,r),`utf8`).trim()}\n`;if(n+=t.slice(0,U-n.length),n.length===U)break}return n.trimEnd()}function K(e){let t=Object.keys(e).filter(e=>e.endsWith(`.md`));t.sort((e,t)=>e===`system.md`?-1:t===`system.md`?1:e.localeCompare(t));let n=``;for(let r of t){let t=`### ${r}\n\n${e[r].trim()}\n`;if(n+=t.slice(0,U-n.length),n.length===U)break}return n.trimEnd()}function q(e){let t=[`**Integration:** ${e.integration}`,`**Type:** ${e.type}`,`**Actor:** ${e.actor.login??e.actor.id}`];return e.repo&&t.push(`**Repo:** ${e.repo.owner}/${e.repo.name}`),e.chat&&t.push(`**Thread:** ${e.chat.thread.id}${e.chat.thread.isDM?` (direct message)`:``}`),[t.join(`
|
|
4
|
-
`),e.promptContext,e.text].filter(Boolean).join(`
|
|
5
|
-
|
|
6
|
-
`)}function J(e){if(!e)return``;let t=[];return e.messages?.length&&t.push(`## Recent thread\n\n${e.messages.map(e=>`- ${e.user}: ${e.text}`).join(`
|
|
7
|
-
`)}`),e.note&&t.push(`## Note from earlier in this thread\n\n${e.note}`),e.instructions&&t.push(`## Repository instructions\n\n${e.instructions}`),e.user&&t.push(`## Who asked\n\n${e.user.name} (${e.user.email}), a member of this Coder server.`),t.join(`
|
|
8
|
-
|
|
9
|
-
`)}function Y({event:e,prompt:t}){return t===void 0?e?q(e):``:e?.repo?`**Repo:** ${e.repo.owner}/${e.repo.name}\n\n${t}`:t}function X(e,t){let n=J(t.context),r=t.prompt===void 0&&t.event?h[t.event.integration]?.hint:void 0,i=Y(t);return{system:[W(e),r?`## Platform\n\n${r}`:``].filter(Boolean).join(`
|
|
10
|
-
|
|
11
|
-
`),prompt:n?`${i}\n\n${n}`:i}}function Z(e,s){let c=n(e,s);if(!c)return()=>{};let u={agent:s.agentId,permissions:s.permissions??`auto`},f=e=>{try{return k(e)}catch{return null}},p=[e,...s.addDirs??[]].flatMap(e=>f(T.resolve(e))??[]),m=e=>p.some(t=>e===t||e.startsWith(t+T.sep)),h=new Map,g=new Set,_=()=>{let e=x(i(s.mcp),v);return e?{token:e}:{}};return t(c,{async dispatch(t){let n=t.name??`task`,r=T.resolve(String(t.cwd??e)),i=[r,...(t.addDirs??[]).map(e=>T.resolve(r,e))],a=i.find(e=>!f(e));if(a)throw new d(`invalid-option`,`task "${n}" asks for ${a}, which does not exist`);let[s,...c]=i.map(e=>f(e)),p=[s,...c].find(e=>!m(e));if(p)throw new d(`invalid-option`,`task "${n}" asks for ${p}, outside the workspace of agent "${u.agent}"`);if(t.resume&&!h.has(t.resume))throw new d(`invalid-option`,`task "${n}" resumes a task this flow did not start`);let g=await l({prompt:String(t.prompt??``),outputSchema:t.outputSchema,cwd:s,engine:t.engine,model:t.model,effort:t.effort,permissions:o(n,t.permissions,u),name:t.name,system:t.system,resume:t.resume,addDirs:c,flowRunId:t.flowRunId,wait:!0},{fromMailbox:!0});return h.set(g.taskId,s),{taskId:g.taskId}},async wait(e){let t=h.get(e.taskId);if(!t)throw new d(`invalid-option`,`No task "${e.taskId}" started by this flow.`);let n=await a(t,e.taskId);return{status:n.status,result:n.result,model:n.task.model??null,next:r(t,n)??null}},review(t){if(t.op===`resolveTarget`){let{repo:n,...r}=t.input??{};if(!s.repo&&!/^\d+$/.test(String(r.pr)))throw new d(`invalid-option`,`review target must be a pull request number in this task's repository`);let i=b({...r,cwd:e,...s.repo?{repo:s.repo}:{},...s.author?{author:s.author}:{}},_());return i.pr&&g.add(`${i.pr.repo}#${i.pr.number}`),i}if(t.op!==`post`)throw new d(`invalid-option`,`unknown review action "${t.op}"`);if(!g.has(`${t.input?.repo}#${t.input?.pr}`))throw new d(`invalid-option`,`review post: pull request was not resolved by this task`);return y({...t.input,cwd:e},_())}})}export{P as a,M as i,H as n,L as r,N as t};
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{Cn as t,Dt as n,Ft as r,Jt as i,L as a,Nt as o,R as s,Rt as c,Vt as l,Yt as u,f as ee,ln as d,m as te,n as f,r as ne,vn as p,wn as m,wt as re,xt as h,zt as g}from"./dispatch-BKeAch9E.js";import{r as ie,s as ae}from"./output-BKeyLbvt.js";import{a as _}from"./discover-Dvr_3_Xr.js";import{c as oe,o as se}from"./actions-Mk3FSlpJ.js";import{createRequire as ce}from"node:module";import v from"node:path";import y from"node:process";import{fileURLToPath as le,pathToFileURL as b}from"node:url";import x from"node:fs";import{spawn as ue,spawnSync as de}from"node:child_process";import fe,{randomUUID as pe}from"node:crypto";import me from"node:os";import{AsyncLocalStorage as he}from"node:async_hooks";function S(e){return typeof e!=`object`||!e?JSON.stringify(e)??`null`:Array.isArray(e)?`[${e.map(S).join(`,`)}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${S(e[t])}`).join(`,`)}}`}function ge(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function C(e,t){return fe.createHash(`sha256`).update(`${e}\0${S(t)}`).digest(`hex`)}function w(e){return x.existsSync(e)?x.readFileSync(e,`utf8`).split(/\r?\n/).filter(Boolean).map(e=>{try{return JSON.parse(e)}catch{return null}}).filter(e=>e!==null):[]}var _e=class{file;recorded;seq=0;constructor(e,t){this.file=t,this.recorded=e.map(e=>({...e})),x.writeFileSync(t,``,`utf8`)}write(e){e.seq=this.seq++,x.appendFileSync(this.file,`${JSON.stringify(e)}\n`,`utf8`)}replay(...e){let t=this.recorded.find(t=>!t.consumed&&e.includes(t.fingerprint));if(!t)return null;t.consumed=!0;let{consumed:n,...r}=t;return this.write(r),r}record(e){this.write({...e,seq:0})}},ve=e({archiveFlaggedRuns:()=>Ne,archiveRun:()=>N,archiveRuns:()=>je,collectFlowRuns:()=>Ie,deleteRun:()=>P,deleteRuns:()=>Me,flowSteps:()=>Fe,generateRunId:()=>O,latestRun:()=>U,listArchivedRuns:()=>H,listRuns:()=>V,markRunArchived:()=>M,readFlowRecord:()=>L,readRawRecord:()=>F,reconcileRun:()=>I,resumeRun:()=>Oe,runDirFor:()=>j,runResult:()=>E,startRun:()=>De,unarchiveRun:()=>Pe,watchRun:()=>D,writeFlowRecord:()=>R});const T=`CODER_FLOW_ATTACH`;function ye(){try{return de(`bun`,[`--version`],{stdio:`ignore`}).status===0}catch{return!1}}function be(e,t){if(!e.endsWith(`.ts`)||y.versions.bun||y.features.typescript)return;if(!ye())throw new h(`invalid-option`,`This flow is a TypeScript file (${e}) and this Node cannot run TypeScript.`,{hint:[`Upgrade to Node 23.6+ or install bun: https://bun.sh`,`Or write the flow as .mjs / .js`]});let n=de(`bun`,[p,...t],{stdio:`inherit`});y.exit(n.status??1)}function xe(e){y.once(`SIGINT`,()=>{(async()=>{let{runId:t}=e,n=x.existsSync(v.join(j(t),pt));if(y.stderr.write(`\n[flow] Stopping run ${t}. No new tasks will dispatch.\n`),n){let t=e.runningIds();t.length&&y.stderr.write(`[flow] left running: ${t.join(`, `)}\n`)}else{let n=await gt(t,e.runningIds());n.length&&y.stderr.write(`[flow] stopped tasks: ${n.join(`, `)}\n`)}y.stderr.write(`\n${ae([`Resume: coder flow resume ${t}`],ie)}\n`),e.requestStop(),y.exit(130)})()})}function Se(e){let t=v.join(j(e),`events.jsonl`),n=e=>{try{x.appendFileSync(t,`${JSON.stringify(e)}\n`,`utf8`)}catch{}};return{onStart:e=>xe(e),onTaskStart:e=>n({kind:`task-start`,...e}),onTaskEnd:e=>n({kind:`task-end`,...e}),onGateStart:e=>n({kind:`gate-start`,...e}),onGate:e=>n({kind:`gate`,...e}),onLog:(e,t)=>n({kind:`log`,message:e,depth:t}),onFlowStart:e=>n({kind:`flow-start`,...e}),onReplay:e=>n({kind:`replay`,count:e})}}async function Ce(e){let t=y.env[T];if(t){delete y.env[T];try{await St(t,e,Se(t)),y.exit(0)}catch(e){Q(t,e instanceof Error?e.message:String(e)),y.exit(1)}}}function we(e,t,n){let r=j(e.runId);x.writeFileSync(v.join(r,`events.jsonl`),``,`utf8`);let i=x.openSync(v.join(r,`flow.log`),`a`),a=ue(y.execPath,[p,...t],{detached:!0,stdio:[`ignore`,i,i],env:{...y.env,[T]:e.runId}});return a.unref(),x.closeSync(i),{runId:e.runId,status:`running`,...n?{watch:D(e.runId,{bootPid:a.pid})}:{}}}async function Te(e,t,n){try{return await n()}catch(n){if(!(n instanceof h)||n.code!==`flow-failed`)throw n;let r=t?`
|
|
2
|
-
[flow] dry-run ended early: a downstream step depends on real task output (stub it or run for real).`:``;throw new h(`flow-failed`,`[flow] ${e} ${n.runId} failed: ${n.message}${r}`,{runId:n.runId,hint:`Resume${e===`resume`?` again`:``}: coder flow resume ${n.runId}`})}}function Ee(e,t){let n=e?L(e):U();if(!n)throw new h(`flow-failed`,e?`No flow run "${e}".`:t,{hint:`Run one: coder flow run <name>`});return n}async function De(e,t={},n={}){return t.argv&&(be(_(e,t.cwd?v.resolve(t.cwd):y.cwd()).path,t.argv),await Ce(t),!t.dryRun)?we(X(e,t),t.argv,t.wait):Te(`run`,t.dryRun,()=>xt(e,t,n))}async function Oe(e,t={},n={}){let r=Ee(e,`No flow runs to resume.`);return t.argv&&(be(r.script,t.argv),await Ce(t),!t.dryRun)?we(X(``,t,r.runId),t.argv,t.wait):Te(`resume`,t.dryRun,()=>St(r.runId,t,n))}function ke(e){let t=v.join(j(e),`events.jsonl`);return x.existsSync(t)?x.readFileSync(t,`utf8`).split(`
|
|
3
|
-
`).filter(Boolean).flatMap(e=>{try{return[JSON.parse(e)]}catch{return[]}}):[]}function E(e,t={}){let n=e?L(e):U();return n?{...n,steps:Fe(n.runId,t.tail),journal:w(v.join(j(n.runId),`journal.jsonl`)).map(e=>({kind:e.kind,taskId:e.taskId,tokens:e.tokens})),events:ke(n.runId)}:null}function D(e,t={}){let n=Ee(e,`No flow runs yet.`);return{record:n,events:vt(n.runId,t.bootPid,{tail:t.tail}),final(){let e=E(n.runId,{tail:0});if(!e)throw new h(`flow-failed`,`[flow] run ${n.runId} vanished while following.`,{hint:`Recent runs: coder flow list`});return e}}}function Ae(e){let t=L(e);if(!t)throw new h(`flow-failed`,`No flow run "${e}".`,{hint:`Recent runs: coder flow list`});if(t.status===`running`||t.status===`queued`)throw new h(`flow-failed`,`Run ${t.runId} is still running.`,{runId:t.runId,hint:`Stop it first: coder flow stop ${t.runId}`});return t}function je(e,t={}){if(t.allStopped){let e=V().filter(e=>e.status!==`running`&&e.status!==`queued`);for(let t of e)N(t);let t=e.map(e=>e.runId);return{archived:t,count:t.length}}if(!e)throw new h(`invalid-option`,`Missing run id.`,{hint:[`Archive one: coder flow archive <run-id>`,`Archive all stopped: coder flow archive --all-stopped`]});let n=Ae(e);return N(n),{runId:n.runId,archived:!0}}function Me(e,t={}){if(t.allArchived){let e=H().filter(e=>P(e.runId)).map(e=>e.runId);return{deleted:e,count:e.length}}if(!e)throw new h(`invalid-option`,`Missing run id.`,{hint:[`Delete one: coder flow delete <run-id>`,`Delete all archived: coder flow delete --all-archived`]});let n=Ae(e);return{runId:n.runId,deleted:P(n.runId)}}function O(){return`flow-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function k(){let e=s();return u(e)}function A(){return i()}function j(e){n(e,`flow run id`);let t=v.join(k(),e);if(x.existsSync(v.join(t,`flow.json`)))return t;let r=v.join(A(),e);return x.existsSync(v.join(r,`flow.json`))?r:t}function M(e){if(e.archived)return e;let t={...e,archived:!0,archivedAt:new Date().toISOString()};return R(j(e.runId),t),t}function N(e){let t=j(e.runId),n=v.join(A(),e.runId);return t!==n&&m(t,n),M(e)}function Ne(e){for(let t of e){let e=L(t);e&&N(e)}}function Pe(e){let t=j(e.runId),n=v.join(k(),e.runId);t!==n&&m(t,n);let r={...e,archived:void 0,archivedAt:void 0};return R(j(e.runId),r),r}function P(e){let t=j(e);return x.existsSync(v.join(t,`flow.json`))?(x.rmSync(t,{recursive:!0,force:!0}),!0):!1}function F(e){if(!r(e))return null;let t=v.join(j(e),`flow.json`);if(!x.existsSync(t))return null;try{return JSON.parse(x.readFileSync(t,`utf8`))}catch{return null}}function I(e){return e.status!==`running`||!e.pid||$(e)?e:(Q(e.runId,`orchestrator died`),F(e.runId)??e)}function L(e){let t=F(e);return t?I(t):null}function R(e,t){x.writeFileSync(v.join(e,`flow.json`),`${JSON.stringify(t,null,2)}\n`,`utf8`)}function z(e){let t=[];try{t=x.readdirSync(e)}catch{return[]}let n=[];for(let r of t)try{n.push(I(JSON.parse(x.readFileSync(v.join(e,r,`flow.json`),`utf8`))))}catch{}return n}const B=(e,t)=>String(t.startedAt).localeCompare(String(e.startedAt));function V(){let e=[];for(let t of z(k()))t.archived?N(t):e.push(t);return e.sort(B)}function H(e){let t=e?.migrate??!0,n=z(A()),r=new Set(n.map(e=>e.runId));for(let e of z(k()))e.archived&&!r.has(e.runId)&&n.push(t?N(e):e);return n.sort(B)}function U(){return[...V(),...H()].sort(B)[0]??null}function Fe(e,t=`all`){if(t===0)return[];let n=w(v.join(j(e),`journal.jsonl`)).filter(e=>e.kind===`task`),r=c(y.cwd()),i=new Map(r.map(e=>[e.id,e])),a=e=>e?.name??e?.prompt?.replace(/\s+/g,` `).trim().slice(0,60)??null,o=n.map(e=>{let t=e.taskId?i.get(e.taskId):void 0;return{taskId:e.taskId??null,name:a(t),status:t?.status??e.result?.status??`?`,tokens:e.tokens??null}}),s=new Set(o.map(e=>e.taskId));for(let t of r)t.flowRunId===e&&!s.has(t.id)&&o.push({taskId:t.id,name:a(t),status:t.status,tokens:null});return t===`all`?o:o.slice(-t)}function Ie(e={}){let t=e.limit===`all`?void 0:e.limit,n;if(e.archived)n=H();else{let e=[];n=V().filter(t=>t.status===`running`||t.status===`queued`||re(t.endedAt??t.startedAt)<=6e5||(M(t),e.push(t.runId),!1)),se(y.cwd(),e,{flows:!0})}let r=t===void 0?0:Math.max(0,n.length-t);return{runs:t===void 0?n:n.slice(0,t),clipped:r}}const Le=globalThis,W=Le.__coderFlowCtxALS??=new he,G=Le.__coderFlowScopeALS??=new he;function Re(){return G.getStore()?.args}function ze(){return W.getStore()?.integrationToken}function K(){return G.getStore()?.depth??0}var Be=class{limit;active=0;queue=[];constructor(e){this.limit=e}async run(e){this.active<this.limit?this.active+=1:await new Promise(e=>this.queue.push(e));try{return await e()}finally{let e=this.queue.shift();e?e():--this.active}}};function Ve(e,t){return t?e?{input:e.input+t.input,cachedInput:e.cachedInput+t.cachedInput,output:e.output+t.output,total:e.total+t.total}:{...t}:e}function He(e,t){if(!t.tokens)return;let n=t.model??`default`;e.ledger[n]=Ve(e.ledger[n]??null,t.tokens)}function Ue(e){return!!e&&typeof e.safeParse==`function`}async function q(e){try{let t=await import(`zod`);if(typeof t.toJSONSchema==`function`)return t.toJSONSchema(e)}catch{}return null}async function We(e){let t=await q(e);return`Reply with only a single JSON object ${t?`matching this JSON Schema:\n${JSON.stringify(t,null,2)}`:`matching the requested shape`}\nUse no prose or markdown fences. Return only the JSON object.`}function Ge(e){let t=e.trim(),n=t.match(/```(?:json)?\s*([\s\S]*?)```/i);n&&(t=n[1].trim());let r=t.indexOf(`{`);if(r===-1)throw Error(`no JSON object found in reply`);let i=0,a=!1,o=!1;for(let e=r;e<t.length;e+=1){let n=t[e];if(a){o?o=!1:n===`\\`?o=!0:n===`"`&&(a=!1);continue}if(n===`"`)a=!0;else if(n===`{`)i+=1;else if(n===`}`&&(--i,i===0))return JSON.parse(t.slice(r,e+1))}throw Error(`unterminated JSON object in reply`)}function J(e,t){if(!Ue(e))return{ok:!0,data:t};let n=e.safeParse(t);if(n.success)return{ok:!0,data:n.data};let r=n.error?.issues??n.error?.errors??[];return{ok:!1,errors:Array.isArray(r)?r.map(e=>`${(e.path??[]).join(`.`)||`(root)`}: ${e.message}`).join(`; `):String(n.error)}}function Ke(e,t,n){return{cwd:t,engine:e.engine,model:e.model,effort:e.effort,permissions:n?.ceiling?f(e.name,e.permissions,n.ceiling):e.permissions,name:e.name,system:e.system,addDirs:e.addDirs,wait:!0,flowRunId:n?.runId}}async function qe(e,t,n,r){let i=t.cwd?v.resolve(t.cwd):n?.cwd??y.cwd(),c=t.returns?await q(t.returns):null,l=t.returns&&!c?[t.system,await We(t.returns)].filter(Boolean).join(`
|
|
4
|
-
|
|
5
|
-
`):t.system,u;for(;;){let d={prompt:e,...Ke(t,i,n),system:l,...c?{outputSchema:c}:{},...u?{engine:u,model:void 0,effort:void 0,resume:void 0}:{resume:r??t.resume}},f=!!s(),p=f?await a(`dispatch`,d):await ne({...d,onFallback:e=>tt(`${e.engine} failed to start. Falling back to ${e.next}. ${e.detail.replace(/\s+/g,` `).slice(0,140)}`)});n?.running.add(p.taskId);let m=g(i,p.taskId),re=m?o(m):void 0;n?.hooks.onTaskStart?.({taskId:p.taskId,name:t.name,prompt:e,engine:re,depth:K()});let h;try{if(f)h=await a(`wait`,{taskId:p.taskId});else{let e=await te(i,p.taskId);h={status:e.status,result:e.result,model:e.task.model??null,next:ee(i,e)??null}}}finally{n?.running.delete(p.taskId)}if(h.next){let e=h.next;n?.hooks.onTaskEnd?.({taskId:p.taskId,status:`failed`,tokens:null}),u=e;continue}return{taskId:p.taskId,status:h.status,output:h.result?.finalMessage||h.result?.error?.message||``,tokens:h.result?.tokens??null,model:h.result?.model??h.model}}}async function Je(e,t,n){if(n?.dryRun){y.stdout.write(`\n[dry-run] task${t.name?` (${t.name})`:``}:\n${e}\n`);let n={...t,returns:t.returns?`<schema>`:void 0};return y.stdout.write(`[dry-run] opts: ${JSON.stringify(n)}\n`),{taskId:`dry`,status:`completed`,output:`[dry-run]`,data:void 0,tokens:null,model:t.model??null}}let r=await qe(e,t,n);if(r.status!==`completed`){let e={...r,data:void 0};throw new h(`task-failed`,`Task ${r.taskId} ${r.status}: ${r.output||`no output`}`,{taskId:r.taskId,result:e})}let i=r.output,a=r.tokens,o;if(t.returns){let e;try{e=J(t.returns,Ge(i))}catch(t){e={ok:!1,errors:t instanceof Error?t.message:String(t)}}if(e.ok)o=e.data;else{let s=await qe(`Your previous reply did not match the required format: ${e.errors}\n\nReply again with the required JSON object.`,t,n,r.taskId);i=s.output||i,a=Ve(a,s.tokens);try{let e=J(t.returns,Ge(i));if(!e.ok)throw Error(e.errors);o=e.data}catch(e){let t={taskId:r.taskId,status:`completed`,output:i,data:void 0,tokens:a,model:r.model};throw new h(`task-failed`,`Task ${r.taskId} produced no valid structured output: ${e instanceof Error?e.message:String(e)}`,{taskId:r.taskId,result:t})}}}return{taskId:r.taskId,status:`completed`,output:i,data:o,tokens:a,model:r.model}}async function Ye(e){if(e)return await q(e)??`<schema>`}async function Xe(e,t={}){let n=W.getStore();if(!n)return Je(e,t);let r={prompt:e,agent:t.engine,model:t.model,effort:t.effort,permissions:t.permissions,name:t.name,system:t.system,resume:t.resume,cwd:t.cwd,...t.addDirs?.length?{addDirs:t.addDirs}:{},returns:await Ye(t.returns)},i=C(`task`,ge(r)),a=n.journal.replay(i,C(`task`,r));if(a)return a.result;if(n.taskCount+=1,n.taskCount>n.maxTasks)throw Error(`Flow exceeded --max-tasks (${n.maxTasks}). Raise it with --max-tasks, or fix a runaway loop; the run is resumable.`);return n.semaphore.run(async()=>{let r=new Date().toISOString(),a;try{a=await Je(e,t,n)}catch(e){let t=e instanceof h?e.result:void 0;throw t&&n.hooks.onTaskEnd?.({taskId:t.taskId,status:t.status===`completed`?`failed`:t.status,tokens:t.tokens}),e}return He(n,a),n.dryRun||n.hooks.onTaskEnd?.({taskId:a.taskId,status:a.status,tokens:a.tokens}),n.journal.record({kind:`task`,fingerprint:i,result:a,taskId:a.taskId,tokens:a.tokens,startedAt:r,endedAt:new Date().toISOString()}),a})}const Y=262144;function Ze(e){let t=[];for(let n=e;;){t.push(v.join(n,`node_modules`,`.bin`));let e=v.dirname(n);if(e===n)break;n=e}let n=y.platform===`win32`?`;`:`:`;return{...y.env,PATH:[...t,y.env.PATH??``].join(n)}}async function Qe(e,t){return new Promise(n=>{let r=ue(e,{shell:!0,cwd:t,env:Ze(t)}),i=``,a=e=>{i.length>=Y||(i+=e,i.length>=Y&&(i=`${i.slice(0,Y)}\n... [gate output truncated]`))};r.stdout?.on(`data`,a),r.stderr?.on(`data`,a),r.on(`error`,e=>n({ok:!1,code:1,output:String(e.message??e).trim()})),r.on(`close`,e=>n({ok:e===0,code:e??0,output:i.trim()}))})}async function $e(e,t={}){let n=W.getStore(),r=t.cwd?v.resolve(t.cwd):n?.cwd??y.cwd();if(!n)return Qe(e,r);let i=C(`gate`,{cmd:e,cwd:t.cwd}),a=n.journal.replay(i);if(a)return a.result;if(n.dryRun){y.stdout.write(`\n[dry-run] gate: ${e}\n`);let t={ok:!0,code:0,output:``};return n.journal.record({kind:`gate`,fingerprint:i,result:t,startedAt:new Date().toISOString(),endedAt:new Date().toISOString()}),t}let o=new Date().toISOString(),s=`gate-${y.pid}-${pe()}`,c=K();n.hooks.onGateStart?.({gateId:s,cmd:e,depth:c});let l=await Qe(e,r);return n.hooks.onGate?.({gateId:s,cmd:e,ok:l.ok,code:l.code,depth:c}),n.journal.record({kind:`gate`,fingerprint:i,result:l,startedAt:o,endedAt:new Date().toISOString()}),l}async function et(e,...t){return Promise.all(e.map(async(e,n)=>{let r=e;for(let i of t)try{r=await i(r,e,n)}catch{return null}return r}))}function tt(e){let t=W.getStore();if(t)try{x.appendFileSync(v.join(t.runDir,`flow.log`),`${JSON.stringify({at:new Date().toISOString(),message:e})}\n`,`utf8`)}catch{}t?.hooks.onLog?t.hooks.onLog(e,K()):(y.stderr.isTTY||!t)&&y.stderr.write(`[flow] ${e}\n`)}const nt=ce(import.meta.url);function rt(e){let t=v.dirname(le(import.meta.url));for(;v.basename(t)!==`dist`&&v.dirname(t)!==t;)t=v.dirname(t);return v.basename(t)===`dist`?b(v.join(t,e)).href:null}function it(e){if(!(e===`@wular/coder`||e===`@wular/coder/flow`||e===`zod`||e.startsWith(`zod/`)))return null;try{return b(nt.resolve(e)).href}catch{}return e===`@wular/coder/flow`?rt(`flow/index.js`):e===`@wular/coder`?rt(`sdk.js`):null}const at=/(\bfrom\s+|\bimport\s+|\bimport\s*\(\s*)(['"])([^'"]+)\2/g;function ot(e){return e.replace(at,(e,t,n,r)=>{let i=it(r);return i?`${t}${n}${i}${n}`:e})}async function st(e){let t=G.getStore(),n=t.imports??={dirs:new Set,node:!1};if(y.versions?.bun){if(n.dirs.has(e))return;n.dirs.add(e);let{plugin:t}=await import(`bun`),r=e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);t({name:`coder-flow:${e}`,setup(e){e.onLoad({filter:RegExp(`^${r}/(?!.*node_modules/).*\\.m?[jt]sx?$`)},e=>({contents:ot(x.readFileSync(e.path,`utf8`)),loader:v.extname(e.path).replace(/^\.m?/,``)}))}});return}if(n.node)return;n.node=!0;let{register:r}=await import(`node:module`),i=Object.fromEntries([`@wular/coder`,`@wular/coder/flow`,`zod`].flatMap(e=>{let t=it(e);return t?[[e,t]]:[]})),a=`const urls = ${JSON.stringify(i)}, parent = ${JSON.stringify(import.meta.url)};
|
|
6
|
-
export function resolve(spec, ctx, next) {
|
|
7
|
-
if (urls[spec]) return { url: urls[spec], shortCircuit: true };
|
|
8
|
-
return next(spec, spec.startsWith('zod/') ? { ...ctx, parentURL: parent } : ctx);
|
|
9
|
-
}`;r(`data:text/javascript,${encodeURIComponent(a)}`)}async function ct(e,t,n){try{return await import(b(e).href)}catch(e){let r=e instanceof Error?e.message:String(e);throw t===`.ts`&&!y.versions?.bun&&/Unknown file extension|Unexpected token|SyntaxError|Cannot parse|import type|interface/i.test(r)?Error(`Could not run ${v.basename(n)}: TypeScript flows need bun. Run under \`bun\`, or write the flow as .mjs/.js.`):e}}async function lt(e){if(!x.existsSync(e))throw Error(`Cannot read flow file: ${e}`);return await st(v.dirname(e)),ct(e,v.extname(e),e)}async function ut(e,t){let n=G.getStore();n.args=t??{};let r=await lt(e),i=W.getStore();i?.flowConcurrency&&!n.depth&&typeof r.concurrency==`number`&&(i.semaphore.limit=Math.max(1,r.concurrency),R(i.runDir,{...L(i.runId),concurrency:i.semaphore.limit}));let a=r.args,o=n.args;if(Ue(a)){let e=a.safeParse(t??{});if(!e.success){let e=J(a,t??{});throw Error(`Invalid flow args: ${e.errors??`validation failed`}`)}o=e.data,n.args=o}let s=r.default;return typeof s==`function`?s(o):s}async function dt(e,t){let n=W.getStore(),r=n?.cwd??y.cwd(),i=_(e,r);if(!n)return G.run({args:t??{},depth:0},()=>ut(i.path,t));let a=G.getStore();if(a&&a.depth>=1)throw Error(`flow("${e}") nesting is one level deep; a sub-flow cannot call flow().`);let o=C(`flow`,{name:i.name,args:t??{}}),s=n.journal.replay(o);if(s)return s.result;let c=new Date().toISOString();n.hooks.onFlowStart?.({name:i.name,depth:(a?.depth??0)+1});let l=await G.run({args:t??{},depth:(a?.depth??0)+1,imports:a?.imports},()=>ut(i.path,t));return n.journal.record({kind:`flow`,fingerprint:o,result:l,startedAt:c,endedAt:new Date().toISOString()}),l}var ft=e({STOP_KEEP_TASKS_MARKER:()=>pt,markRunFailed:()=>Q,orchestratorAlive:()=>$,pidAlive:()=>mt,prepareRun:()=>X,resumeFlow:()=>St,runFlowByName:()=>xt,stopFlowTasks:()=>gt,stopRun:()=>_t,streamFlowCore:()=>vt});function X(e,t={},n){let r,i,a;if(n){let e=L(n);if(!e)throw Error(`No flow run "${n}".`);e.archived&&Pe(e),r=e.name,i=e.script,a=t.args??e.args}else{let n=_(e,t.cwd?v.resolve(t.cwd):y.cwd());r=n.name,i=n.path,a=t.args??{}}let o=n??t.runId??O(),s=j(o);x.mkdirSync(s,{recursive:!0});let c={runId:o,name:r,script:i,args:a,status:`running`,startedAt:new Date().toISOString(),concurrency:Math.max(1,t.concurrency??me.cpus().length),maxTasks:Math.max(1,t.maxTasks??me.cpus().length*10),taskCount:0,ledger:{}};return R(s,c),c}function Z(e,t,n){R(e,{...t,endedAt:new Date().toISOString(),pid:void 0,pidStartedAt:void 0,...n})}function Q(e,t){let n=F(e);!n||n.status!==`running`||Z(j(e),n,{status:`failed`,error:t})}const pt=`stop-keep-tasks`;function mt(e){try{return y.kill(e,0),!0}catch{return!1}}function $(e){if(!e.pid||!mt(e.pid))return!1;let t=l(e.pid),n=Date.parse(e.pidStartedAt??``);return t===null||!Number.isFinite(n)||t<=n+6e4}function ht(e){let t=c(y.cwd()),n=new Map(t.map(e=>[e.id,e])),r=new Set(t.filter(t=>t.flowRunId===e).map(e=>e.id));for(let t of w(v.join(j(e),`journal.jsonl`)))t.kind===`task`&&t.taskId&&r.add(t.taskId);return[...r].filter(e=>{let t=n.get(e);return!!t&&!d.includes(t.status)})}async function gt(e,t=[]){let n=y.cwd(),r=[];for(let i of new Set([...ht(e),...t])){let e=g(n,i);if(!(!e||d.includes(e.status)))try{await oe(n,e),r.push(i)}catch{}}return r}async function _t(e,t={}){let n=e?L(e):U();if(!n)throw new h(`flow-failed`,e?`No flow run "${e}".`:`No flow runs.`,{hint:`Run one: coder flow run <name>`});if(n.status!==`running`)throw new h(`flow-failed`,`Run ${n.runId} is not running.`,{runId:n.runId,hint:`Result: coder flow result ${n.runId}`});let r=j(n.runId);if(!$(n))return Z(r,n,{status:`failed`,error:`orchestrator died`}),{runId:n.runId,status:`failed`,stoppedTasks:[],keptTasks:ht(n.runId)};let i=ht(n.runId),a=v.join(r,pt);t.keepTasks&&x.writeFileSync(a,``,`utf8`);try{y.kill(n.pid,`SIGINT`);let e=L(n.runId);for(let t=0;t<25&&e?.status===`running`;t+=1)await new Promise(e=>setTimeout(e,200)),e=L(n.runId);if(!e||e.status===`running`)throw new h(`flow-failed`,`Run ${n.runId} did not stop within 5s.`,{runId:n.runId,hint:`Check it: coder flow result ${n.runId}`});let t=y.cwd(),r=[],a=[];for(let e of i){let n=g(t,e);n&&(n.status===`cancelled`?r.push(e):d.includes(n.status)||a.push(e))}return{runId:n.runId,status:e.status,stoppedTasks:r,keptTasks:a}}finally{if(t.keepTasks)try{x.unlinkSync(a)}catch{}}}async function*vt(e,n,r={}){let i=v.join(j(e),`events.jsonl`),a=r.tail??`all`,o=0;if(a!==`all`)try{o=Math.max(0,x.readFileSync(i,`utf8`).split(`
|
|
10
|
-
`).length-1-a)}catch{}let s=t(i),c=()=>{let e=[];for(let t of s()){if(o>0){--o;continue}try{e.push(JSON.parse(t))}catch{}}return e},l=L(e);for(;!l||l.status===`running`;){yield*c();let t=l?.pid?!$(l):n!==void 0&&!mt(n);if(l&&(l.pid||n!==void 0)&&t){Q(e,`orchestrator died`);break}await new Promise(e=>setTimeout(e,400)),l=L(e)??l}yield*c()}function yt(e,t,n,r){let i={...X(e,t,r),pid:y.pid,pidStartedAt:new Date().toISOString()},{runId:a}=i,o=j(a);R(o,i);let s=v.join(o,`journal.jsonl`),c=r?w(s):[],l=new _e(c,s),u={runId:a,runDir:o,cwd:t.cwd?v.resolve(t.cwd):y.cwd(),journal:l,semaphore:new Be(i.concurrency),flowConcurrency:t.concurrency===void 0,maxTasks:i.maxTasks,dryRun:t.dryRun??!1,ledger:{},running:new Set,taskCount:0,stopping:!1,hooks:n,...t.integrationToken?{integrationToken:t.integrationToken}:{},...t.ceiling?{ceiling:t.ceiling}:{}};return{started:{runId:a,runDir:o,ctx:u,markStopped:()=>{u.stopping=!0,Z(o,i,{status:`stopped`,concurrency:u.semaphore.limit,taskCount:u.taskCount,ledger:u.ledger})}},args:i.args,name:i.name,replayable:c.length}}async function bt(e,t,n,r){let{ctx:i,runDir:a,runId:o}=e,s=L(o);try{let e=await W.run(i,()=>G.run({args:r??{},depth:0},()=>ut(t,r)));return Z(a,s,{status:`completed`,concurrency:i.semaphore.limit,taskCount:i.taskCount,ledger:i.ledger,result:e}),{runId:o,name:n,status:`completed`,result:e,tokens:i.ledger,taskCount:i.taskCount}}catch(e){throw i.stopping||Z(a,s,{status:`failed`,concurrency:i.semaphore.limit,taskCount:i.taskCount,ledger:i.ledger,error:e instanceof Error?e.message:String(e)}),e instanceof h&&(e.code===`chain-exhausted`||e.code===`approval-pending`)?(e.runId??=o,e):new h(`flow-failed`,e instanceof Error?e.message:String(e),{runId:o})}}async function xt(e,t={},n={}){let{started:r}=yt(e,t,n),i=L(r.runId).script;return n.onStart?.({runId:r.runId,requestStop:r.markStopped,runningIds:()=>[...r.ctx.running]}),bt(r,i,L(r.runId).name,t.args??{})}async function St(e,t={},n={}){let{started:r,args:i,name:a,replayable:o}=yt(``,t,n,e),s=L(e).script;return n.onStart?.({runId:e,requestStop:r.markStopped,runningIds:()=>[...r.ctx.running]}),o&&n.onReplay?.(o),bt(r,s,a,i)}export{Oe as _,ze as a,De as b,$e as c,Xe as d,je as f,L as g,O as h,_t as i,tt as l,Me as m,xt as n,Re as o,Ie as p,gt as r,dt as s,ft as t,et as u,E as v,D as x,ve as y};
|
package/dist/http-Bkg_OQ6r.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e,o as t}from"./local-H3uvqEbq.js";import{Readable as n}from"node:stream";import{pipeline as r}from"node:stream/promises";function i(e,t=200,n={}){return new Response(JSON.stringify(e),{status:t,headers:{"content-type":`application/json`,...n}})}const a=e=>e.searchParams.has(`cursor`);function o(t){if(t)try{return e(t)}catch{return}}const s=e=>o(e.searchParams.get(`cursor`));function c(e,t=50,n=200){let r=Number(e.searchParams.get(`limit`)??t);return Number.isInteger(r)&&r>0?Math.min(r,n):t}function l(e,n,r){let i=e.slice(0,n);return{items:i,...e.length>n?{next:t(r(i.at(-1)))}:{}}}const u=(e,t=302)=>new Response(null,{status:t,headers:{location:e}}),d=()=>new Response(`Forbidden`,{status:403}),f=()=>new Response(`Not found`,{status:404}),p=()=>new Response(`Method not allowed`,{status:405}),m=e=>u(`/login?return=${encodeURIComponent(`${e.pathname}${e.search}`)}`),h=e=>e.startsWith(`/api/auth`)?65536:1048576;async function g(e,t,n){let r=Number(t??0);if(Number.isFinite(r)&&r>n)throw Object.assign(Error(`Payload too large`),{status:413});let i=[],a=0;for await(let t of e){if(a+=t.byteLength,a>n)throw Object.assign(Error(`Payload too large`),{status:413});i.push(t)}let o=new Uint8Array(a),s=0;for(let e of i)o.set(e,s),s+=e.byteLength;return o}function _(e){let t=new Headers;for(let[n,r]of Object.entries(e))r!==void 0&&t.set(n,Array.isArray(r)?r.join(`, `):r);return t}async function v(e,t){let n=e.url??`/`,r=await g(e,e.headers[`content-length`],t);return new Request(`http://${e.headers.host??`localhost`}${n}`,{method:e.method,headers:_(e.headers),body:r.byteLength?Buffer.from(r):void 0})}function y(e,{limit:t,admit:i=()=>!0}){return async(a,o)=>{if(!i(a))return void o.writeHead(404).end(`Not found`);try{let i=await e(await v(a,t(a.url??`/`)),a.socket.remoteAddress?.replace(/^::ffff:/,``)),s=Object.fromEntries(i.headers.entries()),c=i.headers.getSetCookie();c.length&&(s[`set-cookie`]=c),o.writeHead(i.status,s),i.body?await r(n.fromWeb(i.body),o).catch(()=>{}):o.end()}catch(e){if(o.headersSent)return void o.destroy();let t=typeof e==`object`&&e&&`status`in e;t||console.error(`coder server: request failed`,e);let n=t?e instanceof Error?e.message:String(e):`Internal server error`;o.writeHead(t?Number(e.status):500,{"content-type":`application/json`}),o.end(JSON.stringify({error:n}))}}}async function b(e,t){if(e.method===`GET`||e.method===`HEAD`||!e.body)return e;try{let n=await g(e.body,e.headers.get(`content-length`)??void 0,t);return new Request(e.url,{method:e.method,headers:e.headers,body:n.byteLength?Buffer.from(n):void 0,signal:e.signal})}catch(e){if(e.status===413)return new Response(`Payload too large`,{status:413});throw e}}export{i as a,p as c,c as d,a as f,d as i,f as l,m,s as n,b as o,u as p,o as r,y as s,h as t,l as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as e}from"./cli-BilSDkvE.js";const t=e(`agent integrations`,{list:async()=>(await import(`./list-VToARh3C.js`)).commandIntegrationsList,ls:async()=>(await import(`./list-VToARh3C.js`)).commandIntegrationsList,show:async()=>(await import(`./show-COTZEYgc.js`)).commandIntegrationsShow},{menu:[{usage:`list`,blurb:`list integrations with their events and tools`},{usage:`show <id>`,blurb:`events and tools of one integration`}],description:[`The platforms an agent can listen to and act on: their events and tool presets.`]},{aliases:{ls:`list`}});export{t as commandAgentIntegrations};
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{t}from"./types-D0q15RJa.js";import*as n from"zod/mini";import{createHash as r,createHmac as i,timingSafeEqual as a}from"node:crypto";import{siGithub as o,siGmail as s,siLinear as c,siSlack as l}from"simple-icons";function u(e,t){let n=typeof e==`string`?Buffer.from(e):e,r=typeof t==`string`?Buffer.from(t):t;return n.length===r.length&&a(n,r)}const d=e=>r(`sha256`).update(e).digest(`base64url`),f=`https://api.github.com`;function p(e,t=`application/vnd.github+json`){return{accept:t,...e?{authorization:`Bearer ${e}`}:{},"user-agent":`coder`,"x-github-api-version":`2022-11-28`}}async function m(e){let[{createGitHubAdapter:t},{ConsoleLogger:n}]=await Promise.all([import(`@chat-adapter/github`),import(`chat`)]);return t({installationToken:e,apiUrl:f,webhookVerifier:()=>!1,logger:new n(`error`)}).octokit}const h=e=>t=>{if(!e.includes(t.status??0))throw t},g=e=>{let[t=``,n=``]=e.split(`/`);return{owner:t,repo:n}};async function ee(e,t,n,r){let i=await(await m(n)).repos.getContent({...g(e),path:t,...r?{ref:r}:{},mediaType:{format:`raw`}}).catch(h([404]));return typeof i?.data==`string`?i.data:void 0}async function te(e,t,n){let r=await(await m(n)).repos.getCommit({...g(e),ref:t,mediaType:{format:`sha`}}).catch(h([404,422]));return r?String(r.data).trim():void 0}async function ne(e,t,n,r){let i=await(await m(n)).repos.getContent({...g(e),path:t,...r?{ref:r}:{}}).catch(h([404]));return Array.isArray(i?.data)?i.data.map(e=>e.name):[]}async function re(e){let t=await m(e);return(await t.paginate(t.apps.listReposAccessibleToInstallation,{per_page:100})).map(e=>e.full_name)}async function ie(e,t){let{data:n}=await(await m(t)).pulls.list({...g(e),state:`open`,sort:`created`,direction:`desc`,per_page:50});return n.map(e=>({number:e.number,title:e.title,author:e.user?.login,createdAt:e.created_at}))}async function ae(e,t){let{data:n}=await(await m(t)).repos.get(g(e));return{owner:n.owner.login,name:n.name,cloneUrl:n.clone_url,ref:n.default_branch,defaultBranch:n.default_branch}}async function oe(e,t,n){let r=await(await m(n)).repos.getCollaboratorPermissionLevel({...g(e),username:t}).catch(()=>void 0);return[`admin`,`maintain`,`write`].includes(r?.data.permission??``)}function se(e,t,n){let r=`https://github.com/${e}`;return t?`${r}/tree/${n??`HEAD`}/${t}`:r}const _=e=>e.replace(/[&<>"']/g,e=>`&#${e.charCodeAt(0)};`);function v(e,t=200){return new Response(`<!doctype html><meta charset="utf-8">${e}`,{status:t,headers:{"content-type":`text/html; charset=utf-8`}})}const y={observe:[`read`],comment:[`read`,`comment`],write:[`read`,`comment`,`write`]},ce=[`repos`,`pull_requests`,`issues`],le=[`repos`,`issues`];function ue(e){return e?.type===`pull_request`||/^github:[^:]+:\d+(:|$)/.test(e?.chat?.thread.id??``)?ce:le}function de(e,t,n){let r=!e.some(e=>e!==`read`);return{name:`github`,command:`github-mcp-server`,args:[`stdio`,`--toolsets=${ue(t).join(`,`)}`,...r?[`--read-only`]:[]],env:{GITHUB_PERSONAL_ACCESS_TOKEN:n}}}function fe(e,{name:t,permissions:n,events:r,state:i,isPublic:a=!1}){let o=e.replace(/\/$/,``);return{name:t,url:o,hook_attributes:{url:`${o}/hooks/github`,active:!0},redirect_url:`${o}/create/github/callback?state=${encodeURIComponent(i)}`,callback_urls:[`${o}/install/github/callback`,`${o}/connect/github/callback`],request_oauth_on_install:!0,public:a,default_permissions:n,default_events:r}}function pe(e){return e?`https://github.com/organizations/${encodeURIComponent(e)}/settings/apps/new`:`https://github.com/settings/apps/new`}function me(e,t){let n=JSON.stringify(e).replace(/'/g,`'`);return`<form method="post" action="${pe(t)}"><input type="hidden" name="manifest" value='${n}'><button type="submit">Create GitHub App</button></form>`}async function he(e,t=fetch){let n=await t(`${f}/app-manifests/${encodeURIComponent(e)}/conversions`,{method:`POST`,headers:p()});if(!n.ok)throw Error(`GitHub App manifest conversion failed: ${n.status}`);let r=await n.json(),i=r.app_id??r.id;if(!i||!r.slug||!r.pem||!r.webhook_secret||!r.client_id||!r.client_secret||!r.html_url||!r.install_url)throw Error(`GitHub App manifest conversion response was incomplete`);return{appId:String(i),slug:r.slug,privateKey:r.pem,webhookSecret:r.webhook_secret,clientId:r.client_id,clientSecret:r.client_secret,htmlUrl:r.html_url,installUrl:r.install_url}}const b=`https://github.com/login/oauth`;function x(e){let{clientId:t,clientSecret:n}=e;if(!t||!n)throw Error(`This GitHub App has no OAuth client; create it again from the dashboard`);return{clientId:t,clientSecret:n}}async function ge(e,t,n,r){let{clientId:i,clientSecret:a}=x(e),o=await n(`${b}/access_token`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:i,client_secret:a,...t})}),s=await o.json().catch(()=>({}));if(!o.ok||!s.access_token)throw Error(`GitHub authorization failed: ${s.error??o.status}`);return{accessToken:s.access_token,...s.refresh_token?{refreshToken:s.refresh_token}:{},...s.expires_in?{expiresAt:r+s.expires_in*1e3}:{}}}async function _e(e,t){let n=await t(`${f}/user`,{headers:p(e)}),r=await n.json().catch(()=>({}));if(!n.ok||!r.id||!r.login)throw Error(`GitHub user lookup failed: ${n.status}`);return{id:r.id,login:r.login}}async function ve(e,t,n,r=fetch){for(let i=1;i<=10;i++){let a=await r(`${f}/user/installations?per_page=100&page=${i}`,{headers:p(e)});if(!a.ok)throw Error(`GitHub installation check failed: ${a.status}`);let o=(await a.json()).installations??[],s=o.find(e=>String(e.id)===n&&String(e.app_id)===t);if(s)return{login:s.account?.login??`unknown`,...s.account?.type?{type:s.account.type}:{}};if(o.length<100)return}}async function S(e,t,n,r){let i=new URL(e.url).searchParams.get(`code`);if(!i)throw Error(`GitHub sent no authorization code`);let a=await ge(t,{code:i,...n?{redirect_uri:n}:{}},r,Date.now()),o=await _e(a.accessToken,r);return{id:String(o.id),login:o.login,token:JSON.stringify(a),accessToken:a.accessToken}}const ye={authorizeUrl(e,{publicUrl:t,state:n}){let r=new URLSearchParams({client_id:x(e).clientId,redirect_uri:`${t.replace(/\/$/,``)}/connect/github/callback`,state:n});return`${b}/authorize?${r}`},async exchange(e,t,{publicUrl:n,fetch:r}){let{accessToken:i,...a}=await S(e,t,`${n.replace(/\/$/,``)}/connect/github/callback`,r);return a},async access(e,t,{fetch:n,now:r}){let i=JSON.parse(e);if(!i.expiresAt||i.expiresAt-3e5>r||!i.refreshToken)return{accessToken:i.accessToken};let a=await ge(t,{grant_type:`refresh_token`,refresh_token:i.refreshToken},n,r);return{accessToken:a.accessToken,refreshed:JSON.stringify(a)}}};function be(e){return Array.isArray(e)?t.find(t=>e.every(e=>y[t].includes(e)))??`write`:e}const xe={observe:{metadata:`read`,contents:`read`,pull_requests:`read`,issues:`read`},comment:{metadata:`read`,contents:`read`,pull_requests:`write`,issues:`write`},write:{metadata:`read`,contents:`write`,pull_requests:`write`,issues:`write`}};function C(e=`observe`){return{...xe[be(e)]}}const Se={pull_request:`pull_request`,issue:`issues`,comment:`issue_comment`,mention:`issue_comment`};function Ce(e){let t=e.map(e=>Se[e]).filter(e=>!!e);return[...new Set([...t,`push`,`installation`,`installation_repositories`])]}const we={createPage({publicUrl:e,state:t,definition:n,encodedState:r}){let i=n.integrations.github??{},a=Array.isArray(i.triggers)?i.triggers:Object.keys(i.triggers??{}),o=fe(e,{name:n.name??t.agent,permissions:C(i.tools),events:Ce(a),state:r,isPublic:t.public===!0});return v(`<title>Create GitHub App</title><p>Creating the GitHub App for <b>${_(o.name)}</b>…</p>${me(o,t.owner)}<script>document.forms[0].submit()<\/script>`)},async createCallback(e,{fetch:t}){let n=new URL(e.url).searchParams.get(`code`);if(!n)throw Error(`Missing GitHub manifest code`);let r=await he(n,t),i={appId:r.appId,slug:r.slug,privateKey:r.privateKey,webhookSecret:r.webhookSecret,clientId:r.clientId,clientSecret:r.clientSecret};return{platformAppId:r.appId,name:r.slug,credentials:i}},installUrl(e,t,{state:n}){let{slug:r}=t;return`https://github.com/apps/${r}/installations/new?state=${encodeURIComponent(n)}`},async installCallback(e,{credentials:t,fetch:n}){let r=new URL(e.url).searchParams.get(`installation_id`);if(!r)throw Error(`Missing installation_id`);let{accessToken:i,...a}=await S(e,t,void 0,n),o=await ve(i,t.appId,r,n);if(!o)throw Error(`That installation is not one of yours on GitHub`);return{platformInstallId:r,account:o,installer:a.id,user:a,response:v(`<title>Connected</title><p>GitHub connected. The agent now runs on the repositories you picked; manage them from the app's settings page on GitHub.</p>`)}}};function w(e){return e&&typeof e==`object`?e:{}}function T(e){return e?.agent===!0||e?.type===`Bot`||e?.login?.endsWith(`[bot]`)===!0}function E(e,t){return[e,t].filter(e=>!!e).join(`
|
|
2
|
-
|
|
3
|
-
`)}const Te=[`OWNER`,`MEMBER`],Ee=[`issue_comment`,`pull_request_review_comment`,`ping`];function D(e){try{return JSON.parse(e)}catch{return}}function O(e,t,n){if(!n||!t?.startsWith(`sha256=`))return!1;let r=Buffer.from(i(`sha256`,n).update(e).digest(`hex`),`hex`);return u(Buffer.from(t.slice(7),`hex`),r)}function k(e,t,n,r,i){let a=n.installation?.id,o=A(n,i.headSha),s=i.user??n.sender;if(a===void 0||!o||!i.number)return;let c=s?.author_association;return{integration:`github`,type:r,appId:t.id,installationId:String(a),deliveryId:e.headers.get(`x-github-delivery`)??``,actor:{id:String(s?.id??s?.login??``),...s?.login?{login:s.login}:{},...c?{role:c}:{},...T(s)?{agent:!0}:{}},text:i.body??``,repo:o,chat:{thread:j(`${o.owner}/${o.name}`,i.number,i.kind===`pull`)}}}function A(e,t){let n=e.repository;return n?.owner?.login&&n.name&&n.clone_url&&n.default_branch?{owner:n.owner.login,name:n.name,cloneUrl:n.clone_url,ref:t??n.default_branch,defaultBranch:n.default_branch}:void 0}function j(e,t,n){return{_type:`chat:Thread`,adapterName:`github`,channelId:`github:${e}`,id:`github:${e}:${n?``:`issue:`}${t}`,isDM:!1}}function De(e,t,n,r){let i=w(t),a=e.headers.get(`x-github-event`);if(a===`pull_request`){let t=i.pull_request,a=i.action??``,o=i.requested_reviewer?.login?.toLowerCase();if(!t||![`opened`,`synchronize`,`reopened`,`ready_for_review`,`review_requested`].includes(a)||a===`review_requested`&&o!==`${r.slug}[bot]`.toLowerCase()||t.draft||a!==`review_requested`&&T(t.user)||!t.number||!t.head?.sha||!t.base?.sha)return[];let s=k(e,n,i,`pull_request`,{user:i.sender??t.user,body:E(t.title,t.body),number:t.number,kind:`pull`,headSha:t.head.sha});return s?[s]:[]}if(a===`issues`){let t=i.issue;if(!t||![`opened`,`edited`].includes(i.action??``)||T(i.sender??t.user)||!t.number)return[];let r=k(e,n,i,`issue`,{user:i.sender??t.user,body:E(t.title,t.body),number:t.number});return r?[r]:[]}return[]}async function Oe(e,t,n={}){let{createAppAuth:r}=await import(`@octokit/auth-app`),{token:i}=await r(e)({type:`installation`,installationId:t,...n.repositories?{repositoryNames:n.repositories}:{},...n.permissions?{permissions:n.permissions}:{}});return i}const ke={installation:[`created`,`deleted`,`suspend`,`unsuspend`],installation_repositories:[`added`,`removed`]};function Ae(e,t,n){let r=w(t),i=r.installation?.id,a=r.action;if(i===void 0||!ke[e??``]?.includes(a??``))return;let o=r.installation?.account,s=Date.now(),c=a===`deleted`||a===`suspend`;return{op:c?`delete`:`upsert`,installation:{integration:`github`,id:`${n.id}:${i}`,app:n.id,account:{login:o?.login??r.repository?.owner?.login??`unknown`,...o?.type?{type:o.type}:{}},createdAt:s,...c?{deletedAt:s}:{}}}}function je(e,t){let n=w(e),r=n.repository?.full_name,i=t.branch??n.repository?.default_branch;if(!r||r!==t.agentsRepo||!i||n.ref!==`refs/heads/${i}`||!n.after||!n.commits)return;let a=[...new Set(n.commits.flatMap(e=>[...e.added??[],...e.modified??[],...e.removed??[]]))].filter(e=>e.startsWith(`.coder/agents/`));return a.length?{repo:r,ref:n.after,branch:i,paths:a}:void 0}function Me(e={}){return{...e.repo?{repositories:[e.repo.name]}:{},...e.tools?{permissions:C(e.tools)}:{}}}const Ne={id:`github`,brand:{color:`#000000`,icon:o.path,dark:`#fff`,svg:`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 98 96" fill="none" style="color:light-dark(#000,#fff)"><g clip-path="url(#github-mark-4)"><path d="M 41.44 69.38 C 28.81 67.85 19.91 58.76 19.91 46.99 C 19.91 42.21 21.63 37.04 24.5 33.59 C 23.26 30.43 23.45 23.73 24.88 20.96 C 28.71 20.48 33.88 22.49 36.94 25.27 C 40.58 24.12 44.41 23.54 49.1 23.54 C 53.79 23.54 57.61 24.12 61.06 25.17 C 64.03 22.49 69.29 20.48 73.12 20.96 C 74.46 23.54 74.65 30.24 73.4 33.5 C 76.47 37.13 78.09 42.01 78.09 46.99 C 78.09 58.76 69.19 67.66 56.37 69.29 C 59.62 71.39 61.82 75.99 61.82 81.25 L 61.82 91.21 C 61.82 94.08 64.22 95.7 67.09 94.55 C 84.41 87.95 98 70.63 98 49.19 C 98 22.11 75.99 0 48.9 0 C 21.82 0 0 22.11 0 49.19 C 0 70.44 13.49 88.05 31.68 94.65 C 34.26 95.61 36.75 93.88 36.75 91.3 L 36.75 83.64 C 35.41 84.22 33.69 84.6 32.16 84.6 C 25.84 84.6 22.11 81.16 19.43 74.74 C 18.38 72.16 17.23 70.63 15.03 70.34 C 13.88 70.25 13.49 69.77 13.49 69.19 C 13.49 68.04 15.41 67.18 17.32 67.18 C 20.1 67.18 22.49 68.91 24.98 72.45 C 26.89 75.22 28.9 76.47 31.29 76.47 C 33.69 76.47 35.22 75.61 37.42 73.4 C 39.05 71.78 40.29 70.34 41.44 69.38 Z" fill="black" style="fill:currentColor"/></g><defs><clipPath id="github-mark-4"><rect width="98" height="96" fill="white"/></clipPath></defs></svg>`},name:`GitHub`,description:`Pull requests, issues, and comments on GitHub repositories`,installLabel:`Connect GitHub`,organizationApps:!0,hint:`Cite repository file paths when discussing code. After making changes, link the pull request.`,sample:`github:owner/repo:1`,author:e=>`${e}[bot]`,events:{mention:{description:`Comment from a repo owner or org member mentioning @<agent>; text has the mention stripped.`,on:`mention`,addressed:!0},pull_request:{description:`Opened, updated, or ready non-draft pull request.`},issue:{description:`Opened or edited issue.`},comment:{description:`New non-agent issue or pull-request comment.`,on:`message`,noisy:!0}},tools:{presets:y,server:de,install:`arch=$(uname -m); [ "$arch" = aarch64 ] && arch=arm64; curl -fsSL "https://github.com/github/github-mcp-server/releases/latest/download/github-mcp-server_Linux_$arch.tar.gz" | tar -xz -C /usr/local/bin github-mcp-server`},get app(){return we},auth:{token:(e,t,n)=>Oe(t,e.id.split(`:`).pop(),Me(n)),get user(){return ye},canWrite:async(e,t)=>!!(e.repo&&e.actor.login)&&oe(`${e.repo.owner}/${e.repo.name}`,e.actor.login,t)},repos:{cloneHosts:[`github.com`],readFile:ee,listDir:ne,commit:te,list:(e,t)=>re(t),get:ae,url:se,pullRequests:ie,pullRequest:e=>{let t=/^github:[^:]+:(\d+)(?::|$)/.exec(e.chat?.thread.id??``);return t?Number(t[1]):void 0},pullRequestThread:(e,t)=>j(e,t,!0)},target(e,t){let n=e.headers.get(`x-github-hook-installation-target-id`);if(!n)return;let r=w(D(t)),i=A(r);return{app:n,...r.installation?.id===void 0?{}:{installation:String(r.installation.id)},...i?{repo:i}:{}}},adapter:async e=>(await import(`./adapter-BKVzTDnn.js`)).githubAdapter(e),ownEvents(e,t,n,r){let i=e.headers.get(`x-github-event`);if(!i||Ee.includes(i))return;let{webhookSecret:a,slug:o}=r;if(!O(t,e.headers.get(`x-hub-signature-256`),a))return{invalid:!0};let s=D(t),c=Ae(i,s,n);if(c)return{installation:c};let l=je(s,n);return l?{changes:l}:{events:De(e,s,n,{slug:o})}},event(e,t,n){let r=n.raw.comment?.author_association;return{type:e===`mention`&&!Te.includes(r??``)?`comment`:e,actor:{id:n.author.userId,login:n.author.userName,...r?{role:r}:{}}}}};function M(e,t,n,r){let i=Object.entries(n).filter(([,e])=>e!==void 0).map(([e,t])=>`<input type="hidden" name="${e}" value="${_(String(t))}">`).join(``),a=r.steps.map(e=>`<li>${_(e)}</li>`).join(``),o=r.fields.map(([e,t])=>`<p><label>${_(t)}<br><input name="${e}" size="60" required></label></p>`).join(``);return v(`<title>${_(r.title)}</title><ol>${a}</ol><form method="post" action="${e.replace(/\/$/,``)}/create/${t}/callback">${i}${o}<button type="submit">${_(r.title)}</button></form>`)}async function N(e,t){let n=new URLSearchParams(await e.text()),r=Object.fromEntries(t.map(e=>[e,n.get(e)?.trim()??``])),i=t.filter(e=>!r[e]);if(i.length)throw Error(`Missing ${i.join(`, `)}`);return r}async function P(e,t,n=fetch,r=Date.now()){let i=await n(e,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams(t)}),a=await i.json().catch(()=>({}));if(!i.ok||!a.access_token)throw Error(`${new URL(e).host} refused the token request: ${a.error_description??a.error??i.status}`);return{accessToken:a.access_token,...a.refresh_token?{refreshToken:a.refresh_token}:{},...a.expires_in?{expiresAt:r+a.expires_in*1e3}:{},...a.id_token?{idToken:a.id_token}:{}}}async function F(e,t,n,r=Date.now()){if(!e)throw Error(`The installation has no token; connect it again from the dashboard`);let i=JSON.parse(e);if(!i.refreshToken||(i.expiresAt??1/0)-3e5>r)return i.accessToken;let{idToken:a,...o}=await t(i.refreshToken),s={...o,refreshToken:o.refreshToken??i.refreshToken};return await n?.(JSON.stringify(s)),s.accessToken}function I(e,t){let n=JSON.parse(Buffer.from(e?.split(`.`)[1]??``,`base64url`).toString()||`{}`);if(!(Array.isArray(n.aud)?n.aud:[n.aud]).includes(t))throw Error(`The sign-in returned no identity for this app`);return n}const L=`https://oauth2.googleapis.com/token`,R=`https://www.googleapis.com/auth/gmail.modify`,Pe=[`clientId`,`clientSecret`,`topic`,`subscription`,`serviceAccount`,`label`],z=e=>e.replace(/\/$/,``),Fe=(e,t)=>`${z(e)}/hooks/gmail?app=${encodeURIComponent(t)}`;function B(e,t,n,r){let i=new URLSearchParams({client_id:e.clientId,redirect_uri:t,response_type:`code`,scope:r,state:n});return r.includes(R)&&(i.set(`access_type`,`offline`),i.set(`prompt`,`consent`)),`https://accounts.google.com/o/oauth2/v2/auth?${i}`}async function V(e,t,n,r){let i=new URL(e.url).searchParams.get(`code`);if(!i)throw Error(`Google sent no authorization code`);let{clientId:a,clientSecret:o}=t,{idToken:s,...c}=await P(L,{grant_type:`authorization_code`,code:i,client_id:a,client_secret:o,redirect_uri:n},r),l=I(s,a);if(typeof l.email!=`string`||l.email_verified!==!0)throw Error(`Google returned no verified email address`);return{email:l.email.toLowerCase(),token:c}}const Ie={createPage({publicUrl:e,state:t}){return M(e,`gmail`,t,{title:`Connect Gmail`,steps:[`In a Google Cloud project you own, enable the Gmail API and the Pub/Sub API.`,`Create an OAuth client of type Web application with the redirect URIs ${z(e)}/install/gmail/callback and ${z(e)}/connect/gmail/callback.`,`Create a Pub/Sub topic and give gmail-api-push@system.gserviceaccount.com the Pub/Sub Publisher role on it.`,`Add a push subscription to the topic with authentication on, a service account of yours, and the endpoint ${z(e)}/hooks/gmail?app= followed by the OAuth client ID.`,`Fill in the client ID and secret, the full topic and subscription names, the service account email, and the label to watch, such as INBOX.`],fields:[[`clientId`,`OAuth client ID`],[`clientSecret`,`OAuth client secret`],[`topic`,`Topic, projects/<project>/topics/<name>`],[`subscription`,`Subscription, projects/<project>/subscriptions/<name>`],[`serviceAccount`,`Push service account email`],[`label`,`Label ID`]]})},async createCallback(e,{publicUrl:t,state:n,definition:r}){let i=await N(e,Pe);if(!/^projects\/[^/\s]+\/topics\/[^/\s]+$/.test(i.topic))throw Error(`The topic must be projects/<project>/topics/<name>`);if(!/^projects\/[^/\s]+\/subscriptions\/[^/\s]+$/.test(i.subscription))throw Error(`The subscription must be projects/<project>/subscriptions/<name>`);let a={...i,audience:Fe(t,i.clientId)};return{platformAppId:i.clientId,name:r.name??n.agent,credentials:a}},installUrl(e,t,{publicUrl:n,state:r}){return B(t,`${z(n)}/install/gmail/callback`,r,`openid email ${R}`)},async installCallback(e,{credentials:t,publicUrl:n,fetch:r}){let{email:i,token:a}=await V(e,t,`${z(n)}/install/gmail/callback`,r);if(!a.refreshToken)throw Error(`Google sent no refresh token; remove the app's access from the Google account and connect again`);return{platformInstallId:i,account:{login:i},token:JSON.stringify(a),response:v(`<title>Connected</title><p>Connected ${_(i)}.</p>`)}}},Le={authorizeUrl:(e,{publicUrl:t,state:n})=>B(e,`${z(t)}/connect/gmail/callback`,n,`openid email`),async exchange(e,t,{publicUrl:n,fetch:r}){let{email:i}=await V(e,t,`${z(n)}/connect/gmail/callback`,r);return{id:i,login:i}},access:async e=>({accessToken:e})};function Re(e,t,n){let{clientId:r,clientSecret:i}=t;return F(e.token,e=>P(L,{grant_type:`refresh_token`,refresh_token:e,client_id:r,client_secret:i}),n)}function ze(e){try{let t=JSON.parse(e).message?.data,n=JSON.parse(Buffer.from(t??``,`base64`).toString()).emailAddress;return typeof n==`string`?n.toLowerCase():void 0}catch{return}}function Be(e){let t=e.email.headers.find(e=>e.key===`authentication-results`)?.value??``;return/^\s*mx\.google\.com;/.test(t)&&/\bdmarc=pass\b/.test(t)}const Ve={id:`gmail`,brand:{color:`#FC413D`,icon:s.path,svg:`<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 192 192"><path fill="url(#gmail-mark-5)" d="M 146 44 h 38 v 110 c 0 6.63 -5.37 12 -12 12 h -20 a 6 6 0 0 1 -6 -6 z"/><path fill="#fc413d" d="M 46 44 H 8 v 110 c 0 6.63 5.37 12 12 12 h 20 a 6 6 0 0 0 6 -6 z"/><path fill="url(#gmail-mark-12)" d="M 39.23 30.46 c -8.03 -6.75 -20.02 -5.71 -26.77 2.32 -6.75 8.03 -5.71 20.02 2.32 26.77 l 76.08 63.95 a 8 8 0 0 0 10.29 0 l 76.08 -63.95 c 8.03 -6.75 9.07 -18.74 2.32 -26.77 -6.75 -8.03 -18.74 -9.07 -26.77 -2.32 L 96 78.18 z"/><defs><linearGradient id="gmail-mark-5" x1="165" x2="165" y1="44" y2="166" gradientUnits="userSpaceOnUse"><stop stop-color="#60d673"/><stop offset="0.17" stop-color="#42c868"/><stop offset="0.39" stop-color="#0ebc5f"/><stop offset="0.62" stop-color="#00a9bb"/><stop offset="0.86" stop-color="#3c90ff"/><stop offset="1" stop-color="#3186ff"/></linearGradient><linearGradient id="gmail-mark-12" x1="8" x2="184" y1="46.13" y2="46.13" gradientUnits="userSpaceOnUse"><stop offset="0.08" stop-color="#ff63a0"/><stop offset="0.3" stop-color="#fc413d"/><stop offset="0.5" stop-color="#fc413d"/><stop offset="0.65" stop-color="#fc413d"/><stop offset="0.72" stop-color="#fc5c30"/><stop offset="0.86" stop-color="#feb10c"/><stop offset="0.91" stop-color="#fec700"/><stop offset="0.96" stop-color="#ffdb0f"/></linearGradient></defs></svg>`},name:`Gmail`,description:`Email that arrives under one label of a Gmail mailbox`,installLabel:`Connect Gmail`,sample:`gmail:YWdlbnRAZXhhbXBsZS5jb20:18c0a1b2c3d4e5f6`,hint:`You are answering an email. Write plain text with short paragraphs, no Markdown headings or tables.`,events:{mail:{description:`Email under the watched label from a sender whose domain passes DMARC`,on:`mention`,addressed:!0}},tools:{presets:{observe:[],comment:[],write:[]}},get app(){return Ie},auth:{token:(e,t,n,r)=>Re(e,t,r),get user(){return Le}},target(e,t){let n=new URL(e.url).searchParams.get(`app`),r=ze(t);return n&&r?{app:n,installation:r}:void 0},adapter:async e=>(await import(`./adapter-PeKziOUg.js`)).gmailAdapter(e),async renew(e){await e.watch(),await e.sync()},sync:e=>e.sync(),event(e,t,n){return Be(n.raw)?{type:e,actor:{id:n.author.userId,login:n.author.userId}}:void 0}},H=`https://api.linear.app/oauth/token`,He=[`clientId`,`clientSecret`,`webhookSecret`],U=e=>e.replace(/\/$/,``);async function W(e,t,n){let r=await n(`https://api.linear.app/graphql`,{method:`POST`,headers:{authorization:`Bearer ${e}`,"content-type":`application/json`},body:JSON.stringify({query:t})}),i=await r.json().catch(()=>({}));if(!r.ok||!i.data)throw Error(`Linear refused the query: ${r.status}`);return i.data}function Ue(e,t,n,r){return`https://linear.app/oauth/authorize?${new URLSearchParams({client_id:e.clientId,redirect_uri:t,response_type:`code`,scope:r?`read,write,app:mentionable,app:assignable`:`read`,state:n,...r?{actor:`app`}:{}})}`}function We(e,t,n,r){let i=new URL(e.url).searchParams.get(`code`);if(!i)throw Error(`Linear sent no authorization code`);let{clientId:a,clientSecret:o}=t;return P(H,{grant_type:`authorization_code`,code:i,redirect_uri:n,client_id:a,client_secret:o},r)}const Ge={createPage({publicUrl:e,state:t}){return M(e,`linear`,t,{title:`Connect Linear`,steps:[`In Linear, open Settings, then API, and create a new OAuth application.`,`Add the callback URLs ${U(e)}/install/linear/callback and ${U(e)}/connect/linear/callback.`,`Turn on webhooks with the URL ${U(e)}/hooks/linear?app= followed by the client ID, and select Agent session events.`,`Fill in the client ID, the client secret, and the webhook signing secret.`],fields:[[`clientId`,`Client ID`],[`clientSecret`,`Client secret`],[`webhookSecret`,`Webhook signing secret`]]})},async createCallback(e,{state:t,definition:n}){let r=await N(e,He);return{platformAppId:r.clientId,name:n.name??t.agent,credentials:r}},installUrl(e,t,{publicUrl:n,state:r}){return Ue(t,`${U(n)}/install/linear/callback`,r,!0)},async installCallback(e,{credentials:t,publicUrl:n,fetch:r}){let{idToken:i,...a}=await We(e,t,`${U(n)}/install/linear/callback`,r),{organization:o}=await W(a.accessToken,`query { organization { id name urlKey } }`,r);return{platformInstallId:o.id,account:{login:o.urlKey},token:JSON.stringify(a),response:v(`<title>Connected</title><p>Connected the ${_(o.name)} Linear workspace.</p>`)}}},Ke={authorizeUrl:(e,{publicUrl:t,state:n})=>Ue(e,`${U(t)}/connect/linear/callback`,n,!1),async exchange(e,t,{publicUrl:n,fetch:r}){let{viewer:i}=await W((await We(e,t,`${U(n)}/connect/linear/callback`,r)).accessToken,`query { viewer { id displayName } }`,r);return{id:i.id,login:i.displayName}},access:async e=>({accessToken:e})};function qe(e,t,n){let{clientId:r,clientSecret:i}=t;return F(e.token,e=>P(H,{grant_type:`refresh_token`,refresh_token:e,client_id:r,client_secret:i}),n)}const Je={id:`linear`,brand:{color:`#222326`,icon:c.path,svg:`<svg xmlns="http://www.w3.org/2000/svg" fill="#222326" viewBox="0 0 100 100" style="fill:light-dark(#222326,#fff)"><path d="M 1.23 61.52 c -0.22 -0.95 0.91 -1.55 1.6 -0.86 L 39.33 97.18 c 0.69 0.69 0.09 1.82 -0.86 1.6 C 20.05 94.45 5.55 79.95 1.23 61.52 Z M 0 46.89 c -0.02 0.28 0.09 0.56 0.29 0.76 L 52.35 99.71 c 0.2 0.2 0.48 0.31 0.76 0.29 2.37 -0.15 4.69 -0.46 6.96 -0.93 0.76 -0.16 1.03 -1.1 0.48 -1.65 L 2.58 39.45 c -0.55 -0.55 -1.49 -0.29 -1.65 0.48 -0.47 2.27 -0.78 4.59 -0.93 6.96 Z M 4.21 29.71 c -0.17 0.37 -0.08 0.81 0.21 1.1 l 64.78 64.78 c 0.29 0.29 0.73 0.37 1.1 0.21 1.79 -0.8 3.52 -1.69 5.19 -2.68 0.55 -0.33 0.64 -1.09 0.18 -1.54 L 8.44 24.34 c -0.45 -0.45 -1.21 -0.37 -1.54 0.18 -0.99 1.67 -1.89 3.4 -2.68 5.19 Z M 12.66 18.07 c -0.37 -0.37 -0.39 -0.96 -0.04 -1.35 C 21.78 6.46 35.11 0 49.95 0 77.59 0 100 22.41 100 50.05 c 0 14.84 -6.46 28.17 -16.72 37.34 -0.39 0.35 -0.98 0.33 -1.35 -0.04 L 12.66 18.07 Z"/></svg>`},name:`Linear`,description:`Agent sessions on Linear issues: mentions and assignments`,installLabel:`Connect Linear`,sample:`linear:2f1e6a1c-0000-4000-8000-000000000001:s:5b7d3c2a-0000-4000-8000-000000000002`,hint:`You are working in a Linear issue's agent session. Keep replies short and about the issue; link pull requests you open.`,events:{mention:{description:`Agent session started or prompted by mentioning or assigning the agent`,on:`mention`,addressed:!0,steers:!0}},tools:{presets:{observe:[],comment:[],write:[]}},get app(){return Ge},auth:{token:(e,t,n,r)=>qe(e,t,r),get user(){return Ke}},target(e,t){let n=new URL(e.url).searchParams.get(`app`),r;try{r=JSON.parse(t).organizationId}catch{return}return n&&typeof r==`string`?{app:n,installation:r}:void 0},adapter:async e=>(await import(`./adapter-B0oYCI0S.js`)).linearAdapter(e),event(e,t,n){t.startTyping(`Reading the issue`).catch(()=>{});let r=n.raw.agentSessionPromptContext;return{type:e,actor:{id:n.author.userId,login:n.author.userName},...r?{promptContext:r.slice(0,16384)}:{}}}},Ye=[`channels:history`,`groups:history`,`im:history`,`mpim:history`],Xe=[`channels:read`,`groups:read`,`im:read`,`mpim:read`],G={"conversations.history":Ye,"conversations.replies":Ye,"conversations.info":Xe,"conversations.list":Xe,"users.info":[`users:read`],"users.list":[`users:read`],"reactions.get":[`reactions:read`]},K={"chat.postMessage":[`chat:write`],"reactions.add":[`reactions:write`]},Ze={"chat.postMessage":`thread_ts`,"reactions.add":`timestamp`},Qe={...G,...K};async function $e(e,t,n={}){let r=e.tools??[];if(!r.includes(t)||!Qe[t])throw Error(`Slack method ${t} is not allowed for this task; allowed: ${r.join(`, `)||`none`}`);if(t in K){let[,r,i]=(e.scope?.thread??``).split(`:`);if(!r||n.channel!==r)throw Error(`This task may only write to its connected channel.`);let a=Object.hasOwn(Ze,t)?Ze[t]:void 0;if(!i||!a||n[a]!==i||n.reply_broadcast)throw Error(`This task may only write to its triggering thread.`)}let{callSlackApi:i}=await import(`@chat-adapter/slack/api`),a=await i(t,n,{token:e.token,fetch:e.fetch,contentType:`json`});if(a.error===`missing_scope`)throw Error(`Slack method ${t} needs the ${Qe[t].join(` or `)} scope, which this app does not have`);if(!a.ok)throw Error(`Slack ${t} failed: ${a.error}`);return a}const et={slack_api:{description:`Call a Slack Web API method, such as conversations.replies or chat.postMessage, with its JSON arguments. Only the methods this task allows work; others fail with the allowed list.`,inputSchema:{type:`object`,properties:{method:{type:`string`},args:{type:`object`}},required:[`method`]},handler:(e,t)=>$e(t,String(e.method??``),e.args??{})}};function q(e){return e.replace(/\/$/,``)}function tt(e,{name:t,scopes:n,events:r,extras:i}){let a=q(e);return{display_information:{name:t},features:{bot_user:{display_name:t},...i},oauth_config:{redirect_urls:[`${a}/install/slack/callback`],scopes:{bot:n}},settings:{event_subscriptions:{request_url:`${a}/hooks/slack`,bot_events:r}}}}async function J(e,t,n,r){let{assertSlackOk:i,callSlackApi:a}=await import(`@chat-adapter/slack/api`),o=await a(e,t,{token:n,fetch:r});return i(e,o),o}async function nt(e,t,n=fetch){let r=await J(`apps.manifest.create`,{manifest:JSON.stringify(t)},e,n);return{appId:r.app_id,clientId:r.credentials.client_id,clientSecret:r.credentials.client_secret,signingSecret:r.credentials.signing_secret}}function rt(e,t,n){let r=n.integrations.slack??{},i=Array.isArray(r.triggers)?r.triggers:Object.keys(r.triggers??{});return tt(e,{name:t,scopes:lt(r.tools),events:dt(i),extras:ft(e,n)})}async function it(e,t=fetch){let n=await t(`https://slack.com/api/tooling.tokens.rotate`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({refresh_token:e})}),r=await n.json();if(!n.ok||!r.ok||!r.token||!r.refresh_token)throw Error(`Slack token rotation failed: ${r.error??n.statusText}`);return{token:r.token,refreshToken:r.refresh_token}}function at(e,t,n,r=[]){let i=new URLSearchParams({client_id:e.clientId,state:n,redirect_uri:`${q(t)}/install/slack/callback`});return r.length&&i.set(`scope`,r.join(`,`)),`https://slack.com/oauth/v2/authorize?${i}`}async function ot(e,t,n,r=fetch){let i=await r(`https://slack.com/api/oauth.v2.access`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:t.clientId,client_secret:t.clientSecret,code:e,redirect_uri:`${q(n)}/install/slack/callback`})}),a=await i.json();if(!i.ok||!a.ok||!a.access_token||!a.team?.id||!a.team.name)throw Error(`Slack OAuth failed: ${a.error??i.statusText}`);return{teamId:a.team.id,teamName:a.team.name,accessToken:a.access_token,...a.authed_user?.id?{installer:a.authed_user.id}:{}}}function st(e,t){return[`Hi, I'm ${e}. Ask me here or mention me in any channel; a thread keeps its context for follow-ups.`,"Use `/setup show` to see my settings. Workspace admins configure connected repositories in the Coder dashboard.",...Object.entries(t).map(([e,t])=>`Connect ${e} so I can act there: ${t}`)].join(`
|
|
4
|
-
|
|
5
|
-
`)}const ct={createPage({publicUrl:e,state:t}){return v(`<title>Create Slack app</title><p>Slack creates apps only with an app configuration token. Open <a href="https://api.slack.com/apps" target="_blank">api.slack.com/apps</a>, scroll to “Your App Configuration Tokens”, click Generate, and paste the access token below. Tokens expire after 12 hours; paste the refresh token too so the receiver can keep the app's manifest updated when this agent changes.</p><form method="post" action="${q(e)}/create/slack/callback">${Object.entries(t).filter(([,e])=>e!==void 0).map(([e,t])=>`<input type="hidden" name="${e}" value="${_(String(t))}">`).join(``)}<p><input name="token" size="60" placeholder="xoxe.xoxp-..." required></p><p><input name="refreshToken" size="60" placeholder="xoxe-... refresh token (recommended)"></p><button type="submit">Create Slack app</button></form>`)},async createCallback(e,{publicUrl:t,state:n,definition:r,fetch:i}){let a=new URLSearchParams(await e.text()),o=a.get(`token`);if(!o)throw Error(`Missing configuration token`);let s=r.name??n.agent,c=await nt(o,rt(t,s,r),i),l=a.get(`refreshToken`),u=l?await it(l,i):void 0,d={...c,configToken:u?.token??o,configRefreshToken:u?.refreshToken??l??void 0};return{platformAppId:c.appId,name:s,credentials:d}},async update(e,t,{publicUrl:n,definition:r,fetch:i,saveCredentials:a}){let o=t;if(!o.configRefreshToken)return;let s=await it(o.configRefreshToken,i);await a({...o,configToken:s.token,configRefreshToken:s.refreshToken}),await J(`apps.manifest.update`,{app_id:o.appId,manifest:JSON.stringify(rt(n,e.name,r))},s.token,i)},installUrl(e,t,{publicUrl:n,state:r}){return at(t,n,r)},async installCallback(e,{app:t,credentials:n,publicUrl:r,fetch:i,connect:a}){let o=new URL(e.url).searchParams.get(`code`);if(!o)throw Error(`Missing Slack OAuth code`);let s=await ot(o,n,r,i),c=await a(`${t.id}:${s.teamId}`);s.installer&&await J(`chat.postMessage`,{channel:s.installer,text:st(t.name,c)},s.accessToken,i).catch(()=>void 0);let l=Object.entries(c).map(([e,t])=>`<p><a href="${_(t)}">Connect ${_(e)}</a> so the agent can act there.</p>`).join(``);return{platformInstallId:s.teamId,account:{login:s.teamName},token:s.accessToken,installer:s.installer,...s.installer?{user:{id:s.installer}}:{},response:v(`<title>Connected</title><p>Connected ${_(s.teamName)}.</p>${l}`)}}},Y=[`app_mentions:read`,`channels:history`,`groups:history`,`im:history`,`channels:read`,`users:read`,`reactions:read`,`commands`];function lt(e=`observe`){let t=new Set(Object.keys(G));return(Array.isArray(e)?e.every(e=>t.has(e)):e===`observe`)?[...Y]:[...Y,`chat:write`,`reactions:write`,`im:write`,`assistant:write`]}const ut={mention:[`app_mention`],message:[`message.channels`,`message.groups`,`message.im`],reaction:[`reaction_added`]};function dt(e){return[...new Set(e.flatMap(e=>ut[e]??[]))]}function ft(e,t){return{slash_commands:[{command:`/setup`,url:`${e.replace(/\/$/,``)}/hooks/slack`,description:`Configure this agent`,usage_hint:`repo owner/name | model <name> | show`}],assistant_view:{assistant_description:t.description??`${t.name??`Coder`} in your workspace.`}}}const pt=n.object({type:n.optional(n.string()),team_id:n.optional(n.string()),api_app_id:n.optional(n.string()),challenge:n.optional(n.string()),authorizations:n.optional(n.array(n.object({user_id:n.optional(n.string()),team_id:n.optional(n.string())})))});function mt(e){try{return JSON.parse(e)}catch{let t=new URLSearchParams(e),n=t.get(`payload`);if(!n)return Object.fromEntries(t);try{return JSON.parse(n)}catch{return{}}}}const ht={id:`slack`,brand:{color:`#E3066A`,icon:l.path,svg:`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"><g><path d="M 84.04 252.77 c 0 23.13 -18.89 42.02 -42.02 42.02 S 0 275.9 0 252.77 s 18.89 -42.02 42.02 -42.02 h 42.02 v 42.02 Z" fill="#e3066a"/><path d="M 105.21 252.77 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 v 105.21 c 0 23.13 -18.89 42.02 -42.02 42.02 s -42.02 -18.89 -42.02 -42.02 c 0 0 0 -105.21 0 -105.21 Z" fill="#e3066a"/></g><g><path d="M 147.23 84.04 c -23.13 0 -42.02 -18.89 -42.02 -42.02 S 124.1 0 147.23 0 s 42.02 18.89 42.02 42.02 v 42.02 h -42.02 Z" fill="#00b3ff"/><path d="M 147.23 105.21 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 H 42.02 c -23.13 0 -42.02 -18.89 -42.02 -42.02 s 18.89 -42.02 42.02 -42.02 c 0 0 105.21 0 105.21 0 Z" fill="#00b3ff"/></g><g><path d="M 315.96 147.23 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 -18.89 42.02 -42.02 42.02 h -42.02 v -42.02 Z" fill="#41b658"/><path d="M 294.79 147.23 c 0 23.13 -18.89 42.02 -42.02 42.02 s -42.02 -18.89 -42.02 -42.02 V 42.02 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 v 105.21 Z" fill="#41b658"/></g><g><path d="M 252.77 315.96 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 -42.02 -18.89 -42.02 -42.02 v -42.02 h 42.02 Z" fill="#fcc003"/><path d="M 252.77 294.79 c -23.13 0 -42.02 -18.89 -42.02 -42.02 s 18.89 -42.02 42.02 -42.02 h 105.21 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 h -105.21 Z" fill="#fcc003"/></g></svg>`},name:`Slack`,description:`Mentions, messages, and reactions in a Slack workspace`,installLabel:`Add to Slack`,sample:`slack:C0000000000:1700000000.000100`,hint:`Do not use Markdown headings. Use short paragraphs and code spans, and reply only in the thread where you were addressed.`,events:{mention:{description:`Slack app mention`,on:`mention`,addressed:!0},command:{description:`/setup and other slash commands`,on:`command`},reaction:{description:`Reaction added`,on:`reaction`},message:{description:`Channel, group, or direct message`,on:`message`,noisy:!0,addressed:!0}},tools:{presets:{observe:Object.keys(G),comment:[...Object.keys(G),...Object.keys(K)],write:[...Object.keys(G),...Object.keys(K)]},serve:et},get app(){return ct},target(e,t){let n=pt.safeParse(mt(t)).data;if(n?.type===`url_verification`&&n.challenge)return new Response(n.challenge);let r=n?.authorizations?.[0]?.team_id??n?.team_id??mt(t).team?.id,i=n?.authorizations?.[0]?.user_id;return n?.api_app_id?{app:n.api_app_id,...r?{installation:r}:{},...i?{self:i}:{}}:void 0},adapter:async e=>(await import(`./adapter-DaiJMOYo.js`)).slackAdapter(e),reactionId:e=>e.raw.event_ts,auth:{async token(e){if(!e.token)throw Error(`Slack installation ${e.id} has no bot token`);return e.token}}},X=`https://login.microsoftonline.com`,gt=`https://api.botframework.com/.default`,_t=[`appId`,`appPassword`,`tenantId`],Z=e=>e.replace(/\/$/,``),vt={createPage({publicUrl:e,state:t}){return M(e,`teams`,t,{title:`Connect Microsoft Teams`,steps:[`In the Azure portal, create an Azure Bot of type Single Tenant with a new app registration.`,`Set its messaging endpoint to ${Z(e)}/hooks/teams?app= followed by the Microsoft App ID, and turn on the Microsoft Teams channel.`,`In the app registration, add the web redirect URI ${Z(e)}/install/teams/callback and create a client secret.`,`In the Teams Developer Portal, create a Teams app for the bot and install it in your organization.`,`Fill in the Microsoft App ID, the client secret, and the directory (tenant) ID.`],fields:[[`appId`,`Microsoft App ID`],[`appPassword`,`Client secret`],[`tenantId`,`Directory (tenant) ID`]]})},async createCallback(e,{state:t,definition:n}){let r=await N(e,_t);return{platformAppId:r.appId,name:n.name??t.agent,credentials:r}},installUrl(e,t,{publicUrl:n,state:r}){let{appId:i,tenantId:a}=t,o=new URLSearchParams({client_id:i,response_type:`code`,redirect_uri:`${Z(n)}/install/teams/callback`,scope:`openid profile`,state:r});return`${X}/${encodeURIComponent(a)}/oauth2/v2.0/authorize?${o}`},async installCallback(e,{credentials:t,publicUrl:n,fetch:r}){let i=new URL(e.url).searchParams.get(`code`);if(!i)throw Error(`Microsoft sent no authorization code`);let{appId:a,appPassword:o,tenantId:s}=t,{idToken:c}=await P(`${X}/${encodeURIComponent(s)}/oauth2/v2.0/token`,{grant_type:`authorization_code`,code:i,client_id:a,client_secret:o,redirect_uri:`${Z(n)}/install/teams/callback`,scope:`openid profile`},r),l=I(c,a);if(l.tid!==s)throw Error(`That account belongs to another Microsoft directory than the bot`);let u=String(l.preferred_username??``).split(`@`)[1]||s;return{platformInstallId:s,account:{login:u},response:v(`<title>Connected</title><p>Connected Microsoft Teams for ${_(u)}.</p>`)}}};async function yt(e){let{appId:t,appPassword:n,tenantId:r}=e;return(await P(`${X}/${encodeURIComponent(r)}/oauth2/v2.0/token`,{grant_type:`client_credentials`,client_id:t,client_secret:n,scope:gt})).accessToken}const bt={id:`teams`,brand:{color:`#4B53BC`,icon:`M3 4h18v4h-7v12h-4V8H3z`,svg:`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none"><path d="M 22 20 H 34 C 37.31 20 40 22.69 40 26 V 36 C 40 39.31 37.31 42 34 42 C 30.69 42 28 39.31 28 36 V 26 C 28 22.69 25.31 20 22 20 Z" fill="url(#teams-mark-15)"/><path d="M 8 24 C 8 20.69 10.69 18 14 18 H 22 C 25.31 18 28 20.69 28 24 V 36 C 28 39.31 30.69 42 34 42 L 18 42 C 12.48 42 8 37.52 8 32 V 24 Z" fill="url(#teams-mark-20)"/><path d="M 8 24 C 8 20.69 10.69 18 14 18 H 22 C 25.31 18 28 20.69 28 24 V 36 C 28 39.31 30.69 42 34 42 L 18 42 C 12.48 42 8 37.52 8 32 V 24 Z" fill="url(#teams-mark-24)" fill-opacity="0.7"/><path d="M 8 24 C 8 20.69 10.69 18 14 18 H 22 C 25.31 18 28 20.69 28 24 V 36 C 28 39.31 30.69 42 34 42 L 18 42 C 12.48 42 8 37.52 8 32 V 24 Z" fill="url(#teams-mark-27)" fill-opacity="0.7"/><path d="M 33 18 C 35.76 18 38 15.76 38 13 C 38 10.24 35.76 8 33 8 C 30.24 8 28 10.24 28 13 C 28 15.76 30.24 18 33 18 Z" fill="url(#teams-mark-30)"/><path d="M 33 18 C 35.76 18 38 15.76 38 13 C 38 10.24 35.76 8 33 8 C 30.24 8 28 10.24 28 13 C 28 15.76 30.24 18 33 18 Z" fill="url(#teams-mark-33)" fill-opacity="0.46"/><path d="M 33 18 C 35.76 18 38 15.76 38 13 C 38 10.24 35.76 8 33 8 C 30.24 8 28 10.24 28 13 C 28 15.76 30.24 18 33 18 Z" fill="url(#teams-mark-36)" fill-opacity="0.4"/><path d="M 18 16 C 21.31 16 24 13.31 24 10 C 24 6.69 21.31 4 18 4 C 14.69 4 12 6.69 12 10 C 12 13.31 14.69 16 18 16 Z" fill="url(#teams-mark-39)"/><path d="M 18 16 C 21.31 16 24 13.31 24 10 C 24 6.69 21.31 4 18 4 C 14.69 4 12 6.69 12 10 C 12 13.31 14.69 16 18 16 Z" fill="url(#teams-mark-42)" fill-opacity="0.6"/><path d="M 18 16 C 21.31 16 24 13.31 24 10 C 24 6.69 21.31 4 18 4 C 14.69 4 12 6.69 12 10 C 12 13.31 14.69 16 18 16 Z" fill="url(#teams-mark-45)" fill-opacity="0.5"/><rect x="4" y="23" width="16" height="16" rx="3.25" fill="url(#teams-mark-48)"/><rect x="4" y="23" width="16" height="16" rx="3.25" fill="url(#teams-mark-51)" fill-opacity="0.7"/><path d="M 15.48 28.11 H 13.03 V 35.57 H 10.97 V 28.11 H 8.52 V 26.43 H 15.48 V 28.11 Z" fill="white"/><defs><radialGradient id="teams-mark-15" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(39.8 22.17) scale(13.48 33.27)"><stop stop-color="#A98AFF"/><stop offset="0.14" stop-color="#8C75FF"/><stop offset="0.56" stop-color="#5F50E2"/><stop offset="0.9" stop-color="#3C2CB8"/></radialGradient><radialGradient id="teams-mark-20" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(8.81 16.4) rotate(68.15) scale(32.75 33.12)"><stop stop-color="#85C2FF"/><stop offset="0.69" stop-color="#7588FF"/><stop offset="1" stop-color="#6459FE"/></radialGradient><linearGradient id="teams-mark-24" x1="20.59" y1="18" x2="20.59" y2="42" gradientUnits="userSpaceOnUse"><stop offset="0.8" stop-color="#6864F6" stop-opacity="0"/><stop offset="1" stop-color="#5149DE"/></linearGradient><radialGradient id="teams-mark-27" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(27.5 17.2) rotate(113.33) scale(19.22 15.43)"><stop stop-color="#BD96FF"/><stop offset="0.69" stop-color="#BD96FF" stop-opacity="0"/></radialGradient><radialGradient id="teams-mark-30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(33 11.57) rotate(-90) scale(10 12.62)"><stop offset="0.27" stop-color="#6868F7"/><stop offset="1" stop-color="#3923B1"/></radialGradient><radialGradient id="teams-mark-33" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(28.87 10.54) rotate(40.05) scale(7.15 10.34)"><stop offset="0.27" stop-color="#A1D3FF"/><stop offset="0.81" stop-color="#A1D3FF" stop-opacity="0"/></radialGradient><radialGradient id="teams-mark-36" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(36.98 10.37) rotate(-41.66) scale(8.51 20.88)"><stop stop-color="#E3ACFD"/><stop offset="0.82" stop-color="#9FA2FF" stop-opacity="0"/></radialGradient><radialGradient id="teams-mark-39" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(18 8.29) rotate(-90) scale(12 15.15)"><stop offset="0.27" stop-color="#8282FF"/><stop offset="1" stop-color="#3923B1"/></radialGradient><radialGradient id="teams-mark-42" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(13.04 7.05) rotate(40.05) scale(8.58 12.4)"><stop offset="0.27" stop-color="#A1D3FF"/><stop offset="0.81" stop-color="#A1D3FF" stop-opacity="0"/></radialGradient><radialGradient id="teams-mark-45" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(22.78 6.84) rotate(-41.66) scale(10.22 25.06)"><stop stop-color="#E3ACFD"/><stop offset="0.82" stop-color="#9FA2FF" stop-opacity="0"/></radialGradient><radialGradient id="teams-mark-48" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(4 23) rotate(45) scale(22.63)"><stop offset="0.05" stop-color="#688EFF"/><stop offset="0.95" stop-color="#230F94"/></radialGradient><radialGradient id="teams-mark-51" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(12 32.6) rotate(90) scale(11.2 13.07)"><stop offset="0.57" stop-color="#6965F6" stop-opacity="0"/><stop offset="1" stop-color="#8F8FFF"/></radialGradient></defs></svg>`},name:`Microsoft Teams`,description:`Mentions, messages, and reactions in Microsoft Teams`,installLabel:`Add to Teams`,sample:`teams:MTk6Z2VuZXJhbEB0aHJlYWQudGFjdjI:aHR0cHM6Ly9zbWJhLnRyYWZmaWNtYW5hZ2VyLm5ldC90ZWFtcy8:channel`,history:!1,hint:`Keep replies short. Use plain paragraphs and code spans, no Markdown headings, and reply in the conversation where you were addressed.`,events:{mention:{description:`Teams mention of the bot, or a direct message to it`,on:`mention`,addressed:!0},reaction:{description:`Reaction added`,on:`reaction`},message:{description:`Channel or group chat message the bot can read`,on:`message`,noisy:!0,addressed:!0}},tools:{presets:{observe:[],comment:[],write:[]}},get app(){return vt},auth:{token:(e,t)=>yt(t)},target(e,t){let n=new URL(e.url).searchParams.get(`app`),r;try{let e=JSON.parse(t);r=e.channelData?.tenant?.id??e.conversation?.tenantId}catch{return}return n&&typeof r==`string`?{app:n,installation:r}:void 0},reactionId:e=>e.raw.id,adapter:async e=>(await import(`./adapter-DPInwbJG.js`)).teamsAdapter(e)};var xt=e({INTEGRATIONS:()=>Q,enabledIntegrations:()=>St,repositoryReader:()=>$});const Q={github:Ne,slack:ht,teams:bt,gmail:Ve,linear:Je};function St(e){if(!e)return Q;let t=e.filter(e=>!Q[e]);if(t.length)throw Error(`Unknown integration ${t.join(`, `)} in SERVER_INTEGRATIONS; pick from ${Object.keys(Q).join(`, `)}`);return Object.fromEntries(e.map(e=>[e,Q[e]]))}const $=e=>Object.values(e).find(e=>e.repos);export{gt as a,_ as c,d,$ as i,v as l,St as n,O as o,xt as r,y as s,Q as t,u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";var t=e({LogView:()=>a,isApproval:()=>n,logEntry:()=>i});const n=e=>e.includes(`approval`)||e===`sidecar-decision`||e===`auto-review`;function r(e,t){return t?e.split(`${t}/`).join(``).split(t).join(`.`):e}function i(e){try{let t=JSON.parse(e);if(t&&typeof t==`object`&&!Array.isArray(t)){let e=`kind`in t&&typeof t.kind==`string`?t.kind:void 0,n=`message`in t&&typeof t.message==`string`?t.message:void 0;if(e!==void 0||n!==void 0)return{...t,kind:e,message:n,at:`at`in t&&typeof t.at==`string`?t.at:void 0}}}catch{}}var a=class{cwd;prevKind=null;lastAssistant=``;lastTool=null;lastToolText=``;lastUsageTotal=0;constructor(e){this.cwd=e}get lastAssistantMessage(){return this.lastAssistant}reduce(e){let t=e.entry,i=t?String(t.kind??`status`):`line`,a={seq:e.seq,at:e.at,kind:`status`,title:``,sourceKind:i,separated:!1,tone:`muted`};if(!t)a.kind=e.level===`err`?`error`:e.level===`sys`?`status`:`line`,a.title=r(e.line,this.cwd),e.level===`err`&&(a.tone=`error`);else if(i===`usage`){let e=t.tokens;if(!e)return[];let n=this.lastUsageTotal>0,r=e.total-this.lastUsageTotal;if(!n||r<Math.max(2e4,this.lastUsageTotal*.2))return this.lastUsageTotal=Math.max(this.lastUsageTotal,e.total),[];this.lastUsageTotal=e.total,a.kind=`usage`,a.tokens=e,a.title=`ctx ${o(e.input+e.cachedInput)} · out ${o(e.output)}`}else if(n(i)&&(t.decision||!t.message)){a.kind=`approval`;let e=i===`sidecar-decision`?`sidecar`:i===`auto-review`?`auto-review`:`approval`,n=t.riskLevel?`(${String(t.riskLevel)} risk)`:``,o=r(t.summary?String(t.summary):``,this.cwd),s=o.slice(o.indexOf(`: `)+2),c=o&&s&&this.lastToolText.includes(s)?``:o,l=c?``:String(t.method??``);a.title=`${[e,String(t.decision??``),n,l].filter(Boolean).join(` `)}${c?` · ${c}`:``}`,a.detail=r(t.reason?String(t.reason):``,this.cwd)}else{let e=t.message?String(t.message):String(t.kind??``);if(!e&&!(i===`tool-result`&&(t.exitCode!=null||t.isError)))return[];if(a.title=r(e,this.cwd),i===`assistant`)a.kind=`assistant`,a.tone=void 0,this.lastAssistant=a.title;else if(i===`error`||i===`steer`)a.kind=i,a.tone=i===`error`?`error`:`warning`;else if(i===`reasoning`)a.kind=`reasoning`,a.durationMs=typeof t.durationMs==`number`?t.durationMs:0;else if(i===`tool`)a.kind=`tool`,this.lastTool=t.tool?String(t.tool):null,this.lastToolText=a.title;else if(i===`tool-result`){a.kind=`tool-result`,a.exitCode=typeof t.exitCode==`number`?t.exitCode:void 0,a.tone=a.exitCode!==void 0&&a.exitCode!==0||t.isError===!0?`error`:`muted`,a.durationMs=typeof t.durationMs==`number`?t.durationMs:0;let e=t.tool?String(t.tool):null;e&&e!==this.lastTool&&(a.tool=e)}}return this.prevKind!==null&&(a.separated=[`assistant`,`error`,`steer`].includes(i)||i===`reasoning`&&this.prevKind!==`reasoning`||i===`tool`&&[`assistant`,`reasoning`].includes(this.prevKind)),this.prevKind=i,[a]}};function o(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(+(e<1e4))}k`:`${(e/1e6).toFixed(1)}M`}export{t as n,i as t};
|
package/dist/models-_5LVGC3m.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{$ as e,A as t,C as n,K as r,Q as i,U as a,W as o,ct as s,dt as c,et as l,gt as u,ht as d,lt as f,nt as p,q as m,tn as h,tt as g,xt as _,yt as v}from"./dispatch-BKeAch9E.js";import{t as y}from"./wire-BeT1Axeo.js";import b from"node:process";const x=new Set([`codex`,`claude`,`custom`]);async function S(e,t={}){let n=`key`in t?t.key:e.envKey?b.env[e.envKey]:void 0,r=t.fetch??fetch,a=i(e.baseUrl,`models`),o=null;for(let t of a)try{let i=await r(t,{headers:n?{Authorization:`Bearer ${n}`}:{},signal:AbortSignal.timeout(5e3)});if(!i.ok){o=i.status===404?{reachable:!0,modelListed:null,models:null,detail:`endpoint reachable (no model list to verify against)`}:{reachable:!1,modelListed:null,models:null,detail:`${t} -> HTTP ${i.status}`};continue}let a=await i.json().catch(()=>null),s=Array.isArray(a?.data)?a.data.map(e=>e.id).filter(e=>typeof e==`string`):null;if(!s)return{reachable:!0,modelListed:null,models:null,detail:`endpoint reachable`};if(!e.model)return{reachable:!0,modelListed:null,models:s,detail:`endpoint reachable; ${s.length} models listed`};let c=s.includes(e.model);return{reachable:!0,modelListed:c,models:s,detail:c?`endpoint reachable; model "${e.model}" listed`:`endpoint reachable, but "${e.model}" is not in its model list`}}catch(e){o={reachable:!1,modelListed:null,models:null,detail:`${t} unreachable (${e instanceof Error?e.message:String(e)})`}}return o}function C(e,t){v(e,e=>{e.models=e.models??{},t(e.models)})}function w(e,t){return e.workspace?u(h(t)):d()}function T(t){let n=t.models??{},r=Object.entries(n).filter(e=>g(e[1])),i=e=>`${e.provider}:${e.model}${e.effort?`:${e.effort}`:``}`,a=Object.entries(n).filter(t=>e(t[1])).map(([e,t])=>{let n=t.provider===`claude`?o:m,r=n[t.model]??t.model,a=l(e)?e:Object.entries(n).find(([,e])=>e===r)?.[0];return{name:e,spec:i(t),replaces:a,disabled:!!t.disabled}}),s=new Map;for(let e of a)e.replaces&&(e.name===e.replaces||!s.has(e.replaces))&&s.get(e.replaces)?.name!==e.replaces&&s.set(e.replaces,e);let c=e=>!!n[e]?.disabled,u=a.filter(e=>![...s.values()].some(t=>t.name===e.name));return{models:n,endpoints:r,providerRows:(e,t)=>[...Object.entries(t).map(([e,t])=>{let n=s.get(e);return n?{alias:n.name,spec:n.spec,overrides:e,disabled:n.disabled}:{alias:e,model:t,builtin:!0,disabled:c(e)}}),...u.filter(t=>t.spec.startsWith(`${e}:`)).map(({name:e,spec:t,disabled:n})=>({alias:e,spec:t,disabled:n}))],toggledSlugs:Object.entries(n).filter(([t,n])=>!g(n)&&!e(n)&&!l(t)).map(([e,t])=>({name:e,disabled:!!t.disabled})),disabled:c}}async function E(e){let{endpoints:t,providerRows:n,toggledSlugs:r}=T(p(e)),i=await Promise.all(t.map(async([e,t])=>({name:e,...t,probe:await S(t)})));return{codex:n(`codex`,m),claude:n(`claude`,o),custom:i,...r.length?{toggles:r}:{}}}async function D(e,r,i,a){let o=await y(r),s=o?.wireApi===`responses`;o?(r.wireApi=o.wireApi,r.baseUrl=o.baseUrl??r.baseUrl):delete r.wireApi,C(i,t=>{t[e]=r});let c=await S(r),l=n(t(a)),u=t(a);return{name:e,entry:r,file:i,probe:c,codex:u,install:l,nativeResponses:s,keyMissing:!!(r.envKey&&!b.env[r.envKey]),ready:c.reachable&&u.available}}const O=`Usage: coder model add <name> --base-url <url> --model <id> [--env-key VAR]`,k=`Usage: coder model update <name> [--base-url <url>] [--model <id>] [--env-key VAR]`,A=`Usage: coder model alias <name> <spec> (e.g. coder model alias fast codex:luna)`,j=`List them: coder model list`;function M(e,t,n){if(!e)throw new _(`invalid-option`,`Missing model name.`,{hint:n});if(!/^[a-z][a-z0-9-]*$/.test(e))throw new _(`invalid-option`,`Invalid model name "${e}". Use lowercase kebab-case (e.g. qwen-local).`);if(x.has(e)||t===`model`&&l(e))throw new _(`invalid-option`,`"${e}" is reserved; pick another name.`)}async function N(t,n,r){M(n,`model`,O);let i=p(t).models?.[n];if(i)throw new _(`invalid-option`,g(i)?`Custom model "${n}" already exists.`:`"${n}" is already configured as an ${e(i)?`alias`:`entry`}; remove it first.`,{hint:`Change it: coder model update ${n} [--base-url|--model|--env-key], or remove it first.`});if(!r.baseUrl||!r.model)throw new _(`invalid-option`,`Missing --base-url or --model.`,{hint:O});return D(n,{baseUrl:s(r.baseUrl),model:r.model,...r.envKey?{envKey:r.envKey}:{}},w({workspace:r.workspace},t),t)}async function P(e,t,n){let r=t?p(e).models?.[t]:void 0,i=r&&g(r)?r:void 0;if(!t||!i)throw new _(`invalid-option`,t?`No custom model named "${t}".`:`Missing model name.`,{hint:t?j:k});if(!n.baseUrl&&!n.model&&!n.envKey)throw new _(`invalid-option`,`Nothing to update: pass --base-url, --model, or --env-key.`,{hint:k});return D(t,{...i,...n.baseUrl?{baseUrl:s(n.baseUrl)}:{},...n.model?{model:n.model}:{},...n.envKey?{envKey:n.envKey}:{}},w({workspace:n.workspace},e),e)}function F(e,t,n={}){if(!t||!p(e).models?.[t])throw new _(`invalid-option`,t?`No custom model named "${t}".`:`Missing model name.`,{hint:t?j:`Usage: coder model remove <name>`});let r=w({workspace:n.workspace},e);return v(r,e=>c(e,t)),{removed:t,file:r}}function I(e,t,n,i={}){M(t,`alias`,A);let s=p(e),c=s.models?.[t];if(c&&g(c))throw new _(`invalid-option`,`"${t}" is a custom model name; pick another alias name.`);if(!n)throw new _(`invalid-option`,`Missing alias spec.`,{hint:A});let l;try{l=f(n,s)}catch(e){throw new _(`invalid-option`,e instanceof Error?e.message:String(e),{hint:A})}if(!l||!l.model)throw new _(`invalid-option`,`Alias spec "${n}" does not resolve to a model.`,{hint:A});if(l.engine===`custom`)throw new _(`invalid-option`,`"${n}" names a custom model, which is already dispatchable by name; aliases target codex/claude models.`);let u=n.split(`:`).some(e=>r.has(e.trim())||a.has(e.trim())),d=l.engine===`claude`?o:m,h={provider:l.engine,model:d[l.model]??l.model,...u&&l.effort?{effort:l.effort}:{}},v=w({workspace:i.workspace},e);return C(v,e=>{e[t]=h}),{alias:t,...h,file:v}}function L(t,n,r={}){let i=n?p(t).models?.[n]:void 0;if(!n||!i||!e(i))throw new _(`invalid-option`,n?`No alias named "${n}".`:`Missing alias name.`,{hint:n?j:`Usage: coder model unalias <name>`});let a=w({workspace:r.workspace},t);return v(a,e=>c(e,n)),{unaliased:n,file:a}}function R(t,n,r,i={}){if(!n)throw new _(`invalid-option`,`Missing model name.`,{hint:`Usage: coder model ${r?`disable`:`enable`} <name>`});let a=!!p(t).models?.[n],o=w({workspace:i.workspace},t);return C(o,t=>{let i=t[n];if(!i){r?t[n]={disabled:!0}:a&&(t[n]={disabled:!1});return}g(i)||e(i)?r?i.disabled=!0:delete i.disabled:r?i.disabled=!0:delete t[n]}),{name:n,disabled:r,file:o}}export{R as a,S as c,F as i,I as n,L as o,E as r,P as s,N as t};
|