@wular/coder 0.3.17 → 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-bHl6RBZ2.js +0 -3
- package/dist/runtime-X5Bgf1qH.js +0 -26
- package/dist/upgrade-piLxMgEv.js +0 -37
package/README.md
CHANGED
|
@@ -8,13 +8,12 @@
|
|
|
8
8
|
|
|
9
9
|
## Why Coder
|
|
10
10
|
|
|
11
|
-
- **
|
|
12
|
-
- **Cross-model.** Codex, Claude, any OpenAI-compatible endpoint, or local models. Pick per task.
|
|
11
|
+
- **Any harness, any model.** One runtime for Claude Code, Codex and more, dispatching to Codex, Claude, any OpenAI-compatible endpoint, or local models. Pick per task.
|
|
13
12
|
- **Clean context.** Your conversation stays about intent and orchestration; implementation details live in the subagents.
|
|
14
13
|
- **Fast dispatch.** Handoffs are instant, and light enough to spin up a large number of subagents at once.
|
|
15
|
-
- **
|
|
16
|
-
- **Unified permissions.** Three modes across all engines: _Read-only_, _Workspace-write_, and _Auto_.
|
|
14
|
+
- **Fully controlled tasks.** Unified permissions across engines (_Read-only_, _Workspace-write_, _Auto_), live visibility into every task, and mid-run steering.
|
|
17
15
|
- **Flows and SDK.** Orchestrate whole waves of tasks from a plain TypeScript file, or drive everything from your own code.
|
|
16
|
+
- **Agents.** Customizable agents that answer on GitHub, Slack and other platforms, hosted or self-hosted, and run the same from your terminal. The built-in `coder` agent answers questions, reviews pull requests, and makes requested changes.
|
|
18
17
|
|
|
19
18
|
## Get started
|
|
20
19
|
|
|
@@ -61,7 +60,7 @@ Or make it the default in AGENTS.md/CLAUDE.md:
|
|
|
61
60
|
|
|
62
61
|
> Always use Coder for all implementation and system exploring tasks.
|
|
63
62
|
|
|
64
|
-
Recommended setup: Claude Code as host (fable low/medium) and Codex (
|
|
63
|
+
Recommended setup: Claude Code as host (fable low/medium) and Codex (sol) as engine - best for performance and cost distribution.
|
|
65
64
|
|
|
66
65
|
## Staying up to date
|
|
67
66
|
|
|
@@ -71,6 +70,12 @@ coder upgrade
|
|
|
71
70
|
|
|
72
71
|
Updates the CLI through whichever package manager installed it and refreshes the host plugins to match. See `coder upgrade --help` for narrowing flags. Set `CODER_NO_UPDATE_CHECK=1` to silence the update notice.
|
|
73
72
|
|
|
73
|
+
## Agents
|
|
74
|
+
|
|
75
|
+
An agent is standing instructions plus its engine, tools and flows, and it works everywhere. In the cloud it answers events on GitHub, Slack and other platforms, like a pull request opening or a DM, on your own subscription or key, hosted or self-hosted. In your terminal, `coder task run --agent <id>` runs the same agent, and `coder dash` gives it a local dashboard. Install the built-in `coder` agent or write your own.
|
|
76
|
+
|
|
77
|
+
See [Agents](docs/agents/index.md) to install, define, and configure agents, [Dashboard](docs/dash.md) for a local UI over the CLI (`coder dash`), and [Self-hosting](docs/self-host.md) to run your own instance. The built-in `coder` agent works across GitHub and Slack and runs the [review flow](docs/review.md) for pull requests.
|
|
78
|
+
|
|
74
79
|
## Flows
|
|
75
80
|
|
|
76
81
|
For well-defined workflows, ask your host to write a flow. A Coder flow is a TypeScript file that fans out coders at scale with built-in support for deterministic verification gates, crash/resume handling, etc. Ask like:
|
|
@@ -84,13 +89,10 @@ The harness authors the flow, you can review or tweak it, and it runs with live
|
|
|
84
89
|
import { z } from 'zod';
|
|
85
90
|
import { task, gate, pipeline } from '@wular/coder/flow';
|
|
86
91
|
|
|
87
|
-
const failing = await task(
|
|
88
|
-
'
|
|
89
|
-
{
|
|
90
|
-
|
|
91
|
-
returns: z.object({ files: z.array(z.string()) }),
|
|
92
|
-
},
|
|
93
|
-
);
|
|
92
|
+
const failing = await task('Run `bun test` and list the failing test files.', {
|
|
93
|
+
name: 'Find failing tests',
|
|
94
|
+
returns: z.object({ files: z.array(z.string()) }),
|
|
95
|
+
});
|
|
94
96
|
|
|
95
97
|
export default await pipeline(
|
|
96
98
|
failing.data.files,
|
|
@@ -103,7 +105,7 @@ See [Flows](docs/flows.md), or the [SDK](docs/sdk.md) to drive everything from y
|
|
|
103
105
|
|
|
104
106
|
## Configuration
|
|
105
107
|
|
|
106
|
-
Machine defaults live in `~/.coder/config.json`;
|
|
108
|
+
Machine defaults live in `~/.coder/config.json`; `.coder/config.json` in a repo overrides per project. See [Configuration](docs/config.md).
|
|
107
109
|
|
|
108
110
|
## Advanced usage
|
|
109
111
|
|
|
@@ -111,12 +113,12 @@ You rarely need these - the host agent drives tasks itself - but everything is s
|
|
|
111
113
|
|
|
112
114
|
```bash
|
|
113
115
|
coder run "<text>" # dispatch a task (--wait to block for the answer)
|
|
114
|
-
coder list # list recent tasks (running + just stopped)
|
|
116
|
+
coder list # list recent tasks (by default running + just stopped)
|
|
115
117
|
coder result [task-id] # status + final answer (--wait blocks until done)
|
|
116
118
|
coder task steer <task-id> "<text>" # continue a task with new instructions
|
|
117
119
|
coder task ask <task-id> "<question>" # ask about a task without interrupting it
|
|
118
120
|
coder task stop <task-id> # interrupt it
|
|
119
|
-
coder task watch [task-id] #
|
|
121
|
+
coder task watch [task-id] # stream the live transcript
|
|
120
122
|
coder task approve <task-id> <appr-id> # answer an escalated permission (--deny)
|
|
121
123
|
|
|
122
124
|
coder flow run <name|path> --wait # run a flow (--dry-run to preview prompts)
|
|
@@ -127,7 +129,7 @@ coder flow watch [run-id] # watch the wave live (replay + follow)
|
|
|
127
129
|
coder flow stop [run-id] # stop a run and its tasks
|
|
128
130
|
coder flow resume [run-id] # continue a crashed or edited run
|
|
129
131
|
|
|
130
|
-
coder docs [topic] # print bundled docs (flows, sdk, config, models)
|
|
132
|
+
coder docs [topic] # print bundled docs (flows, review, sdk, config, models)
|
|
131
133
|
```
|
|
132
134
|
|
|
133
135
|
Any `[task-id]` defaults to the most recent task.
|
package/bin/coder.mjs
CHANGED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{Bt as t,Cn as n,Et as r,Gt as i,Lt as a,M as o,Mt as s,N as c,O as l,P as u,Qt as d,Rt as f,Tt as p,Wt as m,an as h,cn as g,d as ee,ft as _,j as v,jt as y,k as b,ln as x,mt as S,nn as C,nt as te,sn as w,tn as T,tt as E,un as D,vn as O,wt as k,x as A,xt as ne,z as j,zt as M}from"./dispatch-BKeAch9E.js";import{t as re}from"./chat-bridge-BS9WtP3X.js";import N from"node:path";import P from"node:process";import F from"node:fs";import{spawn as I}from"node:child_process";import L from"node:os";function R(){let e=process.env.CLAUDE_CONFIG_DIR||N.join(L.homedir(),`.claude`);return N.join(e,`projects`)}function z(e){if(!e)return!1;let t=R(),n=!1;try{for(let r of F.readdirSync(t)){let i=N.join(t,r,`${e}.jsonl`);F.existsSync(i)&&(F.rmSync(i,{force:!0}),n=!0)}}catch{}return n}var B=e({archiveFlagged:()=>ie,askTask:()=>q,claudeAskOptions:()=>K,collectPending:()=>J,collectTasks:()=>Y,deleteTask:()=>$,sidecarPrompt:()=>G,spawnArchiveSweep:()=>Q,steerTask:()=>H,stopTask:()=>Z,streamTask:()=>X});async function V(e,t,n,r,i={}){if(t.status!==`running`)return null;let a=t.engine===`claude`?await(i.claude??b)(t.steerEndpoint,n,void 0,r):await(i.codex??c)(e,{endpoint:t.steerEndpoint,threadId:t.threadId,turnId:t.turnId,text:n,command:r});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=M(e,t.id)??t;return g.includes(o.status)?(y(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 H(e,t,n,r={},i={}){if(!t.threadId)throw new ne(`invalid-option`,`Task ${t.id} has no thread to steer yet (status: ${t.status}).`,{hint:`Wait for it to start: coder task watch ${t.id}`});let a=await V(e,t,n,r.command,i);if(a){let n=M(e,t.id)??t;return n.archived&&h(e,n),a}return U(e,t,n,r),{taskId:t.id,steered:`resumed`}}function U(e,t,n,r){t.archived&&h(e,t),w(e,t.id,{status:`queued`,resumedAt:new Date().toISOString(),currentPrompt:n,...r.outputSchema?{outputSchema:r.outputSchema}:{},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}`}),ee(t.cwd??e,t.id)}const W=[`Read`,`Glob`,`Grep`];function G(e,t,n){return`You are a read-only sidecar answering a question ABOUT a coder task.
|
|
2
|
+
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.
|
|
3
|
+
|
|
4
|
+
Task metadata:
|
|
5
|
+
${[`id: ${e.id}`,...e.name?[`name: ${e.name}`]:[],`status: ${e.status}`,`engine: ${e.engine}${e.model?`/${e.model}`:``}${e.effort?`/${e.effort}`:``}`,...e.cwd?[`workspace: ${e.cwd}`]:[],...e.createdAt?[`created: ${e.createdAt}`]:[],...e.completedAt?[`finished: ${e.completedAt}`]:[]].join(`
|
|
6
|
+
`)}
|
|
7
|
+
|
|
8
|
+
Task prompt:
|
|
9
|
+
${e.prompt??`(unknown)`}
|
|
10
|
+
|
|
11
|
+
Inspect as needed (grep/read selectively; events can be large):
|
|
12
|
+
- progress log (jsonl, one event per line): ${N.join(t,`log.jsonl`)}
|
|
13
|
+
- final result: ${N.join(t,`result.json`)}
|
|
14
|
+
- worker output: ${N.join(t,`worker.log`)}
|
|
15
|
+
${e.cwd?`- the task's workspace (its code and changes): ${e.cwd}`:``}
|
|
16
|
+
|
|
17
|
+
Question: ${n}
|
|
18
|
+
|
|
19
|
+
Answer the question directly and concisely.`}function K(e,t,n,r){return{prompt:n,model:r.model??e.model,effort:r.effort,permissions:`read-only`,additionalDirectories:[t],taskRoot:t,readOnlyAllowedTools:W}}async function q(e,t,n,r={}){let i=d(e,t.id),a=G(t,i,n)+(r.command?`\n\nCoder command ${j(r.command)}`:``),s=r.command?e=>{let t=N.join(i,`inbox-control`);F.mkdirSync(t,{recursive:!0}),F.appendFileSync(N.join(t,`${j(r.command)}.transcript.jsonl`),JSON.stringify({command:r.command,result:e.finalMessage??e.error?.message??``})+`
|
|
20
|
+
`)}:void 0,c=r.effort??t.effort??null;if(t.engine===`claude`)return l(t.cwd??e,{...K(t,i,a,{model:r.model,effort:c}),command:r.command,onResult:s});let u=te(e),f=r.model??t.model,p=f?u.models?.[f]:void 0,m=p&&E(p)?p:void 0;if(m?.envKey&&!P.env[m.envKey])throw Error(`Missing environment variable: \`${m.envKey}\`.`);let h=m?await re(m,m.wireApi??`chat`):null,g=S(u,f,h??void 0);try{return await o(t.cwd??e,{prompt:a,model:g?.model??_(f??null),modelProvider:g?.modelProvider??null,configOverrides:g?.configOverrides??null,effort:c,sandbox:`read-only`,approvalPolicy:`never`,ephemeral:!0,onResult:s})}finally{await h?.close()}}function J(e){return f(e).filter(e=>g.includes(e.status)).flatMap(t=>A(d(e,t.id)).filter(e=>!e.response).map(e=>({taskId:t.id,id:e.id,summary:String(e.summary??``),createdAt:e.createdAt?String(e.createdAt):void 0})))}function Y(e,n={}){let r=n.limit===`all`?void 0:n.limit,i=e=>x.includes(e.status),o=[],s=f(e).filter(n=>{if(!i(n))return!0;let r=n.completedAt??n.updatedAt??n.createdAt;return k(r)<=6e5||(t(e,n),o.push(n.id),!1)});if(Q(e,o),n.archived?s=a(e):n.running?s=s.filter(e=>g.includes(e.status)):n.stopped&&(s=s.filter(i)),n.dir){let e=T(N.resolve(String(n.dir))),t=new Map;s=s.filter(n=>n.cwd?(t.has(n.cwd)||t.set(n.cwd,T(n.cwd)),t.get(n.cwd)===e):!1)}if(!n.archived&&!n.running&&!n.stopped){let e=e=>e.status===`failed`?0:g.includes(e.status)?1:e.status===`completed`?3:2;s=[...s].sort((t,n)=>e(t)-e(n))}let c=r===void 0?0:Math.max(0,s.length-r);return r!==void 0&&(s=s.slice(0,r)),{tasks:s,clipped:c}}async function*X(e,t,r={}){let i=new Set([`completed`,`failed`,`cancelled`]),a=M(e,t);if(!a)throw Error(`No task found for "${t}".`);let o=r.tail??1,s=n(N.join(d(e,t),`log.jsonl`)),c=!0,l=()=>{let e=s().map(e=>{try{return JSON.parse(e)}catch{return{message:e}}});return c?(c=!1,o===`all`?e:C(e,o)):e};for(yield*l();!i.has(a.status);)await new Promise(e=>setTimeout(e,400)),a=m(e,M(e,t)??a),yield*l();yield*l()}async function Z(e,t,n={}){let r=t.engine===`claude`?{detail:`claude worker terminated`}:await(n.interrupt??v)(e,{endpoint:t.steerEndpoint,threadId:t.threadId,turnId:t.turnId});if(t.engine!==`claude`&&u(t.steerEndpoint),t.pid&&t.status===`running`)try{P.kill(t.pid,`SIGTERM`)}catch{}return w(e,t.id,{status:`cancelled`,steerEndpoint:null,completedAt:new Date().toISOString()}),{taskId:t.id,status:`cancelled`,interrupt:r.detail}}function Q(e,t,n={}){if(t.length)try{I(P.execPath,[O,`task`,`archive-sweep`,`--cwd`,e,...n.flows?[`--flows`]:[],...t],{detached:!0,stdio:`ignore`}).unref()}catch{}}function $(e,t){return t.threadId&&(t.engine===`claude`?z(t.threadId):D(e,t.threadId)),i(e,t.id)}function ie(e,t){for(let n of t){let t=s(e,n);t&&x.includes(t.status)&&r(e,t)}}export{$ as a,Z as c,Y as i,X as l,q as n,Q as o,J as r,H as s,B as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as e}from"./integrations-BAgdVDhj.js";import{createHmac as t}from"node:crypto";import{ConsoleLogger as n}from"chat";import{LinearAdapter as r}from"@chat-adapter/linear";function i(n,r,i,a=Date.now()){if(!i||!r)return!1;let o=t(`sha256`,i).update(n).digest();if(!e(Buffer.from(r,`hex`),o))return!1;let s=JSON.parse(n).webhookTimestamp;return typeof s==`number`&&Math.abs(a-s)<=6e4}var a=class extends r{organization;constructor(e,t){super(e),this.organization=t}async initialize(e){this.chat=e}bound(e){return this.requestContext.getStore()?e():this.organization?this.withInstallation(this.organization,e):Promise.reject(Error(`No Linear workspace to post for`))}postMessage(e,t){return this.bound(()=>super.postMessage(e,t))}startTyping(e,t){return this.bound(()=>super.startTyping(e,t))}};function o(e){let t=e.credentials?.webhookSecret,r=e.installationId;return new a({mode:`agent-sessions`,userName:e.name,apiUrl:`https://api.linear.app/graphql`,encryptionKey:``,accessToken:()=>r?e.token(r):Promise.reject(Error(`The webhook names no Linear workspace`)),webhookVerifier:(e,n)=>i(n,e.headers.get(`linear-signature`),t),logger:new n(`error`)},r)}export{o as linearAdapter};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{o as e,s as t}from"./integrations-BAgdVDhj.js";import{ConsoleLogger as n}from"chat";import{createGitHubAdapter as r}from"@chat-adapter/github";function i(i){let a=i.credentials?.webhookSecret,o=i.installationId,s;return r({userName:i.name,apiUrl:`https://api.github.com`,botUserId:0,installationToken:()=>o?s??=i.token(o,{tools:t.comment}):Promise.reject(Error(`The webhook names no GitHub installation`)),webhookVerifier:(t,n)=>e(n,t.headers.get(`x-hub-signature-256`),a),logger:new n(`error`)})}export{i as githubAdapter};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./integrations-BAgdVDhj.js";import{ConsoleLogger as e}from"chat";import{createTeamsAdapter as t}from"@chat-adapter/teams";function n(n){let r=n.installationId;if(!r)throw Error(`A Teams adapter requires its bound directory`);if(process.env.CLOUD&&process.env.CLOUD!==`Public`)throw Error(`The Teams SDK cannot override CLOUD; Coder requires the public Bot Framework cloud`);return t({appId:n.appId,appType:`SingleTenant`,appTenantId:r,apiUrl:``,userName:n.name,token:async e=>{if(![e].flat().includes(`https://api.botframework.com/.default`))throw Error(`Coder mints only Bot Framework tokens for Teams`);if(!r)throw Error(`The activity names no Teams directory`);return n.token(r)},...n.credentials?{}:{webhookVerifier:()=>!1},logger:new e(`error`)})}export{n as teamsAdapter};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./chat-3Znsevah.js";import{ConsoleLogger as t}from"chat";import{SlackAdapter as n}from"@chat-adapter/slack";const r=`coder-pending:`;function i(e,t){return async n=>{let i=n.data,a=n.headers.toJSON(),o=typeof i==`string`?new URLSearchParams(i):void 0,s=o?.get(`token`);o&&s?.startsWith(r)&&(o.set(`token`,await t(s.slice(14))),i=o.toString());let c=Object.keys(a).find(e=>e.toLowerCase()===`authorization`);c&&a[c].startsWith(`Bearer ${r}`)&&(a[c]=`Bearer ${await t(a[c].slice(`Bearer ${r}`.length))}`);let l=await e(new URL(n.url??``,n.baseURL),{method:n.method?.toUpperCase()??`POST`,headers:a,body:i});return{data:await l.text(),status:l.status,statusText:l.statusText,headers:Object.fromEntries(l.headers),config:n,request:{}}}}var a=class extends n{outbound;constructor(e,t){super(e),this.outbound=t}async initialize(t){let n=new e,r=t.getState(),i=new Proxy(r,{get(e,t){let r=Reflect.get(e,t);return typeof r==`function`?(...r)=>{let i=typeof r[0]==`string`&&/^slack:(?:user:|user-by-name:|thread-participants:)/.test(r[0])?n:e;return Reflect.apply(Reflect.get(i,t),i,r)}:r}});await super.initialize(new Proxy(t,{get:(e,t,n)=>t===`getState`?()=>i:Reflect.get(e,t,n)}))}markEventDelivered(){}async isDuplicateEventDelivery(){return!1}getToken(){return this.requestContext.getStore()?.token||!this.outbound?super.getToken():this.outbound()}};function o(e){let n=e.credentials?.signingSecret,o=e.installationId,s=new Map,c=t=>(s.has(t)||s.set(t,e.token(t)),s.get(t));return new a({userName:e.name,apiUrl:`https://slack.com/api/`,appToken:``,socketForwardingSecret:``,clientId:``,clientSecret:``,encryptionKey:``,...n?{signingSecret:n,installationProvider:{getInstallation:async t=>({botToken:`${r}${t}`,...e.self?{botUserId:e.self}:{}})}}:{webhookVerifier:()=>!1,botToken:()=>o?e.token(o):Promise.reject(Error(`No Slack workspace to post for`))},webClientOptions:{adapter:i(e.fetch,c)},logger:new t(`error`)},n&&o?()=>c(o):void 0)}export{o as slackAdapter};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ConsoleLogger as e}from"chat";import{GmailAdapter as t}from"@chat-adapter/gmail";import{GmailWebhookError as n,createGmailWebhookVerifier as r}from"@chat-adapter/gmail/webhook";var i=class extends t{isBound;verify;constructor(e,t,n){super(e),this.isBound=n,this.verify=r(t)}async handleWebhook(e,t){let r=await this.verify(e).catch(e=>{if(e instanceof n)return new Response(e.message,{status:e.status});throw e});return r instanceof Response?r:r.emailAddress===this.userName?!this.isBound||!await this.isBound(r.emailAddress)?new Response(`Gmail mailbox is not bound`,{status:403}):(t?.waitUntil?t.waitUntil(this.sync()):await this.sync(),new Response(null,{status:204})):new Response(`Unexpected Gmail mailbox`,{status:403})}};function a(t){let n=t.credentials,r=t.installationId;if(!r)throw Error(`A Gmail adapter serves one bound mailbox`);let a=n?{subscription:n.subscription,audience:n.audience,serviceAccountEmail:n.serviceAccount}:{subscription:`projects/none/subscriptions/none`,webhookVerifier:()=>!1};return new i({mailbox:r,labelId:n?.label??`INBOX`,accessToken:()=>t.token(r),topicName:n?.topic??``,subscription:a.subscription,pubsubAudience:a.audience??``,pubsubServiceAccountEmail:a.serviceAccountEmail??``,...a.webhookVerifier?{webhookVerifier:a.webhookVerifier}:{},replyAll:!1,fetch:t.fetch,logger:new e(`error`)},a,t.isBound)}export{a as gmailAdapter};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{xt as e}from"./dispatch-BKeAch9E.js";import{i as t,t as n}from"./cli-BilSDkvE.js";import{c as r,s as i}from"./args-BOEEdpWk.js";import{runnerOptions as a}from"./remove-B93LNkZI.js";import o from"node:process";const s=t({name:`runner add`,globalFlags:{cwd:!1},args:1,help:{usage:`coder runner add <kind> [--name <name>] [--scope <scope>] [--field key=value …] [--server [url]] [--json]`,summary:`Connect a runner. Secret fields read environment variables with key=env:VARIABLE. Adding local prints a pairing command.`,flags:[[`--name <name>`,`runner display name`],[`--scope <scope>`,`personal or workspace`],[`--field key=value`,`repeat for each field, use env:VARIABLE for secrets`],n]},options:{...a,name:i,scope:i,field:r},async run({options:t,args:[n]}){if(!n)throw new e(`invalid-option`,`Missing runner kind.`);let{addRunnerFields:r}=await import(`./runner-sUpWJ_k0.js`).then(e=>e.a);return r(n,t)},print:e=>o.stdout.write(`${`command`in e?e.command:`Added ${e.name} (${e.id}).`}\n`)});export{s as commandRunnerAdd};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{rt as e}from"./dispatch-BKeAch9E.js";import{i as t}from"./cli-BilSDkvE.js";import{n,s as r,t as i}from"./args-BOEEdpWk.js";import a from"node:process";const o=({name:e,file:t})=>a.stdout.write(`Added MCP server "${e}" to ${t}. Attach with --mcp ${e}.\n`),s=a=>t({name:`mcp add`,help:{usage:`coder mcp add <name> [--tools a,b] [--user] (--url <url> [--header K=V] [--transport http|sse] | [--env K=V] -- <command> [args...])`,summary:"Save an MCP server under `mcp.<name>`: a remote url, or the command to spawn after `--`.",flags:[[`--url <url>`,`remote server (streamable HTTP by default)`],[`--header <K=V,...>`,"request headers for a remote server; values may hold ${VAR}"],[`--transport <http|sse>`,`remote transport (default: http)`],[`--env <K=V,...>`,"environment for a stdio server; values may hold ${VAR} or ${VAR:-default}"],[`--tools <a,b>`,`tool allowlist (default: every tool the server offers)`],[`--user`,`write ~/.coder config instead of the repo`]],examples:[[`coder mcp add docs -- npx -y docs-mcp`,`then: coder run --mcp docs "..."`]]},options:{...i,env:r,header:r,url:r,transport:r,tools:r,user:n},args:1,run:({options:t,args:[n],cwd:r})=>e(r,n,{...t,command:a}),print:o}),c=Object.assign(e=>{let t=e.indexOf(`--`);return s(t===-1?[]:e.slice(t+1))(t===-1?e:e.slice(0,t))},s([]));export{c as commandMcpAdd,o as printAdded};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{i as t}from"./cli-BilSDkvE.js";import{p as n}from"./output-BKeyLbvt.js";import{n as r,s as i,t as a}from"./args-BOEEdpWk.js";import{t as o}from"./models-_5LVGC3m.js";import s from"node:process";var c=e({commandModelAdd:()=>d,modelOptions:()=>l,modelSavedJson:()=>f,printModelSaved:()=>p,writeOptions:()=>u});const l={...a,"base-url":i,model:i,"env-key":i,workspace:r},u=e=>({baseUrl:e[`base-url`],model:e.model,envKey:e[`env-key`],workspace:e.workspace}),d=t({name:`model add`,help:{usage:`coder model add <name> --base-url <url> --model <id> [--env-key VAR]`,summary:`Connect a custom model behind an OpenAI-compatible endpoint (Ollama, LM Studio,
|
|
2
|
+
vLLM, OpenRouter, ...). It currently runs on the codex engine pointed at your
|
|
3
|
+
URL and is usable anywhere a model is: --model <name>, --engine custom, or as an
|
|
4
|
+
agent default in config. Alias: \`coder model setup\`.`,flags:[[`--base-url <url>`,`OpenAI-compatible API base (e.g. http://localhost:11434/v1)`],[`--model <id>`,`the provider's model id (e.g. qwen2.5-coder:32b)`],[`--env-key <VAR>`,`env var holding the API key (omit for keyless local endpoints)`],[`--workspace`,`write to <repo>/.coder/config.json instead of the user file`]],examples:[[`coder model add qwen --base-url http://localhost:11434/v1 --model qwen2.5-coder:32b`,`local Ollama model, no key`],[`coder model add kimi --base-url https://openrouter.ai/api/v1 --model moonshotai/kimi-k2 --env-key OPENROUTER_API_KEY`,`third-party provider via OpenRouter`],[`coder run --model qwen "explain this repo"`,`dispatch a task on it`]]},options:l,args:1,run:({options:e,args:[t],cwd:n})=>o(n,t,u(e)),json:f,print:e=>p(e,`saved`)});function f({name:e,entry:t,file:n,probe:r,codex:i,install:a,ready:o}){return{name:e,...t,file:n,probe:r,codex:i,...a?{codexInstall:a}:{},ready:o}}function p({name:e,entry:t,file:r,probe:i,codex:a,install:o,nativeResponses:c,keyMissing:l},u){let d=n,f=e=>` ${d.green(`✔`)} ${e}`,p=e=>` ${d.red(`✘`)} ${e}`,m=[`${u} ${d.cyan(e)} -> ${t.model} @ ${t.baseUrl} ${d.dim(`(${r})`)}`,``,i.reachable?f(`${i.detail} ${d.dim(`(${c?`responses api, direct`:`chat api, auto-translated`})`)}`):p(i.detail),a.available?f(o?.installed?`${o.note} ${d.dim(`(${a.detail})`)}`:`codex engine ${d.dim(`(${a.detail})`)}`):p(o?.note??`codex CLI not installed - run: npm install -g @openai/codex`)];l&&m.push(p(`env var ${t.envKey} is not set in this shell`)),m.push(``,d.dim([`Use it: coder run --model ${e} "<task>"`,`Make default: coder config set engines.custom.model ${e}`].join(`
|
|
5
|
+
`))),s.stdout.write(`${m.join(`
|
|
6
|
+
`)}\n`)}export{u as a,p as i,l as n,f as r,c as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as e,t}from"./cli-BilSDkvE.js";import{p as n}from"./output-BKeyLbvt.js";import{c as r,n as i,s as a}from"./args-BOEEdpWk.js";import{credentialOptions as o}from"./remove-eQ8y5C5p.js";import s from"node:process";const c=e({name:`credentials add`,globalFlags:{cwd:!1},help:{usage:`coder credentials add [label] --engine <claude|codex|custom> --env <NAME> [--env <NAME> ...] [--value <secret|->] [--workspace] [--no-check] [--default] [--server [url]]`,summary:`Store an API key, encrypted on the server, as your personal credential or with --workspace for every member. The value comes from the named environment variable unless --value says otherwise, and is never printed. Without subscription sign-in on the server, CLAUDE_CODE_OAUTH_TOKEN takes your own claude setup-token output.`,examples:[[`ANTHROPIC_API_KEY=sk-... coder credentials add --engine claude --env ANTHROPIC_API_KEY`,`your own API key, read from the environment`],[`OPENAI_API_KEY=sk-... coder credentials add team --engine codex --env OPENAI_API_KEY --workspace`,`a workspace key every member's tasks can use`],[`pbpaste | coder credentials add router --engine custom --env OPENROUTER_API_KEY --value -`,`any provider, value from stdin`]],flags:[[`--env <NAME>`,`one environment variable name; repeat for more (reads that variable by default)`],[`--engine <name>`,`claude, codex, or custom`],[`--value <secret|->`,`literal values land in shell history and are visible to other processes; use - for stdin or prefer environment variables`],[`--workspace`,`a workspace credential; owners and admins only`],[`--no-check`,`skip the provider credential check`],[`--default`,`make this the default for its engine`],t]},options:{...o,engine:a,env:r,value:a,"no-check":i,default:i},args:1,run:async({options:e,args:[t]})=>{let{addCredential:n}=await import(`./remote-miQNTVRa.js`).then(e=>e.a);return n(t,{...e,env:e.env??[],noCheck:e[`no-check`]})},print:(e,{options:t})=>s.stdout.write(`Added ${t.workspace?`workspace`:`personal`} credential ${n.bold(e.label)}.\n`)});export{c as commandCredentialsAdd};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{it as e}from"./dispatch-BKeAch9E.js";import{i as t}from"./cli-BilSDkvE.js";import{n,t as r}from"./args-BOEEdpWk.js";import{printAdded as i}from"./add-CE-70LFs.js";const a=t({name:`mcp add-json`,help:{usage:`coder mcp add-json <name> '<json entry>' [--user]`,summary:`Save an entry pasted from any .mcp.json (command/args/env or url/headers, plus tools).`,flags:[[`--user`,`write ~/.coder config instead of the repo`]]},options:{...r,user:n},args:2,run:({options:t,args:[n,r],cwd:i})=>e(i,n,r,t),print:i});export{a as commandMcpAddJson};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{xt as t}from"./dispatch-BKeAch9E.js";import{t as n}from"./types-D0q15RJa.js";import{a as r}from"./load-BpEsAn51.js";import{i,n as a}from"./remote-miQNTVRa.js";import{t as o}from"./integrations-BAgdVDhj.js";import{a as s,r as c}from"./exec-RZFLclKX.js";import{c as l,o as u,u as d}from"./task-DeglY79z.js";import{n as f}from"./match-CXAjDhg7.js";import p from"node:path";import m from"node:process";import h from"node:fs";import{spawn as g}from"node:child_process";import _ from"node:os";import v from"node:fs/promises";const y=/\x1b\[[0-9;?]*[ -/]*[@-~]|\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)|\x1b[()][A-Z0-9]|\r/g;function b(e,t){if(e===`codex`)return{file:`codex`,args:[`login`,`--device-auth`],env:{CODEX_HOME:t}};let n=`stty cols 4000 rows 50 2>/dev/null; exec claude setup-token`;return{file:`sh`,args:[`-c`,`cat | { ${m.platform===`darwin`?`script -q /dev/null sh -c '${n}'`:`script -qfec '${n}' /dev/null`}; kill 0; }`],env:{CLAUDE_CONFIG_DIR:t,BROWSER:`true`}}}function x(e){try{return JSON.parse(Buffer.from(String(e).split(`.`)[1]??``,`base64url`).toString())}catch{return{}}}function S(e){let t=x(JSON.parse(e).tokens?.id_token),n=t[`https://api.openai.com/auth`];return{...typeof t.email==`string`?{email:t.email}:{},...typeof n?.chatgpt_plan_type==`string`?{plan:n.chatgpt_plan_type}:{}}}function C(e,t){let n=t.replace(y,``),r=/\x1b\]8;[^;]*;(https:\/\/[^\x07\x1b]+)(?:\x07|\x1b\\)/.exec(t)?.[1],i=e===`claude`?r??/https:\/\/\S*(?:oauth|authorize)\S*(?=\s)/.exec(n)?.[0]:/https:\/\/\S+(?=\s)/.exec(n)?.[0],a=e===`codex`?/\b[A-Z0-9]{4,}-[A-Z0-9]{4,}\b/.exec(n)?.[0]:void 0;if(!(!i||e===`codex`&&!a))return{url:i,...a?{code:a}:{}}}async function w(e,t){let{server:n,token:r}=d();delete m.env.CODER_TASK_TOKEN,delete m.env.CODER_LOGIN;let i=new AbortController,a=async(t,a)=>{let o=await fetch(`${n}/logins/${encodeURIComponent(e)}${t}`,{method:a===void 0?`GET`:`POST`,...t?{signal:i.signal}:{},headers:{authorization:`Bearer ${r}`,...a===void 0?{}:{"content-type":`application/json`}},...a===void 0?{}:{body:JSON.stringify(a)}});if(!o.ok)throw Error(`Coder server answered ${o.status}`);return await o.json()},{engine:o}=await a(``),s=await v.mkdtemp(p.join(t,`.login-`)),c=b(o,s),l=g(c.file,c.args,{env:{...m.env,...c.env},stdio:[`pipe`,`pipe`,`pipe`],detached:!0}),u=()=>{try{m.kill(-l.pid,`SIGTERM`)}catch{}},f=``,h=``,_=!1,x=new Promise((e,t)=>{l.once(`error`,t),l.once(`close`,e)}),w=setTimeout(u,6e5),T=async()=>{for(;!i.signal.aborted;){let{code:e}=await a(`/input`);if(e)return void l.stdin.write(`${e}\r`)}},E=e=>{if(f+=e.toString(),h=f.replace(y,``),!_){let e=C(o,f);e&&(_=!0,m.stdout.write(`Sign-in link ready
|
|
2
|
+
`),a(``,e).catch(()=>u()),o===`claude`&&T().catch(()=>{i.signal.aborted||u()}))}o===`claude`&&/sk-ant-oat[\w-]+\s/.test(h)&&u()};l.stdout.on(`data`,E),l.stderr.on(`data`,E);try{let e=await x;i.abort();let t=/sk-ant-oat[A-Za-z0-9_-]+/.exec(h)?.[0];if(o===`claude`&&t){let e=/[\w.+-]+@[\w-]+(?:\.[\w-]+)+/.exec(h)?.[0];await a(``,{result:{env:{CLAUDE_CODE_OAUTH_TOKEN:t},...e?{account:{email:e}}:{}}})}else if(o===`codex`&&e===0){let e=await v.readFile(p.join(s,`auth.json`),`utf8`);await a(``,{result:{env:{CODEX_AUTH_JSON:e},account:S(e)}})}else await a(``,{error:_?`Sign-in did not finish. Start again.`:`${o} sign-in could not start.`}).catch(()=>{});m.stdout.write(`Sign-in finished
|
|
3
|
+
`)}finally{clearTimeout(w),i.abort(),u(),await v.rm(s,{recursive:!0,force:!0})}}var T=e({agentIdError:()=>k,agents:()=>P,regexError:()=>A});const E=e=>e.cwd?p.resolve(e.cwd):m.cwd(),D=e=>(Array.isArray(e)?e:(e??``).split(`,`)).map(e=>e.trim()).filter(Boolean),O=/^[a-z0-9][a-z0-9_-]*$/;function k(e,t){if(!O.test(t))return`Use lowercase letters, digits, - or _, starting with a letter or digit.`;let n=p.join(e,`.coder`,`agents`,t);if(h.existsSync(n)&&h.readdirSync(n).length>0)return`${p.relative(e,n)} is not empty; clear it to start over, or edit what is there.`}function A(e){try{new RegExp(e);return}catch{return`Not a valid regular expression.`}}function j(e,t){let n=o[e]?.sample;return{integration:e,type:t,appId:`${e}:sample`,installationId:`sample`,deliveryId:`sample-1`,actor:{id:`user-1`,login:`someone`,role:`member`},text:`Replace me with the text a real event would carry.`,...n?{chat:{thread:{_type:`chat:Thread`,adapterName:e,channelId:n.slice(0,n.lastIndexOf(`:`)),id:n,isDM:!1}}}:{}}}async function M(e,r={}){let i=E(r);if(!e&&r.askId&&(e=await r.askId(e=>k(i,e))),!e)throw new t(`invalid-option`,`Missing agent id.`,{hint:`Usage: coder agent init <id>`});let a=k(i,e);if(a)throw new t(`invalid-option`,a.includes(`not empty`)?a:`Agent id "${e}": ${a}`);let s=p.join(i,`.coder`,`agents`,e),c=r.askPicks?await r.askPicks(e):{...r.name?{name:r.name}:{},integrations:D(r.integrations).length?D(r.integrations):[Object.keys(o)[0]],events:{},matches:{},tools:r.tools??`comment`};if(!n.includes(c.tools))throw new t(`invalid-option`,`Unknown preset "${c.tools}"; valid: ${n.join(`, `)}`);let l={},u=D(r.triggers),d=e=>Object.keys(o[e]?.events??{});for(let e of c.integrations)if(!o[e])throw new t(`invalid-option`,`Unknown integration "${e}"; valid: ${Object.keys(o).join(`, `)}`);for(let e of u)if(!c.integrations.some(t=>d(t).includes(e)))throw new t(`invalid-option`,`No chosen integration has event "${e}".`,{hint:`Events per integration: coder agent integrations show <id>`});let f=Object.fromEntries(D(r.match).map(e=>{let n=e.indexOf(`=`);if(n<1)throw new t(`invalid-option`,`Bad --match "${e}"; use event=regex.`);let r=e.slice(n+1);if(A(r))throw new t(`invalid-option`,`Bad --match for ${e.slice(0,n)}: ${A(r)}`);return[e.slice(0,n),r]}));for(let e of c.integrations){let n=d(e),r=c.events[e]??(u.length?u.filter(e=>n.includes(e)):[n.includes(`mention`)?`mention`:n[0]]);for(let i of r)if(!n.includes(i))throw new t(`invalid-option`,`${e} has no event "${i}"; valid: ${n.join(`, `)}`);let i={...f,...c.matches[e]??{}},a=r.filter(e=>i[e]);r.length&&(l[e]={triggers:a.length?Object.fromEntries(r.map(e=>[e,!i[e]||{match:i[e]}])):r,tools:c.tools})}let m={...c.name?{name:c.name}:{},...r.description?{description:r.description}:{},permissions:r.permissions??`read-only`,integrations:l};await v.mkdir(s,{recursive:!0}),await v.writeFile(p.join(s,`agent.json`),`${JSON.stringify(m,null,2)}\n`),await v.writeFile(p.join(s,`system.md`),`You are ${c.name??e}.\n`);let h=p.join(_.tmpdir(),`coder-agent-samples`,e),g=[];for(let[e,t]of Object.entries(l)){let n=(Array.isArray(t.triggers)?t.triggers:Object.keys(t.triggers??{}))[0];await v.mkdir(h,{recursive:!0});let r=p.join(h,`sample-${e}-${n}.json`);await v.writeFile(r,`${JSON.stringify(j(e,n),null,2)}\n`),g.push(r)}return{id:e,dir:s,files:[`agent.json`,`system.md`],samples:g,integrations:Object.keys(l)}}function N(e){if(e===void 0||typeof e==`number`)return e;if(/^\d+$/.test(e))return Number(e);let n=/^(\d+)([dh])$/.exec(e);if(!n)throw new t(`invalid-option`,`Invalid --since value.`,{hint:`Use 7d, 24h, or milliseconds since epoch`});return Date.now()-Number(n[1])*(n[2]===`d`?864e5:36e5)}const P={list:(e={})=>e.server===void 0?r(E(e),o):a(e).agents.list(),async show(e,n={}){if(!e)throw new t(`invalid-option`,`Missing agent id.`,{hint:`Usage: coder agent show <id>`});if(n.server===void 0){let i=(await r(E(n),o)).find(t=>t.id===e);if(!i)throw new t(`invalid-option`,`No agent named "${e}".`,{hint:`List agents: coder agent list`});return i}let i=a(n),s=await i.agents.get(e),c=await i.agents.version(e,s.currentVersion);return{...s,definition:c.definition}},init:M,push:(e,t={})=>i(a(t),E(t),e),async run(e,n,i={}){if(i.wait&&i.server===void 0)throw new t(`invalid-option`,`--wait needs --server.`,{hint:`Offline runs print their reply as they finish`});if(!e||!n)throw new t(`invalid-option`,`Missing agent id or event file.`,{hint:`Usage: coder agent run <agent> <event.json>`});let l=E(i),u=typeof n==`string`?JSON.parse(await v.readFile(p.resolve(l,n),`utf8`)):n;if(i.server!==void 0){let t=a(i),n=await t.tasks.create({agent:e,event:u});if(!i.wait||!n.tasks.length)return n;let r=[];for(let e of n.tasks){let n=await t.tasks.wait(e,{onLog:i.onLog});r.push(n),i.onDone?.(n)}return r}let d=await r(l,o),m=d.find(t=>t.id===e);if(!m)throw new t(`invalid-option`,`No agent named "${e}".`);let h=f(u,d).find(t=>t.agent.id===e),g=i.flow??h?.flow;if(!g)throw new t(`invalid-option`,`Agent "${e}" does not match event "${u.type}".`);return c({cwd:l,agent:e,flow:g,task:{...s(m,g,u),tools:{},...h?.permissions?{permissions:h.permissions}:{}},post:!1})},runTask(e,t={}){let n=E(t);return m.env.CODER_LOGIN?w(e,n):m.env.CODER_PREPARE?u(e,n):l(e,n)},async usage(e={}){if(e.by&&![`agent`,`installation`,`engine`].includes(e.by))throw new t(`invalid-option`,`Invalid --by value.`,{hint:`Use agent, installation, or engine`});let n=e.by;if(e.server!==void 0)return a(e).usage({since:N(e.since),by:n});let[{localUsage:r},{usageSummary:i}]=await Promise.all([import(`./store-DzqXS2wT.js`).then(e=>e.p),import(`./usage-BhqoCjvE.js`).then(e=>e.a)]);return i(r(E(e)).map(([,e])=>e),N(e.since)??0,n)},integrations:{list:()=>Object.entries(o).map(([e,t])=>({id:e,description:t.description,events:Object.keys(t.events),tools:t.tools.presets.write})),show(e){if(!e)throw new t(`invalid-option`,`Missing integration id.`,{hint:`Usage: coder agent integrations show <id>`});let n=o[e];if(!n)throw new t(`invalid-option`,`Unknown integration "${e}".`,{hint:`List integrations: coder agent integrations list`});return{id:e,events:Object.fromEntries(Object.entries(n.events).map(([e,t])=>[e,t.description])),tools:n.tools.presets}}}};export{P as n,T as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{s as e}from"./cli-BilSDkvE.js";const t=e(`agent`,{tools:async()=>(await import(`./tools-D0Zfs8Hx.js`)).commandTools,list:async()=>(await import(`./list-BYiG8Zav.js`)).commandAgentList,ls:async()=>(await import(`./list-BYiG8Zav.js`)).commandAgentList,show:async()=>(await import(`./show-CMUg8SJu.js`)).commandAgentShow,run:async()=>(await import(`./run-CawRGnOg.js`)).commandAgentRun,init:async()=>(await import(`./init-CoMfFxbG.js`)).commandAgentInit,push:async()=>(await import(`./push-CUC55Bqd.js`)).commandAgentPush,usage:async()=>(await import(`./usage-C4d9X2Uq.js`)).commandAgentUsage,integrations:async()=>(await import(`./integrations-5xCaXSd-.js`)).commandAgentIntegrations},{menu:[{usage:`list`,blurb:`list local or server-owned agents`},{usage:`show <id>`,blurb:`one agent in full: settings, integrations, triggers, tools`},{usage:`init [id]`,blurb:`scaffold an agent folder in .coder/agents`},{usage:`push [id]`,blurb:`upload workspace agents to a Coder server`},{usage:`integrations <list|show>`,blurb:`the integration catalog: coder agent integrations --help`},{usage:`run <agent> <event.json>`,blurb:`run a recorded event through an agent, offline or on a server`},{usage:`usage`,blurb:`aggregate usage by agent, installation, or engine`}],description:[`Define and run agents from the CLI, the dashboard, or on GitHub, Slack and other platforms.`]},{aliases:{ls:`list`},nested:[`integrations`]});export{t as commandAgent};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{i as e}from"./cli-BilSDkvE.js";import{p as t}from"./output-BKeyLbvt.js";import{n}from"./models-_5LVGC3m.js";import{n as r}from"./add-U-pty9qJ.js";import i from"node:process";const a=e({name:`model alias`,help:{usage:`coder model alias <name> <spec> [--workspace]`,summary:`Save an alias for an engine spec, e.g. fast -> codex:luna. An alias may reuse a
|
|
2
|
+
built-in name to override it.`,flags:[[`--workspace`,`target <repo>/.coder/config.json instead of the user file`]]},options:r,args:2,run:({options:e,args:[t,r],cwd:i})=>n(i,t,r,e),print:o});function o(e){let n=t,r=`${e.provider} ${e.model}${e.effort?` (${e.effort})`:``}`;i.stdout.write(`aliased ${n.cyan(e.alias)} -> ${e.provider}:${e.model}${e.effort?`:${e.effort}`:``} ${n.dim(`= ${r}`)} ${n.dim(`(${e.file})`)}\n`)}export{a as commandModelAlias};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{s as e}from"./cli-BilSDkvE.js";const t=e(`server app`,{create:async()=>(await import(`./create-C_iMJV4Y.js`)).commandServerAppCreate},{menu:[{usage:`create <integration>`,blurb:`create the built-in agent's public app`}],description:[`The built-in agent's apps, one per platform, shared by every workspace on this server.`],exampleCommand:`server app create`});export{t as commandServerApp};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{wt as e}from"./dispatch-BKeAch9E.js";import{i as t,r as n}from"./cli-BilSDkvE.js";import{a as r,p as i,s as a}from"./output-BKeyLbvt.js";import{i as o,n as s,s as c,t as l}from"./args-BOEEdpWk.js";import u from"node:process";const d={server:o,workspace:c,yes:s};function f(e,t){let n=i;if(!t.length)return void u.stdout.write(`${n.dim(`No approvals for task ${e}.`)}\n`);for(let e of t){let t=e.answered??`pending`;u.stdout.write(`${n.cyan(e.id)} ${t.padEnd(8)} ${n.dim(String(e.summary??``))}\n`)}let r=t.filter(e=>!e.answered);if(r.length){let e=r.length===1?r[0].id:`<approval-id>`;u.stdout.write(`\n${a([`Answer: coder task approve ${e} [--deny]`],n)}\n`)}}function p(t){let n=i;if(!t.length)return void u.stdout.write(`${n.dim(`No pending approvals.`)}\n\n${a([`Check tasks: coder task list`],n)}\n`);let o={id:Math.max(11,...t.map(e=>e.id.length)),task:Math.max(7,...t.map(e=>e.taskId.length))};u.stdout.write(n.bold(n.light(`${`approval-id`.padEnd(o.id)} ${`task-id`.padEnd(o.task)} age summary\n`)));for(let i of t){let t=i.createdAt?r(e(i.createdAt)):`-`;u.stdout.write(`${n.cyan(i.id.padEnd(o.id))} ${n.cyan(i.taskId.padEnd(o.task))} ${t.padEnd(5)} ${n.light(i.summary)}\n`)}let s=t.length===1?t[0].id:`<approval-id>`;u.stdout.write(`\n${a([`Answer: coder task approve ${s} [--deny]`],n)}\n`)}const m=t({name:`task approvals`,help:{usage:`coder task approvals [task-id] [--server [url]]`,summary:`Without a task id: pending approvals across all tasks. With one: that task's
|
|
2
|
+
permission escalations and how each was answered.`,flags:[n]},options:{...l,...d},args:1,run:async({options:e,args:[t]})=>{let{tasks:n}=await import(`./task-C6VAg5WU.js`).then(e=>e.t);return n.approvals(t,{...e,organization:e.workspace})},json:(e,{options:t,args:[n]})=>t.server===void 0&&n?e.map(({taskId:e,...t})=>t):t.server===void 0?e.map(({taskId:e,id:t,summary:n,createdAt:r})=>({taskId:e,id:t,summary:n,createdAt:r})):e,print(e,{options:t,args:[n]}){if(t.server===void 0)return n?f(n,e):p(e);if(!e.length)return void u.stdout.write(`${i.dim(`No pending approvals.`)}\n\n${a([`Check tasks: coder task list`],i)}\n`);for(let t of e)u.stdout.write(`${t.taskId} ${JSON.stringify(t)}\n`)}});export{m as commandApprovals};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{i as e,r as t}from"./cli-BilSDkvE.js";import{p as n}from"./output-BKeyLbvt.js";import{i as r,n as i,s as a,t as o}from"./args-BOEEdpWk.js";import s from"node:process";const c={server:r,workspace:a,yes:i},l=e({name:`task approve`,help:{usage:`coder task approve [task-id] <approval-id> [--deny] [--server [url]]`,summary:`Answer an escalated permission request. Accepts by default; --deny rejects it.
|
|
2
|
+
Approval ids are unique, so the task id is optional.`,flags:[[`--deny`,`reject the request instead of accepting`],t]},options:{...o,deny:i,...c},args:2,run:async({options:e,args:[t,n]})=>{let{tasks:r}=await import(`./task-C6VAg5WU.js`).then(e=>e.t);return r.approve(t,n,{...e,organization:e.workspace})},print:(e,{options:t,args:r})=>s.stdout.write(t.server===void 0?`${t.deny?`Denied`:`Approved`} ${n.cyan(e.approvalId)} on task ${n.cyan(e.taskId)}.\n`:`${t.deny?`Denied`:`Approved`} ${n.cyan(r[1])}.\n`)});export{l as commandApprove};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{xt as t}from"./dispatch-BKeAch9E.js";import{i as n,t as r}from"./load-BpEsAn51.js";import{n as i}from"./integrations-BAgdVDhj.js";import{o as a}from"./local-H3uvqEbq.js";import{Un as o,Zn as s,t as c}from"./store-DzqXS2wT.js";import{n as l}from"./env-CRf6wkM2.js";import u from"node:process";var d=e({serverAppLink:()=>f});async function f(e,d={}){let f=l(d.env??u.env),p=i(f.integrations);if(!p[e])throw new t(`invalid-option`,`Unknown integration "${e}".`,{hint:`Pick one of ${Object.keys(p).join(`, `)}.`});if(!f.databaseUrl||!f.publicUrl)throw new t(`invalid-option`,`Built-in apps need the server database and address.`,{hint:`Set DATABASE_URL and PUBLIC_URL as the server has them.`});let m={...n()[r].json,...d.name?{name:d.name}:{}},h={agent:r,def:a(m),...d.owner?{owner:d.owner}:{},public:!0},g=await c(f);try{let t=g.defaultOrganizationId,n={config:f,organizationId:t,store:g.store(t)},r=await s(n,`create`,`*`,o(e,h)),i=new URLSearchParams({agent:h.agent,def:h.def,...h.owner?{owner:h.owner}:{},public:`1`,tx:r});return{url:`${f.publicUrl.replace(/\/$/,``)}/create/${e}?${i}`}}finally{await g.close()}}export{f as n,d as t};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{i as e,r as t}from"./cli-BilSDkvE.js";import{p as n}from"./output-BKeyLbvt.js";import{i as r,n as i,s as a,t as o}from"./args-BOEEdpWk.js";import s from"node:process";const c={server:r,workspace:a,yes:i},l=e=>e===1?``:`s`,u=e({name:`task archive`,help:{usage:`coder task archive <task-id> | coder task archive --all-stopped [--server [url]]`,summary:`Archive a task session so it drops out of the default list (see it again with
|
|
2
|
+
\`coder task list --archived [--limit N]\`). Pass --all-stopped to archive every
|
|
3
|
+
finished task. A running task keeps running; steering an archived task
|
|
4
|
+
brings it back.`,flags:[[`--all-stopped`,`archive every stopped (finished) task`],t]},options:{...o,"all-stopped":i,...c},args:1,run:async({options:e,args:[t]})=>{let{tasks:n}=await import(`./task-C6VAg5WU.js`).then(e=>e.t);return n.archive(t,{...e,organization:e.workspace,allStopped:e[`all-stopped`]})},print(e,{options:t}){if(e.count===void 0)return void s.stdout.write(`Archived task ${n.cyan(e.taskId)}.\n`);s.stdout.write(t.server===void 0?e.count?`Archived ${e.count} stopped task${l(e.count)}.\n`:`${n.dim(`No stopped tasks to archive.`)}\n`:`Archived ${e.count} server task${l(e.count)}.\n`)}});export{u as commandArchive,l as plural};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{i as e}from"./cli-BilSDkvE.js";import{p as t}from"./output-BKeyLbvt.js";import{n,t as r}from"./args-BOEEdpWk.js";import i from"node:process";const a=e=>e===1?``:`s`,o=e({name:`flow archive`,help:{usage:`coder flow archive <run-id> | coder flow archive --all-stopped`,summary:`Archive a flow run so it drops out of the default list (see it again with
|
|
2
|
+
\`coder flow list --archived [--limit N]\`). Pass --all-stopped to archive every
|
|
3
|
+
finished run. A running run must be stopped first.`,flags:[[`--all-stopped`,`archive every stopped (finished) run`]]},options:{...r,"all-stopped":n},args:1,run:async({options:e,args:[t]})=>{let{archiveRuns:n}=await import(`./executor-BvAA7Cgw.js`).then(e=>e.y);return n(t,{allStopped:e[`all-stopped`]})},print(e){if(!(`count`in e))return void i.stdout.write(`Archived run ${t.cyan(e.runId)}.\n`);i.stdout.write(e.count?`Archived ${e.count} stopped run${a(e.count)}.\n`:`${t.dim(`No stopped runs to archive.`)}\n`)}});export{o as commandArchive,a as plural};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as e}from"./cli-BilSDkvE.js";import{n as t,s as n}from"./args-BOEEdpWk.js";const r=e({name:`task archive-sweep`,options:{cwd:n,flows:t},args:1/0,run:async({options:e,args:t,cwd:n})=>{let{archiveFlagged:r}=await import(`./actions-Mk3FSlpJ.js`).then(e=>e.t),{archiveFlaggedRuns:i}=await import(`./executor-BvAA7Cgw.js`).then(e=>e.y);return e.flows?i(t):r(n,t)}});export{r as commandArchiveSweep};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{xt as e}from"./dispatch-BKeAch9E.js";import*as t from"zod/mini";const n=t.optional(t.boolean()),r=t.optional(t.string()),i=t.optional(t.array(t.string())),a=t.optional(t.union([t.string(),t.literal(!0)])),o=t._default(a,!0),s={cwd:r,json:n},c=t.optional(t.union([t.literal(`all`),t.coerce.number().check(t.int(),t.positive())],{error:`expected a positive integer or "all"`})),l=t.optional(t.union([t.literal(`all`),t.coerce.number().check(t.int(),t.nonnegative())],{error:`expected a number or "all"`}));function u(e){let t=e.def;for(;t;){if(t.type===`union`)return t.options.some(e=>e.def.type===`literal`);let e=t.innerType??t.in;t=e?e.def:void 0}return!1}function d(e,t){let n=e.def;for(;n;){if(n.type===t)return!0;let e=n.innerType??n.in;n=e?e.def:void 0}return!1}const f=e=>d(e,`boolean`);function p(t,n,r={}){let i=n.shape,a={},o=[],s=!1,c=(e,t,n,r)=>{let o=i[t],s=r?`-`:`--`;if(!o)throw Error(`Unknown option ${s}${e} (use -- to pass literal text starting with -)`);if(f(o))return a[t]=n===void 0||n!==`false`,0;if(u(o)&&(n===void 0||n.startsWith(`-`)))return a[t]=!0,0;if(n===void 0)throw Error(`Missing value for ${s}${e}`);return a[t]=d(o,`array`)?[...a[t]??[],n]:n,1};for(let e=0;e<t.length;e+=1){let n=t[e];if(s){o.push(n);continue}if(n===`--`){s=!0;continue}if(!n.startsWith(`-`)||n===`-`){o.push(n);continue}if(n.startsWith(`--`)){let[r,a]=n.slice(2).split(`=`,2);a===void 0&&i[r]&&!f(i[r])?e+=c(r,r,t[e+1],!1):c(r,r,a,!1);continue}let r=n.slice(1);i[r]&&!f(i[r])?e+=c(r,r,t[e+1],!0):c(r,r,void 0,!0)}let l=n.safeParse(a);if(!l.success){let e=l.error.issues[0],t=String(e.path[0]??``),n=a[t];throw Error(n===void 0?`Missing required --${t}.`:`Invalid --${t} value ${JSON.stringify(n)}: ${e.message}`)}let p=r.positionals??0;if(o.length>p){let t=o.slice(p);throw new e(`invalid-option`,`Unexpected argument${t.length>1?`s`:``}: ${t.join(` `)}`,r.command?{hint:`Help: coder ${r.command} --help`}:{})}return{options:l.data,positionals:o}}export{p as a,i as c,a as i,l,n,o,c as r,r as s,s as t};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{i as e,r as t}from"./cli-BilSDkvE.js";import{p as n}from"./output-BKeyLbvt.js";import{i as r,n as i,s as a,t as o}from"./args-BOEEdpWk.js";import{idAndText as s}from"./steer-C6uARLp5.js";import c from"node:process";const l={server:r,workspace:a,yes:i},u=e({name:`task ask`,help:{usage:`coder task ask <task-id> "<question>" [--server [url]]`,summary:`Answer a question ABOUT a task without touching it: a read-only sidecar reads
|
|
2
|
+
the task's progress log, result, and workspace and answers; the task never
|
|
3
|
+
sees the question and its thread is not steered. Works whether the task is
|
|
4
|
+
running or stopped. To change what the task does, use \`coder task steer\`.`,flags:[[`--model <alias|slug>`,`sidecar model (default: the task's own)`],[`--effort <low|medium|high>`,`sidecar reasoning effort`],t],examples:[[`coder task ask task-abc "what approach did you take and why?"`,`probe a decision without derailing the task`]]},options:{...o,model:a,effort:a,...l},args:1/0,async run({options:e,args:t}){let{tasks:r}=await import(`./task-C6VAg5WU.js`).then(e=>e.t),{id:i,text:a}=s(t,`Missing task id or question.`,[`Usage: coder task ask <task-id> "<question>"`,`Help: coder task ask --help`]);return r.ask(i,a,{...e,organization:e.workspace,onAsking:t=>e.json||c.stderr.write(`${n.dim(`[coder]`)} asking about task ${n.cyan(t)} (read-only sidecar; the task is not interrupted)...\n`)})},json:({ok:e,...t})=>t,print(e,{options:t,args:[r]}){if(t.server!==void 0)return void c.stdout.write(`Asked server task ${n.cyan(r)}.\n`);let{answer:i,error:a}=e;i?c.stdout.write(`\n${i}\n`):c.stdout.write(`${n.dim(`(no answer)`)}${a?` ${n.red(a)}`:``}\n`)},exit:(e,{options:t})=>t.server===void 0?+!e.ok:void 0});export{u as commandAsk};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as e,l as t}from"./http-Bkg_OQ6r.js";import{Ft as n,dn as r,un as i}from"./store-DzqXS2wT.js";import{c as a}from"./schema-CU2iFkp8.js";import{a as o,i as s,o as c}from"./serve-CQKZxzFE.js";import{createECDH as l,hkdfSync as u}from"node:crypto";import*as d from"openid-client";import{and as f,eq as p}from"drizzle-orm";import{EncryptJWT as m,calculateJwkThumbprint as h,createRemoteJWKSet as g,jwtDecrypt as _,jwtVerify as v}from"jose";const y=(e,t)=>new Uint8Array(u(`sha256`,e,``,t,32));async function b(e){let t=y(e,`coder oidc client key`),n=l(`prime256v1`);n.setPrivateKey(t);let r=n.getPublicKey(),i={kty:`EC`,crv:`P-256`,x:Buffer.from(r.subarray(1,33)).toString(`base64url`),y:Buffer.from(r.subarray(33)).toString(`base64url`)},a=await crypto.subtle.importKey(`jwk`,{...i,d:Buffer.from(t).toString(`base64url`)},{name:`ECDSA`,namedCurve:`P-256`},!1,[`sign`]),o=await h(i);return{key:a,kid:o,jwk:{...i,kid:o,alg:`ES256`,use:`sig`}}}async function x(e){let t=[e.encryptionKey,e.previousEncryptionKey].filter(e=>!!e),n=await Promise.all(t.map(b));return{cookie:t.map(e=>y(e,`coder session cookie`)),client:n[0],jwks:{keys:n.map(e=>e.jwk)}}}const S=`${i}.session`,C=`${i}.oidc`,w=3800,T=2592e3,E=()=>Math.floor(Date.now()/1e3);function D(e){let t=new Map;for(let n of(e.get(`cookie`)??``).split(/;\s*/)){let e=n.indexOf(`=`);e>0&&t.set(n.slice(0,e),n.slice(e+1))}return t}function O(e){let t=[];for(;e.has(`${S}.${t.length}`);)t.push(`${S}.${t.length}`);return t}function k(e){let t=D(e);return t.get(S)??(O(t).map(e=>t.get(e)).join(``)||void 0)}function A(e){return Array.isArray(e)?e.flatMap(e=>typeof e?.id==`string`&&typeof e.role==`string`?[{id:e.id,slug:String(e.slug??e.id),name:String(e.name??e.slug??e.id),role:e.role}]:[]):[]}function j(e,t,n){let r=e.get(`x-coder-organization`),i=r?t.organizations.find(e=>e.slug===r||e.id===r):t.organizations.find(e=>e.id===n)??t.organizations[0];return i?{...t,organizationId:i.id,role:i.role}:r?{...t,organizationDenied:!0}:t}async function M(i,l){let u=l.auth.wular.url,h=l.publicUrl,y=new URL(h).origin,b=h.startsWith(`https:`),M=await x(l),N=`${h}${s}`,P=(e,t,n)=>`${e}=${t}; Path=/; HttpOnly; SameSite=Lax; Max-Age=${n}${b?`; Secure`:``}`,F=(e,t)=>new m(e).setProtectedHeader({alg:`dir`,enc:`A256GCM`}).setIssuedAt().setExpirationTime(`${t}s`).encrypt(M.cookie[0]);async function I(e){if(e)for(let t of M.cookie)try{return(await _(e,t)).payload}catch{}}async function L(e,t){let n=await F(t,T),r=O(D(e));if(n.length<=w)return[P(S,n,T),...r.map(e=>P(e,``,0))];let i=n.match(RegExp(`.{1,${w}}`,`g`));return[P(S,``,0),...i.map((e,t)=>P(`${S}.${t}`,e,T)),...r.slice(i.length).map(e=>P(e,``,0))]}let R=e=>[S,...O(D(e))].map(e=>P(e,``,0)),z,B=()=>z??=d.discovery(new URL(u),`${h}${c}`,void 0,d.PrivateKeyJwt(M.client),new URL(u).protocol===`http:`?{execute:[d.allowInsecureRequests]}:void 0).catch(e=>{throw z=void 0,e}),V,H=async()=>V??=g(new URL((await B()).serverMetadata().jwks_uri));function U(e,t){let n=e.claims();if(!n)throw Error(`Wular Auth returned no ID token`);let r=A(n.organizations);return{sub:n.sub,name:typeof n.name==`string`?n.name:``,email:typeof n.email==`string`?n.email:``,orgs:r,org:r.some(e=>e.id===t?.org)?t.org:r[0]?.id,exp_at:E()+(e.expires_in??600),at:E(),rt:e.refresh_token??t?.rt,idt:e.id_token??t?.idt}}let W=new Map;function G(e){let t=e.rt;if(!t)return Promise.resolve(void 0);let n=W.get(t);return n||(n=B().then(e=>d.refreshTokenGrant(e,t)).then(t=>U(t,e)).catch(()=>{W.delete(t)}),W.set(t,n),setTimeout(()=>W.delete(t),6e4).unref?.()),n}async function K(e,t,n){let r=(await H().then(t=>v(e,t,{issuer:u,audience:y,typ:`at+jwt`})).catch(()=>void 0))?.payload;if(!r?.sub)return;let i={user:{id:r.sub,name:``,email:``},organizations:A(r.organizations)};return n&&E()-(r.iat??0)>60?{...i,stale:!0}:j(t,i)}async function q(e){let t=await B().catch(()=>void 0);if(!t)return Response.redirect(`${h}/login?error=unavailable`,302);let n={verifier:d.randomPKCECodeVerifier(),state:d.randomState(),nonce:d.randomNonce(),return:r(e.searchParams.get(`return`),y)},i=d.buildAuthorizationUrl(t,{redirect_uri:N,scope:o,code_challenge:await d.calculatePKCECodeChallenge(n.verifier),code_challenge_method:`S256`,state:n.state,nonce:n.nonce});return new Response(null,{status:302,headers:{location:i.href,"set-cookie":P(C,await F(n,600),600)}})}async function J(e,t){let n=e=>{let t=new Headers({location:`/login?error=${encodeURIComponent(e)}`});return t.append(`set-cookie`,P(C,``,0)),new Response(null,{status:302,headers:t})},r=await I(D(e.headers).get(C));if(!r)return n(`expired`);let i=t.searchParams.get(`error`);if(i)return n(i);let a;try{a=U(await d.authorizationCodeGrant(await B(),new URL(`${N}${t.search}`),{pkceCodeVerifier:r.verifier,expectedState:r.state,expectedNonce:r.nonce,idTokenExpected:!0}))}catch{return n(`sign_in_failed`)}let o=new Headers({location:r.return});o.append(`set-cookie`,P(C,``,0));for(let t of await L(e.headers,a))o.append(`set-cookie`,t);return new Response(null,{status:302,headers:o})}async function Y(t){if(!n(t,h))return e();let r=await I(k(t.headers)),i=await B().catch(()=>void 0),a=`${h}/?signed_out=1`,o=i?.serverMetadata().end_session_endpoint&&r?.idt?d.buildEndSessionUrl(i,{id_token_hint:r.idt,post_logout_redirect_uri:a}).href:a,s=Response.json({url:o});for(let e of R(t.headers))s.headers.append(`set-cookie`,e);return s}return{issuer:u,jwks:M.jwks,handler(e){let n=new URL(e.url);return n.pathname===`/api/auth/sign-in`&&e.method===`GET`?q(n):n.pathname===`/api/auth/callback`&&e.method===`GET`?J(e,n):n.pathname===`/api/auth/sign-out`&&e.method===`POST`?Y(e):Promise.resolve(t())},async session(e,t=!1){let n=e.get(`authorization`);if(n?.startsWith(`Bearer `))return K(n.slice(7),e,t);let r=await I(k(e));if(!r)return;let i;if(r.exp_at<=E()||t&&E()-r.at>60){if(r=await G(r),!r)return;i=await L(e,r)}return j(e,{user:{id:r.sub,name:r.name,email:r.email},organizations:r.orgs,...i?{cookies:i}:{}},r.org)},async setOrganization(e,t){let n=await I(k(e)),r=n?.orgs.find(e=>e.slug===t);if(!(!n||!r))return{...r,cookies:await L(e,{...n,org:r.id})}},async link(e,t,n,r={}){let o={name:e.name,email:e.email,...r.organizations?{organizations:r.organizations}:{},...r.token?{token:r.token}:{}};await i.insert(a).values({platform:t,platformUserId:n,userId:e.id,...o}).onConflictDoUpdate({target:[a.platform,a.platformUserId],set:o,setWhere:p(a.userId,e.id)});let[s]=await i.select({userId:a.userId}).from(a).where(f(p(a.platform,t),p(a.platformUserId,n)));return s?.userId===e.id?`linked`:`taken`},async linkedUser(e,t){let[n]=await i.select({id:a.userId,name:a.name,email:a.email,organizations:a.organizations,token:a.token}).from(a).where(f(p(a.platform,e),p(a.platformUserId,t)));return n&&{id:n.id,name:n.name,email:n.email,...n.organizations?{organizations:n.organizations}:{},...n.token?{token:n.token}:{}}}}}export{M as createAuth};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{s as e}from"./cli-BilSDkvE.js";const t=e(`auth`,{login:async()=>(await import(`./login-BFxX4jJy.js`)).commandLogin,logout:async()=>(await import(`./logout-BHAtw4Z8.js`)).commandLogout,status:async()=>(await import(`./status-D26U--p8.js`)).commandStatus},{menu:[{usage:`login`,blurb:`sign in through the browser`},{usage:`logout`,blurb:`sign out and forget the saved session`},{usage:`status`,blurb:`show where you are signed in`}],description:[`Sign in to Coder and manage saved server sessions.`],exampleCommand:`auth login`});export{t as commandAuth};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Coder",
|
|
3
|
+
"description": "Answers engineering questions, reviews pull requests, and makes requested changes.",
|
|
4
|
+
"permissions": "workspace-write",
|
|
5
|
+
"integrations": {
|
|
6
|
+
"github": {
|
|
7
|
+
"triggers": {
|
|
8
|
+
"pull_request": {
|
|
9
|
+
"flow": "review",
|
|
10
|
+
"permissions": "read-only"
|
|
11
|
+
},
|
|
12
|
+
"mention": true
|
|
13
|
+
},
|
|
14
|
+
"tools": "write"
|
|
15
|
+
},
|
|
16
|
+
"slack": {
|
|
17
|
+
"triggers": {
|
|
18
|
+
"mention": true,
|
|
19
|
+
"message": true
|
|
20
|
+
},
|
|
21
|
+
"tools": "comment"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Introduction
|
|
2
|
+
|
|
3
|
+
You are a Coder Agent. You are a general purpose agent helping users with any queries they may have using tools you are provided with.
|
|
4
|
+
|
|
5
|
+
# Instructions
|
|
6
|
+
|
|
7
|
+
Be super concise and crisp. Be friendly and helful, but not flattering and never say more words than you need to. Think like a friendly super intelligent and witty Engineer.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
Always make sure you have the ability to perform a specific task rather than blindly accepting and halucinating. That goes for answering any domanin knowledge as well, always verify what you are saying instead of just going with intuition. Ask for confirmation on any task if ambiguius and implement only after you are sure of the requirements.
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# Platform notes
|
|
14
|
+
|
|
15
|
+
On a pull request or when asked for a review, run the `review` flow from your shell (`coder flow run review --wait --json --args '{"pr": <number>, "post": true}'`) and point at its result.
|
|
16
|
+
|
|
17
|
+
Generally read the event and its context, then answer the question or make the requested change. If the task is gonna take longer, inform the user about your intent very early and concisely, and then perform the task and link the pull request or any resource you create or reference. Don't spam the user though, one or two messages should be enough for most requests.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import t from"node:path";import n from"node:fs";import{randomUUID as r}from"node:crypto";var i=e({LocalChatState:()=>a,appChatState:()=>l}),a=class{file;now;memory=new Map;constructor(e,t=Date.now){this.file=e,this.now=t}change(e){let r=this.now(),i=this.load(r),a=e(i,r);if(this.file){n.mkdirSync(t.dirname(this.file),{recursive:!0});let e=`${this.file}.${process.pid}.tmp`;n.writeFileSync(e,JSON.stringify(Object.fromEntries(i)),{mode:384}),n.renameSync(e,this.file)}return a}load(e){let t=this.memory;if(this.file)try{t=new Map(Object.entries(JSON.parse(n.readFileSync(this.file,`utf8`))))}catch(e){if(e.code!==`ENOENT`)throw e;t=new Map}for(let[n,r]of t)r.expiresAt!==void 0&&r.expiresAt<=e&&t.delete(n);return t}read(e){return this.load(this.now()).get(e)?.value}async connect(){}async disconnect(){}async get(e){return this.read(`k:${e}`)??null}async set(e,t,n){this.change((r,i)=>r.set(`k:${e}`,o(t,i,n)))}async setIfNotExists(e,t,n){return this.change((r,i)=>!r.has(`k:${e}`)&&(r.set(`k:${e}`,o(t,i,n)),!0))}async delete(e){this.change(t=>t.delete(`k:${e}`))}async appendToList(e,t,n={}){this.change((r,i)=>{let a=[...s(r.get(`k:${e}`)?.value),t],c=n.maxLength?a.slice(-n.maxLength):a;r.set(`k:${e}`,o(c,i,n.ttlMs))})}async getList(e){return s(this.read(`k:${e}`))}async acquireLock(e,t){return this.change((n,i)=>{if(n.has(`l:${e}`))return null;let a={threadId:e,token:r(),expiresAt:i+t};return n.set(`l:${e}`,{value:a.token,expiresAt:a.expiresAt}),a})}async extendLock(e,t){return this.change((n,r)=>n.get(`l:${e.threadId}`)?.value===e.token&&(n.set(`l:${e.threadId}`,{value:e.token,expiresAt:r+t}),!0))}async releaseLock(e){this.change(t=>{t.get(`l:${e.threadId}`)?.value===e.token&&t.delete(`l:${e.threadId}`)})}async forceReleaseLock(e){this.change(t=>t.delete(`l:${e}`))}async enqueue(e,t,n){return this.change((r,i)=>{let a=[...c(r.get(`q:${e}`)?.value,i),t].slice(-n);return r.set(`q:${e}`,{value:a,expiresAt:Math.max(...a.map(e=>e.expiresAt))}),a.length})}async dequeue(e){return this.change((t,n)=>{let r=t.get(`q:${e}`),[i,...a]=c(r?.value,n);return a.length?t.set(`q:${e}`,{...r,value:a}):t.delete(`q:${e}`),i??null})}async queueDepth(e){return c(this.read(`q:${e}`),this.now()).length}async subscribe(e){this.change(t=>t.set(`s:${e}`,{value:!0}))}async unsubscribe(e){this.change(t=>t.delete(`s:${e}`))}async isSubscribed(e){return this.read(`s:${e}`)===!0}};const o=(e,t,n)=>n?{value:e,expiresAt:t+n}:{value:e},s=e=>Array.isArray(e)?e:[],c=(e,t)=>s(e).filter(e=>e.expiresAt>t);function l(e,t){let n=`${encodeURIComponent(t)}/`,r=e=>n+e,i=e=>({...e,threadId:r(e.threadId)}),a=e=>e&&{...e,threadId:e.threadId.slice(n.length)};return{connect:()=>e.connect(),disconnect:()=>e.disconnect(),get:t=>e.get(r(t)),set:(t,n,i)=>e.set(r(t),n,i),setIfNotExists:(t,n,i)=>e.setIfNotExists(r(t),n,i),delete:t=>e.delete(r(t)),appendToList:(t,n,i)=>e.appendToList(r(t),n,i),getList:t=>e.getList(r(t)),acquireLock:async(t,n)=>a(await e.acquireLock(r(t),n)),extendLock:(t,n)=>e.extendLock(i(t),n),releaseLock:t=>e.releaseLock(i(t)),forceReleaseLock:t=>e.forceReleaseLock(r(t)),enqueue:(t,n,i)=>e.enqueue(r(t),n,i),dequeue:t=>e.dequeue(r(t)),queueDepth:t=>e.queueDepth(r(t)),subscribe:t=>e.subscribe(r(t)),unsubscribe:t=>e.unsubscribe(r(t)),isSubscribed:t=>e.isSubscribed(r(t))}}export{l as n,i as r,a as t};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import{i as e,r as t}from"./schema-CU2iFkp8.js";import{i as n}from"./client-D9IoAuDD.js";import{randomUUID as r}from"node:crypto";import{and as i,eq as a,gt as o,isNull as s,lte as c,or as l,sql as u}from"drizzle-orm";var d=class{db;now;constructor(e,t=Date.now){this.db=e,this.now=t}at(e){return e?new Date(this.now()+e):null}stamp(e){return e===void 0?null:new Date(this.now()+e).toISOString()}async rows(e){let t=await this.db.execute(e);return Array.isArray(t)?t:t.rows}live(){return l(s(e.expiresAt),o(e.expiresAt,new Date(this.now())))}expired(){return c(e.expiresAt,new Date(this.now()))}async read(t){let[r]=await n(this.db,()=>this.db.select({value:u`${e.value}`}).from(e).where(i(a(e.key,t),this.live())));return r?.value}async claim(t,n,r){return(await this.db.insert(e).values({key:t,value:n,expiresAt:r}).onConflictDoUpdate({target:e.key,set:{value:n,expiresAt:r},setWhere:this.expired()}).returning({key:e.key})).length>0}async connect(){}async disconnect(){}async get(e){return await this.read(`k:${e}`)??null}async set(t,n,r){let i={value:n,expiresAt:this.at(r)};await this.db.insert(e).values({key:`k:${t}`,...i}).onConflictDoUpdate({target:e.key,set:i})}setIfNotExists(e,t,n){return this.claim(`k:${e}`,t,this.at(n))}async delete(n){await this.db.execute(u`with items as (delete from ${t} where key = ${`k:${n}`}) delete from ${e} where key = ${`k:${n}`}`)}async appendToList(e,n,r={}){let i=`k:${e}`,a=r.maxLength?u`or seq <= coalesce((select seq from ${t} where key = ${i} order by seq desc offset ${r.maxLength-1} limit 1), -1)`:u``;await this.db.execute(u`
|
|
2
|
+
with added as (insert into ${t} (key, value, expires_at) values (${i}, ${JSON.stringify(n)}::jsonb, ${this.stamp(r.ttlMs)}::timestamptz))
|
|
3
|
+
delete from ${t} where key = ${i} and ((select expires_at from ${t} where key = ${i} order by seq desc limit 1) <= ${this.stamp(0)}::timestamptz ${a})`)}async getList(e){let r=`k:${e}`;return(await n(this.db,()=>this.rows(u`
|
|
4
|
+
with newest as (select expires_at from ${t} where key = ${r} order by seq desc limit 1)
|
|
5
|
+
select value from ${t}, newest where key = ${r} and (newest.expires_at is null or newest.expires_at > ${this.stamp(0)}::timestamptz) order by seq`))).map(e=>e.value)}async acquireLock(e,t){let n={threadId:e,token:r(),expiresAt:this.now()+t};return await this.claim(`l:${e}`,n.token,new Date(n.expiresAt))?n:null}async extendLock(t,n){return(await this.db.update(e).set({expiresAt:this.at(n)}).where(i(a(e.key,`l:${t.threadId}`),a(e.value,t.token),this.live())).returning({key:e.key})).length>0}async releaseLock(t){await this.db.delete(e).where(i(a(e.key,`l:${t.threadId}`),a(e.value,t.token)))}async forceReleaseLock(t){await this.db.delete(e).where(a(e.key,`l:${t}`))}async enqueue(e,n,r){let i=`q:${e}`,a=this.stamp(0),[o]=await this.rows(u`
|
|
6
|
+
with added as (insert into ${t} (key, value, expires_at) values (${i}, ${JSON.stringify(n)}::jsonb, ${new Date(n.expiresAt).toISOString()}::timestamptz)),
|
|
7
|
+
dropped as (delete from ${t} where key = ${i} and (expires_at <= ${a}::timestamptz
|
|
8
|
+
or seq <= coalesce((select seq from ${t} where key = ${i} and expires_at > ${a}::timestamptz order by seq desc offset ${r-1} limit 1), -1)))
|
|
9
|
+
select least((select count(*) from ${t} where key = ${i} and expires_at > ${a}::timestamptz) + 1, ${r})::int as depth`);return Number(o?.depth??0)}async dequeue(e){let n=`q:${e}`,r=this.stamp(0);return(await this.rows(u`
|
|
10
|
+
delete from ${t} where key = ${n} and (expires_at <= ${r}::timestamptz
|
|
11
|
+
or seq = (select seq from ${t} where key = ${n} and expires_at > ${r}::timestamptz order by seq limit 1 for update skip locked))
|
|
12
|
+
returning value, expires_at > ${r}::timestamptz as live`)).find(e=>e.live)?.value??null}async queueDepth(e){let[r]=await n(this.db,()=>this.rows(u`
|
|
13
|
+
select count(*)::int as depth from ${t} where key = ${`q:${e}`} and expires_at > ${this.stamp(0)}::timestamptz`));return Number(r?.depth??0)}async subscribe(t){let n={value:!0,expiresAt:null};await this.db.insert(e).values({key:`s:${t}`,...n}).onConflictDoUpdate({target:e.key,set:n})}async unsubscribe(t){await this.db.delete(e).where(a(e.key,`s:${t}`))}async isSubscribed(e){return await this.read(`s:${e}`)===!0}};export{d as PgChatState};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Q as e}from"./dispatch-BKeAch9E.js";import t from"node:process";import n from"node:crypto";import r from"node:http";function i(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 a(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:i(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 o=class{send;model;responseId=`resp_bridge_${n.randomUUID()}`;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 s(s,c=`chat`){let l=c===`responses`,u=e(s.baseUrl,l?`responses`:`chat/completions`),d=null,f=!0,p=s.envKey?t.env[s.envKey]:void 0;async function m(e){let t=d?[d]:u,n=null;for(let r of t)if(n=await fetch(r,{method:`POST`,headers:{"content-type":`application/json`,...p?{authorization:`Bearer ${p}`}:{}},body:e}),n.status!==404)return d=r,n;return n}async function h(e){let t=e.text?.format,n=l?e:a(e),r=()=>{let r=`Reply with only a single JSON object matching this JSON Schema:\n${JSON.stringify(t.schema)}\nUse no prose or markdown fences.`;if(l){let{format:t,...n}=e.text;return{...e,text:n,input:[...e.input??[],{type:`message`,role:`user`,content:[{type:`input_text`,text:r}]}]}}let{response_format:a,...o}=n;return{...o,messages:[...i(e),{role:`user`,content:r}]}};if(t?.type!==`json_schema`)return m(JSON.stringify(n));if(!f)return m(JSON.stringify(r()));let o=await m(JSON.stringify(n));if(![400,422,501].includes(o.status))return o;let s=await o.clone().text();return/(invalid.{0,30}schema|schema.{0,30}invalid|unsupported.{0,30}(keyword|constraint)|(keyword|constraint).{0,30}unsupported)/i.test(s)||!/(response_format|json_schema|text[.\s]format)/i.test(s)||!/(not supported|unsupported|unknown parameter|unrecognized|not available)/i.test(s)?o:(f=!1,await o.body?.cancel(),m(JSON.stringify(r())))}let g=n.randomBytes(16).toString(`hex`),_=r.createServer((e,t)=>{if(e.method!==`POST`||!e.url?.startsWith(`/${g}/`)||!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 n=``;e.on(`data`,e=>n+=e),e.on(`end`,async()=>{let e;try{e=JSON.parse(n)}catch{t.writeHead(400,{"content-type":`application/json`}),t.end(JSON.stringify({error:{message:`invalid JSON`}}));return}try{if(l){let n=await h(e);if(t.writeHead(n.status,{"content-type":n.headers.get(`content-type`)??`application/json`,"cache-control":`no-store`}),n.body)for await(let e of n.body)t.write(e);t.end();return}let n=await h(e);if(!n.ok||!n.body){let e=await n.text().catch(()=>``);t.writeHead(n.status,{"content-type":`application/json`}),t.end(e||JSON.stringify({error:{message:`upstream HTTP ${n.status}`}}));return}t.writeHead(200,{"content-type":`text/event-stream`,"cache-control":`no-store`});let r=new o(e.model,e=>t.write(`data: ${JSON.stringify(e)}\n\n`)),i=new TextDecoder;for await(let e of n.body)r.push(i.decode(e,{stream:!0}));r.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=>_.listen(0,`127.0.0.1`,e));let v=_.address();return{url:`http://127.0.0.1:${typeof v==`object`&&v?v.port:0}/${g}/v1`,close:()=>new Promise(e=>{_.close(()=>e()),_.closeAllConnections?.()})}}export{s as t};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{E as e,bn as t,nt as n,vn as r,xt as i}from"./dispatch-BKeAch9E.js";import{a,c as o,l as s,p as c,r as l,t as u}from"./prompt-CEuBMNhk.js";import{h as d,i as f,p,r as m,s as h}from"./output-BKeyLbvt.js";import{a as g}from"./args-BOEEdpWk.js";import _ from"node:path";import v from"node:process";import{pathToFileURL as y}from"node:url";import*as b from"zod/mini";const x=async()=>(await import(`./task-CgOKgkEG.js`)).commandTaskGroup,S=async()=>(await import(`./setup-host-GFTUzzZJ.js`)).commandSetupHost,C=async()=>(await import(`./server-Kb22cWfF.js`)).commandServer,w=async()=>(await import(`./upgrade-hA0yWBvx.js`)).commandUpgrade,T={task:x,flow:async()=>(await import(`./flow-17k25MHt.js`)).commandFlow,run:async()=>(await import(`./run-BDYl0CKl.js`)).commandTask,list:async()=>(await import(`./list-BAKvxSbh.js`)).commandTasks,result:async()=>(await import(`./result-BzaM3inj.js`)).commandResult,config:async()=>(await import(`./config-Da_cwoxI.js`)).commandConfig,"setup-host":S,"host-setup":S,setup:S,model:async()=>(await import(`./model-Bs1StDo3.js`)).commandModel,mcp:async()=>(await import(`./mcp-CCZOAo06.js`)).commandMcpConfig,docs:async()=>(await import(`./docs-DKJnqZqt.js`)).commandDocs,review:async()=>(await import(`./review-oIBeECZE.js`)).commandReview,agent:async()=>(await import(`./agent-JdtZozvP.js`)).commandAgent,server:C,dash:async()=>{let e=await C(),t=await e.subcommands.serve();return Object.assign(t=>e([`serve`,...t]),{commandName:t.commandName,help:t.help})},runner:async()=>(await import(`./runner-D7ScbIHJ.js`)).commandRunner,auth:async()=>(await import(`./auth-DWHIzqbA.js`)).commandAuth,credentials:async()=>(await import(`./credentials-B1jv6dkg.js`)).commandCredentials,upgrade:w,update:w},E={title:`Coder`,usageLine:`coder <command>`,description:`Delegate a coding task to the best available engine and steer it while it runs.`,commands:[{usage:`dash`,blurb:`your tasks, agents and settings in the browser`},{usage:`run "<text>"`,blurb:`run a task (background; --wait blocks)`},{usage:`list`,blurb:`list recent tasks (by default running + just stopped)`},{usage:`result [task-id]`,blurb:`status + final answer (--wait blocks)`},{usage:`task <cmd>`,blurb:`run, list, result, watch, steer, stop, approve, ...`},{usage:`flow <cmd>`,blurb:`run, list, watch, result, resume, stop, discover, ...`},{usage:`agent <cmd>`,blurb:`list, show, init, push, run, usage, integrations`},{usage:`credentials <cmd>`,blurb:`engine credentials: list, add, login, remove, default`},{usage:`server <cmd>`,blurb:`self-host Coder: serve, migrate, rotate-key`},{usage:`runner <cmd>`,blurb:`run your server's tasks on this machine: serve, list, ...`},{usage:`auth <cmd>`,blurb:`sign in to Coder: login, logout, status`},{usage:`review [--base <ref> | --pr <n>]`,blurb:`review changed code with a built-in flow`},{usage:`config <list|get|set|unset> [<key> [value]]`,blurb:`read or write config`},{usage:`model <list|add|alias|disable>`,blurb:`manage models: built-ins, aliases, custom endpoints`},{usage:`mcp <add|add-json|list|rm>`,blurb:`MCP servers tasks can attach by name (--mcp <name>)`},{usage:`docs [topic]`,blurb:`print bundled documentation (for agents to read)`},{usage:`upgrade [--cli-only|--plugins-only]`,blurb:`update the CLI and host plugins (alias: update)`}],start:[{usage:`coder setup-host [claude|agents]`,blurb:`"claude" for Claude Code, "agents" for any ~/.agents host (Codex, Pi, ...)`},{usage:`coder run --engine [codex|claude] "<task>"`,blurb:`run a task on that engine's default model`},{usage:`coder task result <task-id> --wait`,blurb:`wait for the answer; returns early if the task needs your approval`}],agents:[{usage:`coder docs skill [--claude]`,blurb:`load the skill once`}],usage:[{usage:`coder <command> --help`,blurb:`flags and details for any command`}]};function D(e,t,n=t.cyan){let r=Math.max(0,...e.map(e=>e.usage.length))+2;return e.map(e=>` ${n(e.usage.padEnd(r))}${t.dim(e.blurb)}${e.note?` ${t.light(e.note)}`:``}`)}function O(e,t,n){return[``,n.bold(`${e}:`),...t]}function k(e,t,n={}){let r=p;return`${[r.bold(`Usage:`),` ${n.usage??`coder ${e} <subcommand>`}`,...n.description?.length?[``,...n.description]:[],...O(`Subcommands`,D(t,r),r),...n.examples?.length?O(`Examples`,n.examples.flatMap(([e,t])=>[` ${r.cyan(e)}`,` ${r.dim(t)}`]),r):[],...n.seeAlso?O(`Related`,n.seeAlso.split(` · `).map(e=>` ${r.cyan(`coder ${e}`)}`),r):[],``,h([`Details on a subcommand: coder ${e} <subcommand> --help`],r,r.cyan)].join(`
|
|
2
|
+
`)}\n`}function A(e,t){if(!t)return null;let n=p,r=([e,t])=>({usage:e,blurb:t}),i=[n.bold(`Usage:`),` ${t.usage}`];t.summary&&i.push(``,t.summary),t.flags?.length&&i.push(...O(`Flags`,D(t.flags.map(r),n),n)),t.globalFlags?.length&&i.push(...O(`Global flags`,D(t.globalFlags.map(r),n),n)),t.exitCodes?.length&&i.push(...O(`Exit codes`,D(t.exitCodes.map(r),n),n)),t.env?.length&&i.push(...O(`Environment`,D(t.env.map(r),n),n)),t.examples?.length&&i.push(...O(`Examples`,t.examples.flatMap(([e,t])=>[` ${n.cyan(e)}`,` ${n.dim(t)}`]),n));let a=e.includes(` `)?[`${e.slice(0,e.lastIndexOf(` `))} --help`]:t.seeAlso?.split(` · `)??[];return a.length&&i.push(...O(`Related`,a.map(e=>` ${n.cyan(`coder ${e}`)}`),n)),`${i.join(`
|
|
3
|
+
`)}\n`}function j(e,t){let n=p,{start:r,agents:i,usage:a,commands:o,globals:s}=e,c=D([...r,...i,...a,...o,...s],n),l=(e,t)=>c.slice(e,e+t);return`${[`${n.bold(e.title)} ${n.dim(`v${t}`)}`,e.description,...O(`Get started`,l(0,r.length),n),...O(`Agents`,l(r.length,i.length),n),...O(`Usage`,[` ${e.usageLine}`,...l(r.length+i.length,a.length)],n),...O(`Commands`,l(r.length+i.length+a.length,o.length),n),...O(`Global`,c.slice(-s.length),n)].join(`
|
|
4
|
+
`)}\n`}function M(e){let t=e.indexOf(`--`),n=t===-1?e:e.slice(0,t);return n.includes(`-h`)||n.includes(`--help`)}const N=`Use luna or sonnet for mechanical work; sol or opus is the default.
|
|
5
|
+
Use astra or fable for the hardest work; they cost the most.`,P={json:[`--json`,`JSON output`],cwd:[`--cwd <dir>`,`workspace directory (default: current)`]},F=[`--server [url] [--workspace <slug>]`,`act on your Coder server; --workspace overrides the saved workspace for this command`],I=[`--server [url]`,`act on your Coder server, in the saved workspace`],L=e=>e===`https://coder.wular.ai`?`Sign in: coder auth login`:`Sign in: coder auth login --server ${e}`;async function R(e,t=!1){let n=c(e);if(o(n))return n;if(!t){if(!l())throw new i(`invalid-option`,`First use of Coder server ${new URL(n).origin} needs confirmation.`,{hint:`Inspect the origin, then repeat with --yes.`});if((await a({title:`Connect to ${new URL(n).origin}?`,hint:`This server can receive task and agent data.`,options:[{value:`yes`,label:`Continue`},{value:`no`,label:`Cancel`}]}))[0]!==`yes`)throw new i(`invalid-option`,`Server connection cancelled.`)}return s(n),n}function z(e){return e.cwd?_.resolve(String(e.cwd)):v.cwd()}function B(e){v.stderr.write(`[coder] No engine could start. Follow fallback.instructions with a native subagent.
|
|
6
|
+
`),d(e)}function V(e,t=!1){let n=`read-only unavailable on this host: the OS sandbox failed to start (Linux/WSL2 needs bubblewrap + socat). Re-dispatch with --permissions auto (or workspace-write) if writes are acceptable, or install the sandbox deps.`;t?d({error:n,code:`read-only-unavailable`,detail:e}):v.stderr.write(`[coder] ${n}\n`),v.exit(1)}function H(e,t,r,i=!1){if(i)d({taskId:t,status:`awaiting-approval`,approval:r});else{let i=n(e).approvals.escalationTimeoutMs/1e3,a=[`Approve: coder task approve ${t} ${r.id}`,`Deny: coder task approve ${t} ${r.id} --deny`,`Then wait again: coder task result ${t} --wait`,`Unanswered approvals auto-deny after ${i} seconds.`];r.networkHost&&a.push(`Network access to ${r.networkHost} can be pre-approved with approvals.allowedNetworkHosts.`),v.stdout.write(`Approval needed for task ${t}: ${r.summary}\n`),r.cwd&&v.stdout.write(`Runs in: ${r.cwd}\n`),v.stderr.write(`\n${h(a,m,m.blue,`Next steps`)}\n`)}v.exit(4)}function U(e,t,n){switch(e.code){case`chain-exhausted`:B(e.payload),v.exit(3);case`read-only-unavailable`:V(e.message,n.json);case`approval-pending`:H(t,e.taskId,e.approval,n.json);case`startup-failed`:n.json&&(d({taskId:e.taskId,status:`failed`,detail:e.message}),v.exit(1)),f(`Task ${e.taskId} failed to start.${e.message?`\n${e.message}`:``}`,{hint:`See: coder task result ${e.taskId}`});case`login-failed`:f(e.message,{hint:[L(c(n.server)),`Or, for a memory server, set the same ADMIN_TOKEN it was started with`]});case`server`:f(e.message,{hint:e.hint??(e.status===401?L(c(n.server)):void 0)});default:f(e.message,e.hint?{hint:e.hint}:{})}}function W(e){return Object.assign(async t=>{let{options:n,positionals:r}=g(t,b.object(e.options),{positionals:e.args??0,command:e.name}),a={options:n,args:r,cwd:z(n)},o=n,s;try{o.server!==void 0&&await R(o.server,o.yes),s=await e.run(a)}catch(e){throw e instanceof i&&U(e,a.cwd,o),e}o.json&&s!==void 0?d(e.json?e.json(s,a):s):await e.print?.(s,a);let c=e.exit?.(s,a);c!==void 0&&(v.exitCode=c)},{commandName:e.helpName??e.name,help:e.help&&{...e.help,globalFlags:Object.keys(P).filter(t=>e.globalFlags?.[t]!==!1).map(e=>P[e])}})}function G(e,t,n,{aliases:r={},nested:i=[],hint:a=`Help: coder ${e} --help`,help:o}={}){return Object.assign(async n=>{let[o,...s]=n;if(!o||o===`help`||o===`-h`||o===`--help`)return void v.stdout.write(await J(e));let c=t[o];if(c||(v.stdout.write(await J(e)),f(`Unknown ${e} subcommand "${o}".`,{hint:a})),!i.includes(o)&&M(s)){let t=`${e} ${r[o]??o}`;v.stdout.write(A(t,await q(t))??await J(e));return}await(await c())(s)},{commandName:e,help:o,groupHelp:n,subcommands:t})}async function K(e){let[t,...n]=e.split(` `),r=T[t];if(!r)return;let i=await r();for(let e of n){let t=i.subcommands?.[e];if(!t)return;i=await t()}return i}async function q(e){let t=await K(e);return t&&(t.commandName===e||T[e])?t.help:void 0}async function J(e){let t=await K(e);if(!t)return null;if(!t.groupHelp)return A(t.commandName??e,t.help);let n=t.groupHelp;return k(e,n.menu,{...n,...n.details?{description:[t.help.summary],examples:t.help.examples,seeAlso:t.help.seeAlso}:{},...n.exampleCommand?{examples:(await q(n.exampleCommand))?.examples}:{}})}const Y=()=>j({...E,globals:[{usage:`-h, --help`,blurb:`show help (top-level, or for a command)`},{usage:`-v, --version`,blurb:`print the coder version`},...Object.values(P).map(([e,t])=>({usage:e,blurb:t}))]},t()),X=new Set([`task`,`model`,`flow`,`agent`,`server`,`runner`,`auth`,`credentials`]);async function Z(){let[n,...a]=v.argv.slice(2);if(n===`--version`||n===`-v`){v.stdout.write(`${t()}\n`);return}if(n===void 0||n===`help`||n===`--help`||n===`-h`){if(a[0]&&X.has(a[0])&&a[1]===void 0)return void v.stdout.write(await J(a[0]));for(let e of[a.slice(0,3),a.slice(0,2),...a.map(e=>[e])]){let t=e.join(` `),n=await q(t);if(n){let e=await K(t);v.stdout.write(A(e.commandName,n));return}}v.stdout.write(Y());return}if(![`task worker`,`task archive-sweep`,`mcp serve`,`agent tools`,`upgrade refresh`,`update refresh`].includes(`${n} ${a[0]}`)){let n=e(t(),r);n&&v.stderr.write(m.dim(`coder ${t()} -> `)+m.bold(n)+m.dim(` available. run: coder upgrade
|
|
7
|
+
|
|
8
|
+
`))}let o=T[n];if(o||(v.stdout.write(Y()),v.stdout.write(`
|
|
9
|
+
`),f(`Unknown command "${n}".`,{hint:`See all commands: coder --help`})),!X.has(n)&&M(a)){let e=await o();v.stdout.write(A(e.commandName??n,e.help)??Y());return}try{await(await o())(a)}catch(e){let t=e instanceof Error?e.message:String(e);throw/^(Unknown option|Missing value)/.test(t)&&await q(n)&&f(t,{hint:`Help: coder ${n} --help`}),e instanceof i&&e.hint&&f(e.message,{hint:e.hint}),e}}function Q(){return v.stdout.on(`error`,e=>{throw e.code===`EPIPE`&&v.exit(0),e}),Z().catch(e=>{e instanceof u&&v.exit(130);let t=e instanceof Error&&e.cause instanceof Error?`: ${e.cause.message}`:``;v.stderr.write(`${e instanceof Error?e.message:String(e)}${t}\n`),v.exit(1)})}const $=v.argv[1]&&y(v.argv[1]).href;$&&[import.meta.url,new URL(`./cli.js`,import.meta.url).href].includes($)&&Q();export{R as a,Q as c,D as d,A as f,W as i,J as l,N as n,q as o,O as p,F as r,G as s,I as t,Y as u};
|
package/dist/cli.d.ts
CHANGED
|
@@ -1 +1,71 @@
|
|
|
1
|
-
|
|
1
|
+
import { a as HelpRow, i as CommandHelpSpec, r as CommandHandler } from "./types-Dve7Z0ZP.js";
|
|
2
|
+
import * as z from "zod/mini";
|
|
3
|
+
//#region src/tui/help.d.ts
|
|
4
|
+
type GroupHelpSpec = {
|
|
5
|
+
menu: MenuRow[];
|
|
6
|
+
usage?: string;
|
|
7
|
+
description?: string[];
|
|
8
|
+
examples?: HelpRow[];
|
|
9
|
+
exampleCommand?: string;
|
|
10
|
+
seeAlso?: string;
|
|
11
|
+
details?: boolean;
|
|
12
|
+
};
|
|
13
|
+
/** A help row: left column in cyan, right in dim, an optional note in light. */
|
|
14
|
+
type MenuRow = {
|
|
15
|
+
usage: string;
|
|
16
|
+
blurb: string;
|
|
17
|
+
note?: string;
|
|
18
|
+
};
|
|
19
|
+
//#endregion
|
|
20
|
+
//#region src/cli.d.ts
|
|
21
|
+
declare const MODEL_HINT = "Use luna or sonnet for mechanical work; sol or opus is the default.\nUse astra or fable for the hardest work; they cost the most.";
|
|
22
|
+
declare const SERVER_FLAG: HelpRow;
|
|
23
|
+
declare const CREDENTIAL_SERVER_FLAG: HelpRow;
|
|
24
|
+
type CliCommand = CommandHandler & {
|
|
25
|
+
commandName?: string;
|
|
26
|
+
help?: CommandHelpSpec;
|
|
27
|
+
groupHelp?: GroupHelpSpec;
|
|
28
|
+
subcommands?: Record<string, Load>;
|
|
29
|
+
};
|
|
30
|
+
type Load = () => Promise<CliCommand>;
|
|
31
|
+
type CommandInput<S extends z.core.$ZodShape> = {
|
|
32
|
+
options: z.output<z.ZodMiniObject<S>>;
|
|
33
|
+
args: string[];
|
|
34
|
+
cwd: string;
|
|
35
|
+
};
|
|
36
|
+
/** A Coder server used for the first time is confirmed once, then remembered. */
|
|
37
|
+
declare function confirmServer(option: string | true | undefined, yes?: boolean): Promise<string>;
|
|
38
|
+
declare function command<S extends z.core.$ZodShape, R>(spec: {
|
|
39
|
+
/** The command's words, such as `task stop`, for its help and error hints. */
|
|
40
|
+
name: string;
|
|
41
|
+
helpName?: string;
|
|
42
|
+
globalFlags?: {
|
|
43
|
+
json?: false;
|
|
44
|
+
cwd?: false;
|
|
45
|
+
};
|
|
46
|
+
help?: CommandHelpSpec;
|
|
47
|
+
options: S;
|
|
48
|
+
/** The most positional arguments it takes. */
|
|
49
|
+
args?: number;
|
|
50
|
+
run(input: CommandInput<S>): Promise<R> | R;
|
|
51
|
+
/** Human output. */
|
|
52
|
+
print?(result: R, input: CommandInput<S>): void;
|
|
53
|
+
/** What `--json` prints, when not the result itself. */
|
|
54
|
+
json?(result: R, input: CommandInput<S>): unknown;
|
|
55
|
+
/** The exit code the result means, in both outputs. */
|
|
56
|
+
exit?(result: R, input: CommandInput<S>): number | undefined;
|
|
57
|
+
}): CliCommand;
|
|
58
|
+
/** A command group: routes `coder <group> <sub>` and prints its help; the work is in the subcommands. */
|
|
59
|
+
declare function group(name: string, subcommands: Record<string, Load>, groupHelp?: GroupHelpSpec, { aliases, nested, hint, help }?: {
|
|
60
|
+
aliases?: Record<string, string>;
|
|
61
|
+
nested?: string[];
|
|
62
|
+
hint?: string;
|
|
63
|
+
help?: CommandHelpSpec;
|
|
64
|
+
}): CliCommand;
|
|
65
|
+
declare function getCommandHelp(id: string): Promise<CommandHelpSpec | undefined>;
|
|
66
|
+
declare function renderHelp(id: string): Promise<string | null>;
|
|
67
|
+
declare const renderTopHelp: () => string;
|
|
68
|
+
/** Run the CLI on `process.argv`. */
|
|
69
|
+
declare function main(): Promise<void>;
|
|
70
|
+
//#endregion
|
|
71
|
+
export { CREDENTIAL_SERVER_FLAG, CliCommand, CommandInput, Load, MODEL_HINT, SERVER_FLAG, command, confirmServer, getCommandHelp, group, main, renderHelp, renderTopHelp };
|