@wular/coder 0.3.18 → 0.4.0
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 +18 -16
- package/bin/coder.mjs +3 -1
- package/dist/actions-Mk3FSlpJ.js +20 -0
- package/dist/adapter-B0oYCI0S.js +1 -0
- package/dist/adapter-BKVzTDnn.js +1 -0
- package/dist/adapter-DPInwbJG.js +1 -0
- package/dist/adapter-DaiJMOYo.js +1 -0
- package/dist/adapter-PeKziOUg.js +1 -0
- package/dist/add-BxpLHnvD.js +1 -0
- package/dist/add-CE-70LFs.js +1 -0
- package/dist/add-U-pty9qJ.js +6 -0
- package/dist/add-ej0X9e3a.js +1 -0
- package/dist/add-json-CEa-6luW.js +1 -0
- package/dist/agent-BsYx3Odz.js +3 -0
- package/dist/agent-JdtZozvP.js +1 -0
- package/dist/alias-DX-Bm86x.js +2 -0
- package/dist/app-BT5f7zL5.js +1 -0
- package/dist/approvals-C-AvFt6s.js +2 -0
- package/dist/approve-DOmpQRNd.js +2 -0
- package/dist/apps-CjfrZyM5.js +1 -0
- package/dist/archive-BUB8gFKD.js +4 -0
- package/dist/archive-BziJ1rQ-.js +3 -0
- package/dist/archive-sweep-CtBcARgN.js +1 -0
- package/dist/args-BOEEdpWk.js +1 -0
- package/dist/ask-dE3U3ss2.js +4 -0
- package/dist/auth-BFny--17.js +1 -0
- package/dist/auth-DWHIzqbA.js +1 -0
- package/dist/builtin/coder/agent.json +24 -0
- package/dist/builtin/coder/system.md +17 -0
- package/dist/chat-3Znsevah.js +1 -0
- package/dist/chat-B_yhNTo0.js +13 -0
- package/dist/chat-bridge-BS9WtP3X.js +2 -0
- package/dist/cli-BilSDkvE.js +9 -0
- package/dist/cli.d.ts +71 -1
- package/dist/cli.js +1 -91
- package/dist/client-D9IoAuDD.js +1 -0
- package/dist/config-Da_cwoxI.js +3 -0
- package/dist/create-C_iMJV4Y.js +1 -0
- package/dist/credentials-B1jv6dkg.js +1 -0
- package/dist/dash/manifest.json +3427 -0
- package/dist/dash/public/assets/apple-touch-icon.png +0 -0
- package/dist/dash/public/assets/chunks/agent-pills-69c965aae1737cef.js +1 -0
- package/dist/dash/public/assets/chunks/agent-settings-form-a1ce70812eea3f20.js +1 -0
- package/dist/dash/public/assets/chunks/agents-grid-f62180478e43c192.js +1 -0
- package/dist/dash/public/assets/chunks/badge-d07f35e9abc80e14.js +1 -0
- package/dist/dash/public/assets/chunks/card-be04148b64223a52.js +1 -0
- package/dist/dash/public/assets/chunks/combo-32c321a7a84fa902.js +1 -0
- package/dist/dash/public/assets/chunks/composer-aec9c3c691f1f79a.js +1 -0
- package/dist/dash/public/assets/chunks/composer-data-6f7608fed13f3dd7.js +1 -0
- package/dist/dash/public/assets/chunks/composer-e56860d72742379e.js +1 -0
- package/dist/dash/public/assets/chunks/confirm-b4e2c16aef4b3431.js +1 -0
- package/dist/dash/public/assets/chunks/connect-apps-a5a63941e287c33f.js +1 -0
- package/dist/dash/public/assets/chunks/connect-repositories-e4c049b5b4384623.js +1 -0
- package/dist/dash/public/assets/chunks/credentials-list-2b7d0c771b89f9c5.js +2 -0
- package/dist/dash/public/assets/chunks/custom-range-53b70e0d9eeae84e.js +1 -0
- package/dist/dash/public/assets/chunks/editor-691d2bcecb1ecb87.js +7 -0
- package/dist/dash/public/assets/chunks/engines-list-a5fe1671601ce3b0.js +1 -0
- package/dist/dash/public/assets/chunks/field-9e12e5fc8774b6e5.js +1 -0
- package/dist/dash/public/assets/chunks/format-eb03fc9d9744d960.js +1 -0
- package/dist/dash/public/assets/chunks/heads-4041a925d63ab116.js +1 -0
- package/dist/dash/public/assets/chunks/instructions-4e0d18b9b40edbd7.js +2 -0
- package/dist/dash/public/assets/chunks/instructions-b00959bd4bb70502.js +1 -0
- package/dist/dash/public/assets/chunks/list-d7eb9e02cf261fbe.js +1 -0
- package/dist/dash/public/assets/chunks/mcp-list-a450533109045ef5.js +1 -0
- package/dist/dash/public/assets/chunks/model-options-15c53331a2f28a4f.js +1 -0
- package/dist/dash/public/assets/chunks/models-list-1e273c6843858148.js +1 -0
- package/dist/dash/public/assets/chunks/paged-bc6fa0c2b9d52ed7.js +1 -0
- package/dist/dash/public/assets/chunks/platform-actions-87f3f76ec1b840cb.js +1 -0
- package/dist/dash/public/assets/chunks/runners-list-fc7cdae4fa93e78b.js +1 -0
- package/dist/dash/public/assets/chunks/runtime-246221e985d863e5-1.js +2 -0
- package/dist/dash/public/assets/chunks/segmented-6091dfb2f954799f.js +1 -0
- package/dist/dash/public/assets/chunks/select-dd09a6b9544cfde2.js +1 -0
- package/dist/dash/public/assets/chunks/sentinel-ff7143a47fd22835.js +1 -0
- package/dist/dash/public/assets/chunks/shared-init-246221e985d863e5-2.js +1 -0
- package/dist/dash/public/assets/chunks/shared-init-8f2ac936c95a7f7b.js +1 -0
- package/dist/dash/public/assets/chunks/shared-init-986901c810947c12.js +5 -0
- package/dist/dash/public/assets/chunks/shared-init-baceed9fd2d43661.js +2 -0
- package/dist/dash/public/assets/chunks/tail-5a5bfcd308535d70.js +1 -0
- package/dist/dash/public/assets/chunks/task-actions-7919ca0e901131f4.js +1 -0
- package/dist/dash/public/assets/chunks/task-fa8b82e95e771c4a.js +1 -0
- package/dist/dash/public/assets/chunks/task-view-e8a0f99c992fa11e.js +3 -0
- package/dist/dash/public/assets/chunks/tasks-list-7b72f5b295349532.js +1 -0
- package/dist/dash/public/assets/chunks/toolbar-9b18a5d26dee37c3.js +1 -0
- package/dist/dash/public/assets/chunks/versions-list-8cdf3a41c56b2152.js +1 -0
- package/dist/dash/public/assets/chunks/wular-pnext-246221e985d863e5-0.js +1 -0
- package/dist/dash/public/assets/connect-382b1729a7ae7808.css +1 -0
- package/dist/dash/public/assets/dash-9e02d5d1a6d42ee3.css +1 -0
- package/dist/dash/public/assets/dash-account-04859899c1838ada.css +1 -0
- package/dist/dash/public/assets/dash-agents-9e678137267dec07.css +1 -0
- package/dist/dash/public/assets/dash-agents-new-26fa27b17ef9b8d8.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-b975c48f8abf3444.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-edit-e13fda599bb04843.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-platforms-70292932cb27bc96.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-settings-71f9a86251723fcc.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-tasks-fb8eb2ed71006601.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-usage-7c8740f1cdd52c71.css +1 -0
- package/dist/dash/public/assets/dash-settings-8eb818da462227e8.css +1 -0
- package/dist/dash/public/assets/dash-settings-param-tab-849a1a9542e273f5.css +1 -0
- package/dist/dash/public/assets/dash-tasks-81e510e0b6931b42.css +1 -0
- package/dist/dash/public/assets/dash-tasks-param-id-bbd2a83342f2ec10.css +1 -0
- package/dist/dash/public/assets/dash-usage-8e0259e03eaed1bd.css +1 -0
- package/dist/dash/public/assets/favicon.ico +0 -0
- package/dist/dash/public/assets/favicon.svg +1 -0
- package/dist/dash/public/assets/fonts/LICENSE-fira-code +93 -0
- package/dist/dash/public/assets/fonts/fira-code-latin-400-normal-717ee080.woff2 +0 -0
- package/dist/dash/public/assets/fonts/fira-code-latin-500-normal-530b6706.woff2 +0 -0
- package/dist/dash/public/assets/fonts/fira-code-latin-700-normal-98730669.woff2 +0 -0
- package/dist/dash/public/assets/global-d2adbf01910d9df5.css +1 -0
- package/dist/dash/public/assets/login-c129b1ce237be260.css +1 -0
- package/dist/dash/public/assets/pnext-client-073464b8f422ef57.js +1 -0
- package/dist/dash/public/assets/pnext-client-0b6720fdec66eeb0.js +1 -0
- package/dist/dash/public/assets/pnext-client-1e9cb2f4f6387a87.js +1 -0
- package/dist/dash/public/assets/pnext-client-2f0e78dd006fed0f.js +1 -0
- package/dist/dash/public/assets/pnext-client-3c62e2aa2cbe9fe1.js +1 -0
- package/dist/dash/public/assets/pnext-client-43a88896ed42dd39.js +1 -0
- package/dist/dash/public/assets/pnext-client-4cf2e27d0b9c0365.js +1 -0
- package/dist/dash/public/assets/pnext-client-587008fa987d3073.js +1 -0
- package/dist/dash/public/assets/pnext-client-676360cc86f31573.js +1 -0
- package/dist/dash/public/assets/pnext-client-813427605f424145.js +1 -0
- package/dist/dash/public/assets/pnext-client-82de7cf6dfc35b98.js +1 -0
- package/dist/dash/public/assets/pnext-client-831e8004c09f0b5b.js +1 -0
- package/dist/dash/public/assets/pnext-client-9b557fe468a45ca3.js +1 -0
- package/dist/dash/public/assets/pnext-client-ab7c900c802fe827.js +1 -0
- package/dist/dash/public/assets/pnext-client-d87d00e402811f0c.js +1 -0
- package/dist/dash/public/assets/pnext-client-fbdb7c1da7eda7e5.js +1 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/boot-B2MFTRO2.js +28 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/build-tier-XJJSL5FR.js +2702 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-2HFY3DQT.js +206 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-2ICEVELW.js +832 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-3UPROT2C.js +33 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-4P5CMIYT.js +1580 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-4TKZKZ3Q.js +129 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-5RDEILQB.js +435 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-62KEQM43.js +23 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-6KQSWT6D.js +829 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-7DCNCW6O.js +722 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-B4THCTQP.js +20 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-C2LIV2MM.js +170 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-CCATPVTW.js +376 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-COXJAPTU.js +87 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-E6IXL2NJ.js +6268 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-FLGRBFAH.js +1196 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-FTJVHFWD.js +59 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-H523KSIH.js +5149 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-HT6KKX6A.js +18 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-JESFYECC.js +436 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-JRPJM2XY.js +15 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-L2IWDUXG.js +105 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-L5P4Y4UC.js +181 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-NQE46AZN.js +645 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-PA4QEARJ.js +127 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-PZ5AXOLW.js +7144 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-SNVPTULL.js +2395 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-T3QZT3PG.js +218 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-VC5O2SDP.js +70 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-WZX4V6CM.js +229 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-XUUIDXY5.js +625 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-ZHFDO3PR.js +263 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/compile-CE2DN7ZA.js +16 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/config-UREY7XJT.js +14 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/config-loader-UI2XE3PZ.js +15 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/entry.js +217 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/generate-I2PPTDFD.js +14 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/modules-UVOCE4C2.js +46 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/pipeline-UW47K537.js +961 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/proxy-ITGOVJBW.js +24 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/register-4SA55SWT.js +12577 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/router-JNKHLBCZ.js +503 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/routes-PD6J2NXW.js +52 -0
- package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/tsconfig-defaults-ZXEH7RQK.js +13 -0
- package/dist/default-Bobztoxf.js +1 -0
- package/dist/default-vYPT26DR.js +1 -0
- package/dist/delete-D8gEwoOj.js +4 -0
- package/dist/delete-z1_86nf6.js +2 -0
- package/dist/disable-DVKd-0Xb.js +1 -0
- package/dist/discover-Df-a8K4R.js +3 -0
- package/dist/discover-Dvr_3_Xr.js +1 -0
- package/dist/dispatch-BKeAch9E.js +14 -0
- package/dist/docs-BX65z2Iu.js +2 -0
- package/dist/docs-DKJnqZqt.js +2 -0
- package/dist/enable-C8Zf_wpN.js +1 -0
- package/dist/env-CRf6wkM2.js +1 -0
- package/dist/exec-RZFLclKX.js +11 -0
- package/dist/executor-BvAA7Cgw.js +10 -0
- package/dist/flow/builtin/review.d.ts +157 -0
- package/dist/flow/builtin/review.js +19 -0
- package/dist/flow/index.d.ts +1 -1
- package/dist/flow/index.js +1 -1
- package/dist/flow-17k25MHt.js +1 -0
- package/dist/github-actions-DwUzm4hC.js +24 -0
- package/dist/http-Bkg_OQ6r.js +1 -0
- package/dist/{index-BQ-b77or.d.ts → index-DT7EST00.d.ts} +116 -238
- package/dist/init-CoMfFxbG.js +1 -0
- package/dist/integrations-5xCaXSd-.js +1 -0
- package/dist/integrations-BAgdVDhj.js +5 -0
- package/dist/lib/broker.js +3 -3
- package/dist/list-BAKvxSbh.js +4 -0
- package/dist/list-BYiG8Zav.js +2 -0
- package/dist/list-BxEywhHU.js +1 -0
- package/dist/list-C5w01-8q.js +1 -0
- package/dist/list-CIW2joV1.js +1 -0
- package/dist/list-DX-z3SBp.js +3 -0
- package/dist/list-DpCf4G-H.js +4 -0
- package/dist/list-VToARh3C.js +1 -0
- package/dist/load-BpEsAn51.js +2 -0
- package/dist/local-H3uvqEbq.js +1 -0
- package/dist/log-view-dg0TlKLA.js +1 -0
- package/dist/login-BFxX4jJy.js +1 -0
- package/dist/login-DkkslfBx.js +1 -0
- package/dist/logout-BHAtw4Z8.js +1 -0
- package/dist/maintenance-C5FklUw3.js +1 -0
- package/dist/match-CXAjDhg7.js +1 -0
- package/dist/mcp-BgKb2Cdk.js +1 -0
- package/dist/mcp-CCZOAo06.js +1 -0
- package/dist/mcp-server-DGzme0YX.js +1 -0
- package/dist/migrate-C4vM7DQN.js +2 -0
- package/dist/migrate-N-85_N7J.js +1 -0
- package/dist/model-Bs1StDo3.js +1 -0
- package/dist/models-_5LVGC3m.js +1 -0
- package/dist/output-BKeyLbvt.js +5 -0
- package/dist/prompt-CEuBMNhk.js +7 -0
- package/dist/push-CUC55Bqd.js +1 -0
- package/dist/queue-6io_NOP3.js +116 -0
- package/dist/refresh-BIrmrWYq.js +1 -0
- package/dist/remote-miQNTVRa.js +1 -0
- package/dist/remove-B93LNkZI.js +1 -0
- package/dist/remove-C5_xggx7.js +1 -0
- package/dist/remove-CuH8a3L9.js +1 -0
- package/dist/remove-eQ8y5C5p.js +1 -0
- package/dist/rename-CYfy03FE.js +1 -0
- package/dist/result-BEtQZHaY.js +5 -0
- package/dist/result-BzaM3inj.js +15 -0
- package/dist/resume-DYzKvyEw.js +3 -0
- package/dist/review-oIBeECZE.js +7 -0
- package/dist/rolldown-runtime-DT7IzrpZ.js +1 -0
- package/dist/rotate-key-IdMYH7gg.js +1 -0
- package/dist/run-BDYl0CKl.js +2 -0
- package/dist/run-CTtd0Znc.js +5 -0
- package/dist/run-CawRGnOg.js +2 -0
- package/dist/runner-D7ScbIHJ.js +1 -0
- package/dist/runner-sUpWJ_k0.js +1 -0
- package/dist/schema-CU2iFkp8.js +1 -0
- package/dist/sdk.d.ts +1166 -191
- package/dist/sdk.js +1 -1
- package/dist/serve-BTeomYxW.js +1 -0
- package/dist/serve-CE8YV2e9.js +1 -0
- package/dist/serve-CPnmrKyf.js +2 -0
- package/dist/serve-CQKZxzFE.js +4 -0
- package/dist/serve-GmRO89s5.js +12 -0
- package/dist/server-Kb22cWfF.js +1 -0
- package/dist/setup-host-GFTUzzZJ.js +6 -0
- package/dist/shared-DVtzWhUT.js +1 -0
- package/dist/show-CMUg8SJu.js +1 -0
- package/dist/show-COTZEYgc.js +1 -0
- package/dist/status-D26U--p8.js +1 -0
- package/dist/steer-C6uARLp5.js +4 -0
- package/dist/stop-BrGI3hSS.js +1 -0
- package/dist/stop-ByCAlbmN.js +3 -0
- package/dist/store-B94tSate.js +42 -0
- package/dist/store-DzqXS2wT.js +8 -0
- package/dist/task-C6VAg5WU.js +1 -0
- package/dist/task-CgOKgkEG.js +1 -0
- package/dist/task-DeglY79z.js +5 -0
- package/dist/test-NEbhlxvo.js +1 -0
- package/dist/tools-D0Zfs8Hx.js +1 -0
- package/dist/types-D0q15RJa.js +1 -0
- package/dist/types-Dve7Z0ZP.d.ts +389 -0
- package/dist/unalias-C9NqmSDq.js +1 -0
- package/dist/update-BTxYQj7Z.js +2 -0
- package/dist/upgrade-hA0yWBvx.js +2 -0
- package/dist/usage-BhqoCjvE.js +1 -0
- package/dist/usage-C4d9X2Uq.js +1 -0
- package/dist/watch-CSdj24ct.js +5 -0
- package/dist/watch-DtRuC0Wc.js +8 -0
- package/dist/wire-BeT1Axeo.js +1 -0
- package/dist/worker-CXndxmGF.js +9 -0
- package/dist/worker-DX7P9kWl.js +1 -0
- package/dist/workflow-Dcmdooi8.js +1 -0
- package/docs/agents/coder.md +26 -0
- package/docs/agents/index.md +120 -0
- package/docs/config.md +51 -30
- package/docs/dash.md +64 -0
- package/docs/flows.md +20 -15
- package/docs/mcp.md +62 -0
- package/docs/models.md +41 -23
- package/docs/review.md +41 -0
- package/docs/sdk.md +57 -38
- package/docs/self-host.md +188 -0
- package/migrations/0000_initial.sql +252 -0
- package/migrations/meta/0000_snapshot.json +1787 -0
- package/migrations/meta/_journal.json +13 -0
- package/package.json +37 -7
- package/plugins/agents/skills/coder/SKILL.md +14 -60
- package/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/plugins/claude/commands/setup.md +2 -2
- package/plugins/claude/skills/dispatch/SKILL.md +14 -58
- package/plugins/cursor/.cursor-plugin/plugin.json +1 -1
- package/plugins/cursor/README.md +5 -5
- package/plugins/cursor/assets/logo.png +0 -0
- package/plugins/cursor/skills/coder/SKILL.md +14 -59
- package/src/client/index.ts +573 -0
- package/src/client/types.ts +506 -0
- package/src/core/errors.ts +72 -0
- package/src/core/task/log-view.ts +173 -0
- package/src/server/auth/sign-in.ts +14 -0
- package/src/server/dash/api/load.ts +62 -0
- package/src/server/dash/api/types.ts +11 -0
- package/src/server/dash/app/connect/page.tsx +42 -0
- package/src/server/dash/app/dash/account/loading.tsx +11 -0
- package/src/server/dash/app/dash/account/notify.tsx +42 -0
- package/src/server/dash/app/dash/account/page.css +81 -0
- package/src/server/dash/app/dash/account/page.tsx +126 -0
- package/src/server/dash/app/dash/account/sign-out.tsx +24 -0
- package/src/server/dash/app/dash/agents/(list)/agent-menu.tsx +10 -0
- package/src/server/dash/app/dash/agents/(list)/agents-grid.tsx +143 -0
- package/src/server/dash/app/dash/agents/(list)/connect-apps.tsx +46 -0
- package/src/server/dash/app/dash/agents/(list)/loading.tsx +14 -0
- package/src/server/dash/app/dash/agents/(list)/page.css +72 -0
- package/src/server/dash/app/dash/agents/(list)/page.tsx +89 -0
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/layout.tsx +135 -0
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/loading.tsx +5 -0
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/page.css +21 -0
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/page.tsx +173 -0
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/platforms/loading.tsx +18 -0
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/platforms/page.css +87 -0
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/platforms/page.tsx +258 -0
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/platforms/platform-actions.tsx +111 -0
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/settings/agent-settings-form.css +114 -0
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/settings/agent-settings-form.tsx +294 -0
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/settings/loading.tsx +5 -0
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/settings/page.tsx +54 -0
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/tasks/loading.tsx +5 -0
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/tasks/page.tsx +14 -0
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/usage/loading.tsx +31 -0
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/usage/page.css +12 -0
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/usage/page.tsx +163 -0
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/versions-list.tsx +53 -0
- package/src/server/dash/app/dash/agents/[slug]/edit/loading.tsx +31 -0
- package/src/server/dash/app/dash/agents/[slug]/edit/page.tsx +91 -0
- package/src/server/dash/app/dash/agents/agent/agent-pills.css +27 -0
- package/src/server/dash/app/dash/agents/agent/agent-pills.tsx +133 -0
- package/src/server/dash/app/dash/agents/agent/hero.css +40 -0
- package/src/server/dash/app/dash/agents/agent/hero.tsx +60 -0
- package/src/server/dash/app/dash/agents/agent/instructions.css +29 -0
- package/src/server/dash/app/dash/agents/agent/instructions.tsx +82 -0
- package/src/server/dash/app/dash/agents/editor/connect-repositories.ts +16 -0
- package/src/server/dash/app/dash/agents/editor/editor.css +263 -0
- package/src/server/dash/app/dash/agents/editor/editor.tsx +774 -0
- package/src/server/dash/app/dash/agents/editor/import-picker.css +48 -0
- package/src/server/dash/app/dash/agents/editor/import-picker.tsx +253 -0
- package/src/server/dash/app/dash/agents/editor/names.ts +35 -0
- package/src/server/dash/app/dash/agents/new/loading.tsx +25 -0
- package/src/server/dash/app/dash/agents/new/page.tsx +72 -0
- package/src/server/dash/app/dash/layout.css +265 -0
- package/src/server/dash/app/dash/layout.tsx +332 -0
- package/src/server/dash/app/dash/page.tsx +14 -0
- package/src/server/dash/app/dash/settings/[tab]/credentials-list.css +94 -0
- package/src/server/dash/app/dash/settings/[tab]/credentials-list.tsx +619 -0
- package/src/server/dash/app/dash/settings/[tab]/credentials.tsx +36 -0
- package/src/server/dash/app/dash/settings/[tab]/engines-list.css +16 -0
- package/src/server/dash/app/dash/settings/[tab]/engines-list.tsx +135 -0
- package/src/server/dash/app/dash/settings/[tab]/list.css +98 -0
- package/src/server/dash/app/dash/settings/[tab]/list.tsx +215 -0
- package/src/server/dash/app/dash/settings/[tab]/loading.tsx +6 -0
- package/src/server/dash/app/dash/settings/[tab]/mcp-list.css +43 -0
- package/src/server/dash/app/dash/settings/[tab]/mcp-list.tsx +290 -0
- package/src/server/dash/app/dash/settings/[tab]/models-list.tsx +513 -0
- package/src/server/dash/app/dash/settings/[tab]/page.tsx +89 -0
- package/src/server/dash/app/dash/settings/[tab]/runners-list.css +153 -0
- package/src/server/dash/app/dash/settings/[tab]/runners-list.tsx +457 -0
- package/src/server/dash/app/dash/settings/layout.tsx +50 -0
- package/src/server/dash/app/dash/settings/model-options.ts +117 -0
- package/src/server/dash/app/dash/settings/page.tsx +7 -0
- package/src/server/dash/app/dash/settings/settings-head.tsx +24 -0
- package/src/server/dash/app/dash/settings/tunnel-guide.tsx +28 -0
- package/src/server/dash/app/dash/tasks/[id]/activity.tsx +202 -0
- package/src/server/dash/app/dash/tasks/[id]/loading.tsx +31 -0
- package/src/server/dash/app/dash/tasks/[id]/page.tsx +30 -0
- package/src/server/dash/app/dash/tasks/[id]/task-actions.tsx +164 -0
- package/src/server/dash/app/dash/tasks/[id]/task-view.css +407 -0
- package/src/server/dash/app/dash/tasks/[id]/task-view.tsx +513 -0
- package/src/server/dash/app/dash/tasks/composer-data.ts +96 -0
- package/src/server/dash/app/dash/tasks/composer.css +316 -0
- package/src/server/dash/app/dash/tasks/composer.tsx +890 -0
- package/src/server/dash/app/dash/tasks/list/status.css +50 -0
- package/src/server/dash/app/dash/tasks/list/status.tsx +20 -0
- package/src/server/dash/app/dash/tasks/list/task.ts +45 -0
- package/src/server/dash/app/dash/tasks/list/tasks-list.css +85 -0
- package/src/server/dash/app/dash/tasks/list/tasks-list.tsx +402 -0
- package/src/server/dash/app/dash/tasks/list/tasks-section.tsx +96 -0
- package/src/server/dash/app/dash/tasks/page.tsx +53 -0
- package/src/server/dash/app/dash/token-from-hash.tsx +17 -0
- package/src/server/dash/app/dash/usage/custom-range.tsx +63 -0
- package/src/server/dash/app/dash/usage/day-chart.css +109 -0
- package/src/server/dash/app/dash/usage/day-chart.tsx +110 -0
- package/src/server/dash/app/dash/usage/loading.tsx +17 -0
- package/src/server/dash/app/dash/usage/metric.ts +13 -0
- package/src/server/dash/app/dash/usage/page.tsx +117 -0
- package/src/server/dash/app/dash/usage/range-bar.css +13 -0
- package/src/server/dash/app/dash/usage/range-bar.tsx +69 -0
- package/src/server/dash/app/dash/usage/stats.css +52 -0
- package/src/server/dash/app/dash/usage/stats.tsx +19 -0
- package/src/server/dash/app/dash/usage/top-agents.css +40 -0
- package/src/server/dash/app/dash/usage/top-agents.tsx +138 -0
- package/src/server/dash/app/dash/usage/usage.css +0 -0
- package/src/server/dash/app/globals.css +692 -0
- package/src/server/dash/app/layout.tsx +52 -0
- package/src/server/dash/app/login/page.css +26 -0
- package/src/server/dash/app/login/page.tsx +57 -0
- package/src/server/dash/app/page.tsx +5 -0
- package/src/server/dash/app/responsive.css +49 -0
- package/src/server/dash/app/zone.tsx +13 -0
- package/src/server/dash/comps/frame/auth-panel.css +60 -0
- package/src/server/dash/comps/frame/auth-panel.tsx +44 -0
- package/src/server/dash/comps/frame/drawer.css +28 -0
- package/src/server/dash/comps/frame/drawer.tsx +39 -0
- package/src/server/dash/comps/frame/heads.ts +41 -0
- package/src/server/dash/comps/frame/loading-card.tsx +65 -0
- package/src/server/dash/comps/frame/page-head.css +83 -0
- package/src/server/dash/comps/frame/page-head.tsx +71 -0
- package/src/server/dash/comps/frame/stream.tsx +50 -0
- package/src/server/dash/comps/frame/task-toasts.tsx +214 -0
- package/src/server/dash/comps/frame/theme-choices.tsx +46 -0
- package/src/server/dash/comps/nav/current-link.tsx +53 -0
- package/src/server/dash/comps/nav/side-toggle.tsx +30 -0
- package/src/server/dash/comps/nav/to.ts +22 -0
- package/src/server/dash/comps/ui/badge.css +64 -0
- package/src/server/dash/comps/ui/badge.tsx +41 -0
- package/src/server/dash/comps/ui/card.css +93 -0
- package/src/server/dash/comps/ui/card.tsx +77 -0
- package/src/server/dash/comps/ui/collapse.css +32 -0
- package/src/server/dash/comps/ui/collapse.tsx +49 -0
- package/src/server/dash/comps/ui/combo.tsx +154 -0
- package/src/server/dash/comps/ui/confirm.css +36 -0
- package/src/server/dash/comps/ui/confirm.tsx +67 -0
- package/src/server/dash/comps/ui/field.css +25 -0
- package/src/server/dash/comps/ui/field.tsx +34 -0
- package/src/server/dash/comps/ui/icon.css +22 -0
- package/src/server/dash/comps/ui/icon.tsx +17 -0
- package/src/server/dash/comps/ui/icons.ts +44 -0
- package/src/server/dash/comps/ui/menu.css +178 -0
- package/src/server/dash/comps/ui/menu.tsx +152 -0
- package/src/server/dash/comps/ui/segmented.css +44 -0
- package/src/server/dash/comps/ui/segmented.tsx +58 -0
- package/src/server/dash/comps/ui/select.css +103 -0
- package/src/server/dash/comps/ui/select.tsx +250 -0
- package/src/server/dash/comps/ui/sentinel.css +58 -0
- package/src/server/dash/comps/ui/sentinel.tsx +67 -0
- package/src/server/dash/comps/ui/tabs.css +81 -0
- package/src/server/dash/comps/ui/tabs.tsx +32 -0
- package/src/server/dash/comps/ui/tail.css +12 -0
- package/src/server/dash/comps/ui/tail.tsx +37 -0
- package/src/server/dash/comps/ui/toast.css +72 -0
- package/src/server/dash/comps/ui/toolbar.css +143 -0
- package/src/server/dash/comps/ui/toolbar.tsx +93 -0
- package/src/server/dash/package.json +5 -0
- package/src/server/dash/pnext-env.d.ts +4 -0
- package/src/server/dash/pnext.config.ts +5 -0
- package/src/server/dash/public/assets/apple-touch-icon.png +0 -0
- package/src/server/dash/public/assets/favicon.ico +0 -0
- package/src/server/dash/public/assets/favicon.svg +1 -0
- package/src/server/dash/public/assets/fonts/LICENSE-fira-code +93 -0
- package/src/server/dash/public/assets/fonts/fira-code-latin-400-normal-717ee080.woff2 +0 -0
- package/src/server/dash/public/assets/fonts/fira-code-latin-500-normal-530b6706.woff2 +0 -0
- package/src/server/dash/public/assets/fonts/fira-code-latin-700-normal-98730669.woff2 +0 -0
- package/src/server/dash/tsconfig.json +10 -0
- package/src/server/dash/utils/client.ts +19 -0
- package/src/server/dash/utils/format.ts +75 -0
- package/src/server/dash/utils/paged.ts +184 -0
- package/src/server/dash/utils/range.ts +117 -0
- package/dist/app-server-CW93J9zJ.js +0 -3
- package/dist/runtime-D-U1DNkI.js +0 -26
- package/dist/upgrade-DOj06r5b.js +0 -37
package/dist/runtime-D-U1DNkI.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import{A as e,C as t,F as n,G as r,H as i,I as a,K as o,L as s,M as c,N as l,O as u,P as d,R as f,T as p,U as m,V as h,f as g,i as _,j as v,l as y,m as b,o as x,r as ee,s as te,u as ne,v as re,w as ie,y as ae}from"./app-server-CW93J9zJ.js";import{createRequire as oe}from"node:module";import S from"node:process";import C from"node:fs";import w from"node:path";import{spawn as T,spawnSync as E}from"node:child_process";import D from"node:os";import{fileURLToPath as se,pathToFileURL as ce}from"node:url";import*as O from"zod/mini";import le from"node:net";import ue,{randomUUID as k}from"node:crypto";import{AsyncLocalStorage as de}from"node:async_hooks";function fe(e){let t=S.env.FORCE_COLOR,n=t!=null&&t!==``&&t!==`0`||t!==`0`&&e.isTTY&&!S.env.NO_COLOR,r=(e,t)=>n?`\x1b[${e}m${t}\x1b[0m`:t;return{blue:e=>r(`34`,e),bold:e=>r(`1`,e),cyan:e=>r(`36`,e),dim:e=>r(`2`,e),light:e=>r(`38;5;246`,e),green:e=>r(`32`,e),red:e=>r(`31`,e),yellow:e=>r(`33`,e)}}const A=fe(S.stdout),j=fe(S.stderr);function pe(e,t=j){let n=e.map(e=>{let t=e.indexOf(`coder `);return t===-1?{label:e,cmd:``}:{label:e.slice(0,t),cmd:e.slice(t)}}),r=Math.max(0,...n.map(e=>e.label.length));return n.map(({label:e,cmd:n})=>n?` ${t.dim(e.padEnd(r))}${t.bold(n)}`:` ${t.dim(e)}`).join(`
|
|
2
|
-
`)}function me(e,t={}){let n=typeof t==`number`?t:t.code??1,r=typeof t==`object`?t.hint:null,i=r==null?[]:Array.isArray(r)?r:[r];S.stderr.write(`${j.red(e)}\n`),i.length&&S.stderr.write(`\n${pe(i,j)}\n`),S.exit(n)}function M(e){S.stdout.write(`${JSON.stringify(e,null,2)}\n`)}function he(e,t=A){return(JSON.stringify(e,null,2)??`null`).split(`
|
|
3
|
-
`).map(e=>e.replace(/"((?:[^"\\]|\\.)*)":/g,(e,n)=>`${t.light(`"${n}"`)}:`).replace(/: (-?\d[\d.eE+-]*|true|false|null)(,?)$/,(e,n,r)=>`: ${t.blue(n)}${r}`)).join(`
|
|
4
|
-
`)}function ge(e){let t=Date.parse(e??``);return Number.isFinite(t)?Math.max(0,Date.now()-t):0}function N(e){let t=Math.floor(e/1e3);if(t<60)return`${t}s`;let n=Math.floor(t/60);return n<60?`${n}m`:`${Math.floor(n/60)}h${n%60}m`}function _e(e){let t=Math.max(0,Math.round(e/1e3)),n=t%60,r=Math.floor(t/60)%60,i=Math.floor(t/3600),a=e=>String(e).padStart(2,`0`);return i?`${i}:${a(r)}:${a(n)}`:`${r}:${a(n)}`}function P(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(+(e<1e4))}k`:`${(e/1e6).toFixed(1)}M`}function ve(e,t){let n=[`in ${P(e.input)}`,...e.cachedInput?[`cached ${P(e.cachedInput)}`]:[],`out ${P(e.output)}`];return`${P(e.total)} (${n.join(` · `)}) on ${t||`default model`}`}function ye(e){return`ctx ${P(e.input+e.cachedInput)} · out ${P(e.output)}`}function be(e,t,n,r=A){let i=e?.error?.message??t;return e?.finalMessage||(i?`${r.red(`error:`)} ${i}`:n)}function xe(e,t=A,{truncate:n=!0}={}){let r=e=>e.split(`
|
|
5
|
-
`).map(e=>` ${t.dim(e)}`);return!n||e.length<=1e3?[t.dim(`prompt:`),...r(e)]:[t.dim(`prompt:`),...r(e.slice(0,500).trimEnd()),t.light(` … <${e.length-1e3} chars trimmed> …`),...r(e.slice(-500).trimStart())]}function Se(e){return[e.agent??`-`,e.model,e.model?e.effort:null].filter(Boolean).join(`/`)}function Ce(e,t=A){let n=[];return e.permissions&&n.push([`perms`,e.permissions]),e.cwd&&n.push([`cwd`,e.cwd]),n.map(([e,n])=>`${t.dim(e.padEnd(8))} ${n}`)}function we(e,t){if(t)return e.createdAt?`started ${N(ge(e.createdAt))} ago`:``;let n=e.createdAt&&e.completedAt?Date.parse(e.completedAt)-Date.parse(e.createdAt):null;return[e.completedAt?`finished ${N(ge(e.completedAt))} ago`:``,n!==null&&n>=0?`took ${N(n)}`:``].filter(Boolean).join(` · `)}function Te(e,{status:t,tokens:n,tokenModel:r,files:a,live:o=!1,style:s=A}){let c=we(e,i.includes(e.status)||t===`waiting-approval`),l=e=>s.dim(e.padEnd(8));return[`${l(`task`)} ${s.cyan(e.id)}`,...e.name?[`${l(`name`)} ${e.name}`]:[],`${l(`status`)} ${Ze(t)}${c?` ${s.dim(`(${c})`)}`:``}`,`${l(`agent`)} ${Se(e)}`,...Ce(e,s),...n?[`${l(`tokens`)} ${o?ye(n):ve(n,r??e.model)}${o?s.dim(` (so far)`):``}`]:[],...a?.length?[`${l(`files`)} ${a.join(`, `)}`]:[]]}function Ee(e,{tokens:t,tokenModel:n,files:r,statusChanged:i=!0,style:a=A}){let o=e=>a.dim(e.padEnd(8)),s=e.createdAt&&e.completedAt?Date.parse(e.completedAt)-Date.parse(e.createdAt):null;return[...i?[`${o(`status`)} ${Ze(e.status)}${s!==null&&s>=0?` ${a.dim(`(took ${N(s)})`)}`:``}`]:[],...t?[`${o(`tokens`)} ${ve(t,n??e.model)}`]:[],...r?.length?[`${o(`files`)} ${r.join(`, `)}`]:[]]}function De(e,t=300,{plain:n=!1,style:r=A}={}){if(e.length<=t)return e;let i=`<${e.length-t} more chars>`;return`${e.slice(0,t)} ${n?i:r.dim(i)}`}const Oe=` `.repeat(8),ke={assistant:`●`,reasoning:`✻`,tool:`→`,"tool-result":` `,usage:`·`,status:`·`,info:`·`,error:`✘`,steer:`⚑`};function Ae(e){return e.includes(`approval`)||e===`sidecar-decision`||e===`auto-review`}function je(e,t){return t?e.split(`${t}/`).join(``).split(t).join(`.`):e}function Me(e,t,n){let r=String(e.kind??``),i=r===`sidecar-decision`?`sidecar`:r===`auto-review`?`auto-review`:`approval`,a=String(e.decision??``),o=e.riskLevel?`(${String(e.riskLevel)} risk)`:``,s=je(e.summary?String(e.summary):``,n),c=s.slice(s.indexOf(`: `)+2),l=s&&c&&t.includes(c)?``:s;return{head:`${[i,a,o,l?``:String(e.method??``)].filter(Boolean).join(` `)}${l?` · ${l}`:``}`,reason:je(e.reason?String(e.reason):``,n)}}function Ne(e,t){let n=/^\x1b\[[0-9;]*m/.exec(t(``))?.[0];return t(n&&e.includes(Pe)?e.split(Pe).join(`${Pe}${n}`):e)}const Pe=`\x1B[0m`;function Fe(e,t,n,r,i=r.dim){if(!e)return``;let a=(e.length>t?e.slice(0,t):e).split(`
|
|
6
|
-
`).map(e=>Ne(e,i));return e.length>t&&(a[a.length-1]+=` ${r.light(`<${e.length-t} more chars>`)}`),a.length>n?[...a.slice(0,n),r.light(`… +${a.length-n} more lines`)].join(`
|
|
7
|
-
`):a.join(`
|
|
8
|
-
`)}var Ie=class{opts;prevKind=null;lastAssistant=``;lastTool=null;lastToolText=``;lastUsageTotal=0;entryAt=null;style;constructor(e={}){this.opts=e,this.style=e.style??A}get lastAssistantMessage(){return this.lastAssistant}render(e){let t=this.style,n=String(e.kind??`status`),r=Date.parse(String(e.at??``));this.entryAt=Number.isFinite(r)?r:null;let i=this.opts.trim??500,a=this.opts.explicitTrim||i===1/0?1/0:6;if(n===`usage`){let r=e.tokens;if(!r)return[];let i=this.lastUsageTotal>0,a=r.total-this.lastUsageTotal;return!i||a<Math.max(2e4,this.lastUsageTotal*.2)?(this.lastUsageTotal=Math.max(this.lastUsageTotal,r.total),[]):(this.lastUsageTotal=r.total,this.compose(n,t.dim(ye(r)),!1))}if(Ae(n)&&(e.decision||!e.message)){let{head:t,reason:r}=Me(e,this.lastToolText,this.opts.cwd);return this.compose(n,this.approval(t,r),!1)}let o=e.message?String(e.message):String(e.kind??``);if(!o&&!(n===`tool-result`&&(e.exitCode!=null||e.isError)))return[];let s=je(o,this.opts.cwd);if(n===`assistant`)return this.lastAssistant=s,this.compose(n,s,!0);if(n===`steer`)return this.compose(n,t.yellow(s),!0);if(n===`error`)return this.compose(n,t.red(s),!0);if(n===`reasoning`){let r=typeof e.durationMs==`number`?Math.round(e.durationMs/1e3):0,o=r>=1?`thought ${N(r*1e3)} · `:``,c=a===1/0?`${t.dim(o)}${Fe(s,i,1/0,t)}`:this.clip(`${o}${s.split(`
|
|
9
|
-
`)[0]??``}`,3,t.dim);return this.compose(n,c,!1)}if(n===`tool`)return this.lastTool=e.tool?String(e.tool):null,this.lastToolText=s,this.compose(n,this.clip(s.replace(/\s*\n\s*/g,` `),2,t.light),!1);if(n===`tool-result`){let r=typeof e.exitCode==`number`?e.exitCode:null,o=r!==null&&r!==0||e.isError===!0,c=typeof e.durationMs==`number`?e.durationMs:0,l=e.tool?String(e.tool):null,u=[l&&l!==this.lastTool?t.dim(`from ${l}`):``,o?t.red(r===null?`failed`:`exit ${r}`):``,c>=3e3?t.dim(N(c)):``].filter(Boolean),d=Fe(s,i,a,t),f=[...u.length?[u.join(t.dim(` · `))]:[],...d?[d]:[]];return this.compose(n,f.join(`
|
|
10
|
-
`),!1)}return this.compose(n,this.clip(s,3,t.dim),!1)}spaced(e){return this.prevKind===null?!1:e===`assistant`||e===`error`||e===`steer`?!0:e===`reasoning`?this.prevKind!==`reasoning`:e===`tool`?this.prevKind===`assistant`||this.prevKind===`reasoning`:!1}approval(e,t){let n=this.style,r=this.opts.width?this.opts.width-Oe.length:1/0,i=`${e}${t?` — ${t}`:``}`;return!t||Ge(i)<=r?`${n.light(e)}${t?n.dim(` — ${t}`):``}`:[this.clip(e,1,n.light),this.clip(t,2,n.dim)].join(`
|
|
11
|
-
`)}clip(e,t,n){let r=this.opts.trim??500;if(this.opts.explicitTrim||r===1/0)return Fe(e,r,1/0,this.style,n);let i=this.opts.width;return i?qe(e,Math.max(i-Oe.length,24),t).map(e=>Ne(e,n)).join(`
|
|
12
|
-
`):n(e)}compose(e,t,n){let r=this.spaced(e)?[``]:[];this.prevKind=e;let i=ke[e]??(Ae(e)?`⚑`:`·`),[a=``,...o]=t.split(`
|
|
13
|
-
`);return[...r,`${this.gutter(e)}${this.style.dim(i)} ${a}`,...o.map(e=>n?e:`${Oe}${e}`)]}gutter(e){let t=` `.repeat(6);return e===`tool-result`||!this.opts.startedAt||this.entryAt===null?t:`${this.style.dim(_e(this.entryAt-this.opts.startedAt).padStart(5))} `}};const Le=6e5,Re=12e4;function ze(e,t){return e.length>t?`${e.slice(0,t-1)}…`:e.padEnd(t)}function Be(e){return` ${A.bold(A.green(`✔`))} ${e}`}function Ve(e){return` ${A.bold(A.red(`✘`))} ${e}`}function He(e=S.stdout){try{return e.getWindowSize?.()[0]??e.columns}catch{return e.columns}}function Ue(e=S.stdout){try{return e.getWindowSize?.()[1]??e.rows}catch{return e.rows}}function We(e){return e>=768&&e<=879||e>=8203&&e<=8207||e>=65024&&e<=65039?0:e>=4352&&e<=4447||e>=11904&&e<=42191||e>=44032&&e<=55203||e>=63744&&e<=64255||e>=65072&&e<=65103||e>=65280&&e<=65376||e>=65504&&e<=65510||e>=127744&&e<=129791||e>=131072&&e<=262141?2:1}function Ge(e){let t=0;for(let n of e.replace(/\x1b\[[0-9;]*m/g,``))t+=We(n.codePointAt(0));return t}function Ke(e,t){let n=0;for(let r=0;r<e.length;){let i=e[r]===`\x1B`?/^\x1b\[[0-9;]*m/.exec(e.slice(r)):null;if(i){r+=i[0].length;continue}let a=String.fromCodePoint(e.codePointAt(r)),o=We(a.codePointAt(0));if(n+o>t)return r;n+=o,r+=a.length}return e.length}function qe(e,t,n){if(t<4||n<1)return[e];let r=[],i=e;for(;Ge(i)>t;){if(r.length===n-1)return[...r,`${i.slice(0,Ke(i,t-1))}…`];let e=Ke(i,t),a=i.lastIndexOf(` `,e),o=a>t*.66?a:e;r.push(i.slice(0,o).trimEnd()),i=i.slice(o).replace(/^\s+/,``)}return[...r,i]}function Je(e,t){let n=0,r=``;for(let i=0;i<e.length;){let a=e[i]===`\x1B`?/^\x1b\[[0-9;]*m/.exec(e.slice(i)):null;if(a){r+=a[0],i+=a[0].length;continue}let o=e.codePointAt(i),s=String.fromCodePoint(o),c=We(o);if(n+c>t-1)return`${r}\x1b[0m${A.dim(`…`)}`;r+=s,n+=c,i+=s.length}return r}function Ye(){let e=S.stdin;if(!e.isTTY||!S.stdout.isTTY)return()=>{};e.setRawMode(!0),e.resume();let t=e=>{e.includes(3)&&S.kill(S.pid,`SIGINT`),e.includes(26)&&S.kill(S.pid,`SIGTSTP`)};return e.on(`data`,t),e.unref(),()=>{e.off(`data`,t),e.isTTY&&e.setRawMode(!1),e.pause()}}var Xe=class{stream;quietMs;lines=[];painted=[];paintedWidths=[];paintedCols;resizeTimer;tty;constructor(e=S.stdout,t=250){this.stream=e,this.quietMs=t,this.tty=!!e.isTTY,this.tty&&e.on(`resize`,this.onResize)}set(e){this.lines=e,!(!this.tty||this.resizeTimer)&&this.paint()}commit(e){this.clear(),this.stream.write(e)}clear(){if(!this.painted.length)return;let e=He(this.stream),t=this.painted.length;e&&this.paintedCols&&e!==this.paintedCols&&(t=this.paintedWidths.reduce((t,n)=>t+Math.max(1,Math.ceil(n/e)),0)),this.stream.write(`\x1b[${t}A\x1b[0J`),this.painted=[],this.paintedWidths=[]}done(){this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=void 0,this.paint()),this.tty&&this.stream.off(`resize`,this.onResize)}paint(){this.clear();let e=He(this.stream),t=e?this.lines.map(t=>Je(t,e-1)):this.lines,n=Ue(this.stream);n&&t.length>n-1&&(t=n>1?t.slice(-(n-1)):[]);for(let e of t)this.stream.write(`${e}\n`);this.painted=t,this.paintedWidths=t.map(Ge),this.paintedCols=e}onResize=()=>{this.clear(),this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=setTimeout(()=>{this.resizeTimer=void 0,this.paint()},this.quietMs),this.resizeTimer.unref?.()}};function Ze(e,t=0){let n=e.padEnd(t);return e===`running`?A.green(n):e===`waiting-approval`?A.yellow(n):e===`failed`||e===`cancelled`?A.red(n):e===`completed`?A.blue(n):A.dim(n)}function Qe(e,t,n=!1){n?M({taskId:e,status:`awaiting-approval`,approval:t}):(S.stdout.write(`Approval needed for task ${e}: ${t.summary}\n`),S.stderr.write(`\n${pe([`Approve: coder approve ${e} ${t.id}`,`Deny: coder approve ${e} ${t.id} --deny`,`Then: coder task result ${e} --wait`],j)}\n`)),S.exit(4)}function $e(e,t,n){if(e.length>t){let r=e.slice(t);me(`Unexpected argument${r.length>1?`s`:``}: ${r.join(` `)}`,{hint:`Help: coder ${n} --help`})}}function et(e){return e.cwd?w.resolve(String(e.cwd)):S.cwd()}function tt(e,n){let r=t(e,n);return r||me(n?`No task found for "${n}".`:`No tasks found for this workspace.`,{hint:n?[`List tasks: coder task list`,`Start one: coder run "<text>"`]:[`Start one: coder run "<text>"`]}),r}const F=`@wular/coder`,nt=`https://registry.npmjs.org/${F}/latest`;function rt(){return w.join(n(),`update-check.json`)}function it(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 at(){try{return JSON.parse(C.readFileSync(rt(),`utf8`))}catch{return null}}function ot(e){try{C.mkdirSync(n(),{recursive:!0}),C.writeFileSync(rt(),JSON.stringify(e))}catch{}}function st(){try{C.rmSync(rt(),{force:!0})}catch{}}function ct(e,t){if(S.env.CODER_NO_UPDATE_CHECK||S.env.CI)return;let n=at();if(n?.latest&&it(n.latest,e)>0&&S.stderr.write(j.dim(`coder ${e} -> `)+j.bold(n.latest)+j.dim(` available. run: coder upgrade
|
|
14
|
-
|
|
15
|
-
`)),!n?.checkedAt||Date.now()-n.checkedAt>864e5)try{T(S.execPath,[t,`_refreshUpdate`],{detached:!0,stdio:`ignore`}).unref()}catch{}}async function lt(e){let t=at()?.latest??null;try{let e=new AbortController,n=setTimeout(()=>e.abort(),3e3),r=await fetch(nt,{signal:e.signal,headers:{accept:`application/json`}});if(clearTimeout(n),r.ok){let e=await r.json();e?.version&&(t=e.version)}}catch{}ot({checkedAt:Date.now(),latest:t,current:e})}function ut(e){let t=e;try{t=C.realpathSync(e)}catch{}let n=t.replace(/\\/g,`/`);return/\/\.bun\//.test(n)?{pm:`bun`,command:[`bun`,`add`,`-g`,`${F}@latest`]}:/\/\.pnpm\//.test(n)||/\/pnpm(-global)?\//i.test(n)||/\/Library\/pnpm\//.test(n)?{pm:`pnpm`,command:[`pnpm`,`add`,`-g`,`${F}@latest`]}:/\/\.config\/yarn\/global\//.test(n)||/\/yarn\/global\//.test(n)||/\/Yarn\/Data\/global\//.test(n)?{pm:`yarn`,command:[`yarn`,`global`,`add`,`${F}@latest`]}:{pm:`npm`,command:[`npm`,`install`,`-g`,`${F}@latest`]}}function I(e,t){if(!t)return``;if(!w.isAbsolute(t))return t;let n=w.relative(e,t);return n&&!n.startsWith(`..`)?n:t}function L(e){try{return JSON.parse(C.readFileSync(e,`utf8`))}catch{return null}}function dt(e,t){let n=`${e}.tmp`;C.writeFileSync(n,`${JSON.stringify(t,null,2)}\n`,`utf8`),C.renameSync(n,e)}function ft(e){let t=0,n=``;return()=>{let r;try{r=C.statSync(e).size}catch{return[]}if(r<t&&(t=0,n=``),r===t)return[];let i;try{i=C.openSync(e,`r`)}catch{return[]}try{let e=Buffer.alloc(r-t),a=C.readSync(i,e,0,e.length,t);t+=a;let o=(n+e.toString(`utf8`,0,a)).split(`
|
|
16
|
-
`);return n=o.pop()??``,o.filter(Boolean)}finally{C.closeSync(i)}}}const pt=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(`.`)),mt=[/\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)/],ht=new Set([`status`,`log`,`diff`,`show`,`blame`,`rev-parse`,`ls-files`,`ls-tree`,`cat-file`,`describe`,`shortlog`,`grep`,`branch`,`stash`]);function gt(e){let t=e.match(/^\s*(?:ba|z|da)?sh\s+(?:-[a-zA-Z]+\s+)*(?:-c\s+)?(["'])([\s\S]*)\1\s*$/);return t?t[2]:e}function _t(e){return e.trim().split(/\s+/).filter(Boolean)}function vt(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 ht.has(t)?{decision:`accept`,reason:`git ${t} is read-only`}:pt.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 yt(e,t={}){let n=gt(String(e??``));if(!n.trim())return{decision:`escalate`,reason:`empty command`};for(let e of mt)if(e.test(n))return{decision:`decline`,reason:`matches hard-deny pattern ${e}`};if(/\$\(|`|<\(/.test(n))return{decision:`escalate`,reason:`contains command substitution`};let r=n.split(/&&|\|\||;|\||\r?\n/).map(e=>e.trim()).filter(Boolean);if(r.length>1){let e={decision:`accept`,reason:`all segments safe`};for(let n of r){let r=yt(n,t);if(r.decision===`decline`)return r;r.decision===`escalate`&&(e=r)}return e}let i=_t(n),a=w.basename(i[0]??``);if(a===`git`)return vt(i);let o=t.networkHost;return o?(t.allowedNetworkHosts??[]).some(e=>o===e||o.endsWith(`.${e}`))?{decision:`accept`,reason:`network host ${o} is allowlisted`}:{decision:`escalate`,reason:`network access to ${o}`}:{decision:`escalate`,reason:`command needs approval: ${a||`(unknown)`}`}}function bt(e,t){if(!e.length)return{decision:`escalate`,reason:`file change with no resolvable paths`};for(let n of e){let e=w.resolve(t,n),r=w.relative(t,e);if(r.startsWith(`..`)||w.isAbsolute(r))return{decision:`escalate`,reason:`path outside workspace: ${n}`};if(r===`.git`||r.startsWith(`.git${w.sep}`))return{decision:`decline`,reason:`direct .git modification: ${n}`}}return{decision:`accept`,reason:`all paths inside workspace`}}function xt(e){return w.join(e,`approvals`)}function St(e){let t=xt(e);return C.existsSync(t)?C.readdirSync(t).filter(e=>e.endsWith(`.request.json`)).flatMap(e=>{let n=e.replace(/\.request\.json$/,``),r=L(w.join(t,e));if(!r)return[];let i=L(w.join(t,`${n}.response.json`));return[{...r,id:n,response:i}]}).sort((e,t)=>String(e.createdAt??``).localeCompare(String(t.createdAt??``))):[]}function Ct(e,t,n){let r=xt(e),i=w.join(r,`${t}.request.json`);if(!C.existsSync(i))throw Error(`No pending approval "${t}" for this job.`);C.writeFileSync(w.join(r,`${t}.response.json`),`${JSON.stringify({decision:n,answeredAt:new Date().toISOString()},null,2)}\n`,`utf8`)}async function wt(e,t,{timeoutMs:n,onEvent:r}){let i=xt(e);C.mkdirSync(i,{recursive:!0});let a=`apr-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`;C.writeFileSync(w.join(i,`${a}.request.json`),`${JSON.stringify({...t,createdAt:new Date().toISOString()},null,2)}\n`,`utf8`),r?.({kind:`approval-escalated`,approvalId:a,summary:t.summary,message:`Approval needed (${a}): ${t.summary}. Answer with: coder approve ${w.basename(e)} ${a} [--deny]`});let o=w.join(i,`${a}.response.json`),s=Date.now()+n;for(;Date.now()<s;){if(C.existsSync(o))try{let e=JSON.parse(C.readFileSync(o,`utf8`)).decision===`accept`?`accept`:`decline`;return r?.({kind:`approval-answered`,approvalId:a,decision:e}),e}catch{}await new Promise(e=>setTimeout(e,400))}return r?.({kind:`approval-timeout`,approvalId:a,message:`Approval ${a} timed out; declining.`}),`decline`}function Tt(e,t={}){return wt(e,{method:`simulate`,summary:`simulated approval probe (--simulate-approval)`},{timeoutMs:t.timeoutMs??12e4,onEvent:t.onEvent??null})}function Et({workspaceRoot:e,jobDir:t,mode:n=`auto`,escalationTimeoutMs:r=12e4,allowedNetworkHosts:i=[],onEvent:a=null}){return async(o,s,c)=>{if(o===`item/commandExecution/requestApproval`){let e=s.command??c?.itemIndex?.get(s.itemId??``)?.command??``,l=`run command: ${e||`(unknown command)`}${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=yt(e,{networkHost:s.networkApprovalContext?.host??null,allowedNetworkHosts:i});return a?.({kind:`approval-decision`,method:o,decision:u.decision,reason:u.reason,summary:l}),u.decision===`escalate`?{decision:await wt(t,{method:o,summary:l,command:e,params:s},{timeoutMs:r,onEvent:a})}:{decision:u.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=bt(i,e);return a?.({kind:`approval-decision`,method:o,decision:u.decision,reason:u.reason,summary:l}),u.decision===`escalate`?{decision:await wt(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.`)}}async function Dt(e,t,n=400){let r=t;for(;;){if(m.includes(r.status))return{job:r,reason:`terminal`};let t=St(a(e,r.id)).filter(e=>!e.response);if(t[0])return{job:r,reason:`approval`,approval:{id:t[0].id,summary:String(t[0].summary??``)}};await new Promise(e=>setTimeout(e,n)),r=d(e,v(e,r.id)??r)}}function Ot(e,t){let n=`${e}.${process.pid}.${k()}.tmp`;C.writeFileSync(n,`${JSON.stringify(t)}\n`,`utf8`),C.renameSync(n,e)}function kt(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 R(e,t,n){return Object.assign(Error(e),{retryable:t,...n===void 0?{}:{rpcCode:n}})}function At(e,t,n,r){if(!e||e.id!==t||e.method!==`turn/steer`&&e.method!==`turn/interrupt`)throw R(`Invalid Codex control request.`,!1);let i=e.params;if(!i||typeof i!=`object`||i.threadId!==n)throw R(`Codex control request does not match its owning thread.`,!1);if(e.method===`turn/interrupt`){if(i.turnId!==r)throw R(`Codex turn/interrupt request does not match its owning active turn.`,!1);return{method:e.method,params:i}}if(i.expectedTurnId!==r)throw R(`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 R(`Invalid Codex turn/steer input schema.`,!1);return{method:e.method,params:i}}async function jt(e,{threadId:t,turnId:n}){let r=C.mkdtempSync(w.join(D.tmpdir(),`coder-codex-control-`)),i=`file:${r}`,a=new Set,o=!1,s=!1,c=(i=!1)=>{if(!(o&&!i||s)){s=!0;try{for(let i of C.readdirSync(r).filter(e=>e.endsWith(`.request.json`))){let s=w.join(r,i),c=`${s}.${process.pid}.processing`;try{C.renameSync(s,c)}catch{continue}let l=i.slice(0,-13),u=w.join(r,`${l}.response.json`),d=(async()=>{let r;try{if(o)throw R(`Codex owner endpoint is shutting down.`,!0);let i=At(JSON.parse(C.readFileSync(c,`utf8`)),l,t,n);try{let t=await e.request(i.method,i.params);r={id:l,result:t}}catch(e){let t=e;r={id:l,error:{message:e instanceof Error?e.message:String(e),retryable:kt(e),...t.rpcCode===void 0?{}:{rpcCode:t.rpcCode}}}}}catch(e){let t=e;r={id:l,error:{message:t.message,retryable:t.retryable===!0,...t.rpcCode===void 0?{}:{rpcCode:t.rpcCode}}}}try{Ot(u,r)}finally{try{C.unlinkSync(c)}catch{}}})();a.add(d),d.then(()=>a.delete(d),()=>a.delete(d))}}catch{}finally{s=!1}}},l=setInterval(c,10);return l.unref?.(),{endpoint:i,async close(){o||(o=!0,clearInterval(l),c(!0),await Promise.allSettled([...a]),await new Promise(e=>setTimeout(e,50)),C.rmSync(r,{recursive:!0,force:!0}))}}}function Mt(e){if(e?.startsWith(`file:`)&&e.length>5){let t=w.resolve(e.slice(5)),n=w.resolve(D.tmpdir());w.dirname(t)===n&&w.basename(t).startsWith(`coder-codex-control-`)&&C.rmSync(t,{recursive:!0,force:!0})}}async function Nt(e,t,n,r=3e3){if(!e)return{ok:!1,retryable:!0,detail:`Codex owner endpoint is not ready.`};if(!e.startsWith(`file:`)||e.length===5)return{ok:!1,retryable:!1,detail:`Unsupported Codex control endpoint: ${e}`};let i=e.slice(5);if(!C.existsSync(i))return{ok:!1,retryable:!0,detail:`Codex owner endpoint is no longer available.`};let a=k(),o=w.join(i,`${a}.request.json`),s=w.join(i,`${a}.response.json`);try{Ot(o,{id:a,method:t,params:n})}catch(e){return{ok:!1,retryable:e.code===`ENOENT`,detail:e instanceof Error?e.message:String(e)}}let c=Date.now();for(;Date.now()-c<r;){try{let e=JSON.parse(C.readFileSync(s,`utf8`));try{C.unlinkSync(s)}catch{}return e?.id===a?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(!C.existsSync(i))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 Pt=`Coder Task`;function Ft(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(`
|
|
17
|
-
`)}function It(e,t=72){let n=String(e??``).trim().replace(/\s+/g,` `);return n?n.length<=t?n:`${n.slice(0,t-3)}...`:``}function Lt(e){let t=It(e,56);return t?`${Pt}: ${t}`:Pt}function Rt(e){return e?.params?.threadId??null}function zt(e){return e?.params?.turnId?e.params.turnId:e?.params?.turn?.id?e.params.turn.id:null}function Bt(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 Vt(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 Ht(e){try{let t=C.readFileSync(e,`utf8`),n=t?t.split(/\r\n|\r|\n/).length-+!!t.endsWith(`
|
|
18
|
-
`):0;return n>0?[n===1?`L1`:`L1-L${n}`]:[]}catch{return[]}}function Ut(e,t,n){let r=typeof e.kind==`string`?e.kind:e.kind?.type??`change`,i=e.path||`(unknown path)`,a=Vt(e.diff??``,r),o=a.length||r!==`add`||!t?a:Ht(i),s=typeof e.kind==`object`&&e.kind?.move_path?` -> ${n?I(n,e.kind.move_path):e.kind.move_path}`:``;return`${r} ${n?I(n,i):i}${s}${o.length?` ${o.join(`, `)}`:``}`}function Wt(e,t=!1,n){return(e.changes??[]).map(e=>Ut(e,t,n)).join(`; `)}function Gt(e){let t=e.trim().split(` `)[0]??``;return t===`/dev/null`?``:t.replace(/^[ab]\//,``)}function Kt(e,t){let n=new Map,r=``,i=``;for(let t of e.split(/\r?\n/)){if(t.startsWith(`--- `)){r=Gt(t.slice(4));continue}if(t.startsWith(`+++ `)){i=Gt(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?I(t,e):e} ${n.join(`, `)}`).join(`; `)}function qt(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 Jt(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 Yt(e){return String(e??``).replace(/\s+/g,` `).trim()}function z(e){if(!e)return[];if(typeof e==`string`){let t=Yt(e);return t?[t]:[]}if(Array.isArray(e))return e.flatMap(e=>z(e));if(typeof e==`object`){let t=e;if(typeof t.text==`string`)return z(t.text);if(`summary`in t)return z(t.summary);if(`content`in t)return z(t.content);if(`parts`in t)return z(t.parts)}return[]}function Xt(e,t){let n=[];for(let r of[...e,...t]){let e=Yt(r);!e||n.includes(e)||n.push(e)}return n}function B(e,t,n=null,r={}){!e||t==null||e({message:t,phase:n,...r})}function Zt(e,t){t&&B(e,t.message,t.phase??null,t.extra??{})}function Qt(e){return e.replace(/^\/(?:usr\/)?bin\/\w*sh\s+-l?c\s+/,``)}function $t(e,t){switch(e.type){case`commandExecution`:return{message:Qt(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 en(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=z(e.summary).join(`
|
|
19
|
-
`);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:Wt(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 tn(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 nn(e){e.completionTimer&&=(clearTimeout(e.completionTimer),null)}function rn(e,t=null){e.completed||(nn(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 an(e){e.completed||e.finalTurn||!e.finalAnswerSeen||e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||(nn(e),e.completionTimer=setTimeout(()=>{e.completionTimer=null,!(e.completed||e.finalTurn||!e.finalAnswerSeen)&&(e.pendingCollaborations.size>0||e.activeSubagentTurns.size>0||rn(e,null))},250),e.completionTimer.unref?.())}function on(e,t){let n=Rt(t);if(!n||!e.threadIds.has(n))return!1;let r=e.threadTurnIds.get(n)??null,i=zt(t);return r===null||i===null||i===r}function sn(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),an(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,an(e)));return}if(t.type===`reasoning`&&n===`completed`){e.reasoningSummary=Xt(e.reasoningSummary,z(t.summary));return}if(t.type===`fileChange`&&n===`completed`){e.fileChanges.push(t);return}t.type===`commandExecution`&&n===`completed`&&e.commandExecutions.push(t)}function cn(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),B(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`:sn(e,t.params.item,`started`,t.params.threadId??null),Zt(e.onProgress,$t(t.params.item,e.cwd));break;case`item/completed`:{sn(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(I(e.cwd,t.path));Zt(e.onProgress,en(n,e.cwd));break}case`thread/tokenUsage/updated`:{let n=qt(t.params?.tokenUsage?.total??t.params?.tokenUsage),r=Rt(t);if(n&&r){e.tokenUsageByThread.set(r,n);let t=Jt(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=Kt(String(t.params?.diff??``),e.cwd).split(`; `).filter(t=>!e.reportedChanges.has(t.split(` `)[0]??``)).join(`; `);n&&n!==e.lastDiffSummary&&(e.lastDiffSummary=n,B(e.onProgress,`changed: ${n}`,`editing`,{kind:`status`}));break}case`item/autoApprovalReview/completed`:{let n=t.params?.review??{},r=t.params?.action??{},i=Qt(String(r.command??r.type??``).trim());B(e.onProgress,`auto-review ${n.status}${n.riskLevel?` (${n.riskLevel} risk)`:``}: ${It(i,48)}${n.rationale?` — ${It(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,B(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),an(e);break}B(e.onProgress,`Turn ${t.params.turn.status}.`,`finalizing`,{kind:`status`}),rn(e,t.params.turn)}}async function ln(e,t,n,r={}){let i=tn(t,r),a=e.notificationHandler;e.setNotificationHandler(e=>{if(!i.turnId){i.bufferedNotifications.push(e);return}if(e.method===`thread/started`){cn(i,e);return}if(!on(i,e)){a?.(e);return}cn(i,e)});let o=r.onApprovalRequest;o&&e.setServerRequestHandler((e,t)=>o(e,t,i));try{let e=await n();i.turnId=e.turn?.id??null,i.turnId&&(i.threadTurnIds.set(i.threadId,i.turnId),await r.onTurnStarted?.(i.turnId));for(let e of i.bufferedNotifications)on(i,e)?cn(i,e):a?.(e);return i.bufferedNotifications.length=0,e.turn?.status&&e.turn.status!==`inProgress`&&rn(i,e.turn),await i.completion}finally{nn(i),e.setNotificationHandler(a??null),e.setServerRequestHandler(null)}}async function un(e,t,n={}){let r=n.connect??ee.connect,i=null;try{i=await r(e);let n=await t(i);return await i.close(),n}catch(n){let a=n,o=i?.transport===`broker`||!!process.env.CODER_APP_SERVER_ENDPOINT,s=i?.transport===`broker`&&a?.rpcCode===-32001||o&&(a?.code===`ENOENT`||a?.code===`ECONNREFUSED`);if(i&&=(await i.close().catch(()=>{}),null),!s)throw n;let c=await r(e,{disableBroker:!0});try{return await t(c)}finally{await c.close()}}}function V(e){let t=_(`codex`,[`--version`],{cwd:e});if(!t.available)return t;let n=_(`codex`,[`app-server`,`--help`],{cwd:e});return n.available?{available:!0,detail:`${t.detail}; app-server runtime available`}:{available:!1,detail:`${t.detail}; app-server runtime unavailable: ${n.detail}`}}async function dn(e){let t=V(e);if(!t.available)return{available:!1,loggedIn:!1,detail:t.detail};let n=null;try{n=await ee.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=E(`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 fn(e,{endpoint:t,threadId:n,turnId:r}){if(!n||!r)return{interrupted:!1,detail:`missing threadId or turnId`};let i=await Nt(t,`turn/interrupt`,{threadId:n,turnId:r});return i.ok?{interrupted:!0,detail:`Interrupted ${r} on ${n}.`}:{interrupted:!1,detail:i.detail}}async function pn(e,{endpoint:t,threadId:n,turnId:r,text:i}){if(!n)return{steered:!1,retryable:!0,detail:`missing active threadId`};if(!r)return{steered:!1,retryable:!0,detail:`missing active turnId`};let a=i.trim();if(!a)return{steered:!1,retryable:!1,detail:`empty follow-up`};let o=await Nt(t,`turn/steer`,{threadId:n,input:[{type:`text`,text:a,text_elements:[]}],expectedTurnId:r});return o.ok?o.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(o.result?.turnId??`(missing)`)}; expected ${r}`}:{steered:!1,retryable:o.retryable,detail:o.detail}}async function mn(e,t={}){let n=V(e);if(!n.available)throw Error(`Codex CLI is not available: ${n.detail}`);let i=t.prompt?.trim();if(!i)throw Error(`A prompt is required.`);return un(e,async n=>{let a=null,s;if(t.resumeThreadId)B(t.onProgress,`Resuming thread ${t.resumeThreadId}.`,`starting`,{kind:`status`}),r(t.resumeThreadId)&&await o(t.resumeThreadId),s=(await n.request(`thread/resume`,{threadId:t.resumeThreadId,cwd:e,model:t.model??null,modelProvider:t.modelProvider??null,config:t.configOverrides??null,approvalPolicy:t.approvalPolicy??`never`,sandbox:t.sandbox??`read-only`,...t.approvalsReviewer?{approvalsReviewer:t.approvalsReviewer}:{}})).thread.id;else if(B(t.onProgress,`Starting Codex task thread.`,`starting`,{kind:`status`}),s=(await n.request(`thread/start`,{cwd:e,model:t.model??null,modelProvider:t.modelProvider??null,config:t.configOverrides??null,approvalPolicy:t.approvalPolicy??`never`,sandbox:t.sandbox??`read-only`,...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:s,name:Lt(i)})}catch(e){let t=String(e?.message??e??``);if(!t.includes(`unknown variant`)&&!t.includes(`unknown method`))throw e}B(t.onProgress,`Thread ready (${s}).`,`starting`,{kind:`status`,threadId:s});let c;try{c=await ln(n,s,()=>n.request(`turn/start`,{threadId:s,input:[{type:`text`,text:i,text_elements:[]}],model:t.model??null,effort:t.effort??null,outputSchema:t.outputSchema??null}),{cwd:e,onProgress:t.onProgress,onHeartbeat:t.onHeartbeat,onApprovalRequest:t.onApprovalRequest,onTurnStarted:t.onControlReady?async e=>{a=await jt(n,{threadId:s,turnId:e}),t.onControlReady?.(a.endpoint,s,e)}:void 0})}finally{await a?.close()}return{status:c.finalTurn?.status===`completed`?0:1,threadId:s,turnId:c.turnId,finalMessage:c.lastAgentMessage,reasoningSummary:c.reasoningSummary,turn:c.finalTurn,error:c.error,stderr:Ft(n.stderr),fileChanges:c.fileChanges,touchedFiles:Bt(c.fileChanges),tokens:Jt(c),model:t.model??null,commandExecutions:c.commandExecutions}})}const hn={chain:[`codex`,`claude`],agents:{codex:{model:`gpt-5.6-terra`,effort:`high`,permissions:`auto`},claude:{model:`opus`,effort:`medium`,permissions:`auto`}},models:{},approvals:{escalationTimeoutMs:12e4,allowedNetworkHosts:[]}},H={spark:`gpt-5.3-codex-spark`,luna:`gpt-5.6-luna`,terra:`gpt-5.6-terra`,sol:`gpt-5.6-sol`},gn=new Set([`low`,`medium`,`high`]),U={haiku:`haiku`,sonnet:`sonnet`,opus:`opus`,fable:`fable`},_n=new Set([`low`,`medium`,`high`]),vn={"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`}},yn={"read-only":[`--permission-mode`,`dontAsk`,`--disallowedTools`,`Edit`,`Write`,`NotebookEdit`],"workspace-write":[`--permission-mode`,`acceptEdits`],auto:[`--permission-mode`,`auto`]},bn=[`--permission-mode`,`dontAsk`,`--disallowedTools`,`Edit`,`Write`,`NotebookEdit`,`Bash`,`WebFetch`,`WebSearch`,`Task`],xn=/failIfUnavailable|sandbox\b[^.\n]*?(?:failed|could ?n[o']t|cannot|unavailable|not available|not supported)/i;function Sn(e){return e.flatMap(e=>le.isIPv6(e)?[`[${e}]`]:e.startsWith(`[`)||e.includes(`:`)||le.isIP(e)?[e]:[e,`*.${e}`])}function Cn(e,t,n=[],r=[]){return JSON.stringify(e===`read-only`?{...r.length?{permissions:{additionalDirectories:r}}:{},sandbox:{enabled:!0,failIfUnavailable:!0,autoAllowBashIfSandboxed:!0,filesystem:{denyWrite:[t,...r]}}}:{sandbox:{enabled:!0,autoAllowBashIfSandboxed:!0,...e===`auto`&&n.length?{network:{allowedDomains:Sn(n)}}:{}}})}const wn=O.enum([`codex`,`claude`]),Tn=O.enum([`codex`,`claude`,`custom`]),En=O.enum([`low`,`medium`,`high`]),Dn=O.enum([`read-only`,`workspace-write`,`auto`]),On=O.partial(O.strictObject({model:O.string().check(O.minLength(1)),effort:En,permissions:Dn})),kn=O.strictObject({baseUrl:O.url(),model:O.string().check(O.minLength(1)),envKey:O.optional(O.string().check(O.minLength(1))),wireApi:O.optional(O.enum([`chat`,`responses`])),disabled:O.optional(O.boolean())}),An=O.strictObject({provider:wn,model:O.string().check(O.minLength(1)),effort:O.optional(En),disabled:O.optional(O.boolean())}),jn=O.strictObject({disabled:O.boolean()}),Mn=O.union([kn,An,jn]),Nn=O.strictObject({escalationTimeoutMs:O.number().check(O.positive()),allowedNetworkHosts:O.array(O.string())}),Pn=O.strictObject({chain:O.array(Tn).check(O.minLength(1)),agents:O.partial(O.strictObject({codex:On,claude:On,custom:On})),models:O.optional(O.record(O.string().check(O.regex(/^[a-z0-9][a-z0-9./_-]*$/i,`model name`)),Mn)),approvals:Nn}),Fn=O.partial(O.extend(Pn,{approvals:O.partial(Nn)}));function W(e){return`baseUrl`in e}function In(e){return`provider`in e}function Ln(e){let t=Fn.safeParse(e);if(!t.success)return t.error.issues.map(e=>`${e.path.join(`.`)||`config`}: ${e.message}`);let n=zn(hn,t.data),r=[];for(let[e,i]of Object.entries(t.data.models??{})){if(e===`codex`||e===`claude`||e===`custom`){r.push(`models.${e}: reserved agent name`);continue}if(In(i)){let t=n.models?.[i.model];t&&!W(t)&&r.push(`models.${e}: alias target "${i.model}" is itself a config entry`)}}return r}function Rn(e){if(!C.existsSync(e))return null;try{return JSON.parse(C.readFileSync(e,`utf8`))}catch(t){let n=t instanceof Error?t.message:String(t);throw Error(`Invalid JSON in ${e}: ${n}`)}}function zn(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`?zn(r[e],i):i;return n}function Bn(){return w.join(n(),`config.json`)}function Vn(e){let t=s(e),n=hn;for(let e of[Bn(),w.join(t,`coder.config.json`)]){let t=Rn(e);if(!t)continue;let r=Ln(t);if(r.length)throw Error(`Invalid config in ${e}:\n ${r.join(`
|
|
20
|
-
`)}`);n=zn(n,t)}let r=Ln(n);if(r.length)throw Error(`Invalid merged config:\n ${r.join(`
|
|
21
|
-
`)}`);return n}function Hn(e){return e.replace(/\/+$/,``).replace(/\/(chat\/completions|completions|responses)$/,``)}function Un(e,t,n){let r=[w.join(s(e),`coder.config.json`),Bn()];for(let e of r){let r;try{r=Rn(e)}catch{continue}if(r?.models?.[t])return Object.assign(r.models[t],n),!Ln(r).length&&(C.writeFileSync(e,`${JSON.stringify(r,null,2)}\n`,`utf8`),!0)}return!1}function Wn(e){return/\/(chat\/completions|completions|responses)\/*$/.test(e)}function Gn(e,t){let n=Hn(e);return Wn(e)||/\/v\d+(alpha|beta)?$/.test(n)?[`${n}/${t}`]:[`${n}/${t}`,`${n}/v1/${t}`]}function Kn(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??Hn(r.baseUrl),...r.envKey&&!n?{env_key:r.envKey}:{},wire_api:`responses`}}}}function qn(e){return e?H[e]??e:null}function Jn(e){return e in H||e in U}function Yn(e,t){return!!(t&&e.models?.[t]?.disabled)}function Xn(e,t){if(Yn(e,t))throw Error(`model "${t}" is disabled in config`)}function Zn(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 agent spec "${e}".`);let r=null,i=null,a=null,o=e=>gn.has(e)||_n.has(e);for(let t of n)if(t===`codex`||t===`claude`||t===`custom`){if(r)throw Error(`Invalid agent spec "${e}".`);r=t}else if(o(t)&&!a)a=t;else if(!i)i=t;else throw Error(`Invalid agent spec "${e}".`);let s=i?t.models?.[i]:void 0;if(s&&In(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.agents[r]??{},l=i??c.model??null;return Xn(t,l),{agent:r,model:l,effort:a??c.effort??null}}function Qn(e){let t=Bn();return C.mkdirSync(w.dirname(t),{recursive:!0}),C.writeFileSync(t,`${JSON.stringify(e,null,2)}\n`,`utf8`),t}const $n=new Set([`Write`,`Edit`,`MultiEdit`,`NotebookEdit`]);function er(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 tr(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 nr(e,t,n=!1){if(!t)return[];let r;try{r=C.readFileSync(e,`utf8`)}catch{return[]}let i=[],a=0;for(;a<=r.length;){let e=r.indexOf(t,a);if(e<0)break;let o=tr(r.slice(0,e))+1,s=Math.max(1,tr(t));if(i.push(s===1?`L${o}`:`L${o}-L${o+s-1}`),!n)break;a=e+Math.max(t.length,1)}return i.length>4?[...i.slice(0,4),`+${i.length-4} matches`]:i}function rr(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 ir(e,t,n){let r=String(t.file_path??t.notebook_path??t.path??``),i=r?w.isAbsolute(r)?r:w.resolve(n,r):``,a=r?I(n,i)||r:`(unknown path)`,o=t.path?` in ${I(n,String(t.path))}`:``;if(e===`Write`){let e=tr(String(t.content??``));return`Write ${a} ${e?`L1-L${e}`:`(empty file)`}`}if(e===`Edit`){let e=nr(i,String(t.old_string??``),t.replace_all===!0);return`Edit ${a}${e.length?` ${e.join(`, `)}`:``}`}if(e===`MultiEdit`){let e=Array.isArray(t.edits)?t.edits:[],n=e.flatMap(e=>nr(i,String(e?.old_string??``),e?.replace_all===!0));return`MultiEdit ${a}${n.length?` ${n.join(`, `)}`:``} (${e.length} edits)`}if(e===`NotebookEdit`){let e=t.cell_id??t.cell_number;return`NotebookEdit ${a}${e==null?``:` cell ${e}`}`}if(e===`Read`){let e=Number(t.offset??0),n=Number(t.limit??0);return`Read ${a}${e&&n?` L${e}-L${e+n-1}`:e?` from L${e}`:``}`}if(e===`Bash`)return`Bash ${String(t.command??``).trim()||`(no command)`}`;if(e===`Glob`)return`Glob ${String(t.pattern??``)}${o}`;if(e===`Grep`){let e=t.glob?` (${String(t.glob)})`:``;return`Grep ${String(t.pattern??``)}${o}${e}`}if(e===`Task`)return`Task ${t.subagent_type?`${String(t.subagent_type)}: `:``}${rr(t.description??t.prompt??``)}`;if(e===`WebFetch`)return`WebFetch ${String(t.url??``)}`;if(e===`WebSearch`)return`WebSearch ${String(t.query??``)}`;if(e===`TodoWrite`){let e=Array.isArray(t.todos)?t.todos:[];return`TodoWrite ${e.length} item${e.length===1?``:`s`}`}let s=Object.entries(t??{}).map(([e,t])=>`${e}=${rr(t)}`).join(` `);return s?`${e} ${s}`:e}function ar(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 or(){let e=E(`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 sr(){let e=E(`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 cr(e,t,n){let r=[`-p`,`--input-format`,`stream-json`,`--output-format`,`stream-json`,`--verbose`,`--replay-user-messages`];r.push(t.resumeSessionId?`--resume`:`--session-id`,n),t.model&&r.push(`--model`,t.model),t.effort&&r.push(`--effort`,t.effort);let i=t.permissions??`auto`,a=i===`read-only`?t.additionalDirectories??[]:[],o=i===`read-only`?t.readOnlyAllowedTools??[]:[];if(i===`auto`&&t.approvalJobId){let n=JSON.stringify({mcpServers:{coder:{type:`stdio`,command:S.execPath,args:[g,`_mcp`,t.approvalJobId,`--cwd`,e]}}});r.push(`--permission-mode`,`default`,`--mcp-config`,n,`--permission-prompt-tool`,`mcp__coder__approval_prompt`)}else o.length?r.push(...bn,`--allowedTools`,...o):r.push(...yn[i]??yn.auto);for(let e of a)r.push(`--add-dir`,e);let s=Cn(i,e,t.allowedNetworkHosts??[],a);return s&&r.push(`--settings`,s),r}function lr(e,t){return Object.assign(Error(e),{retryable:t})}function ur(e){return{type:`user`,message:{role:`user`,content:[{type:`text`,text:e}]}}}function dr(e){let t=!0;return{sendInitial(t){return new Promise((n,r)=>{e(`${JSON.stringify(ur(t))}\n`,e=>{e?r(e):n()})})},sendSteer(n){return t?new Promise((t,r)=>{e(`${JSON.stringify(ur(n))}\n`,e=>{if(!e){t();return}let n=e.code,i=n===`EPIPE`||n===`ERR_STREAM_DESTROYED`||n===`ERR_STREAM_WRITE_AFTER_END`;r(lr(`Failed to write Claude live steer: ${e.message}`,i))})}):Promise.reject(lr(`Claude turn is no longer accepting live input.`,!0))},stopAccepting(){t=!1}}}function fr(e,t){let n=`${e}.${S.pid}.${k()}.tmp`;C.writeFileSync(n,`${JSON.stringify(t)}\n`,`utf8`),C.renameSync(n,e)}async function pr(e){let t=C.mkdtempSync(w.join(D.tmpdir(),`coder-claude-steer-`)),n=`file:${t}`,r=new Set,i=!1,a=!1,o=(n=!1)=>{if(!(i&&!n||a)){a=!0;try{for(let n of C.readdirSync(t).filter(e=>e.endsWith(`.request.json`))){let i=w.join(t,n),a=`${i}.${S.pid}.processing`;try{C.renameSync(i,a)}catch{continue}let o=n.slice(0,-13),s=w.join(t,`${o}.response.json`),c=(async()=>{let t;try{let n=JSON.parse(C.readFileSync(a,`utf8`)),r=typeof n?.params?.text==`string`?n.params.text.trim():``;if(n?.method!==`turn/steer`||!r||n?.id!==o)t={id:o,error:{message:`Invalid Claude steer request.`,retryable:!1}};else try{await e(r),t={id:o,result:{accepted:!0}}}catch(e){let n=e;t={id:o,error:{message:n.message,retryable:n.retryable===!0}}}}catch(e){t={id:o,error:{message:`Invalid Claude steer JSON: ${e instanceof Error?e.message:String(e)}`,retryable:!1}}}try{fr(s,t)}finally{try{C.unlinkSync(a)}catch{}}})();r.add(c),c.then(()=>r.delete(c),()=>r.delete(c))}}catch{}finally{a=!1}}},s=setInterval(o,10);return{endpoint:n,async close(){i=!0,clearInterval(s),o(!0),await Promise.allSettled([...r]),await new Promise(e=>setTimeout(e,50)),C.rmSync(t,{recursive:!0,force:!0})}}}async function mr(e,t,n=3e3){if(!e)return{steered:!1,retryable:!0,detail:`Claude live steer endpoint is not ready.`};let r=t.trim();if(!r)return{steered:!1,retryable:!1,detail:`empty follow-up`};if(!e.startsWith(`file:`)||e.length===5)return{steered:!1,retryable:!1,detail:`Unsupported Claude steer endpoint: ${e}`};let i=e.slice(5);if(!C.existsSync(i))return{steered:!1,retryable:!0,detail:`Claude live steer endpoint is no longer available.`};let a=k(),o=w.join(i,`${a}.request.json`),s=w.join(i,`${a}.response.json`);try{fr(o,{id:a,method:`turn/steer`,params:{text:r}})}catch(e){return{steered:!1,retryable:e.code===`ENOENT`,detail:e instanceof Error?e.message:String(e)}}let c=Date.now();for(;Date.now()-c<n;){try{let e=JSON.parse(C.readFileSync(s,`utf8`));try{C.unlinkSync(s)}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 hr(e,t){let n=t.resumeSessionId??k(),r=cr(e,t,n);return t.onProgress?.({kind:`status`,message:`claude turn started (session ${n})`,threadId:n}),new Promise((i,a)=>{let o=T(t.executable??`claude`,r,{cwd:e,stdio:[`pipe`,`pipe`,`pipe`]}),s=``,c=``,l=[],u=null,d=n,f=null,p=!1,m=dr((e,t)=>o.stdin.write(e,t)),h=Date.now(),g=new Map,_=0,v=0,y=new Set,b=n=>{if(!(!n||typeof n!=`object`)){if(t.onHeartbeat?.(),n.type===`system`&&n.subtype===`init`&&n.session_id)d=n.session_id;else if(n.type===`assistant`){let r=ar(n.message?.usage);if(r){_+=r.output;let e=r.input+r.cachedInput+_;(!v||e-v>=1e3)&&(v=e,t.onProgress?.({kind:`usage`,tokens:{...r,output:_,total:e},threadId:d}))}for(let r of n.message?.content??[])if(r?.type===`tool_use`){let n=String(r.name??`Tool`);if(r.id&&g.set(String(r.id),{name:n,at:Date.now()}),$n.has(n)){let t=String(r.input?.file_path??r.input?.notebook_path??``);t&&y.add(w.isAbsolute(t)?t:w.resolve(e,t))}t.onProgress?.({kind:`tool`,tool:n,message:ir(n,r.input??{},e),threadId:d})}else r?.type===`text`&&typeof r.text==`string`&&r.text.trim()?t.onProgress?.({kind:`assistant`,message:r.text.trim(),threadId:d}):r?.type===`thinking`&&typeof r.thinking==`string`&&r.thinking.trim()&&t.onProgress?.({kind:`reasoning`,message:r.thinking.trim(),durationMs:Math.max(1e3,Date.now()-h),threadId:d})}else if(n.type===`user`){for(let e of n.message?.content??[])if(e?.type===`tool_result`){let n=er(e.content).trim(),r=e.is_error===!0;if(!n&&!r)continue;let i=e.tool_use_id?g.get(String(e.tool_use_id)):void 0;e.tool_use_id&&g.delete(String(e.tool_use_id)),t.onProgress?.({kind:`tool-result`,...i?{tool:i.name,durationMs:Date.now()-i.at}:{},...r?{isError:!0}:{},message:n||`(tool failed with no output)`,threadId:d})}}else n.type===`result`&&(u=n,n.session_id&&(d=n.session_id),m.stopAccepting(),o.stdin.end());h=Date.now()}};o.stdout.on(`data`,e=>{s+=e;let t;for(;(t=s.indexOf(`
|
|
22
|
-
`))>=0;){let e=s.slice(0,t).trim();if(s=s.slice(t+1),e)try{b(JSON.parse(e))}catch(e){l.push(`Invalid Claude stream-json output: ${e instanceof Error?e.message:String(e)}`)}}}),o.stderr.on(`data`,e=>{c+=e});let x=()=>{m.stopAccepting(),o.kill(`SIGTERM`);let e=f?.endpoint;e?.startsWith(`file:`)&&C.rmSync(e.slice(5),{recursive:!0,force:!0}),S.exit(143)};S.on(`SIGTERM`,x),(async()=>{t.onSteerReady&&(f=await pr(e=>m.sendSteer(e))),await m.sendInitial(t.prompt),f&&t.onSteerReady?.(f.endpoint)})().catch(e=>{p||(p=!0,m.stopAccepting(),o.kill(`SIGTERM`),S.removeListener(`SIGTERM`,x),f?.close(),a(e))}),o.on(`error`,e=>{p||(p=!0,m.stopAccepting(),S.removeListener(`SIGTERM`,x),f?.close(),a(Error(`claude spawn failed: ${e.message}`)))}),o.on(`close`,async e=>{if(p)return;p=!0,m.stopAccepting(),S.removeListener(`SIGTERM`,x),await f?.close();let n=s.trim();if(n)try{b(JSON.parse(n))}catch(e){l.push(`Invalid trailing Claude stream-json output: ${e instanceof Error?e.message:String(e)}`)}let r=(u?.result??``).trim(),a=e!==0||u?.is_error===!0||u==null||l.length>0;i({status:+!!a,threadId:u?.session_id??d,turnId:null,finalMessage:r,touchedFiles:[...y],tokens:ar(u?.usage),model:u?.modelUsage&&Object.keys(u.modelUsage).join(`+`)||t.model||null,error:a?{message:l[0]||r||c.trim()||`claude exited ${e}`}:null})})})}function gr(e){E(`claude`,[`plugin`,`marketplace`,`remove`,`coder-plugins`],{encoding:`utf8`});let t=E(`claude`,[`plugin`,`marketplace`,`add`,e],{encoding:`utf8`}),n=E(`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 _r(){return w.join(D.homedir(),`.agents`,`skills`,`coder`)}function vr(){try{let e=C.readFileSync(w.join(_r(),`SKILL.md`),`utf8`);return/^\s*version:\s*(\S+)/m.exec(e)?.[1]??null}catch{return null}}function yr(e){let t=_r();try{let n=w.join(e,`plugins`,`agents`,`skills`,`coder`);C.rmSync(t,{recursive:!0,force:!0}),C.mkdirSync(t,{recursive:!0}),C.cpSync(n,t,{recursive:!0});let r=w.join(t,`SKILL.md`),i=C.readFileSync(r,`utf8`).replace(`
|
|
23
|
-
---
|
|
24
|
-
`,`\nmetadata:\n version: ${b()}\n---\n`);return C.writeFileSync(r,i),{marketplace:t,installed:!0,note:`Skill installed to ~/.agents/skills/coder; restart running sessions to load it.`}}catch(e){return{marketplace:t,installed:!1,note:`Skill install failed: ${e instanceof Error?e.message:String(e)}`}}}function br(e){if(e.available)return null;let t=E(`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`}}function xr(e){let t=/(\d+\.\d+\.\d+)/.exec(String(e??``));return t?t[1]:null}function Sr(e){if(!e.available)return null;let t=xr(e.detail);if(!t||it(t,`0.144.0`)>=0)return null;let n=E(`codex`,[`update`],{encoding:`utf8`});return n.status!==0&&(n=E(`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 GPT-5.6 model (needs >= 0.144.0); auto-update failed: ${(n.stderr||`codex/npm not found`).trim()}. Run: codex update`}}const Cr=/usage|quota|rate.?limit|429|401|unauthorized|not authenticated|login|insufficient|exhausted|not available|ENOENT/i,wr=`CODER_WORKER`;var G=class extends Error{code;hint;taskId;payload;approval;result;runId;constructor(e,t,n={}){super(t),this.name=`CoderError`,this.code=e,Object.assign(this,n)}},Tr=class extends Error{agent;detail;constructor(e,t){super(t),this.agent=e,this.detail=t}};function Er(e,t){let n=e.agent,r=!!n,i=e.model,a=e.effort,o=e=>{let n=e?t.models?.[e]:void 0;return n&&In(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=Zn(i,t)}catch(e){throw new G(`invalid-option`,e instanceof Error?e.message:String(e))}e&&(r||(n=e.agent),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`)),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 G(`invalid-option`,`Invalid --agent "${n}". Use codex, claude, or custom.${e}`)}let c=t.agents[n]??{},l=i??c.model??null,u=a??c.effort??null;if(o(l)){let e;try{e=Zn(l,t)}catch(e){throw new G(`invalid-option`,e instanceof Error?e.message:String(e))}e&&(r||(n=e.agent),l=e.model,u=a??e.effort??u)}let d=e.permissions??c.permissions??`auto`;try{Xn(t,l)}catch(e){throw new G(`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 G(`invalid-option`,l?`No custom model named "${l}". Configured: ${e.join(`, `)||`none`}.`:`No custom model to run: pass --model <name> or set agents.custom.model.`,{hint:`Add one: coder model add <name> --base-url <url> --model <id>`})}let f=n===`claude`?`claude`:`codex`;if(!(d in vn))throw new G(`invalid-option`,`Invalid --permissions "${d}". Use one of: ${Object.keys(vn).join(`, `)}`);if(f===`codex`&&u&&!gn.has(u))throw new G(`invalid-option`,`Invalid codex --effort "${u}". Use one of: ${[...gn].join(`, `)}`);if(f===`claude`&&u&&!_n.has(u))throw new G(`invalid-option`,`Invalid claude --effort "${u}". Use one of: ${[..._n].join(`, `)}`);return{engine:f,agent:n,model:l,effort:u,permissions:d}}function Dr(e,t){return e===`read-only`&&xn.test(t??``)}function Or(e,t){let n=a(e,t),r=C.openSync(w.join(n,`worker.log`),`a`),i=T(S.execPath,[g,`_worker`,t,`--cwd`,e],{cwd:e,detached:!0,stdio:[`ignore`,r,r],env:{...S.env,[wr]:`1`}});i.unref(),C.closeSync(r),h(e,t,{pid:i.pid??null})}async function kr(e,n,r,i){let o=r.cwd,s=n.engine===`codex`?V(o):or(),l=n.model?e.models?.[n.model]:void 0;if(!s.available&&l&&W(l)){let e=br(s);r.onInstallNote?.(e.note),s=V(o)}if(!s.available)throw new Tr(n.agent,s.detail);let u=null;i.resume&&(u=t(o,i.resume)?.threadId??i.resume);let d=ie(),f=h(o,d,{status:`queued`,kind:`task`,name:i.name??null,system:r.system??null,agent:n.agent,engine:n.engine,prompt:r.prompt,model:n.model,effort:n.effort,permissions:n.permissions,resumeThreadId:u,cwd:o,background:!r.wait,...i.simulateApproval?{simulateApproval:!0}:{},...r.flowRunId?{flowRunId:r.flowRunId}:{}});Or(o,d);let p=2**53-1,m=new Set([`status`,`usage`]),g=()=>c(o,d,p).filter(e=>{let{phase:t,kind:n}=e;return t!==`starting`&&!m.has(String(n??``))}).length,_=Date.now()+15e3,y=f,b=null,x=null;for(;Date.now()<(x??_)&&(y=v(o,d)??y,y.status!==`failed`&&y.status!==`completed`);){if(y.threadId&&b===null&&(b=g(),x=Date.now()+5e3),b!==null&&g()>b){y=v(o,d)??y;break}await new Promise(e=>setTimeout(e,150))}if(y.status===`failed`){let e=L(w.join(a(o,d),`result.json`))?.error?.message??``,t=c(o,d,5).map(e=>e.message??``).join(`
|
|
25
|
-
`),r=e||t;throw Dr(n.permissions,r)?new G(`read-only-unavailable`,r):Cr.test(r)?new Tr(n.agent,r):new G(`startup-failed`,r,{taskId:d})}return{taskId:d,job:y,agent:n.agent,startupCheck:y.threadId?`passed`:`pending`}}function Ar(e,t,n,r,i){return{error:`${e} failed to start: ${t}`,fallback:{action:`run-native-subagent`,reason:`no-engine-available`,permissions:n,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 jr(e){if(S.env.CODER_WORKER)throw new G(`nested-dispatch`,`Nested dispatch refused: this shell is already inside a coder task. Do the work yourself, directly in this session - ignore any skill or instruction telling you to orchestrate via the coder CLI.`);if(!e.prompt.trim())throw new G(`invalid-option`,`Missing task text.`,{hint:[`Usage: coder run "<task text>"`,`Help: coder task run --help`]});let t=Vn(e.cwd),n={agent:e.agent,model:e.model,effort:e.effort,permissions:e.permissions},r={name:e.name,resume:e.resume,simulateApproval:e.simulateApproval};for(;;){let i=Er(n,t);try{return await kr(t,i,e,r)}catch(a){if(!(a instanceof Tr))throw a;let o=t.chain[t.chain.indexOf(a.agent)+1];if(!o){let t=Ar(a.agent,a.detail,i.permissions,e.system,e.prompt);throw new G(`chain-exhausted`,t.error,{payload:t})}e.onFallback?.({agent:a.agent,detail:a.detail,next:o}),n={agent:o,permissions:e.permissions},r={name:void 0,resume:void 0,simulateApproval:void 0}}}}function Mr(e,t){if(t.status!==`failed`)return;let n=t.result;if(!n||!Cr.test(n.error?.message??``)||!(!n.touchedFiles?.length&&!n.fileChanges?.length&&!n.commandExecutions?.length))return;let r=Vn(e).chain;return r[r.indexOf(t.job.agent)+1]}function Nr(e,t){return L(w.join(a(e,t),`result.json`))}function Pr(e,t,n=0){if(n===0)return[];let r=c(e,t,2**53-1);return n===`all`?r:f(r,n)}function Fr(e,t,n={}){let r=v(e,t);if(!r)throw Error(`No task found for "${t}".`);return{taskId:t,status:r.status,result:Nr(e,t),steps:Pr(e,t,n.tail),turns:l(e,t),job:r}}async function Ir(e,t,n={}){let r=v(e,t);if(!r)throw Error(`No task found for "${t}".`);let i=await Dt(e,r);if(i.reason===`approval`){let e=i.approval;throw new G(`approval-pending`,`Approval needed for task ${t}: ${e.summary}`,{taskId:t,approval:e})}n.onSettle?.();let a=i.job;return{taskId:t,status:a.status,result:Nr(e,t),steps:Pr(e,t,n.tail),turns:l(e,t),job:a}}const Lr=[`.ts`,`.mjs`,`.js`];function Rr(e,t){let n=[];try{n=C.readdirSync(e)}catch{return[]}let r=[];for(let i of n.sort()){let n=w.extname(i);Lr.includes(n)&&r.push({name:w.basename(i,n),path:w.join(e,i),scope:t})}return r}function zr(e){let t=s(e),r=[],i=w.resolve(e);for(;r.push({dir:w.join(i,`.coder`,`flows`),scope:`workspace`}),i!==t&&w.dirname(i)!==i;)i=w.dirname(i);return r.push({dir:w.join(n(),`flows`),scope:`global`}),r}function Br(e){let t=new Set,n=[];for(let{dir:r,scope:i}of zr(e))for(let e of Rr(r,i))t.has(e.name)||(t.add(e.name),n.push(e));return n}function Vr(e){return e.includes(`/`)||Lr.includes(w.extname(e))}function Hr(e,t){if(Vr(e)){let n=w.resolve(t,e);if(C.existsSync(n))return{name:w.basename(n,w.extname(n)),path:n};throw Error(`Flow file not found: ${e}`)}let n=Br(t).find(t=>t.name===e);if(!n)throw Error(`No flow named "${e}". Run \`coder flow discover\` to see available flows.`);return{name:n.name,path:n.path}}function Ur(e,t,n={}){if(t.length)try{T(S.execPath,[g,`_archiveSweep`,`--cwd`,e,...n.flows?[`--flows`]:[],...t],{detached:!0,stdio:`ignore`}).unref()}catch{}}async function Wr(e){let{options:n,positionals:r}=y(e,O.object({cwd:ne,flows:te})),i=et(n);for(let e of r){if(n.flows){let t=Z(e);t&&X(t);continue}let r=t(i,e);r&&re(i,r)}}async function Gr(e){let{options:t,positionals:n}=y(e,O.object({...x,"all-stopped":te}));$e(n,1,`task archive`);let r=et(t);if(t[`all-stopped`]){let e=u(r).filter(e=>m.includes(e.status));for(let t of e)re(r,t);let n=e.map(e=>e.id);if(t.json){M({archived:n,count:n.length});return}S.stdout.write(n.length?`Archived ${n.length} stopped task${n.length===1?``:`s`}.\n`:`${A.dim(`No stopped tasks to archive.`)}\n`);return}let i=n[0];i||me(`Missing task id.`,{hint:[`Archive one: coder task archive <task-id>`,`Archive all stopped: coder task archive --all-stopped`]});let a=tt(r,i);if(re(r,a),t.json){M({taskId:a.id,archived:!0});return}S.stdout.write(`Archived task ${A.cyan(a.id)}.\n`)}async function Kr(e,t,n={}){let r=t.engine===`claude`?{detail:`claude worker terminated`}:await(n.interrupt??fn)(e,{endpoint:t.steerEndpoint,threadId:t.threadId,turnId:t.turnId});if(t.engine!==`claude`&&Mt(t.steerEndpoint),t.pid&&t.status===`running`)try{S.kill(t.pid,`SIGTERM`)}catch{}return h(e,t.id,{status:`cancelled`,steerEndpoint:null,completedAt:new Date().toISOString()}),{taskId:t.id,status:`cancelled`,interrupt:r.detail}}async function qr(e){let{options:t,positionals:n}=y(e,O.object(x));$e(n,1,`task stop`);let r=et(t),i=tt(r,n[0]),{interrupt:a}=await Kr(r,i);if(t.json){M({taskId:i.id,status:`cancelled`,interrupt:a});return}S.stdout.write(`Stopped task ${A.cyan(i.id)} ${A.dim(`(${a})`)}\n`)}function Jr(e){return typeof e!=`object`||!e?JSON.stringify(e)??`null`:Array.isArray(e)?`[${e.map(Jr).join(`,`)}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Jr(e[t])}`).join(`,`)}}`}function Yr(e,t){return ue.createHash(`sha256`).update(`${e}\0${Jr(t)}`).digest(`hex`)}function Xr(e){return C.existsSync(e)?C.readFileSync(e,`utf8`).split(/\r?\n/).filter(Boolean).map(e=>{try{return JSON.parse(e)}catch{return null}}).filter(e=>e!==null):[]}var Zr=class{file;recorded;seq=0;constructor(e,t){this.file=t,this.recorded=e.map(e=>({...e})),C.writeFileSync(t,``,`utf8`)}write(e){e.seq=this.seq++,C.appendFileSync(this.file,`${JSON.stringify(e)}\n`,`utf8`)}replay(e){let t=this.recorded.find(t=>!t.consumed&&t.fingerprint===e);if(!t)return null;t.consumed=!0;let{consumed:n,...r}=t;return this.write(r),r}record(e){this.write({...e,seq:0})}};const Qr=globalThis,K=Qr.__coderFlowCtxALS??=new de,q=Qr.__coderFlowScopeALS??=new de;function $r(){return q.getStore()?.args}function ei(){return q.getStore()?.depth??0}var ti=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 ni(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 ri(e,t){if(!t.tokens)return;let n=t.model??`default`;e.ledger[n]=ni(e.ledger[n]??null,t.tokens)}function ii(e){return!!e&&typeof e.safeParse==`function`}async function ai(e){try{let t=await import(`zod`);if(typeof t.toJSONSchema==`function`)return t.toJSONSchema(e)}catch{}return null}async function oi(e){let t=await ai(e);return`Reply with ONLY a single JSON object ${t?`matching this JSON Schema:\n${JSON.stringify(t,null,2)}`:`matching the requested shape`}\nNo prose, no markdown fences — just the JSON object.`}function si(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 ci(e,t){if(!ii(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 li(e,t,n){return{cwd:t,agent:e.agent,model:e.model,effort:e.effort,permissions:e.permissions,name:e.name,system:e.system,wait:!0,flowRunId:n?.runId}}async function ui(e,t,n,r){let i=t.cwd?w.resolve(t.cwd):n?.cwd??S.cwd(),a;for(;;){let o=await jr({prompt:e,...li(t,i,n),...a?{agent:a,model:void 0,effort:void 0,resume:void 0}:{resume:r??t.resume},onFallback:e=>bi(`${e.agent} failed to start — falling back to ${e.next} (${e.detail.replace(/\s+/g,` `).slice(0,140)})`)});n?.running.add(o.taskId);let s=v(i,o.taskId),c=s?Se(s):void 0;n?.hooks.onTaskStart?.({taskId:o.taskId,name:t.name,prompt:e,agent:c,depth:ei()});let l;try{l=await Ir(i,o.taskId)}finally{n?.running.delete(o.taskId)}let u=Mr(i,l);if(u){n?.hooks.onTaskEnd?.({taskId:o.taskId,status:`failed`,tokens:null}),a=u;continue}return{taskId:o.taskId,status:l.status,output:l.result?.finalMessage||l.result?.error?.message||``,tokens:l.result?.tokens??null,model:l.result?.model??l.job.model??null}}}async function di(e,t,n){let r=e;if(t.returns&&(r=`${e}\n\n${await oi(t.returns)}`),n?.dryRun){S.stdout.write(`\n[dry-run] task${t.name?` (${t.name})`:``}:\n${r}\n`);let e={...t,returns:t.returns?`<schema>`:void 0};return S.stdout.write(`[dry-run] opts: ${JSON.stringify(e)}\n`),{taskId:`dry`,status:`completed`,output:`[dry-run]`,data:void 0,tokens:null,model:t.model??null}}let i=await ui(r,t,n);if(i.status!==`completed`){let e={...i,data:void 0};throw new G(`task-failed`,`Task ${i.taskId} ${i.status}: ${i.output||`no output`}`,{taskId:i.taskId,result:e})}let a=i.output,o=i.tokens,s;if(t.returns){let e;try{e=ci(t.returns,si(a))}catch(t){e={ok:!1,errors:t instanceof Error?t.message:String(t)}}if(e.ok)s=e.data;else{let r=await ui(`Your previous reply did not match the required format: ${e.errors}\n\n${await oi(t.returns)}`,t,n,i.taskId);a=r.output||a,o=ni(o,r.tokens);try{let e=ci(t.returns,si(a));if(!e.ok)throw Error(e.errors);s=e.data}catch(e){let t={taskId:i.taskId,status:`completed`,output:a,data:void 0,tokens:o,model:i.model};throw new G(`task-failed`,`Task ${i.taskId} produced no valid structured output: ${e instanceof Error?e.message:String(e)}`,{taskId:i.taskId,result:t})}}}return{taskId:i.taskId,status:`completed`,output:a,data:s,tokens:o,model:i.model}}async function fi(e){if(e)return await ai(e)??`<schema>`}async function pi(e,t={}){let n=K.getStore();if(!n)return di(e,t);let r=Yr(`task`,{prompt:e,agent:t.agent,model:t.model,effort:t.effort,permissions:t.permissions,name:t.name,system:t.system,resume:t.resume,cwd:t.cwd,returns:await fi(t.returns)}),i=n.journal.replay(r);if(i)return i.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 i=new Date().toISOString(),a;try{a=await di(e,t,n)}catch(e){let t=e instanceof G?e.result:void 0;throw t&&n.hooks.onTaskEnd?.({taskId:t.taskId,status:t.status===`completed`?`failed`:t.status,tokens:t.tokens}),e}return ri(n,a),n.dryRun||n.hooks.onTaskEnd?.({taskId:a.taskId,status:a.status,tokens:a.tokens}),n.journal.record({kind:`task`,fingerprint:r,result:a,taskId:a.taskId,tokens:a.tokens,startedAt:i,endedAt:new Date().toISOString()}),a})}const mi=262144;let hi=0;function gi(e){let t=[];for(let n=e;;){t.push(w.join(n,`node_modules`,`.bin`));let e=w.dirname(n);if(e===n)break;n=e}let n=S.platform===`win32`?`;`:`:`;return{...S.env,PATH:[...t,S.env.PATH??``].join(n)}}async function _i(e,t){return new Promise(n=>{let r=T(e,{shell:!0,cwd:t,env:gi(t)}),i=``,a=e=>{i.length>=mi||(i+=e,i.length>=mi&&(i=`${i.slice(0,mi)}\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 vi(e,t={}){let n=K.getStore(),r=t.cwd?w.resolve(t.cwd):n?.cwd??S.cwd();if(!n)return _i(e,r);let i=Yr(`gate`,{cmd:e,cwd:t.cwd}),a=n.journal.replay(i);if(a)return a.result;if(n.dryRun){S.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-${S.pid}-${hi+=1}`,c=ei();n.hooks.onGateStart?.({gateId:s,cmd:e,depth:c});let l=await _i(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 yi(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 bi(e){let t=K.getStore();if(t)try{C.appendFileSync(w.join(t.runDir,`flow.log`),`${JSON.stringify({at:new Date().toISOString(),message:e})}\n`,`utf8`)}catch{}t?.hooks.onLog?t.hooks.onLog(e,ei()):(S.stderr.isTTY||!t)&&S.stderr.write(`[flow] ${e}\n`)}const xi=oe(import.meta.url);function Si(e){let t=w.dirname(se(import.meta.url));for(;w.basename(t)!==`dist`&&w.dirname(t)!==t;)t=w.dirname(t);return w.basename(t)===`dist`?ce(w.join(t,e)).href:null}function Ci(e){if(!(e===`@wular/coder`||e===`@wular/coder/flow`||e===`zod`||e.startsWith(`zod/`)))return null;try{return ce(xi.resolve(e)).href}catch{}return e===`@wular/coder/flow`?Si(`flow/index.js`):e===`@wular/coder`?Si(`sdk.js`):null}const wi=/(\bfrom\s+|\bimport\s+|\bimport\s*\(\s*)(['"])([^'"]+)\2/g;function Ti(e){return e.replace(wi,(e,t,n,r)=>{let i=Ci(r);return i?`${t}${n}${i}${n}`:e})}async function Ei(e,t,n){try{return await import(ce(e).href)}catch(e){let r=e instanceof Error?e.message:String(e);throw t===`.ts`&&!S.versions?.bun&&/Unknown file extension|Unexpected token|SyntaxError|Cannot parse|import type|interface/i.test(r)?Error(`Could not run ${w.basename(n)}: TypeScript flows need bun. Run under \`bun\`, or write the flow as .mjs/.js.`):e}}async function Di(e){let t=w.extname(e),n;try{n=C.readFileSync(e,`utf8`)}catch{throw Error(`Cannot read flow file: ${e}`)}let r=Ti(n);if(r===n)return Ei(e,t,e);let i=w.dirname(e);try{for(let e of C.readdirSync(i)){if(!e.startsWith(`.__coderflow_`))continue;let t=w.join(i,e);Date.now()-C.statSync(t).mtimeMs>6e5&&C.unlinkSync(t)}}catch{}let a=`${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`,o=w.join(i,`.__coderflow_${a}${t}`),s=`__coderflow_loaded_${a}`,c=new Promise(e=>{globalThis[s]=e});C.writeFileSync(o,`globalThis[${JSON.stringify(s)}]?.();${r}`,`utf8`);let l=Ei(o,t,e);try{await Promise.race([c,l.then(()=>void 0,()=>void 0)])}finally{delete globalThis[s];try{C.unlinkSync(o)}catch{}}return await l}async function Oi(e,t){let n=q.getStore();n.args=t??{};let r=await Di(e),i=r.args,a=n.args;if(ii(i)){let e=i.safeParse(t??{});if(!e.success){let e=ci(i,t??{});throw Error(`Invalid flow args: ${e.errors??`validation failed`}`)}a=e.data,n.args=a}let o=r.default;return typeof o==`function`?o(a):o}async function ki(e,t){let n=K.getStore(),r=Hr(e,n?.cwd??S.cwd());if(!n)return q.run({args:t??{},depth:0},()=>Oi(r.path,t));let i=q.getStore();if(i&&i.depth>=1)throw Error(`flow("${e}") nesting is one level deep; a sub-flow cannot call flow().`);let a=Yr(`flow`,{name:r.name,args:t??{}}),o=n.journal.replay(a);if(o)return o.result;let s=new Date().toISOString();n.hooks.onFlowStart?.({name:r.name,depth:(i?.depth??0)+1});let c=await q.run({args:t??{},depth:(i?.depth??0)+1},()=>Oi(r.path,t));return n.journal.record({kind:`flow`,fingerprint:a,result:c,startedAt:s,endedAt:new Date().toISOString()}),c}function Ai(){return`flow-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function J(){return w.join(n(),`state`,`global`,`flows`)}function ji(){return w.join(n(),`state`,`global`,`flows-archived`)}function Y(e){ae(e,`flow run id`);let t=w.join(J(),e);if(C.existsSync(w.join(t,`flow.json`)))return t;let n=w.join(ji(),e);return C.existsSync(w.join(n,`flow.json`))?n:t}function Mi(e){if(e.archived)return e;let t={...e,archived:!0,archivedAt:new Date().toISOString()};return Q(Y(e.runId),t),t}function X(e){let t=Mi(e),n=Y(e.runId),r=w.join(ji(),e.runId);if(n!==r)try{C.mkdirSync(ji(),{recursive:!0}),C.renameSync(n,r)}catch{}return t}function Ni(e){let t=Y(e.runId),n=w.join(J(),e.runId);if(t!==n)try{C.mkdirSync(J(),{recursive:!0}),C.renameSync(t,n)}catch{}let r={...e,archived:void 0,archivedAt:void 0};return Q(Y(e.runId),r),r}function Pi(e){let t=Y(e);return C.existsSync(w.join(t,`flow.json`))?(C.rmSync(t,{recursive:!0,force:!0}),!0):!1}function Fi(e){if(!p(e))return null;let t=w.join(Y(e),`flow.json`);if(!C.existsSync(t))return null;try{return JSON.parse(C.readFileSync(t,`utf8`))}catch{return null}}function Ii(e){return e.status!==`running`||!e.pid||Ji(e)?e:(Gi(e.runId,`orchestrator died`),Fi(e.runId)??e)}function Z(e){let t=Fi(e);return t?Ii(t):null}function Q(e,t){C.writeFileSync(w.join(e,`flow.json`),`${JSON.stringify(t,null,2)}\n`,`utf8`)}function Li(e){let t=[];try{t=C.readdirSync(e)}catch{return[]}let n=[];for(let r of t)try{n.push(Ii(JSON.parse(C.readFileSync(w.join(e,r,`flow.json`),`utf8`))))}catch{}return n}const Ri=(e,t)=>String(t.startedAt).localeCompare(String(e.startedAt));function zi(){let e=[];for(let t of Li(J()))t.archived?X(t):e.push(t);return e.sort(Ri)}function Bi(e){let t=e?.migrate??!0,n=Li(ji()),r=new Set(n.map(e=>e.runId));for(let e of Li(J()))e.archived&&!r.has(e.runId)&&n.push(t?X(e):e);return n.sort(Ri)}function Vi(){return[...zi(),...Bi()].sort(Ri)[0]??null}function Hi(e,t=`all`){if(t===0)return[];let n=Xr(w.join(Y(e),`journal.jsonl`)).filter(e=>e.kind===`task`),r=u(S.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 Ui(e={}){let t;if(e.archived)t=Bi();else{let e=[];t=zi().filter(t=>t.status===`running`||t.status===`queued`||ge(t.endedAt??t.startedAt)<=6e5||(Mi(t),e.push(t.runId),!1)),Ur(S.cwd(),e,{flows:!0})}let n=e.limit===void 0?0:Math.max(0,t.length-e.limit);return{runs:e.limit===void 0?t:t.slice(0,e.limit),clipped:n}}function Wi(e,t={},n){let r,i,a;if(n){let e=Z(n);if(!e)throw Error(`No flow run "${n}".`);e.archived&&Ni(e),r=e.name,i=e.script,a=t.args??e.args}else{let n=Hr(e,t.cwd?w.resolve(t.cwd):S.cwd());r=n.name,i=n.path,a=t.args??{}}let o=n??Ai(),s=Y(o);C.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??D.cpus().length),maxTasks:Math.max(1,t.maxTasks??D.cpus().length*10),taskCount:0,ledger:{}};return Q(s,c),c}function $(e,t,n){Q(e,{...t,endedAt:new Date().toISOString(),pid:void 0,pidStartedAt:void 0,...n})}function Gi(e,t){let n=Fi(e);!n||n.status!==`running`||$(Y(e),n,{status:`failed`,error:t})}const Ki=`stop-keep-tasks`;function qi(e){try{return S.kill(e,0),!0}catch{return!1}}function Ji(t){if(!t.pid||!qi(t.pid))return!1;let n=e(t.pid),r=Date.parse(t.pidStartedAt??``);return n===null||!Number.isFinite(r)||n<=r+6e4}function Yi(e){let t=u(S.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 Xr(w.join(Y(e),`journal.jsonl`)))t.kind===`task`&&t.taskId&&r.add(t.taskId);return[...r].filter(e=>{let t=n.get(e);return!!t&&!m.includes(t.status)})}async function Xi(e,t=[]){let n=S.cwd(),r=[];for(let i of new Set([...Yi(e),...t])){let e=v(n,i);if(!(!e||m.includes(e.status)))try{await Kr(n,e),r.push(i)}catch{}}return r}async function Zi(e,t={}){let n=e?Z(e):Vi();if(!n)throw new G(`flow-failed`,e?`No flow run "${e}".`:`No flow runs.`,{hint:`Run one: coder flow run <name>`});if(n.status!==`running`)throw new G(`flow-failed`,`Run ${n.runId} is not running.`,{runId:n.runId,hint:`Result: coder flow result ${n.runId}`});let r=Y(n.runId);if(!Ji(n))return $(r,n,{status:`failed`,error:`orchestrator died`}),{runId:n.runId,status:`failed`,stoppedTasks:[],keptTasks:Yi(n.runId)};let i=Yi(n.runId),a=w.join(r,Ki);t.keepTasks&&C.writeFileSync(a,``,`utf8`);try{S.kill(n.pid,`SIGINT`);let e=Z(n.runId);for(let t=0;t<25&&e?.status===`running`;t+=1)await new Promise(e=>setTimeout(e,200)),e=Z(n.runId);if(!e||e.status===`running`)throw new G(`flow-failed`,`Run ${n.runId} did not stop within 5s.`,{runId:n.runId,hint:`Check it: coder flow result ${n.runId}`});let t=S.cwd(),r=[],a=[];for(let e of i){let n=v(t,e);n&&(n.status===`cancelled`?r.push(e):m.includes(n.status)||a.push(e))}return{runId:n.runId,status:e.status,stoppedTasks:r,keptTasks:a}}finally{if(t.keepTasks)try{C.unlinkSync(a)}catch{}}}async function*Qi(e,t,n={}){let r=w.join(Y(e),`events.jsonl`),i=n.tail??`all`,a=0;if(i!==`all`)try{a=Math.max(0,C.readFileSync(r,`utf8`).split(`
|
|
26
|
-
`).length-1-i)}catch{}let o=ft(r),s=()=>{let e=[];for(let t of o()){if(a>0){--a;continue}try{e.push(JSON.parse(t))}catch{}}return e},c=Z(e);for(;!c||c.status===`running`;){yield*s();let n=c?.pid?!Ji(c):t!==void 0&&!qi(t);if(c&&(c.pid||t!==void 0)&&n){Gi(e,`orchestrator died`);break}await new Promise(e=>setTimeout(e,400)),c=Z(e)??c}yield*s()}function $i(e,t,n,r){let i={...Wi(e,t,r),pid:S.pid,pidStartedAt:new Date().toISOString()},{runId:a}=i,o=Y(a);Q(o,i);let s=w.join(o,`journal.jsonl`),c=r?Xr(s):[],l=new Zr(c,s),u={runId:a,runDir:o,cwd:t.cwd?w.resolve(t.cwd):S.cwd(),journal:l,semaphore:new ti(i.concurrency),maxTasks:i.maxTasks,dryRun:t.dryRun??!1,ledger:{},running:new Set,taskCount:0,stopping:!1,hooks:n};return{started:{runId:a,runDir:o,ctx:u,markStopped:()=>{u.stopping=!0,$(o,i,{status:`stopped`,taskCount:u.taskCount,ledger:u.ledger})}},args:i.args,name:i.name,replayable:c.length}}async function ea(e,t,n,r){let{ctx:i,runDir:a,runId:o}=e,s=Z(o);try{let e=await K.run(i,()=>q.run({args:r??{},depth:0},()=>Oi(t,r)));return $(a,s,{status:`completed`,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||$(a,s,{status:`failed`,taskCount:i.taskCount,ledger:i.ledger,error:e instanceof Error?e.message:String(e)}),new G(`flow-failed`,e instanceof Error?e.message:String(e),{runId:o})}}async function ta(e,t={},n={}){let{started:r}=$i(e,t,n),i=Z(r.runId).script;return n.onStart?.({runId:r.runId,requestStop:r.markStopped,runningIds:()=>[...r.ctx.running]}),ea(r,i,Z(r.runId).name,t.args??{})}async function na(e,t={},n={}){let{started:r,args:i,name:a,replayable:o}=$i(``,t,n,e),s=Z(e).script;return n.onStart?.({runId:e,requestStop:r.markStopped,runningIds:()=>[...r.ctx.running]}),o&&n.onReplay?.(o),ea(r,s,a,i)}export{bn as $,A as $t,Br as A,L as At,Ir as B,Le as Bt,pi as C,Et as Ct,Gr as D,St as Dt,Kr as E,wt as Et,Ar as F,ct as Ft,gr as G,be as Gt,br as H,Ve as Ht,jr as I,lt as It,or as J,he as Jt,vr as K,N as Kt,Dr as L,Re as Lt,G as M,dt as Mt,Cr as N,st as Nt,Wr as O,Tt as Ot,wr as P,ut as Pt,U as Q,Ye as Qt,Fr as R,Xe as Rt,Qi as S,Ct as St,qr as T,bt as Tt,Sr as U,ze as Ut,_r as V,ge as Vt,yr as W,me as Wt,mr as X,ve as Xt,hr as Y,P as Yt,_n as Z,Be as Zt,na as _,dn as _t,Pi as a,et as an,In as at,Xi as b,pn as bt,vi as c,Ee as cn,Vn as ct,zi as d,De as dn,Un as dt,Ze as en,gn as et,bi as f,qn as ft,Z as g,Qn as gt,Wi as h,Ln as ht,$r as i,tt as in,Gn as it,Hr as j,I as jt,Ur as k,ft as kt,Vi as l,He as ln,Hn as lt,yi as m,Bn as mt,X as n,xe as nn,hn as nt,ki as o,Qe as on,Jn as ot,Gi as p,Kn as pt,sr as q,pe as qt,Ui as r,$e as rn,vn as rt,Hi as s,Te as sn,W as st,Ki as t,M as tn,H as tt,Bi as u,Ue as un,Zn as ut,Y as v,V as vt,Xr as w,yt as wt,Zi as x,Dt as xt,ta as y,mn as yt,Or as z,Ie as zt};
|
package/dist/upgrade-DOj06r5b.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import{B as e,D as t,E as n,H as r,I as i,L as a,O as o,P as s,R as c,S as l,U as u,V as d,W as f,_ as p,c as m,d as h,f as g,h as _,j as v,k as y,l as b,m as x,o as S,p as C,s as w,u as T,x as E}from"./app-server-CW93J9zJ.js";import{$t as D,At as ee,Dt as te,G as ne,Gt as re,H as ie,Ht as O,J as ae,K as oe,Kt as se,Nt as ce,Pt as le,Q as k,U as ue,Ut as de,V as fe,Vt as pe,W as me,Wt as A,X as he,Y as ge,Z as _e,Zt as j,_t as ve,an as M,at as N,bt as ye,cn as be,ct as P,dn as xe,en as Se,et as Ce,ft as we,g as Te,gt as Ee,ht as De,in as F,it as I,jt as Oe,k as ke,kt as Ae,ln as je,lt as L,mt as R,nn as Me,nt as Ne,ot as z,pt as Pe,q as Fe,qt as Ie,rn as Le,sn as Re,st as B,tn as V,tt as H,ut as ze,vt as U,yt as Be,z as Ve,zt as He}from"./runtime-D-U1DNkI.js";import W from"node:process";import G from"node:fs";import K from"node:path";import{spawnSync as Ue}from"node:child_process";import We from"node:os";import{fileURLToPath as Ge}from"node:url";import*as q from"zod/mini";import Ke from"node:crypto";import qe from"node:http";let Je=0;function Ye(e){let t=[];typeof e.instructions==`string`&&e.instructions&&t.push({role:`system`,content:e.instructions});let n=Array.isArray(e.input)?e.input:[];for(let e of n)switch(e?.type){case`message`:{let n=Array.isArray(e.content)?e.content.map(e=>e?.text??``).join(``):String(e.content??``);t.push({role:e.role===`developer`?`system`:e.role,content:n});break}case`function_call`:{let n={id:e.call_id,type:`function`,function:{name:e.name,arguments:e.arguments??`{}`}},r=t.at(-1);r?.role===`assistant`&&r.tool_calls?r.tool_calls.push(n):t.push({role:`assistant`,content:null,tool_calls:[n]});break}case`function_call_output`:{let n=e.output;t.push({role:`tool`,tool_call_id:e.call_id,content:typeof n==`string`?n:JSON.stringify(n??``)});break}}return t}function Xe(e){let t=(Array.isArray(e.tools)?e.tools:[]).filter(e=>e?.type===`function`).map(e=>({type:`function`,function:{name:e.name,description:e.description??``,parameters:e.parameters??{type:`object`,properties:{}}}})),n=e.text?.format;return{model:e.model,messages:Ye(e),...t.length?{tools:t,tool_choice:e.tool_choice??`auto`}:{},...typeof e.parallel_tool_calls==`boolean`?{parallel_tool_calls:e.parallel_tool_calls}:{},...n?.type===`json_schema`?{response_format:{type:`json_schema`,json_schema:{name:n.name,schema:n.schema,strict:n.strict??!1}}}:{},stream:!0,stream_options:{include_usage:!0}}}var Ze=class{send;model;responseId=`resp_bridge_${++Je}`;text=``;textOpen=!1;toolCalls=new Map;usage=null;buffer=``;constructor(e,t){this.model=e,this.send=t,this.send({type:`response.created`,response:{id:this.responseId,object:`response`,status:`in_progress`,model:e,output:[]}})}push(e){this.buffer+=e;let t=this.buffer.split(`
|
|
2
|
-
`);this.buffer=t.pop()??``;for(let e of t){let t=e.trim();if(!t.startsWith(`data:`))continue;let n=t.slice(5).trim();if(!n||n===`[DONE]`)continue;let r;try{r=JSON.parse(n)}catch{continue}r.usage&&(this.usage=r.usage);let i=r.choices?.[0]?.delta;if(i){typeof i.content==`string`&&i.content&&(this.textOpen||(this.textOpen=!0,this.send({type:`response.output_item.added`,output_index:0,item:{type:`message`,id:`msg_bridge_0`,status:`in_progress`,role:`assistant`,content:[]}})),this.text+=i.content,this.send({type:`response.output_text.delta`,item_id:`msg_bridge_0`,output_index:0,content_index:0,delta:i.content}));for(let e of i.tool_calls??[]){let t=this.toolCalls.get(e.index)??{id:``,name:``,args:``};e.id&&(t.id=e.id),e.function?.name&&(t.name+=e.function.name),e.function?.arguments&&(t.args+=e.function.arguments),this.toolCalls.set(e.index,t)}}}}finish(){let e=[];if(this.text){let t={type:`message`,id:`msg_bridge_0`,status:`completed`,role:`assistant`,content:[{type:`output_text`,text:this.text,annotations:[]}]};e.push(t),this.send({type:`response.output_item.done`,output_index:0,item:t})}let t=e.length;for(let n of this.toolCalls.values()){let r={type:`function_call`,id:`fc_bridge_${t}`,call_id:n.id||`call_bridge_${t}`,name:n.name,arguments:n.args||`{}`,status:`completed`};e.push(r),this.send({type:`response.output_item.done`,output_index:t,item:r}),t+=1}this.send({type:`response.completed`,response:{id:this.responseId,object:`response`,status:`completed`,model:this.model,output:e,usage:{input_tokens:this.usage?.prompt_tokens??0,input_tokens_details:{cached_tokens:this.usage?.prompt_tokens_details?.cached_tokens??0},output_tokens:this.usage?.completion_tokens??0,output_tokens_details:{reasoning_tokens:this.usage?.completion_tokens_details?.reasoning_tokens??0},total_tokens:this.usage?.total_tokens??0}}})}};async function Qe(e,t=`chat`){let n=t===`responses`,r=I(e.baseUrl,n?`responses`:`chat/completions`),i=null,a=e.envKey?W.env[e.envKey]:void 0;async function o(e){let t=i?[i]:r,n=null;for(let r of t)if(n=await fetch(r,{method:`POST`,headers:{"content-type":`application/json`,...a?{authorization:`Bearer ${a}`}:{}},body:e}),n.status!==404)return i=r,n;return n}let s=Ke.randomBytes(16).toString(`hex`),c=qe.createServer((e,t)=>{if(e.method!==`POST`||!e.url?.startsWith(`/${s}/`)||!e.url.replace(/\/+$/,``).endsWith(`/responses`)){t.writeHead(404,{"content-type":`application/json`}),t.end(JSON.stringify({error:{message:`coder chat bridge: only POST /responses is supported`}}));return}let r=``;e.on(`data`,e=>r+=e),e.on(`end`,async()=>{let e;try{e=JSON.parse(r)}catch{t.writeHead(400,{"content-type":`application/json`}),t.end(JSON.stringify({error:{message:`invalid JSON`}}));return}try{if(n){let e=await o(r);if(t.writeHead(e.status,{"content-type":e.headers.get(`content-type`)??`application/json`,"cache-control":`no-store`}),e.body)for await(let n of e.body)t.write(n);t.end();return}let i=await o(JSON.stringify(Xe(e)));if(!i.ok||!i.body){let e=await i.text().catch(()=>``);t.writeHead(i.status,{"content-type":`application/json`}),t.end(e||JSON.stringify({error:{message:`upstream HTTP ${i.status}`}}));return}t.writeHead(200,{"content-type":`text/event-stream`,"cache-control":`no-store`});let a=new Ze(e.model,e=>t.write(`data: ${JSON.stringify(e)}\n\n`)),s=new TextDecoder;for await(let e of i.body)a.push(s.decode(e,{stream:!0}));a.finish(),t.end()}catch(e){let n=e instanceof Error?e.message:String(e);t.writeHead(502,{"content-type":`application/json`}),t.end(JSON.stringify({error:{message:`coder chat bridge: ${n}`}}))}})});await new Promise(e=>c.listen(0,`127.0.0.1`,e));let l=c.address();return{url:`http://127.0.0.1:${typeof l==`object`&&l?l.port:0}/${s}/v1`,close:()=>new Promise(e=>{c.close(()=>e()),c.closeAllConnections?.()})}}async function $e(e,t,n){let r=e.envKey?W.env[e.envKey]:void 0,i=!1;for(let a of I(e.baseUrl,t))try{let e=await fetch(a,{method:`POST`,headers:{"content-type":`application/json`,...r?{Authorization:`Bearer ${r}`}:{}},body:JSON.stringify(n),signal:AbortSignal.timeout(5e3)});if(i=!0,e.status!==404&&e.status!==405&&e.status!==501)return{baseUrl:a.slice(0,-(t.length+1))}}catch{}return{reachable:i}}async function et(e){let t=await $e(e,`responses`,{model:e.model,input:[],stream:!1});if(`baseUrl`in t)return{wireApi:`responses`,baseUrl:t.baseUrl};let n=await $e(e,`chat/completions`,{model:e.model,messages:[],stream:!1});return`baseUrl`in n?{wireApi:`chat`,baseUrl:n.baseUrl}:t.reachable||n.reachable?{wireApi:`chat`}:null}async function*tt(e,t,n={}){let r=new Set([`completed`,`failed`,`cancelled`]),a=v(e,t);if(!a)throw Error(`No task found for "${t}".`);let o=n.tail??1,l=Ae(K.join(i(e,t),`log.jsonl`)),u=!0,d=()=>{let e=l().map(e=>{try{return JSON.parse(e)}catch{return{message:e}}});return u?(u=!1,o===`all`?e:c(e,o)):e};for(yield*d();!r.has(a.status);)await new Promise(e=>setTimeout(e,400)),a=s(e,v(e,t)??a),yield*d();yield*d()}async function nt(e){let{options:t,positionals:n}=b(e,q.object({...S,tail:h,trim:q.optional(q.union([q.literal(`none`),q.coerce.number().check(q.int(),q.positive())],{error:`expected a positive integer or "none"`}))}));Le(n,1,`task watch`);let a=M(t),o=F(a,n[0]),c=t.tail,l=t.trim,u=l===void 0?500:l===`none`?1/0:l,d=new He({cwd:o.cwd??a,startedAt:Date.parse(o.createdAt??``)||void 0,trim:u,explicitTrim:l!==void 0,width:je()});if(!t.json){let e=[...Re(o,{status:o.status}),...r.includes(o.status)?[D.dim(`watching — Ctrl-C to stop`)]:[],...o.prompt?Me(o.prompt,D,{truncate:!1}):[],``];W.stdout.write(`${e.join(`
|
|
3
|
-
`)}\n`)}let f=null,p=null,m=e=>{let t=d.render(e);t.length&&W.stdout.write(`${t.join(`
|
|
4
|
-
`)}\n`)};for await(let e of tt(a,o.id,{tail:c})){if(e.kind===`usage`&&e.tokens&&(f=e.tokens),t.json){let t=e.kind===`steer`?1/0:u,n=e.message?{...e,message:xe(e.message,t,{plain:!0})}:e;W.stdout.write(`${JSON.stringify(n)}\n`);continue}e.kind!==`usage`&&(p&&=(m(p),null),e.kind===`assistant`?p=e:m(e))}let g=s(a,v(a,o.id)??o),_=ee(K.join(i(a,o.id),`result.json`));if(t.json)V({taskId:o.id,status:g.status,result:_});else{let e=g.status===`completed`?`(no final message)`:`(task ${g.status})`,t=be(g,{tokens:_?.tokens??f,tokenModel:_?.model,files:_?.touchedFiles?.map(e=>Oe(o.cwd??a,e)),statusChanged:g.status!==o.status});t.length&&W.stderr.write(`\n${t.join(`
|
|
5
|
-
`)}\n`);let n=re(_,g.error,e),r=p?String(p.message??``):``;W.stdout.write(`\n${n.trim()?n:r}\n`)}W.exit(g.status===`completed`?0:1)}async function rt(e,t,n,i={}){if(t.status!==`running`)return null;let a=t.engine===`claude`?await(i.claude??he)(t.steerEndpoint,n):await(i.codex??ye)(e,{endpoint:t.steerEndpoint,threadId:t.threadId,turnId:t.turnId,text:n});if(a.steered)return p(e,t.id,{kind:`steer`,message:`Steer accepted live:\n${n}`}),{taskId:t.id,steered:`live`};if(!a.retryable)throw p(e,t.id,{kind:`error`,message:`Live steer failed: ${a.detail}`}),Error(`Could not steer running task ${t.id}: ${a.detail}`);let o=v(e,t.id)??t;return r.includes(o.status)?(l(e,o.id,n),p(e,o.id,{kind:`steer`,message:`Steer queued for the next turn:\n${n}`}),{taskId:o.id,steered:`queued`}):null}async function it(e,t,n,r={},i={}){if(!t.threadId)throw Error(`Task ${t.id} has no thread to steer yet (status: ${t.status}).`);return await rt(e,t,n,i)||(at(e,t,n,r),{taskId:t.id,steered:`resumed`})}function at(e,t,n,r){d(e,t.id,{status:`queued`,resumedAt:new Date().toISOString(),currentPrompt:n,resumeThreadId:t.threadId,steerEndpoint:null,model:r.model??t.model??null,effort:r.effort??t.effort??null,permissions:r.permissions??t.permissions,error:void 0}),p(e,t.id,{kind:`steer`,message:`Resuming with steer:\n${n}`}),Ve(t.cwd??e,t.id)}async function ot(e){let{options:t,positionals:n}=b(e,q.object({...S,model:T,effort:T,permissions:T,background:w,wait:w})),r=M(t),[i,...a]=n,o=a.join(` `).trim();(!i||!o)&&A(`Missing task id or follow-up text.`,{hint:[`Usage: coder task steer <task-id> "<follow-up>" [--wait]`,`Help: coder task steer --help`]});let s=F(r,i);s.threadId||A(`Task ${s.id} has no thread to steer yet (status: ${s.status}).`,{hint:`Wait for it to start: coder task watch ${s.id}`});let c=await it(r,s,o,{model:t.model,effort:t.effort,permissions:t.permissions});return st(r,c.taskId,{steered:c.steered,options:t})}async function st(t,n,{steered:r,options:a}){if(r===`queued`){if(a.json){V({taskId:n,steered:`queued`});return}W.stdout.write(`${D.dim(`[coder]`)} follow-up queued for task ${D.cyan(n)}; it runs when the current turn finishes.\n`),a.wait&&W.stdout.write(`\n${D.dim(`[coder] --wait is not available for a queued follow-up; check: coder task result ${n}`)}\n`);return}if(!a.wait){if(a.json){V({taskId:n,steered:r});return}W.stdout.write(r===`live`?`${D.dim(`[coder]`)} steered follow-up into running task ${D.cyan(n)}.\n`:`${D.dim(`[coder]`)} resumed task ${D.cyan(n)} with the follow-up (same thread, same id).\n`),W.stdout.write(`\n${D.dim(` result: coder task result ${n}`)}\n`);return}let o=v(t,n),s=o?await e(t,o):null,c=ee(K.join(i(t,n),`result.json`));a.json?V({taskId:n,status:s?.status??null,finalMessage:c?.finalMessage??null}):(W.stdout.write(`\n${c?.finalMessage||`(no final message)`}\n\n`),W.stderr.write(`${D.dim(`[coder] task=${n} status=${s?.status??`unknown`}`)}\n`)),W.exitCode=s?.status===`completed`?0:1}const ct=[`Read`,`Glob`,`Grep`];function lt(e,t,n){return`You are a read-only sidecar answering a question ABOUT a coder task.
|
|
6
|
-
You are not the task: never continue, redo, or fix its work — only answer the question. The task never sees this question or your answer.
|
|
7
|
-
|
|
8
|
-
Task metadata:
|
|
9
|
-
${[`id: ${e.id}`,...e.name?[`name: ${e.name}`]:[],`status: ${e.status}`,`agent: ${e.agent}${e.model?`/${e.model}`:``}${e.effort?`/${e.effort}`:``}`,...e.cwd?[`workspace: ${e.cwd}`]:[],...e.createdAt?[`created: ${e.createdAt}`]:[],...e.completedAt?[`finished: ${e.completedAt}`]:[]].join(`
|
|
10
|
-
`)}
|
|
11
|
-
|
|
12
|
-
Task prompt:
|
|
13
|
-
${e.prompt??`(unknown)`}
|
|
14
|
-
|
|
15
|
-
Inspect as needed (grep/read selectively; events can be large):
|
|
16
|
-
- progress log (jsonl, one event per line): ${K.join(t,`log.jsonl`)}
|
|
17
|
-
- final result: ${K.join(t,`result.json`)}
|
|
18
|
-
- worker output: ${K.join(t,`worker.log`)}
|
|
19
|
-
${e.cwd?`- the task's workspace (its code and changes): ${e.cwd}`:``}
|
|
20
|
-
|
|
21
|
-
Question: ${n}
|
|
22
|
-
|
|
23
|
-
Answer the question directly and concisely.`}function ut(e,t,n,r){return{prompt:n,model:r.model??e.model,effort:r.effort,permissions:`read-only`,additionalDirectories:[t],readOnlyAllowedTools:ct}}async function dt(e,t,n,r={}){let a=i(e,t.id),o=lt(t,a,n),s=r.effort??t.effort??null;if(t.engine===`claude`)return ge(t.cwd??e,ut(t,a,o,{model:r.model,effort:s}));let c=P(e),l=r.model??t.model,u=l?c.models?.[l]:void 0,d=u&&B(u)?u:void 0;if(d?.envKey&&!W.env[d.envKey])throw Error(`Missing environment variable: \`${d.envKey}\`.`);let f=d?await Qe(d,d.wireApi??`chat`):null,p=Pe(c,l,f??void 0);try{return await Be(t.cwd??e,{prompt:o,model:p?.model??we(l??null),modelProvider:p?.modelProvider??null,configOverrides:p?.configOverrides??null,effort:s,sandbox:`read-only`,approvalPolicy:`never`,ephemeral:!0})}finally{await f?.close()}}async function ft(e){let{options:t,positionals:n}=b(e,q.object({...S,model:T,effort:T})),r=M(t),[i,...a]=n,o=a.join(` `).trim();(!i||!o)&&A(`Missing task id or question.`,{hint:[`Usage: coder task ask <task-id> "<question>"`,`Help: coder task ask --help`]});let s=F(r,i);t.json||W.stderr.write(`${D.dim(`[coder]`)} asking about task ${D.cyan(s.id)} (read-only sidecar; the task is not interrupted)...\n`);let c=await dt(r,s,o,{model:t.model,effort:t.effort}),l=c.finalMessage||``;if(t.json)V({taskId:s.id,answer:l||null,...c.error?{error:c.error.message}:{}});else if(l)W.stdout.write(`\n${l}\n`);else{let e=c.error?.message?` ${D.red(c.error.message)}`:``;W.stdout.write(`${D.dim(`(no answer)`)}${e}\n`)}W.exitCode=c.status===0?0:1}function pt(e,n={}){let i=n.limit===`all`?void 0:n.limit,s=e=>u.includes(e.status),c=[],l=o(e).filter(t=>{if(!s(t))return!0;let n=t.completedAt??t.updatedAt??t.createdAt;return pe(n)<=6e5||(y(e,t),c.push(t.id),!1)});if(ke(e,c),n.archived?l=t(e):n.running?l=l.filter(e=>r.includes(e.status)):n.stopped&&(l=l.filter(s)),n.dir){let e=a(K.resolve(String(n.dir)));l=l.filter(t=>t.cwd&&a(t.cwd)===e)}if(!n.archived&&!n.running&&!n.stopped){let e=e=>e.status===`failed`?0:r.includes(e.status)?1:e.status===`completed`?3:2;l=[...l].sort((t,n)=>e(t)-e(n))}let d=i===void 0?0:Math.max(0,l.length-i);return i!==void 0&&(l=l.slice(0,i)),{jobs:l,clipped:d}}async function mt(e){let{options:a,positionals:o}=b(e,q.object({cwd:T,dir:T,limit:m,json:w,running:w,stopped:w,archived:w}));Le(o,0,`task list`);let s=M(a),c=a.limit===`all`?void 0:a.limit,{jobs:l,clipped:u}=pt(s,{running:a.running,stopped:a.stopped,archived:a.archived,dir:a.dir??a.cwd,limit:a.limit}),d=l.map(e=>{let t=r.includes(e.status)?te(i(s,e.id)).filter(e=>!e.response).length:0;return{taskId:e.id,status:t?`waiting-approval`:e.status,pendingApprovals:t,agent:e.agent??null,model:e.model??null,effort:e.effort??null,name:e.name??null,cwd:e.cwd??null,prompt:String(e.prompt??``).replace(/\s+/g,` `).trim().slice(0,80),updatedAt:e.updatedAt,archived:e.archived??!1,flowRunId:e.flowRunId??null,idleMs:r.includes(e.status)?pe(n(s,e)):null}});if(a.json){V(d);return}if(!d.length){let e=a.archived?`archived tasks`:a.running?`running tasks`:a.stopped?`recently stopped tasks`:`recent tasks`;W.stdout.write(`No ${e}.\n`);let n=[];if(!a.archived){let e=t(s,{migrate:!1}).length;e&&n.push(`${e} archived: coder task list --archived [--limit N]`)}n.length&&W.stdout.write(`\n${Ie(n,D)}\n`);return}let f=D,p=e=>(e.agent===`custom`&&e.model?e.model:(e.agent??`-`)+(e.model?`/${e.model}`:``))+(e.effort?`/${e.effort}`:``),h=e=>e.cwd?K.basename(e.cwd):`-`,g=(e,t,n)=>Math.min(t,Math.max(e,...n.map(e=>e.length))),_={id:g(7,28,d.map(e=>e.taskId)),status:g(6,16,d.map(e=>e.status)),who:g(5,26,d.map(p)),cwd:g(3,24,d.map(h))},v=e=>{let t=e.archived?` ${f.dim(`(archived)`)}`:``,n=e.name?e.name:f.light(e.prompt),r=e.idleMs!==null&&e.idleMs>=12e4?` ${(e.idleMs>6e5?f.red:f.dim)(`· idle ${se(e.idleMs)}`)}`:``;W.stdout.write(`${f.cyan(e.taskId.padEnd(_.id))} ${Se(e.status,_.status)} ${f.light(de(p(e),_.who))} ${f.light(de(h(e),_.cwd))} ${n}${r}${t}\n`)};W.stdout.write(f.bold(f.light(`${`task-id`.padEnd(_.id)} ${`status`.padEnd(_.status)} ${`agent`.padEnd(_.who)} ${`cwd`.padEnd(_.cwd)} name\n`)));let y=new Map;for(let e of d)e.flowRunId&&(y.get(e.flowRunId)??y.set(e.flowRunId,[]).get(e.flowRunId)).push(e);let x=new Set,S=!1,C=!1;for(let e of d){if(!e.flowRunId){C&&W.stdout.write(`
|
|
24
|
-
`),v(e),S=!0,C=!1;continue}if(x.has(e.flowRunId))continue;x.add(e.flowRunId);let t=Te(e.flowRunId),n=t?`(${f.bold(e.flowRunId)} ${t.status} — flow ${t.name})`:`(${f.bold(e.flowRunId)} flow)`;W.stdout.write(`${S?`
|
|
25
|
-
`:``}${n}\n`);for(let t of y.get(e.flowRunId))v(t);S=!0,C=!0}u&&W.stdout.write(f.dim(`\n... ${u} more not shown (--limit ${c})\n`));let E=[`Result: coder task result <task-id>`];a.archived||E.push(`Older tasks: coder task list --archived [--limit N]`),W.stdout.write(`\n${Ie(E,f)}\n`)}function ht(){let e=process.env.CLAUDE_CONFIG_DIR||K.join(We.homedir(),`.claude`);return K.join(e,`projects`)}function gt(e){if(!e)return!1;let t=ht(),n=!1;try{for(let r of G.readdirSync(t)){let i=K.join(t,r,`${e}.jsonl`);G.existsSync(i)&&(G.rmSync(i,{force:!0}),n=!0)}}catch{}return n}function J(e){e.threadId&&(e.engine===`codex`?f(e.threadId):e.engine===`claude`&>(e.threadId))}async function _t(e){let{options:n,positionals:r}=b(e,q.object({...S,"all-archived":w}));Le(r,1,`task delete`);let i=M(n);if(n[`all-archived`]){let e=t(i).filter(e=>(J(e),E(i,e.id))).map(e=>e.id);if(n.json){V({deleted:e,count:e.length});return}W.stdout.write(e.length?`Deleted ${e.length} archived task${e.length===1?``:`s`}.\n`:`${D.dim(`No archived tasks to delete.`)}\n`);return}let a=r[0];a||A(`Missing task id.`,{hint:[`Delete one: coder task delete <task-id>`,`Delete all archived: coder task delete --all-archived`]});let o=F(i,a);if(o.status===`running`&&A(`Task ${o.id} is still running.`,{hint:`Stop it first: coder task stop ${o.id}`}),J(o),E(i,o.id),n.json){V({taskId:o.id,deleted:!0});return}W.stdout.write(`Deleted task ${D.cyan(o.id)}.\n`)}function Y(e,t){return t.split(`.`).reduce((e,t)=>e?.[t],e)}function vt(e,t){return t?K.join(a(e),`coder.config.json`):R()}function yt(e,t){let n=P(e);return t?Y(n,t):n}function bt(e,t,n,r={}){let i=vt(e,r.workspace),a=G.existsSync(i)?JSON.parse(G.readFileSync(i,`utf8`)):{},o=t.split(`.`),s=o.at(-1),c=a;for(let e of o.slice(0,-1))(typeof c[e]!=`object`||c[e]===null)&&(c[e]={}),c=c[e];r.unset?delete c[s]:c[s]=n;let l=De(a);if(l.length)throw Error(`Refusing to write invalid config:\n ${l.join(`
|
|
26
|
-
`)}`);return G.mkdirSync(K.dirname(i),{recursive:!0}),G.writeFileSync(i,`${JSON.stringify(a,null,2)}\n`,`utf8`),{file:i,key:t,effective:Y(P(e),t)??null,...r.unset?{unset:!0}:{value:n}}}async function xt(e){let{options:t,positionals:n}=b(e,q.object({...S,workspace:w})),r=M(t),[i=`list`,a,...o]=n,s=vt(r,t.workspace);if(i===`list`){let e=P(r);if(t.json){V(e);return}let n=D,i=e=>[e?.model,e?.effort,e?.permissions].filter(Boolean).join(`/`)||`-`;W.stdout.write([`${n.dim(`chain`)} ${e.chain.join(` -> `)}`,`${n.dim(`codex`)} ${i(e.agents.codex)}`,`${n.dim(`claude`)} ${i(e.agents.claude)}`,`${n.dim(`approvals`)} timeout=${e.approvals.escalationTimeoutMs}ms hosts=[${e.approvals.allowedNetworkHosts.join(`, `)}]`,`${n.dim(`file`)} ${R()}`].join(`
|
|
27
|
-
`)+`
|
|
28
|
-
`);return}if(i===`get`){a||A(`Usage: coder config get <key> (e.g. chain, agents.codex.model)`);let e=Y(P(r),a);if(t.json||e===null||typeof e==`object`&&e!==void 0){V(e===void 0?null:e);return}W.stdout.write(`${e===void 0?`(unset)`:String(e)}\n`);return}i!==`set`&&i!==`unset`&&A(`Usage: coder config [get|set|unset] <key> [value] [--workspace]`),(!a||i===`set`&&o.length===0)&&A(`Usage: coder config ${i} <key>${i===`set`?` <value>`:``}`);let c=o.join(` `),l;try{l=JSON.parse(c)}catch{l=c.includes(`,`)?c.split(`,`).map(e=>e.trim()).filter(Boolean):c}let u;try{({effective:u}=bt(r,a,l,{workspace:t.workspace,unset:i===`unset`}))}catch(e){A(e instanceof Error?e.message:String(e))}if(t.json){V({file:s,key:a,...i===`set`?{value:l}:{unset:!0},effective:u});return}let d=D,f=i===`set`?`${d.cyan(a)} = ${JSON.stringify(l)}`:`unset ${d.cyan(a)}`;W.stdout.write(`${f} ${d.dim(`(${s})`)}\n`)}async function St(e,t={}){let n=U(e),r=ue(n);r?.updated&&(n=U(e));let i=n.available?await ve(e):{loggedIn:!1,detail:n.detail},a=ae(),o=a.available?Fe():{loggedIn:!1,detail:a.detail},s=R();if(!G.existsSync(s)){let e=n.available?[`codex`,`claude`]:a.available?[`claude`,`codex`]:[`codex`,`claude`];Ee({...Ne,chain:e})}let c=_(),l=t.claude?ne(c):null,u=t.agents||t.codex?me(c):null,d=P(e),f=n.available&&i.loggedIn||a.available&&o.loggedIn;return{codex:{available:n.available,detail:n.detail,auth:i.detail,loggedIn:i.loggedIn},...r?{codexUpdate:r}:{},claude:{available:a.available,detail:a.detail,auth:o.detail,loggedIn:o.loggedIn},configFile:s,runtime:Ge(new URL(`../bin/coder.mjs`,import.meta.url)),...l?{claudePlugin:l}:{},...u?{agentsSkill:u}:{},config:d,ready:f}}async function Ct(e){let{options:t,positionals:n}=b(e,q.object({...S,codex:w,claude:w,agents:w})),r=M(t),i=[`claude`,`codex`,`agents`];for(let e of n)i.includes(e)||A(`Unknown host "${e}". Use claude, codex, or agents.`,{hint:`Codex, Pi, OpenCode, and other Agent Skills hosts: coder setup-host agents`}),t[e]=!0;let a=D.bold,o=D.dim;t.json||W.stdout.write(`${a(`Coder host setup`)}\n\n`);let s=await St(r,{claude:t.claude,codex:t.codex,agents:t.agents});if(t.json){V(s);return}let{codex:c,claude:l,codexUpdate:u,config:d,configFile:f,claudePlugin:p,agentsSkill:m,ready:h}=s,g=[],_=c.available?c.loggedIn?j(`codex ${o(`${c.detail}; ${c.auth}`)}`):O(`codex not logged in ${o(`(${c.auth})`)} - run: codex login`):O(`codex CLI not installed - run: npm install -g @openai/codex`),v=l.available?l.loggedIn?j(`claude ${o(`${l.detail}; ${l.auth}`)}`):O(`claude not logged in - run: claude auth login`):O(`claude CLI not installed - run: npm install -g @anthropic-ai/claude-code`);g.push(a(`Available Engines`),_,v,` ${o(`custom models (local/provider endpoints): coder model --help`)}`),u?.updated?g.push(j(`codex ${o(`updated ${u.from} -> ${c.detail} (GPT-5.6 support)`)}`)):u&&g.push(O(`codex ${u.note}`)),g.push(``);let y=e=>{let t=d.agents?.[e]??{};return[t.model,t.effort,t.permissions].filter(Boolean).join(`/`)};g.push(a(`Config`),` chain: ${(d.chain??[]).join(` -> `)} codex: ${y(`codex`)} claude: ${y(`claude`)}`,` ${o(f)} ${o(`(coder config set <key> <value> to change)`)}`,``);let x=[[`claude plugin`,p??null],[`agents skill `,m??null]];for(let[e,t]of x)t&&g.push(t.installed?j(`${e} ${o(t.note)}`):O(`${e} ${t.note}`),``);g.push(h?j(`ready - try: coder run --wait "explain this repo's layout"`):O(`not ready - install an engine CLI to run tasks: codex (npm install -g @openai/codex, then codex login) or claude (npm install -g @anthropic-ai/claude-code, then claude auth login)`)),W.stdout.write(`${g.join(`
|
|
29
|
-
`)}\n`)}const wt=new Set([`codex`,`claude`,`custom`]);async function X(e){let t=e.envKey?W.env[e.envKey]:void 0,n=I(e.baseUrl,`models`),r=null;for(let i of n)try{let n=await fetch(i,{headers:t?{Authorization:`Bearer ${t}`}:{},signal:AbortSignal.timeout(5e3)});if(!n.ok){r=n.status===404?{reachable:!0,modelListed:null,detail:`endpoint reachable (no model list to verify against)`}:{reachable:!1,modelListed:null,detail:`${i} -> HTTP ${n.status}`};continue}let a=await n.json().catch(()=>null),o=Array.isArray(a?.data)?a.data.map(e=>e.id):null;if(!o)return{reachable:!0,modelListed:null,detail:`endpoint reachable`};let s=o.includes(e.model);return{reachable:!0,modelListed:s,detail:s?`endpoint reachable; model "${e.model}" listed`:`endpoint reachable, but "${e.model}" is not in its model list`}}catch(e){r={reachable:!1,modelListed:null,detail:`${i} unreachable (${e instanceof Error?e.message:String(e)})`}}return r}function Tt(e,t){let n=G.existsSync(e)?JSON.parse(G.readFileSync(e,`utf8`)):{};t(n),n.models&&Object.keys(n.models).length===0&&delete n.models;let r=De(n);r.length&&A(`Refusing to write invalid config:\n ${r.join(`
|
|
30
|
-
`)}`),G.mkdirSync(K.dirname(e),{recursive:!0}),G.writeFileSync(e,`${JSON.stringify(n,null,2)}\n`,`utf8`)}function Z(e,t){Tt(e,e=>{e.models=e.models??{},t(e.models)})}const Q=q.object({...S,"base-url":T,model:T,"env-key":T,workspace:w});function $(e,t){return e.workspace?K.join(a(t),`coder.config.json`):R()}function Et(e){let t=e.models??{},n=Object.entries(t).filter(e=>B(e[1])),r=e=>`${e.provider}:${e.model}${e.effort?`:${e.effort}`:``}`,i=Object.entries(t).filter(e=>N(e[1])).map(([e,t])=>{let n=t.provider===`claude`?k:H,i=n[t.model]??t.model,a=z(e)?e:Object.entries(n).find(([,e])=>e===i)?.[0];return{name:e,spec:r(t),replaces:a,disabled:!!t.disabled}}),a=new Map;for(let e of i)e.replaces&&(e.name===e.replaces||!a.has(e.replaces))&&a.get(e.replaces)?.name!==e.replaces&&a.set(e.replaces,e);let o=e=>!!t[e]?.disabled,s=i.filter(e=>![...a.values()].some(t=>t.name===e.name));return{models:t,endpoints:n,providerRows:(e,t)=>[...Object.entries(t).map(([e,t])=>{let n=a.get(e);return n?{alias:n.name,spec:n.spec,overrides:e,disabled:n.disabled}:{alias:e,model:t,builtin:!0,disabled:o(e)}}),...s.filter(t=>t.spec.startsWith(`${e}:`)).map(({name:e,spec:t,disabled:n})=>({alias:e,spec:t,disabled:n}))],toggledSlugs:Object.entries(t).filter(([e,t])=>!B(t)&&!N(t)&&!z(e)).map(([e,t])=>({name:e,disabled:!!t.disabled})),disabled:o}}async function Dt(e){let{endpoints:t,providerRows:n,toggledSlugs:r}=Et(P(e)),i=await Promise.all(t.map(async([e,t])=>({name:e,...t,probe:await X(t)})));return{codex:n(`codex`,H),claude:n(`claude`,k),custom:i,...r.length?{toggles:r}:{}}}async function Ot(e){let{options:t,positionals:n}=b(e,Q);n.length&&A(`model list takes no arguments.`,{hint:`Usage: coder model list [--json]`});let r=M(t),i=D,{endpoints:a,providerRows:o,toggledSlugs:s,disabled:c}=Et(P(r));if(t.json){V(await Dt(r));return}let l=e=>c(e)?i.dim(`∅`):i.green(`✔`),u=e=>c(e)?` ${i.dim(`(disabled)`)}`:``,d=[],f=(e,t,n)=>{d.push(i.bold(e));for(let e of o(t,n))`overrides`in e?d.push(` ${e.disabled?i.dim(`∅`):i.cyan(`↳`)} ${e.alias.padEnd(14)} ${i.dim(`-> ${e.spec} (overrides ${e.overrides})`)}${e.disabled?` ${i.dim(`(disabled)`)}`:``}`):`builtin`in e?d.push(` ${l(e.alias)} ${e.alias.padEnd(14)} ${i.dim(`-> ${e.model}`)}${u(e.alias)}`):d.push(` ${e.disabled?i.dim(`∅`):i.cyan(`↳`)} ${e.alias.padEnd(14)} ${i.dim(`-> ${e.spec}`)}${e.disabled?` ${i.dim(`(disabled)`)}`:``}`);d.push(``)};if(f(`Codex models`,`codex`,H),f(`Claude models`,`claude`,k),d.push(i.bold(`Custom models`),``),!a.length)d.push(i.dim(` none — coder model add <name> --base-url <url> --model <id> [--env-key VAR]`));else for(let[e,t]of a){let n=await X(t),r=t.disabled?i.dim(`∅`):n.reachable?i.green(`✔`):i.red(`✘`);d.push(` ${r} ${e.padEnd(14)} ${t.model} ${i.dim(`@ ${t.baseUrl} — ${n.detail}`)}${u(e)}`)}if(d.push(``),s.length){d.push(i.bold(`Other`),``);for(let e of s)d.push(` ${e.disabled?i.dim(`∅`):i.green(`✔`)} ${e.name.padEnd(14)} ${i.dim(`raw model id`)}${e.disabled?` ${i.dim(`(disabled)`)}`:``}`);d.push(``)}d.push(i.dim(`Alias one: coder model alias <name> <spec> (e.g. fast codex:spark)`),i.dim(`Use one: coder run --model <name> "<task>" (or coder run --agent custom)`)),W.stdout.write(`${d.join(`
|
|
31
|
-
`)}\n`)}async function kt(e,t,n,r){let i=await et(t),a=i?.wireApi===`responses`;i?(t.wireApi=i.wireApi,t.baseUrl=i.baseUrl??t.baseUrl):delete t.wireApi,Z(n,n=>{n[e]=t});let o=await X(t),s=ie(U(r)),c=U(r);return{name:e,entry:t,file:n,probe:o,codex:c,install:s,nativeResponses:a,keyMissing:!!(t.envKey&&!W.env[t.envKey]),ready:o.reachable&&c.available}}async function At(e,t,n,r,i){let a=$(n,r),o=D,{probe:s,codex:c,install:l,nativeResponses:u,keyMissing:d}=await kt(e,t,a,r);if(n.json){V({name:e,...t,file:a,probe:s,codex:c,...l?{codexInstall:l}:{},ready:s.reachable&&c.available});return}let f=e=>` ${o.green(`✔`)} ${e}`,p=e=>` ${o.red(`✘`)} ${e}`,m=[`${i} ${o.cyan(e)} -> ${t.model} @ ${t.baseUrl} ${o.dim(`(${a})`)}`,``,s.reachable?f(`${s.detail} ${o.dim(`(${u?`responses api, direct`:`chat api, auto-translated`})`)}`):p(s.detail),c.available?f(l?.installed?`${l.note} ${o.dim(`(${c.detail})`)}`:`codex engine ${o.dim(`(${c.detail})`)}`):p(l?.note??`codex CLI not installed - run: npm install -g @openai/codex`)];d&&m.push(p(`env var ${t.envKey} is not set in this shell`)),m.push(``,o.dim([`Use it: coder run --model ${e} "<task>"`,`Make default: coder config set agents.custom.model ${e}`].join(`
|
|
32
|
-
`))),W.stdout.write(`${m.join(`
|
|
33
|
-
`)}\n`)}function jt(e,t,n){return e||A(`Missing model name.`,{hint:t}),/^[a-z][a-z0-9-]*$/.test(e)||A(`Invalid model name "${e}". Use lowercase kebab-case (e.g. qwen-local).`),(wt.has(e)||n===`model`&&z(e))&&A(`"${e}" is reserved; pick another name.`),e}async function Mt(e){let t=`Usage: coder model add <name> --base-url <url> --model <id> [--env-key VAR]`,{options:n,positionals:r}=b(e,Q),i=M(n),a=jt(r[0],t,`model`),o=P(i).models?.[a];o&&A(B(o)?`Custom model "${a}" already exists.`:`"${a}" is already configured as an ${N(o)?`alias`:`entry`}; remove it first.`,{hint:`Change it: coder model update ${a} [--base-url|--model|--env-key], or remove it first.`}),(!n[`base-url`]||!n.model)&&A(`Missing --base-url or --model.`,{hint:t}),await At(a,{baseUrl:L(n[`base-url`]),model:n.model,...n[`env-key`]?{envKey:n[`env-key`]}:{}},n,i,`saved`)}async function Nt(e){let t=`Usage: coder model update <name> [--base-url <url>] [--model <id>] [--env-key VAR]`,{options:n,positionals:r}=b(e,Q),i=M(n),a=r[0],o=a?P(i).models?.[a]:void 0,s=o&&B(o)?o:void 0;(!a||!s)&&A(a?`No custom model named "${a}".`:`Missing model name.`,{hint:a?`List them: coder model list`:t}),!n[`base-url`]&&!n.model&&!n[`env-key`]&&A(`Nothing to update: pass --base-url, --model, or --env-key.`,{hint:t}),await At(a,{...s,...n[`base-url`]?{baseUrl:L(n[`base-url`])}:{},...n.model?{model:n.model}:{},...n[`env-key`]?{envKey:n[`env-key`]}:{}},n,i,`updated`)}async function Pt(e){let{options:t,positionals:n}=b(e,Q),r=M(t),i=n[0],a;try{a=Ut(r,i??``,{workspace:t.workspace})}catch(e){A(e instanceof Error?e.message:String(e),{hint:i?`List them: coder model list`:`Usage: coder model remove <name>`})}if(t.json){V(a);return}W.stdout.write(`removed ${D.cyan(a.removed)} ${D.dim(`(${a.file})`)}\n`)}async function Ft(e){await Lt(e,!0)}async function It(e){await Lt(e,!1)}async function Lt(e,t){let n=t?`disable`:`enable`,r=`Usage: coder model ${n} <name>`,{options:i,positionals:a}=b(e,Q),o=M(i),s=a[0];s||A(`Missing model name.`,{hint:r});let{file:c}=Kt(o,s,t,{workspace:i.workspace});if(i.json){V({[t?`disabled`:`enabled`]:s,file:c});return}W.stdout.write(`${n}d ${D.cyan(s)} ${D.dim(`(${c})`)}\n`)}async function Rt(e){let t=`Usage: coder model alias <name> <spec> (e.g. coder model alias fast codex:spark)`,{options:n,positionals:r}=b(e,Q),i=M(n),a=jt(r[0],t,`alias`),o=P(i).models?.[a];o&&B(o)&&A(`"${a}" is a custom model name; pick another alias name.`);let s=r[1];s||A(`Missing alias spec.`,{hint:t});let c;try{c=Wt(i,a,s,{workspace:n.workspace})}catch(e){let n=e instanceof Error?e.message:String(e);A(n,n.includes(`already dispatchable by name`)?{}:{hint:t})}if(n.json){V(c);return}let l=D,u=`${c.provider} ${c.model}${c.effort?` (${c.effort})`:``}`;W.stdout.write(`aliased ${l.cyan(a)} -> ${c.provider}:${c.model}${c.effort?`:${c.effort}`:``} ${l.dim(`= ${u}`)} ${l.dim(`(${c.file})`)}\n`)}async function zt(e){let{options:t,positionals:n}=b(e,Q),r=M(t),i=n[0],a=i?P(r).models?.[i]:void 0;(!i||!a||!N(a))&&A(i?`No alias named "${i}".`:`Missing alias name.`,{hint:i?`List them: coder model list`:`Usage: coder model unalias <name>`});let{file:o}=Gt(r,i,{workspace:t.workspace});if(t.json){V({unaliased:i,file:o});return}W.stdout.write(`unaliased ${D.cyan(i)} ${D.dim(`(${o})`)}\n`)}function Bt(e,t){if(!e)throw Error(`Missing model name.`);if(!/^[a-z][a-z0-9-]*$/.test(e))throw Error(`Invalid model name "${e}". Use lowercase kebab-case (e.g. qwen-local).`);if(wt.has(e)||t===`model`&&z(e))throw Error(`"${e}" is reserved; pick another name.`)}async function Vt(e,t,n){if(Bt(t,`model`),P(e).models?.[t])throw Error(`Custom model "${t}" already exists.`);if(!n.baseUrl||!n.model)throw Error(`Missing baseUrl or model.`);return kt(t,{baseUrl:L(n.baseUrl),model:n.model,...n.envKey?{envKey:n.envKey}:{}},$({workspace:n.workspace},e),e)}async function Ht(e,t,n){let r=P(e).models?.[t],i=r&&B(r)?r:void 0;if(!i)throw Error(`No custom model named "${t}".`);if(!n.baseUrl&&!n.model&&!n.envKey)throw Error(`Nothing to update: pass baseUrl, model, or envKey.`);return kt(t,{...i,...n.baseUrl?{baseUrl:L(n.baseUrl)}:{},...n.model?{model:n.model}:{},...n.envKey?{envKey:n.envKey}:{}},$({workspace:n.workspace},e),e)}function Ut(e,t,n={}){if(!t||!P(e).models?.[t])throw Error(t?`No custom model named "${t}".`:`Missing model name.`);let r=$({workspace:n.workspace},e);return Z(r,e=>{delete e[t]}),{removed:t,file:r}}function Wt(e,t,n,r={}){Bt(t,`alias`);let i=P(e),a=i.models?.[t];if(a&&B(a))throw Error(`"${t}" is a custom model name; pick another alias name.`);if(!n)throw Error(`Missing alias spec.`);let o=ze(n,i);if(!o||!o.model)throw Error(`Alias spec "${n}" does not resolve to a model.`);if(o.agent===`custom`)throw Error(`"${n}" names a custom model, which is already dispatchable by name; aliases target codex/claude models.`);let s=n.split(`:`).some(e=>Ce.has(e.trim())||_e.has(e.trim())),c=o.agent===`claude`?k:H,l={provider:o.agent,model:c[o.model]??o.model,...s&&o.effort?{effort:o.effort}:{}},u=$({workspace:r.workspace},e);return Z(u,e=>{e[t]=l}),{alias:t,...l,file:u}}function Gt(e,t,n={}){let r=t?P(e).models?.[t]:void 0;if(!t||!r||!N(r))throw Error(t?`No alias named "${t}".`:`Missing alias name.`);let i=$({workspace:n.workspace},e);return Z(i,e=>{delete e[t]}),{unaliased:t,file:i}}function Kt(e,t,n,r={}){if(!t)throw Error(`Missing model name.`);let i=!!P(e).models?.[t],a=$({workspace:r.workspace},e);return Z(a,e=>{let r=e[t];if(!r){n?e[t]={disabled:!0}:i&&(e[t]={disabled:!1});return}B(r)||N(r)?n?r.disabled=!0:delete r.disabled:n?r.disabled=!0:delete e[t]}),{name:t,disabled:n,file:a}}const qt={list:Ot,add:Mt,setup:Mt,update:Nt,remove:Pt,disable:Ft,enable:It,alias:Rt,unalias:zt};async function Jt(e){let[t,...n]=e;if(t===void 0||t.startsWith(`-`)){await Ot(e);return}let r=qt[t];r||A(`Unknown model subcommand "${t}". Use list, add, update, remove, disable, enable, alias, or unalias.`,{hint:`Help: coder model --help`}),await r(n)}const Yt=[{name:`readme`,file:`README.md`,description:`What Coder is and how to get started.`},{name:`skill`,file:`plugins/agents/skills/coder/SKILL.md`,description:`How a host agent should drive Coder.`}];function Xt(e){let t=K.join(e,`docs`),n=[];try{n=G.readdirSync(t).filter(e=>e.endsWith(`.md`)).sort()}catch{n=[]}let r=n.map(t=>{let n=K.join(`docs`,t);return{name:K.basename(t,`.md`),file:n,description:Zt(K.join(e,n))}}),i=Yt.map(e=>({name:e.name,file:e.file,description:e.description}));return[...r,...i]}function Zt(e){let t=``;try{t=G.readFileSync(e,`utf8`)}catch{return``}let n=t.split(`
|
|
34
|
-
`),r=``,i=``,a=!1;for(let e of n){let t=e.trim();if(t.startsWith("```")){a=!a;continue}if(!(a||t===``)){if(t.startsWith(`#`)){r||=t.replace(/^#+\s*/,``);continue}i=t;break}}return Qt(i)||r}function Qt(e){if(!e)return``;let t=e.match(/^.*?[.!?](?=\s|$)/);return(t?t[0]:e).trim()}function $t(e,t={}){let n=_(),r=Xt(n);if(!e)return{topics:r.map(e=>({name:e.name,description:e.description}))};let i=r.find(t=>t.name===e.toLowerCase());if(i?.name===`skill`&&t.claude&&(i={...i,file:`plugins/claude/skills/dispatch/SKILL.md`}),!i)throw Error(`Unknown docs topic "${e}". Available: ${r.map(e=>e.name).join(`, `)}`);let a=K.join(n,i.file),o;try{o=G.readFileSync(a,`utf8`)}catch{throw Error(`Could not read docs for "${i.name}" (${i.file}).`)}return{name:i.name,content:o}}async function en(e){let{options:t,positionals:n}=b(e,q.object({json:w,claude:w})),[r]=n,i;try{i=$t(r,{claude:t.claude})}catch(e){let t=e instanceof Error?e.message:String(e);return A(t,t.startsWith(`Unknown docs topic`)?{hint:`List topics: coder docs`}:{})}if(`content`in i){W.stdout.write(i.content.endsWith(`
|
|
35
|
-
`)?i.content:`${i.content}\n`);return}if(t.json){V(i);return}let a=D,o=Math.max(0,...i.topics.map(e=>e.name.length)),s=i.topics.map(e=>` ${a.cyan(e.name.padEnd(o))} ${a.dim(e.description)}`);W.stdout.write([a.bold(`Docs:`),...s,``,Ie([`Read a topic: coder docs <topic>`],a)].join(`
|
|
36
|
-
`)+`
|
|
37
|
-
`)}async function tn(e={},t){let n=!e.pluginsOnly,r=!e.cliOnly,i=_(),a=K.join(i,`plugins/claude/.claude-plugin/plugin.json`),o={cli:x(),claude:C(a)},s={};if(n){let n=le(g),[r,...i]=e.pm===`npm`?[`npm`,`install`,`-g`,`@wular/coder@latest`]:e.pm===`pnpm`?[`pnpm`,`add`,`-g`,`@wular/coder@latest`]:e.pm===`yarn`?[`yarn`,`global`,`add`,`@wular/coder@latest`]:e.pm===`bun`?[`bun`,`add`,`-g`,`@wular/coder@latest`]:n.command,a=e.pm??n.pm;t?.(`via ${a}`);let c=Ue(r,i,{encoding:`utf8`});if(c.error?.code===`ENOENT`)throw Error(`${a} not found on PATH. Re-run with --pm <npm|pnpm|yarn|bun>, or update manually: ${r} ${i.join(` `)}`);if(c.status!==0){let e=(c.stderr||c.stdout||``).trim();throw Error(`CLI update failed (${a}).${e?`\n${e}`:``}\nRun manually: ${r} ${i.join(` `)}`)}ce();let l=x();s.cli={pm:a,from:o.cli,to:l,changed:l!==o.cli}}if(r){if(e.claude||!e.codex&&ae().available){let e=ne(i);s.claudePlugin={installed:e.installed,note:e.note,from:o.claude,to:C(a)}}if(G.existsSync(fe())){let e=oe(),t=me(i);s.agentsSkill={installed:t.installed,note:t.note,from:e,to:oe()}}}return s}async function nn(e){let{options:t}=b(e,q.object({pm:T,"cli-only":w,"plugins-only":w,codex:w,claude:w})),n=D.bold,r=D.dim,i=(e,t)=>t&&e&&t!==e?`${e} ${r(`->`)} ${n(t)}`:`${t??e??`?`} ${r(`(unchanged)`)}`,a;try{a=await tn({cliOnly:t[`cli-only`],pluginsOnly:t[`plugins-only`],pm:t.pm,codex:t.codex,claude:t.claude},e=>W.stdout.write(`${n(`Updating coder CLI`)} ${r(`${e}...`)}\n`))}catch(e){A(e instanceof Error?e.message:String(e))}if(a.cli&&W.stdout.write(a.cli.changed?`${j(`coder CLI ${i(a.cli.from,a.cli.to)}`)}\n`:`${j(`coder CLI ${a.cli.from} ${r(`(already latest)`)}`)}\n`),a.claudePlugin){let e=a.claudePlugin;W.stdout.write(`${e.installed?j(`claude plugin ${i(e.from,e.to)} ${r(`- ${e.note}`)}`):O(`claude plugin ${e.note}`)}\n`)}if(a.agentsSkill){let e=a.agentsSkill;W.stdout.write(`${e.installed?j(`agents skill ${i(e.from,e.to)} ${r(`- ${e.note}`)}`):O(`agents skill ${e.note}`)}\n`)}}export{ft as C,tt as D,nt as E,et as O,dt as S,it as T,bt as _,Jt as a,pt as b,Dt as c,Gt as d,Ht as f,yt as g,xt as h,$t as i,Qe as k,Ut as l,St as m,tn as n,Vt as o,Ct as p,en as r,Wt as s,nn as t,Kt as u,_t as v,ot as w,mt as x,J as y};
|