@wular/coder 0.4.12 → 0.4.13
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 +1 -1
- package/dist/actions-D12xDiQS.js +4 -0
- package/dist/{adapter-CVd5klMH.js → adapter-Bz0E-DAY.js} +2 -2
- package/dist/{adapter-CU9H4g6c.js → adapter-CsacmMmv.js} +1 -1
- package/dist/adapter-DzpdWewB.js +1 -0
- package/dist/{agent-BA6xr8QY.js → agent-JJStALIx.js} +2 -2
- package/dist/apps-Bnk7F3A2.js +379 -0
- package/dist/args-Dqf5Y1RP.js +1 -0
- package/dist/async-Tj4zKHXR.js +3 -0
- package/dist/{auth-DuXnSNf9.js → auth-BhpnOCbn.js} +1 -1
- package/dist/builtin/coder/agent.json +0 -1
- package/dist/builtin/coder/system.md +1 -1
- package/dist/{chat-CgQdDRhs.js → chat-CSepnsrK.js} +1 -1
- package/dist/cli.js +13 -13
- package/dist/cmd-BHZwhrfa.js +118 -0
- package/dist/connection-BkYTuJjV.js +1 -0
- package/dist/context-zhSlmXOp.js +7 -0
- package/dist/dash/standalone/node_modules/contextjsx/package.json +1 -1
- package/dist/dash/standalone/server/build-index.json +1 -1
- package/dist/dash/standalone/server/manifest.json +1281 -1261
- package/dist/dash/standalone/server/modules-server-server-react-server/src/agent/context/{turn.dac8eb211c500271.js → turn.6bb73458768e222e.js} +4 -16
- package/dist/dash/standalone/server/modules-server-server-react-server/src/client/{index.0de14cb4e30bd70d.js → index.de1f1311bab4252f.js} +12 -6
- package/dist/dash/standalone/server/modules-server-server-react-server/src/core/{defaults.1b615366c56838a1.js → defaults.e972c134a1ae918f.js} +3 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/core/task/{log-view.60308a11f7001eb7.js → log-view.ec6391dbf3063330.js} +40 -48
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/api/{load.be791a5eaf328738.js → load.30ed8c28774a1a82.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/connect/{page.0fbfdba5254f7ae5.js → page.04762872666a6f0a.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/create/[id]/{page.70913bd4075da914.js → page.118a70787eff1761.js} +23 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{loading.e348ec45e9ed951b.js → loading.fcdfd50c21031895.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{notify.61aab176baeefebd.js → notify.98dfcd316c306258.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{page.815371ed0d5dd4fa.js → page.74c59322f5fe8a2c.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{sign-out.1d6af804f9ec043d.js → sign-out.730aa96b086ac996.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{agent-menu.2ed0e66d131fc148.js → agent-menu.1be5795272b245c8.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{agents-grid.f43bcc1148ce3650.js → agents-grid.2c30ace077893029.js} +6 -6
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{connect-apps.f3af8cc8540719d7.js → connect-apps.8a20501ccb244421.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{loading.fac1132ad9c4248e.js → loading.733f0acc2af5ceda.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{page.c6efd5432c1a4a75.js → page.d066b77dd3187026.js} +9 -9
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{layout.a795379254982121.js → layout.b26006f060cd48f0.js} +9 -9
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{page.a2cb6d1f1714259a.js → page.4b23e9df21433bd3.js} +9 -9
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{loading.4da9e2ba3fea937f.js → loading.e06845585ca67abc.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{page.996172c951739b35.js → page.4048048acb374c67.js} +35 -23
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{platform-actions.8e7ca54dd1821e98.js → platform-actions.000f2f87a48bfbc6.js} +36 -10
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/settings/{agent-settings-form.aa9e157d141481d7.js → agent-settings-form.ee0bb2dc4d403ec3.js} +8 -8
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/settings/{loading.ad1a4c9b000d269a.js → loading.0e3641f3e4abaa7c.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/settings/{page.44d886e60ae04303.js → page.649b4ba135ded99b.js} +7 -7
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/tasks/{loading.521c9e7b8d77f557.js → loading.195e168e8e41d797.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/tasks/{page.828cfb8112404792.js → page.96f7573208644f40.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/usage/{loading.8f998a9c511e1fb3.js → loading.905293c9aa9afbc9.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/usage/{page.45e18b6dc3019af4.js → page.5f2b8585db8b27ad.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{versions-list.c8d76988c734dda2.js → versions-list.8700f0106f4e8c15.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/edit/{loading.b1367e864b4fb406.js → loading.f94b2f9ab04aaf21.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/edit/{page.dd11f2618e08becd.js → page.e898c4b5ef16ecb0.js} +7 -7
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{agent-pills.f987c12bcbc5c850.js → agent-pills.44e689e546fb042b.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{agent-toggle.1579dc8acbaacf92.js → agent-toggle.4c67dfbb7d28a416.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{hero.ad5cc342db794e5d.js → hero.9740a8e2f4b41f28.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{connect-repositories.43b4b28f194ea842.js → connect-repositories.ff8b78a03153239b.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{editor.776856fe1ed1a642.js → editor.471af698b8060eba.js} +31 -20
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{import-picker.eafa5b41a2ed571f.js → import-picker.b7b5c89e618e8f89.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/new/{loading.ee001af7a96e3972.js → loading.ecb9dfd4d0f9d107.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/new/{page.7d84ef2b178b34d2.js → page.880bdac7fe843635.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{layout.393cf7429eea189e.js → layout.81f7e055829854a3.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/operator/operator-apps.09bf294d753ee9d7.js +115 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/operator/{page.980adfb7c5714752.js → page.8f8697b1b6b34ad7.js} +36 -9
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{page.24a1987405ed7b17.js → page.fe608b8e661aba1d.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{connections-list.21ec9dc73ce68656.js → connections-list.97381888bfdd711b.js} +8 -8
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{credentials-list.683476f62a9ecde7.js → credentials-list.a4d8338c7f6a5702.js} +10 -8
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{credentials.b43dd3d97c536c2a.js → credentials.1443bbed1ff1d441.js} +8 -8
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{engines-list.9e116751bd34e2cc.js → engines-list.d47db60d7dc01ebd.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{list.083f5c665df04b1b.js → list.a5b273558fb7f0f0.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{models-list.537f63f8e5dd085d.js → models-list.31d369f1b7ab45da.js} +66 -32
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{page.dfed4ae6ffc74434.js → page.805d0f8a2c5817d6.js} +15 -15
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{runners-list.3afa989490bbe77c.js → runners-list.1e83449aa6593224.js} +6 -6
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{secrets-list.0d175ee815b22cd7.js → secrets-list.17ac06593005b8ba.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{layout.3e8289f888fa444c.js → layout.8c4a2b31b194ba3e.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{page.06feaa5fbb06f1e6.js → page.a77996786278cda0.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{settings-head.bbc7ced8dd5491eb.js → settings-head.705be0b1129b97af.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{create-link.ff95e4b6977d0474.js → create-link.19b4c50ef497aca1.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{outcome-dialog.894c73f9abee3ce1.js → outcome-dialog.18cf32fa42247b91.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{page.f06fda0df59beeb5.js → page.616f0b36bf7925bc.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{activity.3c79cf14feff12bf.js → activity.a911169a820ba604.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{loading.47cbb34ea8d2e33f.js → loading.76f851da5cc5268d.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{page.abed2a8424ef3da0.js → page.ddb594bb6567ee13.js} +6 -6
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/task-actions.51fbeac76459433a.js +240 -0
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{task-view.dc294bb94b7437e1.js → task-view.3276538e8306fd8a.js} +28 -28
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{composer-data.309a194fc7fa34be.js → composer-data.05fc39e1a7fd1ab7.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{composer.5072aacdce127689.js → composer.dbf06b05c5e2eba3.js} +9 -9
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{status.16190fdd5fd7daad.js → status.cb704b48ce86cc7d.js} +6 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{task.0a1b5878dccd3b37.js → task.f089c1c122ed6dd2.js} +17 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{tasks-list.1162926f7498c732.js → tasks-list.5a00d69851dae119.js} +37 -22
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{tasks-section.1d687c986db53a73.js → tasks-section.36e70c93f7d0feee.js} +7 -7
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{page.d5d8cb5033823c9c.js → page.185b1ba0c803db3f.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/usage/{loading.97d277dbab9c15cf.js → loading.a7e0ec01bfa769e3.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/usage/{page.fb21ebe90d49dac1.js → page.d41fea7676e37bfc.js} +4 -4
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/usage/{range-bar.2197d8f43216d104.js → range-bar.69e68c9dae09f238.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/{layout.185dbc99875e208a.js → layout.296d70b95894209f.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{foreign-link.1f4217895ff1e835.js → foreign-link.8c6adf9c5a6f467c.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{loading-card.cc76fc9708142525.js → loading-card.1cea8a722c10b998.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{page-head.85f15db7b648d48c.js → page-head.87b92529dbb53ceb.js} +3 -3
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{stream.e2915852cf82c86b.js → stream.c32d78562f75db25.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{task-toasts.0ed8ccaae81b9d53.js → task-toasts.44075fa7e04575e8.js} +5 -5
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/nav/{back.180765bdadf6d602.js → back.d6109e72fbd04b45.js} +2 -2
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/nav/{org.572ad93c7707ab27.js → org.d3abfd4053b711ce.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{confirm.c1281f9b12854210.js → confirm.29e198be34578222.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{filter.3a452a262f040973.js → filter.81bb9a5c60cd1089.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{modal.25d53e5b41b9c4e5.js → modal.0b69c7fd9db025b9.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{segmented.a08dc08338d080e9.js → segmented.633abe26ff760e37.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{sentinel.17cffebfc3103b9f.js → sentinel.0ddf515b8f09ef9f.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{tabs.66b2e54963f6901b.js → tabs.1600a0b563a5c7dd.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{toolbar.24036899654de6df.js → toolbar.8b3a460a65edf85a.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/utils/{action.b9a5c37272250e82.js → action.67dd6f8ab1ae067d.js} +1 -1
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/utils/{client.a3928fa2dcd27b75.js → client.78267fa3d7905d17.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{action-71685b2d5ad9f359.js → action-a76e495fb39a73d3.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{agent-pills-15da36c2cb81991b.js → agent-pills-4d3c6a2aa9eb1522.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{agent-settings-form-6e6a87d6e673daa8.js → agent-settings-form-f7231a66e391f6b6.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{agent-toggle-ca98586e3b4ce9ae.js → agent-toggle-d7d27123f2070f18.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{agents-grid-29c399e46b4e9e2b.js → agents-grid-185ecb3d86c6c447.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{back-fa9d6e37f9828093.js → back-e29cb10f5548ddae.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{combo-86f3e11d1f6f6cee.js → combo-702c94817bf6ac17.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/composer-56ebf36d63400423.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{composer-85e0ec7163ae18b7.js → composer-a686289a79f64bae.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/composer-data-f46a9bc7a14b4f9a.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{confirm-c29a1db0130638d2.js → confirm-a78147b6ecef3847.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{connect-apps-b73490e04ae6398d.js → connect-apps-696726aedab42c96.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/{connect-repositories-0de82daaf654b1d3.js → connect-repositories-7770ab805160028d.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/connections-list-07559f145f3e3da3.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{copy-445c11202f136275.js → copy-bdc60bdafe336316.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/create-link-426b0a5871ee41dd.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/credentials-list-f07d090410104148.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{custom-range-a0630599f907b30e.js → custom-range-6618f32ef6cd4e80.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/editor-0860e370cbfc6b03.js +6 -0
- package/dist/dash/standalone/static/assets/chunks/engines-list-31b9bb7885924b05.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{field-b82a0f895266791c.js → field-bb8191aa02d07282.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/instructions-06b63e558f879da5.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{instructions-affaaeff366b1725.js → instructions-2d9fbcbfadac4f40.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/list-2773686bf8df64c7.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/models-list-03611e64b6a07efe.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{notice-57db7a1f05b7308c.js → notice-d14fdac28139c0a8.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/outcome-dialog-d3ba8ef89c59f801.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{outcome-dialog-5cf575a5e6921a5d.js → outcome-dialog-fde11a52c282301d.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/platform-actions-2a71c62b9f7eaef3.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/platform-actions-70600c9943320152.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/runners-list-edf536eb8003eab5.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/secrets-list-e86122f73525ff95.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/segmented-0b6dc6b93c35e0f5.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/shared-init-b281027d465e004f.js +5 -0
- package/dist/dash/standalone/static/assets/chunks/shared-init-c3bd249cf1eca6d1.js +2 -0
- package/dist/dash/standalone/static/assets/chunks/side-toggle-9b3af821cfe4c824.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{tail-b1c46587301ef397.js → tail-f8804b80cf32f8d0.js} +1 -1
- package/dist/dash/standalone/static/assets/chunks/task-a37e7c26e82eb77d.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/task-actions-705395565f2d83b8.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/task-view-cb21169f38b56d15.js +6 -0
- package/dist/dash/standalone/static/assets/chunks/tasks-list-d7dccfd7e0623ae0.js +1 -0
- package/dist/dash/standalone/static/assets/chunks/{versions-list-21cb854e6a7108a7.js → versions-list-f8f2e71df691efda.js} +1 -1
- package/dist/dash/standalone/static/assets/create-param-id-c2c756f652f2fc30.css +1 -0
- package/dist/dash/standalone/static/assets/{dash-param-org-account-9471bec93c444232.css → dash-param-org-account-702f8a1b213e4026.css} +1 -1
- package/dist/dash/standalone/static/assets/dash-param-org-agents-aad2f9f93c06e9ab.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-agents-new-f9dcbcec36586f2b.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-8ff47f5d622c1f9b.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-edit-907036d553cfeb36.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-platforms-5cc77badad15f00c.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-settings-705d7c15868b4fd6.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-tasks-04e189c045098772.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-usage-76fcd1ce7b3dae71.css +1 -0
- package/dist/dash/standalone/static/assets/{dash-param-org-bcfa3de29341d5ba.css → dash-param-org-eccb6bb9297a53e6.css} +1 -1
- package/dist/dash/standalone/static/assets/dash-param-org-operator-635a121f7a9a95bd.css +1 -0
- package/dist/dash/standalone/static/assets/{dash-param-org-settings-6d6902345d88a687.css → dash-param-org-settings-a3297dc4d9e0c961.css} +1 -1
- package/dist/dash/standalone/static/assets/dash-param-org-settings-param-tab-bcb06f81d9e8268d.css +1 -0
- package/dist/dash/standalone/static/assets/{dash-param-org-setup-173efecd7b990c2e.css → dash-param-org-setup-df4be8b188b9777f.css} +1 -1
- package/dist/dash/standalone/static/assets/dash-param-org-tasks-16f9866a1b4801cd.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-tasks-param-id-02ae551dcd852b57.css +1 -0
- package/dist/dash/standalone/static/assets/dash-param-org-usage-f2175403069aab99.css +1 -0
- package/dist/dash/standalone/static/assets/{global-87e1762113874559.css → global-e1de614478b64717.css} +1 -1
- package/dist/dash/standalone/static/assets/pnext-client-0dc829ba60df5c26.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-14d191f7f1da6602.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-169eaa63783b71fd.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-1e34cfefafa70fac.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-285d61f00a80f40b.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-35b89c3ba23ee845.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-6c42784e005d4b87.js +1 -0
- package/dist/dash/standalone/static/assets/{pnext-client-576c06599e241231.js → pnext-client-6cd93f9bd4cf6ffd.js} +1 -1
- package/dist/dash/standalone/static/assets/pnext-client-7355f473fade532d.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-815c3c297f75efb0.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-87fe73c10a4dc33c.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-98b56a142d441260.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-b4bafe68a40f720b.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-bf61ff39bdc0db48.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-c9fa86c244813f74.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-d2e7a75e16221224.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-d34e774405ea8da8.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-d511822afdb41d1d.js +1 -0
- package/dist/dash/standalone/static/assets/pnext-client-e113aa2f25ecfe01.js +1 -0
- package/dist/dash/standalone/static/assets/{pnext-client-c2c30dcb6dc31d60.js → pnext-client-eb62f461d0c32266.js} +1 -1
- package/dist/{discover-CPZdprlQ.js → discover-CHfF4cEz.js} +1 -1
- package/dist/{docs-x-l7gjFE.js → docs-KHc0_gFX.js} +1 -1
- package/dist/{drive-Y-ZlgiUW.js → drive-Bwl7Bjme.js} +1 -1
- package/dist/emit-BrkJJPUE.js +11 -0
- package/dist/env-6Y-NNnYD.js +1 -0
- package/dist/errors-DO_IltpP.js +16 -0
- package/dist/exec-BmTa0vcO.js +4 -0
- package/dist/executor-ufWRqhdS.js +11 -0
- package/dist/flow/builtin/review/index.d.ts +1 -1
- package/dist/flow/builtin/review/index.js +3 -3
- package/dist/flow/index.d.ts +1 -1
- package/dist/flow/index.js +1 -1
- package/dist/hook-CIipj9MJ.js +1 -0
- package/dist/http-Cg8PSe-c.js +1 -0
- package/dist/{index-BdkdNI1v.d.ts → index-ChcxzFdB.d.ts} +50 -185
- package/dist/integrations-I7fRDk_l.js +4 -0
- package/dist/lib/broker.js +2 -2
- package/dist/load-BDlEFetB.js +2 -0
- package/dist/local-COlczLwI.js +5 -0
- package/dist/log-view-CfX9lakH.js +4 -0
- package/dist/{maintenance-BfxcatXH.js → maintenance-CKCIWOvn.js} +1 -1
- package/dist/{match-Bq4sDuCy.js → match-CufHAZQH.js} +1 -1
- package/dist/mcp-BkwmRHI9.js +2 -0
- package/dist/mcp-CGU7aoJ-.js +1 -0
- package/dist/{mcp-Bta09QCU.js → mcp-DAHbhfUh.js} +1 -1
- package/dist/models-CzggS7p2.js +1 -0
- package/dist/output-SNqdgh9A.js +17 -0
- package/dist/permission-MWFjKxqX.js +1 -0
- package/dist/{prompt-onpyIyXK.js → prompt-CIx4jwQF.js} +1 -1
- package/dist/refresh-CxsaX5R9.js +1 -0
- package/dist/remote-C9Hj2cby.js +2 -0
- package/dist/remote-HUZCWgfl.js +3 -0
- package/dist/{runner-CTFTuaz_.js → runner-DYysY1-G.js} +1 -1
- package/dist/runner.json +1 -1
- package/dist/runner.tgz +0 -0
- package/dist/runners-CfaGE0nV.js +36 -0
- package/dist/schema.js +1 -1
- package/dist/sdk.d.ts +285 -104
- package/dist/sdk.js +1 -1
- package/dist/serve-DdAdw7Su.js +4 -0
- package/dist/serve-NQykWAKV.js +1 -0
- package/dist/serve-vKNqVaVy.js +12 -0
- package/dist/slack-BtKvW_4v.js +5 -0
- package/dist/task-CFxs0E_J.js +1 -0
- package/dist/task-iuYQ0zAK.js +7 -0
- package/dist/tools-B6ZxcqRi.js +2 -0
- package/dist/{tools-CM4UCsId.js → tools-FVop8XYG.js} +1 -1
- package/dist/tools-search-kjKKolwp.js +1 -0
- package/dist/turn-DQ13lkPF.js +2 -0
- package/dist/types-DPtbvoo3.js +1 -0
- package/dist/types-DmThhjcW.js +1 -0
- package/dist/views-CMHXBMJp.js +3 -0
- package/dist/{wire-JMNPv8f6.js → wire-C9CupY_A.js} +1 -1
- package/dist/worker-BQpx1dPr.js +9 -0
- package/dist/worker-sTJL2eoe.js +1 -0
- package/docs/access.md +33 -0
- package/docs/agents/coder.md +0 -11
- package/docs/agents/index.md +1 -1
- package/docs/cli/agent.md +6 -6
- package/docs/cli/connection.md +5 -5
- package/docs/cli/flow.md +9 -9
- package/docs/cli/index.md +3 -3
- package/docs/cli/model.md +12 -10
- package/docs/cli/runner.md +1 -1
- package/docs/cli/server.md +2 -2
- package/docs/cli/task.md +23 -21
- package/docs/config.md +5 -15
- package/docs/flows.md +1 -1
- package/docs/models.md +7 -6
- package/docs/sdk.md +29 -29
- package/docs/self-host.md +25 -25
- package/package.json +2 -2
- package/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/plugins/cursor/.cursor-plugin/plugin.json +1 -1
- package/dist/actions-BT7_eKXm.js +0 -10
- package/dist/adapter-BT8ECcRG.js +0 -1
- package/dist/apps-D-v5sQJk.js +0 -367
- package/dist/args-CbO_Ck9Z.js +0 -11
- package/dist/async-XNO3nqum.js +0 -3
- package/dist/cmd-DX5ByXo3.js +0 -119
- package/dist/connection-DNxi2btM.js +0 -1
- package/dist/context-65bOofts.js +0 -7
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/operator/operator-apps.a244f3199e7cf09c.js +0 -144
- package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/task-actions.587da79d68ab8d14.js +0 -151
- package/dist/dash/standalone/static/assets/chunks/composer-910bb87127972f62.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/composer-data-5fed6c271a4791ca.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/connections-list-c50f58b4b28d10bb.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/create-link-6d64a2d5f9ce6de0.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/credentials-list-bee95799b2319b3b.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/defaults-52f30e83d7666f7a.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/editor-b9951819f21b2e43.js +0 -6
- package/dist/dash/standalone/static/assets/chunks/engines-list-2720c3e8fa12b2f7.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/instructions-fd7402ac5aa8b50e.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/list-d918f79562d497eb.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/models-list-12bc7aceaa52f5b0.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/outcome-dialog-b219595be320108a.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/platform-actions-1d27d2ba7eee9ff1.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/platform-actions-dba96dcb0f6513db.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/runners-list-36f8c5ecfcf8e9ae.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/secrets-list-d7dbafd24dd18481.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/segmented-8f809ebe712e92a7.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/shared-init-cc13a835f3508618.js +0 -2
- package/dist/dash/standalone/static/assets/chunks/shared-init-f475017dd5811e33.js +0 -5
- package/dist/dash/standalone/static/assets/chunks/side-toggle-0aa237eba3dfe9c1.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/task-681061023bdf0a49.js +0 -5
- package/dist/dash/standalone/static/assets/chunks/task-actions-c9e46e81604e85c5.js +0 -1
- package/dist/dash/standalone/static/assets/chunks/task-view-134186a544917ceb.js +0 -5
- package/dist/dash/standalone/static/assets/chunks/tasks-list-352a3222d878de0f.js +0 -1
- package/dist/dash/standalone/static/assets/create-param-id-da3f7e20689fe51a.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-agents-64500e78caae32df.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-agents-new-c067c22928a2d7cc.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-9dec87710e04f949.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-edit-779c474301e04440.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-platforms-c7d594b5232630c2.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-settings-a80e62570716fdb9.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-tasks-ce278252012297b9.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-usage-d3b6d701eb8e1403.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-operator-b7bc6447cc27c9ce.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-settings-param-tab-85c7af9a89eef06e.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-tasks-ae0bc03f468e63cc.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-tasks-param-id-7325d8cff5be3592.css +0 -1
- package/dist/dash/standalone/static/assets/dash-param-org-usage-517b2a7ae462ac57.css +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-05df74b071ddb0b3.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-2c19cca257f78ae6.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-2db05dfa62642a65.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-36b0d6085a073880.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-6aa0f19a30d58d63.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-6b30b71f452f2f07.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-6ccb4d4fff812db3.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-74eb465defba421e.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-8c692d12b2fd90d6.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-92e17d39063a9ced.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-93246aea268c2682.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-9954dcbc0c579e0d.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-c0dfa1cdde9a9855.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-c28d38d4aafd4af6.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-dbf741073e11eac0.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-e29194a27280333f.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-f8a7e692b27caad9.js +0 -1
- package/dist/dash/standalone/static/assets/pnext-client-fc5b8cfcba2a9f63.js +0 -1
- package/dist/env-B9JG6gwo.js +0 -1
- package/dist/errors-XBA-Ls4n.js +0 -10
- package/dist/exec-iFssTO5V.js +0 -3
- package/dist/executor-Dt2FFT-y.js +0 -11
- package/dist/http-BZfjbiov.js +0 -1
- package/dist/integrations-DyInAa5g.js +0 -2
- package/dist/load-zhcrwSRF.js +0 -2
- package/dist/local-D55UkW93.js +0 -5
- package/dist/log-view-CL3_S0IQ.js +0 -3
- package/dist/mcp-CUITALl1.js +0 -1
- package/dist/models-C1O2DrXx.js +0 -1
- package/dist/output-D95NoAA9.js +0 -16
- package/dist/prompts-B8pKhMcu.js +0 -4
- package/dist/refresh-D-0K9fo3.js +0 -1
- package/dist/remote-CDm0YUU3.js +0 -3
- package/dist/runners-CYTicTb7.js +0 -36
- package/dist/serve-Bzs_lEg-.js +0 -1
- package/dist/serve-CWtLyyTz.js +0 -12
- package/dist/serve-DE6A-rBk.js +0 -4
- package/dist/slack-Bo5l13Rs.js +0 -5
- package/dist/task-BU1JEK9X.js +0 -7
- package/dist/task-CPzBITsp.js +0 -1
- package/dist/tools-BMaKWTa6.js +0 -1
- package/dist/turn-DMvPfhb5.js +0 -3
- package/dist/types-D_xnfP7m.js +0 -1
- package/dist/views-DEdKqLm_.js +0 -5
- package/dist/worker-BuP_Lem1.js +0 -9
- package/dist/worker-C1tuzq5n.js +0 -1
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/core/{errors.0a735590a5412ea6.js → errors.1bd0542d832ae0c0.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{page.c811938ae8a8f1df.css.pnext-asset.js → page.107e622830bff31d.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{hero.1bef5dca89b5942c.css.pnext-asset.js → hero.243d85cac1f22df2.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{editor.c496247a81ed832c.css.pnext-asset.js → editor.1eb1bce282b289c9.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{model-options.a96c11d11674f598.js → model-options.73f8d0d54f79d8e3.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{task-view.57990cfd2bdf5c11.css.pnext-asset.js → task-view.42337a0d7c6ad0b6.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{tasks-list.abbbc9ace4d866e5.css.pnext-asset.js → tasks-list.2f90c4410f843fff.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/{globals.c8fd2b8b01e7077b.css.pnext-asset.js → globals.f8ac779f0ebf888b.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{page-head.364ec93a8e7857b3.css.pnext-asset.js → page-head.9fcc49ddf7119d75.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{modal.9db07d368dcf5981.css.pnext-asset.js → modal.a533234c7c831be4.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{segmented.0bd8652fdbc05eb0.css.pnext-asset.js → segmented.c6f30b839fd27f35.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{sentinel.1e3ec9bd6008d811.css.pnext-asset.js → sentinel.d17e2bfcbeb9df31.css.pnext-asset.js} +0 -0
- /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{tabs.ca13e40ff54128d0.css.pnext-asset.js → tabs.025b532d6cc51736.css.pnext-asset.js} +0 -0
package/dist/sdk.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{zt as e}from"./errors-DO_IltpP.js";import{Dt as t,J as n,q as r}from"./output-SNqdgh9A.js";import{n as i,o as a,t as o}from"./remote-HUZCWgfl.js";import{a as s}from"./executor-ufWRqhdS.js";import{n as c}from"./agent-JJStALIx.js";import{t as l}from"./connection-BkYTuJjV.js";import{n as u}from"./docs-KHc0_gFX.js";import{t as d}from"./models-CzggS7p2.js";import{n as f}from"./task-CFxs0E_J.js";import p from"./flow/index.js";import{n as m}from"./runner-DYysY1-G.js";import{n as h}from"./apps-Bnk7F3A2.js";import{x as g}from"./runners-CfaGE0nV.js";import{n as _}from"./maintenance-CKCIWOvn.js";import{r as v,t as y}from"./serve-vKNqVaVy.js";const b=f,x=l,S=n,C=u,w=a,T={serve:y,rotateKey:_,workflow:g,app:{create:h},handler:v},E={list:(e={})=>o(e).folders.list(),check:(e,t={})=>o(t).folders.check(e)},D=c;var O={task:b,flow:p,model:d,config:e,connection:x,setupHost:r,upgrade:S,docs:C,review:s,auth:w,agent:D,credentials:i,folders:E,runner:m,server:T};export{t as CoderError,D as agent,w as auth,e as config,x as connection,i as credentials,O as default,C as docs,p as flow,E as folders,d as model,s as review,m as runner,T as server,r as setupHost,b as task,S as upgrade};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{F as e,wi as t}from"./core-DwsAMCnL.js";import{n,o as r,s as i,t as a}from"./emit-BrkJJPUE.js";import{Ft as o,Kn as s,Ot as c,Pn as l,bn as u,ir as d,zt as f}from"./zod-BoqHoRCH.js";import{randomUUID as p}from"node:crypto";const m=`2025-11-25`,h=[m,`2025-06-18`,`2025-03-26`,`2024-11-05`],g=(e,t,n)=>({jsonrpc:`2.0`,...e===void 0?{}:{id:e},error:{code:t,message:n}}),_=e=>{if(typeof e!=`object`||!e||Array.isArray(e))return!1;let{jsonrpc:t,method:n,id:r}=e;return t===`2.0`&&(n===void 0||typeof n==`string`)&&(r===void 0||typeof r==`string`||typeof r==`number`)},v=e=>{let t=e?.id;return typeof t==`string`||typeof t==`number`?t:void 0};function y(e){let t=new Map;return async({id:n,method:r,params:i={}},a=``)=>{if(r===void 0)return;if(n===void 0){r===`notifications/cancelled`&&t.get(a)?.get(i.requestId)?.abort();return}let o=t.get(a);o||t.set(a,o=new Map);let s=new AbortController;o.set(n,s);try{if(r===`initialize`){let t=i.protocolVersion;return{jsonrpc:`2.0`,id:n,result:{protocolVersion:h.includes(t)?t:m,capabilities:e.capabilities,serverInfo:{name:e.name,version:`0`},...e.instructions?{instructions:e.instructions}:{}}}}let t=r===`ping`?()=>({}):Object.hasOwn(e.handlers,r)?e.handlers[r]:void 0;return t?{jsonrpc:`2.0`,id:n,result:await t(i,s.signal)}:g(n,-32601,`Method not found: ${r}`)}catch(e){let t=e.code;return g(n,typeof t==`number`?t:-32603,String(e?.message??e))}finally{o.delete(n),o.size||t.delete(a)}}}function b(e){let t=y(e),n=(e,t,n,r)=>{e.writeHead(t,{...n?{"content-type":`application/json`}:{},...r?{"mcp-session-id":r}:{},...t===405?{allow:`POST`}:{}}),e.end(n?JSON.stringify(n):void 0)},r=async(e,r)=>{if(e.method!==`POST`)return n(r,405);let{origin:i,host:a}=e.headers;if(i!==void 0&&i!==`http://${a}`)return n(r,403);let o=e.headers[`mcp-protocol-version`];if(typeof o==`string`&&!h.includes(o))return n(r,400,g(void 0,-32600,`Unsupported protocol version: ${o}`));let s=``;e.setEncoding(`utf8`);for await(let t of e)s+=t;let c;try{c=JSON.parse(s)}catch{return n(r,400,g(void 0,-32700,`Parse error`))}if(!_(c))return n(r,400,g(v(c),-32600,`Invalid request`));let l=c.method===`initialize`&&c.id!==void 0,u=e.headers[`mcp-session-id`],d=l?crypto.randomUUID():typeof u==`string`?u:``,f=await t(c,d).catch(()=>g(c.id,-32603,`Internal error`));if(!f)return n(r,202);n(r,200,f,l?d:void 0)};return(e,t)=>{r(e,t).catch(()=>t.destroy())}}function x(e){let t=y(e),n=e=>process.stdout.write(`${JSON.stringify(e)}\n`),r=new Promise(e=>process.stdin.once(`end`,e)),i=``,a=e=>{i+=e;for(let e=i.indexOf(`
|
|
2
|
+
`);e>=0;e=i.indexOf(`
|
|
3
|
+
`)){let r=i.slice(0,e).trim();if(i=i.slice(e+1),!r)continue;let a;try{a=JSON.parse(r)}catch{n(g(void 0,-32700,`Parse error`));continue}if(!_(a)){n(g(v(a),-32600,`Invalid request`));continue}let{id:o}=a;t(a).catch(()=>o===void 0?void 0:g(o,-32603,`Internal error`)).then(e=>e&&n(e))}};return process.stdin.setEncoding(`utf8`),process.stdin.on(`data`,a),{close:async()=>{process.stdin.off(`data`,a),process.stdin.pause()},done:r}}const S=e=>({type:`text`,text:e}),C=e=>({content:[S(e)],isError:!0}),w=e=>e.replace(/[^A-Za-z0-9_-]/g,`_`);function T(p){let{commands:m,skills:h}=a(p),g=new Map;for(let e of m)if(e.command.mcp!==!1){if(g.has(e.id))throw Error(`contextjsx: two commands have the tool id "${e.id}"`);g.set(e.id,e)}let _=new Map;for(let e of h){let{name:t}=r(e);if(_.has(t))throw Error(`contextjsx: two skills are named "${t}"`);_.set(t,e)}let v=new Map;for(let e of[...g.keys(),..._.size?[`load_skill`]:[]]){let t=v.get(w(e));if(t!==void 0)throw Error(`contextjsx: tools "${t}" and "${e}" both map to ${w(e)}`);v.set(w(e),e)}let y=l({content:o(d([l({type:u(`text`),text:s()}),l({type:c([`image`,`audio`]),data:s(),mimeType:s()}),l({type:u(`resource_link`),uri:s(),name:s()}),l({type:u(`resource`),resource:d([l({uri:s(),text:s()}),l({uri:s(),blob:s()})])})])),isError:f().optional()}),b=new Map,x=({id:t,command:n})=>{let r=b.get(t);return r||b.set(t,r=e(l(n.args??{}),{io:`input`})),r},T=[...(p.resources??[]).map(e=>({uri:e.uri,name:e.name??e.uri,description:e.description,mimeType:e.mimeType,read:()=>e.read()})),...[...g.values()].map(({id:e,path:t,command:r})=>({uri:`${p.name}://help/${e}`,name:`help ${t.join(` `)}`,description:r.description,mimeType:`text/plain`,read:()=>n(p,r)}))];return{name:p.name,instructions:i(p),capabilities:T.length?{tools:{},resources:{}}:{tools:{}},handlers:{"tools/list":()=>({tools:[...[...g.values()].map(e=>({name:e.id,description:(e.command.mcp||void 0)?.description??e.command.description,inputSchema:x(e),annotations:{readOnlyHint:e.command.access===`read`}})),..._.size?[{name:`load_skill`,description:`Load a skill named in the server instructions; returns its full text`,inputSchema:{type:`object`,properties:{name:{type:`string`,description:`skill name`}},required:[`name`]},annotations:{readOnlyHint:!0}}]:[]]}),"tools/call":async(e,n)=>{let i=e.name,a=e.arguments??{};if(i===`load_skill`&&_.size){let e=_.get(a.name);return e?{content:[S(r(e).text)]}:C(`Unknown skill ${JSON.stringify(a.name)}. Skills: ${[..._.keys()].join(`, `)}`)}let o=g.get(i);if(!o)throw Object.assign(Error(`Unknown tool ${i}`),{code:-32602});let{command:s}=o,c=l(s.args??{}).safeParse(a);if(!c.success)return C(`Invalid arguments for ${i}:\n${t(c.error)}\n\nSchema: ${JSON.stringify(x(o))}`);try{let e=await s.run(c.data,{signal:n});if(!(s.mcp||void 0)?.text&&y.safeParse(e).success)return e;let t=s.mcp&&s.mcp.text?s.mcp.text(e):typeof e==`string`?e:JSON.stringify(e)??``,r=s.next?.({result:e,args:c.data}).map(e=>`${e.usage} # ${e.blurb}`);return{content:[S(t),...r?.length?[S(r.join(`
|
|
4
|
+
`))]:[]]}}catch(e){return C(String(e?.message??e))}},"resources/list":()=>({resources:T.map(({uri:e,name:t,description:n,mimeType:r})=>({uri:e,name:t,description:n,...r?{mimeType:r}:{}}))}),"resources/read":async e=>{let t=T.find(t=>t.uri===e.uri);if(!t)throw Object.assign(Error(`Unknown resource ${e.uri}`),{code:-32002});return{contents:[{uri:t.uri,...t.mimeType?{mimeType:t.mimeType}:{},text:await t.read()}]}}}}}async function E(e,t){let n=T(e);if(t===`stdio`)return x(n);let r=`127.0.0.1`,i=p(),a=b(n),{createServer:o}=await import(`node:http`),s=o((t,n)=>{if(t.headers.authorization!==`Bearer ${i}`)return n.statusCode=401,n.end();if((t.url??`/`).split(`?`)[0]!==`/${e.name}`)return n.statusCode=404,n.end();a(t,n)});return await new Promise((e,n)=>{s.once(`error`,n),s.listen(t.http.port??0,r,()=>{s.off(`error`,n),e()})}),{url:`http://${r}:${s.address().port}/${e.name}`,token:i,close:()=>new Promise(e=>{s.closeAllConnections(),s.close(()=>e())})}}export{E as serve};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{qi as e}from"./core-DwsAMCnL.js";import{X as t,v as n}from"./errors-DO_IltpP.js";import{Dt as r}from"./output-SNqdgh9A.js";import{a as i,t as a}from"./remote-HUZCWgfl.js";import{p as o}from"./slack-BtKvW_4v.js";import{h as s,o as c,s as l,t as u}from"./http-Cg8PSe-c.js";import d from"node:path";import f from"node:fs";import{createHmac as p,randomBytes as m}from"node:crypto";import h from"node:os";import g from"node:http";var _=e({runnerController:()=>T,serveRunner:()=>S});const v=()=>n(`runners.json`);function y(){try{return JSON.parse(f.readFileSync(v(),`utf8`))}catch{return{}}}function b(e){f.mkdirSync(d.dirname(v()),{recursive:!0}),f.writeFileSync(v(),JSON.stringify(e,null,2),{mode:384})}const x=e=>[`cloudflared tunnel --url http://localhost:${e}`,`ngrok http ${e}`,`tailscale funnel ${e}`,`VS Code: forward port ${e} in the Ports view and set its visibility to Public`];async function S(e={}){let n=e.port??4100,o=e.token?e.runnerUrl??process.env.CODER_RUNNER_URL:e.url;if(!o)throw new r(`invalid-option`,e.token?`Expose this runner and set CODER_RUNNER_URL or --runner-url to its public HTTPS address.`:`Expose this runner with a tunnel, then pass its public URL with --url.`,{hint:x(n)});let d=e.token?i({...e,server:e.url??e.server,yes:!0}):i(e),f=y(),p=f[d]??{secret:m(32).toString(`base64url`)},_=new s(t()),v=T({secret:p.secret,server:d,runner:_}),S=g.createServer(l(async e=>{let t=await c(e,u(new URL(e.url).pathname));return t instanceof Response?t:v(t)}));await new Promise((e,t)=>{S.once(`error`,t),S.listen(n,`127.0.0.1`,e)});let C=()=>new Promise(e=>S.close(()=>e())),w=e.name??h.hostname(),E=[],D=async(e,t)=>{let n=E,i=await fetch(`${d}/runners/register`,{method:`POST`,redirect:`manual`,signal:AbortSignal.timeout(5e3),headers:{"content-type":`application/json`},body:JSON.stringify({...e?{token:e}:{id:p.id,organizationId:p.organizationId},name:w,url:o,secret:p.secret,...t?{offline:t}:{},...n.length?{removed:n}:{}})});if(!i.ok)throw new r(`server`,`Runner registration failed`,{status:i.status});let{deleted:a=[],...s}=await i.json();E=E.filter(e=>!n.includes(e));for(let e of a)await _.remove(e).then(()=>E.push(e),t=>console.error(`coder runner: folder of deleted task ${e} not removed`,t));return s},O;try{if(e.token){let t=await D(e.token);O=t,p.organizationId=t.organizationId}else{let t=p.id&&p.organizationId?await D().catch(e=>{if(!(e instanceof r&&e.status===401))throw e}):void 0;if(t)O=t;else{let t=a(e),n=await t.me();O=await t.runners.add({kind:`http`,name:w,scope:e.workspace||!n.user?`workspace`:`personal`,config:{url:o,secret:p.secret}}),p.organizationId=n.organization?.id,p.id=O.id,O=await D()}}p.id=O.id,b({...f,[d]:p})}catch(e){throw await C(),e}let k=Promise.resolve(),A=setInterval(()=>{k=k.then(()=>D().then(()=>{})).catch(()=>{})},6e4);return{...O,port:n,server:d,close:async()=>{clearInterval(A),await k,await D(void 0,!0).catch(()=>{}),await C()}}}const C=3e5,w=(e,t=200)=>new Response(JSON.stringify(e),{status:t,headers:{"content-type":`application/json`}});function T(e){let t=e.now??Date.now,n=new Map,r=(r,i)=>{let a=r.headers.get(`x-coder-timestamp`)??``,s=r.headers.get(`x-coder-nonce`)??``,c=r.headers.get(`x-coder-signature`)??``,l=Number(a);if(!s||!Number.isFinite(l)||Math.abs(t()-l)>C)return!1;let u=p(`sha256`,e.secret).update(`${i}.${a}.${s}`).digest(`base64url`);if(!o(c,u))return!1;for(let[e,r]of n)r<t()&&n.delete(e);return!n.has(s)&&(n.set(s,l+C),!0)};return async t=>{let n=t.method===`GET`?``:await t.text();if(!r(t,n))return w({error:`Unauthorized`},401);let[,i,a]=new URL(t.url).pathname.split(`/`).map(decodeURIComponent);try{if(t.method===`POST`&&i===`start`&&!a){let t=JSON.parse(n);if(typeof t.task!=`string`||!t.env)return w({error:`Invalid start`},400);let r=t.env.CODER_TASK_TOKEN;if(typeof r!=`string`)return w({error:`Invalid start`},400);let i={CODER_SERVER:e.server,CODER_TASK_TOKEN:r,CODER_INBOX_MODE:e.runner.push?`push`:`poll`,...t.env.CODER_LOGIN===`claude`||t.env.CODER_LOGIN===`codex`?{CODER_LOGIN:t.env.CODER_LOGIN}:{}};return w({handle:await e.runner.start({id:t.task},i)})}if(t.method===`GET`&&i===`health`&&!a)return w({ok:!0});if(!a)return w({error:`Not found`},404);if(t.method===`POST`&&i===`messages`&&e.runner.push){let{entries:t}=JSON.parse(n);return!Array.isArray(t)||!t.length?w({error:`Invalid messages`},400):w(await e.runner.push(a,t))}return t.method===`GET`&&i===`status`?w(await e.runner.status(a)):t.method===`POST`&&i===`stop`?(await e.runner.stop(a),new Response(null,{status:204})):w({error:`Not found`},404)}catch(e){return w({error:e instanceof Error?e.message:String(e)},400)}}}export{_ as n,S as t};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import{qi as e}from"./core-DwsAMCnL.js";import{A as t,Dt as n,Et as r,G as i,Ht as a,Jt as o,Mt as s,Ut as c,Wt as l,Xt as u,_ as d,jt as f,ln as p,nn as m,v as h,wr as g}from"./errors-DO_IltpP.js";import{Dt as _}from"./output-SNqdgh9A.js";import{a as v,c as y,h as b,i as x,n as ee,r as te}from"./load-BDlEFetB.js";import{m as S}from"./slack-BtKvW_4v.js";import{t as C}from"./types-DPtbvoo3.js";import{n as ne}from"./integrations-I7fRDk_l.js";import{i as re,t as ie}from"./discover-CHfF4cEz.js";import{d as ae}from"./actions-D12xDiQS.js";import{r as oe}from"./models-CzggS7p2.js";import{n as se}from"./base64url-CsVsW4Id.js";import{a as w,d as T,f as E,l as ce,n as le,o as ue,p as de,r as fe,s as pe,t as me,u as he}from"./http-Cg8PSe-c.js";import{$ as ge,$n as _e,$t as ve,A as ye,At as be,B as xe,Bn as Se,Bt as Ce,C as D,Cn as we,Cr as Te,Ct as Ee,D as De,Dt as Oe,E as ke,Et as Ae,F as je,Fn as Me,Ft as O,G as Ne,Gn as Pe,Gt as k,H as Fe,Hn as Ie,Ht as Le,I as Re,In as ze,J as Be,Jn as Ve,Jt as He,K as A,Kn as Ue,Kt as We,L as Ge,Ln as Ke,Lt as qe,M as Je,Mn as Ye,Mt as Xe,N as Ze,Nn as Qe,Nt as $e,O as et,On as tt,P as nt,Pn as rt,Pt as it,Q as at,Qn as ot,Qt as st,R as ct,Rn as lt,Rt as ut,S as dt,Sn as ft,Sr as j,St as pt,T as mt,U as ht,Un as gt,Ut as M,Vn as _t,Vt as vt,W as yt,Wn as bt,Wt as xt,X as St,Xn as Ct,Xt as wt,Y as Tt,Yn as Et,Yt as Dt,Z as Ot,Zn as kt,Zt as At,_ as jt,_n as Mt,_t as N,a as Nt,an as Pt,ar as Ft,at as It,b as Lt,bn as Rt,br as P,bt as zt,c as Bt,cn as Vt,cr as Ht,ct as Ut,d as Wt,dn as Gt,dr as Kt,dt as qt,en as Jt,er as Yt,et as Xt,f as Zt,fn as Qt,fr as $t,g as F,gn as en,gr as tn,gt as nn,h as rn,hn as an,hr as on,ht as sn,i as cn,in as ln,ir as un,it as dn,j as fn,jn as pn,jt as mn,k as I,kn as hn,kt as gn,l as L,ln as _n,lr as vn,lt as yn,m as bn,mn as xn,mr as Sn,mt as Cn,nn as wn,nr as Tn,nt as En,o as Dn,on as On,or as kn,ot as An,p as jn,pn as Mn,pr as Nn,pt as Pn,q as Fn,qn as In,qt as Ln,r as Rn,rn as zn,rr as Bn,rt as Vn,s as Hn,sn as Un,sr as Wn,st as Gn,tn as Kn,tr as qn,tt as Jn,u as Yn,un as Xn,ur as Zn,ut as Qn,v as $n,vn as er,vt as tr,w as nr,wn as rr,wr as ir,wt as ar,x as or,xn as sr,xr as R,y as cr,yn as lr,yr as ur,yt as dr,z as fr,zn as pr,zt as mr}from"./apps-Bnk7F3A2.js";import{n as hr,r as gr}from"./env-6Y-NNnYD.js";import{E as z,T as _r,_ as vr,c as yr,i as br,l as xr,n as Sr,w as B,y as Cr}from"./runners-CfaGE0nV.js";import{C as wr,S as Tr,_ as V,a as Er,f as H,g as U,h as Dr,i as Or,m as kr,n as Ar,p as jr,v as Mr,x as Nr}from"./local-COlczLwI.js";import{r as Pr}from"./client-C4QCT6cG.js";import{M as Fr}from"./schema.js";import W from"node:path";import G from"node:process";import Ir from"node:fs";import{spawnSync as Lr}from"node:child_process";import{createHash as Rr,randomBytes as zr,randomUUID as Br}from"node:crypto";import Vr from"node:http";import K from"node:fs/promises";import{isDeepStrictEqual as Hr,promisify as Ur}from"node:util";import{gunzip as Wr,gzip as Gr}from"node:zlib";async function Kr(e){try{return await K.readdir(e,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}}async function q(e){try{return await K.lstat(e),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}}async function qr(e,t){if(e===t||!await q(e))return 0;let n=await Kr(e),r=n.filter(e=>e.isDirectory()).length;if(!await q(t))return await g(e,t),r;for(let r of n)await g(W.join(e,r.name),W.join(t,r.name));return await K.rmdir(e),r}async function Jr(e){let t=W.dirname(e),n=W.basename(e);for(let e of await Kr(t)){let r=e.name.startsWith(n)?e.name.slice(n.length):``;if(!e.isFile()||!(r===`.tmp`||/^\.\d+(?:\.[a-f0-9-]{36})?\.tmp$/.test(r)))continue;let i=Number(e.name.slice(n.length+1).split(`.`)[0]);if(Number.isInteger(i)&&i>0)try{process.kill(i,0);continue}catch(e){if(e.code!==`ESRCH`)continue}await K.unlink(W.join(t,e.name)).catch(e=>{if(e.code!==`ENOENT`)throw e})}}async function Yr(e,t){if(await Jr(e),e===t||!await q(e))return 0;if(!await q(t))return await g(e,t),1;let n=JSON.parse(await K.readFile(e,`utf8`)),r=JSON.parse(await K.readFile(t,`utf8`)),i={...n,...r,...n.rows||r.rows?{rows:{...n.rows,...r.rows}}:{}},a=`${t}.${process.pid}.${Br()}.tmp`;try{await K.writeFile(a,`${JSON.stringify(i)}\n`,{mode:384,flag:`wx`}),await K.rename(a,t),await K.unlink(e)}finally{await K.rm(a,{force:!0})}return 1}async function Xr(){let e=d(),t=h(`state`),n=d(`archive`),r=d(`flows-archived`),i=d(`usage.json`),a=d(`runner`,`usage.json`),o={from:h(`checkouts`),to:d(`checkouts`)},s={from:h(`update-check.json`),to:d(`update-check.json`)},c={cache:e,tasks:0,flows:0,files:0},l=(await Kr(t)).filter(e=>e.isDirectory()).map(e=>({archive:h(`state`,e.name,`archive`),flows:h(`state`,e.name,`flows-archived`),usage:h(`state`,e.name,`usage.json`),runnerUsage:h(`state`,e.name,`runner`,`usage.json`)}));await Jr(i),await Jr(a);for(let e of l)c.tasks+=await qr(e.archive,n),c.flows+=await qr(e.flows,r),c.files+=await Yr(e.usage,i),c.files+=await Yr(e.runnerUsage,a);return await qr(o.from,o.to),c.files+=await Yr(s.from,s.to),c}async function Zr(e){let t=(e.now??Date.now)(),n=await e.store.list(`runner`);return{online:1+n.filter(({value:e})=>e.lastSeen!==void 0&&t-e.lastSeen<3e5).length,total:1+n.length}}async function Qr(e){let t=(e.now??Date.now)(),n=e.healthyAt!==void 0&&t-e.healthyAt<5e3,r=n||await $r(e);return e.healthyAt=r?n?e.healthyAt:t:void 0,w({ok:r},r?200:503,{"cache-control":`no-store`})}async function $r(e){return e.config.store===`postgres`?e.databaseHealth?e.databaseHealth().then(()=>!0,()=>!1):!1:!0}async function ei(e){let t=(e.now??Date.now)();if(!e.local)return{...await e.queue.metrics(e.organizationId,t-864e5),runnersOnline:(await Zr(e)).online,requests:e.limits?.requests??0,rateLimitRejections:e.limits?.rejections??0};let n=await e.queue.list(e.organizationId),r=e.local?[...O(e.local.cwd,!1),...O(e.local.cwd,!0)]:[],i=new Map([...r,...n.map(e=>e.status===`queued`?e:r.find(t=>t.task.id===e.task.id)??e)].map(e=>[e.task.id,e])),a={queued:0,running:0,waiting:0,completed:0,failed:0,cancelled:0},o=0;for(let e of i.values())e.createdAt>=t-864e5&&a[e.status]++,e.status===`queued`&&o++;return{tasks:a,queueDepth:o,runnersOnline:(await Zr(e)).online,requests:e.limits?.requests??0,rateLimitRejections:e.limits?.rejections??0}}const ti=Ur(Wr),ni=Ur(Gr);async function ri(e,t,n){return w(await t.store.listHistory(n.id))}async function ii(e,t,n){let r=await t.store.get(`history`,`${n.id}:${n.conversation}`);if(!r)return w({error:`No saved history`},404);try{return w({engine:r.engine,conversation:r.conversation,data:B(t.config,r.data),...r.state?{state:B(t.config,r.state)}:{}})}catch(e){return console.error(`coder server: history ${n.id}/${n.conversation} could not be decrypted`,e),w({error:`The saved history cannot be read`},422)}}async function ai(e,t,n){let r=await e.json().catch(()=>void 0);if(r?.engine!==`claude`&&r?.engine!==`codex`||typeof r.conversation!=`string`||!ae.test(r.conversation)||typeof r.data!=`string`||r.state!==void 0&&(!r.state||typeof r.state!=`object`||Array.isArray(r.state)))return w({error:`Invalid history`},400);let i;try{i=(await ti(Buffer.from(r.data,`base64`),{maxOutputLength:67108864})).toString(`utf8`)}catch{return w({error:`Invalid history`},400)}let a=await we(t,t.callbackTask,!0);return await t.store.put(`history`,`${n.id}:${r.conversation}`,{engine:r.engine,conversation:r.conversation,data:z(t.config,(await ni(a(i))).toString(`base64`)),...r.state?{state:z(t.config,JSON.parse(a(JSON.stringify(r.state))))}:{},savedAt:(t.now??Date.now)()}),w({ok:!0})}async function oi(e,t,n,r){let i=t.session.user.id;n.id;let a=(await e.json().catch(()=>({}))).engine??``;if(!di.has(a)||!t.config.subscriptions?.[a])return w({error:`Sign in with ${a||`that engine`} is off on this server.`},403);let o=t.runners[t.config.runner];if(!o||o.kind===`github-actions`)return w({error:`Sign-in cannot run on the ${t.config.runner} runner.`},409);let s=(await t.store.list(`login`)).find(({value:e})=>e.owner===i&&e.engine===a&&e.state!==`done`&&e.state!==`failed`&&e.expiresAt>J(t));if(s)return w(Y(s.id,s.value));let c=`login-${zr(12).toString(`base64url`)}`,l=rr(c,t.organizationId,0),u={owner:i,engine:a,state:`starting`,tokenHash:l.hash,runner:o.kind,createdAt:J(t),expiresAt:J(t)+ui};await fi(t,c,u);let d;try{let e=await o.start({id:c},{CODER_SERVER:t.config.publicUrl??``,CODER_TASK_TOKEN:l.token,CODER_LOGIN:a},void 0,{timeoutMs:ui,hosts:[vr[a].api,...vr[a].account]}),n=await t.store.patchLogin(c,{handle:e},{tokenHash:u.tokenHash});if(!n)return await o.stop(e).catch(()=>{}),w({error:`This sign-in is gone. Start again.`},409);d=n}catch(e){return await t.store.delete(`login`,c),w({error:e instanceof Error?e.message:String(e)},502)}return w(Y(c,d),201)}async function si(e,t,n,r){t.session.user.id;let i=n.id??``;if(!r.searchParams.has(`state`)){let e=i&&!i.includes(`/`)?await X(t,i):void 0;return e?w(Y(i,e)):w({error:`This sign-in is gone. Start again.`},404)}let a=await t.store.watch(`login`,i);try{let n=i&&!i.includes(`/`)?await X(t,i):void 0;if(!n)return w({error:`This sign-in is gone. Start again.`},404);let o=r.searchParams.get(`state`),s=Date.now()+25e3;for(;o&&n.state===o&&Date.now()<s&&!e.signal.aborted;)if(await a.wait(Math.min(1e4,s-Date.now()),e.signal),n=await X(t,i),!n)return w({error:`This sign-in is gone. Start again.`},404);return w(Y(i,n))}finally{a.close()}}async function ci(e,t,n,r){t.session.user.id;let i=n.id??``,a=i&&!i.includes(`/`)?await X(t,i):void 0;if(!a)return w({error:`This sign-in is gone. Start again.`},404);let o=await e.json().catch(()=>({})),s=typeof o.code==`string`?o.code.trim():``;return a.engine!==`claude`||a.state!==`open`||!s||!await t.store.patchLogin(i,{state:`verifying`,input:z(t.config,s)},{state:`open`,tokenHash:a.tokenHash})?w({error:`This sign-in is not waiting for a code.`},409):w({ok:!0})}async function li(e,t,n,r){t.session.user.id;let i=n.id??``,a=i&&!i.includes(`/`)?await X(t,i):void 0;return a?(await t.store.delete(`login`,i),a.handle&&await t.runners[a.runner]?.stop(a.handle).catch(()=>{}),w({ok:!0})):w({error:`This sign-in is gone. Start again.`},404)}const ui=6e5,di=new Set([`claude`,`codex`]),J=e=>(e.now??Date.now)();function fi(e,t,n){return e.store.put(`login`,t,n,{ttlMs:Math.max(1,n.expiresAt-J(e))})}function Y(e,t){return{id:e,engine:t.engine,state:t.state,expiresAt:t.expiresAt,...t.url?{url:t.url}:{},...t.code?{code:t.code}:{},...t.error?{error:t.error}:{}}}async function X(e,t){let n=await e.store.get(`login`,t);return n&&n.owner===e.session?.user.id?n:void 0}function pi(e,t){let n=t.handle&&e.runners[t.runner]?.stop(t.handle);if(!n)return;let r=n.catch(e=>console.error(`coder server: could not stop the machine of a finished ${t.engine} sign-in`,e));e.waitUntil?.(r)}async function mi(e,t,n,r){let i=n.id,a=await t.store.watch(`login`,i),o=Date.now()+25e3;try{for(;;){if(e.signal.aborted)return w({});let n=await t.store.get(`login`,i);if(!n||n.tokenHash!==t.callbackLogin.tokenHash)return new Response(`Unauthorized`,{status:401});if(n.input){let e=await t.store.patchLogin(i,{input:null},{input:n.input,tokenHash:n.tokenHash});return w(e?{code:B(t.config,n.input)}:{})}if(n.state===`verifying`||n.state===`done`||n.state===`failed`||Date.now()>=o)return w({});await a.wait(Math.min(1e4,o-Date.now()),e.signal)}}finally{a.close()}}async function hi(e,t,n,r){return w({engine:t.callbackLogin.engine})}async function gi(e,t,n,r){let i=n.id,a=t.callbackLogin,o=await e.json().catch(()=>({}));if(a.state===`done`||a.state===`failed`)return w({ok:!0});let s={state:[`starting`,`open`,`verifying`],tokenHash:a.tokenHash};if(typeof o.error==`string`)return await t.store.patchLogin(i,{state:`failed`,error:o.error.slice(0,500)},s)&&pi(t,a),w({ok:!0});let c=o.result?.env;if(c){let e=a.engine===`claude`?`CLAUDE_CODE_OAUTH_TOKEN`:`CODEX_AUTH_JSON`;if(Object.keys(c).join()!==e||typeof c[e]!=`string`)return w({error:`Invalid sign-in result`},400);let n=o.result?.account;return await t.store.completeLogin(i,a.tokenHash,{..._r(t.config,{env:c}),createdAt:(t.now??Date.now)(),...n?.email||n?.plan?{account:{...typeof n.email==`string`?{email:n.email}:{},...typeof n.plan==`string`?{plan:n.plan}:{}}}:{}})?(pi(t,a),w({ok:!0})):w({error:`This sign-in changed. Try again.`},409)}let l={...typeof o.url==`string`&&/^https:\/\//.test(o.url)?{url:o.url}:{},...typeof o.code==`string`?{code:o.code.slice(0,64)}:{}};return await t.store.patchLogin(i,l.url?{...l,state:`open`}:l,s)?w({ok:!0}):w({error:`This sign-in changed. Try again.`},409)}const _i=e=>`audit:${String(9999999999999-e).padStart(13,`0`)}:${zr(4).toString(`hex`)}`,vi=e=>e.config.name??`Wular`,Z=e=>Ht(e,e.serverOrganizationId??e.organizationId);async function yi(e,t,n){let r=(e.now??Date.now)(),i=e.session?.user,a={at:r,actor:i?{id:i.id,name:i.name,email:i.email}:{id:`admin-token`},action:t,target:n};await Z(e).store.put(`snapshot`,_i(r),a)}async function bi(e,t){let n=await Z(t).store.list(`app`),r=Object.values(t.integrations).filter(e=>e.app.shareable).map(e=>{let t=n.find(({value:t})=>t.builtin&&t.integration===e.id)?.value;return{integration:e.id,name:e.name,brand:e.brand,organizationApps:e.organizationApps===!0,...t?{app:{id:t.id,name:t.name,createdAt:t.createdAt}}:{}}}),i=t.config.publicUrl,a=!!i&&F.has(new URL(i).hostname);return w({name:vi(t),platforms:r,...a?{unreachable:!0}:{}})}async function xi(e,t,n){let r=t.integrations[n.integration];if(!r)return w({error:`Unknown integration "${n.integration}".`},404);if(!r.app.shareable)return w({error:`Create ${r.name} apps in your workspace from the agent's Platforms tab.`},400);if(!t.config.publicUrl)return w({error:`Set PUBLIC_URL on this server first. Platforms call it.`},400);let i=await e.json().catch(()=>void 0),a=e=>typeof e==`string`&&e.trim()||void 0,o=a(i?.name)??vi(t),s=r.organizationApps?a(i?.owner):void 0,c=await Rn(Z(t),r.id,{name:o,owner:s});return await yi(t,`Started setting up a shared app`,`${o} on ${r.name}`),w({url:c})}async function Si(e,t){let n=await Z(t).store.list(`snapshot`,{prefix:`audit:`,limit:100});return w(n.map(e=>e.value))}const Ci=e=>`create-finished:${S(e)}`;async function wi(e,t){let n=await e.store.get(`delivery`,Ci(t));return n&&`target`in n?n.target:void 0}async function Ti(e,t,n){let r=e.operatorApp??!1,i=r?`*`:e.session?.user.id??`anonymous`;if(!e.integrations[t])return{error:`Unknown integration "${t}"; run coder agent integrations list to see them`,status:404};if(!e.config.publicUrl)return{error:`PUBLIC_URL is not set on this server; set it to the address platforms should call and restart`,status:400};if(r&&!e.integrations[t].app.shareable)return{error:`Create this app in your workspace from the agent's Platforms tab.`,status:400};let a=Wt(n);if(!a)return{error:`Setup link is missing or malformed; start again from the agent's Platforms tab`,status:400};if(!a.definition.integrations[t])return{error:`This agent declares no ${t} integration in its agent.json`,status:400};if(a.state.public&&!r&&!e.integrations[t].publicApps)return{error:`${e.integrations[t].name} apps cannot be public here. Create a private one.`,status:400};let o=Hn(t,a.state),s=a.state.tx?await Te(e,a.state.tx,`create`,i)===o?a.state.tx:void 0:await ir(e,`create`,i,o);return s?{state:{...a.state,tx:s},definition:a.definition}:{error:`This app creation link is invalid, expired, or already used`,status:403}}async function Ei(e,t,n,r){let i=r.searchParams.get(`tx`);if(t.operatorApp&&i&&(await Te(t,i,`create`,`*`)||await wi(t,i)===n.id))return await on(e,t.dashboardHosts)??Sn();let a=new URLSearchParams(r.searchParams);return a.set(`create`,n.id),de(`${Bt(t)}${jn(rn(t),`/setup`)}?${a}`)}async function Di(e,t,n){let r=await Ti(e,t,n);if(`error`in r)return w({error:r.error},r.status);let{app:i}=e.integrations[t],a=r.state.tx,o=i.createStep&&(e.operatorApp||r.state.public)?i.createStep(e.config.publicUrl,{saved:await Et(e,t),name:r.definition.name,public:r.state.public}):void 0,s=e.config.publicUrl;if(i.createPost&&F.has(new URL(s).hostname))return w({error:`${e.integrations[t].name} cannot reach ${s}. Set a public address first.`},400);let c=e.operatorApp?void 0:Yn(e,r.state.agent),l=i.createPost?.({publicUrl:s,spec:Nt(r.definition,r.state.agent,t),state:se({tx:a,...c?{back:c}:{}}),...r.state.owner?{owner:r.state.owner}:{},...r.state.public?{public:!0}:{}});return w({tx:a,...l?{post:l}:{},...o?{create:o}:{}})}async function Oi(e,t,n,r){return Di(t,n.id,r.searchParams)}async function ki(e,t,n){let r=await e.json().catch(()=>void 0);return Di(t,n.integration,new URLSearchParams(r&&typeof r==`object`?r:{}))}async function Ai(e,t,n,r,i){let a=t.operatorApp??!1,o=a?`*`:t.session?.user.id??`anonymous`,s=t.integrations[n];if(!s)return L(t,`unknown-integration`,{platform:n},i);if(a&&!s.app.shareable)return w({error:`Create this app in your workspace from the agent's Platforms tab.`},400);let c=t.config.publicUrl;if(!c)return L(t,`no-public-url`,{},i);let l=r?await Zt(t,r,n,o):void 0;if(!l)return L(t,`create-expired`,{platform:n},i);a&&await t.store.put(`delivery`,Ci(r),{at:t.now?.()??Date.now(),target:n},{ttlMs:6e5});let u=a?`/create/${n}`:Yn(t,l.state.agent),d=a?{tx:r}:{},f=a?void 0:(await cn(t)).find(e=>e.integration===n),p=await s.app.createCallback(e,{publicUrl:c,spec:Nt(l.definition,l.state.agent,n),fetch:t.fetch??fetch,tokens:Ve(t,n),...f?{shared:B(t.config,f.credentials)}:{}}).catch(r=>r instanceof C&&r.code===`invalid-field`&&e.headers.get(`accept`)===`application/json`?w({error:r.message},400):r instanceof C?L(t,r.code,{platform:n,error:r.error,...d},u):(console.error(`coder server: creating the ${n} app failed`,r),L(t,`failed`,{platform:n,...d},u)));if(p instanceof Response)return p;let m={id:`${n}:${p.platformAppId}`,integration:n,agent:l.state.agent,name:p.name,...l.state.repo?{agentsRepo:l.state.repo}:{},...l.state.repo?{branch:l.state.branch??`main`}:{},...a?{builtin:!0}:{},...`shared`in p?{shared:f.id,credentials:``}:{credentials:z(t.config,p.credentials)},createdAt:t.now?.()??Date.now()};if(await t.store.put(`app`,m.id,m),s.app.values&&await t.store.put(`delivery`,Ue(m.id),{version:0,manifest:s.app.values(m,{publicUrl:c,spec:Nt(l.definition,m.agent,n)}).lines,changed:!1}),a)return await yi(t,`Created the shared app`,`${p.name} on ${s.name}`),L(t,`created`,{platform:n,app:p.name,...d},u);let h=await ir(t,`install`,o,m.id);return de(`${c}/install/${n}?app=${encodeURIComponent(m.id)}&state=${se({tx:h,back:u})}`)}async function ji(e,t,n,r){let i=fe(r.searchParams.get(`state`));return Ai(e,t,n.id,i?.tx,Dn(i?.back))}async function Mi(e,t,n,r){let i=new URLSearchParams(await e.clone().text()).get(`tx`),a=await Ai(e,t,n.id,i,void 0),o=a.headers.get(`location`);return o&&e.headers.get(`accept`)===`application/json`?w({url:o}):a}async function Ni(e,t,n,r){if(t.source!==`repo`||!t.repo)return;let i=(await(r??e.store.list(`app`))).find(({value:e})=>e.agent===t.id&&e.agentsRepo===t.repo)?.value;return((i&&e.integrations[i.integration])??Object.values(e.integrations).find(e=>e.repos))?.repos?.url(t.repo,t.path,i?.branch??n?.commit)}async function Pi(e,t,n){return x()[t]&&await Dr(e,n),kr(e.store,t)}async function Q(e,t){let n=(e.now??Date.now)();(!t||x()[t])&&await Dr(e,n);let r=e.local?await Or(e.store,e.local.cwd,e.integrations,t).catch(()=>void 0):void 0;return{now:n,local:r,loadCurrent:()=>r?Promise.resolve(r.find(({record:e})=>e.id===t)??{}):Pi(e,t,n)}}async function Fi(e,t,{after:n,q:r,source:i,platform:a,limit:o}){return t?(t??[]).filter(({version:e})=>!a||!!e?.definition?.integrations?.[a]).map(({record:e})=>e).filter(e=>(!n||H(e)>n)&&(!i||e.source===i)&&(!r||[e.id,e.name,e.description,e.repo].some(e=>e?.toLowerCase().includes(r)))).sort((e,t)=>H(e)<H(t)?-1:1).slice(0,o):(await e.store.listAgentSummaries({after:n,q:r,source:i,platform:a,limit:o})).map(({record:e})=>e)}async function Ii(e,t,n,r){let i=r.searchParams.get(`fields`);if(i&&![`id`,`id,name`].includes(i))return w({error:`Invalid fields`},400);let{local:a}=await Q(t);if(!a&&E(r)&&!i)return w(await Vi(t,r));let o=T(r,200);if(i){let e=await Fi(t,a,{after:le(r),q:r.searchParams.get(`q`)?.trim().toLowerCase(),source:Bi[r.searchParams.get(`type`)??``],platform:r.searchParams.get(`platform`)??void 0,limit:o+ +!!E(r)}),n=e=>i===`id`?{id:e.id}:{id:e.id,name:e.name},s=he(e,o,H);return w(E(r)?{...s,items:s.items.map(n)}:e.map(n))}let s=a??await t.store.listAgentSummaries({limit:o});if(E(r))return w(await Vi(t,r,s));let c,l=v();return w(await Promise.all(s.slice(0,o).map(async({record:e,version:n})=>{e.source===`repo`&&e.repo&&(c??=t.store.list(`app`));let r=await Ni(t,e,n,c);return{...e,problems:jr(e,n,t.integrations),...e.id===l?{default:!0}:{},definition:n?.definition,...r?{sourceUrl:r}:{}}})))}async function Li(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),c=T(r,10,50),l=le(r),[u,d]=await Promise.all([o?s().then(e=>e.record):U(t.store,i),o?Promise.resolve(o.flatMap(({version:e})=>e?[{value:e}]:[])):t.store.listVersions(i,c+1,l)]);return u?w(await Hi(t,u,c,l??u.currentVersion+1,d)):w({error:`No agent named "${i}"`},404)}async function Ri(e,t,n,r){let i=n.slug,a=n.version?Number(n.version):void 0;if(n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return ce();let{now:o,local:s,loadCurrent:c}=await Q(t,i),l=s?s.find(({version:e})=>e?.version===a)?.version:await V(t.store,i,a);return l?w(l):w({error:`No version ${a} for agent "${i}"`},404)}async function zi(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),c=r.searchParams.get(`versions`)!==`0`,l=r.searchParams.get(`content`)!==`0`,u=r.searchParams.get(`handles`)===`1`,d=t.session?.user.id,[{record:f,version:p},m,h,g]=await Promise.all([!l&&!o?t.store.listAgentSummaries({slug:i}).then(e=>e[0]??{}):s(),c?o?o.flatMap(({version:e})=>e?[{value:e}]:[]):t.store.listVersions(i):[],u?Qe(t,i):[],u?en(t.store,i):void 0]);if(!f)return w({error:`No agent named "${i}"`},404);let _=u?await gn(t,{engine:f.settings?.engine??p?.definition.engine,model:f.settings?.model??p?.definition.model},d):void 0,v=p?.definition.integrations??{},y=e=>{let t=v[e]?.events;return Array.isArray(t)?t.includes(`mention`):!!(t&&`mention`in t)},b=[],x=Object.keys(t.integrations),ee=(e,t)=>x.indexOf(e.value.integration)-x.indexOf(t.value.integration);for(let{value:e}of[...h].sort(ee))y(e.integration)&&!b.some(t=>t.integration===e.integration&&t.name.toLowerCase()===e.name.toLowerCase())&&b.push({name:e.name,integration:e.integration,platform:t.integrations[e.integration]?.name??e.integration});let te=m.map(({value:e})=>{let{systemPrompt:t,files:n,...r}=e;return r}),S=await Ni(t,f,p);return w({...f,problems:jr(f,p,t.integrations),...p?{definition:p.definition,...l&&`systemPrompt`in p?{systemPrompt:p.systemPrompt,...p.files?{files:p.files}:{}}:{}}:{},...S?{sourceUrl:S}:{},...c?{versions:te}:{},...b.length?{handles:b}:{},...g?.failed?{deliveries:{failed:g.failed,recent:g.recent.map(e=>({at:e.at,platform:t.integrations[e.integration]?.name??e.integration,...e.type?{type:e.type}:{},error:e.error,...e.url?{url:e.url}:{}}))}}:{},..._?{..._.usable?{}:{needsModel:!0}}:{}})}const Bi={builtin:`builtin`,dashboard:`upload`,repository:`repo`};async function Vi(e,t,n){let r=T(t,24,100),i=le(t),a=t.searchParams.get(`q`)?.trim().toLowerCase(),o=Bi[t.searchParams.get(`type`)??``],s=t.searchParams.get(`platform`),c=t.searchParams.get(`connect`)===`1`,l=e.serverOrganizationId,u=e.store.list(`app`),[d,f,p,m]=await Promise.all([u,e.store.list(`installation`),c&&l!==void 0&&l!==e.organizationId&&e.scope?e.scope(l).store.list(`app`):[],n?n.filter(({record:e})=>(!i||H(e)>i)&&(!o||e.source===o)&&(!a||[e.id,e.name,e.description,e.repo].some(e=>e?.toLowerCase().includes(a)))).sort((e,t)=>H(e.record)<H(t.record)?-1:1):e.store.listAgentSummaries({after:i,source:o,q:a,platform:s??void 0,limit:r+1})]),h=new Set(f.filter(({value:e})=>!e.deletedAt&&!e.uninstalled).map(({value:e})=>e.app)),g=(e,t)=>{let n=d.filter(({value:n})=>n.agent===e&&n.integration===t);return n.length?n.some(({value:e})=>h.has(e.id))?`installed`:`created`:`none`},_=[];for(let{record:e,version:t}of m){let n=Object.keys(t?.definition?.integrations??{}).sort();if(!(s&&!n.includes(s))&&(_.push({record:e,version:t,ids:n}),_.length>r))break}let y=he(_,r,e=>H(e.record)),b=v();return{...y,...c?{connectable:[...d,...p].filter(({value:t})=>t.builtin&&e.integrations[t.integration]?.app.shareable&&!h.has(t.id)).map(({value:e})=>({id:e.id,integration:e.integration,agent:e.agent}))}:{},items:await Promise.all(y.items.map(async({record:t,version:n,ids:r})=>{let i=await Ni(e,t,n,u);return{...t,problems:jr(t,n,e.integrations),...t.id===b?{default:!0}:{},definition:n?.definition,...i?{sourceUrl:i}:{},platforms:r.map(e=>({id:e,state:g(t.id,e)}))}}))}}async function Hi(e,t,n,r,i){let a=(i??await e.store.listVersions(t.id,n+1,r)).map(({value:e})=>{let{systemPrompt:t,files:n,definition:r,...i}=e;return i}).filter(e=>e.version<r).reverse();return he(a,n,e=>e.version)}var Ui=class{options;entries=new Map;pending=new Map;constructor(e){this.options=e}async get(e,t){let n=this.options.now??Date.now,r=n(),i=this.entries.get(e);if(i&&r-i.at<this.options.ttlMs)return i.value;let a=this.pending.get(e);return a||(a=Promise.resolve().then(t).then(t=>{if(t===void 0)return i?.value;if(this.options.accept&&!this.options.accept(t))return i?.value??t;this.entries.set(e,{value:t,at:n()});let r=this.entries.keys().next().value;return this.entries.size>this.options.max&&r!==void 0&&this.entries.delete(r),t}).catch(t=>(console.error(`coder server: model probe failed for ${e}`,t),i?.value)).finally(()=>this.pending.delete(e)),this.pending.set(e,a)),a}};const Wi=/^[a-z0-9][a-z0-9-]*$/,Gi=new Set([`openrouter.ai`,`ai-gateway.vercel.sh`,`api.groq.com`,`api.together.xyz`]);function Ki(e){return{builtin:{codex:s,claude:n},models:e.models??{}}}async function qi(e,t){let{baseUrl:n,envKey:r,key:i}=await xt(e);if(!n||!/^https?:\/\//.test(n)||!URL.canParse(n))return w({error:`An http or https base URL is required`},400);let a=!i&&r&&await Ji(t,n,r)?await ar(t,r):void 0,o=i||a,s=t.settings??={},c=s.probes??=new Ui({ttlMs:6e5,max:100,now:t.now,accept:e=>e.reachable}),l=`${new URL(n).host}|${r??``}|${S(String(o??``))}`;return w(await c.get(l,()=>oe({baseUrl:n},{key:o,fetch:t.fetch})))}async function Ji(e,t,n){let r=new URL(t).host;if(Gi.has(r))return!0;let i=(await Dt(e)).models??{};return Object.values(i).some(e=>`baseUrl`in e&&e.envKey===n&&new URL(e.baseUrl).host===r)}async function Yi(e,t,n,r){return w(Ki(await Dt(t)))}async function Xi(e,t,n,r){let{name:i=``,...a}=await xt(e);return!Wi.test(i)||c(i)?w({error:`Invalid model name "${i}"`},400):k(t,e=>{if(e.models?.[i])throw new M(`"${i}" already exists`);e.models={...e.models,[i]:a}})}async function Zi(e,t,n,r){let i=n.name;return k(t,e=>{if(!e.models?.[i])throw new M(`No model "${i}"`);u(e,i)})}async function Qi(e,t,i,a){let c=i.name,{spec:u}=await xt(e);return k(t,e=>{if(!Wi.test(c))throw new M(`Invalid alias name "${c}"`);let t=e.models?.[c];if(t&&l(t))throw new M(`"${c}" is a custom model name`);let i=o(u,m(e));if(!i?.model||i.engine===`custom`)throw new M(`"${u}" does not name a codex or claude model`);let a=i.engine===`claude`?n:s,d=u.split(`:`).some(e=>f.has(e)||r.has(e));e.models={...e.models,[c]:{provider:i.engine,model:a[i.model]??i.model,...d&&i.effort?{effort:i.effort}:{}}}})}async function $i(e,t,n,r){let i=n.name;return k(t,e=>{let t=e.models??={},n=t[i];n&&(l(n)||a(n))?n.disabled=!0:t[i]={disabled:!0}})}async function ea(e,t,n,r){let i=n.name;return k(t,e=>{let t=e.models??={},n=t[i];n&&(l(n)||a(n))?delete n.disabled:delete t[i]})}async function ta(e,t){let{now:n,local:r}=await Q(t),[i,a,o]=await Promise.all([Fi(t,r,{limit:200}),Dt(t),t.store.list(`runner`)]),s=v(),c=i.filter(e=>!e.settings?.disabled).sort((e,t)=>Number(t.id===s)-Number(e.id===s)).map(({id:e,name:t})=>({id:e,name:t,...e===s?{default:!0}:{}})),l=We(t,a),u=Object.values(t.integrations).find(e=>e.repos);return w({agents:c,...l.chain?.[0]?{engine:l.chain[0]}:{},engines:l.engines??{},models:Ki(a),runners:yn(t,o,n).map(({id:e,name:t,default:n})=>({id:e,name:t,default:n})),flows:re(ie(),`builtin`).map(e=>e.name),...t.local?{folders:ot(t.local.cwd)}:{},...u?{connectLabel:u.installLabel??`Connect ${u.id}`}:{}})}async function na(e,t){let n=(await e.store.list(`installation`)).filter(({value:t})=>!t.deletedAt&&e.integrations[t.integration]?.repos),r=new Map((await _t(e.store,n.map(({value:e})=>e.app))).map(({id:e,value:t})=>[e,t]));for(let{value:i}of n){let n=e.integrations[i.integration];if(i.deletedAt||!n?.repos)continue;let a=r.get(i.app);if(!(!a||a.integration!==n.id))try{let r=await vt(e,n,i,B(e.config,a.credentials));if(i.repos?.includes(t)||(await n.repos.list(Le(e,i),r)).includes(t))return{contents:n,token:r,app:a,installation:i}}catch(e){console.error(`coder server: repository access for ${i.id} failed`,e)}}}async function ra(e,t,n){let r=await na(e,t);if(!r)return w({error:`No installed app can read ${t}`},400);let i=await r.contents.repos.listDir(t,Ie,r.token,n).catch(()=>[]),a=await Promise.all(i.map(async i=>{let a=await r.contents.repos.readFile(t,`${Ie}/${i}/agent.json`,r.token,n).catch(()=>void 0);if(a===void 0)return;let o={};try{let e=JSON.parse(a);e&&typeof e==`object`&&(o=e)}catch{}let s=Object.entries(o.mcp&&typeof o.mcp==`object`&&!Array.isArray(o.mcp)?o.mcp:{}).flatMap(([e,t])=>p(e,t)),c=await U(e.store,i),l=c?.source===`repo`&&c.repo===t,u=l?await V(e.store,i):void 0;return{id:i,name:typeof o.name==`string`?o.name:i,...s.length?{warnings:s}:{},...typeof o.description==`string`?{description:o.description}:{},...l?{version:c.currentVersion,...u?.source?{commit:u.source.commit}:{}}:{},...c&&!l?{taken:!0}:{}}}));return w({repo:t,agents:a.filter(Boolean)})}async function ia(e,t,n,r){let i=r.searchParams.get(`repo`);return i?ra(t,i,r.searchParams.get(`ref`)||`HEAD`):w({error:`repo is required`},400)}async function aa(e,t,n,r){let i=await e.json().catch(()=>void 0),a=i?.agents;if(typeof i?.repo!=`string`||i.ref!==void 0&&typeof i.ref!=`string`||a!==void 0&&!(Array.isArray(a)&&a.every(e=>typeof e==`string`)))return w({error:`repo is required, ref must be a string and agents a list of ids`},400);try{let e=await na(t,i.repo);if(!e)return w({error:`No installed app can read ${i.repo}`},400);let n=i.ref??`HEAD`,r=a??await e.contents.repos.listDir(i.repo,`.coder/agents`,e.token,n);for(let e of r){let n=await U(t.store,e);if(n&&(n.source!==`repo`||n.repo!==i.repo))return w({error:`Agent id "${e}" is already taken`},409)}let o=await gt(t.store,e.contents,i.repo,n,e.token,(t.now??Date.now)(),{slugs:r});return await In(t,o),w({imported:o.map(e=>e.agent)})}catch(e){return w({error:e instanceof Error?e.message:String(e)},400)}}function oa(e){if(!e||Array.isArray(e)||typeof e!=`object`)return!1;let t=Object.entries(e);if(t.length>100)return!1;let n=0;for(let[e,r]of t){if(typeof r!=`string`||e.startsWith(`/`)||e.includes(`\\`)||e.includes(`\0`)||e.split(`/`).includes(`..`)||e===`agent.json`||e===`system.md`)return!1;n+=Buffer.byteLength(e)+Buffer.byteLength(r)}return n<=262144}async function sa(e,t){return(await Pe(e,[t])).flatMap(({app:e,error:t,check:n})=>{let r={id:e.id,integration:e.integration,name:e.name};return t?[{...r,error:t}]:n?n.changed?[{...r,drift:!0}]:[]:[{...r,updated:!0}]})}async function ca(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),c=await e.json().catch(()=>void 0);try{let e=b({[i]:c})[i];if(!e||typeof e!=`object`)throw Error(`settings must be an object`);let{disabled:n,...r}=e,a=n?{...r,disabled:n}:r,{record:o,version:l}=await s();if(!o||!l)throw Error(`No agent named "${i}".`);if(wr({...o,settings:void 0},l,r,t.integrations),t.local){let e=y(t.local.cwd,i,!!n);return e?w({error:`Agent "${i}" is ${n?`enabled`:`disabled`} by agents.${i} in ${e}. Change it there.`},409):(await wt(t,e=>{e.agents={...e.agents,[i]:a}}),await Or(t.store,t.local.cwd,t.integrations),w(await U(t.store,i)))}return w(await Tr(t.store,i,a,(t.now??Date.now)()))}catch(e){return w({error:e instanceof Error?e.message:String(e)},400)}}async function la(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),{record:c}=await s();return c?c.source===`builtin`?w({error:`Built-in agents cannot be deleted.`},400):t.local&&!await Ar(t.local.cwd,t.integrations,i)?w({error:`Delete .coder/agents/${i} in the repo`},409):(await t.store.delete(`agent`,i),w({ok:!0})):w({error:`No agent named "${i}"`},404)}async function ua(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),c=await e.json().catch(()=>void 0);if(!c||typeof c.systemPrompt!=`string`||c.files!==void 0&&!oa(c.files)||c.name!==void 0&&typeof c.name!=`string`||c.description!==void 0&&typeof c.description!=`string`)return w({error:`definition and systemPrompt are required; files must contain strings`},400);try{te([i]);let[e]=ee({definitions:{[i]:{json:c.definition,builtin:!1}},usage:void 0},t.integrations);if(!e)throw Error(`No agent named "${i}".`);let n=t.local?await U(t.store,i):void 0,r=t.local&&n?await V(t.store,i):void 0,a=c.files;t.local&&(await Er(t.local.cwd,t.integrations,i,{definition:{...c.definition,...c.name===void 0?{}:{name:c.name},...c.description===void 0?{}:{description:c.description}},systemPrompt:c.systemPrompt,...a?{files:a}:{}}),await Or(t.store,t.local.cwd,t.integrations));let o=t.local?void 0:await Mr(t.store,{id:i,name:c.name??e.name,description:c.description??e.definition.description,source:`upload`,definition:e.definition,systemPrompt:c.systemPrompt,files:a,importedFrom:`upload`},(t.now??Date.now)()),s=o?.version??await V(t.store,i),l=o?.unchanged??Hr(r&&{...r,createdAt:0},{...s,createdAt:0}),u=await sa(t,s),d=o?.record??await U(t.store,i);return w({...d,definition:s.definition,version:s.version,unchanged:l,apps:u})}catch(e){return w({error:e instanceof Error?e.message:String(e)},400)}}async function da(e,t,n,r){let i=n.id,a=Number(r.searchParams.get(`after`)??-1),o=Number.isFinite(a)?a:-1;r.searchParams.has(`limit`)&&T(r,500,2e3);let s=await t.store.get(`task`,i);if(!s||t.local&&s.handle?.startsWith(`cli:`)&&s.task.flow==="default"){let n=s?.task.cwd??t.local?.cwd;if(!n||!it(n,i,!1))return w({error:`No task "${i}"`},404);{let r=Number(e.headers.get(`last-event-id`)??o);return ya(e,t,`cli:${n}:${i}`,Number.isFinite(r)?r:o,async e=>{let t=it(n,i);if(t)return{status:t,lines:$e(n,i,e,500),pendingResult:fa(n,t,!t.result)}})}}let c=Number(e.headers.get(`last-event-id`)??o),l=t.statementTimeout??((e,t)=>t());return ya(e,t,i,Number.isFinite(c)?c:o,e=>l(_a,async()=>{let n=await t.store.get(`task`,i);if(n)return{status:await Mt(t,n),lines:await ft(t.store,i,e,500)}}))}function fa(e,n,r=!1){if(!At.has(n.status)||n.error||n.status===`cancelled`)return!1;let a=t(e,n.task.id),o=Date.parse(a?.resumedAt??a?.createdAt??``)||0;return r||(Ir.statSync(W.join(i(e,n.task.id),`result.json`),{throwIfNoEntry:!1})?.mtimeMs??0)<o}const pa=1e3,$=3e4;function ma(e,t,n,r){let i=[...new Set((r.searchParams.get(`tasks`)??``).split(`,`).filter(Boolean))].slice(0,100),a=Date.now(),o=t.taskWatcher??new ga,s=o.tag(t),[c,l]=(e.headers.get(`last-event-id`)??``).split(`-`),u=Number(c),d=u>0&&`-${l}`===s,f=d?Math.min(Math.max(u,a-29e4),a):a,p=u>0&&(!d||u<f)?`event: reset
|
|
2
|
+
data: {}
|
|
3
|
+
|
|
4
|
+
`:``,m=new TextEncoder,h=()=>{},g=new ReadableStream({start(n){n.enqueue(m.encode(`retry: ${pa}\nid: ${f}${s}\n\n${p}`)),h=o.watch(t,i,f,e=>n.enqueue(m.encode(e)),()=>n.close());let r=()=>{h();try{n.close()}catch{}};e.signal.aborted?r():e.signal.addEventListener(`abort`,r)},cancel(){h()}});return new Response(g,{headers:{"content-type":`text/event-stream; charset=utf-8`,"cache-control":`no-cache, no-transform`}})}function ha(e,t){let{task:n,approval:r,archivedAt:i,createdAt:a,startedAt:o,finishedAt:s}=e;return{id:n.id,agent:n.agent,status:e.status,approval:r??null,approvals:e.approvals??n.context?.approvals??null,archivedAt:e.autoArchived&&!t?void 0:i,createdAt:a,startedAt:o,finishedAt:s,...sn(e),...t?{result:e.result??null,error:e.error??null,answer:e.answer??null}:{}}}var ga=class{options;watches=new Set;timer;counts=new Map;runners=new Map;reading=!1;closed=!1;last=Date.now();scans=new Map;left=new Map;archived=new Map;reads=0;generation=Br().slice(0,8);constructor(e={}){this.options=e}watch(e,t,n,r,i){if(this.closed)return queueMicrotask(i),()=>{};let a=Date.now();this.watches.size||(this.last=a);let o={ctx:e,ids:new Set(t),sent:new Map,gone:new Set,from:n,fresh:!0,runners:``,tag:this.tag(e),beat:a,marked:a,until:a+(this.options.lifeMs??29e4),send:r,close:i};return this.watches.add(o),this.timer||(this.timer=setInterval(()=>this.tick(),this.options.pollMs??1e3),this.timer.unref?.()),this.tick(),()=>this.drop(o)}tag(e){return`-${Rr(`sha256`).update(e.organizationId).digest(`hex`).slice(0,8)}${e.queue instanceof qt?`.${this.generation}`:``}`}runnersChanged(e){this.runners.delete(e)}close(){this.closed=!0;for(let e of[...this.watches]){this.drop(e);try{e.close()}catch{}}}drop(e){this.watches.delete(e)&&([...this.watches].some(t=>t.ctx.organizationId===e.ctx.organizationId)||(this.counts.delete(e.ctx.organizationId),this.runners.delete(e.ctx.organizationId)),this.watches.size||(clearInterval(this.timer),this.timer=void 0,this.counts.clear(),this.runners.clear()))}tick(){let e=Date.now();for(let t of[...this.watches])if(e>=t.until){this.drop(t);try{t.close()}catch{}}else e-t.beat>=(this.options.heartbeatMs??2e4)&&(t.beat=e,this.send(t,`: ping
|
|
5
|
+
|
|
6
|
+
`));this.reading||!this.watches.size||(this.reading=!0,this.read(e).finally(()=>this.reading=!1))}send(e,t){try{e.send(t)}catch{this.drop(e)}}async read(e){let t=[...this.watches],n=new Map;for(let e of t){let t=n.get(e.ctx.organizationId)??{ctx:e.ctx,ids:new Set};for(let n of e.ids)t.ids.add(n);n.set(e.ctx.organizationId,t)}let r=Math.min(this.last,...t.flatMap(e=>e.fresh?[e.from]:[]));this.reads++;let i=await this.changes(n,r-$,e).catch(e=>{console.error(`coder server: task events failed`,e)});if(i){this.last=e;try{for(let[e,{ctx:t}]of n){let n=this.counts.get(e),r=JSON.stringify([[...i.rows.get(e)??[]].map(([e,t])=>[e,t.status,t.archivedAt]).sort(),[...i.deleted.get(e)?.keys()??[]].sort()]),a=n?.fingerprint!==r,o=t.local?[...i.rows.get(e)?.values()??[]].filter(e=>!e.archivedAt&&[`queued`,`running`,`waiting`].includes(e.status)).length:a?(await t.queue.counts(e,{archived:!1,statuses:[`queued`,`running`,`waiting`]})).active:n.active;[...this.watches].some(t=>t.ctx.organizationId===e)&&this.counts.set(e,{active:o,fingerprint:r})}}catch(e){console.error(`coder server: task counts failed`,e);return}await Promise.all([...n].filter(([t])=>e-(this.runners.get(t)?.at??-1/0)>=15e3).map(async([t,{ctx:n}])=>{let r=this.runners.get(t),i={at:e,records:r?.records??[]};this.runners.set(t,i);try{let e=await n.store.list(`runner`);this.runners.get(t)===i&&(i.records=e)}catch(e){this.runners.get(t)===i&&(r?this.runners.set(t,r):this.runners.delete(t)),console.error(`coder server: runner events failed`,e)}}));for(let n of t){if(!this.watches.has(n))continue;let t=[];try{t=this.news(n,i,e);let r=this.counts.get(n.ctx.organizationId)?.active;r!==void 0&&r!==n.active&&(n.active=r,t.push(`id: ${e}${n.tag}\nevent: counts\ndata: ${JSON.stringify({active:r})}\n\n`)),t.push(...this.runnerNews(n,e))}catch{}!t.length&&e-n.marked>=(this.options.heartbeatMs??2e4)&&t.push(`id: ${e}${n.tag}\n\n`),t.length&&(n.marked=e,this.send(n,t.join(``)))}}}runnerNews(e,t){let n=this.runners.get(e.ctx.organizationId);if(!n)return[];let r=yn(e.ctx,n.records,t),i=JSON.stringify(r.map(({lastSeen:e,...t})=>t.online?t:{...t,lastSeen:e})),a=e.runners;return e.runners=i,a===i?[]:[`id: ${t}${e.tag}\nevent: runners\ndata: ${JSON.stringify({items:r})}\n\n`]}async changes(e,n,r){let i=await[...e.values()][0].ctx.queue.changes([...e].map(([e,t])=>({organizationId:e,ids:[...t.ids]})),n),a=new Map;for(let{organizationId:e,status:t}of i.rows){let n=a.get(e)??new Map;a.set(e,n.set(t.task.id,t))}let o=new Map;for(let{organizationId:e,id:t,at:n}of i.deleted){let r=o.get(e)??new Map;o.set(e,r.set(t,n))}for(let[n,{ctx:i}]of e){if(!i.local)continue;let e=[...a.get(n)?.values()??[]],o=this.scans.get(i.local.cwd);if(!o||r-o.at>=(this.options.localScanMs??4e3)||e.some(e=>e.updatedAt>o.at)){let e=!o||r-o.archivedAt>=(this.options.archiveScanMs??15e3);await mr(i,i.local.cwd);let n=e?O(i.local.cwd,!0):o.archived,a=O(i.local.cwd,!1),s=new Set(a.map(e=>e.task.id)),c=[...a,...n.filter(e=>!s.has(e.task.id))],l=new Set(c.map(e=>e.task.id)),u=this.left.get(i.local.cwd)??new Map;for(let e of o?.rows??[])l.has(e.task.id)||u.set(e.task.id,o.at);for(let[e,t]of u)(t<r-6e5||l.has(e))&&u.delete(e);let d=this.archived.get(i.local.cwd)??new Set;for(let e of d)l.has(e)?d.delete(e):t(i.local.cwd,e)||(u.set(e,o?.at??r),d.delete(e));this.left.set(i.local.cwd,u),this.scans.set(i.local.cwd,o={at:r,rows:c,archived:n,archivedAt:e?r:o.archivedAt})}a.set(n,new Map(ln(i.local.cwd,o.rows,e).map(e=>[e.task.id,e])))}return{rows:a,deleted:o}}news(e,{rows:t,deleted:n},r){let{ctx:i}=e,a=t.get(i.organizationId)??new Map,o=[],s=(t,n)=>{let i=JSON.stringify(n);e.sent.get(t)!==i&&(e.sent.set(t,i),o.push(`id: ${r}${e.tag}\nevent: task\ndata: ${i}\n\n`))},c=e=>({id:e,deleted:!0}),l=t=>{let n=i.local&&it(i.local.cwd,t,e.ids.has(t));if(s(t,n?ha(n,e.ids.has(t)):c(t)),e.gone.add(t),n&&i.local){let e=this.archived.get(i.local.cwd)??new Set;this.archived.set(i.local.cwd,e.add(t))}};for(let[t,n]of a){let a=e.ids.has(t);e.gone.delete(t);let o=ha(a&&i.local&&n.local&&At.has(n.status)?it(i.local.cwd,t)??n:n,a);if(i.local&&n.local&&e.sent.get(t)!==JSON.stringify(o)&&r-(n.finishedAt??0)<$&&fa(i.local.cwd,n)){e.sent.has(t)||e.sent.set(t,``);continue}a||i.local&&!e.fresh||n.updatedAt>e.from-$?s(t,o):e.fresh&&e.sent.set(t,JSON.stringify(o))}for(let t of e.ids)a.has(t)||l(t);for(let[t,r]of n.get(i.organizationId)??[])r>e.from-$&&s(t,c(t));if(i.local){for(let t of e.sent.keys())!a.has(t)&&!e.ids.has(t)&&!e.gone.has(t)&&l(t);for(let[t,n]of this.left.get(i.local.cwd)??[])n>e.from-$&&!a.has(t)&&e.sent.get(t)!==JSON.stringify(c(t))&&l(t)}return e.fresh=!1,e.from=r,o}};const _a=1e4;var va=class{options;feeds=new Map;closed=!1;reads=0;constructor(e={}){this.options=e}watch(e,t,n,r,i){if(this.closed)return queueMicrotask(i),()=>{};let a=this.feeds.get(e),o=a?.reading!==void 0&&Date.now()-a.reading>=(this.options.stallMs??1e4);if(!a||o){let t={key:e,read:n,watches:new Set,head:1/0};if(a){clearTimeout(a.timer);for(let e of a.watches)t.watches.add(Object.assign(e,{feed:t}));a.watches.clear()}this.feeds.set(e,a=t)}let s={cursor:t,feed:a,timers:[],send:r,close:i};s.timers=[setTimeout(()=>this.end(s),this.options.lifeMs??5e4),setInterval(()=>this.send(s,`: ping
|
|
7
|
+
|
|
8
|
+
`),this.options.heartbeatMs??2e4)];for(let e of s.timers)e.unref?.();return a.watches.add(s),a.reading===void 0&&t<a.head&&(clearTimeout(a.timer),this.read(a)),()=>this.drop(s)}close(){this.closed=!0;for(let e of[...this.feeds.values()])for(let t of[...e.watches])this.end(t)}drop(e){let{feed:t}=e;for(let t of e.timers)clearTimeout(t);!t.watches.delete(e)||t.watches.size||(clearTimeout(t.timer),this.feeds.get(t.key)===t&&this.feeds.delete(t.key))}end(e,t=``){try{t&&e.send(t),e.close()}catch{}this.drop(e)}send(e,t){try{e.send(t)}catch{this.drop(e)}}async read(e){if(e.timer=void 0,this.feeds.get(e.key)!==e||!e.watches.size)return;let t=[...e.watches],n=Math.min(...t.map(e=>e.cursor));e.reading=Date.now(),this.reads++;let r=await e.read(n).catch(e=>(console.error(`coder server: task log read failed`,e),null));if(e.reading=void 0,this.feeds.get(e.key)!==e)return;let i=t.filter(t=>e.watches.has(t)),a=i.length<e.watches.size?0:this.options.pollMs??1e3;if(r===void 0)for(let e of i)this.end(e);else if(r){let{status:t,lines:o,pendingLogs:s,pendingResult:c}=r,l=o.length===500,u=At.has(t.status)&&!l&&!s&&!c,d=o.map(e=>[e.seq,`id: ${e.seq}\nevent: log\ndata: ${JSON.stringify(e)}\n\n`]);e.head=Math.max(n,o.at(-1)?.seq??n),l&&(a=0);let f=t.status===`waiting`?t.approval:void 0;for(let e of i){let t=d.flatMap(([t,n])=>t>e.cursor?[n]:[]).join(``);!l&&!u&&!e.caught&&(e.caught=!0,t+=`event: caught-up
|
|
9
|
+
data: {}
|
|
10
|
+
|
|
11
|
+
`),!l&&f?.id&&e.approval!==f.id&&(e.approval=f.id,t+=`event: approval\ndata: ${JSON.stringify(f)}\n\n`),e.cursor=Math.max(e.cursor,o.at(-1)?.seq??-1),u?this.end(e,`${t}event: end\ndata: {}\n\n`):t&&this.send(e,t)}}this.feeds.get(e.key)===e&&(e.timer=setTimeout(()=>void this.read(e),a),e.timer.unref?.())}};function ya(e,t,n,r,i){let a=t.logWatcher??new va,o=new TextEncoder,s=()=>{},c=new ReadableStream({start(c){c.enqueue(o.encode(`retry: ${pa}\n\n`)),s=a.watch(`${t.organizationId}:${n}`,r,i,e=>c.enqueue(o.encode(e)),()=>c.close());let l=()=>{s();try{c.close()}catch{}};e.signal.aborted?l():e.signal.addEventListener(`abort`,l)},cancel(){s()}});return new Response(c,{headers:{"content-type":`text/event-stream; charset=utf-8`,"cache-control":`no-cache, no-transform`}})}const ba={npm:[`npx`,`-y`],pypi:[`uvx`],oci:[`docker`,`run`,`-i`,`--rm`]},xa=(e=[])=>e.map(({name:e,description:t,isRequired:n,isSecret:r,value:i,default:a})=>({name:e,...t?{description:t}:{},...i??a?{placeholder:i??a}:{},required:n===!0,secret:r===!0}));function Sa(e=[],t,n){return e.flatMap((e,r)=>{let i=`${t}:${r}`,a=Object.entries(e.variables??{}),o=e.value??e.default,s=(e,t,r)=>{let[i]=xa([{...r,name:e}]);return n.push({...i,label:t}),`{${e}}`};if(a.length)for(let[e,t]of a)o=o?.replaceAll(`{${e}}`,s(`${i}:${e}`,e,t));else o===void 0&&(e.valueHint||e.isRequired)&&(o=s(i,e.valueHint??e.name??i,e));return[...e.type===`named`&&e.name?[e.name]:[],...o===void 0?[]:[o]]})}function Ca(e){let t=e.remotes?.find(e=>e.type===`streamable-http`);if(t)return{type:`http`,url:t.url,env:[],headers:xa(t.headers)};let n=e.packages?.find(e=>ba[e.registryType]&&(e.transport?.type??`stdio`)===`stdio`);if(!n)return;let[r,...i]=ba[n.registryType],a=[],o=Sa(n.runtimeArguments,`runtime`,a),s=Sa(n.packageArguments,`package`,a);return{type:`stdio`,command:n.runtimeHint??r,args:[...!n.runtimeHint||n.runtimeHint===r?i:[],...o,n.identifier,...s],...a.length?{argumentInputs:a}:{},env:xa(n.environmentVariables),headers:[]}}function wa(e,t){let[n=``,r]=e.replace(/^v/,``).split(`+`)[0].split(/-(.*)/),[i=``,a]=t.replace(/^v/,``).split(`+`)[0].split(/-(.*)/),o=n.localeCompare(i,`en`,{numeric:!0});if(o)return o;if(r===void 0||a===void 0)return Number(r===void 0)-Number(a===void 0);let s=r.split(`.`),c=a.split(`.`);for(let e=0;e<Math.max(s.length,c.length);e++){let t=s[e],n=c[e];if(t===void 0||n===void 0)return Number(t!==void 0)-Number(n!==void 0);let r=/^\d+$/.test(t),i=/^\d+$/.test(n),a=r===i?t.localeCompare(n,`en`,{numeric:r}):Number(i)-Number(r);if(a)return a}return 0}var Ta=class{sources=[{url:`https://api.mcp.github.com/v0.1/servers`,curated:!0,rows:new Map,ready:!1,failed:!1},{url:`https://registry.modelcontextprotocol.io/v0.1/servers`,curated:!1,rows:new Map,ready:!1,failed:!1}];refreshAt=0;timer;controller;closed=!1;inFlight;response(e,t){if((e.now??Date.now)()>=this.refreshAt&&this.refresh(e),!this.inFlight&&this.sources.some(e=>e.failed)&&!this.sources.some(e=>[...e.rows.values()].some(e=>e.found)))return w({error:`The MCP registry did not answer. Try again.`},502);let n=t.trim().toLowerCase(),r=new Set,i=this.sources.flatMap(e=>[...e.rows].flatMap(([t,{found:i}],a)=>{if(r.has(t)||(r.add(t),!i))return[];let o=[i.name.split(`/`).pop(),i.title].map(e=>e.toLowerCase()),s=!n||o.includes(n)?0:o.some(e=>e.startsWith(n))?1:o.some(e=>e.includes(n))?2:i.description.toLowerCase().includes(n)?3:4;if(s===4)return[];let c=n&&i.verified&&s<3?0:1;return[{found:i,curated:e.curated,order:a,vendor:c,quality:s}]})),a=e=>Number(e===3);return i.sort((e,t)=>a(e.quality)-a(t.quality)||Number(t.curated)-Number(e.curated)||(e.curated?e.order-t.order:e.vendor-t.vendor||e.quality-t.quality||e.found.name.localeCompare(t.found.name))),w(i.slice(0,30).map(({found:e})=>e),200,this.sources.every(e=>e.ready)?{}:{partial:`true`})}refresh(e){if(this.inFlight||this.closed)return;this.timer&&clearTimeout(this.timer);let t=this.controller=new AbortController;this.inFlight=Promise.all(this.sources.map(n=>this.fill(e,n,t.signal))).then(()=>{}).finally(()=>{this.inFlight=void 0,this.refreshAt=(e.now??Date.now)()+36e5,this.closed||(this.timer=setTimeout(()=>this.refresh(e),36e5),this.timer.unref())}),e.waitUntil?.(this.inFlight)}async fill(e,t,n){let r=new Map,i=new Set,a;try{do{let o=new URLSearchParams({limit:`100`});a&&o.set(`cursor`,a);let s=await(e.fetch??fetch)(`${t.url}?${o}`,{headers:{accept:`application/json`},signal:AbortSignal.any([n,AbortSignal.timeout(2e4)])});if(!s.ok)throw Error(`Registry unavailable`);let{servers:c,metadata:l}=await s.json();for(let{server:e,_meta:n}of c){let i=n?.[`io.modelcontextprotocol.registry/official`]?.isLatest===!0,a=e.version??``,o=r.get(e.name);if(o&&(o.latest===i?wa(o.version,a)>=0:o.latest))continue;let s=Ca(e),c=/^[a-z0-9-]+(?:\.[a-z0-9-]+)+\//i.test(e.name)&&!/^io\.github(?:\.|\/)/i.test(e.name);r.set(e.name,{version:a,latest:i,found:s?{name:e.name,title:e._meta?.[`io.modelcontextprotocol.registry/publisher-provided`]?.github?.displayName??e.title??e.name.split(`/`).pop()??e.name,description:e.description??``,...c?{verified:!0}:{},...t.curated?{curated:!0}:{},...s}:void 0})}if(t.ready||(t.rows=new Map(r)),a=l?.nextCursor,a&&i.has(a))throw Error(`Registry cursor repeated`);a&&i.add(a)}while(a);t.rows=r,t.ready=!0,t.failed=!1}catch{t.failed=!0}}close(){this.closed=!0,this.timer&&clearTimeout(this.timer),this.controller?.abort()}};async function Ea(e,t,n){let r=t.settings??={};return(r.registry??=new Ta).response(t,n.searchParams.get(`q`)??``)}const Da=`/api/auth/callback`,Oa=`/.well-known/oauth-client.json`,ka=`/.well-known/oauth-cli-client.json`,Aa=`openid profile email offline_access organizations:read`;function ja(e,t){return{client_id:`${e}${Oa}`,client_name:`Coder at ${new URL(e).host}`,redirect_uris:[`${e}${Da}`],post_logout_redirect_uris:[`${e}/?signed_out=1`],grant_types:[`authorization_code`,`refresh_token`],response_types:[`code`],token_endpoint_auth_method:`private_key_jwt`,token_endpoint_auth_signing_alg:`ES256`,jwks:t,scope:Aa}}function Ma(e){return{client_id:`${e}${ka}`,client_name:`Coder CLI for ${new URL(e).host}`,redirect_uris:[`http://127.0.0.1/callback`],grant_types:[`authorization_code`,`refresh_token`,`urn:ietf:params:oauth:grant-type:device_code`],response_types:[`code`],token_endpoint_auth_method:`none`,scope:Aa}}function Na(e,t){return{resource:new URL(e).origin,authorization_servers:[t],bearer_methods_supported:[`header`],scopes_supported:Aa.split(` `)}}function Pa(e){let t=w(e);return t.headers.set(`cache-control`,`public, max-age=3600`),t}function Fa(e,t,n,r){return Pa(ja(t.config.publicUrl,t.auth.jwks))}function Ia(e,t,n,r){return Pa(Ma(t.config.publicUrl))}function La(e,t,n,r){return Pa(Na(t.config.publicUrl,t.auth.issuer))}const Ra=[j(`GET`,`/runner/:file`,yr),j(`GET`,Yt,Tn),j(`GET`,Oa,Fa,je),j(`GET`,ka,Ia,je),j(`GET`,`/.well-known/oauth-protected-resource`,La,je),j(`GET`,`/health`,(e,t)=>Qr(t)),j(`GET`,`/`,$t,fr),j(`GET`,`/login`,tn,yt),...R(`/login`,Nn,yt).filter(e=>e.method!==`GET`),j(`POST`,`/dash/token`,Kt,ke),...R(`/dash/:org/operator`,Zn,ct),...R(`/dash`,Zn,mt)],za=[j(`GET`,`/api/auth/capabilities`,(e,t)=>w({wular:t.auth?.issuer??null})),...R(`/api/auth`,(e,t)=>t.auth.handler(e),Lt),j(`GET`,`/me`,bn,jt)],Ba=[...P(`/tasks`,[j(`GET`,`/:id/messages`,Ot,et),j(`POST`,`/:id/ack`,Be,et),j(`POST`,`/:id/heartbeat`,Tt,et),j(`POST`,`/:id/logs`,ge,nt),j(`POST`,`/:id/result`,Xt,Fe),j(`POST`,`/:id/credential`,at,Fe),j(`POST`,`/:id/reply`,En,A),j(`POST`,`/:id/react`,Jn,A),j(`GET`,`/:id/history`,ri,A),j(`GET`,`/:id/history/:conversation`,ii,A),j(`POST`,`/:id/history`,ai,Fe),j(`GET`,`/:id`,St,dt)]),...P(`/logins`,[j(`GET`,`/:id/input`,mi,Ze),j(`GET`,`/:id`,hi,Ze),j(`POST`,`/:id`,gi,Ze)]),...P(`/runners`,[j(`POST`,`/register`,Ut)])],Va=[...P(`/create`,[j(`GET`,`/:id`,Ei,D),j(`POST`,`/:id`,Oi,D),j(`GET`,`/:id/callback`,ji,D),j(`POST`,`/:id/callback`,Mi,D)]),...P(`/install`,[j(`GET`,`/:id`,an,I),j(`POST`,`/:id`,an,I),j(`GET`,`/:id/callback`,xn,I),j(`POST`,`/:id/callback`,xn,I)])],Ha=P(`/connect`,[j(`GET`,``,kn,Fn),j(`POST`,``,un,Fn),j(`GET`,`/:integration`,Ft,Re),j(`GET`,`/:integration/callback`,Bn,Re)]),Ua=[...P(`/hooks`,[j(`POST`,`/*`,(e,t,n)=>_n(e,t,n[`*`]),(e,t,n)=>t.integrations[n[`*`]]?t:ce())]),...Va,...Ha],Wa=[j(`GET`,`/metrics`,async(e,t)=>w(await ei(t),200,{"cache-control":`no-store`}),cr),j(`GET`,`/usage`,tt),j(`GET`,`/usage/totals`,hn)],Ga=P(``,[j(`GET`,`/folders`,(e,t)=>w(ot(t.local.cwd))),j(`POST`,`/folders/check`,async(e,t)=>{let n=await e.json().catch(()=>void 0);return w(Ct(n?.path))}),j(`POST`,`/folders/clone`,async(e,t)=>{let n=await e.json().catch(()=>void 0);return w(await kt(n?.url))}),j(`POST`,`/folders/pick`,async(e,t)=>w(await _e()))],fn),Ka=P(``,[j(`GET`,`/engines/status`,async(e,t)=>w(await Xe(t))),j(`POST`,`/engines/:engine/login`,be),j(`POST`,`/engines/:engine/logout`,mn)],De),qa=[j(`POST`,`/apps/:id/install`,(e,t,n,r)=>pn(e,t,n.id,r.searchParams.get(`back`))),j(`POST`,`/apps/create/:integration`,ki),j(`GET`,`/apps`,Me),j(`DELETE`,`/apps/:id`,lt),j(`GET`,`/apps/:id/drift`,Ke),j(`POST`,`/apps/:id/update`,pr),j(`GET`,`/installations`,ze),j(`GET`,`/connections`,zt,N),j(`POST`,`/connections`,tr,N),j(`PATCH`,`/connections/:id`,pt,N),j(`DELETE`,`/connections/:id`,dr,N),j(`POST`,`/connections/:id/authorize`,nn,N),j(`GET`,`/integrations`,(e,t,n,r)=>rt(t,r)),j(`GET`,`/repositories`,(e,t)=>Ye(t)),j(`POST`,`/repositories/refresh`,(e,t)=>Ye(t,!0))],Ja=[j(`GET`,`/agents/import`,ia),j(`POST`,`/agents/import`,aa),j(`GET`,`/agents`,Ii),j(`PATCH`,`/agents/:slug/settings`,ca),j(`GET`,`/agents/:slug/versions`,Li),j(`GET`,`/agents/:slug/versions/:version`,Ri),j(`GET`,`/agents/:slug`,zi),j(`DELETE`,`/agents/:slug`,la,(e,t)=>xe(t,`Only an owner or admin can delete an agent.`)),j(`PUT`,`/agents/:slug`,ua)],Ya=[j(`GET`,`/credentials`,Oe),j(`POST`,`/credentials`,Ee,nr),j(`DELETE`,`/credentials/:name`,Ae),j(`POST`,`/logins`,oi,Je),j(`GET`,`/logins/:id`,si,Je),j(`POST`,`/logins/:id`,ci,Je),j(`DELETE`,`/logins/:id`,li,Je)],Xa=[j(`GET`,`/runners`,An),j(`POST`,`/runners`,dn),j(`POST`,`/runners/pair`,Gn),j(`POST`,`/runners/:id/test`,Vn),j(`PATCH`,`/runners/:id`,Qn),j(`DELETE`,`/runners/:id`,It)],Za=[j(`GET`,`/composer`,ta),j(`GET`,`/tasks`,zn),j(`POST`,`/tasks`,st),j(`GET`,`/tasks/:id`,Pt),j(`DELETE`,`/tasks/:id`,On),j(`GET`,`/tasks/:id/logs`,Vt),j(`GET`,`/tasks/:id/stream`,da),j(`POST`,`/tasks/:id/steer`,Un),j(`POST`,`/tasks/:id/ask`,Kn),j(`POST`,`/tasks/:id/approve`,ve),j(`POST`,`/tasks/:id/cancel`,wn),j(`POST`,`/tasks/:id/archive`,Jt),j(`GET`,`/events`,ma)],Qa=[j(`GET`,`/config`,He),j(`PATCH`,`/config`,Ln)],$a=[j(`POST`,`/models/probe`,(e,t)=>qi(e,t)),j(`GET`,`/models`,Yi),j(`POST`,`/models`,Xi),j(`DELETE`,`/models/:name`,Zi),j(`POST`,`/models/:name/alias`,Qi),j(`POST`,`/models/:name/disable`,$i),j(`POST`,`/models/:name/enable`,ea)],eo=[j(`GET`,`/mcp-registry`,(e,t,n,r)=>Ea(e,t,r))],to=P(`/operator`,[j(`GET`,`/apps`,bi),j(`POST`,`/apps/:integration`,xi),j(`GET`,`/audit`,Si)],Ge),no=[j(`GET`,`/flows`,Xn),j(`GET`,`/pulls`,Gt),j(`POST`,`/flows/:name/run`,Mn),j(`POST`,`/review`,Qt)],ro=P(`/admin`,[...Wa,...Ga,...Ka,...qa,...Ja,...Ya,...Xa,...Za,...Qa,...$a,...eo,...no,...to]).map(e=>({...e,guard:$n(e.guard)})),io=[j(`GET`,`/connections/oauth/callback`,(e,t,n,r)=>qn(e,t,r),or),...Ba,...ro,...za,...Ua,...Ra];async function ao(e,t,n){if(!ye(e,t))return ce();let r=new URL(e.url);return n.scope instanceof Response?n.scope:(t=n.scope??t,await ur(io,e,t,r)??Zn(e,t))}const oo=`x-coder-request-scope`;function so(e,{sessions:t,operators:n,cookies:r}){let i=e.auth;return i?{...e,auth:{...i,session(e,n){let a=JSON.stringify([...[`cookie`,`authorization`].map(t=>e.get(t)),!!n]),o=t.get(a);if(!o){let s=new Headers(e);s.delete(`x-coder-organization`),o=i.session(s,n,r),t.set(a,o)}let s=e.get(`x-coder-organization`);return s?o.then(e=>e&&(e.stale?e:Wn(e,s))):o},setOrganization:(e,t)=>i.setOrganization(e,t,r),operator(e){let t=e.get(`cookie`)??``,a=n.get(t);return a||(a=i.operator(e,r),n.set(t,a)),a}}}:e}function co(e,t,n){let r=t.requestScopes??=new Map,i=e.headers.get(oo),a=n&&i?r.get(i):void 0;if(a)return{req:e,ctx:so(t,a),end(){}};let o=new Headers(e.headers);if(o.delete(oo),!t.auth)return{req:i?new Request(e,{headers:o}):e,ctx:t,end(){}};let s=Br(),c={sessions:new Map,operators:new Map,cookies:[]};return r.set(s,c),o.set(oo,s),{req:new Request(e,{headers:o}),ctx:so(t,c),cookies:c.cookies,end:()=>r.delete(s)}}async function lo(e,t,n={}){t.limits??=new Rt((t.now??Date.now)()),t.limits.requests++,t.settings??={},t.taskWatcher??=new ga,t.logWatcher??=new va,t.dashboardHosts??=new vn;let r=()=>uo(e,t,n);return t.dbProfile?t.dbProfile.request(n.inProcess===!0,r):r()}async function uo(e,t,n){let r=await ue(e,me(new URL(e.url).pathname));if(r instanceof Response)return r;let i=co(r,t,n.inProcess===!0),a=!1;try{let r=n.clientIp??`unknown`,o=await sr(i.req,i.ctx,r),s=fo(o instanceof Response?o:await ao(i.req,i.ctx,o),i.cookies),c=new URL(e.url).pathname.split(`/`),l=c[1]===`tasks`,u=c[1]===`admin`&&c[2]===`tasks`;if(e.method!==`GET`&&s.ok&&![`hooks`,`tasks`,`logins`].includes(c[1])&&!(o instanceof Response)){let e=o.scope instanceof Response?void 0:o.scope??i.ctx;e&&Cn(e,e.organizationId)}return e.method!==`GET`&&s.ok&&!(l&&c.length===4&&c[2]&&[`heartbeat`,`logs`].includes(c[3]))&&!(u&&c.length===5&&c[3]&&[`steer`,`ask`,`approve`,`archive`].includes(c[4]))&&(l||u||c[1]===`admin`&&c[2]===`review`||c[1]===`admin`&&c[2]===`flows`&&c.length===5&&c[3]&&c[4]===`run`)&&lr(t,u&&c.length===3&&e.method===`POST`),a=!!s.body&&(s.headers.get(`content-type`)??``).includes(`text/html`),a?po(s,i.end):s}finally{a||i.end()}}function fo(e,t=[]){if(!t.length)return e;let n=new Headers(e.headers);for(let e of t)n.append(`set-cookie`,e);return new Response(e.body,{status:e.status,statusText:e.statusText,headers:n})}function po(e,t){let n=e.body.getReader(),r=new ReadableStream({async pull(e){try{let{done:r,value:i}=await n.read();r?(t(),e.close()):e.enqueue(i)}catch(n){t(),e.error(n)}},cancel(e){return t(),n.cancel(e)}});return new Response(r,e)}async function mo(e={}){let t=e.env??G.env,n=hr(t,e.host??`node`),r=e.runner??n.runner;if((e.host===`vercel`||t.VERCEL)&&(r===`local`||r===`local-docker`))throw new _(`invalid-option`,`The ${r} runner cannot run on Vercel.`,{hint:`Leave RUNNER unset to use vercel-sandbox.`});if(n.store===`memory`&&r!==`local`&&r!==`local-docker`)throw new _(`invalid-option`,`The ${r} runner needs a database.`,{hint:`Set DATABASE_URL, or use RUNNER=local for a memory server.`});if(!n.publicUrl)throw new _(`invalid-option`,`PUBLIC_URL is required to start a Coder server.`,{hint:`Set PUBLIC_URL to the address platforms and browsers use.`});let i=[];if(n.store===`memory`&&!e.local&&i.push(`test server, not for production: everything is in memory, nothing survives a restart, no sign-in; set DATABASE_URL for a real deployment`),!t.SERVER_ENCRYPTION_KEY&&!e.local&&i.push(`secrets are stored unencrypted; set SERVER_ENCRYPTION_KEY (openssl rand -base64 32)`),n.store===`postgres`&&!n.encryptionKey)throw new _(`invalid-option`,`SERVER_ENCRYPTION_KEY is required for a Postgres server.`,{hint:`Set SERVER_ENCRYPTION_KEY (openssl rand -base64 32); sign-in keys derive from it.`});let a=ne(n.integrations),o=n.store===`memory`&&!n.adminToken?zr(18).toString(`base64url`):void 0;n.store===`postgres`&&n.adminToken&&i.push(`ADMIN_TOKEN is ignored with Postgres; owners and admins sign in with coder auth login`);let s={...n,...n.store===`postgres`?{adminToken:void 0}:{},...o?{adminToken:o}:{},...e.runner?{runner:e.runner}:{}},c=await Se(s,{local:!!e.local});try{s.store===`memory`&&await Nr(c.store(c.defaultOrganizationId),Date.now());let n=c.connection&&s.auth?await(await import(`./auth-BhpnOCbn.js`)).createAuth(c.connection.db,s):void 0,r=e.cwd??G.cwd(),l=c.store(c.defaultOrganizationId),u=br({kind:s.runner,workDir:s.workDir,config:s.runnerConfig,local:!(e.host===`vercel`||t.VERCEL),sandbox:{region:Cr(s.databaseUrl),snapshots:xr(l)}});if(!u[s.runner])throw await c.close(),new _(`invalid-option`,`Runner ${s.runner} is not configured.`,{hint:`Set RUNNER_CONFIG to JSON containing url and secret.`});let d=new vn,f=new Rt,p=new Ta,m=new Map,h=new Map,g=new ga,v=new va,y=t=>{let i=m.get(t);if(i)return i;let o=c.store(t),l=new Map,_={registry:p},b={limits:f,...c.connection?{databaseHealth:async()=>{await c.connection.db.execute(Fr`select 1`)},statementTimeout:c.connection.statementTimeout}:{},config:s,settings:_,organizationId:t,integrations:a,runners:u,store:o,queue:c.queue,requestScopes:h,taskWatcher:g,logWatcher:v,dashboardHosts:d,dbProfile:c.connection?.profile,chatState:c.chatState,fileReads:l,repositoryLists:new Map,loadAgent:bt(a,{...e.local?{cwd:r}:{},config:s,store:o,fileReads:l,settings:_}),...n?{auth:n}:{},scope:y,webhookTarget:(e,t)=>c.webhookTarget(e,t),appRecord:e=>c.appRecord(e),apps:e=>c.apps(e),installationOrganization:e=>c.installationOrganization(e),installations:e=>c.installations(e),serverOrganizationId:c.defaultOrganizationId,taskOrganization:(e,t)=>c.taskOrganization(e,t),...e.local?{local:e.local}:{}};return m.set(t,b),b};globalThis.__coder={handle:e=>lo(e,y(c.defaultOrganizationId),{inProcess:!0})};let b=y(c.defaultOrganizationId);b.local&&Xe(b).catch(()=>{});let x;return e.local&&(await qe(b),x=setImmediate(()=>{Ce(b).catch(()=>void 0)})),{config:s,context:y,defaultContext:b,warnings:i,...o?{mintedToken:o}:{},sweep:c.sweep,close:async()=>{p.close(),g.close(),v.close(),x&&clearImmediate(x),await b.local?.usageSync?.catch(()=>void 0),await ut(b),await c.close()}}}catch(e){throw await c.close(),e}}var ho=e({serve:()=>So,serverHandler:()=>vo});const go=36e5;function _o(e){try{let t=new URL(e);return F.has(t.hostname)?Number(t.port||(t.protocol===`https:`?443:80)):void 0}catch{return}}function vo(e=G.env,t=e.VERCEL?`vercel`:`node`){gr();let n,r,i=()=>n??=mo({env:e,host:t}).catch(e=>{throw n=void 0,e}),a=e=>Promise.all([e.sweep(),er(e.defaultContext,!1,!0),Pn(e.defaultContext)]).then(()=>void 0);return Object.assign(async(t,n)=>{let o=await i(),s=n?e=>n(e):e=>void e.catch(()=>{}),c=Date.now();(r===void 0||c-r>=go)&&(r=c,s(o.defaultContext.store.create(`delivery`,`maintenance:${o.config.publicUrl}`,{at:c},{ttlMs:go}).then(e=>e?a(o):void 0).catch(e=>console.error(`coder server: maintenance failed`,e))));let l=e=>({...o.context(e),waitUntil:s,scope:l});return lo(t,l(o.defaultContext.organizationId),{clientIp:e.VERCEL?t.headers.get(`x-forwarded-for`)?.split(`,`,1)[0]?.trim():void 0})},{scheduled:async()=>{let e=await i();await a(e)},close:async()=>{let e=n;n=void 0,r=void 0,await(await e)?.close()}})}function yo(e){let t=Lr(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-t`],{encoding:`utf8`}),n=Number(t.stdout?.split(`
|
|
12
|
+
`)[0]);if(n)return{pid:n,command:Lr(`ps`,[`-o`,`command=`,`-p`,String(n)],{encoding:`utf8`}).stdout?.trim().slice(0,120)||`another process`}}function bo(e){let t=yo(e),n=t&&/\bcoder (dash|server serve)\b/.test(t.command);return new _(`server`,t?n?`Coder is already running on port ${e} (pid ${t.pid}): http://localhost:${e}`:`Port ${e} is in use by ${t.command} (pid ${t.pid}).`:`Port ${e} is in use.`,{hint:t?`Stop it with \`kill ${t.pid}\`, or use another port: --port ${e+1}`:`Use another port: --port ${e+1}`})}async function xo(e={}){gr();let t=e.env??G.env;if(e.runner&&!Sr.includes(e.runner))throw new _(`invalid-option`,`Invalid --runner value: use ${Sr.join(`, `)}`);if(e.port!==void 0&&(!Number.isInteger(e.port)||e.port<1||e.port>65535))throw new _(`invalid-option`,`Invalid port: use 1 through 65535.`);let n=t.PORT&&/^\d+$/.test(t.PORT)?Number(t.PORT):void 0,r=_o(t.PUBLIC_URL),i=e.port??n??r??8787;if(!Number.isInteger(i)||i<1||i>65535)throw new _(`invalid-option`,`Invalid PORT: use 1 through 65535.`);let a=t.PUBLIC_URL?t:{...t,PUBLIC_URL:`http://localhost:${i}`},o=!!(t.DATABASE_URL||t.POSTGRES_URL);if(o&&e.memory)throw new _(`invalid-option`,`A memory server cannot use DATABASE_URL.`,{hint:`Unset DATABASE_URL, or drop --memory.`});let s=(e.host??t.HOST??(o?void 0:`127.0.0.1`))?.replace(/^\[(.*)\]$/,`$1`),c=!o&&!e.memory;if(c&&!F.has(s))throw new _(`invalid-option`,`A local server listens on loopback only.`,{hint:`Reach it through a tunnel or a proxy on this machine; set DATABASE_URL for a deployment, or use --memory for a test server.`});if(e.memory&&t.VERCEL)throw new _(`invalid-option`,`A memory server cannot run on Vercel.`,{hint:`Set DATABASE_URL for a real deployment.`});let l,u,d=c?new Promise((e,t)=>{u=t,l=()=>{Xr().then(e,t)}}):void 0,f=d?.then(()=>void 0).catch(()=>void 0),p=c?{cwd:e.cwd??G.cwd(),port:i,cacheMaintenance:f}:void 0,m=await mo({cwd:e.cwd,env:a,runner:e.runner,...p?{local:p}:{}}),h=m.defaultContext,g=()=>{m.sweep().catch(e=>console.error(`coder server: sweep failed`,e))};g();let v=setInterval(g,go);v.unref();let y=setInterval(()=>{er(h,!1,!0).catch(e=>console.error(`coder server: scheduled kick failed`,e)),Pn(h).catch(e=>console.error(`coder server: inbox flush failed`,e))},6e4);y.unref();let b=Vr.createServer(pe((e,t)=>lo(e,h,{clientIp:t}),{admit:e=>o||Ne(e.socket.remoteAddress,e.url??`/`)})),x=m.config.publicUrl;r!==void 0&&r!==i&&m.warnings.push(`PUBLIC_URL points at port ${r} but the server listens on ${i}`),await new Promise((e,t)=>{b.once(`error`,t),b.listen(i,s,e)}).catch(async e=>{throw u?.(e),clearInterval(y),clearInterval(v),await m.close(),e.code===`EADDRINUSE`?bo(i):e}),l?.();let ee=!1,te=async()=>{ee||(ee=!0,clearInterval(y),clearInterval(v),h.taskWatcher?.close(),h.logWatcher?.close(),await new Promise((e,t)=>b.close(n=>n?t(n):e())),await f,await m.close())},S=h.auth?`Wular Auth (${h.auth.issuer})`:void 0,C=`http://localhost:${i}`,ne=ht(h),re=ne===`local`?C:x,ie=m.config.store===`memory`?m.mintedToken??t.ADMIN_TOKEN:void 0;return{address:C,publicUrl:x,warnings:m.warnings,close:te,runner:m.config.runner,store:m.config.store,mode:ne,...d?{cacheMigration:d}:{},maxTasks:m.config.maxTasks??m.config.limits?.concurrentTasks??10,...S?{signIn:S}:{},...m.mintedToken?{mintedToken:m.mintedToken}:{},...m.config.store===`postgres`&&t.DATABASE_URL?{database:Pr(t.DATABASE_URL)}:{},...F.has(new URL(re).hostname)?{dashboard:`${re}/dash${ie?`#token=${encodeURIComponent(ie)}`:``}`}:{}}}async function So(e={}){try{return await xo(e)}catch(e){if(e instanceof _)throw e;let t=e instanceof Error&&e.cause instanceof Error?`: ${e.cause.message}`:``;throw new _(`server`,`${e instanceof Error?e.message:String(e)}${t}`)}}export{Aa as a,Da as i,ho as n,Oa as o,vo as r,So as t};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{_r as e,ar as t,br as n,cr as r,dr as i,fr as a,ir as o,lr as s,rr as c,yr as l}from"./errors-DO_IltpP.js";import{n as u,t as d}from"./types-DPtbvoo3.js";import{createHash as f,createHmac as p,randomUUID as ee,timingSafeEqual as te}from"node:crypto";import{isIP as ne}from"node:net";function m(e,t){let n=typeof e==`string`?Buffer.from(e):e,r=typeof t==`string`?Buffer.from(t):t;return n.length===r.length&&te(n,r)}const re=e=>f(`sha256`).update(e).digest(`base64url`),h=`https://api.github.com`;function g(e,t=`application/vnd.github+json`){return{accept:t,...e?{authorization:`Bearer ${e}`}:{},"user-agent":`coder`,"x-github-api-version":`2022-11-28`}}function _(e,t){return e.hook.before(`request`,e=>{e.request={...e.request,fetch:t}}),e}async function v(e,t=fetch){let[{createGitHubAdapter:n},{ConsoleLogger:r}]=await Promise.all([import(`./dist-B2jiMMxZ.js`),import(`./dist-DAnSqY1s.js`).then(e=>e.a)]);return _(n({...typeof e==`string`?{installationToken:e}:e,apiUrl:h,webhookVerifier:()=>!1,logger:new r(`error`)}).octokit,t)}const y=e=>t=>{if(!e.includes(t.status??0))throw t},b=e=>{let[t=``,n=``]=e.split(`/`);return{owner:t,repo:n}};async function ie(e,t,n,r){let i=await(await v(n)).repos.getContent({...b(e),path:t,...r?{ref:r}:{},mediaType:{format:`raw`}}).catch(y([404]));return typeof i?.data==`string`?i.data:void 0}async function ae(e,t,n,r){let i=new URL(`${h}/repos/${e}/contents/${t}`);r.ref&&i.searchParams.set(`ref`,r.ref);let a=await r.fetch(i,{headers:{...g(n),...r.etag?{"if-none-match":r.etag}:{}}});if(a.status===304)return`unchanged`;let o=a.headers.get(`etag`)??void 0;if(a.status===404)return o?{etag:o}:{};if(!a.ok)throw Error(`GitHub answered ${a.status} reading ${e}/${t}`);let s=await a.json(),c=s.type===`file`&&s.encoding===`base64`?Buffer.from(s.content??``,`base64`).toString():void 0;return{...c===void 0?{}:{text:c},...o?{etag:o}:{}}}async function oe(e,t,n){let r=await(await v(n)).repos.getCommit({...b(e),ref:t,mediaType:{format:`sha`}}).catch(y([404,422]));return r?String(r.data).trim():void 0}async function se(e,t,n,r=`HEAD`){let i=await v(n),a=b(e),o=`${t}/`,s=await i.git.getTree({...a,tree_sha:r,recursive:`1`}).catch(y([404]));if(!s)return[];let c=[],l=e=>e.startsWith(o)&&e.slice(o.length).split(`/`).length<=22;if(!s.data.truncated)return s.data.tree.flatMap(e=>e.type===`blob`&&e.path&&l(e.path)?[e.path.slice(o.length)]:[]);let u=async(e,t=``)=>{let{data:n}=await i.git.getTree({...a,tree_sha:e});await Promise.all(n.tree.map(async e=>{let n=t?`${t}/${e.path}`:e.path;n&&(e.type===`blob`&&l(n)?c.push(n.slice(o.length)):e.type===`tree`&&e.sha&&(o.startsWith(`${n}/`)||n.startsWith(o)&&l(n))&&await u(e.sha,n))}))};return await u(r),c.sort()}async function ce(e,t,n,r){let i=await(await v(n)).repos.getContent({...b(e),path:t,...r?{ref:r}:{}}).catch(y([404]));return Array.isArray(i?.data)?i.data.map(e=>e.name):[]}async function le(e,t=fetch){let n=[];for(let r=1;;r++){let i=await t(`${h}/installation/repositories?per_page=100&page=${r}`,{headers:{...g(e),authorization:`token ${e}`},signal:AbortSignal.timeout(1e4)});if(!i.ok)throw Error(`GitHub repositories failed: ${i.status}`);let a=await i.json();if(n.push(...a.repositories.map(e=>e.full_name)),n.length>=a.total_count||a.repositories.length<100)break}return[...new Set(n)]}async function ue(e,t){let{data:n}=await(await v(t)).pulls.list({...b(e),state:`open`,sort:`created`,direction:`desc`,per_page:50});return n.map(e=>({number:e.number,title:e.title,author:e.user?.login,createdAt:e.created_at}))}async function de(e,t){let{data:n}=await(await v(t)).repos.get(b(e));return{owner:n.owner.login,name:n.name,cloneUrl:n.clone_url,defaultBranch:n.default_branch}}async function fe(e,t,n,r){let i=await(await v(n,r)).repos.getCollaboratorPermissionLevel({...b(e),username:t}).catch(()=>void 0);return[`admin`,`maintain`,`write`].includes(i?.data.permission??``)}function pe(e,t,n){let r=`https://github.com/${e}`;return t?`${r}/tree/${n??`HEAD`}/${t}`:r}const x={read:[`read`],write:[`read`,`write`]};function me(e,t,n){return{name:`github`,command:`github-mcp-server`,args:[`stdio`,`--toolsets=all`,...e.includes(`write`)?[]:[`--read-only`]],env:{GITHUB_PERSONAL_ACCESS_TOKEN:n}}}function he(e,{name:t,description:n,permissions:r,events:i,isPublic:a=!1}){let o=e.replace(/\/$/,``);return{name:t,...n?{description:n}:{},url:o,hook_attributes:{url:`${o}/hooks/github`,active:!0},redirect_url:`${o}/create/github/callback`,callback_urls:[`${o}/install/github/callback`,`${o}/connect/github/callback`],request_oauth_on_install:!0,public:a,default_permissions:r,default_events:[...new Set([...i,`repository`])]}}function ge(e,t){let n=e?`https://github.com/organizations/${encodeURIComponent(e)}/settings/apps/new`:`https://github.com/settings/apps/new`;return t?`${n}?state=${encodeURIComponent(t)}`:n}async function _e(e,t=fetch){let n=await t(`${h}/app-manifests/${encodeURIComponent(e)}/conversions`,{method:`POST`,headers:g()});if(!n.ok)throw Error(`GitHub App manifest conversion failed: ${n.status}`);let r=await n.json(),i=r.app_id??r.id;if(!i||!r.slug||!r.pem||!r.webhook_secret||!r.client_id||!r.client_secret)throw Error(`GitHub App manifest conversion response was incomplete`);return{appId:String(i),slug:r.slug,privateKey:r.pem,webhookSecret:r.webhook_secret,clientId:r.client_id,clientSecret:r.client_secret,...r.owner?.login?{owner:{login:r.owner.login,type:r.owner.type}}:{}}}const S=`https://github.com/login/oauth`,C=e=>`${e.replace(/\/$/,``)}/install/github/callback`;function w(e){let{clientId:t,clientSecret:n}=e;if(!t||!n)throw Error(`This GitHub App has no OAuth client; create it again`);return{clientId:t,clientSecret:n}}async function T(e,t,n,r){let{clientId:i,clientSecret:a}=w(e),o=await n(`${S}/access_token`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:i,client_secret:a,...t})}),s=await o.json().catch(()=>({}));if(!o.ok||!s.access_token)throw new d(`platform-error`,s.error??String(o.status),`GitHub authorization failed: ${s.error??o.status}`);return{accessToken:s.access_token,...s.refresh_token?{refreshToken:s.refresh_token}:{},...s.expires_in?{expiresAt:r+s.expires_in*1e3}:{}}}async function ve(e,t){let n=await t(`${h}/user`,{headers:g(e)}),r=await n.json().catch(()=>({}));if(!n.ok||!r.id||!r.login)throw Error(`GitHub user lookup failed: ${n.status}`);return{id:r.id,login:r.login}}async function ye(e,t,n,r=fetch){for(let i=1;i<=10;i++){let a=await r(`${h}/user/installations?per_page=100&page=${i}`,{headers:g(e)});if(!a.ok)throw Error(`GitHub installation check failed: ${a.status}`);let o=(await a.json()).installations??[],s=o.find(e=>String(e.id)===n&&String(e.app_id)===t);if(s)return{login:s.account?.login??`unknown`,...s.account?.type?{type:s.account.type}:{}};if(o.length<100)return}}async function E(e){let{createAppAuth:t}=await import(`./dist-node-Bv1kCqyi.js`).then(e=>e.n),{token:n}=await t({appId:e.appId,privateKey:e.privateKey})({type:`app`});return n}async function be(e,t,n=fetch){let r=await E(e),i=await n(`${h}/app/installations/${encodeURIComponent(t)}`,{headers:g(r)});if(i.status===404)return!1;if(!i.ok)throw Error(`GitHub installation lookup failed: ${i.status}`);return!0}async function D(e,t,n,r){let i=new URL(e.url).searchParams.get(`code`);if(!i)throw new d(`missing-code`);let a=await T(t,{code:i,...n?{redirect_uri:n}:{}},r,Date.now()),o=await ve(a.accessToken,r);return{id:String(o.id),login:o.login,token:JSON.stringify(a),accessToken:a.accessToken}}const xe={authorizeUrl(e,{publicUrl:t,state:n}){let r=new URLSearchParams({client_id:w(e).clientId,redirect_uri:`${t.replace(/\/$/,``)}/connect/github/callback`,state:n});return`${S}/authorize?${r}`},async exchange(e,t,{publicUrl:n,fetch:r}){let{accessToken:i,...a}=await D(e,t,`${n.replace(/\/$/,``)}/connect/github/callback`,r);return a},async access(e,t,{fetch:n,now:r}){let i=JSON.parse(e);if(!i.expiresAt||i.expiresAt-3e5>r||!i.refreshToken)return{accessToken:i.accessToken};let a=await T(t,{grant_type:`refresh_token`,refresh_token:i.refreshToken},n,r);return{accessToken:a.accessToken,refreshed:JSON.stringify(a)}}};function Se(e){return Array.isArray(e)?u.find(t=>e.every(e=>x[t].includes(e)))??`write`:e}const Ce={read:{metadata:`read`,contents:`read`,pull_requests:`write`,issues:`write`},write:{metadata:`read`,contents:`write`,pull_requests:`write`,issues:`write`}};function O(e=`write`){return{...Ce[Se(e)]}}const k={pull_request:[`pull_request`],issue:[`issues`],comment:[`issue_comment`,`pull_request_review_comment`],mention:[`issue_comment`,`pull_request_review_comment`]};function we(e){return[...new Set([...e.flatMap(e=>k[e]??[]),`push`])]}function A(e,t,n){let{events:r}=t;return he(e,{name:t.name,description:t.description,permissions:{...O(t.access),...r.some(e=>Object.hasOwn(k,e))?{issues:`write`,pull_requests:`write`}:{}},events:we(r),isPublic:n})}const j=(e,t)=>t?.type===`Organization`?`https://github.com/organizations/${encodeURIComponent(t.login)}/settings/apps/${e}`:`https://github.com/settings/apps/${e}`,M={read:1,write:2,admin:3},Te={read:`Read-only`,write:`Read and write`,admin:`Admin`},N=e=>e[0].toUpperCase()+e.slice(1).replaceAll(`_`,` `);async function Ee(e,t,{publicUrl:n,spec:r,fetch:i}){let a=await i(`${h}/app`,{headers:g(await E(t))});if(!a.ok)throw Error(`GitHub app lookup failed: ${a.status}`);let o=await a.json(),s=A(n,r),c=new Set(o.events??[]),l=o.permissions??{},u=[],d=s.description??``;d!==(o.description??``)&&u.push(d?{text:`Set the **Description**`,copy:d}:{text:`Clear the **Description**`});for(let[e,t]of Object.entries(s.default_permissions))(M[l[e]??``]??0)<(M[t]??0)&&u.push({text:`Set **${N(e)}** to **${Te[t]??t}**`});for(let e of s.default_events)c.has(e)||u.push({text:`Check the **${N(e)}** event`});for(let e of c)s.default_events.includes(e)||u.push({text:`Uncheck the **${N(e)}** event`});let f=o.owner?.login?{login:o.owner.login,type:o.owner.type}:t.owner;return{url:`${j(o.slug??t.slug,f)}/permissions`,label:`Open app settings`,lines:u}}const De={shareable:!0,postOrigins:[`https://github.com`],createPost({publicUrl:e,spec:t,state:n,owner:r,public:i}){let a=A(e,t,i===!0);return{url:ge(r,n),fields:{manifest:JSON.stringify(a)}}},async createCallback(e,{fetch:t}){let n=new URL(e.url).searchParams.get(`code`);if(!n)throw new d(`missing-code`);let r=await _e(n,t),i={appId:r.appId,slug:r.slug,privateKey:r.privateKey,webhookSecret:r.webhookSecret,clientId:r.clientId,clientSecret:r.clientSecret,...r.owner?{owner:r.owner}:{}};return{platformAppId:r.appId,name:r.slug,credentials:i}},accountUrl:({login:e})=>`https://github.com/${encodeURIComponent(e)}`,settingsUrl(e,t){let{slug:n,owner:r}=t;return r?j(n,r):void 0},drift:(e,t,n)=>Ee(e,t,n),installUrl(e,t,{publicUrl:n,state:r,installation:i}){let{slug:a}=t;if(!i)return`https://github.com/apps/${a}/installations/new?state=${encodeURIComponent(r)}`;let o=new URLSearchParams({client_id:w(t).clientId,redirect_uri:C(n),state:r});return`${S}/authorize?${o}`},async installedApp(e,{apps:t,fetch:n}){let r=new URL(e.url).searchParams.get(`installation_id`);if(!(!r||!/^\d+$/.test(r))){for(let{app:e,credentials:i}of t)if(await be(i,r,n).catch(t=>(console.error(`asking GitHub whether ${e.id} owns installation ${r} failed`,t),!1)))return{app:e,installation:r}}},async installCallback(e,{credentials:t,publicUrl:n,fetch:r,installation:i}){let a=i??new URL(e.url).searchParams.get(`installation_id`);if(!a)throw new d(`missing-code`);let{accessToken:o,...s}=await D(e,t,i?C(n):void 0,r),c=await ye(o,t.appId,a,r);if(!c)throw new d(`not-yours`);return{platformInstallId:a,account:c,installer:s.id,user:s}}};function P(e){return e&&typeof e==`object`?e:{}}function F(e){return e?.agent===!0||e?.type===`Bot`||e?.login?.endsWith(`[bot]`)===!0}function I(e,t){return[e,t].filter(e=>!!e).join(`
|
|
2
|
+
|
|
3
|
+
`)}const Oe=[`OWNER`,`MEMBER`],ke=[`issue_comment`,`pull_request_review_comment`,`ping`];function L(e){try{return JSON.parse(e)}catch{return}}function R(e,t,n){if(!n||!t?.startsWith(`sha256=`))return!1;let r=Buffer.from(p(`sha256`,n).update(e).digest(`hex`),`hex`);return m(Buffer.from(t.slice(7),`hex`),r)}function z(e,t,n,r,i){let a=n.installation?.id,o=B(n),s=i.user??n.sender;if(a===void 0||!o||!i.number)return;let c=s?.author_association;return{integration:`github`,type:r,appId:t.id,installationId:String(a),deliveryId:e.headers.get(`x-github-delivery`)??``,actor:{id:String(s?.id??s?.login??``),...s?.login?{login:s.login}:{},...c?{role:c}:{},...F(s)?{agent:!0}:{}},text:i.body??``,repo:o,chat:{thread:V(`${o.owner}/${o.name}`,i.number,i.kind===`pull`)}}}function B(e){let t=e.repository;return t?.owner?.login&&t.name&&t.clone_url&&t.default_branch?{owner:t.owner.login,name:t.name,cloneUrl:t.clone_url,defaultBranch:t.default_branch}:void 0}function V(e,t,n){return{_type:`chat:Thread`,adapterName:`github`,channelId:`github:${e}`,id:`github:${e}:${n?``:`issue:`}${t}`,isDM:!1}}function Ae(e,t,n,r){let i=P(t),a=e.headers.get(`x-github-event`);if(a===`pull_request`){let t=i.pull_request,a=i.action??``,o=i.requested_reviewer?.login?.toLowerCase();if(!t||![`opened`,`synchronize`,`reopened`,`ready_for_review`,`review_requested`].includes(a)||a===`review_requested`&&o!==`${r.slug}[bot]`.toLowerCase()||t.draft||a!==`review_requested`&&F(t.user)||!t.number||t.head?.repo?.full_name!==i.repository?.full_name)return[];let s=z(e,n,i,`pull_request`,{user:i.sender??t.user,body:I(t.title,t.body),number:t.number,kind:`pull`});return s?[s]:[]}if(a===`issues`){let t=i.issue;if(!t||![`opened`,`edited`].includes(i.action??``)||F(i.sender??t.user)||!t.number)return[];let r=z(e,n,i,`issue`,{user:i.sender??t.user,body:I(t.title,t.body),number:t.number});return r?[r]:[]}return[]}async function je(e,t,n={},r){let{token:i,expiresAt:a}=await(await v({appId:e.appId,privateKey:e.privateKey,installationId:Number(t)},r)).auth({type:`installation`,installationId:t,...n.permissions?{permissions:n.permissions}:{}});return{token:i,expiresAt:Date.parse(a)}}function Me(e,t){let{appId:n,privateKey:r}=e,{permissions:i}=H(t);return f(`sha256`).update(JSON.stringify([n,r,i?Object.entries(i).sort():null])).digest(`base64url`)}const Ne={installation:[`created`,`deleted`,`suspend`,`unsuspend`,`new_permissions_accepted`],installation_repositories:[`added`,`removed`],repository:[`created`,`deleted`,`renamed`]};function Pe(e,t,n){let r=P(t),i=r.installation?.id,a=r.action;if(i===void 0||!Ne[e??``]?.includes(a??``))return;let o=r.installation?.account,s=Date.now(),c=e===`installation`&&(a===`deleted`||a===`suspend`);return{op:c?`delete`:`upsert`,...e===`repository`&&r.repository?.full_name?{repos:{add:a===`created`||a===`renamed`?[r.repository.full_name]:[],remove:a===`deleted`?[r.repository.full_name]:a===`renamed`&&r.changes?.repository?.name?.from?[`${r.repository.full_name.split(`/`)[0]}/${r.changes.repository.name.from}`]:[]}}:{},...e===`installation_repositories`?{repos:{...r.repository_selection&&(a===`removed`?!r.repositories_removed?.length:!r.repositories_added?.length)?{refresh:!0}:{},add:(r.repositories_added??[]).flatMap(e=>e.full_name?[e.full_name]:[]),remove:(r.repositories_removed??[]).flatMap(e=>e.full_name?[e.full_name]:[])}}:{},installation:{integration:`github`,...e===`installation`&&a===`deleted`?{uninstalled:!0}:{},id:`${n.id}:${i}`,app:n.id,account:{login:o?.login??r.repository?.owner?.login??`unknown`,...o?.type?{type:o.type}:{}},createdAt:s,...r.repositories?{repos:r.repositories.flatMap(e=>e.full_name?[e.full_name]:[])}:{},...c?{deletedAt:s}:{}}}}function Fe(e,t){let n=P(e),r=n.repository?.full_name,i=n.ref?.startsWith(`refs/heads/`)&&n.ref.slice(11);if(!r||!i)return;let a=n.installation?.id,o=n.commits??[],s=o.flatMap(e=>[...e.added??[],...e.modified??[],...e.removed??[]]);return{...a===void 0?{}:{installation:`${t.id}:${a}`},repo:r,branch:i,...n.after?{commit:n.after}:{},...n.repository?.default_branch?{defaultBranch:n.repository.default_branch}:{},paths:[...new Set(s)],...!o.length||o.length>=2048?{partial:!0}:{}}}function H(e={}){return e.tools?{permissions:O(e.tools)}:{}}const Ie={id:`github`,brand:{color:`#000000`,icon:`M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12`,dark:`#fff`,svg:`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 98 96" fill="none" style="color:light-dark(#000,#fff)"><g clip-path="url(#github-mark-4)"><path d="M 41.44 69.38 C 28.81 67.85 19.91 58.76 19.91 46.99 C 19.91 42.21 21.63 37.04 24.5 33.59 C 23.26 30.43 23.45 23.73 24.88 20.96 C 28.71 20.48 33.88 22.49 36.94 25.27 C 40.58 24.12 44.41 23.54 49.1 23.54 C 53.79 23.54 57.61 24.12 61.06 25.17 C 64.03 22.49 69.29 20.48 73.12 20.96 C 74.46 23.54 74.65 30.24 73.4 33.5 C 76.47 37.13 78.09 42.01 78.09 46.99 C 78.09 58.76 69.19 67.66 56.37 69.29 C 59.62 71.39 61.82 75.99 61.82 81.25 L 61.82 91.21 C 61.82 94.08 64.22 95.7 67.09 94.55 C 84.41 87.95 98 70.63 98 49.19 C 98 22.11 75.99 0 48.9 0 C 21.82 0 0 22.11 0 49.19 C 0 70.44 13.49 88.05 31.68 94.65 C 34.26 95.61 36.75 93.88 36.75 91.3 L 36.75 83.64 C 35.41 84.22 33.69 84.6 32.16 84.6 C 25.84 84.6 22.11 81.16 19.43 74.74 C 18.38 72.16 17.23 70.63 15.03 70.34 C 13.88 70.25 13.49 69.77 13.49 69.19 C 13.49 68.04 15.41 67.18 17.32 67.18 C 20.1 67.18 22.49 68.91 24.98 72.45 C 26.89 75.22 28.9 76.47 31.29 76.47 C 33.69 76.47 35.22 75.61 37.42 73.4 C 39.05 71.78 40.29 70.34 41.44 69.38 Z" fill="black" style="fill:currentColor"/></g><defs><clipPath id="github-mark-4"><rect width="98" height="96" fill="white"/></clipPath></defs></svg>`},name:`GitHub`,featured:!0,description:`Pull requests, issues, and comments on GitHub repositories`,installLabel:`Connect GitHub`,use:`Mention @{handle} in an issue or pull request.`,organizationApps:!0,publicApps:!0,prompt:[`A conversation is an issue or pull request with its comments, or one inline review comment thread.`,`issue_read reads an issue and its comments. pull_request_read reads a pull request: get, get_diff and get_files for the change, get_comments for its conversation, get_reviews and get_review_comments for reviews and inline comments.`,`A task starts on the default branch; a pull request's changes are read with pull_request_read. Check out and push a pull request's branch only when it is in this repository and the request asks for changes; a fork pull request gets reads and comments only.`,`Replies are GitHub Markdown. Cite repository file paths when discussing code; link the pull request after making changes.`].join(`
|
|
4
|
+
`),sample:`github:owner/repo:1`,author:e=>`${e}[bot]`,events:{mention:{description:`Comment from a repo owner or org member mentioning @<agent>; text has the mention stripped.`,on:`mention`,addressed:!0},pull_request:{description:`Opened, updated, or ready non-draft pull request.`},issue:{description:`Opened or edited issue.`},comment:{description:`New non-agent issue, pull request, or inline review comment.`,on:`message`,noisy:!0}},tools:{presets:x,server:me,install:`arch=$(uname -m); [ "$arch" = aarch64 ] && arch=arm64; curl -fsSL "https://github.com/github/github-mcp-server/releases/latest/download/github-mcp-server_Linux_$arch.tar.gz" | tar -xz -C /usr/local/bin github-mcp-server`,installHosts:[`github.com`,`release-assets.githubusercontent.com`]},hosts:[`github.com`,`api.github.com`,`codeload.github.com`],collapsed:(e,t)=>`<details><summary>${e}</summary>\n\n${t}\n\n</details>`,get app(){return De},auth:{token:async(e,t,n,{fetch:r,hold:i}={})=>{let a=()=>je(t,e.id.split(`:`).pop(),H(n),r);return i?i(Me(t,n),a):(await a()).token},get user(){return xe},canWrite:async(e,t,n)=>!!(e.repo&&e.actor.login)&&fe(`${e.repo.owner}/${e.repo.name}`,e.actor.login,t,n)},repos:{cloneHosts:[`github.com`],credentialUsername:`x-access-token`,readFile:ie,revalidate:ae,listDir:ce,tree:se,commit:oe,list:(e,t,n)=>le(t,n),get:de,url:pe,pullRequests:ue,pullRequest:e=>{let t=/^github:[^:]+:(\d+)(?::|$)/.exec(e.chat?.thread.id??``);return t?Number(t[1]):void 0},pullRequestThread:(e,t)=>V(e,t,!0)},target(e,t){let n=e.headers.get(`x-github-hook-installation-target-id`);if(!n)return;let r=P(L(t)),i=B(r),a=r.issue?r.issue.comments:r.comment&&r.comment.in_reply_to_id===void 0?0:void 0;return{app:n,...r.installation?.id===void 0?{}:{installation:String(r.installation.id)},...i?{repo:i}:{},...a===void 0?{}:{index:a}}},adapter:async e=>(await import(`./adapter-DzpdWewB.js`)).githubAdapter(e),link(e){let t=/^github:([^:]+):(issue:)?(\d+)(?::rc:(\d+))?(?::|$)/.exec(e.chat?.thread.id??``);return t?`https://github.com/${t[1]}/${t[2]?`issues`:`pull`}/${t[3]}${t[4]?`#discussion_r${t[4]}`:``}`:void 0},ownEvents(e,t,n,r){let i=e.headers.get(`x-github-event`);if(!i||ke.includes(i))return;let{webhookSecret:a,slug:o}=r;if(!R(t,e.headers.get(`x-hub-signature-256`),a))return{invalid:!0};let s=L(t),c=Pe(i,s,n);if(c)return{installation:c};let l=i===`push`?Fe(s,n):void 0;return l?{push:l}:{events:Ae(e,s,n,{slug:o})}},event(e,t,n){let r=n.raw.comment?.author_association;return{type:e===`mention`&&!Oe.includes(r??``)?`comment`:e,actor:{id:n.author.userId,login:n.author.userName,...r?{role:r}:{}}}}};function Le(e,t,n,r=Date.now()){if(!n||!t)return!1;let i=p(`sha256`,n).update(e).digest();if(!m(Buffer.from(t,`hex`),i))return!1;let a=JSON.parse(e).webhookTimestamp;return typeof a==`number`&&Math.abs(r-a)<=6e4}async function Re(e,t,n=fetch){if(!e.actor.id||!e.installationId)throw Error(`Linear event has no actor or workspace`);let r=await n(`https://api.linear.app/graphql`,{method:`POST`,headers:{authorization:`Bearer ${t}`,"content-type":`application/json`},body:JSON.stringify({query:`query WorkspaceMember($id: String!) { user(id: $id) { id active guest app organization { id } } }`,variables:{id:e.actor.id}}),redirect:`error`,signal:AbortSignal.timeout(5e3)}),i=await r.json(),a=i.data?.user;if(!r.ok||i.errors!==void 0&&(!Array.isArray(i.errors)||i.errors.length>0)||!a)throw Error(`Linear returned no valid workspace member`);return a.id===e.actor.id&&a.active===!0&&a.guest===!1&&a.app===!1&&a.organization?.id===e.installationId}function ze(e,t){let n=new Map;return(async(r,i)=>{let a=new Request(r,i);if(new URL(a.url).origin!==`https://slack.com`||new URL(a.url).pathname!==`/api/users.info`)return e(r,i);let o=new URLSearchParams(await a.clone().text()),s=a.headers.get(`authorization`)?.replace(/^Bearer /,``)??o.get(`token`),c=JSON.stringify([s,o.get(`team_id`)??t,o.get(`user`)]),l=n.get(c);return l||(l=e(r,i).then(async e=>{let t=await e.clone().json().catch(()=>void 0);return(!e.ok||t?.ok!==!0)&&n.delete(c),e}).catch(e=>{throw n.delete(c),e}),n.set(c,l)),(await l).clone()})}async function Be(e,t,n=fetch){let r=e.within??e.installationId;if(!r||!e.actor.id)throw Error(`Slack event has no workspace or actor`);let i=await n(`https://slack.com/api/users.info`,{method:`POST`,headers:{authorization:`Bearer ${t}`,"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({user:e.actor.id,team_id:r}),redirect:`error`,signal:AbortSignal.timeout(5e3)}),a=await i.json(),o=a.user;if(!i.ok||a.ok!==!0||!o)throw Error(`Slack returned no valid workspace member`);return o.id===e.actor.id&&o.deleted===!1&&o.is_bot===!1&&o.is_restricted===!1&&o.is_ultra_restricted===!1&&(o.is_external===void 0||o.is_external===!1)&&(o.team_id===r||Array.isArray(o.enterprise_user?.teams)&&o.enterprise_user.teams.includes(r))}function U(e){return e.replace(/\/$/,``)}function Ve(e,{name:t,description:n,scopes:r,events:i,extras:a}){let o=U(e),s=new URL(o).hostname;return{display_information:{name:t,...n?{description:n.slice(0,140)}:{}},features:{bot_user:{display_name:t,always_online:!0},app_home:{home_tab_enabled:!0,messages_tab_enabled:!0,messages_tab_read_only_enabled:!1},...s.includes(`.`)&&!ne(s)?{unfurl_domains:[s]}:{},...a},oauth_config:{redirect_urls:[`${o}/install/slack/callback`],scopes:{bot:r}},settings:{org_deploy_enabled:!0,event_subscriptions:{request_url:`${o}/hooks/slack`,bot_events:i},interactivity:{is_enabled:!0,request_url:`${o}/hooks/slack`}}}}async function W(e,t,n,r){let{assertSlackOk:i,callSlackApi:a}=await import(`./api-qdpx8FD0.js`),o=await a(e,t,{token:n,fetch:r});return i(e,o),o}async function He(e,t,n=fetch){let r=await W(`apps.manifest.create`,{manifest:JSON.stringify(t)},e,n);return{appId:r.app_id,clientId:r.credentials.client_id,clientSecret:r.credentials.client_secret,signingSecret:r.credentials.signing_secret}}const G=e=>Y(e.access,e.events);function K(e,t,n){return Ve(e,{name:t,description:n.description,scopes:G(n),events:Xe(n.events),extras:Ze(e,n)})}async function q(e,t=fetch){let n=await t(`https://slack.com/api/tooling.tokens.rotate`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({refresh_token:e})}),r=await n.json();if(!n.ok||!r.ok||!r.token||!r.refresh_token||!r.team_id||!r.user_id)throw new d(`platform-error`,r.error??String(n.status));return{workspace:r.team_id,user:r.user_id,configToken:r.token,configRefreshToken:r.refresh_token,configTokenExpires:(r.exp??0)*1e3}}async function J(e,t,n,r){return e.use(t,async(e,t,i)=>{let a=e;if(a.configTokenExpires<=Date.now()+6e4){try{let e=await q(a.configRefreshToken,n);if(e.workspace!==a.workspace||e.user!==a.user)throw Error(`Configuration token owner changed`);a=e}catch{throw await i(),new d(`invalid-field`,`token`,`This configuration token could not be refreshed. Paste a new token.`)}await t(a)}return r(a.configToken)})}function Ue(e,t,n,r=[]){let i=new URLSearchParams({client_id:e.clientId,state:n,redirect_uri:`${U(t)}/install/slack/callback`});return r.length&&i.set(`scope`,r.join(`,`)),`https://slack.com/oauth/v2/authorize?${i}`}async function We(e,t,n,r=fetch){let i=await r(`https://slack.com/api/oauth.v2.access`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:t.clientId,client_secret:t.clientSecret,code:e,redirect_uri:`${U(n)}/install/slack/callback`})}),a=await i.json(),o=a.is_enterprise_install===!0,s=o?a.enterprise:a.team;if(!i.ok||!a.ok||!a.access_token||!s?.id||!s.name)throw new d(`platform-error`,a.error??String(i.status));return{id:s.id,name:s.name,org:o,accessToken:a.access_token,...a.authed_user?.id?{installer:a.authed_user.id}:{}}}async function Ge(e,t){let n=[],r=``;do{let i=await W(`auth.teams.list`,{limit:1e3,...r?{cursor:r}:{}},e,t);n.push(...i.teams.map(e=>e.id)),r=i.response_metadata?.next_cursor??``}while(r);return n}const Ke={createStep:(e,t)=>{let n=t?.saved??[],r=n.length?{field:`token`,equals:`new`}:void 0;return{intro:`The Slack app is created with a configuration token and its bot installed in the token's whole workspace.`,link:`https://api.slack.com/apps`,steps:[{...r?{when:r}:{},text:`Under **Your App Configuration Tokens**, click **Generate Token** and pick the workspace the agent should join.`},{text:`Paste the refresh token below, then approve the install when Slack asks.`,...r?{when:r}:{}}],notes:[`A workspace that requires app approval sends the install to its admins first. In Enterprise Grid, only an org admin can install org-wide.`,`To install the app in other Slack workspaces, click **Activate Public Distribution** under the app's **Manage Distribution**.`],fields:[...n.length?[{name:`token`,label:`Configuration token`,options:[...n.map(({id:e,label:t})=>({value:e,label:t})),{value:`new`,label:`Paste a new token`}]}]:[],{...r?{when:r}:{},name:`refreshToken`,label:`Refresh token`,hint:`Starts with xoxe-1-.`,placeholder:`xoxe-1-…`,required:!0}],submit:`Create Slack app`}},async createCallback(e,{publicUrl:t,spec:n,fetch:r,tokens:i}){if(!i)throw Error(`Configuration token storage is unavailable`);let a=new URLSearchParams(await e.text()),o=a.get(`token`);if(!o||o===`new`){let e=a.get(`refreshToken`);if(!e)throw Error(`Missing refresh token`);if(e.startsWith(`xoxe.xoxp-`))throw new d(`invalid-field`,`access-token`,`That is the access token, xoxe.xoxp-…. Paste the refresh token next to it, which starts with xoxe-1-.`);if(!e.startsWith(`xoxe-1-`))throw new d(`invalid-field`,`refresh-token`,`That is not a refresh token; they start with xoxe-1-. Copy it from Your App Configuration Tokens.`);let t=await q(e,r),n={workspace:t.workspace,user:t.user,workspaceName:t.workspace,credentials:t},s=await W(`auth.test`,{},t.configToken,r).catch(()=>void 0);o=await i.put({...n,workspaceName:s?.team||n.workspaceName})}let{name:s}=n,c=await J(i,o,r,e=>He(e,K(t,s,n),r));return{platformAppId:c.appId,name:s,credentials:{...c,configTokenId:o,scopes:G(n)}}},manifest:(e,{publicUrl:t,spec:n})=>K(t,e.name,n),async update(e,t,{publicUrl:n,spec:r,fetch:i,saveCredentials:a,tokens:o}){let s=t;if(!s.configTokenId||!o)throw new d(`no-refresh-token`);await J(o,s.configTokenId,i,t=>W(`apps.manifest.update`,{app_id:s.appId,manifest:JSON.stringify(K(n,e.name,r))},t,i));let c=G(r);c.join()!==s.scopes?.join()&&await a({...s,scopes:c})},settingsUrl:(e,t)=>`https://api.slack.com/apps/${encodeURIComponent(t.appId)}`,installUrl(e,t,{publicUrl:n,state:r}){let i=t;return Ue(i,n,r,i.scopes??Y(`write`))},async installCallback(e,{app:t,credentials:n,publicUrl:r,fetch:i,tokens:a}){let o=new URL(e.url).searchParams.get(`code`);if(!o)throw new d(`missing-code`);let s=await We(o,n,r,i),c=n.configTokenId;a&&c&&!s.org&&await a.use(c,(e,t)=>t(e,s.name));let l=await W(`auth.test`,{},s.accessToken,i).then(e=>e.url?.replace(/\/$/,``)).catch(()=>void 0),u=s.org?await Ge(s.accessToken,i).catch(()=>null):void 0;return{platformInstallId:s.id,account:{login:s.name,...s.org?{type:`Organization`}:{},...l?{url:l}:{}},token:s.accessToken,...s.org?{covers:u}:{},installer:s.installer,...s.installer?{user:{id:s.installer}}:{}}}},qe=[`app_mentions:read`,`channels:history`,`groups:history`,`im:history`,`channels:read`,`groups:read`,`im:read`,`mpim:read`,`users:read`,`users:read.email`,`files:read`,`usergroups:read`,`reactions:read`,`reactions:write`,`commands`,`links:read`,`links:write`];function Y(e=`write`,t=[]){return[...qe,...t.includes(`dm`)?[`mpim:history`]:[],`chat:write`,`files:write`,`im:write`,`assistant:write`,...(Array.isArray(e)?e.includes(`write`):e===`write`)?[`channels:join`,`channels:manage`,`groups:write`,`mpim:write`,`usergroups:write`]:[]]}const Je={mention:[`app_mention`],dm:[`message.im`,`message.mpim`],channel:[`message.channels`,`message.groups`]},Ye=[`mention`,`dm`,`channel`];function Xe(e){let t=e.some(e=>Ye.includes(e));return[...new Set([...e.flatMap(e=>Je[e]??[]),...t?[`reaction_added`]:[]]),`team_access_granted`,`team_access_revoked`,`app_uninstalled`,`tokens_revoked`,`app_home_opened`,`link_shared`]}function Ze(e,t){let n=e.replace(/\/$/,``);return{slash_commands:(t.commands??[]).map(({command:e,description:t,usage:r})=>({command:e,url:`${n}/hooks/slack`,description:t,...r?{usage_hint:r}:{}})),agent_view:{agent_description:t.description??`${t.name} in your workspace.`}}}const Qe={read:[`read`],write:[`read`,`write`]};function $e(e,t,n){let r=!e.includes(`write`),i=`/tmp/coder-slack-${ee()}`;return{name:`slack`,command:`slack-mcp-server`,readOnly:r,args:[`--transport`,`stdio`],env:{SLACK_MCP_XOXB_TOKEN:n,SLACK_MCP_USERS_CACHE:`${i}-users.json`,SLACK_MCP_CHANNELS_CACHE:`${i}-channels.json`,SLACK_MCP_LOG_LEVEL:`error`,SLACK_MCP_ADD_MESSAGE_TOOL:r?``:`true`,SLACK_MCP_REACTION_TOOL:r?``:`true`,SLACK_MCP_ATTACHMENT_TOOL:`true`,SLACK_MCP_MARK_TOOL:r?``:`true`},credentialFields:{env:`SLACK_MCP_XOXB_TOKEN`}}}const et=i({type:a(e()),team_id:a(e()),enterprise_id:a(e()),is_enterprise_install:a(n([t(),e()])),api_app_id:a(e()),challenge:a(e()),authorizations:a(o(i({user_id:a(e()),team_id:a(s(e())),enterprise_id:a(s(e())),is_enterprise_install:a(t())})))}),tt=i({enterprise_id:a(e()),authorizations:a(o(i({enterprise_id:a(e())}))),event:i({type:c([`team_access_granted`,`team_access_revoked`]),team_ids:o(e())})}),nt=i({type:c([`app_uninstalled`,`tokens_revoked`]),tokens:a(i({bot:a(o(e()))}))}),rt=i({type:r(`app_home_opened`),user:e(),tab:r(`home`)}),it=i({type:r(`link_shared`),channel:e(),message_ts:e(),unfurl_id:a(e()),source:a(e()),links:o(i({url:e()}))}),at=`link:`,ot=`click:`,st=`ask:`,ct=i({type:r(`block_actions`),actions:o(i({action_id:e()}))}),X=i({id:e(),username:a(e()),name:a(e())}),lt=i({user:X,channel:i({id:e()}),message:a(i({ts:e(),thread_ts:a(e())})),trigger_id:a(e()),actions:l([i({action_id:e(),value:e()})])}),ut=i({type:r(`view_submission`),user:X,view:i({callback_id:r(`ask`),private_metadata:e(),state:i({values:i({ask:i({ask:i({value:a(s(e()))})})})})})}),dt=i({thread:e(),message:a(e()),value:e()}),Z=e=>{let t=e.username??e.name;return{id:e.id,...t?{login:t}:{}}};function ft(e){let t=lt.safeParse(e).data,n=t?.actions[0];if(!t||!n)return;let r=t.message?.thread_ts??t.message?.ts,i={thread:`slack:${t.channel.id}${r?`:${r}`:``}`,...t.message?{message:t.message.ts}:{}},a=t.trigger_id;if(n.action_id.startsWith(`ask:`)&&a)return{work:async e=>(await import(`./views-CMHXBMJp.js`)).openAsk(e,a,i,n.value)};if(n.action_id.startsWith(`click:`))return{click:{...i,value:n.value,actor:Z(t.user)}}}function pt(e){let t=ut.safeParse(e).data,n;try{n=t&&dt.safeParse(JSON.parse(t.view.private_metadata)).data}catch{return}if(!t||!n)return;let r=t.view.state.values.ask.ask.value?.trim();return{click:{...n,...r?{text:r}:{},actor:Z(t.user)}}}function Q(e){try{return JSON.parse(e)}catch{let t=new URLSearchParams(e),n=t.get(`payload`);if(!n)return Object.fromEntries(t);try{return JSON.parse(n)}catch{return{}}}}function mt(e,t,n){let r=nt.safeParse(e.event).data;if(r){let e=r.type===`app_uninstalled`||r.tokens?.bot?.length;return n&&e?{uninstalled:`${t}:${n}`}:{ack:!0}}let i=rt.safeParse(e.event).data;if(i)return{work:async e=>(await import(`./views-CMHXBMJp.js`)).publishHome(e,i.user)};let a=it.safeParse(e.event).data;if(a)return{work:async e=>(await import(`./views-CMHXBMJp.js`)).unfurl(e,a)};let o=ct.safeParse(e).data?.actions,s=o?.length?ft(e):void 0;if(s)return s;let c=pt(e);if(c)return c;if(o?.length&&o.every(e=>e.action_id.startsWith(`link:`)))return{ack:!0};if(e.type&&e.type!==`event_callback`&&e.type!==`url_verification`)return{unhandled:`Slack interaction ${e.type}`};let l=tt.safeParse(e).data,u=l?.enterprise_id??l?.authorizations?.[0]?.enterprise_id;if(!l||!u)return;let d=l.event.team_ids;return{covers:{installation:`${t}:${u}`,...l.event.type===`team_access_granted`?{add:d}:{remove:d}}}}function ht(e,t,n){let r=e.headers.get(`x-slack-request-timestamp`)??``;if(!n||!(Math.abs(Date.now()/1e3-Number(r))<=300))return!1;let i=`v0=${p(`sha256`,n).update(`v0:${r}:${t}`).digest(`hex`)}`;return m(e.headers.get(`x-slack-signature`)??``,i)}const gt=e=>e===`im`||e===`mpim`?`dm`:`channel`;function _t(e,t,n=`send it a direct message`){let r=[t.includes(`mention`)&&`mention @${e} in a channel`,t.includes(`dm`)&&n,t.includes(`channel`)&&`write in a channel it is in`].filter(e=>!!e);if(!r.length)return;let i=r.length>1?`${r.slice(0,-1).join(`, `)}, or ${r.at(-1)}`:r[0];return`${i[0].toUpperCase()}${i.slice(1)}.`}const $={id:`slack`,brand:{color:`#E3066A`,icon:`M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zM18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zM15.165 18.956a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z`,svg:`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"><g><path d="M 84.04 252.77 c 0 23.13 -18.89 42.02 -42.02 42.02 S 0 275.9 0 252.77 s 18.89 -42.02 42.02 -42.02 h 42.02 v 42.02 Z" fill="#e3066a"/><path d="M 105.21 252.77 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 v 105.21 c 0 23.13 -18.89 42.02 -42.02 42.02 s -42.02 -18.89 -42.02 -42.02 c 0 0 0 -105.21 0 -105.21 Z" fill="#e3066a"/></g><g><path d="M 147.23 84.04 c -23.13 0 -42.02 -18.89 -42.02 -42.02 S 124.1 0 147.23 0 s 42.02 18.89 42.02 42.02 v 42.02 h -42.02 Z" fill="#00b3ff"/><path d="M 147.23 105.21 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 H 42.02 c -23.13 0 -42.02 -18.89 -42.02 -42.02 s 18.89 -42.02 42.02 -42.02 c 0 0 105.21 0 105.21 0 Z" fill="#00b3ff"/></g><g><path d="M 315.96 147.23 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 -18.89 42.02 -42.02 42.02 h -42.02 v -42.02 Z" fill="#41b658"/><path d="M 294.79 147.23 c 0 23.13 -18.89 42.02 -42.02 42.02 s -42.02 -18.89 -42.02 -42.02 V 42.02 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 v 105.21 Z" fill="#41b658"/></g><g><path d="M 252.77 315.96 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 -42.02 -18.89 -42.02 -42.02 v -42.02 h 42.02 Z" fill="#fcc003"/><path d="M 252.77 294.79 c -23.13 0 -42.02 -18.89 -42.02 -42.02 s 18.89 -42.02 42.02 -42.02 h 105.21 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 h -105.21 Z" fill="#fcc003"/></g></svg>`},name:`Slack`,featured:!0,description:`Mentions, direct messages, and channel messages in a Slack workspace`,installLabel:`Add to Slack`,use:(e,t)=>_t(`{handle}`,e,t?`message it here`:void 0),covered:`Slack workspace`,sample:`slack:C0000000000:1700000000.000100`,prompt:[`A conversation is a Slack thread or a whole 1:1 DM. A group DM works like a channel.`,`conversations_replies reads a thread. conversations_history reads a channel or DM, including DM messages older than your history.`,`Your final message renders as Markdown with headings, tables, lists, code blocks and quotes.`,`Mention a person as <@USER_ID>.`].join(`
|
|
5
|
+
`),replyLimit:12e3,events:{mention:{description:`A message that mentions the agent in a channel or group DM.`,on:`mention`,addressed:!0},dm:{description:`Every message in a direct message or group DM with the agent.`,on:`message`,addressed:!0},command:{description:`/setup and other slash commands`,on:`command`},channel:{description:`Every message in channels the agent is in. Slack delivers at most 30,000 events per workspace per app per hour.`,on:`message`,noisy:!0,addressed:!0}},tools:{presets:Qe,server:$e,install:`set -eu; arch=$(uname -m); case "$arch" in x86_64) arch=amd64; checksum=d1525962e9b9dbfdd2eaf48d0a81ca1eca7d8f1862b8d34931b812c850b3e568;; aarch64|arm64) arch=arm64; checksum=a307a48d16c2261346bdc257274cdcdb8b2027c867dc971b41d52cef36472c88;; *) exit 1;; esac; file=$(mktemp); trap 'rm -f "$file"' EXIT; curl -fsSL "https://github.com/korotovsky/slack-mcp-server/releases/download/v1.3.0/slack-mcp-server-linux-$arch" -o "$file"; echo "$checksum $file" | sha256sum -c -; install -m 755 "$file" /usr/local/bin/slack-mcp-server`,installHosts:[`github.com`,`release-assets.githubusercontent.com`]},hosts:[`slack.com`,`*.slack.com`],get app(){return Ke},target(e,t){let n=Q(t),r=et.safeParse(n).data;if(r?.type===`url_verification`&&r.challenge)return new Response(r.challenge);let i=r?.authorizations?.[0],a=i?.team_id??r?.team_id??n.team?.id,o=String(i?.is_enterprise_install??r?.is_enterprise_install)===`true`,s=o?i?.enterprise_id??r?.enterprise_id??n.enterprise?.id:a,c=i?.user_id;return r?.api_app_id?{app:r.api_app_id,...s?{installation:s}:{},...o&&a?{within:a}:{},...c?{self:c}:{}}:void 0},messages:{asks:!0,post:async(e,t)=>(await import(`./views-CMHXBMJp.js`)).postMessage(e,t),edit:async(e,t,n)=>(await import(`./views-CMHXBMJp.js`)).editMessage(e,t,n),direct:async(e,t,n)=>(await import(`./views-CMHXBMJp.js`)).directMessage(e,t,n)},link(e){let t=/^slack:([^:]+):(\d+)\.(\d+)$/.exec(e.chat?.thread.id??``);return t?`https://slack.com/archives/${t[1]}/p${t[2]}${t[3]}`:void 0},ownEvents(e,t,n,r){let i=$.target(e,t),a=mt(Q(t),n.id,i&&!(i instanceof Response)?i.installation:void 0);if(a)return ht(e,t,r?.signingSecret)?a:{invalid:!0}},adapter:async e=>(await import(`./adapter-CsacmMmv.js`)).slackAdapter(e),event(e,t,n){let r=n.raw.channel_type;return{type:t.isDM?`dm`:e===`mention`?e:gt(r),actor:{id:n.author.userId,...n.author.userName?{login:n.author.userName}:{}}}},requestFetch:ze,isUninstalled(e){let t=e?.data?.error;return[`invalid_auth`,`account_inactive`,`token_revoked`].includes(t??``)},conversation:async(e,t)=>(await import(`./conversation-DT-35cEt.js`)).slackConversation(e,t),auth:{canWrite:Be,async token(e){if(!e.token)throw Error(`Slack installation ${e.id} has no bot token`);return e.token}}};export{$ as a,Le as c,x as d,_ as f,gt as i,Ie as l,re as m,ot as n,W as o,m as p,at as r,Re as s,st as t,R as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{qi as e}from"./core-DwsAMCnL.js";import{A as t,D as n,G as r,Gn as i,Gt as a,I as o,O as s,R as c,Tr as l,b as u,dt as d,k as f,l as p,ot as m,p as h}from"./errors-DO_IltpP.js";import{A as ee,Ct as g,D as _,Dt as v,E as y,I as te,L as ne,O as b,P as x,R as S,bt as C,vt as w,w as re}from"./output-SNqdgh9A.js";import{v as T}from"./prompt-CIx4jwQF.js";import{s as E}from"./args-Dqf5Y1RP.js";import{t as D}from"./remote-HUZCWgfl.js";import{a as O,c as k,i as A,l as ie,n as ae,r as j,t as oe,u as se}from"./actions-D12xDiQS.js";import{n as ce,t as le}from"./base64url-CsVsW4Id.js";import{a as M,i as N,n as P,o as F,r as I,t as L}from"./remote-C9Hj2cby.js";import R from"node:path";import z from"node:process";var B=e({tasks:()=>$});function V(e){return{cwd:e.cwd?R.resolve(e.cwd):z.cwd(),...e.server===void 0?{}:{api:D(e)}}}function H(e,t){let n=u(e,t);if(n)return n;throw new v(`invalid-option`,t?`No task found for "${t}".`:`No tasks found for this workspace.`,{hint:t?[`List tasks: coder task list`,`Start one: coder run "<text>"`]:[`Start one: coder run "<text>"`]})}async function U(e,t){if(t)return e.tasks.get(t);let[n]=await e.tasks.list({limit:1});if(!n)throw new v(`server`,`No server tasks found.`);return n}function W(e){throw new v(`invalid-option`,`Missing task id.`,{hint:e})}async function G(e,t){for(;;){let n=await e.tasks.wait(t),r=P(n).find(e=>!e.answered);if(r)throw new v(`approval-pending`,`Approval needed for task ${t}: ${r.reason}`,{taskId:t,approval:r});if(d.includes(n.status))return n}}function K(e,t){let n=E({server:t.server,workspace:t.organization});return{result:`coder task result ${e} --wait${n}`,steer:`coder task steer ${e} "<follow-up>"${n}`,stop:`coder task stop ${e}${n}`,list:`coder task list${n}`}}function q(e,t){let n=t?.error?.message||e.error;return{taskId:e.id,status:e.status,finalMessage:t?.finalMessage,...n?{error:n}:{},tokens:t?.tokens??null,model:t?.model??e.model??null}}async function ue(e,t={}){if(t.outputSchema!==void 0&&(!t.outputSchema||typeof t.outputSchema!=`object`||Array.isArray(t.outputSchema)))throw new v(`invalid-option`,`outputSchema must be an object.`);let{cwd:n,api:r}=V(t);if(r){let i=await r.tasks.create({source:`cli`,prompt:e,...t.cwd?{cwd:t.cwd}:{},...t.outputSchema?{outputSchema:t.outputSchema}:{},...t.repo?{repo:t.repo}:{},...t.agent?{agent:t.agent}:{},...t.engine?{engine:t.engine}:{},...t.model?{model:t.model}:{},...t.effort?{effort:t.effort}:{},...t.permissions?{permissions:t.permissions}:{},...t.runner?{runner:t.runner}:{},...t.mcp?{mcp:t.mcp.split(`,`).map(e=>e.trim())}:{},...t.connections?{connections:t.connections}:{},...t.name?{name:t.name}:{},...t.appendSystem?{appendSystem:t.appendSystem}:{},...t.addDirs?.length?{addDirs:t.addDirs.map(e=>R.resolve(n,e))}:{}}),a=i.task.id,o=t.addDirs?.length?_(i.task.runner):void 0;if(o&&t.onNote?.(o),!t.wait)return{taskId:a,status:i.status,startupCheck:`pending`,commands:K(a,t)};t.onWaiting?.(a);let s=await G(r,a);return q(M(s),I(s))}let o=t.agent?await(await import(`./exec-BmTa0vcO.js`).then(e=>e.i)).agentTaskOptions(n,t.agent,t.mcp,void 0,t.connections):void 0,s=o?.connected??await i(t.connections);for(let e of s.warnings)t.onNote?.(e);let c=a(n),l=o??x(t.mcp,c.mcp,{},s.mcp),u={prompt:e,outputSchema:t.outputSchema,cwd:n,engine:t.engine??o?.engine,model:t.model??(t.engine?void 0:o?.model),effort:t.effort??(t.engine?void 0:o?.effort),permissions:t.permissions??o?.permissions,name:t.name,appendSystem:t.appendSystem,...o?{agentPrompt:{developer:o.developer}}:{},wait:t.wait,addDirs:t.addDirs,...t.agent?{agentId:t.agent}:{},mcp:l.mcp,mcpBindings:l.mcpBindings,mcpWarnings:l.warnings,connectionEnv:s.env,connections:s.ids,nativeMcp:l.nativeMcp,...t.onFallback?{onFallback:t.onFallback}:{},...t.onNote?{onNote:t.onNote}:{}},d=await y(u,{config:c});if(!t.wait){let e=d.taskId;return{taskId:e,status:d.task.status,startupCheck:d.startupCheck,commands:K(e,t)}}for(;;){let r=d.taskId;t.onWaiting?.(r);let i=await S(n,r),{task:a,result:o}=i,s=o?.error?.message??``;if(a.status===`failed`&&b(a.permissions??`auto`,s))throw new v(`read-only-unavailable`,s);let l=te(n,i,c);if(l!==void 0){if(l===null)throw new v(`chain-exhausted`,s,{payload:re(d.engine,s,a.permissions??`auto`,t.appendSystem,e)});t.onFallback?.({engine:d.engine,detail:s,next:l}),d=await y({...u,engine:l,model:void 0,effort:void 0,name:void 0},{config:c});continue}return q(a,o)}}async function de(e,t={}){let{cwd:i,api:a}=V(t);if(a){let n=await U(a,e);t.wait&&([`completed`,`failed`,`cancelled`].includes(n.status)||t.onWaiting?.(n.task.id),n=await G(a,n.task.id));let r=t.tail?await a.tasks.logs(n.task.id):[],i=(t.tail===`all`?r:r.slice(-Number(t.tail))).map(N);return fe(n,i)}let s=H(i,e);if(t.wait){m.includes(s.status)&&t.onWaiting?.(s.id);let e=await ne(i,s);if(s=e.task,e.reason===`approval`)throw new v(`approval-pending`,`Approval needed for task ${s.id}: ${e.approval.reason}`,{taskId:s.id,approval:e.approval})}let{steps:c,result:l,turns:u}=ee(i,s.id,{tail:t.tail,task:s}),d=g(r(i,s.id)),f=m.includes(s.status),h=f?n(i,s):s.updatedAt,_=p(h),y=f?o(i,s.id,200):[];return{taskId:s.id,status:f&&d.length?`waiting-approval`:s.status,task:s,result:l,steps:c,turns:u,pendingApprovals:d.map(({id:e,reason:t,actions:n})=>({id:e,reason:t,actions:n})),...f?{idleMs:_,lastActivityAt:h??null,stalled:d.length===0&&_>6e5,lastLog:y.at(-1),liveTokens:y.reverse().find(e=>e.kind===`usage`&&String(e.at??``)>=(s.resumedAt??``))?.tokens??null}:{}}}function fe(e,t){let n=M(e),r=P(e).filter(e=>!e.answered).map(({id:e,reason:t,actions:n})=>({id:e,reason:t,actions:n})),i=m.includes(n.status),a=L(e.lastActivityAt??e.updatedAt),o=p(a);return{taskId:n.id,status:i&&r.length?`waiting-approval`:n.status,task:n,result:I(e),steps:t,turns:F(e),pendingApprovals:r,...i?{idleMs:o,lastActivityAt:a??null,stalled:r.length===0&&o>6e5,liveTokens:null}:{}}}function J(e,t,n){let r=m.includes(e.status);return{taskId:e.id,status:r&&t?`waiting-approval`:e.status,pendingApprovals:t,engine:e.engine??null,model:e.model??null,effort:e.effort??null,name:e.name??null,cwd:e.cwd??null,prompt:String(e.prompt??``).replace(/\s+/g,` `).trim().slice(0,80),updatedAt:e.updatedAt,archived:e.archived??!1,flowRunId:e.flowRunId??null,idleMs:r?p(n??void 0):null}}async function pe(e={}){let{cwd:t,api:i}=V(e),a=e.limit??50;if(i){let t=[],n=e.cursor??``,r;do{let o=await i.tasks.list({cursor:n,limit:a===`all`?200:Math.min(200,a-t.length),status:e.running?`active`:void 0,archived:e.archived});for(let n of o.items)(!e.stopped||d.includes(n.status))&&t.push(J(M(n),P(n).filter(e=>!e.answered).length,L(n.lastActivityAt??n.updatedAt)));r=o.next,n=r??``}while(r&&(a===`all`||t.length<a));return{items:Object.assign(t,{archived:0}),...r?{next:r}:{}}}let{tasks:o}=A(t,{...e,limit:`all`,dir:e.dir??e.cwd}),c=o.map(e=>J(e,m.includes(e.status)?g(r(t,e.id)).length:0,m.includes(e.status)?n(t,e):null)),l=0;if(e.cursor){let t;try{if(t=le(e.cursor),typeof t!=`string`)throw Error()}catch{throw new v(`invalid-option`,`Invalid task list cursor.`)}let n=c.findIndex(e=>e.taskId===t);if(n<0)throw new v(`invalid-option`,`Task list cursor is no longer available; start a new list.`);l=n+1}let u=c.slice(l,a===`all`?void 0:l+a),f=!c.length&&!e.archived?s(t,{migrate:!1}).length:0;return{items:Object.assign(u,{archived:f}),...l+u.length<c.length?{next:ce(u.at(-1).taskId)}:{}}}async function*me(e,t){let n=-1;for(;;){let r=await e.tasks.stream(t,n);if(!r.ok||!r.body){let n=await e.tasks.get(t);if(d.includes(n.status))return;if(r.status===401)continue;throw new v(`server`,`The task stream answered ${r.status}.`)}let i=!1;for await(let e of T(r.body))if(e.event===`log`){let t=JSON.parse(e.data);n=t.seq,yield N(t)}else e.event===`end`&&(i=!0);if(i)return}}async function*Y(e){yield*await e}async function X(e,n={}){let{cwd:i,api:a}=V(n);if(a){let t=M(await U(a,e));return{task:t,events:n.from===void 0?me(a,t.id):Y(a.tasks.logs(t.id,n.from-1).then(e=>e.map(N))),async final(){let e=await a.tasks.get(t.id),n=M(e);return{taskId:t.id,status:n.status,result:I(e),task:n}}}}let s=H(i,e);return{task:s,events:n.from===void 0?se(i,s.id,{tail:n.tail}):Y(o(i,s.id,1/0).slice(n.from)),async final(){let e=c(i,t(i,s.id)??s),n=l(R.join(r(i,s.id),`result.json`));return{taskId:s.id,status:e.status,result:n,task:e}}}}async function he(e,n,i={}){let{cwd:a,api:o}=V(i);if(o){let t=await o.tasks.steer(e,n,{...i.model?{model:i.model}:{},...i.effort?{effort:i.effort}:{},...i.permissions?{permissions:i.permissions}:{}}),r=t.steered??(t.task?`resumed`:`live`);if(!i.wait||r===`queued`)return{taskId:e,steered:r};let a=await G(o,e);return{taskId:e,steered:r,status:M(a).status,finalMessage:I(a)?.finalMessage??null}}let s=await k(a,H(a,e),n,{model:i.model,effort:i.effort,permissions:i.permissions});if(!i.wait||s.steered===`queued`)return s;let c=t(a,s.taskId),u=c?(await S(a,c.id)).task:null,d=l(R.join(r(a,s.taskId),`result.json`));return{...s,status:u?.status??null,finalMessage:d?.finalMessage??null}}async function Z(e,t,n){let r=(await e.tasks.get(t)).answer?.length??0,i=new AbortController,a=await e.tasks.events([t],void 0,i.signal);try{let o=(await e.tasks.ask(t,n)).answer,s=!1,c;for(;o===void 0&&!s;){if(!a.ok||!a.body)throw new v(`server`,`The task events stream answered ${a.status}.`);for await(let e of T(a.body)){if(c=e.id??c,e.event!==`task`)continue;let n=JSON.parse(e.data);if(n.id===t&&((n.answer?.length??0)>r?o=n.answer[r]:s=!!n.deleted||d.includes(n.status),o!==void 0||s))break}o===void 0&&!s&&(a=await e.tasks.events([t],c,i.signal))}let l=typeof o==`string`?o:``;return{taskId:t,answer:l||null,...o===void 0?{error:`The task ended before it answered.`}:{},ok:!!l}}finally{i.abort()}}async function ge(e,t,n={}){let{cwd:r,api:i}=V(n);if(i)return n.onAsking?.(e),Z(i,e,t);let a=H(r,e);n.onAsking?.(a.id);let o=await ae(r,a,t,{model:n.model,effort:n.effort});return{taskId:a.id,answer:o.finalMessage||null,...o.error?{error:o.error.message}:{},ok:o.status===0}}const Q=(e,t)=>({taskId:e,id:t.id,reason:t.reason,actions:t.actions,createdAt:t.createdAt,answered:t.response?.decision??null,deniedReason:t.response?.decision===`decline`?t.response.reason??null:null});async function _e(e,t={}){let{cwd:n,api:i}=V(t);if(i)return(e?[await i.tasks.get(e)]:await i.tasks.list({limit:200})).flatMap(n=>P(n).filter(n=>t.denied?n.answered===`decline`:e||!n.answered).map(e=>({taskId:n.task.id,...e})));let a=t.denied?w:g;if(!e)return j(n,a,`all`).map(({taskId:e,...t})=>Q(e,t));let o=H(n,e);return(t.denied?w:C)(r(n,o.id)).map(e=>Q(o.id,e))}async function ve(e,t,n={}){let{cwd:r,api:i}=V(n),a=n.deny?`decline`:`accept`;if(i){if(!e||!t)throw new v(`invalid-option`,`Server approvals need a task id and approval id.`,{hint:`Usage: coder task approve <task-id> <approval-id> --server <url>`});return await i.tasks.approve(e,t,a,n.reason?{reason:n.reason}:{}),{taskId:e,approvalId:t,decision:a}}if(e&&!t&&e.startsWith(`apr-`)&&(t=e,e=j(r,C,`all`).find(e=>e.id===t)?.taskId,!e))throw new v(`invalid-option`,`No approval "${t}".`,{hint:`List them: coder task approvals`});if(!e||!t)throw new v(`invalid-option`,`Missing approval id.`,{hint:[`List them: coder task approvals`,`Usage: coder task approve [task-id] <approval-id> [--deny] [--reason <why>]`]});let o=H(r,e);return await oe(r,o,t,a,{reason:n.reason}),{taskId:o.id,approvalId:t,decision:a}}async function ye(e,t={}){let{cwd:n,api:r}=V(t);if(r){let t=e??(await U(r)).task.id;return await r.tasks.cancel(t),{taskId:t,status:`cancelled`,interrupt:`stop requested on the server`}}let i=H(n,e),{interrupt:a}=await ie(n,i);return{taskId:i.id,status:`cancelled`,interrupt:a}}async function be(e,t={}){let{cwd:n,api:r}=V(t);if(r){let n=t.allStopped?(await r.tasks.list({limit:200})).filter(e=>d.includes(e.status)).map(e=>e.task.id):[];return t.allStopped?(await Promise.all(n.map(e=>r.tasks.archive(e))),{archived:n,count:n.length}):(e||W([`Archive one: coder task archive <task-id> --server`]),await r.tasks.archive(e),{taskId:e,archived:!0})}if(t.allStopped){let e=f(n).filter(e=>d.includes(e.status));for(let t of e)h(n,t);return{archived:e.map(e=>e.id),count:e.length}}e||W([`Archive one: coder task archive <task-id>`,`Archive all stopped: coder task archive --all-stopped`]);let i=H(n,e);return h(n,i),{taskId:i.id,archived:!0}}async function xe(e,t={}){let{cwd:n,api:r}=V(t);if(r){let n=t.allArchived?(await r.tasks.list({limit:200,archived:!0})).map(e=>e.task.id):[];return t.allArchived?(await Promise.all(n.map(e=>r.tasks.delete(e))),{deleted:n,count:n.length}):(e||W([`Delete one: coder task delete <task-id> --server`]),await r.tasks.delete(e),{taskId:e,deleted:!0})}if(t.allArchived){let e=s(n).filter(e=>O(n,e)).map(e=>e.id);return{deleted:e,count:e.length}}e||W([`Delete one: coder task delete <task-id>`,`Delete all archived: coder task delete --all-archived`]);let i=H(n,e);if(i.status===`running`)throw new v(`invalid-option`,`Task ${i.id} is still running.`,{hint:`Stop it first: coder task stop ${i.id}`});return O(n,i),{taskId:i.id,deleted:!0}}async function*Se(e,t={}){yield*(await X(e,t)).events}const $={run:ue,result:de,list:pe,watch:X,stream:Se,steer:he,ask:ge,approvals:_e,approve:ve,stop:ye,archive:be,delete:xe};export{$ as n,B as t};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{qi as e}from"./core-DwsAMCnL.js";import{A as t,Dr as n,Ft as r,G as i,Gt as a,L as o,Nt as s,Or as c,Sr as l,T as u,Tr as d,Vn as f,_ as p,d as m,ft as h,h as g,it as _,k as v,kr as y,mn as b,rt as x,w as ee,xn as S,y as te}from"./errors-DO_IltpP.js";import{N as ne,R as re,U as ie,at as C,bt as w,k as ae,nt as oe,rt as T}from"./output-SNqdgh9A.js";import{t as E}from"./integrations-I7fRDk_l.js";import{c as se,d as D,f as O,l as ce,m as k,n as A,o as le,t as j}from"./actions-D12xDiQS.js";import{t as ue}from"./log-view-CfX9lakH.js";import{i as M}from"./mcp-DAHbhfUh.js";import{a as de,d as fe,r as pe,s as me,u as he}from"./exec-BmTa0vcO.js";import{n as ge}from"./async-Tj4zKHXR.js";import N from"node:path";import P from"node:process";import{execFile as F}from"node:child_process";import{createHash as I}from"node:crypto";import _e from"node:os";import ve from"node:net";import L from"node:http";import R from"node:fs/promises";import{promisify as z}from"node:util";import{gunzipSync as ye,gzipSync as B}from"node:zlib";const V=e=>I(`sha256`).update(e).digest(`hex`);function H(e,t,n){if(e===`claude`)return N.join(ie(),process.env.CLAUDE_CODE_PROJECT_DIR_NAME||`coder`,`${t}.jsonl`);let r=new Date(JSON.parse(n.slice(0,n.indexOf(`
|
|
2
|
+
`))).timestamp).toISOString().slice(0,19).replaceAll(`:`,`-`);return N.join(h(),`sessions`,...r.slice(0,10).split(`-`),`rollout-${r}-${t}.jsonl`)}function U(e,t){return t.flatMap(e=>[e,...e.startsWith(`Bearer `)?[e.slice(7)]:[]]).filter(e=>e.length>=8).flatMap(e=>[e,JSON.stringify(e).slice(1,-1)]).sort((e,t)=>t.length-e.length).reduce((e,t)=>e.replaceAll(t,`[REDACTED]`),e)}function W(e,t){let n=new Map;return{async restore(){let t=await e(`/history`).catch(e=>(console.error(`coder runner: saved history could not be listed`,e),[])),r=t.at(-1),i;return await Promise.all(t.map(async({engine:t,conversation:a})=>{if(D.test(a))try{let{data:o,state:s}=await e(`/history/${a}`);a===r.conversation&&(i=s);let c=ye(Buffer.from(o,`base64`)).toString(`utf8`);for(let e of c.split(`
|
|
3
|
+
`))e.trim()&&JSON.parse(e);let[l]=await k({engine:t},a);l||(l=H(t,a,c),await R.mkdir(N.dirname(l),{recursive:!0,mode:448}),await R.writeFile(l,c,{mode:384})),n.set(a,{engine:t,hash:V(c),file:l})}catch(e){console.error(`coder runner: history ${a} could not be restored`,e)}})),{...r?{resume:{...i,engine:r.engine,threadId:r.conversation}}:{},restored:!!(r&&n.has(r.conversation))}},async save(r){let i=new Map([...n].map(([e,{engine:t}])=>[e,t]));if(r?.engine===`claude`||r?.engine===`codex`)for(let e of O(r))i.delete(e),i.set(e,r.engine);let a=await t();for(let[t,o]of i){let i=n.get(t)?.file,s=i&&await R.stat(i).then(e=>e.isFile(),()=>!1)?i:(await k({engine:o},t))[0],c=s?await R.readFile(s,`utf8`).catch(()=>``):``,l=t===r?.threadId;if(!c||!l&&V(c)===n.get(t)?.hash)continue;let u=B(U(c,a)).toString(`base64`);if(u.length>3145728){console.error(`coder runner: history ${t} is too large to save`);continue}let d=l?{previousThreadIds:r.previousThreadIds}:void 0;await e(`/history`,{method:`POST`,body:JSON.stringify({engine:o,conversation:t,data:u,...d?{state:d}:{}})}).then(()=>n.set(t,{engine:o,hash:V(c),file:s}),e=>console.error(`coder runner: history ${t} was not saved`,e))}}}}var G=e({INBOX_COMMAND:()=>Le,INBOX_SOCKET:()=>Pe,applyTaskMessage:()=>Ae,checkout:()=>Y,checkoutCache:()=>X,inboxSocket:()=>Fe,prepareRepo:()=>De,receiveInbox:()=>Re,releaseCheckout:()=>Q,requestInboxControl:()=>ke,runTask:()=>Me,sendInbox:()=>Ie,startInboxControl:()=>Oe,taskServer:()=>q,withCheckoutLock:()=>Z});const K=z(F);function q(){let e=P.env.CODER_SERVER?.replace(/\/+$/,``),t=P.env.CODER_TASK_TOKEN;if(!e||!t)throw Error(`CODER_SERVER and CODER_TASK_TOKEN are required with --task`);return{server:e,token:t}}async function J(e,t,n,r=``,i={}){let a=await fetch(`${e}/tasks/${encodeURIComponent(n)}${r}`,{...i,signal:i.signal?AbortSignal.any([i.signal,AbortSignal.timeout(3e4)]):AbortSignal.timeout(3e4),headers:{authorization:`Bearer ${t}`,...i.body?{"content-type":`application/json`}:{},...i.headers}}),o=await a.json().catch(()=>({}));if(!a.ok)throw Object.assign(Error(o.error??`Coder server answered ${a.status}`),{status:a.status});return o}function be(e){return e.length>0&&!e.startsWith(`-`)&&!e.endsWith(`/`)&&!e.endsWith(`.`)&&!e.endsWith(`.lock`)&&!/[\x00-\x20\x7f~^:?*[\\]/.test(e)&&!e.includes(`..`)&&!e.includes(`@{`)&&!e.includes(`//`)}async function Y(e,t,n,r,i){let a=e.event?.repo,o=N.join(t,`work`);if(!a)return await R.mkdir(o,{recursive:!0}),o;let s=e=>R.stat(e).then(Boolean,()=>!1);if(await s(N.join(o,`.git`))&&(r||await s(N.join(t,`.runner-task.json`))))return o;if(!be(a.defaultBranch))throw Error(`Invalid repository ref`);let c=new URL(a.cloneUrl),l=E[e.event.integration]?.repos?.cloneHosts??[];if(c.protocol!==`https:`||!l.includes(c.hostname))throw Error(`Repository clone host does not match the integration`);await R.mkdir(t,{recursive:!0});let u=await R.mkdtemp(N.join(t,`.git-credential-`)),d=N.join(u,`token`),f=N.join(u,`askpass.sh`);n&&(await R.writeFile(d,n,{mode:384}),await R.writeFile(f,`#!/bin/sh
|
|
4
|
+
case "$1" in *Username*) printf x-access-token;; *) command cat "$CODER_GIT_TOKEN_FILE";; esac
|
|
5
|
+
`,{mode:448}));let p=n?{env:{...P.env,GIT_ASKPASS:f,CODER_GIT_TOKEN_FILE:d,GIT_TERMINAL_PROMPT:`0`}}:void 0;try{let e={...p,signal:i,maxBuffer:67108864};if(r)return await Z(r,async()=>{if(!await R.stat(N.join(r,`.git`)).catch(()=>void 0)){let t=await R.mkdtemp(`${r}-clone-`);try{await K(`git`,[`clone`,`--depth`,`50`,a.cloneUrl,t],e),await R.rename(t,r)}finally{await R.rm(t,{recursive:!0,force:!0})}}await K(`git`,[`-C`,r,`worktree`,`prune`,`--expire`,`now`],e),await K(`git`,[`-C`,r,`remote`,`set-url`,`origin`,a.cloneUrl],e),await K(`git`,[`-C`,r,`fetch`,`--depth`,`50`,`origin`,a.defaultBranch],e),await K(`git`,[`-C`,r,`worktree`,`add`,`--detach`,o,`FETCH_HEAD`],e)}),o;await s(N.join(o,`.git`))||await K(`git`,[`clone`,`--depth`,`50`,a.cloneUrl,o],e),await K(`git`,[`-C`,o,`fetch`,`--depth`,`50`,`origin`,a.defaultBranch],e),await K(`git`,[`-C`,o,`checkout`,`--detach`,`FETCH_HEAD`],e)}finally{await R.rm(u,{recursive:!0,force:!0})}return o}function X(e){let t=e.event?.repo;if(t){if(![t.owner,t.name].every(e=>/^[\w.-]+$/.test(e)&&!/^\.+$/.test(e)))throw Error(`Invalid repository name`);return p(`checkouts`,new URL(t.cloneUrl).hostname,t.owner,t.name)}}async function Z(e,t){return c(`${e}.lock`,t,1/0,3e5)}async function Q(e){if(!(await R.stat(N.join(e,`.git`)).catch(()=>void 0))?.isFile())return;let t=await K(`git`,[`-C`,e,`rev-parse`,`--git-common-dir`]).catch(async t=>{if(await R.stat(N.join(e,`.git`)).catch(()=>void 0))throw t});if(!t)return;let{stdout:n}=t,r=N.resolve(e,n.trim());await Z(N.dirname(r),async()=>{await R.stat(N.join(e,`.git`)).catch(()=>void 0)&&await K(`git`,[`--git-dir`,r,`worktree`,`remove`,`--force`,e])})}const $=1048576;async function xe(e){let t={maxBuffer:67108864};await K(`git`,[`-C`,e,`add`,`--intent-to-add`,`--all`],t);let{stdout:n}=await K(`git`,[`-C`,e,`diff`,`HEAD`],t);return Buffer.byteLength(n)>$?`${Buffer.from(n).subarray(0,$).toString()}\n[diff truncated]`:n}async function Se(e,t){delete P.env.CODER_SERVER,delete P.env.CODER_TASK_TOKEN,delete P.env.APP_TOKEN;for(let t of Object.keys(e.tokens))delete P.env[M(t)];for(let t of e.engineCredentials??[])for(let e of Object.keys(t.credential.env))delete P.env[e];let{CODEX_AUTH_JSON:n,[s]:i,...a}=e.credential.env;if(Object.assign(P.env,a),P.env[r]=JSON.stringify(e.config??{}),P.env.CODER_MCP_MODE=`cloud`,P.env.CODER_MCP_CONNECTION_ENV=JSON.stringify(f(e.connections??{})),!n)return;let o=await R.mkdtemp(N.join(t,`.codex-`));return await R.writeFile(N.join(o,`auth.json`),n,{mode:384}),P.env.CODEX_HOME=o,o}async function Ce(e,t){let{ANTHROPIC_API_KEY:n,CLAUDE_CODE_OAUTH_TOKEN:r}=e.credential.env;if(e.credential.engine!==`claude`||!n&&!r)return;let i=await R.mkdtemp(N.join(t,`.claude-`));return P.env.CLAUDE_CONFIG_DIR=i,P.env.CLAUDE_CODE_PROJECT_DIR_NAME=`coder`,i}async function we(e,t,n){let r=n?await R.readFile(N.join(n,`auth.json`),`utf8`).catch(()=>``):``,i=(e=``)=>{let t=[];try{JSON.parse(e,(e,n)=>(typeof n==`string`&&/token|key/i.test(e)&&t.push(n),n))}catch{e&&console.error(`coder runner: history credentials could not be parsed`)}return t};return[t,...Object.values(e.tokens),...e.postToken?[e.postToken]:[],...Object.values(e.nativeTokens??{}),...Object.values(e.connectionEnv??{}),...Object.entries(e.credential.env).filter(([e])=>/KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|AUTH/i.test(e)).map(([,e])=>e),...i(e.credential.env.CODEX_AUTH_JSON),...e.engineCredentials?.flatMap(e=>[...Object.values(e.credential.env),...i(e.credential.env.CODEX_AUTH_JSON)])??[],...i(r)]}async function Te(e,t,n,r){if(!r)return;let i=await R.readFile(N.join(r,`auth.json`),`utf8`).catch(()=>``);i&&i!==n.credential.env.CODEX_AUTH_JSON&&await J(e.server,e.token,t,`/credential`,{method:`POST`,body:JSON.stringify({authJson:i,credentialId:n.task.credential})}).catch(()=>{}),await R.rm(r,{recursive:!0,force:!0})}const Ee=[[`bun.lock`,`bun`,[`install`,`--frozen-lockfile`]],[`bun.lockb`,`bun`,[`install`,`--frozen-lockfile`]],[`pnpm-lock.yaml`,`npx`,[`-y`,`pnpm`,`install`,`--frozen-lockfile`]],[`yarn.lock`,`npx`,[`-y`,`yarn`,`install`,`--frozen-lockfile`]],[`package-lock.json`,`npm`,[`ci`]]];async function De(e,t){let n=q(),r=await J(n.server,n.token,e),i=r.task.event;if(!i?.repo)throw Error(`The task has no repository`);let a=await Y(r.task,t,r.tokens[i.integration]);for(let[e,t,n]of Ee)if(await R.stat(N.join(a,e)).catch(()=>void 0)){await K(t,n,{cwd:a,maxBuffer:67108864}).catch(()=>{});break}let o=(await K(`git`,[`-C`,a,`rev-parse`,`HEAD`])).stdout.trim();return console.log(`coder-snapshot ${o}`),{sha:o}}function Oe(e,t,n){let r=new Set,i=C(N.join(e,`inbox-control`),{apply(e){let i=e.entry;if(e.task!==t||!Number.isInteger(i?.seq)||i.seq<0||!Number.isInteger(i.generation)||i.generation<0||![`steer`,`ask`,`approve`].includes(i.kind))throw Error(`Invalid engine inbox command`);let a=n(i);return r.add(a),a.finally(()=>r.delete(a)).catch(()=>{}),a}});return{close:async()=>{i(),await Promise.allSettled([...r])}}}function ke(e,t,n){let r=T({task:t,generation:n.generation,seq:n.seq});return oe(`apply`,{task:t,entry:n},{dir:N.join(e,`inbox-control`),id:r,keepReply:!0,timeoutMs:3e4})}async function Ae(e,n,r,a=le(n.mcp)){let o={task:n.name?.slice(6)??n.id,generation:r.generation,seq:r.seq},s=N.join(i(e,n.id),`inbox-control`,`${T(o)}.transcript.jsonl`);return c(`${s}.lock`,async()=>{let i=await R.readFile(s,`utf8`).catch(e=>{if(e.code===`ENOENT`)return``;throw e});for(let e of i.split(`
|
|
6
|
+
`)){if(!e.trim())continue;let t;try{t=JSON.parse(e)}catch{continue}if(T(t.command)===T(o)&&Object.hasOwn(t,`result`))return t.result}let c=r.value;if(r.kind===`steer`){let i=String(c?.text??r.value??``),s=!1;n.threadId||(s=await _(e,n.id,()=>{let r=t(e,n.id)??n;if(r.threadId)return!1;if(r.steerClosed||![`running`,`queued`].includes(r.status))throw Error(`Task stopped before it opened a conversation`);return te(e,n.id,i),!0})),s||await se(e,t(e,n.id)??n,i,{command:o,resolveConnections:a})}else if(r.kind===`ask`){let t=await A(e,n,String(c?.question??r.value??``),{command:o});return t.finalMessage??t.error?.message??``}else if(r.kind===`approve`){let t=String(c?.approvalId??c?.id??``);try{await j(e,n,t,c?.decision===`deny`||c?.decision===`decline`?`decline`:`accept`,{...typeof c?.reason==`string`?{reason:c.reason}:{},command:o,resolveConnections:a})}catch(r){if(!(r instanceof Error&&r.message.includes(`already approved`)))throw r;m(e,n.id,{kind:`status`,message:`Ignored an answer to approval ${t}: ${r.message}`})}}await R.mkdir(N.dirname(s),{recursive:!0}),await R.appendFile(s,JSON.stringify({command:o,result:null})+`
|
|
7
|
+
`)})}async function je(e){for(let t=1;;t++)try{return await e()}catch(e){let n=e.status;if(n!==void 0&&n<500||t>=6)throw e;console.error(`coder runner: Coder server did not take the request, trying again: ${e instanceof Error?e.message:e}`),await new Promise(e=>setTimeout(e,1e3*2**(t-1)))}}async function Me(e,n){let i=q();S(`runner.credentials.start`);let a=await je(()=>J(i.server,i.token,e)).catch(async t=>{throw await J(i.server,i.token,e,`/result`,{method:`POST`,body:JSON.stringify({status:`failed`,error:t instanceof Error?t.message:String(t)})}).catch(()=>{}),t});S(`runner.credentials.done`);let o=a.task.event,s=o&&a.tokens[o.integration],c=P.env.CODER_INBOX_MODE===`poll`;delete P.env.CODER_INBOX_MODE;let l=P.env.CODER_CHECKOUT_CACHE;delete P.env.CODER_CHECKOUT_CACHE;let u,f,p={CODEX_HOME:P.env.CODEX_HOME,CLAUDE_CONFIG_DIR:P.env.CLAUDE_CONFIG_DIR},m,h=new AbortController,g=setTimeout(()=>h.abort(Error(`timeout`)),a.timeoutMs??18e5),_=setInterval(()=>{J(i.server,i.token,e,`/heartbeat`,{method:`POST`,signal:AbortSignal.timeout(1e4)}).catch(()=>{})},3e4),v,y=async()=>{let r=d(N.join(n,`.runner-task.json`)),o=v&&r?.generation===a.generation?t(v,r.id):void 0;await m?.save(o??void 0).catch(e=>console.error(`coder runner: history upload failed`,e)),f&&await R.rm(f,{recursive:!0,force:!0}),await Te(i,e,a,u)},b=!1,x=async t=>{b=!0,await y(),await je(()=>J(i.server,i.token,e,`/result`,{method:`POST`,body:JSON.stringify(t)}))};try{let t=(async()=>{[u,f]=await Promise.all([Se(a,n),Ce(a,n)]),m=a.task.flow==="default"?W((t,n)=>J(i.server,i.token,e,t,n),()=>we(a,i.token,u)):void 0,S(`runner.environment.done`);let t=await m?.restore();return S(`runner.history.done`),t})();S(`runner.checkout.start`);let r=Promise.race([Y(a.task,n,s,l,h.signal),new Promise((e,t)=>h.signal.addEventListener(`abort`,()=>t(h.signal.reason),{once:!0}))]).then(e=>(v=e,S(`runner.checkout.done`),e)),[o,d]=await Promise.allSettled([r,t]);if(o.status===`rejected`)throw o.reason;if(d.status===`rejected`)throw d.reason;return h.signal.throwIfAborted(),await Ne(e,n,i,a,o.value,s,c,h.signal,y,x,d.value,a.engineCredentials?async e=>{if(e===a.credential.engine)return!0;let t=a.engineCredentials.find(t=>t.credential.engine===e);if(!t)return!1;await y();for(let[e,t]of Object.entries(p))t===void 0?delete P.env[e]:P.env[e]=t;return a.credential=t.credential,a.task={...a.task,credential:t.id,usage:{...a.task.usage,engine:e,model:void 0,effort:void 0}},[u,f]=await Promise.all([Se(a,n),Ce(a,n)]),!0}:void 0)}catch(e){throw b||await x({status:`failed`,error:e instanceof Error?e.message:String(e),...a.task.event&&E[a.task.event.integration]?.isUninstalled?.(e)?{installationRevoked:!0}:{}}).catch(e=>console.error(`coder runner: result delivery failed`,e)),e}finally{clearTimeout(g),clearInterval(_),delete P.env[r],delete P.env.CODER_MCP_MODE,delete P.env.CODER_MCP_CONNECTION_ENV}}async function Ne(e,r,s,c,f,p,h,_,S,ie,C,oe){let T=c.task.event,D=c.task.flow==="default"?c.postToken:p,O=new AbortController,k,A,j=!1,M=await Re({root:r,generation:c.generation,apply:async n=>{let r=k&&t(f,k);if(!r)throw Error(`The task is not ready`);if(n.kind===`cancel`){await ce(f,r),j=!0,await W(),await S();return}return ke(i(f,r.id),e,n)}}),P=M.ack().seq>=0?M.ack():void 0,F,I=()=>{if(F)return F;if(!P)return Promise.resolve();let t=P;return F=J(s.server,s.token,e,`/ack`,{method:`POST`,body:JSON.stringify(t),signal:O.signal}).then(()=>{P&&P.seq<=t.seq&&(P=void 0)}).catch(e=>{throw(e.status===401||e.status===403)&&(P=void 0),e}).finally(()=>{F=void 0}),F},_e=async()=>{let t=await J(s.server,s.token,e,`/messages?after=${M.ack().seq}`,{signal:O.signal});try{t.length&&await M.apply(t)}finally{t.length&&M.ack().seq>=0&&(P=M.ack()),await I().catch(()=>{})}},ve=setInterval(()=>{I().catch(()=>{})},1e3),L=d(N.join(r,`.runner-task.json`)),R=new Map,z=new Map,ye=(c.logCursor??-1)+1,B=0,V=[],H,U=()=>{for(let e of z.values())for(let t of e()){if(B>=2097152)continue;let e=Buffer.byteLength(t)>65536?`A task log entry exceeded 64 KB`:t;V.push({seq:ye++,at:Date.now(),level:`out`,line:e}),B+=Buffer.byteLength(e)}return H||(H=(async()=>{for(;V.length;){let t=0,n=V.slice(0,100).filter(e=>(t+=Buffer.byteLength(JSON.stringify(e)))<524288);if(!n.length)throw Error(`Task log batch is too large`);let r=!1;for(let t=0;t<3;t++)try{await J(s.server,s.token,e,`/logs`,{method:`POST`,signal:AbortSignal.timeout(5e3),body:JSON.stringify({entries:n})}),r=!0;break}catch(e){if(t===2)throw e;await new Promise(e=>setTimeout(e,1e3))}r&&V.splice(0,n.length)}})().finally(()=>{H=void 0}),H)},W=()=>U().catch(e=>{console.error(`coder runner: log delivery failed`,e)}),G,K,q=!1,be=L?.generation===c.generation?L.usageStart:0,Y=L?.generation===c.generation?L.turn:0,X=Y+1,Z=(e,t=!1,n=!1)=>de(E[T.integration],T,e,D,c.task.author,t,n),Q=()=>k?w(i(f,k)):[],$=async t=>{await J(s.server,s.token,e,`/result`,{method:`POST`,body:JSON.stringify({status:`waiting`,approval:t,approvals:Q()})})};try{let d=C?.restored&&C.resume?.engine===ne({engine:c.task.usage?.engine??c.task.definition.engine,model:c.task.usage?.model??c.task.definition.model},a(f)).engine,p,v=pe({cwd:f,...L?.generation===c.generation?{resumeTaskId:L.id,resumeTurn:Y}:{},...C?.resume?{resume:C.resume}:{},agent:c.task.agent,flow:c.task.flow,task:d?{...c.task,context:{...c.task.context,messages:void 0}}:c.task,toolEnvironment:{tokens:{...c.tokens,...c.nativeTokens},native:Object.keys(c.nativeTokens??{})},replyEndpoint:{url:`${s.server}/tasks/${encodeURIComponent(e)}`,token:s.token},connections:c.connections,connectionEnv:c.connectionEnv,post:c.task.source===T?.integration,...D?{postToken:D}:{},onStart(e){A=e},onWorker(e,t){p=t,t.once(`error`,()=>{p=void 0})},async onTask(e,a){if(k=e,_.aborted){let n=t(f,e);throw n&&await ce(f,n),_.reason}z.has(e)||z.set(e,l(N.join(i(f,e),`log.jsonl`))),R.has(e)||R.set(e,n(i(f,e),e=>{(!e||e===`log.jsonl`)&&U().catch(()=>{})})),U().catch(()=>{}),y(N.join(r,`.runner-task.json`),{generation:c.generation,id:e,turn:a??Y,usageStart:be}),await I().catch(()=>{}),await _e().catch(()=>{}),clearInterval(G),h&&(G=setInterval(()=>{K||=_e().catch(()=>{}).finally(()=>{K=void 0})},4e3))},onApproval:$,onEngine:oe}),S=new Promise((e,t)=>{let n=()=>t(_.reason);_.addEventListener(`abort`,n,{once:!0}),_.aborted&&n()}),w=await Promise.race([v,S]);if(X=(w.turn??Y)+1,k&&c.task.flow==="default"){let e=[...w.postedMessages??[]],n=x(f,k,p);try{for(;;){let r=o(f,k);for(let[t,n]of r.slice(X).entries()){let r=he(c.task,n,j,n);r.skipped&&m(f,k,{kind:`status`,message:b}),c.task.source===T?.integration&&r.text&&!r.duplicate&&e.push(...await me(f,k,X+t,()=>Z(r.text,r.problem))),w.reply=r.text,w.ok=n.status===0}X=Math.max(X,r.length);let a=t(f,k);if(a?.status===`running`||a?.status===`queued`){await Promise.race([fe(f,k,$,(e,t,n)=>re(e,t,{...n,turn:X,worker:p,signal:_})),S]);continue}if(a&&!u(a.pid)&&ee(f,k)){if(a.status!==`completed`){let e=g(f,k).length;m(f,k,{kind:`status`,message:`Discarded ${e} queued follow-up${e===1?``:`s`}: the task is ${a.status}.`});continue}let[e,...t]=g(f,k);for(let e of t)te(f,k,e);if(e){await se(f,a,e,{resolveConnections:le(a.mcp),onWorker:e=>{p=e}});continue}}if(p?.exitCode===null&&!p.signalCode||ee(f,k)||ge(i(f,k))){await Promise.race([n.wait(3e4),S]);continue}if(!q){clearInterval(G),await K,await M.close(),q=!0;continue}if(o(f,k).length<=X)break}}finally{n.close()}let r=(t(f,k)?.turnUsage??[]).slice(be).flatMap(e=>e.tokens?[e.tokens]:[]);w.tokens=r.length?r.reduce((e,t)=>ue(e,t)):ae(f,k)?.tokens??w.tokens,e.length&&(w.postedMessages=e)}for(await W();P;)_.throwIfAborted(),await I().catch(()=>{}),P&&await new Promise(e=>setTimeout(e,1e3));return await ie({status:j?`cancelled`:w.ok?`completed`:`failed`,result:w.reply??w.result,tokens:w.tokens,...Q().length?{approvals:Q()}:{},...w.postedMessages?.length?{postedMessages:w.postedMessages}:{},...T?.repo?{diff:await xe(f).catch(()=>void 0)}:{}}),w}catch(n){if(_.aborted){A?.requestStop();let n=new Set([...k?[k]:[],...A?.runningIds()??[],...v(f).filter(t=>t.name===`agent:${e}`||A&&t.flowRunId===A.runId).map(e=>e.id)]);for(let e of n){z.has(e)||z.set(e,l(N.join(i(f,e),`log.jsonl`)));let n=t(f,e);n&&await ce(f,n)}}throw await W(),n}finally{for(let e of R.values())e.close();await H?.catch(()=>{}),clearInterval(ve),clearInterval(G),O.abort(),await Promise.allSettled([K,F]),q||await M.close()}}const Pe=`/tmp/coder-inbox.sock`,Fe=e=>N.join(_e.tmpdir(),`coder-${I(`sha256`).update(e).digest(`hex`).slice(0,24)}.sock`);function Ie(e,t){return new Promise((n,r)=>{let i=L.request({socketPath:e,path:`/messages`,method:`POST`,headers:{"content-type":`application/json`}},e=>{let t=``;e.on(`data`,e=>{t+=e}),e.on(`end`,()=>{if(e.statusCode!==200)return r(Error(`Task inbox answered ${e.statusCode}`));try{n(JSON.parse(t))}catch(e){r(e)}}),e.on(`error`,r)});i.setTimeout(1e4,()=>i.destroy(Error(`Task inbox timed out`))),i.on(`error`,r),i.end(JSON.stringify({entries:t}))})}const Le=`const http=require('node:http');const req=http.request({socketPath:process.env.CODER_INBOX_SOCKET||'/tmp/coder-inbox.sock',path:'/messages',method:'POST',headers:{'content-type':'application/json'}},res=>{res.pipe(process.stdout);res.on('end',()=>{if(res.statusCode!==200)process.exitCode=1})});req.on('error',()=>{process.exitCode=1});req.setTimeout(10000,()=>req.destroy());req.end(JSON.stringify({entries:JSON.parse(process.env.CODER_INBOX_MESSAGES)}));`;async function Re(e){let t=N.join(e.root,`.runner-inbox.json`),n=d(t),r=n?.generation===e.generation?n:{generation:e.generation,seq:-1,answers:[]},i=Promise.resolve(),a=n=>{let a=async()=>{if(!Array.isArray(n)||n.some(t=>!Number.isInteger(t.seq)||t.seq<0||t.generation!==e.generation||![`steer`,`ask`,`approve`,`cancel`].includes(t.kind)))throw Error(`Invalid task messages`);for(let i of[...n].sort((e,t)=>e.seq-t.seq)){if(i.seq<=r.seq)continue;let n=await e.apply(i),a={generation:e.generation,seq:i.seq,answers:[...r.answers??[],...i.kind===`ask`?[{seq:i.seq,value:n}]:[]]};y(t,a),r=a}return r},o=i.then(a,a);return i=o.then(()=>{},()=>{}),o},o=e.socketPath??P.env.CODER_INBOX_SOCKET??Fe(e.root);if(await R.lstat(o).then(()=>!0,()=>!1)){if(!await new Promise((e,t)=>{let n=ve.connect(o);n.once(`connect`,()=>{n.destroy(),e(!1)}),n.once(`error`,n=>n.code===`ECONNREFUSED`?e(!0):t(n))}))throw Error(`The task inbox is already running`);await R.unlink(o)}let s=L.createServer(async(e,t)=>{if(e.method!==`POST`||e.url!==`/messages`){t.writeHead(404).end();return}let n=``;try{for await(let t of e)if(n+=t,Buffer.byteLength(n)>1048576)throw Error(`Messages too large`);let r=await a(JSON.parse(n).entries);t.writeHead(200,{"content-type":`application/json`}).end(JSON.stringify(r))}catch{t.writeHead(409).end()}});return await R.mkdir(e.root,{recursive:!0}),await new Promise((e,t)=>{s.once(`error`,t),s.listen(o,e)}),await R.chmod(o,384),{apply:a,ack:()=>r,close:async()=>{await i,await new Promise(e=>s.close(()=>e()))}}}export{Fe as a,Me as c,G as d,Z as f,X as i,Ie as l,Pe as n,De as o,Ae as r,Q as s,Le as t,q as u};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{qi as e}from"./core-DwsAMCnL.js";import{Kn as t,Mr as n,Pr as r,_r as i,fr as a,mr as o,u as s,ur as c,xr as l}from"./errors-DO_IltpP.js";import{yt as u}from"./output-SNqdgh9A.js";import{c as d,l as f,t as p}from"./args-Dqf5Y1RP.js";import{p as m}from"./actions-D12xDiQS.js";import{t as h}from"./turn-DQ13lkPF.js";import{r as g}from"./async-Tj4zKHXR.js";import{renderReviewMarkdown as _}from"./flow/builtin/review/index.js";import v from"node:path";import y from"node:process";import b from"node:fs";import{randomUUID as x}from"node:crypto";import S from"node:fs/promises";async function C(e,t,n=fetch){let r=y.env.CODER_REPLY_URL,i=y.env.CODER_REPLY_TOKEN;if(!r||!i)throw Error(`This task has no conversation to post to`);let a=JSON.stringify({id:x(),...t});for(let t=0;;t++){let o;try{o=await n(`${r}/${e}`,{method:`POST`,headers:{authorization:`Bearer ${i}`,"content-type":`application/json`},body:a,signal:AbortSignal.timeout(6e4)})}catch(e){if(t<2)continue;throw e}let s=await o.json().catch(()=>void 0);if(!o.ok)throw Error(s?.error??`The conversation ${e} failed (${o.status})`);return{ok:!0}}}async function w(){let e=y.env.CODER_HISTORY_TASK;if(!e)throw Error(`CODER_HISTORY_TASK is not set`);return{file:e,task:JSON.parse(await S.readFile(e,`utf8`))}}const T=[r({name:`reply`,description:`Post a reply now, such as before longer work. Never repeat text you already posted or will put in your final message.`,args:{text:p(i(),`Markdown to post.`)},access:`write`,run:async({text:e},t)=>{let{file:n,task:r}=await w();if(!r.conversation)throw Error(`Only conversation tasks can reply`);if(typeof e!=`string`||!e.trim())throw Error(`Reply text is required`);let i=await C(`reply`,{text:e.trim()},t.fetch);return s(v.dirname(n),{kind:`reply`,message:e.trim()}),i}}),r({name:`react`,description:`React to a message in this conversation with an emoji, by default the one that started your turn.`,args:{emoji:p(i(),`An emoji name such as thumbsup, or the emoji itself.`),message:d(`A message id from the conversation.`)},access:`write`,run:async({emoji:e,message:t},n)=>{let{task:r}=await w();if(!r.conversation)throw Error(`Only conversation tasks can react`);if(typeof e!=`string`||!e.trim())throw Error(`Emoji is required`);if(t!==void 0&&(typeof t!=`string`||!t.trim()))throw Error(`Message id must be a non-empty string`);let i=h(r.currentPrompt??r.prompt??``,!0)?.[0],a=t??i?.message?.id??i?.messages?.[0]?.id;if(i&&!a)throw Error(`This turn has no message to react to; give a message id`);return C(`react`,{emoji:e.trim(),...a?{message:a}:{}},n.fetch)}}),r({name:`history`,description:"Search or read this task's full earlier conversation, including anything compacted out of your context, with your tool calls and results, oldest first. With query, the messages containing that exact text; without, the messages from `from` on.",args:{query:d(`Exact text to find, case-insensitive, 1 to 500 characters: a word or phrase from the message, not a question.`),from:p(a(c()),`Message index to start at; default the oldest, or after the last match.`),limit:p(a(c()),`Messages to return, 1 to 20; default 10.`)},access:`read`,run:async e=>m((await w()).task,e)})];var E=e({ASYNC_TOOL_NAMES:()=>k,SEARCH_TOOLS:()=>N,TOOL_SEARCH_ENV:()=>M,asyncTools:()=>O,connect:()=>P,matching:()=>F,searchApp:()=>I,searchServers:()=>L,taskApp:()=>j});const D={name:`review`,flow:`review`,limit:5,args:(e,t)=>({...e.pr===void 0?{base:e.base??`HEAD`}:{pr:e.pr,post:!0},...e.path?.length?{path:e.path}:{},...e.exclude?.length?{exclude:e.exclude}:{},cwd:t}),render:(e,t)=>_({...e,runId:t})},O=[D],k=[...O.map(e=>e.name),`escalate`];function A(){let e=y.env.CODER_HISTORY_TASK;if(!e)throw Error(`CODER_HISTORY_TASK is not set`);return v.dirname(e)}const j=n({name:`coder`,description:`This task's own tools.`,commands:[r({name:`escalate`,description:`Ask a human to approve actions your environment refused, all in one request, collect all actions needed at once so you don't spam the user.`,args:{reason:d(`One short sentence: what the actions are for.`),actions:f(`Each action is exactly the command you will run once approved, nothing added; notes go in reason.`)},access:`read`,run:({reason:e,actions:t})=>{let n=(t??[]).map(e=>e.trim()).filter(Boolean);if(!e?.trim()||!n.length)throw Error(`reason and actions are required`);let r=A();return{approvalId:u(y.cwd(),v.basename(r),r,{reason:e.trim(),actions:n}).id,status:`pending`}}}),r({name:`review`,description:`Review your changes with a separate read-only reviewer that checks each finding against the repository. One review at a time, ${D.limit} per task.`,args:{pr:p(a(c()),`A pull request to review and post the review on.`),base:d(`The ref to compare with; default HEAD, so only uncommitted changes.`),path:f(`Review only these paths, relative to the task directory.`),exclude:f(`Leave these paths out.`),timeout:p(a(c()),`Stop the review after this many seconds.`)},access:`read`,run:async({timeout:e,...t})=>({runId:await g(A(),D,t,e),status:`started`})}),...T]}),M=`CODER_TOOL_SEARCH`,N=[`find_tools`,`call_tool`];async function P(e,n=6e4){let r=AbortSignal.timeout(n),i=t=>r.aborted?Error(`MCP server ${e.name} did not start in time`):t,a=await t(e,fetch,r).catch(e=>{throw i(e)});try{return{spec:e,client:a,tools:(await a.tools()).filter(t=>(!e.tools?.length||e.tools.includes(t.name))&&(!e.readOnly||t.annotations?.readOnlyHint===!0))}}catch(e){throw await a.close().catch(()=>{}),i(e)}}function F(e,t){let n=e.find(e=>e.name===t?.trim());if(n)return[n];let r=(t??``).toLowerCase().split(/\s+/).filter(Boolean),i=e=>r.every(t=>e.toLowerCase().includes(t)),a=e.filter(e=>i(`${e.name} ${e.description??``}`));return[...a.filter(e=>i(e.name)),...a.filter(e=>!i(e.name))]}function I(e,t=P){let s=new Map(e.map(e=>[e.name,e])),c=new Map,u=e=>{let n=s.get(e);if(!n)throw Error(`Unknown server "${e}". Servers: ${[...s.keys()].join(`, `)||`none`}`);let r=c.get(n.name);return r||(r=t(n).catch(e=>{throw c.delete(n.name),e}),c.set(n.name,r)),r},f=p(i(),`A server name from the prompt.`);return n({name:`tools`,description:`The turn's MCP servers, searched on demand.`,commands:[r({name:`find_tools`,description:`Find tools on one of the servers listed in your prompt by words from their names or descriptions; an empty query lists them all. Returns up to 5 matches with name, one line and input schema, then the names of the rest; query a tool by its exact name to get its schema.`,args:{server:f,query:d(`Words that the tool name or description contain, such as "issue list".`)},access:`read`,run:async e=>{let{spec:t,tools:n}=await u(e.server),r=F(n,e.query),i=e=>e.map(e=>e.name).join(`, `)||`none`;if(!r.length)return`No tool on ${t.name} matches. Its tools: ${i(n)}`;let a=r.slice(5);return{tools:r.slice(0,5).map(e=>({name:e.name,description:(e.description??``).split(`
|
|
2
|
+
`)[0].trim(),inputSchema:e.inputSchema??{type:`object`}})),...a.length?{more:i(a)}:{}}}}),r({name:`call_tool`,description:`Call a tool found with find_tools. Returns the server's result as is.`,args:{server:f,tool:p(i(),`A tool name find_tools returned.`),args:p(a(o(i(),l())),`The tool's arguments, matching its input schema.`)},access:`write`,run:async e=>{let{spec:t,client:n,tools:r}=await u(e.server);if(!r.some(t=>t.name===e.tool))throw Error(t.readOnly?`This task is read-only; "${e.tool}" is not a read-only tool on ${t.name}.`:`No tool "${e.tool}" on ${t.name}; find it with find_tools first`);return await n.call(e.tool,e.args??{})??null}})]})}function L(e){if(!e)throw Error(`${M} is not set`);return JSON.parse(b.readFileSync(e,`utf8`))}export{E as a,O as i,N as n,M as r,k as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{l as e}from"./args-Dqf5Y1RP.js";import{command as t}from"./cli.js";const n=t({name:`tools`,description:`serve a task's tools over stdio`,access:`write`,args:{tools:e(`the tools to serve: review, reply, react, history`)},globalFlags:{json:!1,cwd:!1},cli:{positional:[`tools`]},mcp:!1,async run({args:e}){let{taskApp:t}=await import(`./tools-B6ZxcqRi.js`).then(e=>e.a),{serve:n}=await import(`./serve-DdAdw7Su.js`),r=e.flat(),i=r.find(e=>!t.commands?.some(t=>t.name===e));if(i)throw Error(`Unknown task tool "${i}"`);await(await n({...t,commands:t.commands?.filter(e=>r.includes(e.name))},`stdio`)).done}});export{n as commandTools};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{command as e}from"./cli.js";const t=e({name:`tools-search`,description:`serve a turn's tool search over stdio`,access:`write`,globalFlags:{json:!1,cwd:!1},mcp:!1,async run(){let{searchApp:e,searchServers:t,TOOL_SEARCH_ENV:n}=await import(`./tools-B6ZxcqRi.js`).then(e=>e.a),{serve:r}=await import(`./serve-DdAdw7Su.js`);await(await r(e(t(process.env[n])),`stdio`)).done}});export{t as commandToolsSearch};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Ir as e,Nr as t,jr as n}from"./errors-DO_IltpP.js";const r=e=>e.replace(/&(amp|lt|gt);/g,(e,t)=>({amp:`&`,lt:`<`,gt:`>`})[t]);function i(e=``,t=!1){let n=/<event>\n([^]*?)\n<\/event>/g;if(!t&&(!e.trimStart().startsWith(`<event>`)||e.replace(n,``).trim()))return;let i=[];for(let[,a]of e.matchAll(n))try{let e=JSON.parse(r(a));if(!e||typeof e!=`object`||Array.isArray(e)){if(!t)return;continue}i.push(e)}catch(e){if(console.error(`coder: unreadable event prompt`,e),!t)return}return i.length?i:void 0}function a(e,t,n=[]){let r=[e??``,...n].flatMap(e=>(i(e,!0)??[]).flatMap(e=>typeof e.mustReply==`boolean`?[e.mustReply]:[]));return r.length?r.includes(!0):t}function o(e){let t=e.chat?.message;if(!t)return{text:e.text,author:{id:e.actor.id,...e.actor.login?{handle:e.actor.login}:{}}};let{author:n,metadata:r}=t;return{id:t.id,...e.conversation?.index===void 0?{}:{index:e.conversation.index},text:e.text,...t.isMention?{mention:!0}:{},author:{id:n.userId,handle:n.userName,name:n.fullName,...n.isBot?{bot:!0}:{}},sentAt:r.dateSent,...r.edited?{edited:!0}:{},...t.attachments.length?{attachments:t.attachments.map(({type:e,url:t,name:n})=>({type:e,...t?{url:t}:{},...n?{name:n}:{}}))}:{},...t.links?.length?{links:t.links.map(({url:e,title:t})=>({url:e,...t?{title:t}:{}}))}:{}}}function s(e,t){let n=e.at(-1),r=n.chat?.thread,i=e.some(e=>e.mustReply),a=new Set(e.flatMap(e=>e.chat?.message?.id??[])),s=e.flatMap(e=>e.conversation?.since??[]).filter(({id:e,...t})=>{let n=e??JSON.stringify(t);return!a.has(n)&&!!a.add(n)}),c=s.slice(0,50).map(({id:e,...t})=>t),l=e.reduce((e,t)=>e+(t.conversation?.more??0),0)+s.length-c.length;return{handle:n.integration,event:n.type,...n.mustReply===void 0&&e.length===1?{}:{mustReply:i},...n.repo?{repository:`${n.repo.owner}/${n.repo.name}`}:{},...r?{conversation:{id:r.id,dm:r.isDM,...r.channelVisibility?{visibility:r.channelVisibility}:{}}}:{},...e.length===1?{message:o(n)}:{messages:e.map(o)},...n.promptContext?{context:n.promptContext}:{},...c.length?{since:c}:{},...l?{more:l}:{},...t?{requester:t}:{}}}function c(r,i){return t(e(`event`,{children:e(n,{children:JSON.stringify(s(r,i))})}))}function l(r,i){let{message:a,...o}=s([r]),c={...o,event:`reactions`,mustReply:!1,reactions:i};return t(e(`event`,{children:e(n,{children:JSON.stringify(c)})}))}function u(e,t,n){if(!t)return e;let r=n===void 0?``:`\n**Pull request:** ${t.owner}/${t.name}#${n}`;return`**Repo:** ${t.owner}/${t.name}${r}\n\n${e}`}function d(r,i){return r.length?`${t(e(`history`,{children:e(n,{children:r.map(e=>`${e.user}: ${e.text}`).join(`
|
|
2
|
+
`)})}))}\n\n${i}`:i}export{a,l as i,c as n,u as o,d as r,i as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=[`read`,`write`];var t=class extends Error{code;error;constructor(e,t,n){super(n??(t?`${e} (${t})`:e)),this.code=e,this.error=t}};export{e as n,t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{qi as e}from"./core-DwsAMCnL.js";import{n as t}from"./types-DPtbvoo3.js";var n=e({PRESETS:()=>t});export{n as t};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{_r as e,dr as t,fr as n}from"./errors-DO_IltpP.js";import{n as r,o as i,r as a,t as o}from"./slack-BtKvW_4v.js";const s=e=>({type:`mrkdwn`,text:e}),c=e=>({type:`plain_text`,text:e}),l=e=>({type:`section`,text:s(e.length>3e3?`${e.slice(0,2999)}…`:e)}),u=e=>e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`),d=(e,t)=>`<${e}|${u(t)}>`,f=({id:e,url:t,label:n,primary:r})=>({type:`button`,action_id:`${a}${e}`,text:{type:`plain_text`,text:n},url:t,...r?{style:`primary`}:{}}),p=(e,t)=>l([`*${u(e)}*`,t&&u(t)].filter(Boolean).join(`
|
|
2
|
+
`));function m({title:e,text:t,sections:n,links:r},i){return[p(e,t),...n.map(e=>p(e.title,e.text)),...i?[{type:`divider`}]:[],{type:`actions`,elements:r.map(f)}]}async function h(e,t){let n=await e.home?.();!n||!e.installationId||await i(`views.publish`,{user_id:t,view:{type:`home`,blocks:m(n,!0)}},await e.token(e.installationId),e.fetch)}async function g(e,t,n){e.installationId&&await i(`chat.postMessage`,{channel:t,text:n.title,blocks:m(n)},await e.token(e.installationId),e.fetch)}function _({title:e,url:t,text:n,fields:r,footer:i}){return{blocks:[{...l([`*${d(t,e)}*`,n&&u(n)].filter(Boolean).join(`
|
|
3
|
+
`)),...r?{fields:r.map(e=>s(`*${u(e.label)}*\n${`at`in e?`<!date^${Math.floor(e.at/1e3)}^{date_short_pretty} at {time}|${new Date(e.at).toISOString()}>`:u(e.text)}`))}:{}},{type:`context`,elements:[s(u(i))]}]}}async function v(e,t){let{preview:n}=e;if(!n||!e.installationId)return;let r=await Promise.all(t.links.map(async({url:e})=>[e,await n(e)])),a=Object.fromEntries(r.flatMap(([e,t])=>t?[[e,_(t)]]:[]));if(!Object.keys(a).length)return;let o=t.unfurl_id&&t.source?{unfurl_id:t.unfurl_id,source:t.source}:{channel:t.channel,ts:t.message_ts};await i(`chat.unfurl`,{...o,unfurls:a},await e.token(e.installationId),e.fetch)}function y(e){let[,t=``,n=``]=/^slack:([^:]+):?(.*)$/.exec(e)??[];return{channel:t,...n?{thread_ts:n}:{}}}function b(e){return u(e).replace(/\*\*([^*\n]+)\*\*/g,`*$1*`).replace(/\[([^\]]+)\]\((https?:[^)\s]+)\)/g,`<$2|$1>`)}const x=e=>e.length>200?`${e.slice(0,199)}…`:e;function S({markdown:e,card:t,collapsed:n,buttons:i=[],hint:a,link:u}){let d=[...i.map((e,t)=>({type:`button`,action_id:`${e.ask?o:r}${t}`,text:{type:`plain_text`,text:e.label},value:e.ask?JSON.stringify({value:e.value,label:e.label,ask:e.ask}):e.value,...e.style?{style:e.style}:{},...e.confirm?{confirm:{title:{type:`plain_text`,text:`${e.label}?`},text:{type:`plain_text`,text:e.confirm.slice(0,300)},confirm:{type:`plain_text`,text:e.label},deny:{type:`plain_text`,text:`Cancel`}}}:{}})),...u?[f({id:`open`,...u})]:[]],p=n?.items&&n.items.length<=50?n.items:void 0,m=t?.outcome?{success:`complete`,failure:`error`}[t.outcome]:`pending`;return[t?{type:`card`,title:c(t.title),body:c(x(t.body)),...t.status?{subtext:s(x(b(t.status)))}:{},...d.length?{actions:d}:{}}:l(b(e)),...n?[p?{type:`plan`,block_id:`plan-${crypto.randomUUID()}`,title:n.summary,tasks:p.map((e,t)=>({task_id:`task-${t+1}`,title:e,status:m}))}:{...l(b(`**${n.summary}**\n${n.markdown}`)),expand:!1}]:[],...d.length&&!t?[{type:`actions`,elements:d}]:[],...a?[{type:`context`,elements:[s(b(a))]}]:[]]}const C=t({value:e(),label:e(),ask:t({label:e(),placeholder:n(e())})});async function w(e,t,n,r){let a=C.parse(JSON.parse(r));e.installationId&&await i(`views.open`,{trigger_id:t,view:{type:`modal`,callback_id:`ask`,title:c(a.label.slice(0,24)),submit:c(a.label.slice(0,24)),close:c(`Cancel`),private_metadata:JSON.stringify({...n,value:a.value}),blocks:[{type:`input`,block_id:`ask`,optional:!0,label:c(a.ask.label),element:{type:`plain_text_input`,action_id:`ask`,multiline:!0,focus_on_load:!0,...a.ask.placeholder?{placeholder:c(a.ask.placeholder)}:{}}}]}},await e.token(e.installationId),e.fetch)}async function T({ctx:e,thread:t},n){return(await i(`chat.postMessage`,{...y(t.id),text:n.markdown,blocks:S(n)},await e.token(e.installationId),e.fetch)).ts}async function E({ctx:e,thread:t},n,r){await i(`chat.update`,{channel:y(t.id).channel,ts:n,text:r.markdown,blocks:S(r)},await e.token(e.installationId),e.fetch)}export{g as directMessage,E as editMessage,w as openAsk,T as postMessage,h as publishHome,v as unfurl};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Vt as e}from"./errors-DO_IltpP.js";import t from"node:process";async function n(n,r,i){let a=n.envKey?t.env[n.envKey]:void 0,o=!1;for(let t of e(n.baseUrl,r))try{let e=await fetch(t,{method:`POST`,headers:{"content-type":`application/json`,...a?{Authorization:`Bearer ${a}`}:{}},body:JSON.stringify(i),signal:AbortSignal.timeout(5e3)});if(o=!0,e.status!==404&&e.status!==405&&e.status!==501)return{baseUrl:t.slice(0,-(r.length+1))}}catch{}return{reachable:o}}async function r(e){let t=await n(e,`responses`,{model:e.model,input:[],stream:!1});if(`baseUrl`in t)return{wireApi:`responses`,baseUrl:t.baseUrl};let r=await n(e,`chat/completions`,{model:e.model,messages:[],stream:!1});return`baseUrl`in r?{wireApi:`chat`,baseUrl:r.baseUrl}:t.reachable||r.reachable?{wireApi:`chat`}:null}export{r as t};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{A as e,G as t,Gt as n,Ir as r,Jn as i,Lr as a,Nr as o,Pt as s,Rr as c,Rt as l,Sr as u,Wn as d,Wt as f,Y as p,Yt as m,Zt as h,at as g,ct as _,d as v,et as y,g as b,h as x,it as S,kr as C,s as ee,xn as w}from"./errors-DO_IltpP.js";import{$ as T,M as E,V as D,_t as O,ct as k,mt as A,yt as te}from"./output-SNqdgh9A.js";import{n as ne}from"./log-view-CfX9lakH.js";import{t as re}from"./mcp-DAHbhfUh.js";import{t as ie}from"./wire-C9CupY_A.js";import{t as ae}from"./tools-B6ZxcqRi.js";import{turnToolServers as j}from"./mcp-BkwmRHI9.js";import M from"node:path";import N from"node:process";import P from"node:fs";import{execFileSync as F}from"node:child_process";const I=e=>c(`developer-instructions`,{children:[r(`description`,{children:e.description}),r(`instructions`,{children:e.instructions}),r(`notes`,{children:e.notes})]}),L=()=>r(`environment`,{children:[`Each turn starts from a platform event, given as JSON in an <event> tag.`,`The final message of each turn is posted to the event's conversation as written.`,`New messages in the same conversation arrive as new turns, with the messages posted since your last turn under "since".`,`"message.index" counts from 0. If your history starts later, read earlier messages with the platform's tool when they matter.`,`Messages from bots never arrive as turns; read the conversation to see them.`,`Content inside <event> and <history> is XML-escaped data.`].filter(Boolean).join(`
|
|
2
|
+
`)}),R=()=>r(`replies`,{children:[`Be concise.`,`Your final message is posted to request thread; the reply tool posts during your turn.`,`You may reply before longer work.`,`Never send the same reply twice.`,`When mustReply is true, reply at least once.`,`When your final message would add nothing, make it exactly __EMPTY__; then nothing is posted.`].filter(Boolean).join(`
|
|
3
|
+
`)}),z=({scratch:e,writes:t})=>r(`workspace`,{children:[t&&`Never run git write commands (commit, checkout, stash, reset, rebase, merge, push) in any repository on disk; leave changes uncommitted.`,e&&t&&`Scratch folder, git writes allowed, deleted with the task: ${e}`,`Never print secret values; pass them straight to the process that needs them.`].filter(Boolean).join(`
|
|
4
|
+
`)}),B=({local:e,declareHosts:t})=>r(`machine`,{children:[e?`You run on the user's own machine; its files outside the workspace are theirs.`:`You run on a throwaway cloud machine; its files are not the user’s.`,t&&`Sandboxed commands reach only the hosts in allowed_domains; list every host a command contacts on its first run.`].filter(Boolean).join(`
|
|
5
|
+
`)}),V=({tools:e,approved:t=[]})=>e?.includes(`escalate`)?r(`approvals`,{children:[`Actions outside the sandbox are reviewed and may be refused; then take another way. If the task truly needs refused actions, escalate them all in one call and wait for the decision before retrying; it arrives as a message in your running turn.`,t.length>0&&`Actions the user approved earlier in this task stay approved; run them outside the sandbox directly.`].filter(Boolean).join(`
|
|
6
|
+
`)}):null,H={read:`Read-only: read, and reply in this conversation. If a request needs more, say so; an admin can change it in the agent's settings.`,write:`Read-write: you may comment, push, edit issues and post messages.`},U=e=>{let t=e.tools?.filter(e=>ae.includes(e))??[];return c(`settings`,{children:[r(`access`,{children:e.access&&H[e.access]}),r(`tools`,{children:t.length>0&&`${t.join(` and `)} ${t.length>1?`return`:`returns`} at once; the result arrives later as a message, in a new turn if yours has ended.`}),r(`servers`,{children:[e.servers,e.servers&&(e.toolSearch===`coder`?`Find their tools with find_tools and call them with call_tool; name the server.`:`Their tools load on demand through tool search.`)].filter(Boolean).join(`
|
|
7
|
+
`)})]})},W=({conversation:e,local:t,writes:n})=>r(`runtime`,{children:[!e&&n&&(t?`Do the work yourself; do not load the coder skill or dispatch Coder tasks.`:`Do the work yourself; do not dispatch Coder tasks.`),`Your turn ends with your final message; verify your work before it.${e?``:` ${_}`}`,e&&t&&`Do not load the coder skill.`].filter(Boolean).join(`
|
|
8
|
+
`)}),G=e=>{let t=r(U,{...e});return c(a,{children:[r(I,{...e.developer}),!e.conversation&&t,r(W,{...e}),r(B,{...e}),r(V,{...e}),e.conversation?c(a,{children:[r(L,{}),r(R,{}),e.platform&&r(`platform`,{name:e.platform.name,children:e.platform.prompt}),t]}):c(a,{children:[r(z,{...e}),!e.structured&&r(`result`,{children:`When finished, give a concise summary of what you did and found, naming the files or folders you changed.`}),r(`task-instructions`,{children:e.appendSystem})]})]})},K=e=>o(r(G,{...e})),q={claude:{CLAUDE_CODE_DISABLE_AUTO_MEMORY:`1`},codex:{"features.memories":!1}};function J(e,n,r,i={}){let a=e=>r({kind:`warning`,phase:`starting`,message:e}),o=n.promptParts?.access??(n.permissions===`read-only`?`read`:`write`),s=j(n,t(e,n.id),E(n.mcp,N.env,void 0,{onWarning:a}),{access:o,search:i.toolSearch===`coder`}),c=n.promptParts?K({...n.promptParts,...i,approved:A(t(e,n.id)),tools:s.tools,...s.lines?{servers:s.lines}:{}}):n.systemPrompt;return{...s,systemPrompt:c}}function Y(e){N.connected&&N.send?.(e,void 0,void 0,e=>{e&&e.code!==`EPIPE`&&N.stderr.write(`coder worker: ${e.message}\n`)})}function X(e){return e.currentPrompt??e.prompt??``}async function oe(n,r,a){g(n,r.id,{status:`running`,steerEndpoint:null,turnId:null,turnUsage:r.turnUsage??[]});let o=t(n,r.id),s=M.join(o,`log.jsonl`),c=u(s,P.existsSync(s)?P.statSync(s).size:0),l,d=e=>{let t=c().flatMap(e=>{let t=ne(e);return t?[t]:[]}),i=t.flatMap(e=>e.message?.startsWith(`Steer accepted live:
|
|
9
|
+
`)?[e.message.slice(ee.length)]:[]),a=t.filter(e=>e.kind===`reply`).at(-1)?.message;return w(`worker.record.start`,{taskId:r.id,finalized:!1}),le(n,r,e,{steers:i,lastReply:a})},f=await a(r,{onResult:e=>{!l&&e.status===0&&!e.error&&(l=d(e))}}),p=[...r.previousThreadIds??[]];f.status===0&&r.threadId&&f.threadId&&r.threadId!==f.threadId&&!p.includes(r.threadId)&&p.push(r.threadId);let m=new Date().toISOString();return w(`worker.engine.closed`,{taskId:r.id}),l??=d(f),C(M.join(o,`result.json`),JSON.parse(i(f))),w(`worker.record.start`,{taskId:r.id,finalized:!0}),g(n,r.id,{turnUsage:[...e(n,r.id)?.turnUsage??[],{at:l,tokens:f.tokens,model:f.model}],status:f.status===0?`completed`:`failed`,completedAt:m,threadId:f.threadId,resumeThreadId:f.threadId,previousThreadIds:p,steerEndpoint:null,turnId:f.turnId??null}),w(`worker.result.recorded`,{taskId:r.id,finalized:!0}),f}function Z(e,t){let n=0;return()=>{Date.now()-n>=1e4&&(n=Date.now(),y(e,t))}}function Q(e,t,{echo:n}){let r=r=>{let a=JSON.parse(i(typeof r==`string`?{message:r}:r));v(e,t,a),n&&a.message&&N.stderr.write(`[coder] ${a.message}\n`)};for(let e of Object.keys(d()))N.env[e]!==void 0&&r({kind:`warning`,message:`${e} is temporarily unavailable; skipped for this task.`});return r}async function se(e,t,{echo:r,env:i={},onResult:a}){let o=n(e),c=Q(e,t.id,{echo:r}),u=t.model?o.models?.[t.model]:void 0,d=u&&f(u)?u:void 0;if(d&&!d.wireApi&&t.model){let n=await ie(d);n&&(d={...d,...n},o.models[t.model]=d,m(e,t.model,n),v(e,t.id,{kind:`info`,message:`detected wire api for ${t.model}: ${n.wireApi} @ ${d.baseUrl}`}))}let _=s[t.permissions??`auto`]??s.auto,y=_.approvalMode===`auto`,b=l(t.permissions??`auto`,o.engines.codex?.network,y?o.approvals.allowedNetworkHosts:[]),x={approvalPolicy:_.approvalPolicy,approvalsReviewer:_.approvalsReviewer,...y?{onApprovalRequest:O(e=>c(e))}:{}},S=J(e,t,c,{toolSearch:`coder`});try{return await T(e,{availabilityChecked:N.env.CODER_ENGINE_CHECKED===`1`,prompt:X(t),developerInstructions:S.systemPrompt,outputSchema:t.outputSchema,model:h(t.model),...d&&t.model?{customModel:{alias:t.model,entry:d}}:{},configOverrides:{...Object.keys(i).length?{"shell_environment_policy.set":i}:{},...t.agentId?q.codex:{},...b.configOverrides},effort:t.effort,sandbox:_.sandbox,...x,networkAccess:b.networkAccess,mcpServers:S.servers,nativeMcp:t.nativeMcp??!1,writableRoots:_.sandbox===`read-only`?[]:[...t.addDirs??[],p(t.id)],onHeartbeat:Z(e,t.id),onResult:a,resumeThreadId:t.resumeThreadId??null,onControlReady:(n,r,i)=>{g(e,t.id,{status:`running`,steerEndpoint:n,threadId:r,turnId:i})},onProgress:n=>{c(n);let r=typeof n==`object`?n.threadId:null,i=typeof n==`object`?n.turnId:null;(r||i)&&g(e,t.id,{status:`running`,...r?{threadId:r}:{},...i?{turnId:i}:{}})}})}finally{g(e,t.id,{steerEndpoint:null}),S.cleanup()}}async function ce(e,r,{echo:i,env:a={},onResult:o}){let c=t(e,r.id),l=n(e),u=Q(e,r.id,{echo:i}),d=s[r.permissions??`auto`]??s.auto,f=J(e,r,u,{declareHosts:d.approvalMode===`auto`});try{return await D(e,{env:{...a,...r.agentId?q.claude:{}},prompt:X(r),systemPrompt:f.systemPrompt,excludeDynamicSections:r.conversation,settingSources:r.agentId&&r.source&&![`cli`,`dashboard`,`schedule`].includes(r.source)?`project,local`:void 0,outputSchema:r.outputSchema,model:r.model,effort:r.effort,permissions:r.permissions,approvalTaskId:r.id,allowedNetworkHosts:d.approvalMode===`auto`?l.approvals.allowedNetworkHosts:[],additionalDirectories:r.addDirs,scratch:p(r.id),local:r.promptParts?.local??!0,mcpServers:f.servers,nativeMcp:r.nativeMcp??!1,promptCacheTtl:r.conversation&&(a.ANTHROPIC_API_KEY||N.env.ANTHROPIC_API_KEY)?`1h`:void 0,taskRoot:c,resumeSessionId:r.resumeThreadId??null,onHeartbeat:Z(e,r.id),onResult:o,onSteerReady:t=>{g(e,r.id,{status:`running`,steerEndpoint:t})},onProgress:t=>{u(t),t.threadId&&g(e,r.id,{status:`running`,threadId:t.threadId})}})}finally{g(e,r.id,{steerEndpoint:null})}}function le(e,n,r,a={}){let{steers:o=[],lastReply:s}=a,c=n.turnUsage?.at(-1)?.at,l=t(e,n.id);C(M.join(l,`result.json`),JSON.parse(i(r)));let u={at:new Date(Math.max(Date.now(),c?Date.parse(c)+1:0)).toISOString(),prompt:n.currentPrompt??n.prompt??null,...o.length?{steers:o}:{},...s?{lastReply:s}:{},...r};return P.appendFileSync(M.join(l,`results.jsonl`),`${i(u)}\n`,`utf8`),w(`worker.result.recorded`,{taskId:n.id,finalized:!1}),Y(`result`),u.at}function $(e){return async(e,t,n)=>{let r=await re(E(t.mcp,N.env,void 0,{onWarning:()=>{}})),i=t.permissions!==`read-only`,a={...r.env,...i?ue(t):{}};try{let r=t.engine===`claude`?ce:se;return await de(i&&N.env.CODER_MACHINE_SANDBOX===`1`?[e,...t.addDirs??[]]:[],()=>oe(e,t,(t,i)=>r(e,t,{...n,...i,env:a})))}finally{await r.close()}}}function ue(e){let t=p(e.id);return{TMPDIR:t,BUN_TMPDIR:t,BUN_INSTALL_CACHE_DIR:M.join(t,`.bun-cache`),npm_config_cache:M.join(t,`.npm-cache`),PIP_CACHE_DIR:M.join(t,`.pip-cache`),UV_CACHE_DIR:M.join(t,`.uv-cache`),CARGO_HOME:M.join(t,`.cargo`),GOPATH:M.join(t,`go`),GOCACHE:M.join(t,`.go-cache`),...e.engine===`claude`?{CLAUDE_CODE_TMPDIR:t}:{}}}async function de(e,t){let n=e.map(e=>M.join(e,`.git`)).filter(e=>P.existsSync(e));if(!n.length)return t();F(`chmod`,[`-R`,`a-w`,...n]);try{return await t()}finally{F(`chmod`,[`-R`,`u+w`,...n])}}async function fe(t,n){for(;;){let r=await S(t,n,()=>{let r=e(t,n);if(!r)return[];let i=r.status===`failed`||r.status===`cancelled`?[]:x(t,n);return i.length||(b(t,n),g(t,n,{steerClosed:!0,steerEndpoint:null}),Y(`settled`)),i});if(!r.length)return;for(let i of r){let r=g(t,n,{status:`running`,currentPrompt:i,resumedAt:new Date().toISOString(),error:void 0,resumeThreadId:e(t,n)?.threadId??null});v(t,n,{message:`Running steered follow-up.`});try{await $(r)(t,r,{echo:!1})}catch(e){let r=e instanceof Error?e.message:String(e);g(t,n,{status:`failed`,error:r,completedAt:new Date().toISOString()}),v(t,n,{kind:`error`,message:r});return}}}}async function pe(n,r){if(r.dispatchId&&!r.resumedAt)try{P.writeFileSync(M.join(t(n,r.id),`start-${r.dispatchId}`),``,{flag:`wx`})}catch(e){if(e.code===`EEXIST`)return;throw e}g(n,r.id,{status:`running`,pid:N.pid,steerClosed:!1});let i;try{if(r.name?.startsWith(`agent:`)){let{startInboxControl:a,applyTaskMessage:o}=await import(`./task-iuYQ0zAK.js`).then(e=>e.d);i=a(t(n,r.id),r.name.slice(6),t=>o(n,e(n,r.id)??r,t))}N.env.CODER_SIMULATE_APPROVAL===`1`&&!r.resumedAt&&te(n,r.id,t(n,r.id),{reason:`A dev hook (${k}) raised this escalation at the start of the task.`,actions:[`echo simulated`]}),await $(r)(n,r,{echo:!1}),await fe(n,r.id)}catch(e){let t=e instanceof Error?e.message:String(e);throw g(n,r.id,{status:`failed`,error:t}),v(n,r.id,{kind:`error`,message:t}),e}finally{await S(n,r.id,()=>{e(n,r.id)?.pid===N.pid&&(g(n,r.id,{steerClosed:!0,steerEndpoint:null}),Y(`settled`))}),await i?.close()}}export{pe as runWorker};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{A as e}from"./errors-DO_IltpP.js";import{i as t}from"./output-SNqdgh9A.js";import{c as n}from"./args-Dqf5Y1RP.js";import{command as r}from"./cli.js";const i=r({name:`worker`,description:`run a task's turns, detached`,access:`write`,args:{"task-id":n()},globalFlags:{json:!1},cli:{positional:[`task-id`]},mcp:!1,async run({args:[n],cwd:r}){let{runWorker:i}=await import(`./worker-BQpx1dPr.js`),a=e(r,n);a||t(`Worker: task ${n} not found.`),await i(r,a),process.exit(0)}});export{i as commandWorker};
|
package/docs/access.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Access and approvals
|
|
2
|
+
|
|
3
|
+
Tasks run in a sandbox. In the `auto` permission mode each engine's own reviewer decides what may go beyond it: Claude's auto mode and Codex's auto review. Coder tells Claude's auto mode the task runs on a sandboxed machine and that reading the web, docs and package registries is fine.
|
|
4
|
+
|
|
5
|
+
## Escalations
|
|
6
|
+
|
|
7
|
+
When the reviewer refuses something, the task decides: it tries another way, or calls its `escalate` tool. Nothing escalates on its own. One request carries why and every exact command the step needs. It shows as **Approval needed**, the reason, then the actions folded under their count:
|
|
8
|
+
|
|
9
|
+
- `coder task approvals` and `coder task result`; `--json` lists the actions; `--wait` exits with code 4
|
|
10
|
+
- the dashboard
|
|
11
|
+
- the conversation it came from: Approve and Deny buttons on Slack, a select on Linear, `/approve <id>` and `/deny <id> <why>` replies on GitHub and Linear. Anyone with write access there can answer.
|
|
12
|
+
|
|
13
|
+
Deny asks why in the dashboard and on Slack; the reason is optional.
|
|
14
|
+
|
|
15
|
+
One answer covers every action. Answer any time, also after a deny:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
coder task approve <id> # the task retries
|
|
19
|
+
coder task approve <id> --deny --reason "<why>" # the task reads why
|
|
20
|
+
coder task approvals --denied # denied requests, still answerable
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
The task gets your answer as a message in its running turn; a task that ended resumes with it. Approved actions stay approved for the rest of the task: on Claude the exact approved command runs without review, on Codex the reviewer still judges each run.
|
|
24
|
+
|
|
25
|
+
Escalations exist only in `auto`.
|
|
26
|
+
|
|
27
|
+
## Pre-allowed hosts
|
|
28
|
+
|
|
29
|
+
Hosts in [`approvals.allowedNetworkHosts`](config.md#approvals) are reachable without review.
|
|
30
|
+
|
|
31
|
+
## Scratch folder
|
|
32
|
+
|
|
33
|
+
Each task gets `$TMPDIR/coder/<task-id>`, also its `TMPDIR` and package caches. Git writes work there and nowhere else. `coder task delete` removes it.
|
package/docs/agents/coder.md
CHANGED
|
@@ -20,14 +20,3 @@ The built-in agent. On the hosted service it has an install link per platform; s
|
|
|
20
20
|
## On Linear
|
|
21
21
|
|
|
22
22
|
- Mentioning or assigning the agent starts a session that answers, or makes the change and links the pull request.
|
|
23
|
-
|
|
24
|
-
## What it runs with
|
|
25
|
-
|
|
26
|
-
| | |
|
|
27
|
-
| ----------- | ----------------------------------------------------------------- |
|
|
28
|
-
| Permissions | `workspace-write`; `read-only` for pull-request reviews |
|
|
29
|
-
| Tools | GitHub `write`; Slack and Linear `read` |
|
|
30
|
-
| Flows | `review` |
|
|
31
|
-
| Engine | the workspace's [credential](../self-host.md#credentials) |
|
|
32
|
-
|
|
33
|
-
The definition is `src/agent/builtin/coder/{agent.json,system.md}` in the package; a custom agent is the same two files in your repo ([Your own agents](index.md#your-own-agents)).
|