@wular/coder 0.4.13 → 0.5.1

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.
Files changed (519) hide show
  1. package/README.md +3 -3
  2. package/dist/actions-DO8MvHwc.js +3 -0
  3. package/dist/agent-Cgala63h.js +1 -0
  4. package/dist/app-server-dnlLhhZb.js +6 -0
  5. package/dist/approvals-C8XV7CK2.js +5 -0
  6. package/dist/apps-BORri-28.js +18 -0
  7. package/dist/args-CJsHYWbt.js +66 -0
  8. package/dist/async-BS9tyhva.js +3 -0
  9. package/dist/auth-C16ylySv.js +1 -0
  10. package/dist/builtin/coder/agent.json +6 -6
  11. package/dist/builtin/coder/system.md +7 -5
  12. package/dist/{chat-bwKd3y6V.js → chat-Bfu9XKRa.js} +1 -1
  13. package/dist/chat-czruXAt3.js +13 -0
  14. package/dist/cli.js +18 -13
  15. package/dist/{client-C4QCT6cG.js → client-nBo9Mhsr.js} +4 -4
  16. package/dist/cmd-C1gHyVG7.js +122 -0
  17. package/dist/config-_32PHl9g.js +5 -0
  18. package/dist/connection-CgA5_NJ7.js +1 -0
  19. package/dist/connections-B90TemYf.js +2 -0
  20. package/dist/context-C1XBbfEL.js +6 -0
  21. package/dist/crypto-Ittsv-m4.js +1 -0
  22. package/dist/dash/standalone/server/build-index.json +1 -1
  23. package/dist/dash/standalone/server/manifest.json +1690 -1452
  24. package/dist/dash/standalone/server/modules-server-server-react-server/src/agent/event-json.856d33f567e58d0e.js +30 -0
  25. package/dist/dash/standalone/server/modules-server-server-react-server/src/client/http.e78b470f4ecf125b.js +58 -0
  26. package/dist/dash/standalone/server/modules-server-server-react-server/src/client/{index.de1f1311bab4252f.js → index.91e126d7a389d4bd.js} +46 -75
  27. package/dist/dash/standalone/server/modules-server-server-react-server/src/core/task/{log-view.ec6391dbf3063330.js → view.e20379d8f741754a.js} +38 -0
  28. package/dist/dash/standalone/server/modules-server-server-react-server/src/core/types.9d22123d6296f5af.js +37 -0
  29. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/api/{load.30ed8c28774a1a82.js → load.858c062c7891a2c1.js} +18 -11
  30. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/create/[id]/{page.118a70787eff1761.js → page.9375ab741dc9791e.js} +5 -5
  31. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{loading.fcdfd50c21031895.js → loading.56c14183236be231.js} +2 -2
  32. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{notify.98dfcd316c306258.js → notify.c36570a56d279ce2.js} +1 -1
  33. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{page.74c59322f5fe8a2c.js → page.13fdd9cc55ad3a52.js} +9 -9
  34. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{sign-out.730aa96b086ac996.js → sign-out.38a7f39cddc670f7.js} +4 -4
  35. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{agent-menu.1be5795272b245c8.js → agent-menu.5c780867b82081b1.js} +3 -3
  36. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{agents-grid.2c30ace077893029.js → agents-grid.2385ffa8fdad08d6.js} +9 -9
  37. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{loading.733f0acc2af5ceda.js → loading.0130f8533d8f1b1e.js} +4 -4
  38. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/page.5ca6921e50484f8c.js +48 -0
  39. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{layout.b26006f060cd48f0.js → layout.afc4a8a5a8360975.js} +89 -32
  40. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{loading.388aeaf0c2edf8f8.js → loading.90bf37c903ce6f0d.js} +1 -1
  41. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{page.4b23e9df21433bd3.js → page.ba65063a1aa99a62.js} +22 -88
  42. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{loading.e06845585ca67abc.js → loading.d56ef50b0694f975.js} +2 -2
  43. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{page.4048048acb374c67.js → page.03c5e72b0fe50ba9.js} +51 -123
  44. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{platform-actions.000f2f87a48bfbc6.js → platform-actions.7c8c75bd0c05df4a.js} +234 -134
  45. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/platform-state.6b6132518ca61635.js +21 -0
  46. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/platform-step.d6a980d1181dc940.js +82 -0
  47. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/settings/{agent-settings-form.ee0bb2dc4d403ec3.js → agent-settings-form.b5299f5130a4e8af.js} +53 -76
  48. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/settings/{loading.0e3641f3e4abaa7c.js → loading.2800c65e45a4a1d9.js} +1 -1
  49. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/settings/{page.649b4ba135ded99b.js → page.fad77cea17947d47.js} +10 -11
  50. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/tasks/{loading.195e168e8e41d797.js → loading.4120e6979eaed441.js} +1 -1
  51. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/tasks/{page.96f7573208644f40.js → page.474b3524d5ea53b7.js} +1 -1
  52. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/usage/{loading.905293c9aa9afbc9.js → loading.3a615597ca648452.js} +4 -4
  53. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/usage/{page.5f2b8585db8b27ad.js → page.7868a07efcaa26f4.js} +6 -6
  54. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{versions-list.8700f0106f4e8c15.js → versions-list.ba93a53773cab8a8.js} +3 -3
  55. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/edit/{loading.f94b2f9ab04aaf21.js → loading.6e53829bd1f3021d.js} +5 -5
  56. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/edit/{page.e898c4b5ef16ecb0.js → page.5798ede8ba8ace97.js} +10 -10
  57. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/platforms/[app]/app-cards.55778a4b3177846d.js +142 -0
  58. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/platforms/[app]/loading.f0d91d48e2b79e50.js +14 -0
  59. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/platforms/[app]/page.ce391cad0d78795f.js +99 -0
  60. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{agent-pills.44e689e546fb042b.js → agent-pills.1012e04bfbc7bffd.js} +5 -5
  61. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{agent-toggle.4c67dfbb7d28a416.js → agent-toggle.0cec822c6099f058.js} +3 -3
  62. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{hero.9740a8e2f4b41f28.js → hero.7151c467e7ecf6a5.js} +4 -4
  63. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{instructions.85b1cd986a9edbb5.js → instructions.1b8c9189961c5a4f.js} +13 -4
  64. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{connect-repositories.ff8b78a03153239b.js → connect-repositories.4e121d31ed0cfe02.js} +1 -1
  65. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{editor.471af698b8060eba.js → editor.f314d92af0bb33b0.js} +164 -127
  66. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{import-picker.b7b5c89e618e8f89.js → import-picker.11028d5329ad537b.js} +11 -11
  67. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/new/{loading.ecb9dfd4d0f9d107.js → loading.9b65a8c1cdc8346f.js} +5 -5
  68. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/new/{page.880bdac7fe843635.js → page.1476d31e4554e88b.js} +9 -8
  69. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{layout.81f7e055829854a3.js → layout.150d950d191db477.js} +89 -26
  70. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/operator/operator-apps.3e72de86b86a7338.js +155 -0
  71. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/operator/{page.8f8697b1b6b34ad7.js → page.6a4be3b1a473ff8c.js} +10 -10
  72. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{page.fe608b8e661aba1d.js → page.262ed73437c17872.js} +1 -1
  73. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/advanced-list.7180570379e2625c.js +63 -0
  74. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/connection-add.632b1847c16ecd42.js +526 -0
  75. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/connections-list.4378ae707b2092ed.js +439 -0
  76. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{credentials-list.a4d8338c7f6a5702.js → credentials-list.e47897acb6867df8.js} +116 -101
  77. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{credentials.1443bbed1ff1d441.js → credentials.6bd06f96afbe7329.js} +9 -9
  78. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/list.38e70272eeb98cd0.js +201 -0
  79. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{loading.7ca95dcb4fb3362b.js → loading.71ca4f6c99a8a9d5.js} +1 -1
  80. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/models-list.a08cd37d0f7ff86c.js +635 -0
  81. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{page.805d0f8a2c5817d6.js → page.f096b5a9ac419326.js} +67 -41
  82. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{runners-list.1e83449aa6593224.js → runners-list.0df1f9329df1b67d.js} +42 -37
  83. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{secrets-list.17ac06593005b8ba.js → secrets-list.6d2f56fa7d6fcab0.js} +19 -17
  84. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/chain-hint.65c4cc04c78e8bfd.js +18 -0
  85. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{layout.8c4a2b31b194ba3e.js → layout.0fd865c865e5bab4.js} +6 -6
  86. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/model-options.0d6077fe68db3af9.js +147 -0
  87. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/model-pick.695538b2edf9dd15.js +160 -0
  88. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{page.a77996786278cda0.js → page.c57b81c2197cce0f.js} +1 -1
  89. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{settings-head.705be0b1129b97af.js → settings-head.004ced21e02ffa48.js} +5 -5
  90. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{tunnel-guide.29eee1a0b1852168.js → tunnel-guide.1bc6bff9d8019098.js} +1 -1
  91. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{create-link.19b4c50ef497aca1.js → create-link.60aadbe43ea1e39c.js} +5 -5
  92. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{outcome-dialog.18cf32fa42247b91.js → outcome-dialog.a74e686aaed0c584.js} +3 -3
  93. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/outcome-toast.e2b9ef0344b1a1a2.js +24 -0
  94. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{outcome.cbbc8cd1bbbee01b.js → outcome.22a83d756e4020a7.js} +3 -6
  95. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{page.616f0b36bf7925bc.js → page.c456ad99c8a9f875.js} +8 -8
  96. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{activity.a911169a820ba604.js → activity.2ec05d78d609b7b2.js} +12 -6
  97. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{loading.76f851da5cc5268d.js → loading.779ecdd9c9d2ff09.js} +5 -5
  98. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{page.ddb594bb6567ee13.js → page.578be2f6c89fcba0.js} +16 -9
  99. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/task-actions.d131453dd2a423c3.js +408 -0
  100. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/task-missing.33ec27a4a5eafefe.js +27 -0
  101. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{task-view.3276538e8306fd8a.js → task-view.3d72a4ecd2b3826e.js} +44 -81
  102. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{composer-data.05fc39e1a7fd1ab7.js → composer-data.c16854be11a561e4.js} +4 -6
  103. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{composer.dbf06b05c5e2eba3.js → composer.97be3e67214889c1.js} +130 -195
  104. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/pending-approvals.9175908da02960e1.js +40 -0
  105. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{status.cb704b48ce86cc7d.js → status.d2c05c397780b833.js} +7 -1
  106. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{task.f089c1c122ed6dd2.js → task.a25847399a4dfb30.js} +9 -26
  107. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{tasks-list.5a00d69851dae119.js → tasks-list.028798c79227a366.js} +43 -35
  108. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{tasks-section.36e70c93f7d0feee.js → tasks-section.9a9d13057b326f25.js} +16 -10
  109. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{page.185b1ba0c803db3f.js → page.045c6db0c56975b2.js} +5 -5
  110. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/usage/{custom-range.2e21c7f891966c15.js → custom-range.fe91164d7a311356.js} +3 -3
  111. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/usage/{day-chart.261b6651df2d3966.js → day-chart.20faaaf57c81ad9e.js} +1 -1
  112. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/usage/{loading.a7e0ec01bfa769e3.js → loading.5b973a8bb29197d5.js} +3 -3
  113. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/usage/{page.d41fea7676e37bfc.js → page.938d29ff7edb678d.js} +7 -7
  114. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/usage/{range-bar.69e68c9dae09f238.js → range-bar.0b9038e9df707843.js} +4 -4
  115. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/usage/{top-agents.18fc469e781e2305.js → top-agents.93c916167299ffb6.js} +2 -2
  116. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/{layout.296d70b95894209f.js → layout.94ea3908b03bede6.js} +2 -2
  117. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/login/{page.a82be2fd23e9ac67.js → page.4827d64c71c0690a.js} +2 -2
  118. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{drawer.d3e61538dbc8ec39.js → drawer.1a08ff611df7fe38.js} +2 -2
  119. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{foreign-link.8c6adf9c5a6f467c.js → foreign-link.1d4f63a0379cbd1d.js} +3 -3
  120. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{loading-card.1cea8a722c10b998.js → loading-card.77bea8c5870b5d3c.js} +5 -5
  121. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{page-head.87b92529dbb53ceb.js → page-head.2eb1e0213eb50349.js} +3 -2
  122. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{stream.c32d78562f75db25.js → stream.2cdb8eabd8f6df70.js} +2 -2
  123. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{task-toasts.44075fa7e04575e8.js → task-toasts.8733901ca0e4c246.js} +28 -18
  124. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{theme-choices.85100ed66d6f9200.js → theme-choices.fc86071c1b634176.js} +2 -2
  125. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/nav/{back.d6109e72fbd04b45.js → back.7aa0ae82dbec38cd.js} +3 -3
  126. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/nav/{org.d3abfd4053b711ce.js → org.853d173b55368728.js} +1 -1
  127. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/nav/{side-toggle.489faf1a259479f7.js → side-toggle.be7d2a7529557435.js} +2 -2
  128. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{badge.c0bc352791a95fd6.js → badge.9f63fd615cf0ee22.js} +2 -2
  129. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/button.2b18ba19ae01e2bb.css.pnext-asset.js +0 -0
  130. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{button.ce9e6cdb08ca86db.js → button.b62fa52e18fa338b.js} +2 -2
  131. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/card.4ab7ad42a0770726.css.pnext-asset.js +0 -0
  132. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{card.9f0d45b73bc78b4f.js → card.c0030eafd76587e3.js} +21 -9
  133. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{collapse.93e4d1b20c2873ed.js → collapse.eb578fdf42029754.js} +1 -1
  134. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{combo.54270c0251466fda.js → combo.e4e08287494081a3.js} +2 -2
  135. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{confirm.29e198be34578222.js → confirm.e21b7f5e486dafb8.js} +3 -3
  136. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{copy.bd6fc1577a393965.js → copy.043e0695c08c72f9.js} +2 -2
  137. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{filter.81bb9a5c60cd1089.js → filter.0730dccad6332327.js} +6 -6
  138. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/filter.6fdff1e7355aaa0e.css.pnext-asset.js +0 -0
  139. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{icons.e36c72f54750663a.js → icons.f769275420d072ce.js} +4 -0
  140. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{menu-items.1d082ac4dae8f3d4.js → menu-items.759a1b1f7c5ee365.js} +2 -2
  141. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{menu.ee45bace979944b6.js → menu.7f558c7c6f6345d5.js} +3 -3
  142. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/menu.cd96fa0495fe0fde.css.pnext-asset.js +0 -0
  143. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{modal.0b69c7fd9db025b9.js → modal.08ac85d31f4c76c1.js} +7 -6
  144. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{select.2eb33e5bea28d804.js → select.0ee9e8f04ddd8b47.js} +9 -6
  145. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{tail.04132db0c5033d4f.js → tail.7eb303330802ac18.js} +2 -2
  146. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/toolbar.cdbd0357f2c5e1fe.css.pnext-asset.js +0 -0
  147. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{toolbar.8b3a460a65edf85a.js → toolbar.ff8367c641d28c1e.js} +2 -2
  148. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/utils/{action.67dd6f8ab1ae067d.js → action.56cea462eb725c39.js} +1 -1
  149. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/utils/{client.78267fa3d7905d17.js → client.685154f230716834.js} +1 -1
  150. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/routes/http.394704f4f12ada08.js +165 -0
  151. package/dist/dash/standalone/server/modules-server-server-react-server/src/utils/crypto.24a6439ff8d10d3d.js +11 -0
  152. package/dist/dash/standalone/static/assets/chunks/advanced-list-b75a9c2bd11026de.js +1 -0
  153. package/dist/dash/standalone/static/assets/chunks/agent-pills-54564413a57d7fa7.js +2 -0
  154. package/dist/dash/standalone/static/assets/chunks/agent-settings-form-55d294dad2ce5a0d.js +1 -0
  155. package/dist/dash/standalone/static/assets/chunks/agent-toggle-b5dcc4ea6292fb3d.js +1 -0
  156. package/dist/dash/standalone/static/assets/chunks/agents-grid-69461c53abbba433.js +1 -0
  157. package/dist/dash/standalone/static/assets/chunks/{back-e29cb10f5548ddae.js → back-ba5e4340a9f8bbd2.js} +1 -1
  158. package/dist/dash/standalone/static/assets/chunks/chain-hint-491eb09a20a15702.js +1 -0
  159. package/dist/dash/standalone/static/assets/chunks/{combo-702c94817bf6ac17.js → combo-6df61e8a1cc31037.js} +1 -1
  160. package/dist/dash/standalone/static/assets/chunks/composer-198b844da57b82a3.js +1 -0
  161. package/dist/dash/standalone/static/assets/chunks/composer-b26a3332a1243461.js +1 -0
  162. package/dist/dash/standalone/static/assets/chunks/composer-data-b05f3d93fdc472d7.js +1 -0
  163. package/dist/dash/standalone/static/assets/chunks/{confirm-a78147b6ecef3847.js → confirm-14d018653fbe50fc.js} +1 -1
  164. package/dist/dash/standalone/static/assets/chunks/{connect-repositories-7770ab805160028d.js → connect-repositories-5118edc019fc7890.js} +1 -1
  165. package/dist/dash/standalone/static/assets/chunks/connections-list-5412dad7e0def52f.js +1 -0
  166. package/dist/dash/standalone/static/assets/chunks/{copy-bdc60bdafe336316.js → copy-04781f9af4e10f06.js} +1 -1
  167. package/dist/dash/standalone/static/assets/chunks/create-link-0651addf1461f901.js +1 -0
  168. package/dist/dash/standalone/static/assets/chunks/credentials-list-e64c973aee5602d3.js +1 -0
  169. package/dist/dash/standalone/static/assets/chunks/custom-range-b6919bab9846ebf7.js +1 -0
  170. package/dist/dash/standalone/static/assets/chunks/editor-68e9ccd1764fc512.js +6 -0
  171. package/dist/dash/standalone/static/assets/chunks/{field-bb8191aa02d07282.js → field-adcb6e6a5f9b7131.js} +1 -1
  172. package/dist/dash/standalone/static/assets/chunks/instructions-0022dd3bdd57c13f.js +1 -0
  173. package/dist/dash/standalone/static/assets/chunks/instructions-7b274685ceb26457.js +2 -0
  174. package/dist/dash/standalone/static/assets/chunks/list-662f042656857c82.js +1 -0
  175. package/dist/dash/standalone/static/assets/chunks/model-options-5e07b3318d69d218.js +1 -0
  176. package/dist/dash/standalone/static/assets/chunks/models-list-ae1e2eff30d21824.js +1 -0
  177. package/dist/dash/standalone/static/assets/chunks/outcome-dialog-546fe090efc129c2.js +1 -0
  178. package/dist/dash/standalone/static/assets/chunks/{outcome-dialog-fde11a52c282301d.js → outcome-dialog-fd86ded4c44c2de7.js} +1 -1
  179. package/dist/dash/standalone/static/assets/chunks/outcome-toast-c00becdb638cd9a8.js +1 -0
  180. package/dist/dash/standalone/static/assets/chunks/platform-actions-2be223e68e648134.js +1 -0
  181. package/dist/dash/standalone/static/assets/chunks/platform-actions-f3979ab69a6ceb53.js +1 -0
  182. package/dist/dash/standalone/static/assets/chunks/platform-step-5454b6c0a19caefd.js +1 -0
  183. package/dist/dash/standalone/static/assets/chunks/platform-step-9a52703f4c4f6a31.js +1 -0
  184. package/dist/dash/standalone/static/assets/chunks/runners-list-20d42f19fb4bec8a.js +1 -0
  185. package/dist/dash/standalone/static/assets/chunks/{runtime-6e12333f12903a62-1.js → runtime-3fcac605fffcc273-1.js} +1 -1
  186. package/dist/dash/standalone/static/assets/chunks/secrets-list-89f89ee70edb3856.js +1 -0
  187. package/dist/dash/standalone/static/assets/chunks/{segmented-0b6dc6b93c35e0f5.js → segmented-66a8c77c6294fec3.js} +1 -1
  188. package/dist/dash/standalone/static/assets/chunks/shared-init-3fcac605fffcc273-2.js +1 -0
  189. package/dist/dash/standalone/static/assets/chunks/shared-init-96225b8c7758de9d.js +1 -0
  190. package/dist/dash/standalone/static/assets/chunks/shared-init-96cde32cd50254c0.js +1 -0
  191. package/dist/dash/standalone/static/assets/chunks/shared-init-abd7653140f37a0c.js +9 -0
  192. package/dist/dash/standalone/static/assets/chunks/side-toggle-8a410cc6d6bd9b1d.js +1 -0
  193. package/dist/dash/standalone/static/assets/chunks/{tail-f8804b80cf32f8d0.js → tail-40f16e09eade7eee.js} +1 -1
  194. package/dist/dash/standalone/static/assets/chunks/task-396d849e58e50d59.js +1 -0
  195. package/dist/dash/standalone/static/assets/chunks/task-actions-0b3054dc0f8d17c0.js +3 -0
  196. package/dist/dash/standalone/static/assets/chunks/task-view-9e026dc5da58af5b.js +3 -0
  197. package/dist/dash/standalone/static/assets/chunks/tasks-list-04c6568d7f7237b7.js +1 -0
  198. package/dist/dash/standalone/static/assets/chunks/versions-list-ceb756236e69b761.js +1 -0
  199. package/dist/dash/standalone/static/assets/chunks/{wular-pnext-6e12333f12903a62-0.js → wular-pnext-3fcac605fffcc273-0.js} +1 -1
  200. package/dist/dash/standalone/static/assets/create-param-id-2c72f3e32e7f8b8d.css +1 -0
  201. package/dist/dash/standalone/static/assets/dash-param-org-a7f30a8c5a6fa651.css +1 -0
  202. package/dist/dash/standalone/static/assets/dash-param-org-account-76fffb9337b633f2.css +1 -0
  203. package/dist/dash/standalone/static/assets/dash-param-org-agents-cc5d59edfc3cf0b1.css +1 -0
  204. package/dist/dash/standalone/static/assets/dash-param-org-agents-new-170499c849114150.css +1 -0
  205. package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-dd4ac319a0d62432.css +1 -0
  206. package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-edit-199a9991de1bf2d9.css +1 -0
  207. package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-platforms-9d2e1439f3f7e81b.css +1 -0
  208. package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-platforms-param-app-a6d559f0e26bd01b.css +1 -0
  209. package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-settings-f21d4fcd3948139b.css +1 -0
  210. package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-tasks-c8d6aa06f6e75f4c.css +1 -0
  211. package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-usage-9cc128ba8af6ef62.css +1 -0
  212. package/dist/dash/standalone/static/assets/dash-param-org-operator-8d5ef55834d8deba.css +1 -0
  213. package/dist/dash/standalone/static/assets/dash-param-org-settings-7138821f5422d087.css +1 -0
  214. package/dist/dash/standalone/static/assets/dash-param-org-settings-param-tab-586fec34f285e9cb.css +1 -0
  215. package/dist/dash/standalone/static/assets/dash-param-org-setup-67679c1f84f352cf.css +1 -0
  216. package/dist/dash/standalone/static/assets/dash-param-org-tasks-be3cb3d64573f3d9.css +1 -0
  217. package/dist/dash/standalone/static/assets/dash-param-org-tasks-param-id-c20a0537bc82620d.css +1 -0
  218. package/dist/dash/standalone/static/assets/dash-param-org-usage-c534db20ce538fd2.css +1 -0
  219. package/dist/dash/standalone/static/assets/global-df2c26ad15039e8a.css +1 -0
  220. package/dist/dash/standalone/static/assets/{login-9760b85feae40270.css → login-148795638d6ff5d4.css} +1 -1
  221. package/dist/dash/standalone/static/assets/pnext-client-07b41bfab64b61c0.js +1 -0
  222. package/dist/dash/standalone/static/assets/pnext-client-0d388d56250f9f46.js +1 -0
  223. package/dist/dash/standalone/static/assets/pnext-client-1443e45181b60bb0.js +1 -0
  224. package/dist/dash/standalone/static/assets/pnext-client-27207e4f43f9a21b.js +1 -0
  225. package/dist/dash/standalone/static/assets/pnext-client-435db60553fa3a67.js +1 -0
  226. package/dist/dash/standalone/static/assets/pnext-client-523dd4071aa294ba.js +1 -0
  227. package/dist/dash/standalone/static/assets/pnext-client-5f6bda3919f68382.js +1 -0
  228. package/dist/dash/standalone/static/assets/pnext-client-684fd8ad16563ed3.js +1 -0
  229. package/dist/dash/standalone/static/assets/pnext-client-6b952cdda9a1eb2b.js +1 -0
  230. package/dist/dash/standalone/static/assets/pnext-client-6fe9e98f7dd8dcbf.js +1 -0
  231. package/dist/dash/standalone/static/assets/pnext-client-730c2c507a159f9e.js +1 -0
  232. package/dist/dash/standalone/static/assets/pnext-client-7c46573e45b67166.js +1 -0
  233. package/dist/dash/standalone/static/assets/pnext-client-83a865c3d75705bd.js +1 -0
  234. package/dist/dash/standalone/static/assets/pnext-client-907d1db4fb398a1d.js +1 -0
  235. package/dist/dash/standalone/static/assets/pnext-client-9baf701f3e641d09.js +1 -0
  236. package/dist/dash/standalone/static/assets/pnext-client-a57705e4e1047a9e.js +1 -0
  237. package/dist/dash/standalone/static/assets/pnext-client-b1af82c6f0db0033.js +1 -0
  238. package/dist/dash/standalone/static/assets/pnext-client-cede3bd7b2735942.js +1 -0
  239. package/dist/dash/standalone/static/assets/pnext-client-d9a3996f22b6816b.js +1 -0
  240. package/dist/dash/standalone/static/assets/pnext-client-f95364a0073ca4ce.js +1 -0
  241. package/dist/definition-D0OpQfGX.js +1 -0
  242. package/dist/discover-BfYHHJN_.js +1 -0
  243. package/dist/dispatch-BkoIU4GU.js +12 -0
  244. package/dist/{dist-DAnSqY1s.js → dist-B5qUdWUG.js} +35 -35
  245. package/dist/{dist-B2jiMMxZ.js → dist-Clxdruuu.js} +3 -3
  246. package/dist/{dist-ClCNj65n.js → dist-CymLGfHl.js} +4 -4
  247. package/dist/{adapter-Bz0E-DAY.js → dist-DX0JzVC6.js} +990 -990
  248. package/dist/{adapter-CsacmMmv.js → dist-DfD9WmV8.js} +39 -39
  249. package/dist/dist-node-B8VIVzUc.js +20 -0
  250. package/dist/docs-CxklYa3P.js +2 -0
  251. package/dist/drive-B7SBFfcb.js +1 -0
  252. package/dist/drizzle-orm-CYU7WOQS.js +2 -0
  253. package/dist/{emit-BrkJJPUE.js → emit-BgeqsCkC.js} +3 -3
  254. package/dist/env-BwFCHakK.js +1 -0
  255. package/dist/errors-DK_trCff.js +1 -0
  256. package/dist/exec-D9jF2F-H.js +3 -0
  257. package/dist/executor-DBW7R7Tf.js +11 -0
  258. package/dist/flow/builtin/review/index.d.ts +2 -2
  259. package/dist/flow/builtin/review/index.js +10 -15
  260. package/dist/flow/index.d.ts +2 -2
  261. package/dist/flow/index.js +1 -1
  262. package/dist/github-actions-2RjyRseX.js +36 -0
  263. package/dist/{hook-CIipj9MJ.js → hook-DN__zYOG.js} +1 -1
  264. package/dist/http-615JJgHo.js +5 -0
  265. package/dist/http-DRk8cDjf.js +1 -0
  266. package/dist/{index-ChcxzFdB.d.ts → index-CTAQrCRU.d.ts} +403 -307
  267. package/dist/integrations-DSZSa8Rc.js +9 -0
  268. package/dist/lib/broker.js +2 -2
  269. package/dist/load-BtIDghgd.js +2 -0
  270. package/dist/local-BzMvgiwL.js +5 -0
  271. package/dist/local-GIxwz_Or.js +1 -0
  272. package/dist/login-LlZrIlxb.js +8 -0
  273. package/dist/maintenance-DyiyHI8S.js +1 -0
  274. package/dist/mcp-Caq72REF.js +1 -0
  275. package/dist/mcp-CrtKQoVi.js +1 -0
  276. package/dist/mcp-cEIva8Pd.js +27 -0
  277. package/dist/metadata-D_bBfr3H.js +1 -0
  278. package/dist/models-BVxs3I8o.js +1 -0
  279. package/dist/output-BKeyLbvt.js +5 -0
  280. package/dist/permission-RSZM3DUk.js +1 -0
  281. package/dist/post-DLenID75.js +11 -0
  282. package/dist/prompt-CpwbsEWM.js +4 -0
  283. package/dist/refresh-CWEpTAkD.js +1 -0
  284. package/dist/remote-BDMuKaON.js +2 -0
  285. package/dist/remote-CY-qYX2C.js +1 -0
  286. package/dist/runner-CKMOh5Q3.js +1 -0
  287. package/dist/runner.json +1 -1
  288. package/dist/runner.tgz +0 -0
  289. package/dist/schema.d.ts +2 -2
  290. package/dist/schema.js +2 -3
  291. package/dist/sdk.d.ts +2857 -1405
  292. package/dist/sdk.js +1 -1
  293. package/dist/serve-D23JqDip.js +12 -0
  294. package/dist/serve-DoYbHm_k.js +5 -0
  295. package/dist/serve-YlU04KO7.js +1 -0
  296. package/dist/session-D7eeJIaH.js +1 -0
  297. package/dist/sessions-BGUfSe8L.js +1 -0
  298. package/dist/shared-BzNReirj.js +1 -0
  299. package/dist/sign-in-Dr6sU7vz.js +3 -0
  300. package/dist/state-CxAUec80.js +6 -0
  301. package/dist/store-BrnWdtRw.js +349 -0
  302. package/dist/task-CyqtCXo3.js +1 -0
  303. package/dist/task-DN4assR8.js +7 -0
  304. package/dist/tool-search-C9Ty3hhL.js +6 -0
  305. package/dist/tools-Ck-ZWtmB.js +1 -0
  306. package/dist/tools-DVtBtED6.js +1 -0
  307. package/dist/tools-search-BNDea9vZ.js +1 -0
  308. package/dist/turn-eI4iRPsq.js +3 -0
  309. package/dist/types-DHBqXFE2.js +1 -0
  310. package/dist/update-check-Bap3dwaj.js +1 -0
  311. package/dist/view-D-rbQ1Kz.js +4 -0
  312. package/dist/views-Bxm_5J6T.js +2 -0
  313. package/dist/worker-DJANNSCT.js +1 -0
  314. package/dist/worker-DeuC38Vp.js +7 -0
  315. package/dist/zod-_-snqfdO.js +1 -0
  316. package/dist/zod.js +65 -1
  317. package/docs/agents/coder.md +5 -1
  318. package/docs/agents/index.md +53 -82
  319. package/docs/approvals.md +47 -0
  320. package/docs/cli/agent.md +34 -13
  321. package/docs/cli/auth.md +1 -1
  322. package/docs/cli/connection.md +22 -21
  323. package/docs/cli/index.md +18 -14
  324. package/docs/cli/model.md +11 -11
  325. package/docs/cli/task.md +28 -30
  326. package/docs/config.md +37 -65
  327. package/docs/connections.md +80 -0
  328. package/docs/dash.md +23 -19
  329. package/docs/flows.md +46 -213
  330. package/docs/models.md +48 -78
  331. package/docs/review.md +49 -18
  332. package/docs/runners.md +49 -0
  333. package/docs/sdk.md +49 -73
  334. package/docs/self-host.md +81 -82
  335. package/package.json +4 -5
  336. package/plugins/agents/skills/coder/SKILL.md +3 -3
  337. package/plugins/claude/.claude-plugin/plugin.json +1 -1
  338. package/plugins/claude/skills/dispatch/SKILL.md +3 -3
  339. package/plugins/cursor/.cursor-plugin/plugin.json +1 -1
  340. package/plugins/cursor/README.md +3 -3
  341. package/plugins/cursor/skills/coder/SKILL.md +3 -3
  342. package/dist/actions-D12xDiQS.js +0 -4
  343. package/dist/adapter-DzpdWewB.js +0 -1
  344. package/dist/agent-JJStALIx.js +0 -8
  345. package/dist/apps-Bnk7F3A2.js +0 -379
  346. package/dist/args-Dqf5Y1RP.js +0 -1
  347. package/dist/async-Tj4zKHXR.js +0 -3
  348. package/dist/auth-BhpnOCbn.js +0 -1
  349. package/dist/base64url-CsVsW4Id.js +0 -1
  350. package/dist/chat-CSepnsrK.js +0 -13
  351. package/dist/cmd-BHZwhrfa.js +0 -118
  352. package/dist/connection-BkYTuJjV.js +0 -1
  353. package/dist/context-zhSlmXOp.js +0 -7
  354. package/dist/conversation-DT-35cEt.js +0 -1
  355. package/dist/core-DwsAMCnL.js +0 -65
  356. package/dist/dash/standalone/node_modules/contextjsx/dist/index.mjs +0 -1
  357. package/dist/dash/standalone/node_modules/contextjsx/dist/jsx-runtime.mjs +0 -1
  358. package/dist/dash/standalone/node_modules/contextjsx/dist/src-BJ0QFeB8.mjs +0 -2
  359. package/dist/dash/standalone/node_modules/contextjsx/package.json +0 -70
  360. package/dist/dash/standalone/server/modules-server-server-react-server/src/agent/context/turn.6bb73458768e222e.js +0 -129
  361. package/dist/dash/standalone/server/modules-server-server-react-server/src/core/defaults.e972c134a1ae918f.js +0 -55
  362. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/auth/sign-in.661b3a4139af5bd7.js +0 -11
  363. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/connect/page.04762872666a6f0a.js +0 -26
  364. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/connect-apps.8a20501ccb244421.js +0 -36
  365. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/page.d066b77dd3187026.js +0 -65
  366. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/operator/operator-apps.09bf294d753ee9d7.js +0 -115
  367. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/connections-list.97381888bfdd711b.js +0 -642
  368. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/engines-list.d47db60d7dc01ebd.js +0 -73
  369. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/list.a5b273558fb7f0f0.js +0 -156
  370. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/models-list.31d369f1b7ab45da.js +0 -444
  371. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/model-options.73f8d0d54f79d8e3.js +0 -100
  372. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/task-actions.51fbeac76459433a.js +0 -240
  373. package/dist/dash/standalone/static/assets/chunks/action-a76e495fb39a73d3.js +0 -1
  374. package/dist/dash/standalone/static/assets/chunks/agent-pills-4d3c6a2aa9eb1522.js +0 -2
  375. package/dist/dash/standalone/static/assets/chunks/agent-settings-form-f7231a66e391f6b6.js +0 -1
  376. package/dist/dash/standalone/static/assets/chunks/agent-toggle-d7d27123f2070f18.js +0 -1
  377. package/dist/dash/standalone/static/assets/chunks/agents-grid-185ecb3d86c6c447.js +0 -1
  378. package/dist/dash/standalone/static/assets/chunks/composer-56ebf36d63400423.js +0 -1
  379. package/dist/dash/standalone/static/assets/chunks/composer-a686289a79f64bae.js +0 -1
  380. package/dist/dash/standalone/static/assets/chunks/composer-data-f46a9bc7a14b4f9a.js +0 -1
  381. package/dist/dash/standalone/static/assets/chunks/connect-apps-696726aedab42c96.js +0 -1
  382. package/dist/dash/standalone/static/assets/chunks/connections-list-07559f145f3e3da3.js +0 -1
  383. package/dist/dash/standalone/static/assets/chunks/create-link-426b0a5871ee41dd.js +0 -1
  384. package/dist/dash/standalone/static/assets/chunks/credentials-list-f07d090410104148.js +0 -1
  385. package/dist/dash/standalone/static/assets/chunks/custom-range-6618f32ef6cd4e80.js +0 -1
  386. package/dist/dash/standalone/static/assets/chunks/editor-0860e370cbfc6b03.js +0 -6
  387. package/dist/dash/standalone/static/assets/chunks/engines-list-31b9bb7885924b05.js +0 -1
  388. package/dist/dash/standalone/static/assets/chunks/format-a27067f0186e78ac.js +0 -1
  389. package/dist/dash/standalone/static/assets/chunks/instructions-06b63e558f879da5.js +0 -1
  390. package/dist/dash/standalone/static/assets/chunks/instructions-2d9fbcbfadac4f40.js +0 -2
  391. package/dist/dash/standalone/static/assets/chunks/list-2773686bf8df64c7.js +0 -1
  392. package/dist/dash/standalone/static/assets/chunks/model-options-8d2170eebe0d061d.js +0 -1
  393. package/dist/dash/standalone/static/assets/chunks/models-list-03611e64b6a07efe.js +0 -1
  394. package/dist/dash/standalone/static/assets/chunks/notice-d14fdac28139c0a8.js +0 -1
  395. package/dist/dash/standalone/static/assets/chunks/outcome-dialog-d3ba8ef89c59f801.js +0 -1
  396. package/dist/dash/standalone/static/assets/chunks/platform-actions-2a71c62b9f7eaef3.js +0 -1
  397. package/dist/dash/standalone/static/assets/chunks/platform-actions-70600c9943320152.js +0 -1
  398. package/dist/dash/standalone/static/assets/chunks/runners-list-edf536eb8003eab5.js +0 -1
  399. package/dist/dash/standalone/static/assets/chunks/secrets-list-e86122f73525ff95.js +0 -1
  400. package/dist/dash/standalone/static/assets/chunks/shared-init-6e12333f12903a62-2.js +0 -1
  401. package/dist/dash/standalone/static/assets/chunks/shared-init-b281027d465e004f.js +0 -5
  402. package/dist/dash/standalone/static/assets/chunks/shared-init-c3bd249cf1eca6d1.js +0 -2
  403. package/dist/dash/standalone/static/assets/chunks/side-toggle-9b3af821cfe4c824.js +0 -1
  404. package/dist/dash/standalone/static/assets/chunks/task-a37e7c26e82eb77d.js +0 -1
  405. package/dist/dash/standalone/static/assets/chunks/task-actions-705395565f2d83b8.js +0 -1
  406. package/dist/dash/standalone/static/assets/chunks/task-view-cb21169f38b56d15.js +0 -6
  407. package/dist/dash/standalone/static/assets/chunks/tasks-list-d7dccfd7e0623ae0.js +0 -1
  408. package/dist/dash/standalone/static/assets/chunks/versions-list-f8f2e71df691efda.js +0 -1
  409. package/dist/dash/standalone/static/assets/connect-a550b6f3a8c00186.css +0 -1
  410. package/dist/dash/standalone/static/assets/create-param-id-c2c756f652f2fc30.css +0 -1
  411. package/dist/dash/standalone/static/assets/dash-param-org-account-702f8a1b213e4026.css +0 -1
  412. package/dist/dash/standalone/static/assets/dash-param-org-agents-aad2f9f93c06e9ab.css +0 -1
  413. package/dist/dash/standalone/static/assets/dash-param-org-agents-new-f9dcbcec36586f2b.css +0 -1
  414. package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-8ff47f5d622c1f9b.css +0 -1
  415. package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-edit-907036d553cfeb36.css +0 -1
  416. package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-platforms-5cc77badad15f00c.css +0 -1
  417. package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-settings-705d7c15868b4fd6.css +0 -1
  418. package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-tasks-04e189c045098772.css +0 -1
  419. package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-usage-76fcd1ce7b3dae71.css +0 -1
  420. package/dist/dash/standalone/static/assets/dash-param-org-eccb6bb9297a53e6.css +0 -1
  421. package/dist/dash/standalone/static/assets/dash-param-org-operator-635a121f7a9a95bd.css +0 -1
  422. package/dist/dash/standalone/static/assets/dash-param-org-settings-a3297dc4d9e0c961.css +0 -1
  423. package/dist/dash/standalone/static/assets/dash-param-org-settings-param-tab-bcb06f81d9e8268d.css +0 -1
  424. package/dist/dash/standalone/static/assets/dash-param-org-setup-df4be8b188b9777f.css +0 -1
  425. package/dist/dash/standalone/static/assets/dash-param-org-tasks-16f9866a1b4801cd.css +0 -1
  426. package/dist/dash/standalone/static/assets/dash-param-org-tasks-param-id-02ae551dcd852b57.css +0 -1
  427. package/dist/dash/standalone/static/assets/dash-param-org-usage-f2175403069aab99.css +0 -1
  428. package/dist/dash/standalone/static/assets/global-e1de614478b64717.css +0 -1
  429. package/dist/dash/standalone/static/assets/pnext-client-0dc829ba60df5c26.js +0 -1
  430. package/dist/dash/standalone/static/assets/pnext-client-14d191f7f1da6602.js +0 -1
  431. package/dist/dash/standalone/static/assets/pnext-client-169eaa63783b71fd.js +0 -1
  432. package/dist/dash/standalone/static/assets/pnext-client-1e34cfefafa70fac.js +0 -1
  433. package/dist/dash/standalone/static/assets/pnext-client-285d61f00a80f40b.js +0 -1
  434. package/dist/dash/standalone/static/assets/pnext-client-35b89c3ba23ee845.js +0 -1
  435. package/dist/dash/standalone/static/assets/pnext-client-6c42784e005d4b87.js +0 -1
  436. package/dist/dash/standalone/static/assets/pnext-client-6cd93f9bd4cf6ffd.js +0 -1
  437. package/dist/dash/standalone/static/assets/pnext-client-7355f473fade532d.js +0 -1
  438. package/dist/dash/standalone/static/assets/pnext-client-815c3c297f75efb0.js +0 -1
  439. package/dist/dash/standalone/static/assets/pnext-client-87fe73c10a4dc33c.js +0 -1
  440. package/dist/dash/standalone/static/assets/pnext-client-98b56a142d441260.js +0 -1
  441. package/dist/dash/standalone/static/assets/pnext-client-b4bafe68a40f720b.js +0 -1
  442. package/dist/dash/standalone/static/assets/pnext-client-bf61ff39bdc0db48.js +0 -1
  443. package/dist/dash/standalone/static/assets/pnext-client-c9fa86c244813f74.js +0 -1
  444. package/dist/dash/standalone/static/assets/pnext-client-d2e7a75e16221224.js +0 -1
  445. package/dist/dash/standalone/static/assets/pnext-client-d34e774405ea8da8.js +0 -1
  446. package/dist/dash/standalone/static/assets/pnext-client-d511822afdb41d1d.js +0 -1
  447. package/dist/dash/standalone/static/assets/pnext-client-e113aa2f25ecfe01.js +0 -1
  448. package/dist/dash/standalone/static/assets/pnext-client-eb62f461d0c32266.js +0 -1
  449. package/dist/discover-CHfF4cEz.js +0 -1
  450. package/dist/dist-node-Bv1kCqyi.js +0 -20
  451. package/dist/docs-KHc0_gFX.js +0 -2
  452. package/dist/drive-Bwl7Bjme.js +0 -1
  453. package/dist/env-6Y-NNnYD.js +0 -1
  454. package/dist/errors-DO_IltpP.js +0 -16
  455. package/dist/exec-BmTa0vcO.js +0 -4
  456. package/dist/executor-ufWRqhdS.js +0 -11
  457. package/dist/http-Cg8PSe-c.js +0 -1
  458. package/dist/integrations-I7fRDk_l.js +0 -4
  459. package/dist/load-BDlEFetB.js +0 -2
  460. package/dist/local-COlczLwI.js +0 -5
  461. package/dist/log-view-CfX9lakH.js +0 -4
  462. package/dist/maintenance-CKCIWOvn.js +0 -1
  463. package/dist/match-CufHAZQH.js +0 -1
  464. package/dist/mcp-BkwmRHI9.js +0 -2
  465. package/dist/mcp-CGU7aoJ-.js +0 -1
  466. package/dist/mcp-DAHbhfUh.js +0 -13
  467. package/dist/models-CzggS7p2.js +0 -1
  468. package/dist/output-SNqdgh9A.js +0 -17
  469. package/dist/permission-MWFjKxqX.js +0 -1
  470. package/dist/prompt-CIx4jwQF.js +0 -8
  471. package/dist/refresh-CxsaX5R9.js +0 -1
  472. package/dist/remote-C9Hj2cby.js +0 -2
  473. package/dist/remote-HUZCWgfl.js +0 -3
  474. package/dist/runner-DYysY1-G.js +0 -1
  475. package/dist/runners-CfaGE0nV.js +0 -36
  476. package/dist/serve-DdAdw7Su.js +0 -4
  477. package/dist/serve-NQykWAKV.js +0 -1
  478. package/dist/serve-vKNqVaVy.js +0 -12
  479. package/dist/slack-BtKvW_4v.js +0 -5
  480. package/dist/task-CFxs0E_J.js +0 -1
  481. package/dist/task-iuYQ0zAK.js +0 -7
  482. package/dist/tools-B6ZxcqRi.js +0 -2
  483. package/dist/tools-FVop8XYG.js +0 -1
  484. package/dist/tools-search-kjKKolwp.js +0 -1
  485. package/dist/turn-DQ13lkPF.js +0 -2
  486. package/dist/types-DPtbvoo3.js +0 -1
  487. package/dist/types-DmThhjcW.js +0 -1
  488. package/dist/views-CMHXBMJp.js +0 -3
  489. package/dist/wire-C9CupY_A.js +0 -1
  490. package/dist/worker-BQpx1dPr.js +0 -9
  491. package/dist/worker-sTJL2eoe.js +0 -1
  492. package/dist/zod-BoqHoRCH.js +0 -1
  493. package/docs/access.md +0 -33
  494. package/docs/mcp.md +0 -54
  495. /package/dist/dash/standalone/server/modules-server-server-react-server/src/core/{errors.1bd0542d832ae0c0.js → errors.200335e62a9d9564.js} +0 -0
  496. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{page.061f6006f2685f5e.css.pnext-asset.js → page.abe7a6d16eb15c41.css.pnext-asset.js} +0 -0
  497. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{page.107e622830bff31d.css.pnext-asset.js → page.1c7947d6f79d6447.css.pnext-asset.js} +0 -0
  498. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{settings/agent-settings-form.ca926c58d15044aa.css.pnext-asset.js → platforms/platform-step.a722e3b8539a0f85.css.pnext-asset.js} +0 -0
  499. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/{agent/instructions.446bccc375f30eeb.css.pnext-asset.js → [slug]/(tabs)/settings/agent-settings-form.bf5430862c505c55.css.pnext-asset.js} +0 -0
  500. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/{editor/editor.1eb1bce282b289c9.css.pnext-asset.js → [slug]/platforms/[app]/@/app/dash/[org]/agents/[slug]/(tabs)/platforms/page.db05694ed4113dab.css.pnext-asset.js} +0 -0
  501. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{layout.a4efa8d807fe5416.css.pnext-asset.js → agents/[slug]/platforms/[app]/app-cards.d2f5c8d620066e05.css.pnext-asset.js} +0 -0
  502. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{settings/[tab]/@/app/dash/[org]/setup/outcome.3ad5f7ec67e5238d.css.pnext-asset.js → agents/agent/instructions.4c31196fcbf9846c.css.pnext-asset.js} +0 -0
  503. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{settings/[tab]/connections-list.46786fe36b121a43.css.pnext-asset.js → agents/editor/editor.6b9a1d5c0a490153.css.pnext-asset.js} +0 -0
  504. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{settings/[tab]/credentials-list.f7c27f170ec1e868.css.pnext-asset.js → layout.52abe52dcfa736d7.css.pnext-asset.js} +0 -0
  505. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{engines-list.9927d602ebe9e7fc.css.pnext-asset.js → advanced-list.819e410e4178b328.css.pnext-asset.js} +0 -0
  506. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{list.8cbee173a5aff98d.css.pnext-asset.js → connections-list.87962937438296f1.css.pnext-asset.js} +0 -0
  507. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{runners-list.53c7ea80b6fb734c.css.pnext-asset.js → credentials-list.973f91751525bcb6.css.pnext-asset.js} +0 -0
  508. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{tasks/[id]/task-view.42337a0d7c6ad0b6.css.pnext-asset.js → settings/[tab]/list.69d1b62c4066015b.css.pnext-asset.js} +0 -0
  509. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{tasks/composer.5b8687662e1629fa.css.pnext-asset.js → settings/[tab]/models-list.efd3f5781314c1d9.css.pnext-asset.js} +0 -0
  510. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{tasks/list/tasks-list.2f90c4410f843fff.css.pnext-asset.js → settings/[tab]/runners-list.df35d33aba0c8b07.css.pnext-asset.js} +0 -0
  511. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/{globals.f8ac779f0ebf888b.css.pnext-asset.js → dash/[org]/settings/model-pick.74fababc0cc0bba7.css.pnext-asset.js} +0 -0
  512. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/{responsive.ebc5f7d77b4b86a0.css.pnext-asset.js → dash/[org]/tasks/[id]/task-view.440367ae07204ee7.css.pnext-asset.js} +0 -0
  513. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/{comps/frame/task-toasts.d13d9f628e530552.css.pnext-asset.js → app/dash/[org]/tasks/composer.33d49ad218253703.css.pnext-asset.js} +0 -0
  514. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/{comps/ui/badge.0cb1513f8b077560.css.pnext-asset.js → app/dash/[org]/tasks/list/pending-approvals.07e59a9cae7ccf29.css.pnext-asset.js} +0 -0
  515. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/{comps/ui/button.d7f4433f4e7faa80.css.pnext-asset.js → app/dash/[org]/tasks/list/tasks-list.f3737549b4696cc8.css.pnext-asset.js} +0 -0
  516. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/{comps/ui/card.f80288cc42f9bcae.css.pnext-asset.js → app/globals.3b53a3feaa1d72e1.css.pnext-asset.js} +0 -0
  517. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/{comps/ui/filter.b53f21acc3e2cfef.css.pnext-asset.js → app/responsive.2979ffa0161a5afd.css.pnext-asset.js} +0 -0
  518. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/{ui/menu.25b184f68cba7b46.css.pnext-asset.js → frame/task-toasts.682322f6f729b33e.css.pnext-asset.js} +0 -0
  519. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/ui/{toolbar.19e1ce5224a23acf.css.pnext-asset.js → badge.8e2a9842b28f44a6.css.pnext-asset.js} +0 -0
@@ -0,0 +1,122 @@
1
+ import{En as e,P as t,T as n,a as r,b as i,bn as a,c as o,d as s,da as c,f as l,h as u,i as d,j as f,k as p,l as m,n as h,o as g,p as _,r as v,s as y,t as b,u as x,ua as ee,v as S,va as te,x as ne}from"./args-CJsHYWbt.js";import{t as C}from"./errors-DK_trCff.js";import{S as re,_ as ie,a as w,b as ae,c as oe,d as se,f as T,g as E,h as D,l as ce,m as O,n as k,o as le,p as A,r as j,t as M,u as N,v as ue,x as de,y as P}from"./output-BKeyLbvt.js";import{a as fe,i as pe,n as me,o as he,r as ge}from"./prompt-CpwbsEWM.js";import{MODEL_HINT as _e,command as F,group as I,nextSteps as L,t as ve}from"./cli.js";import{M as ye,V as be,ft as xe,g as Se,i as R,mt as Ce,ot as z,p as we,ut as Te,vt as Ee}from"./state-CxAUec80.js";import{c as De}from"./session-D7eeJIaH.js";import{a as B}from"./approvals-C8XV7CK2.js";import V from"node:path";import H from"node:process";import Oe from"node:fs";import ke from"node:os";function Ae(e){let t=A;H.stdout.write(E([{header:`id`,value:e=>e.id,paint:e=>t.cyan(e)},{header:`description`,value:e=>e.description},{header:`events`,value:e=>e.events.join(`, `)},{header:`tools`,value:e=>e.tools.join(`, `)}],e,{style:t,border:!0}))}const je=F({name:`list`,description:`list integrations with their events and tools`,usage:"One row per integration: its id, the events an agent can wire, and every tool it offers; `show` splits the tools by preset.",access:`read`,globalFlags:{cwd:!1},run:async()=>{let{agents:e}=await import(`./agent-Cgala63h.js`).then(e=>e.t);return e.integrations.list()},next:()=>L([`Event descriptions and the tools each preset allows: coder agent integrations show <id>`]),print:Ae});function Me(e){let t=A,n=[...Object.entries(e.events).map(([e,t])=>({kind:`event`,name:e,does:t})),...Object.entries(e.tools).map(([e])=>({kind:`tools`,name:e===`read-only`?`Read-only`:`Auto`,does:e===`read-only`?`Platform tools marked read-only`:`All platform tools`}))];H.stdout.write(E([{header:`kind`,value:e=>e.kind,paint:e=>t.light(e)},{header:`name`,value:e=>e.name},{header:`does`,value:e=>e.does}],n,t))}const Ne=F({name:`show`,description:`events and tools of one integration`,usage:`Describe one integration: each event with what triggers it, and the tools each access (read-only, auto) allows.`,access:`read`,args:{id:x(`the integration`)},globalFlags:{cwd:!1},cli:{positional:[`id`],examples:[`coder agent integrations show github # the GitHub integration in full`]},run:async({args:[e]})=>{let{agents:t}=await import(`./agent-Cgala63h.js`).then(e=>e.t);return t.integrations.show(e)},print:Me}),Pe=I({name:`integrations`,description:`the integration catalog: events and tool presets`,usage:`The platforms an agent can listen to and act on: their events and tool presets.`,commands:[je,Ne],aliases:{ls:`list`}}),U=e=>(e??``).split(`,`).map(e=>e.trim()).filter(Boolean);function Fe(e){return Object.fromEntries(U(e).map(e=>{let t=e.indexOf(`=`);if(t<1)throw new C(`invalid-option`,`Bad --match "${e}"; use event=regex.`);let n=e.slice(t+1);if(y(n))throw new C(`invalid-option`,`Bad --match for ${e.slice(0,t)}: ${y(n)}`);return[e.slice(0,t),n]}))}const Ie={auto:`Auto`,"read-only":`Read-only`};function Le(e,t){let n=A;H.stdout.write(`Created ${n.cyan(t)}.\n`)}function Re(e,t){let{id:n,samples:r,integrations:i}=e,a=V.relative(t,e.dir),o=L(i.length?[`1. Write ${a}/system.md. Try it with no server: coder task run --agent ${n} "<task>"`,`2. Run it on a server: coder dash on this machine reads it from this repo; a cloud server imports it from the dashboard or with coder agent push.`,`3. On the dashboard, create the agent's app on each platform it uses (${i.join(`, `)}) from its Platforms tab, and install it.`,`4. Fire an event by hand, or leave --server out to run it offline: coder agent run ${n} ${r[0]??`<event.json>`} --server <url>`,`[Read the agent guide](https://github.com/muzam1l/coder/blob/main/docs/agents/index.md)`,`Agents: coder docs agents`]:[`1. Write ${a}/system.md. Try it with no server: coder task run --agent ${n} "<task>"`,`2. Give the agent a platform under "integrations" in ${a}/agent.json, then run init again or follow the guide: coder agent integrations list`,`[Read the agent guide](https://github.com/muzam1l/coder/blob/main/docs/agents/index.md)`,`Agents: coder docs agents`]);return i.length&&(o[1].usage=`coder dash`),o}async function ze(e){let{INTEGRATIONS:t}=await import(`./integrations-DSZSa8Rc.js`).then(e=>e.r),n=A;H.stdout.write(`Creating ${n.cyan(`.coder/agents/${e}`)}. Pick what the agent listens to and what it may do; flags skip these questions.\n\n`);let r=await fe({title:`Integrations`,hint:`Platforms the agent listens to and acts on. Add or remove them later in agent.json.`,multi:!0,selected:[Object.keys(t)[0]],options:Object.values(t).map(e=>({value:e.id,hint:e.description}))}),i={},a={};for(let e of r){let n=t[e],r=Object.keys(n.events),o=await he({title:`${e} events`,hint:`What wakes the agent on ${e}; each event runs the agent with that event as its prompt.`,multi:!0,required:!0,selected:r.filter(e=>!n.events[e].noisy),options:Object.entries(n.events).map(([e,t])=>({value:e,hint:t.description,...t.noisy?{input:{label:`match`,value:`^help\\b`,placeholder:`tab to add a match`,validate:y}}:{}}))});i[e]=o.values,a[e]=o.inputs}let[o]=await fe({title:`Access`,hint:`What every task of the agent may do; Auto lets the engine review what leaves the sandbox, Read-only allows only reads and read-only tools.`,selected:[`auto`],options:Object.keys(Ie).map(e=>({value:e,label:Ie[e]}))}),s=await me(`Display name`,e,void 0,`Shown in replies and app names.`);return{...s===e?{}:{name:s},integrations:r,events:i,matches:a,access:o}}const Be=F({name:`init`,description:`scaffold an agent folder in .coder/agents`,usage:"Create .coder/agents/<id>/ with an agent.json built from the integration catalog, a system.md to write the prompt in, and one sample event per integration for `coder agent run`. Asks for the id, integrations, events, and access when run in a terminal without them.",access:`write`,approvalPolicy:{handoff:{page:`/agents/new`,label:`Create agent`,action:`create`,args:[`id`,`name`,`description`,`integrations`,`events`,`access`,`match`],button:`Create agent`}},args:{id:x(`the agent id: its folder under .coder/agents`),integrations:x(`platforms the agent listens to (see coder agent integrations list)`,`<a,b>`),events:x(`events that start tasks, applied to each integration that has them (default: mention)`,`<a,b>`),access:x(`read-only or auto, for its tasks, platforms and connections (default: auto)`,`<read-only|auto>`),name:x(`display name used in replies (default: the id)`,`<text>`),description:x(`one line for agent list`,`<text>`),match:x(`start tasks only for event text matching a regex, as event=regex pairs`,`<a=re,b=re>`),yes:v(`skip the questions and take the defaults`)},cli:{positional:[`id`],examples:[`coder agent init # answer the questions, id included`,`coder agent init triage --integrations github --events issue,mention --access read-only # no questions`]},run:async({options:e,args:[t],cwd:n,tool:r})=>{let{agents:i}=await import(`./agent-Cgala63h.js`).then(e=>e.t),a=!r&&ge()&&!e.yes;return i.init(t,{name:e.name,description:e.description,access:e.access,integrations:U(e.integrations),events:U(e.events),matches:Fe(e.match),cwd:n,...a?{askId:e=>me(`Agent id`,``,e,`Folder name under .coder/agents and the name used in commands.`)}:{},...a&&!e.integrations?{askPicks:ze}:{}})},json:(e,{cwd:t})=>({id:e.id,dir:V.relative(t,e.dir),files:e.files,samples:e.samples}),next:({result:e,args:t})=>Re(e,t.cwd?V.resolve(t.cwd):H.cwd()),print:(e,{cwd:t})=>Le(e,V.relative(t,e.dir))}),Ve=e=>`builtin`in e,He=e=>e.map(e=>Ve(e)?{id:e.id,name:e.name,source:e.builtin?`builtin`:`repo`,description:e.definition.description??null}:{id:e.id,name:e.name,source:e.source,version:e.currentVersion,description:e.description??null});function Ue(e,t){if(!e.length)return void H.stdout.write(`No agents configured.
2
+ `);let n=A;H.stdout.write(E([{header:`id`,value:e=>e.id,paint:e=>n.cyan(e)},{header:`name`,value:e=>e.name},{header:`source`,value:e=>e.source,paint:e=>n.light(e)},...t?[{header:`version`,value:e=>String(e.version)}]:[],{header:`description`,value:e=>e.description??`-`}],e,n))}const We=F({name:`list`,description:`list local or server-owned agents`,usage:`Without --server, one row per built-in and workspace agent. With --server, list the agent records and current versions owned by that Coder server.`,access:`read`,args:o,run:async({options:e,cwd:t})=>{let{agents:n}=await import(`./agent-Cgala63h.js`).then(e=>e.t);return n.list({...e,cwd:t,organization:e.workspace})},json:e=>He(e),next:({result:e,args:t})=>t.server!==void 0||!e.length?[]:L([`An agent's settings, events, and tools: coder agent show <id>`,`Scaffold a new agent in this repo: coder agent init <id>`]),print:(e,{options:t})=>Ue(He(e),t.server!==void 0)}),Ge=F({name:`push`,description:`upload workspace agents to a Coder server`,usage:`Upload one workspace agent, or every agent in .coder/agents when no id is given. The server creates a new immutable version only when its definition, prompt, or files changed.`,access:`write`,approvalPolicy:`deny`,args:{id:x(`the agent (default: every workspace agent)`),...o},cli:{positional:[`id`],examples:[`coder agent push helper # upload helper`]},run:async({options:e,args:[t],cwd:n})=>{let{agents:r}=await import(`./agent-Cgala63h.js`).then(e=>e.t);return r.push(t,{...e,cwd:n,organization:e.workspace})},print:e=>{for(let t of e){H.stdout.write(t.unchanged?`Pushed ${A.bold(t.id)} unchanged (version ${t.version})\n`:`Pushed ${A.bold(t.id)} as version ${t.version}\n`);for(let e of t.apps??[])e.error?H.stderr.write(`${e.error}\n`):e.drift&&H.stderr.write(`${e.name} needs changes on ${e.integration}; open it on the agent's Platforms tab and click Update.\n`)}}});function W(e,t,n,r=A){let i=e?.error?.message??t;return e?.finalMessage||(i?`${r.red(`error:`)} ${i}`:n)}const Ke=1e3;function qe(e,t=A,{truncate:n=!0}={}){let r=e=>e.split(`
3
+ `).map(e=>` ${t.dim(e)}`);return!n||e.length<=Ke?[t.dim(`prompt:`),...r(e)]:[t.dim(`prompt:`),...r(e.slice(0,500).trimEnd()),t.light(` … <${e.length-Ke} chars trimmed> …`),...r(e.slice(-500).trimStart())]}function Je(e,t=A){let n=[];e.access&&n.push([`access`,e.access]),e.cwd&&n.push([`cwd`,e.cwd]);for(let t of e.addDirs??[])n.push([`add-dir`,t]);return n.map(([e,n])=>`${t.dim(e.padEnd(8))} ${n}`)}function Ye(e){return e.createdAt&&e.completedAt?Date.parse(e.completedAt)-Date.parse(e.createdAt):null}function Xe(e,t){if(t)return e.createdAt?`started ${w(R(e.createdAt))} ago`:``;let n=Ye(e);return[e.completedAt?`finished ${w(R(e.completedAt))} ago`:``,n!==null&&n>=0?`took ${w(n)}`:``].filter(Boolean).join(` · `)}function Ze(e,{status:t,tokens:n,tokenModel:r,live:i=!1,style:a=A}){let o=Xe(e,z.includes(e.status)||t===`waiting-approval`),s=e=>a.dim(e.padEnd(8));return[`${s(`task`)} ${a.cyan(e.id)}`,...e.name?[`${s(`name`)} ${e.name}`]:[],`${s(`status`)} ${O(t)}${o?` ${a.dim(`(${o})`)}`:``}`,`${s(`engine`)} ${Se(e)}`,...Je(e,a),...n?[`${s(`tokens`)} ${i?se(n):N(n,r??e.model)}${i?a.dim(` (so far)`):``}`]:[]]}function Qe(e,{tokens:t,tokenModel:n,statusChanged:r=!0,style:i=A}){let a=e=>i.dim(e.padEnd(8)),o=Ye(e);return[...r?[`${a(`status`)} ${O(e.status)}${o!==null&&o>=0?` ${i.dim(`(took ${w(o)})`)}`:``}`]:[],...t?[`${a(`tokens`)} ${N(t,n??e.model)}`]:[]]}function G(e,t=300,{plain:n=!1,style:r=A}={}){if(e.length<=t)return e;let i=`<${e.length-t} more chars>`;return`${e.slice(0,t)} ${n?i:r.dim(i)}`}const K=` `.repeat(8),$e={assistant:`●`,reasoning:`✻`,tool:`→`,"tool-result":` `,usage:`·`,status:`·`,info:`·`,error:`✘`,steer:`⚑`};function et(e,t){let n=/^\x1b\[[0-9;]*m/.exec(t(``))?.[0];return t(n&&e.includes(q)?e.split(q).join(`${q}${n}`):e)}const q=`\x1B[0m`;function J(e,t,n,r,i=r.dim){if(!e)return``;let a=(e.length>t?e.slice(0,t):e).split(`
4
+ `).map(e=>et(e,i));return e.length>t&&(a[a.length-1]+=` ${r.light(`<${e.length-t} more chars>`)}`),a.length>n?[...a.slice(0,n),r.light(`… +${a.length-n} more lines`)].join(`
5
+ `):a.join(`
6
+ `)}var tt=class e{opts;presentation;separated=!1;entryAt=null;lastTool;lastCall=``;lastCallSeq=-1;seq=0;view;style;static async create(t={}){return new e(t,await import(`./view-D-rbQ1Kz.js`).then(e=>e.d))}constructor(e,t){this.opts=e,this.presentation=t,this.view=new t.LogView(e.cwd,{keepAnsi:!0}),this.style=e.style??A}get lastAssistantMessage(){return this.view.lastAssistantMessage}render(e){let t=Date.parse(String(e.at??``));this.entryAt=Number.isFinite(t)?t:null;let n=this.seq++,[r]=this.view.reduce({seq:n,at:t,level:`out`,line:``,entry:e});if(!r)return[];this.separated=r.separated&&r.seq===n;let i=this.style,a=r.sourceKind,o=r.title,s=this.opts.trim??500,c=this.opts.explicitTrim||s===1/0?1/0:6;if(r.kind===`usage`)return this.compose(a,i.dim(o),!1);if(r.kind===`approval`&&r.state){if(r.seq===n&&!r.result){let e=[this.clip(`${o} · ${r.state}`,3,i.light),this.clip(J(r.detail??``,s,c,i),c,i.dim)].filter(Boolean).join(`
7
+ `);return this.compose(a,e,!1)}let e=r.result&&r.result.durationMs>=1e3?` · ${w(r.result.durationMs)}`:``,t=r.seq===n?`${o} · ${r.state}`:`${r.state}${e}`,l=r.result?.detail??r.detail??``;return this.compose(a,this.approval(t,this.presentation.stripCwd(l,this.opts.cwd)),!1)}if(r.kind===`approval`)return this.compose(a,this.approval(o,r.detail??``),!1);if(r.kind===`assistant`)return this.compose(a,o,!0);if(r.kind===`steer`)return this.compose(a,i.yellow(o),!0);if(r.kind===`error`)return this.compose(a,i.red(o),!0);if(r.kind===`reasoning`){let e=Math.round((r.durationMs??0)/1e3),t=e>=1?`thought ${w(e*1e3)} · `:``,n=c===1/0?`${i.dim(t)}${J(o,s,1/0,i)}`:this.clip(`${t}${o.split(`
8
+ `)[0]??``}`,3,i.dim);return this.compose(a,n,!1)}if(r.kind===`tool`&&r.seq===n)return this.lastTool=r.tool,this.lastCall=o,this.lastCallSeq=r.seq,this.compose(a,this.clip(o.replace(/\s*\n\s*/g,` `),2,i.light),!1);if(r.kind===`tool`||r.kind===`tool-result`){let t=r.kind===`tool`&&(e.callId||e.callMessage)&&(r.seq!==this.lastCallSeq||o!==this.lastCall)?this.compose(`tool`,this.clip(o.replace(/\s*\n\s*/g,` `),2,i.light),!1):[];t.length&&(this.lastTool=r.tool,this.lastCall=o,this.lastCallSeq=r.seq);let n=r.result??{ok:r.tone!==`error`,exitCode:r.exitCode,durationMs:r.durationMs??0,detail:o},a=[r.kind===`tool-result`&&e.callId?i.dim(`from ${r.tool||`tool`} (${String(e.callId)})`):r.tool&&r.tool!==this.lastTool?i.dim(`from ${r.tool}`):``,n.ok?``:i.red(n.exitCode===void 0?`failed`:`exit ${n.exitCode}`),n.durationMs>=3e3?i.dim(w(n.durationMs)):``].filter(Boolean),l=J(n.detail,s,c,i),u=[...a.length?[a.join(i.dim(` · `))]:[],...l?[l]:[]];return[...t,...u.length?this.compose(`tool-result`,u.join(`
9
+ `),!1):[]]}return this.compose(a,this.clip(o,3,i.dim),!1)}approval(e,t){let n=this.style,r=this.opts.width?this.opts.width-K.length:1/0,i=`${e}${t?`. ${t}`:``}`;return!t||de(i)<=r?`${n.light(e)}${t?n.dim(`. ${t}`):``}`:[this.clip(e,1,n.light),this.clip(t,2,n.dim)].join(`
10
+ `)}clip(e,t,n){let r=this.opts.trim??500;if(this.opts.explicitTrim||r===1/0)return J(e,r,1/0,this.style,n);let i=this.opts.width;return i?re(e,Math.max(i-K.length,24),t).map(e=>et(e,n)).join(`
11
+ `):n(e)}compose(e,t,n){let r=this.separated?[``]:[],i=$e[e]??(this.presentation.isApproval(e)?`⚑`:`·`),[a=``,...o]=t.split(`
12
+ `);return[...r,`${this.gutter(e)}${this.style.dim(i)} ${a}`,...o.map(e=>n?e:`${K}${e}`)]}gutter(e){let t=` `.repeat(6);return e===`tool-result`||!this.opts.startedAt||this.entryAt===null?t:`${this.style.dim(le(this.entryAt-this.opts.startedAt).padStart(5))} `}};function Y(e,t,n){return{usage:`coder task result ${e} --wait${m(t)}`,blurb:Te,cli:{text:n}}}function X(e,t={}){return L([`Continue on the same task: coder task steer ${e} "<follow-up>"${m(t)}`])}function nt(e){return{finalMessage:e?.finalMessage??null,error:e?.error?.message??null,tokens:e?.tokens??null}}function rt(e,t){let n=ot(e,t).map(({usage:e,blurb:t})=>({usage:e,blurb:t})),{task:r,result:i,steps:a,turns:o}=e;return{taskId:r.id,name:r.name??null,status:e.status,engine:r.engine,model:i?.model??r.model??null,...nt(i),error:i?.error?.message??r.error??null,tokens:i?.tokens??e.liveTokens??null,pendingApprovals:e.pendingApprovals,next:n,...a.length?{steps:a}:{},...t.turns?{turns:o.map(e=>({at:e.at,status:e.status,...nt(e)}))}:{}}}async function it(e,t,n,r){let{task:i,steps:a,result:o,turns:s,pendingApprovals:c}=e,l=A,u=z.includes(i.status),d=Ze(i,{status:e.status,tokens:o?.tokens??e.liveTokens??null,tokenModel:o?.model,live:!o?.tokens&&!!e.liveTokens,style:l});if(i.prompt&&d.push(...qe(i.prompt,l)),c.length){d.push(``,l.dim(`pending approvals:`));for(let t of c)d.push(` ${l.cyan(t.id)} ${t.reason}`,B(t.actions).replace(/^/gm,` `)),H.stdout.write(`${d.join(`
13
+ `)}\n`),d.length=0,r(e,{slot:`approval:${t.id}`})}if(a.length){d.push(``,l.dim(`steps:`));let e=await tt.create({cwd:i.cwd??t,startedAt:Date.parse(i.createdAt??``)||void 0,width:P(),style:l}),n=o?.finalMessage&&String(a.at(-1)?.message??``).trim()===String(o.finalMessage).trim()?a.slice(0,-1):a;for(let t of n)d.push(...e.render(t))}if(d.push(``),n.turns&&s.length)s.forEach((e,t)=>{t&&d.push(``),d.push(l.dim(`Turn ${t+1} of ${s.length}. ${G(String(e.prompt??``))}`)),d.push(String(e.finalMessage||l.dim(`(no final message)`)))});else if(o)d.push(W({...o,error:o.error??void 0},i.error,`(no final message)`,l)),s.length>1&&(H.stdout.write(`${d.join(`
14
+ `)}\n`),d.length=0,r(e,{slot:`turns`}));else if(u){let{lastLog:t}=e;d.push(l.dim(e.stalled?`Result pending. No progress for ${w(e.idleMs??0)}. The task may be stalled.${t?` Last: ${G(t.message??t.kind??``)}`:``}`:`Result pending. The task is still running.`))}else d.push(W(null,i.error,l.dim(`(no result)`),l));d.length&&H.stdout.write(`${d.join(`
15
+ `)}\n`)}const at=F({name:`result`,description:`status + final answer (--wait blocks)`,usage:`Show a task's status and its final answer (result pending while it runs), plus
16
+ any pending approvals. --wait blocks until it finishes, then prints. --tail <n>
17
+ includes the last n progress-log steps (--tail all for the whole transcript).
18
+ Defaults to the most recent task. Shortcut: \`coder result\`.
19
+
20
+ JSON and MCP return a summary and the complete answer, without engine diagnostics
21
+ or raw diffs. Use --tail for progress; answers are never truncated.
22
+
23
+ Run each --wait in its own background shell, one per task. Never wait on several
24
+ tasks in one call, or their approvals and answers never reach you one by one.`,access:`read`,args:{"task-id":x(`the task (default: the most recent)`),wait:v(`block until the task finishes or needs an approval, then print`),turns:v(`every turn's answer (a steered task accretes turns)`),tail:l(`include the last n progress-log steps (default: 0, final result only)`),...o},cli:{positional:[`task-id`],exit:[[0,`The task completed successfully.`],[1,`The task failed or was cancelled.`],[4,`An approval is pending; answer it, then run --wait again.`]],examples:[`coder result <task-id> --wait # block until the task finishes, print the answer`,`coder result <task-id> --turns # every turn's answer for a steered task`]},run:async({options:e,args:[t]})=>{let{tasks:n}=await import(`./task-CyqtCXo3.js`).then(e=>e.t);return await n.result(t,{...e,organization:e.workspace,onWaiting:e=>H.stderr.write(`${A.dim(`[coder] waiting for task ${e} to finish...`)}\n`)})},json:(e,{options:t})=>rt(e,t),next:({result:e,args:t})=>ot(e,t),print:(e,{options:t,cwd:n,next:r})=>it(e,n,t,r),exit:(e,{options:t})=>t.wait?e.task.status===`completed`?0:1:void 0});function ot(e,t){let{task:n}=e,r=m(t),i=(e.pendingApprovals??[]).map(e=>({usage:`coder task approve ${n.id} ${e.id}${r}`,blurb:`(--deny to reject)`,cli:{layout:`inline`,prefix:` `,slot:`approval:${e.id}`}}));return!t.turns&&e.result&&(e.turns?.length??0)>1&&i.push(...L([`Turn ${e.turns.length} of ${e.turns.length}. All answers are in coder task result ${n.id} --turns.`],{layout:`plain`,dim:!0,prefix:``,slot:`turns`}).map(e=>({...e,usage:`coder task result ${n.id} --turns${r}`}))),z.includes(n.status)?t.wait?i:[...i,Y(n.id,t,`Wait in its own background shell, one per task; do not poll: coder task result ${n.id} --wait`),...L([`Follow live: coder task watch ${n.id}${r}`,...e.stalled?[`Check the transcript: coder task result ${n.id} --tail all${r}`]:[]])]:[...i,...X(n.id,t)]}function st(e,t){let n=e.level===`sys`?t.dim(`· ${e.line}`):e.level===`err`?t.light(e.line):e.line;H.stdout.write(`${n}\n`)}async function ct(e,t,n,r){let i=n.trim===void 0?500:n.trim===`none`?1/0:n.trim,a=e.task,o=await tt.create({cwd:a.cwd??t,startedAt:Date.parse(a.createdAt??``)||void 0,trim:i,explicitTrim:n.trim!==void 0,width:P()});if(!n.json){let e=[...Ze(a,{status:a.status}),...z.includes(a.status)?[A.dim(`Watching. Press Ctrl-C to stop.`)]:[],...a.prompt?qe(a.prompt,A,{truncate:!1}):[],``];H.stdout.write(`${e.join(`
25
+ `)}\n`)}let s=null,c=null,l=e=>{let t=o.render(e);t.length&&H.stdout.write(`${t.join(`
26
+ `)}\n`)};for await(let t of e.events){let e=t;if(e.kind===`usage`&&e.tokens&&(s=e.tokens),n.json){let t=e.kind===`steer`?1/0:i,n=e.message?{...e,message:G(e.message,t,{plain:!0})}:e;H.stdout.write(`${JSON.stringify(n)}\n`);continue}e.kind!==`usage`&&(c&&=(l(c),null),e.kind===`assistant`?c=e:l(e))}let{status:u,result:d,task:f}=await e.final();if(n.json)H.stdout.write(`${JSON.stringify({taskId:a.id,status:u,result:d},null,2)}\n`);else{let e=u===`completed`?`(no final message)`:`(task ${u})`,t=Qe(f,{tokens:d?.tokens??s,tokenModel:d?.model,statusChanged:u!==a.status});t.length&&H.stderr.write(`\n${t.join(`
27
+ `)}\n`);let n=W(d,f.error,e),r=c?String(c.message??``):``;H.stdout.write(`\n${n.trim()?n:r}\n`)}H.exit(u===`completed`?0:1)}async function lt(e,t,n){let r=[];for await(let t of e.events)r.push(t);let{task:i}=e,a=n===void 0?``:n===!0?` --server`:` --server ${n}`;return{taskId:i.id,status:i.status,events:r,...z.includes(i.status)?{next:`coder task watch ${i.id} --from ${t+r.length}${a}`}:{}}}async function ut(e,t){let n=await tt.create({cwd:t,trim:500,explicitTrim:!1,width:P()});for(let t of e.events){let e=n.render(t);e.length&&H.stdout.write(`${e.join(`
28
+ `)}\n`)}}const dt=F({name:`watch`,description:`stream a task's live transcript`,usage:`Stream a running task's transcript live (for you/debugging), then print its
29
+ final answer. Replays the last line first so the current step is visible;
30
+ --tail <n> replays the last n lines (--tail all for the whole transcript).
31
+ Blocks until it finishes; exits 0 on success, 1 otherwise. For the answer
32
+ alone, prefer \`coder result\`. Alias: stream.
33
+
34
+ With --from <n>, or as a tool, it returns the log from event n on without
35
+ following, and \`next\`: the command that continues it while the task runs.`,access:`read`,approvalPolicy:`deny`,args:{"task-id":x(`the task (default: the most recent)`),tail:l(`replay the last n log lines first (default: 1)`),trim:b(n(t([ne(`none`),_().check(i(),e())],{error:`expected a positive integer or "none"`})),`budget for tool output and thinking (default: 1200 chars, 12 lines)`,`<n|none>`),from:b(n(_().check(i(),a())),`return the log from event n on instead of following it`,`<n>`),...o},cli:{positional:[`task-id`],examples:[`coder task watch # follow the most recent task to completion`,`coder task watch <task-id> --from 0 --json # the log so far, and the command that continues it`]},async run({options:e,args:[t],cwd:n,tool:r,next:i}){let{tasks:a}=await import(`./task-CyqtCXo3.js`).then(e=>e.t),o=e.from??(r?0:void 0),s=await a.watch(t,{...e,from:o,organization:e.workspace});if(o!==void 0)return lt(s,o,e.server);await ct(s,n,e,i)},next({result:e,args:t}){return e&&e.next?L([`Continue: ${e.next}`]):[]},print:(e,{cwd:t})=>e&&ut(e,t)});function ft(e,{finalMessage:t,error:n}){let r=A,i=e.startedAt===void 0?``:w((e.finishedAt??Date.now())-e.startedAt);H.stdout.write(`${r.bold(e.task.id)} ${O(e.status)}${n?` ${r.red(n)}`:``}${i?` ${r.dim(`took ${i}`)}`:``}\n`),e.credential&&H.stdout.write(`${r.dim(`credential`)} ${e.credential}\n`),t&&H.stdout.write(`\n${r.bold(`Reply`)}\n${t.trim()}\n`)}const pt=F({name:`run`,description:`run a recorded event through an agent, offline or on a server`,usage:`Run a recorded platform event (AgentEvent JSON) through an agent. With --server it goes through your Coder server exactly like a webhook: real app, tokens, runner, and the reply is posted. Without it the engine runs here on the agent's prompt and this checkout, platform tools off, and the reply is printed.`,access:`write`,approvalPolicy:`deny`,args:{agent:x(`the agent id`),file:x(`the event JSON file`),server:g(`act on your Coder server`,`[url]`),workspace:x(`with --server: the workspace to act in (default: the saved one)`,`<slug>`),yes:v(`with --server: connect to a server used for the first time without asking`),wait:v(`with --server: follow the task log here until it finishes, then print the reply`),task:x(`a runner's form: run that server task here`,`<id>`)},cli:{positional:[`agent`,`file`],examples:[`coder agent run helper sample-slack-mention.json # offline: print what the agent would reply`,`coder agent run helper event.json --server # for real, through the server`]},run:async({options:e,args:[t,n],cwd:r,tool:i,next:a})=>{if(e.task)return(await import(`./runner-CKMOh5Q3.js`).then(e=>e.t)).runAssignedTask(e.task,r);let{agents:o}=await import(`./agent-Cgala63h.js`).then(e=>e.t),{remoteAnswer:s}=await import(`./remote-BDMuKaON.js`).then(e=>e.s),c=await o.run(t,n,{...e,cwd:r,organization:e.workspace,...e.json||i?{}:{onLog:e=>st(e,A),onDone:e=>{ft(e,s(e)),a(e)}}});return Array.isArray(c)?c.map(s):c},json:e=>Array.isArray(e)&&e.length===1?e[0]:e,next({result:e,args:t}){if(t.task)return[];let n=e;if(Array.isArray(n))return t.wait?n.flatMap(e=>[`completed`,`failed`,`cancelled`].includes(e.status)?X(e.taskId,t).map(e=>({...e,cli:{...e.cli,hidden:!0}})):[]):[];if(`attempts`in n){let e=n;return[`completed`,`failed`,`cancelled`].includes(e.status)?X(e.task.id,t):[]}return`tasks`in n&&n.tasks.length?L([`Watch it: coder task watch ${n.tasks[0]} --server ${De(t.server)}`]):[]},print(e,{options:t}){let n=e;if(!(t.task||Array.isArray(n))){if(`tasks`in n){if(!n.tasks.length)return void H.stdout.write(`The server accepted the event but no agent matched it.
36
+ `);H.stdout.write(`${A.bold(`Queued on the server`)} as task ${n.tasks.join(`, `)}.\n`);return}n.reply===void 0?n.result!==void 0&&H.stdout.write(`${JSON.stringify(n.result,null,2)}\n`):H.stdout.write(`${n.reply.trim()}\n`)}}}),mt=F({name:`settings`,description:`change an agent's settings on your Coder server`,usage:`Set the model, access, connections or events of an agent in the
37
+ saved workspace, or publish its next version with new instructions or matches.
38
+ Settings you leave out stay as they are.`,access:`write`,approvalPolicy:`ask`,args:{id:x(`the agent`),model:r(),access:x(`read-only or auto, at most its definition`,`<read-only|auto>`),connections:x(`the connections its tasks may use, by id`,`<a,b>`),events:x(`the events it answers on a platform`,`<platform=a,b>`),instructions:x(`its system prompt, published as its next version`,`<text>`),match:x(`start tasks only for event text matching a regex, as event=regex pairs`,`<a=re,b=re>`),...h},globalFlags:{cwd:!1},cli:{positional:[`id`],examples:[`coder agent settings helper --model sonnet # a cheaper model for a simple agent`]},run:async({options:{connections:e,events:t,match:n,...r},args:[i]})=>{let{agents:a}=await import(`./agent-Cgala63h.js`).then(e=>e.t),[o,s]=t?.split(`=`)??[];return a.settings(i,{...r,...e===void 0?{}:{connections:U(e)},...o&&s!==void 0?{events:{[o]:U(s)}}:{},matches:Fe(n)})},print:e=>{let{engine:t,model:n,effort:r}=e.settings??{};H.stdout.write(`Agent ${A.cyan(e.id)} runs on ${[t,n,r].filter(Boolean).join(`/`)||`its defaults`}.\n`)}});function ht(e,t){return Ve(e)?{id:e.id,name:e.name,source:e.builtin?`builtin`:`repo`,...e.dir&&!e.builtin?{dir:V.relative(t,e.dir)}:{},definition:e.definition,...e.usage?{usage:e.usage}:{}}:{id:e.id,name:e.name,source:e.source,definition:e.definition,...e.settings?{usage:e.settings}:{},...e.installations?{installations:e.installations}:{}}}function gt(e){let t=A,{definition:n,usage:r}=e,i=`dir`in e?e.dir:void 0,a=[[`name`,e.name],[`source`,i?`${e.source} (${i})`:e.source],[`description`,n.description],[`access`,r?.access===`read-only`||n.access===`read-only`?`Read-only`:`Auto`],[`model`,r?.engine||r?.model?[r.engine,r.model,r.effort].filter(Boolean).join(`/`):n.model]],o=Math.max(...a.map(([e])=>e.length))+2;for(let[e,n]of a)n&&H.stdout.write(`${t.dim(e.padEnd(o))}${n}\n`);let s=Object.entries(n.integrations).map(([e,t])=>{let n=r?.integrations?.[e],i=Array.isArray(t.events)?t.events:Object.keys(t.events??{});return{id:e,events:(n?.allowedEvents?i.filter(e=>n.allowedEvents.includes(e)):i).join(`, `)||`-`}});H.stdout.write(`\n${E([{header:`integration`,value:e=>e.id,paint:e=>t.cyan(e)},{header:`events`,value:e=>e.events}],s,{style:t,border:!0})}`);let c=`installations`in e?e.installations??[]:[];c.length&&H.stdout.write(`\n${E([{header:`integration`,value:e=>e.integration,paint:e=>t.cyan(e)},{header:`account`,value:e=>e.account},{header:`app`,value:e=>e.app}],c,{style:t,border:!0})}`)}const _t=F({name:`show`,description:`one agent in full: settings, integrations, events, tools, installations`,usage:[`Describe one agent as it will run here, or its active version on a server.`,`It lists its settings, access and per-integration events, and on a server its installations.`].join(` `),access:`read`,args:{id:x(`the agent`),...o},cli:{positional:[`id`],examples:[`coder agent show coder # what the built-in agent listens to and may do`]},run:async({options:e,args:[t],cwd:n})=>{let{agents:r}=await import(`./agent-Cgala63h.js`).then(e=>e.t);return r.show(t,{...e,cwd:n,organization:e.workspace})},json:(e,{cwd:t})=>ht(e,t),print:(e,{cwd:t})=>gt(ht(e,t))});function vt(e,t){let n=Array.isArray(e.totals)?e.totals.map(e=>({group:t??``,...e})):Object.entries(e.totals).flatMap(([e,t])=>t.map(t=>({group:e,...t})));if(!n.length)return void H.stdout.write(`${A.dim(`No usage in this period.`)}\n`);H.stdout.write(`${E([{header:`by`,value:e=>e.group},{header:`key`,value:e=>e.key,paint:e=>A.cyan(e)},{header:`tasks`,value:e=>String(e.tasks)},{header:`runner ms`,value:e=>String(e.runnerMs)},{header:`tokens`,value:e=>e.tokens===void 0?``:JSON.stringify(e.tokens)}],n,A)}\n`)}function yt(e){if(/^\d+$/.test(e))return Number(e);let t=/^(\d+)([dh])$/.exec(e);if(!t)throw new C(`invalid-option`,`Invalid --since value.`,{hint:`Use 7d, 24h, or milliseconds since epoch`});return Date.now()-Number(t[1])*(t[2]===`d`?864e5:36e5)}const bt=F({name:`usage`,description:`aggregate usage by agent, installation, or engine`,access:`read`,args:{since:x(`period such as 7d or 24h, or milliseconds since epoch`,`<period|ms>`),by:x(`agent, installation, or engine`,`<group>`),...o},run:async({options:e,cwd:t})=>{let{agents:n}=await import(`./agent-Cgala63h.js`).then(e=>e.t);return n.usage({...e,cwd:t,organization:e.workspace,since:yt(e.since??`7d`)})},print:(e,{options:t})=>vt(e,t.by)}),xt=I({name:`agent`,description:`define and run agents`,usage:`Define and run agents from the CLI, the dashboard, or on GitHub, Slack and other platforms.`,commands:[We,_t,mt,Be,Ge,pt,bt],namespaces:[Pe],aliases:{ls:`list`}}),St=e=>{throw e instanceof C&&e.code===`login-failed`?new C(`invalid-option`,e.message,e.hint?{hint:e.hint}:{}):e},Ct=F({name:`login`,description:`sign in through the browser`,usage:`Sign in with Wular Auth in your browser. The CLI keeps the tokens in ~/.coder/session.json, and commands that talk to a server then act as you.`,access:`write`,approvalPolicy:`deny`,args:{...o,device:v(`show a code to approve on another device; the default without a local browser`)},globalFlags:{cwd:!1},cli:{env:[[`CODER_SERVER`,`the server to use instead of https://coder.wular.ai`]],examples:[`coder auth login # sign in to the hosted service`,`coder auth login --server https://agents.example.com # sign in to a self-hosted server`]},run:async({options:e,tool:t})=>{let{hasBrowser:n,sessions:r}=await import(`./sign-in-Dr6sU7vz.js`).then(e=>e.n),i=t?H.stderr:H.stdout;return r.login({server:e.server,yes:e.yes,device:e.device||!n(),open:e=>{i.write(`Opening your browser to sign in. If it does not open, visit\n${A.light(e)}\n`),pe(e)},onCode:(e,t)=>i.write(`Confirm this code in your browser: ${A.bold(e)}\n${A.light(t)}\n`),organization:e.workspace,...ge()?{chooseOrganization:async e=>{let[t]=await fe({title:`Workspace`,hint:`Commands for this server use this workspace by default.`,options:e.map(e=>({value:e.slug,label:e.name,hint:e.slug}))});return t}}:{}}).catch(St)},json:e=>({server:e.server,user:e.user,organization:e.organization}),print:e=>{let t=A;H.stdout.write(`${t.green(`✔`)} Signed in to ${t.bold(e.server)} as ${e.user.email}${e.organization?` ${t.dim(`· ${e.organization.name}`)}`:``}\n`)}}),wt=F({name:`logout`,description:`sign out and forget the saved session`,usage:`Revoke the saved session for that server at Wular Auth and forget its tokens.`,access:`write`,approvalPolicy:`deny`,args:{server:g(`sign out of this Coder server (default: the hosted one)`,`[url]`),yes:v(`connect to a server used for the first time without asking`)},globalFlags:{cwd:!1},run:async({options:e})=>{let{sessions:t}=await import(`./sign-in-Dr6sU7vz.js`).then(e=>e.n);return t.logout(e).catch(St)},print:e=>H.stdout.write(`Signed out of ${e.server}.\n`)}),Tt=F({name:`status`,description:`show where you are signed in`,usage:`List saved sessions with their server, user, and workspace.`,access:`read`,approvalPolicy:`deny`,globalFlags:{cwd:!1},cli:{env:[[`CODER_SERVER`,`the server to use instead of https://coder.wular.ai`]]},run:async()=>{let{sessions:e}=await import(`./sign-in-Dr6sU7vz.js`).then(e=>e.n);return e.status()},next:({result:e})=>Object.keys(e).length?[]:L([`Sign in: coder auth login`]),print:e=>{let t=A,n=Object.entries(e);if(!n.length)return void H.stdout.write(`${t.dim(`Not signed in`)}\n`);H.stdout.write(`${E([{header:`server`,value:([e])=>e,paint:e=>t.cyan(e)},{header:`user`,value:([,e])=>e.user.email},{header:`workspace`,value:([,e])=>e.organization?`${e.organization.name} (${e.organization.slug})`:`-`}],n,t)}\n`)}}),Et=I({name:`auth`,description:`sign in to Coder and manage saved server sessions`,commands:[Ct,wt,Tt]}),Dt=e=>new C(`invalid-option`,`Usage: ${e}`);function Ot(e){try{return JSON.parse(e)}catch{return e.includes(`,`)?e.split(`,`).map(e=>e.trim()).filter(Boolean):e}}const kt=F({name:`config`,description:`read or write config`,usage:`Read or write configuration. \`list\` prints the effective config; get/set/unset
39
+ target a dotted key (e.g. chain); migrate rewrites the file at this Coder's config
40
+ version. Writes go to ~/.coder/config.json.`,access:`write`,approvalPolicy:`deny`,args:{action:x(`list, get, set, unset or migrate`),key:x(`a dotted key, such as chain or reviewModel`),value:s(`with set: the value; JSON, or a comma list`),workspace:v(`target <repo>/.coder/config.json instead of the user file`)},cli:{positional:[`action`,`key`,`value`],examples:[`coder config list # print the effective config`,`coder config set chain codex/sol,claude/opus # the default model, then its fallbacks`,`coder config get reviewModel # read one value`,`coder config migrate --workspace # rewrite the repo file at config version 1`]},async run({options:e,args:[t,n,...r],cwd:i}){if(!t||t===`help`)return;let{config:a,migrateConfigFile:o,resolveUserConfigFile:s}=await import(`./config-_32PHl9g.js`).then(e=>e.y);if(t===`migrate`)return{action:t,...o(i,e.workspace)};if(t===`list`)return{action:t,config:a.get(void 0,{cwd:i}),file:s()};if(t===`get`){if(!n)throw Dt(`coder config get <key> (e.g. chain, reviewModel)`);return{action:t,value:a.get(n,{cwd:i})}}if(t!==`set`&&t!==`unset`)throw Dt(`coder config <list|get|set|unset|migrate> [<key> [value]] [--workspace]`);if(!n||t===`set`&&r.length===0)throw Dt(`coder config ${t} <key>${t===`set`?` <value>`:``}`);return{action:t,set:a.set(n,Ot(r.join(` `)),{cwd:i,workspace:e.workspace,unset:t===`unset`})}},json(e){let t=e;return t.action===`list`?t.config:t.action===`get`?t.value??null:t.action===`migrate`?{file:t.file,version:t.version,notes:t.notes}:t.set},print(e){if(!e)return void H.stdout.write(ve(kt));if(e.action===`list`)return At(e.config,e.file);if(e.action===`get`)return jt(e.value);if(e.action===`migrate`)return void H.stdout.write([...e.notes,e.version===1?`${e.file} is already config version 1.`:`Rewrote ${e.file} from config version ${e.version} to 1.`].join(`
41
+ `)+`
42
+ `);Mt(e.set)}});function At(e,t){let n=A;H.stdout.write([`${n.dim(`chain`)} ${e.chain.join(` -> `)}`,`${n.dim(`review`)} ${e.reviewModel}`,`${n.dim(`network`)} hosts=[${e.network.allowedHosts.join(`, `)}]`,`${n.dim(`file`)} ${t}`].join(`
43
+ `)+`
44
+ `)}function jt(e){if(e===null||typeof e==`object`&&e!==void 0)return D(e);H.stdout.write(`${e===void 0?`(unset)`:String(e)}\n`)}function Mt(e){let t=A,n=e.unset?`unset ${t.cyan(e.key)}`:`${t.cyan(e.key)} = ${JSON.stringify(e.value)}`;H.stdout.write(`${n} ${t.dim(`(${e.file})`)}\n`)}async function Nt(e){let{openUrl:t}=await import(`./prompt-CpwbsEWM.js`).then(e=>e.s);H.stderr.write(`Sign in at ${j.cyan(e)}\n`),t(e)&&H.stderr.write(j.dim(`Opened it in the browser. Waiting...
45
+ `))}async function Pt(){let{askSecret:e}=await import(`./prompt-CpwbsEWM.js`).then(e=>e.s);return e(`Key`)}function Ft(e){return e.provider===`env`?`Task secret ${e.env}`:e.provider===`mcp`?`MCP server ${e.url??e.command}`:`${e.provider} account${e.account?` ${e.account}`:``}`}async function It(){throw new C(`invalid-option`,`A tool cannot read a key from stdin or a prompt.`,{hint:`Keep the key in an environment variable and pass --env, or run it in a terminal`})}const Lt=F({name:`add`,description:`connect a platform account or an MCP server`,usage:["Connect a platform account by its name (OAuth in the browser), or an MCP server at --url or started by the command after `--`.",`Platform accounts are personal and take no scope flag; MCP servers default to workspace scope, with --personal for personal scope.`,`A remote MCP server is checked for OAuth, open access or a key; a needed key is read from stdin or a prompt.`,`With --key, the key goes in --header (default Authorization) or --env.`,`Signing in needs --server.`].join(` `),access:`write`,approvalPolicy:{handoff:{page:`/settings/connections`,label:`Add the connection`,action:`add`,args:[`name`,`url`,`access`,`tools`,`personal`]}},args:{name:f().check(S(`the connection name; a platform name connects that account`),p(e=>![`coder`,`task`,`conversation`,`coder-approval`].includes(e),`The names coder, task, conversation and coder-approval are reserved for Coder MCP servers.`),p(e=>!/-user$/i.test(e.trim()),`Names ending in -user are kept for members' own connections`)),command:s("a stdio MCP server to start; on the command line, the words after `--`"),env:x(`the task-secret variable, or where a stdio server reads its key`,`<NAME>`),url:x(`a remote MCP server (streamable HTTP by default)`),header:x(`the header a remote server reads its key from (default: Authorization)`,`<NAME>`),key:v(`read a key from stdin or a prompt, never from a flag value`),auth:x(`override MCP authentication (default: detected for --url, none for a command)`,`<oauth|key|none>`),access:x(`read-only keeps only read-only tools (default: auto, which follows the task)`,`<read-only|auto>`),tools:x(`tool allowlist; a read-only stdio server needs one`,`<a,b>`),credential:x(`the credential a task secret reads`,`<id>`),personal:v(`a personal connection instead of the workspace's`),...o},cli:{positional:[`name`],examples:[`pbpaste | coder connection add docs --key --env DOCS_TOKEN -- npx -y docs-mcp # a stdio server with its key from stdin`,`coder connection add github --server # a member's GitHub account on the Coder server`]},run:async({options:e,args:[t],cwd:n,tool:r})=>{let{connection:i}=await import(`./connection-CgA5_NJ7.js`).then(e=>e.n),a=r?It:Pt;return i.add(t,{...e,cwd:n,command:e.command??[],auth:e.auth,access:e.access,tools:e.tools?.split(`,`).map(e=>e.trim()).filter(Boolean),key:e.key?await a():void 0,askKey:a,onAuthorize:r?void 0:Nt})},print:e=>H.stdout.write(`Connected ${A.bold(e.id)}, ${Ft(e)}.\n`)}),Rt=e=>{let t=e.indexOf(`--`);return Lt(t===-1?e:[...e.slice(0,t),...e.slice(t+1).flatMap(e=>[`--command`,e])])};Object.defineProperty(Rt,"name",{value:Lt.name,writable:!0,enumerable:!0});const zt=Object.assign(Rt,Lt),Bt=F({name:`approve`,description:`approve a repository MCP server on this machine`,usage:`Approve an MCP server this repository or one of its agents declares, on this machine. A changed endpoint or command needs approval again.`,access:`write`,approvalPolicy:`deny`,args:{name:f().check(S(`the MCP server`)),agent:x(`select the agent when names have different definitions`,`<id>`)},cli:{positional:[`name`]},run:async({cwd:e,args:[t],options:n})=>{let{connection:r}=await import(`./connection-CgA5_NJ7.js`).then(e=>e.n);return r.approve(t,{cwd:e,agent:n.agent})},print:({name:e})=>H.stdout.write(`Approved MCP server "${e}" on this machine.\n`)});function Vt({connections:e,declared:t=[]}){let n=A;H.stdout.write(e.length?E([{header:`name`,value:e=>e.id,paint:e=>n.cyan(e)},{header:`connects`,value:e=>Ft(e),paint:e=>n.light(e)},{header:`access`,value:e=>e.access===`read-only`?`Read-only`:`Auto`},{header:`scope`,value:e=>e.scope},{header:`owner`,value:e=>e.owner?.name??e.owner?.id??``},{header:`status`,value:e=>e.status}],e,n):`${n.dim(`No connections.`)}\n`),t.length&&H.stdout.write(`\n${n.bold(`Declared in this repository`)}\n${E([{header:`name`,value:e=>e.name,paint:e=>n.cyan(e)},{header:`in`,value:e=>e.source},{header:`runs`,value:e=>e.target,paint:e=>n.light(e)},{header:`here`,value:e=>e.approved?`approved`:`needs approval`}],t,n)}`)}const Ht=F({name:`list`,description:`list connections and the MCP servers this repository declares`,usage:[`Every workspace connection and every member's own, with its status.`,`In a task, one it is not granted is disabled, and one it has names its tool search server.`,`On this machine, also the MCP servers this repository and its agents declare, with whether each is approved here.`].join(` `),access:`read`,args:o,run:async({options:e,cwd:t})=>{let{connection:n}=await import(`./connection-CgA5_NJ7.js`).then(e=>e.n);return n.list({...e,cwd:t})},next:({result:{connections:e,declared:t=[]}})=>L([...t.filter(e=>!e.approved).map(e=>`Approve: coder connection approve ${e.name}`),...e.filter(e=>e.status===`needs-auth`&&!e.agent&&(!e.owner||e.asker)).map(e=>`Reconnect: coder connection reconnect ${e.id}${e.owner?` --personal`:``}`),...e.length?[]:[`Add one: coder connection add <name> --url <url>`]]),print:Vt}),Ut=F({name:`reconnect`,description:`give a connection a new key, or sign in again`,usage:[`Give a key connection its new key, read from stdin or a prompt, or sign in to an OAuth connection again in the browser.`,`The credential a task secret reads gets the new value, so every connection reading it rotates.`,`With --personal, the asking member's own connection of that name.`].join(` `),access:`write`,approvalPolicy:{handoff:{page:`/settings/connections`,label:`Reconnect the connection`,action:`reconnect`,args:[`name`]}},args:{name:f().check(S(`the connection`)),personal:v(`the asking member's own connection instead of the workspace's`),...o},cli:{positional:[`name`],examples:[`pbpaste | coder connection reconnect groq # the new key from the clipboard`]},run:async({options:e,args:[t],cwd:n,tool:r})=>{let{connection:i}=await import(`./connection-CgA5_NJ7.js`).then(e=>e.n);return i.reconnect(t,{...e,cwd:n,askKey:r?It:Pt,onAuthorize:r?void 0:Nt})},print:e=>H.stdout.write(`Reconnected ${A.bold(e.id)}.\n`)}),Wt=F({name:`rm`,description:`remove a connection`,usage:[`Remove a connection. The credential a task secret reads stays.`,`With --personal, the asking member's own connection of that name.`].join(` `),access:`write`,approvalPolicy:{handoff:{page:`/settings/connections`,label:`Remove the connection`,action:`delete`,args:[`name`],button:`Remove`}},args:{name:f().check(S(`the connection`)),personal:v(`the asking member's own connection instead of the workspace's`),...o},cli:{positional:[`name`]},run:async({options:e,args:[t],cwd:n})=>{let{connection:r}=await import(`./connection-CgA5_NJ7.js`).then(e=>e.n);return r.remove(t,{...e,cwd:n})},print:e=>H.stdout.write(`Removed ${A.bold(e.id)}.\n`)}),Gt=I({name:`connection`,description:`platform accounts and MCP servers tasks use`,usage:[`Connections give tasks access to a service through a platform account or an MCP server.`,"They live in ~/.coder, or on the Coder server with --server, and tasks may use them unless an agent or `coder task run --connections` narrows the set."].join(` `),commands:[zt,Ht,Wt,Ut,Bt],aliases:{ls:`list`,remove:`rm`}}),Kt=F({name:`add`,description:`store an API key or subscription for one variable`,usage:`Store the key of one environment variable, encrypted on the server, as your own or with --workspace for every member. A key saved for that variable in the same scope is replaced. Where the server has subscription sign-in on, CLAUDE_CODE_OAUTH_TOKEN takes your own claude setup-token output.`,access:`write`,approvalPolicy:{handoff:{page:`/settings/credentials`,label:`Add the credential`,action:`add`,args:[`env`]}},args:{env:x(`the variable tasks read the key as (reads that variable by default)`,`<NAME>`),value:x(`literal values land in shell history and are visible to other processes; use - for stdin or prefer environment variables`,`<secret|->`),workspace:v(`a workspace key; owners and admins only`),"no-check":v(`skip the provider key check`),...h},globalFlags:{cwd:!1},cli:{examples:[`ANTHROPIC_API_KEY=sk-... coder credentials add --env ANTHROPIC_API_KEY # your own Claude key, read from the environment`,`OPENAI_API_KEY=sk-... coder credentials add --env OPENAI_API_KEY --workspace # a workspace key every member's tasks can use`,`pbpaste | coder credentials add --env OPENROUTER_API_KEY --value - # a key for custom models, value from stdin`]},run:async({options:e,tool:t})=>{let{addCredential:n}=await import(`./remote-CY-qYX2C.js`).then(e=>e.a);if(t&&e.value===`-`)throw new C(`invalid-option`,`A tool cannot read the key from stdin.`,{hint:`Set the variable in the environment, or run it in a terminal`});return n({...e,noCheck:e[`no-check`]})},print:(e,{options:t})=>H.stdout.write(`${e.replaced?`Replaced`:`Added`} ${t.workspace?`workspace`:`personal`} ${A.bold(e.name)}.\n`)});function qt(e){if(!e.length)return void H.stdout.write(`${A.dim(`No engine credentials.`)}\n`);H.stdout.write(`${E([{header:`variable`,value:e=>e.subscription?`${e.name} subscription`:e.name,paint:e=>A.cyan(e)},{header:`scope`,value:e=>e.scope},{header:`value`,value:e=>e.masked},{header:`account`,value:e=>[e.account?.email,e.account?.plan].filter(Boolean).join(` `)}],e,A)}\n`)}const Jt=F({name:`list`,description:`list your keys and the workspace keys, by variable`,access:`read`,args:h,globalFlags:{cwd:!1},run:async({options:e})=>{let{credentials:t}=await import(`./remote-CY-qYX2C.js`).then(e=>e.a);return t.list(e)},print:qt});function Yt(e){e.url&&H.stderr.write(`Open ${A.cyan(e.url)}\n`),e.code&&H.stderr.write(`Enter the code ${A.bold(e.code)}\n`)}async function Xt(){let e=(await import(`node:readline/promises`)).createInterface({input:H.stdin,output:H.stderr}),t=(await e.question(`Paste the code from the sign-in page `)).trim();return e.close(),t}function Zt(e){if(e.state===`failed`)return void H.stderr.write(`${j.red(e.error??`Sign-in failed.`)}\n`);H.stdout.write(`Signed in. Your ${A.bold(e.engine)} subscription is saved.\n`)}const Qt=F({name:`login`,description:`sign in to a claude or codex subscription on the server`,usage:`Runs the official claude or codex sign-in on the server's runner, prints the sign-in link or device code, and waits. Claude asks you to paste the code the sign-in page shows. The result replaces your subscription for that engine. Needs CLAUDE_SUBSCRIPTIONS=1 or CODEX_SUBSCRIPTIONS=1 on the server.`,access:`write`,approvalPolicy:{handoff:{page:`/settings/credentials`,label:`Connect the engine`,action:`engine`,args:[`engine`]}},args:{engine:n(f()).check(S(`claude or codex`)),...h},globalFlags:{cwd:!1},cli:{positional:[`engine`]},mcp:!1,run:async({options:e,args:[t]})=>{let{loginCredential:n}=await import(`./remote-CY-qYX2C.js`).then(e=>e.a);return n(t,{...e,onStart:e=>H.once(`SIGINT`,()=>void e().finally(()=>H.exit(130))),onOpen:Yt,code:Xt})},next:({result:e})=>e.state===`failed`?L([`Try again`],{stream:`stderr`}):[],print:Zt,exit:(e,{options:t})=>!t.json&&e.state===`failed`?1:void 0}),$t=F({name:`remove`,description:`remove the key of one variable`,usage:`Remove the key of one environment variable.`,access:`write`,approvalPolicy:{handoff:{page:`/settings/credentials`,label:`Remove the credential`,action:`delete`,args:[`NAME`],button:`Remove`}},args:{NAME:f().check(S(`the variable`)),workspace:v(`the workspace key of that variable`),...h},globalFlags:{cwd:!1},cli:{positional:[`NAME`]},async run({options:e,args:[t]}){let{credentials:n}=await import(`./remote-CY-qYX2C.js`).then(e=>e.a);return n.remove(t,e)},print:(e,{args:[t]})=>H.stdout.write(`Removed ${A.bold(t)}.\n`)}),en=I({name:`credentials`,description:`engine credentials: subscriptions and API keys`,usage:`Manage subscriptions and API keys, one per variable in each scope. Your personal ones are yours alone; workspace ones serve every member, and only owners and admins change them. A task runs on its requester's own, else the workspace's.`,commands:[Jt,Kt,Qt,$t]}),tn=F({name:`docs`,description:`print bundled documentation (for agents to read)`,usage:"Print bundled documentation. With no topic, list the available topics; with a\ntopic, print that doc's raw markdown to stdout (unstyled, for an agent to\nconsume). Topics with sub-pages list them as `<topic>/<page>` (also accepted as\n`<topic>-<page>`). `coder docs skill` prints the host skill so an engine can\nload it once per session (--claude for the Claude Code flavor).",access:`read`,approvalPolicy:`deny`,args:{topic:x(`the doc to print (default: list the topics)`),claude:v(`with the skill topic: print the Claude Code flavor`)},globalFlags:{cwd:!1},cli:{positional:[`topic`],examples:[`coder docs # list the available topics`,`coder docs flows # print the Flows doc`,`coder docs review # print the Review doc`]},run:async({options:e,args:[t]})=>{let{docsCore:n}=await import(`./docs-CxklYa3P.js`).then(e=>e.r);return n(t,e)},next:({result:e})=>`content`in e?[]:L([`Read a topic: coder docs <topic>`]),print:e=>H.stdout.write(`content`in e?e.content.endsWith(`
46
+ `)?e.content:`${e.content}\n`:nn(e.topics))});function nn(e){let t=A,n=e=>e.includes(`/`)?` ${e}`:e;return E([{header:`topic`,value:e=>n(e.name),paint:e=>t.cyan(e)},{header:`about`,value:e=>e.description,paint:e=>t.light(e)}],e,t)}const rn=e=>e===1?``:`s`,an=F({name:`archive`,description:`hide a run (or all stopped) from the list`,usage:`Archive a flow run so it drops out of the default list (see it again with
47
+ \`coder flow list --archived [--limit N]\`). Pass --all-stopped to archive every
48
+ finished run. A running run must be stopped first.`,access:`write`,approvalPolicy:`deny`,args:{"run-id":x(`the run to archive`),"all-stopped":v(`archive every stopped (finished) run`)},cli:{positional:[`run-id`]},run:async({options:e,args:[t]})=>{let{archiveRuns:n}=await import(`./executor-DBW7R7Tf.js`).then(e=>e.A);return n(t,{allStopped:e[`all-stopped`]})},print(e){if(!(`count`in e))return void H.stdout.write(`Archived run ${A.cyan(e.runId)}.\n`);H.stdout.write(e.count?`Archived ${e.count} stopped run${rn(e.count)}.\n`:`${A.dim(`No stopped runs to archive.`)}\n`)}}),on=F({name:`delete`,description:`delete a run's record (or all archived)`,usage:`Delete a flow run's record from disk (its journal, events, and logs). This is
49
+ permanent; the run's tasks are ordinary tasks and are not touched. Pass
50
+ --all-archived to delete every archived run at once. A running run must be
51
+ stopped first.`,access:`write`,approvalPolicy:`deny`,args:{"run-id":x(`the run to delete`),"all-archived":v(`delete every archived run`)},cli:{positional:[`run-id`]},run:async({options:e,args:[t]})=>{let{deleteRuns:n}=await import(`./executor-DBW7R7Tf.js`).then(e=>e.A);return n(t,{allArchived:e[`all-archived`]})},print(e){if(!(`count`in e))return void H.stdout.write(`Deleted run ${A.cyan(e.runId)}.\n`);H.stdout.write(e.count?`Deleted ${e.count} archived run${rn(e.count)}.\n`:`${A.dim(`No archived runs to delete.`)}\n`)}}),sn=F({name:`discover`,description:`list flows runnable here (workspace + global)`,usage:`List every flow discoverable from the current directory: workspace flows in
52
+ .coder/flows/ (walking up to the repo root) and global flows in ~/.coder/flows/.`,access:`read`,approvalPolicy:`deny`,run:async({cwd:e})=>{let{discoverFlows:t}=await import(`./discover-BfYHHJN_.js`).then(e=>e.r);return t(e)},next:({result:e})=>L(e.length?[`Run one: coder flow run <name>`,`Recent runs: coder flow list`]:[`Authoring guide: coder docs flows`]),print:(e,{cwd:t})=>cn(e,t)});function cn(e,t){if(!e.length){H.stdout.write(`No flows found in .coder/flows/ (workspace) or ~/.coder/flows/ (global).
53
+ `);return}let n=A;H.stdout.write(E([{header:`name`,value:e=>e.name,paint:e=>n.cyan(e)},{header:`scope`,value:e=>e.scope,paint:e=>n.light(e)},{header:`path`,value:e=>e.scope===`workspace`?V.relative(t,e.path)||e.path:e.path.replace(ke.homedir(),`~`),paint:e=>n.light(e)}],e,n))}const ln=F({name:`watch`,description:`watch a run live (replay + follow)`,usage:`Watch a flow run live: replay its progress lines from the start, then keep
54
+ following while it runs (Ctrl-C detaches; it keeps running). Blocks until it
55
+ finishes; exits 0 on success, 1 otherwise. Defaults to the most recent run.
56
+ For the result alone, prefer \`coder flow result\`. Alias: stream.
57
+
58
+ With --from <n>, or as a tool, it returns the events from event n on without
59
+ following, and \`next\`: the command that continues them while the run goes on.`,access:`read`,approvalPolicy:`deny`,args:{"run-id":x(`the run (default: the most recent)`),tail:l(`replay only the last n events first (default: all)`),from:b(n(_().check(i(),a())),`return the events from event n on instead of following them`,`<n>`)},cli:{positional:[`run-id`],examples:[`coder flow watch # follow the most recent run to completion`,`coder flow watch <run-id> --from 0 --json # the events so far, and the command that continues them`]},async run({options:e,args:[t],tool:n,next:r}){let{watchRun:i}=await import(`./executor-DBW7R7Tf.js`).then(e=>e.A),a=e.from??(n?0:void 0),o=i(t,{tail:e.tail,from:a});if(a===void 0)return Cn(o,{json:e.json,stream:!0},r);let s=[];for await(let e of o.events)s.push(e);let{runId:c,status:l}=o.record;return{runId:c,status:l,events:s,...l===`running`?{next:`coder flow watch ${c} --from ${a+s.length}`}:{}}},next:({result:e})=>Dn(e),print(e){let t=new xn;for(let n of e.events)t.emit(n);t.done()}}),un=[`⣾`,`⣽`,`⣻`,`⢿`,`⡿`,`⣟`,`⣯`,`⣷`];function Z(e,t=!1){let n=A;return t?k(`[${fn(e)}]`,10):e===`completed`?n.bold(n.green(`✔`)):e===`failed`||e===`cancelled`||e===`stopped`?n.bold(n.red(`✘`)):e===`running`?n.bold(n.cyan(`●`)):n.dim(`○`)}function dn(){return k(`[start]`,10)}function fn(e){return e===`completed`?`done`:e===`cancelled`?`failed`:e}function pn(e,t){return e??t.replace(/\s+/g,` `).trim().slice(0,60)}function Q(e,t,n,r,i,a){let o=A,s=k(t??n,32);return[`${e} ${a?o.bold(s):s}`,o.dim(k(n,24)),o.light(k(i??``,20)),r?o.light(`${ce(r.total)} tok`):``].join(` `).trimEnd()}function mn(e,t=!1){let n=A;return`${Z(e.ok?`completed`:`failed`,t)} ${n.dim(`gate`)} ${n.light(e.cmd)}${e.ok?``:n.dim(` · exit ${e.code}`)}`}function hn(e,t,n){let r=A,i=n!==void 0&&n>=1e3?r.dim(` · ${w(n)}`):``;return`${t} ${r.dim(`gate`)} ${r.light(e)}${i}`}function gn(e,t=!1){return A.dim(`${`│ `.repeat(e)}${t?`└─`:`├─`}`)}function _n(e){return A.dim(`${`│ `.repeat(e)}│ `)}function vn(e){return`${` `.repeat(e.depth)}${e.log?`${k(`[log]`,10)} `:``}${e.body}`}function yn(e,t,n=!1){return n?vn(e):`${e.log?_n(e.depth):gn(e.depth,t)} ${e.body}`}function bn(e){return A.dim(`${`│ `.repeat(Math.max(0,e))}│`)}var xn=class{stream;names=new Map;active=new Map;activeGates=new Map;pending;previews=new Map;tails=new Map;previewWatchers=new Map;frame=0;hasCommitted=!1;timer;tty;region;constructor(e=H.stdout){this.stream=e,this.tty=!!e.isTTY,this.region=new ie(e)}emit(e){let t=A;switch(e.kind){case`task-start`:{let t={name:pn(e.name,e.prompt),engine:e.engine,depth:e.depth??0};if(this.names.set(e.taskId,t),!this.tty){this.final(t.depth,Q(dn(),t.name,e.taskId,null,t.engine));return}this.active.set(e.taskId,t),this.previewWatchers.get(e.taskId)?.close(),this.previewWatchers.set(e.taskId,Ee(be(H.cwd(),e.taskId),t=>{t&&t!==`log.jsonl`||(this.refreshPreviews(e.taskId),this.repaint())})),this.refreshPreviews(e.taskId),this.spin(!0),this.repaint();return}case`task-end`:{this.active.delete(e.taskId),this.previews.delete(e.taskId),this.tails.delete(e.taskId),this.previewWatchers.get(e.taskId)?.close(),this.previewWatchers.delete(e.taskId),this.idle();let t=this.names.get(e.taskId);this.final(t?.depth??0,Q(Z(e.status,!this.tty),t?.name??null,e.taskId,e.tokens,t?.engine));return}case`gate-start`:{let t={cmd:e.cmd,depth:e.depth??0,startedAt:Date.now()};if(!this.tty){this.final(t.depth,hn(t.cmd,dn()));return}this.activeGates.set(e.gateId,t),this.spin(!0),this.repaint();return}case`gate`:e.gateId&&this.activeGates.delete(e.gateId),this.idle(),this.final(e.depth??0,mn(e,!this.tty));return;case`log`:for(let n of e.message.split(`
60
+ `))this.final(e.depth??0,t.light(n),!0);return;case`flow-start`:this.final(e.depth-1,t.bold(`flow ${e.name}`));return;case`replay`:this.final(0,t.dim(`replayed ${e.count} steps from journal`),!0)}}done(){this.spin(!1);for(let e of this.previewWatchers.values())e.close();this.previewWatchers.clear(),this.flush(0),this.tty&&this.repaint(),this.region.done()}flush(e){this.pending&&=(this.region.commit(`${yn(this.pending,e<this.pending.depth,!this.tty)}\n`),this.hasCommitted=!0,void 0)}final(e,t,n=!1){if(!this.tty){this.region.commit(`${vn({depth:e,body:t,log:n})}\n`),this.hasCommitted=!0;return}this.flush(e),this.pending={depth:e,body:t,log:n},this.tty&&this.repaint()}repaint(){let e=[],t=[];if(this.pending){let n=yn(this.pending,!1);e.push(n),t.push(n)}let n=this.timer?A.bold(A.cyan(un[this.frame%un.length])):Z(`running`);for(let[r,i]of this.active){let a=`${gn(i.depth??0)} ${Q(n,i.name,r,null,i.engine,!0)}`;(e.length||this.hasCommitted)&&e.push(bn(i.depth??0)),e.push(a),t.push(a);let o=this.previews.get(r);o&&e.push(`${_n(i.depth??0)} ${A.dim(o)}`)}for(let r of this.activeGates.values()){let i=`${gn(r.depth)} ${hn(r.cmd,n,Date.now()-r.startedAt)}`;(e.length||this.hasCommitted)&&e.push(bn(r.depth)),e.push(i),t.push(i)}let r=(ae(this.stream)??1/0)-1,i=e.length<=r?e:t;if(i.length>r){let e=Math.max(0,r-1);i=[A.dim(`… +${i.length-e} more running`),...i.slice(-e)]}this.region.set(i)}refreshPreviews(e){try{let t=this.tails.get(e),n;if(!t){let r=V.join(be(H.cwd(),e),`log.jsonl`),i=Oe.existsSync(r)?Oe.statSync(r).size:0;n=ye(H.cwd(),e,1)[0],t=Ce(r,i),this.tails.set(e,t)}for(let e of t())try{n=JSON.parse(e)}catch{n={message:e}}let r=n?.message?.replace(/\s+/g,` `).trim();if(!r)return;let i=(P(this.stream)??120)-8;this.previews.set(e,r.length>i?`${r.slice(0,i-1)}…`:r)}catch{}}idle(){!this.active.size&&!this.activeGates.size&&this.spin(!1)}spin(e){e&&!this.timer?this.timer=setInterval(()=>{this.frame++,this.repaint()},120).unref():!e&&this.timer&&(clearInterval(this.timer),this.timer=void 0)}};function Sn(e,t){if(t){D(e);return}let n=!H.stdout.isTTY,r=n?``:`${A.dim(`└─`)} `;H.stdout.write(`${r}${Z(`completed`,n)} run ${A.cyan(e.runId)} completed ${A.dim(`(${e.taskCount} tasks)`)}\n`),H.stdout.write(`\n${oe(e.result)}\n`),wn(e.tokens)}async function Cn(e,t,n){let{runId:r}=e.record,i=!!(t.stream&&t.json);!t.json&&e.record.status===`running`&&H.stderr.write(`${A.dim(`[flow]`)} Run ${A.cyan(r)} started and is waiting to finish. Press Ctrl-C to detach. It keeps running.\n\n`);let a=t.json?()=>{}:ue(),o=()=>{a(),i||(H.stderr.write(`\n${A.dim(`[flow] Detached. The run is still going.`)}\n`),n({runId:r,status:`running`,phase:`detached`},{stream:`stderr`,style:`stdout`,force:!0})),H.exit(130)};H.on(`SIGINT`,o);let s=new xn;for await(let n of e.events)i?H.stdout.write(`${JSON.stringify(n)}\n`):t.json||s.emit(n);s.done(),a(),H.off(`SIGINT`,o);let c=e.final();i&&(H.stdout.write(`${JSON.stringify(En(c))}\n`),H.exit(c.status===`completed`?0:1)),c.status===`completed`&&(Sn({runId:r,name:c.name,status:`completed`,result:c.result,tokens:c.ledger,taskCount:c.taskCount},t.json),H.exit(0)),c.status===`stopped`&&(t.json?D({runId:r,name:c.name,status:`stopped`,taskCount:c.taskCount}):H.stdout.write(`\n${A.dim(`[flow] Run ${r} stopped.`)}\n`),n(c),H.exit(1)),H.stdout.write(`\n${A.red(`error:`)} ${c.error??`unknown error`}\n`),n(c,{force:!0}),H.exit(1)}function wn(e){let t=Object.keys(e);if(t.length){H.stdout.write(`\n${A.bold(`Tokens:`)}\n`);for(let n of t)H.stdout.write(` ${A.dim(N(e[n],n))}\n`)}}function Tn(e){let{runId:t,name:n,status:r,startedAt:i,endedAt:a,taskCount:o,ledger:s,error:c,archived:l,archivedAt:u}=e;return{runId:t,name:n,status:r,startedAt:i,endedAt:a,taskCount:o,ledger:s,error:c,archived:l,archivedAt:u}}function En(e){return{...Tn(e),result:e.result}}function Dn(e){return e.next?L([`Continue: ${e.next}`]):e.status===`running`?L(e.phase===`detached`?[`Result: coder flow result ${e.runId}`,`Stop it: coder flow stop ${e.runId}`]:[`Result: coder flow result ${e.runId}`,`Runs: coder flow list`]):e.status===`stopped`||e.status===`failed`?L([`Resume: coder flow resume ${e.runId}`]):[]}const On=F({name:`list`,description:`recent flow runs (by default running + just stopped)`,usage:`List recent flow runs, most recent first: running runs plus ones that ended
61
+ within the last 30 minutes. Older runs auto-archive and move to --archived.`,access:`read`,approvalPolicy:`deny`,args:{archived:v(`show archived runs (auto-archived or via flow archive)`),limit:d(`show at most n runs (default all)`)},run:async({options:e})=>{let{collectFlowRuns:t}=await import(`./executor-DBW7R7Tf.js`).then(e=>e.A);return t(e)},json:e=>e.runs.map(Tn),next:({result:e})=>L(e.runs.length?[`Result: coder flow result <run-id>`,`Tasks: coder list`,`Runnable flows: coder flow discover`]:[`Run one: coder flow run <name>`,`Runnable flows: coder flow discover`]),print:(e,{options:t})=>kn(e,t)});function kn({runs:e,clipped:t},n){if(!e.length){H.stdout.write(n.archived?`No archived flow runs.
62
+ `:`No recent flow runs.
63
+ `);return}let r=A;H.stdout.write(`${E([{header:`run-id`,value:e=>e.runId,max:28,paint:e=>r.cyan(e)},{header:`name`,value:e=>e.name,max:30},{header:`status`,value:e=>e.status,paint:(e,t)=>O(t.status,e.length)},{header:`tasks`,value:e=>`${e.taskCount} tasks`,paint:e=>r.light(e)},{header:`tokens`,value:e=>{let t=Object.values(e.ledger).reduce((e,t)=>e+t.total,0);return t?`${ce(t)} tok`:`-`},paint:e=>r.light(e)},{header:`age`,value:e=>w(R(e.startedAt)),paint:e=>r.light(e)}],e,r)}\n`),t&&H.stdout.write(r.dim(`\n... ${t} more not shown (--limit ${n.limit})\n`))}const An=F({name:`result`,description:`progress and result of a run`,usage:`Show a flow run's status and result, with its tasks, gates, and token ledger.
64
+ --tail <n> caps the step rows (0 for the result alone). Defaults to the most
65
+ recent run. To watch a run live, prefer \`coder flow watch\`.`,access:`read`,approvalPolicy:`deny`,args:{"run-id":x(`the run (default: the most recent)`),tail:l(`show the last n step rows (default: all; 0 hides them)`)},cli:{positional:[`run-id`],examples:[`coder flow result --tail 0 # the most recent run's result, no step rows`]},async run({options:e,args:[t]}){let{runResult:n}=await import(`./executor-DBW7R7Tf.js`).then(e=>e.A),r=n(t);if(!r&&!e.json)throw new C(`flow-failed`,t?`No flow run "${t}".`:`No flow runs yet.`,{hint:`Run one: coder flow run <name>`});return r},json:e=>e&&En(e),next:({result:e})=>e?L(e.status===`running`?[`Follow live: coder flow watch ${e.runId}`,`Stop it: coder flow stop ${e.runId}`]:e.status===`stopped`||e.status===`failed`?[`Resume: coder flow resume ${e.runId}`]:[]):[],print:(e,{options:t})=>Mn(e,t.tail)});function jn(e,t=!1){let n=A;if(t)return e.map(vn);let r=(t,n)=>{for(let r=t+1;r<e.length;r+=1){let t=e[r].depth;if(t<n)return!1;if(t===n)return!0}return!1};return e.map((e,t)=>{let i=``;for(let n=0;n<e.depth;n+=1)i+=r(t,n)?`│ `:` `;return i+=e.log?`│ `:r(t,e.depth)?`├─`:`└─`,`${n.dim(i)} ${e.body}`})}function Mn(e,t=`all`){let n=A,r=!H.stdout.isTTY;H.stdout.write(`${n.bold(`Flow`)} ${n.cyan(e.name)} ${n.dim(`(${e.runId})`)}. ${n.bold(O(e.status))}\n`);let i=e.steps,a=i.filter(e=>xe.includes(e.status)).length,o=e.status===`running`?`${a}/${i.length} tasks`:`${e.taskCount} tasks`;if(H.stdout.write(`${n.dim(`started ${e.startedAt}${e.endedAt?` · ended ${e.endedAt}`:``} · ${o}`)}\n`),t!==0){let a=new Map,o=new Map,s=new Map,c=[];for(let t of e.events)if(t.kind===`task-start`){let e={name:pn(t.name,t.prompt),engine:t.engine,depth:t.depth??0};a.set(t.taskId,e),o.set(t.taskId,e)}else if(t.kind===`task-end`){o.delete(t.taskId);let e=a.get(t.taskId);c.push({depth:e?.depth??0,body:Q(Z(t.status,r),e?.name??null,t.taskId,t.tokens,e?.engine)})}else if(t.kind===`gate-start`)s.set(t.gateId,{cmd:t.cmd,depth:t.depth??0});else if(t.kind===`gate`)t.gateId&&s.delete(t.gateId),c.push({depth:t.depth??0,body:mn(t,r)});else if(t.kind===`log`)for(let e of t.message.split(`
66
+ `))c.push({depth:t.depth??0,body:n.light(e),log:!0});else t.kind===`flow-start`&&c.push({depth:t.depth-1,body:n.bold(`flow ${t.name}`)});for(let[e,t]of o)c.push({depth:t.depth??0,body:Q(Z(`running`,r),t.name,e,null,t.engine)+(r?``:` ${n.light(`running`)}`)});for(let e of s.values())c.push({depth:e.depth,body:hn(e.cmd,Z(`running`,r))+(r?``:` ${n.light(`running`)}`)});if(!c.length)for(let e of t===`all`?i:i.slice(-t))c.push({depth:0,body:Q(Z(e.status,r),e.name,e.taskId??`-`,e.tokens)});let l=jn(c,r),u=t===`all`?l:l.slice(-t);u.length&&H.stdout.write(`\n${u.join(`
67
+ `)}\n`)}e.endedAt&&e.result!==void 0&&H.stdout.write(`\n${n.bold(`Result:`)}\n${oe(e.result)}\n`),e.error&&H.stdout.write(`\n${n.red(`error:`)} ${e.error}\n`),wn(e.ledger)}const Nn={wait:v(`follow the run in the foreground (Ctrl-C detaches; it keeps running)`),args:x(`the flow's input as a JSON value (or pass bare key=value pairs)`,`<json>`),concurrency:x(`tasks running at once (default: CPU count)`,`<n>`),"max-tasks":x(`total tasks the run may dispatch (default: CPU count x 10)`,`<n>`),"dry-run":v(`print every resolved prompt and gate command without dispatching`)};function Pn(e){let t={};for(let n of e){let e=n.indexOf(`=`);if(e===-1)throw new C(`invalid-option`,`Invalid argument "${n}": expected key=value.`,{hint:`Help: coder flow run --help`});let r=n.slice(0,e),i=n.slice(e+1);try{t[r]=JSON.parse(i)}catch{t[r]=i}}return t}function Fn(e,t){if(e!==void 0)try{return JSON.parse(e)}catch(e){throw new C(`invalid-option`,`Invalid --args JSON: ${e instanceof Error?e.message:String(e)}`)}return t.length?Pn(t):{}}const In=e=>e?Number(e):void 0,Ln=(e,t)=>({cwd:t,dryRun:e[`dry-run`],concurrency:In(e.concurrency),maxTasks:In(e[`max-tasks`]),detached:!0,wait:e.wait}),Rn=(e,t)=>e[`dry-run`]&&!e.json&&!t?Vn():{},zn=F({name:`run`,description:`run a flow in the background (--wait to follow it live)`,usage:`Run a flow: a TypeScript file that orchestrates many coder tasks with gates,
68
+ journaling, and resume. Prints the run id and orchestrates in the background;
69
+ --wait follows the run in the foreground with live progress (Ctrl-C detaches;
70
+ it keeps running), and \`coder flow watch\` shows the same lines any time.
71
+ Stop a run with \`coder flow stop\`.`,access:`write`,approvalPolicy:`deny`,args:{flow:f().check(S(`the flow: a discovered name or a path`)),inputs:s(`the flow's input as bare key=value pairs`),...Nn},cli:{positional:[`flow`,`inputs`],examples:[`coder flow run audit-routes --wait # run a discovered flow`,`coder flow run ./scratch/one-off.ts --wait # run a flow by path`,`coder flow run verify --args '{"clusters":["a","b"]}' --wait # pass structured input`]},async run({options:e,args:[t,...n],cwd:r,tool:i,next:a}){let{startRun:o}=await import(`./executor-DBW7R7Tf.js`).then(e=>e.A);return Bn(await o(t,{...Ln(e,r),args:Fn(e.args,n)},Rn(e,i)),e,i,a)},next:({result:e})=>Dn(e),print:e=>e.status===`running`?Hn(e):Sn(e)});async function Bn(e,t,n,r){if(e.status!==`running`||!e.watch)return e;if(!n)return Cn(e.watch,t,r);for await(let t of e.watch.events);let i=e.watch.final();if(i.status!==`completed`)throw new C(`flow-failed`,i.error??`Flow ${i.runId} ${i.status}.`,{runId:i.runId,hint:`Resume: coder flow resume ${i.runId}`});return{runId:i.runId,name:i.name,status:`completed`,result:i.result,tokens:i.ledger,taskCount:i.taskCount}}function Vn(){let e=new xn;return{onEvent:t=>e.emit(t)}}function Hn(e){H.stdout.write(`${A.dim(`[flow]`)} run ${A.cyan(e.runId)} started in the background (running).\n`)}const Un=F({name:`resume`,description:`continue a stopped or edited run`,usage:`Re-run a flow from its journal: finished steps replay instantly, the first
72
+ changed or new step onward runs live. Defaults to the most recent run.
73
+ Accepts the same flags as flow run.`,access:`write`,approvalPolicy:`deny`,args:{"run-id":x(`the run (default: the most recent)`),...Nn},cli:{positional:[`run-id`],examples:[`coder flow resume # continue the most recent run`]},async run({options:e,args:[t],cwd:n,tool:r,next:i}){let{resumeRun:a}=await import(`./executor-DBW7R7Tf.js`).then(e=>e.A);return Bn(await a(t,{...Ln(e,n),...e.args===void 0?{}:{args:Fn(e.args,[])}},Rn(e,r)),e,r,i)},next:({result:e})=>Dn(e),print:e=>e.status===`running`?Hn(e):Sn(e)}),Wn=F({name:`stop`,description:`stop a run and its still-running tasks`,usage:`Stop a running flow: signal the orchestrator so it stops dispatching, stamp the
74
+ run stopped, and stop its still-running tasks. Defaults to the most recent run;
75
+ the journal stays ready for \`coder flow resume\`.`,access:`write`,approvalPolicy:`deny`,args:{"run-id":x(`the run (default: the most recent)`),"keep-tasks":v(`leave the run's still-running tasks running`)},cli:{positional:[`run-id`]},run:async({options:e,args:[t]})=>{let{stopRun:n}=await import(`./executor-DBW7R7Tf.js`).then(e=>e.n);return n(t,{keepTasks:e[`keep-tasks`]})},next:({result:e})=>L([`Resume: coder flow resume ${e.runId}`]),print:Gn});function Gn(e){let t=A;e.status===`failed`?H.stdout.write(`${t.dim(`[flow]`)} Run ${t.cyan(e.runId)} orchestrator died. Marked ${O(`failed`)}.\n`):H.stdout.write(`${t.dim(`[flow]`)} run ${t.cyan(e.runId)} ${O(e.status)}.\n`),e.stoppedTasks.length&&H.stdout.write(`${t.dim(`[flow]`)} stopped tasks: ${e.stoppedTasks.join(`, `)}\n`),e.keptTasks.length&&H.stdout.write(`${t.dim(`[flow]`)} left running: ${e.keptTasks.join(`, `)}\n`)}const Kn=I({name:`flow`,description:`orchestrate many coder tasks from one TypeScript file`,usage:`Orchestrate many coder tasks with a plain TypeScript file: dispatch, gates,
76
+ concurrency, journaling, and resume. Flows live in .coder/flows/ (workspace)
77
+ or ~/.coder/flows/ (global). See \`coder docs flows\`.`,commands:[zn,On,sn,An,ln,Wn,Un,an,on],aliases:{stream:`watch`,ls:`list`}}),qn=()=>H.env.CODER_MCP_MODE===`cloud`,Jn=F({name:`mcp`,description:`serve Coder's commands as MCP tools over stdio`,usage:[`Serve Coder's commands as MCP tools over stdio, so a harness can run them.`,``,`Commands return their JSON payloads and next steps. Load docs with load_skill;`,`blocking commands keep their CLI flags and behavior, subject to the client's tool timeout.`].join(`
78
+ `),access:`write`,approvalPolicy:`deny`,globalFlags:{json:!1,cwd:!1},mcp:!1,cli:{examples:[`claude mcp add coder -- coder mcp # run Coder from Claude Code`]},async run(){if(H.stdin.isTTY){H.stdout.write(`coder mcp is the MCP server your host starts; it waits for an MCP client on stdin.
79
+ Add it to your host with \`coder setup-host\`, or by hand: claude mcp add coder -- coder mcp
80
+ `);return}let{app:e,cloudApp:t}=await import(`./context-C1XBbfEL.js`),{serve:n}=await import(`./serve-DoYbHm_k.js`);await n(qn()?t:e,`stdio`)}}),$=v(`target <repo>/.coder/config.json instead of the user file`),Yn=b(n(_().check(i(),e())),`the model's context window in tokens; filled from the provider when it reports one`,`<tokens>`),Xn=e=>({baseUrl:e[`base-url`],model:e.model,envKey:e[`env-key`],contextWindow:e[`context-window`],workspace:e.workspace}),Zn=F({name:`add`,description:`connect a model`,usage:`Connect a custom model behind an OpenAI-compatible endpoint (Ollama, LM Studio,
81
+ vLLM, OpenRouter, ...). It currently runs on the codex engine pointed at your
82
+ URL and is usable anywhere a model is: --model <name> or --model custom/<name>, or as an
83
+ agent default in config. Alias: \`coder model setup\`.`,access:`write`,approvalPolicy:{handoff:{page:`/settings/models`,label:`Add the model`,action:`add`,args:[`name`,`base-url`,`model`,`env-key`,`context-window`]}},args:{name:x(`the name to dispatch it by`),"base-url":x(`OpenAI-compatible API base (e.g. http://localhost:11434/v1)`,`<url>`),model:x(`the provider's model id (e.g. qwen2.5-coder:32b)`,`<id>`),"env-key":x(`env var holding the API key (omit for keyless local endpoints)`,`<VAR>`),"context-window":Yn,workspace:v(`write to <repo>/.coder/config.json instead of the user file`)},cli:{positional:[`name`],examples:[`coder model add qwen --base-url http://localhost:11434/v1 --model qwen2.5-coder:32b # local Ollama model, no key`,`coder model add kimi --base-url https://openrouter.ai/api/v1 --model moonshotai/kimi-k2 --env-key OPENROUTER_API_KEY # third-party provider via OpenRouter`,`coder run --model qwen "explain this repo" # dispatch a task on it`]},run:async({options:e,args:[t],cwd:n})=>{let{models:r}=await import(`./models-BVxs3I8o.js`).then(e=>e.r);return r.add(t,{...Xn(e),cwd:n})},json:Qn,next:({result:e})=>er(e),print:(e,{next:t})=>$n(e,`saved`,()=>t(e,{slot:`codex`}))});function Qn({name:e,entry:t,file:n,probe:r,codex:i,install:a,ready:o}){return{name:e,...t,file:n,probe:r,codex:i,...a?{codexInstall:a}:{},ready:o}}function $n({name:e,entry:t,file:n,probe:r,codex:i,install:a,nativeResponses:o,keyMissing:s},c,l){let u=A,d=e=>` ${u.green(`✔`)} ${e}`,f=e=>` ${u.red(`✘`)} ${e}`,p=[`${c} ${u.cyan(e)} -> ${t.model} @ ${t.baseUrl}${t.contextWindow?`, ${t.contextWindow} tokens`:``} ${u.dim(`(${n})`)}`,``,r.reachable?d(`${r.detail} ${u.dim(`(${o?`responses api, direct`:`chat api, auto-translated`})`)}`):f(r.detail),i.available?d(a?.installed?`${a.note} ${u.dim(`(${i.detail})`)}`:`codex engine ${u.dim(`(${i.detail})`)}`):a?.note?f(a.note):null];p.at(-1)===null&&(p.pop(),H.stdout.write(`${p.join(`
84
+ `)}\n`),p.length=0,l()),s&&p.push(f(`env var ${t.envKey} is not set in this shell`)),p.length&&H.stdout.write(`${p.join(`
85
+ `)}\n`)}function er({name:e,codex:t,install:n}){return[...!t.available&&!n?.note?[{usage:`npm install -g @openai/codex`,blurb:`codex CLI not installed`,cli:{text:` ${A.red(`✘`)} codex CLI not installed - run: npm install -g @openai/codex`,layout:`plain`,prefix:``,slot:`codex`}}]:[],...L([`Use it: coder run --model ${e} "<task>"`,`Make default: coder config set engines.custom.model ${e}`],{layout:`plain`,dim:!0})]}const tr=F({name:`alias`,description:`name a spec, e.g. fast codex/luna`,usage:`Save an alias for an engine spec, e.g. fast -> codex/luna. An alias may reuse a
86
+ built-in name to override it; an engine name sets what that bare engine runs.`,access:`write`,approvalPolicy:`ask`,args:{name:x(`the alias`),spec:x(`the engine spec, such as codex/luna`),workspace:$},cli:{positional:[`name`,`spec`]},run:async({options:e,args:[t,n],cwd:r})=>{let{models:i}=await import(`./models-BVxs3I8o.js`).then(e=>e.r);return i.alias(t,n,{...e,cwd:r})},print:e=>`alias`in e&&nr(e)});function nr(e){let t=A;H.stdout.write(`aliased ${t.cyan(e.alias)} -> ${e.model} ${t.dim(`(${e.file})`)}\n`)}const rr=F({name:`remove`,description:`delete a custom model`,usage:`Remove a configured custom model.`,access:`write`,approvalPolicy:{handoff:{page:`/settings/models`,label:`Remove the model`,action:`delete`,args:[`name`],button:`Remove`}},args:{name:x(`the custom model`),workspace:$},cli:{positional:[`name`]},run:async({options:e,args:[t],cwd:n})=>{let{models:r}=await import(`./models-BVxs3I8o.js`).then(e=>e.r);return r.remove(t,{...e,cwd:n})},print:e=>ir(`removed`,e.removed,e.file)});function ir(e,t,n){H.stdout.write(`${e} ${A.cyan(t)} ${A.dim(`(${n})`)}\n`)}const ar=(e,t,n)=>F({name:e?`disable`:`enable`,description:t,usage:n,access:`write`,approvalPolicy:`ask`,args:{name:x(`a built-in, custom model, or alias`),workspace:$},cli:{positional:[`name`]},run:async({options:t,args:[n],cwd:r})=>{let{models:i}=await import(`./models-BVxs3I8o.js`).then(e=>e.r);return i[e?`disable`:`enable`](n,{...t,cwd:r})},json:t=>`file`in t?{[e?`disabled`:`enabled`]:t.name,file:t.file}:t,print:t=>`file`in t&&ir(e?`disabled`:`enabled`,t.name,t.file)}),or=ar(!0,`turn off a model (built-in, custom, or alias)`,`Disable a model - built-in, custom, or alias. Requests for it fail until re-enabled.`),sr=ar(!1,`re-enable a disabled model`),cr=F({name:`list`,description:`list built-ins, custom models, and aliases`,usage:`List built-in aliases, configured custom models, and user aliases. Only custom
87
+ models on this machine are probed; --server lists the workspace's.`,access:`read`,args:o,run:async({options:e,cwd:t})=>{let{models:n}=await import(`./models-BVxs3I8o.js`).then(e=>e.r);return n.list({...e,cwd:t})},next:()=>L([`Add a custom model: coder model add <name> --base-url <url> --model <id> [--env-key VAR]`,`Alias a model, e.g. fast codex/luna: coder model alias <name> <spec>`,`Run with a model: coder run --model <name> "<task>"`]),print:lr});function lr(e){let t=A,n=e=>e?` ${t.dim(`(disabled)`)}`:``,r=[],i=(e,i)=>{r.push(t.bold(e));for(let e of i)`overrides`in e?r.push(` ${e.disabled?t.dim(`∅`):t.cyan(`↳`)} ${e.alias.padEnd(14)} ${t.dim(`-> ${e.spec} (overrides ${e.overrides})`)}${n(e.disabled)}`):`builtin`in e?r.push(` ${e.disabled?t.dim(`∅`):t.green(`✔`)} ${e.alias.padEnd(14)} ${t.dim(`-> ${e.model}`)}${n(e.disabled)}`):r.push(` ${e.disabled?t.dim(`∅`):t.cyan(`↳`)} ${e.alias.padEnd(14)} ${t.dim(`-> ${e.spec}`)}${n(e.disabled)}`);r.push(``)};i(`Codex models`,e.codex),i(`Claude models`,e.claude),r.push(t.bold(`Custom models`),``),e.custom.length||r.push(t.dim(` None.`));for(let{name:i,probe:a,...o}of e.custom){let e=o.disabled?t.dim(`∅`):a?a.reachable?t.green(`✔`):t.red(`✘`):t.dim(`·`);r.push(` ${e} ${i.padEnd(14)} ${o.model} ${t.dim(`@ ${o.baseUrl}${o.contextWindow?`, ${o.contextWindow} tokens`:``}.${a?` ${a.detail}`:``}`)}${n(o.disabled)}`)}if(r.push(``),e.toggles){r.push(t.bold(`Other`),``);for(let i of e.toggles)r.push(` ${i.disabled?t.dim(`∅`):t.green(`✔`)} ${i.name.padEnd(14)} ${t.dim(`raw model id`)}${n(i.disabled)}`);r.push(``)}H.stdout.write(`${r.join(`
88
+ `).trimEnd()}\n`)}const ur=F({name:`unalias`,description:`remove an alias`,usage:`Remove a user-defined alias.`,access:`write`,approvalPolicy:{handoff:{page:`/settings/models`,label:`Remove the alias`,action:`delete`,args:[`name`],button:`Remove`}},args:{name:x(`the alias`),workspace:$},cli:{positional:[`name`]},run:async({options:e,args:[t],cwd:n})=>{let{models:r}=await import(`./models-BVxs3I8o.js`).then(e=>e.r);return r.unalias(t,{...e,cwd:n})},print:e=>ir(`unaliased`,e.unaliased,e.file)}),dr=F({name:`update`,description:`change a model in place`,usage:`Update a configured custom model. Only the flags you pass change; the endpoint
89
+ is re-probed and the wire protocol re-detected.`,access:`write`,approvalPolicy:`ask`,args:{name:x(`the custom model`),"base-url":x(`new API base`,`<url>`),model:x(`new provider model id`,`<id>`),"env-key":x(`new API-key env var`,`<VAR>`),"context-window":Yn,workspace:v(`write to <repo>/.coder/config.json instead of the user file`)},cli:{positional:[`name`]},run:async({options:e,args:[t],cwd:n})=>{let{models:r}=await import(`./models-BVxs3I8o.js`).then(e=>e.r),{server:i}=e;return r.update(t,{...Xn(e),cwd:n,server:i})},json:e=>`entry`in e?Qn(e):e,next:({result:e})=>`entry`in e?er(e):[],print:(e,{next:t})=>`entry`in e&&$n(e,`updated`,()=>t(e,{slot:`codex`}))}),fr=I({name:`model`,description:`manage models: built-ins, aliases, custom endpoints`,usage:"Manage the models coder can dispatch to. `add` connects any OpenAI-compatible\nendpoint (Ollama, vLLM, OpenRouter, ...) as the custom engine, alongside the\nbuilt-in codex/claude models. Name your own shortcuts with `alias`\n(e.g. fast -> codex/luna); disable/enable turns any model off and on.",commands:[cr,Zn,dr,rr,or,sr,tr,ur],aliases:{ls:`list`}}),pr=F({name:`review`,description:`review changed code with a built-in flow`,usage:`Review changed code with a read-only agent. Every reported finding is checked
90
+ against the repository. Runs the built-in \`review\` flow. A local review covers
91
+ everything since the merge-base with the origin default branch, including
92
+ uncommitted and untracked files. Changed submodules are reviewed file by file.
93
+ PR reviews can post one review with inline comments, never repeating a finding.
94
+
95
+ Related: \`coder flow watch\`, \`coder docs review\`.`,access:`write`,approvalPolicy:`deny`,args:{base:x(`local comparison base (default: merge-base with origin default)`,`<ref>`),head:x(`review commits through this ref only (default: the working tree)`,`<ref>`),pr:x(`review a pull request by number (origin repo) or URL; GitHub via gh for now`,`<n|url>`),since:x(`keep only PR files and hunks changed since this commit`,`<sha>`),path:s(`review only this path, relative to cwd (repeatable)`,`<p>`),exclude:s(`leave this path out, relative to cwd (repeatable)`,`<p>`),post:v(`post the review on the pull request, as the signed-in gh user`),run:x(`with --post, post this finished review run instead of reviewing again`,`<id>`),md:v(`markdown output (the default)`),model:r(`for the review task (default: reviewModel)`),depth:b(n(u([`low`,`medium`,`high`])),`what to report: low only critical and major, high nits too (default: medium)`,`<low|medium|high>`)},cli:{examples:[`coder review # review the branch plus uncommitted work`,`coder review --base main # review everything since main locally`,`coder review --path src --exclude src/gen # review src without generated code`,`coder review --pr 42 --post # review and post to pull request 42`,`coder review --depth high # report nits too`,`coder review --post --run <id> # post a finished review run`]},async run({options:e,cwd:t}){let{review:n}=await import(`./executor-DBW7R7Tf.js`).then(e=>e.n);if(e.json&&e.md)throw new C(`invalid-option`,`--json and --md are mutually exclusive.`);let{run:r,md:i,json:a,...o}=e;if(r===void 0)return n.run({...o,cwd:t});if(!o.post)throw new C(`invalid-option`,`--run needs --post.`);let{postReviewRun:s}=await import(`./flow/builtin/review/index.js`);return s(r,t)},print:async e=>{let{renderReviewMarkdown:t}=await import(`./flow/builtin/review/index.js`);H.stdout.write(t(e))}}),mr=F({name:`add`,description:`connect a runner`,usage:`Connect a runner. Secret fields read environment variables with key=env:VARIABLE. Adding local prints a pairing command.`,access:`write`,approvalPolicy:{handoff:{page:`/settings/runners`,label:`Add the runner`,action:`add`,args:[`kind`,`name`,`scope`]}},args:{kind:f().check(S(`the runner kind, such as local or http`)),name:x(`runner display name`),scope:x(`personal or workspace`),field:s(`repeat for each field, use env:VARIABLE for secrets`,`key=value`),...h},globalFlags:{cwd:!1},cli:{positional:[`kind`]},async run({options:e,args:[t]}){let{addRunnerFields:n}=await import(`./runner-CKMOh5Q3.js`).then(e=>e.t);return n(t,e)},print:e=>H.stdout.write(`${`command`in e?e.command:`Added ${e.name} (${e.id}).`}\n`)}),hr=F({name:`default`,description:`set the default in its scope`,usage:`Use this runner by default within its scope.`,access:`write`,approvalPolicy:`ask`,args:{id:f().check(S(`the runner`)),...h},globalFlags:{cwd:!1},cli:{positional:[`id`]},async run({options:e,args:[t]}){let{runners:n}=await import(`./runner-CKMOh5Q3.js`).then(e=>e.t);return n.default(t,e)},print:e=>H.stdout.write(`Default runner ${e.name}.\n`)});function gr({items:e}){if(!e.length)return void H.stdout.write(`${A.dim(`No runners.`)}\n`);H.stdout.write(`${E([{header:`id`,value:e=>e.id,paint:e=>A.cyan(e)},{header:`name`,value:e=>e.name},{header:`scope`,value:e=>e.scope},{header:`status`,value:e=>e.online?`online`:`offline`},{header:`kind`,value:e=>e.kind},{header:`default`,value:e=>e.default?`yes`:``}],e,A)}\n`)}const _r=F({name:`list`,description:`list your runners and the workspace's`,access:`read`,args:h,globalFlags:{cwd:!1},run:async({options:e})=>{let{listRunners:t}=await import(`./runner-CKMOh5Q3.js`).then(e=>e.t);return t(e)},print:gr}),vr=F({name:`remove`,description:`remove a runner`,access:`write`,approvalPolicy:{handoff:{page:`/settings/runners`,label:`Remove the runner`,action:`delete`,args:[`id`],button:`Remove`}},args:{id:f().check(S(`the runner`)),...h},globalFlags:{cwd:!1},cli:{positional:[`id`]},async run({options:e,args:[t]}){let{removeRunner:n}=await import(`./runner-CKMOh5Q3.js`).then(e=>e.t);return n(t,e)},print:(e,{args:[t]})=>H.stdout.write(`Removed ${A.bold(t)}.\n`)}),yr=F({name:`rename`,description:`rename a runner`,access:`write`,approvalPolicy:`deny`,args:{id:f().check(S(`the runner`)),name:f().check(S(`its new name`)),...h},globalFlags:{cwd:!1},cli:{positional:[`id`,`name`]},async run({options:e,args:[t,n]}){let{runners:r}=await import(`./runner-CKMOh5Q3.js`).then(e=>e.t);return r.rename(t,n,e)},print:(e,{args:[t]})=>H.stdout.write(`Renamed ${t} to ${A.bold(e.name)}.\n`)}),br=F({name:`serve`,description:`run your server's tasks on this machine`,usage:`Run tasks on this machine with its own claude and codex logins. Expose the port with any tunnel (cloudflared, ngrok, Tailscale Funnel or a public VS Code port) and pass the tunnel's URL; each start registers the current URL, so a changing tunnel URL is fine. Choose a default with coder runner default. Tasks use their named runner, the agent setting, your default, the workspace default, then the server default.`,access:`write`,approvalPolicy:`deny`,args:{url:x(`the HTTPS address the server reaches this runner at`,`<public url>`),token:x(`one-use pairing token, --url is the Coder server`,`<token>`),"runner-url":x(`public tunnel address when pairing, or CODER_RUNNER_URL`,`<url>`),port:b(n(_().check(i(),e())),`local port the tunnel forwards to (default 4100)`,`<n>`),name:x(`shown in the dashboard (default: this machine's hostname)`),workspace:v(`run every member's tasks, not only yours (owners and admins)`),...h},mcp:!1,cli:{examples:[`cloudflared tunnel --url http://localhost:4100 # expose the port in one terminal`,`coder runner serve --url https://abc.trycloudflare.com # then serve through it`]},async run({options:e}){let{serveRunner:t}=await import(`./serve-YlU04KO7.js`).then(e=>e.n),n=await t({...e,runnerUrl:e[`runner-url`]}),r=()=>void n.close().finally(()=>H.exit(0));return H.once(`SIGINT`,r),H.once(`SIGTERM`,r),n},json:({server:e,close:t,...n})=>({ok:!0,...n}),next:()=>L([`Tasks run here with this machine's own claude and codex logins`,`Stop with Ctrl-C; the server marks the runner offline`],{prefix:``,paint:`cyan`}),print:e=>H.stdout.write(`Runner ${A.bold(e.name)} serves ${e.server} at ${A.cyan(e.config.url??``)} (${e.scope}), listening on localhost:${e.port}.\n`)}),xr=F({name:`test`,description:`check a runner connection`,usage:`Check the runner connection.`,access:`read`,approvalPolicy:`deny`,args:{id:f().check(S(`the runner`)),...h},globalFlags:{cwd:!1},cli:{positional:[`id`]},async run({options:e,args:[t]}){let{testRunner:n}=await import(`./runner-CKMOh5Q3.js`).then(e=>e.t);return n(t,e)},print:e=>H.stdout.write(`${e.ok?`OK`:`Failed`} ${e.detail} (${e.ms} ms).\n`)}),Sr=I({name:`runner`,description:`run your server's tasks on this machine`,usage:`Run your Coder server's tasks on your own machine, reached through any tunnel.`,commands:[mr,hr,xr,br,_r,yr,vr]}),Cr=F({name:`create`,description:`create the built-in agent's public app`,usage:`Open the page that creates the built-in agent's public app on a platform, once per server. Every workspace then connects it from its dashboard with one click. Run it where the server's environment is set.`,access:`write`,approvalPolicy:`deny`,args:{integration:f().check(S(`the platform, such as github`)),org:x(`create it under this organization instead of your own account`),name:x(`the app's name and handle (default Coder)`)},globalFlags:{cwd:!1},cli:{positional:[`integration`],env:[[`DATABASE_URL`,`the server's Postgres`],[`PUBLIC_URL`,`the server's address, which goes into the app`]],examples:[`coder server app create github --name wular-coder # the hosted GitHub App`]},async run({options:e,args:[t]}){let{serverAppLink:n}=await import(`./apps-BORri-28.js`).then(e=>e.t);return n(t,{owner:e.org,name:e.name})},json:({url:e})=>({ok:!0,url:e}),print({url:e}){H.stdout.write(`Open this page to create the app (valid 10 minutes):\n${e}\n`),pe(e)}}),wr=I({name:`app`,description:`the built-in agent's public apps`,usage:`The built-in agent's apps, one per platform, shared by every workspace on this server.`,commands:[Cr]}),Tr=F({name:`rotate-key`,description:`re-seal secrets with SERVER_ENCRYPTION_KEY`,usage:`Re-seal stored app, installation, engine, and linked user secrets with the current key.`,access:`write`,approvalPolicy:`deny`,globalFlags:{cwd:!1},cli:{env:[[`SERVER_ENCRYPTION_KEY`,`the new key`],[`SERVER_ENCRYPTION_KEY_PREVIOUS`,`the old key, still accepted while rotating`]]},run:async()=>{let{rotateKey:e}=await import(`./maintenance-DyiyHI8S.js`);return e()},json:({moved:e})=>({ok:!0,moved:e}),print:({moved:e})=>H.stdout.write(`Re-sealed ${e} secret${e===1?``:`s`}.\n`)});function Er(e){let t=A,n=[...e.publicUrl===e.address?[]:[[`public`,e.publicUrl]],[`store`,e.database??(e.mode===`local`?we():e.store)],[`runner`,e.runner],...e.signIn?[[`sign-in`,e.signIn]]:[],...e.mintedToken?[[`token`,e.mintedToken]]:[]],r=Math.max(...n.map(([e])=>e.length))+2;H.stdout.write(`${t.bold({local:`Coder local server`,memory:`Coder test server`,cloud:`Coder server`}[e.mode])} ${t.dim(`listening on ${e.address}`)}\n`);for(let[e,i]of n)H.stdout.write(` ${t.light(e.padEnd(r))}${i}\n`);e.warnings.length&&H.stdout.write(`
96
+ `);for(let n of e.warnings)H.stdout.write(` ${t.yellow(`!`)} ${n}\n`);e.cacheMigration?.then(e=>{(e.tasks||e.flows||e.files)&&H.stdout.write(`\n moved ${e.tasks.toLocaleString(`en-US`)} archived tasks to ${e.cache}\n`)}).catch(e=>H.stderr.write(`\n Cache migration failed: ${e instanceof Error?e.message:String(e)}\n`))}const Dr=F({name:`serve`,description:`run the server`,usage:`Run the Coder server on Bun: the address platforms deliver events to, the dashboard, and the worker that runs tasks. With DATABASE_URL it is a full server with sign-in and workspaces. Without one it is the dashboard for this machine's CLI: its config, agents, tasks and engine logins, on loopback only. --memory makes a throwaway test server that keeps everything in memory. Configured through the environment; every variable is in coder docs self-host.`,access:`write`,approvalPolicy:`deny`,args:{port:b(n(_().check(i(),e())),`listen port (default: PORT, else the port in a localhost PUBLIC_URL, else 8787)`,`<n>`),host:x(`listen address (default: HOST, else 127.0.0.1 without a database, else every interface)`,`<address>`),memory:v(`a throwaway test server: everything in memory, no sign-in, admin token only`),runner:x(`local, local-docker, vercel-sandbox, github-actions, or http`,`<name>`)},mcp:!1,cli:{env:[[`PUBLIC_URL`,`the address platforms and browsers reach the server at (default http://localhost:<port>)`],[`PORT`,`listen port, as hosts set it (default 8787)`],[`HOST`,`listen address, as --host`],[`DATABASE_URL`,`Postgres, set up with drizzle-kit push; turns on sign-in and workspaces`],[`AUTH_WULAR_URL`,`the Wular Auth issuer people sign in with (default https://auth.wular.ai)`],[`SERVER_ENCRYPTION_KEY`,`encrypts stored secrets and derives the sign-in keys; required with DATABASE_URL (openssl rand -base64 32)`],[`RUNNER`,`where tasks run: local (default), local-docker, vercel-sandbox, github-actions, http`],[`MAX_TASKS, TASK_TIMEOUT, TASK_STALL, TASK_ATTEMPTS`,`runner capacity and lifecycle limits`],[`ADMIN_TOKEN`,`local and memory servers: the dashboard and CLI key; minted and shown when unset`],[`CODER_CACHE_HOME`,`archived tasks, flows and usage (default OS cache directory/wular-coder)`],[`WORK_DIR`,`where the local runner keeps task work folders`],[`SERVER_NAME`,`what the dashboard calls this server (default Coder)`]],examples:[`PUBLIC_URL=https://abc.ngrok.app coder server serve # receive GitHub and Slack events through a tunnel; the tunnel serves only their webhooks and callbacks`,`PUBLIC_URL=https://agents.example.com DATABASE_URL=postgres://... coder server serve # on your own host, backed by Postgres`]},async run({options:e,cwd:t}){let{rerunUnderBun:n}=await import(`./env-BwFCHakK.js`).then(e=>e.t);if(await n(),e.memory&&!H.env.ADMIN_TOKEN&&!H.stdout.isTTY)throw new C(`invalid-option`,`Memory server needs an admin token: set ADMIN_TOKEN, or run in a terminal to get a printed one.`);let{serve:r}=await import(`./serve-D23JqDip.js`),i=await r({cwd:t,port:e.port,...e.host?{host:e.host}:{},...e.runner?{runner:e.runner}:{},...e.memory?{memory:!0}:{}}),a=()=>void i.close().finally(()=>H.exit(0));return H.once(`SIGINT`,a),H.once(`SIGTERM`,a),i},json:e=>({ok:!0,address:e.address,publicUrl:e.publicUrl,runner:e.runner,store:e.store,mode:e.mode,maxTasks:e.maxTasks,...e.signIn?{signIn:e.signIn}:{},...e.mintedToken?{adminToken:e.mintedToken}:{},warnings:e.warnings}),next:({result:e})=>e.mode===`memory`?L([`the CLI reaches this server with its token in ADMIN_TOKEN: coder task list --server ${e.publicUrl}`]):[],print:Er,afterNext(e){let t=A;if(e.dashboard){let n=H.stdout.isTTY&&pe(e.dashboard);H.stdout.write(n?`\nOpening the dashboard in your browser. If it doesn't open, go to:\n ${e.dashboard}\n`:`\n ${t.light(`dashboard`)} ${e.dashboard}\n`)}}}),Or=F({name:`workflow`,description:`print the GitHub Actions workflow for RUNNER=github-actions`,usage:`Print the workflow the github-actions runner dispatches. Save it as .github/workflows/coder-agent.yml in every repo the agent runs on, and set RUNNER=github-actions on the server.`,access:`read`,approvalPolicy:`deny`,globalFlags:{json:!1,cwd:!1},cli:{examples:[`coder server workflow > .github/workflows/coder-agent.yml # add it to a repo`]},run:async()=>{let{actionsWorkflow:e}=await import(`./github-actions-2RjyRseX.js`).then(e=>e.i);return e()},print:e=>H.stdout.write(e)}),kr=I({name:`server`,description:`self-host Coder: the server, its dashboard and sign-in`,usage:`Self-host Coder: the server your agents and platform apps talk to, with a dashboard and sign-in. We run one as the hosted service; you can run your own.`,namespaces:[wr],commands:[Dr,Tr,Or]}),Ar=F({name:`setup-host`,description:`check engines and install the host plugin or skill`,usage:`Set up coder in your host: check engines and auth, seed the config, and
97
+ install the host plugin/skill for the named host(s). Claude Code gets its
98
+ marketplace plugin; "agents" installs a skill into ~/.agents/skills for
99
+ every host that reads the Agent Skills standard dir (Codex, Pi, OpenCode,
100
+ ...). Codex and Cursor also get the MCP server; the Claude plugin includes it.
101
+ With no host, checks, seeds and registers available Codex and Cursor hosts.
102
+
103
+ To add the MCP server by hand: claude mcp add coder -- coder mcp, codex mcp
104
+ add coder -- coder mcp, or for Cursor "coder": { "command": "coder", "args":
105
+ ["mcp"] } under mcpServers in ~/.cursor/mcp.json. Restart running sessions after.`,access:`write`,approvalPolicy:`deny`,args:{hosts:s(`claude, agents, codex, cursor (one or more)`)},cli:{positional:[`hosts`],examples:[`coder setup-host claude # install the Claude Code plugin`,`coder setup-host agents # install the shared skill and register MCP with available Codex`,`coder setup-host codex cursor # install the skill and register MCP with both hosts`]},run:async({options:e,args:t,cwd:n,tool:r})=>{let{setupHostCore:i}=await import(`./dispatch-BkoIU4GU.js`).then(e=>e.k);return i(n,{...e,hosts:t},()=>e.json||r||jr())},next({result:e}){return[...[`codex`,`claude`].flatMap(t=>Nr(e,t)),...L([`custom models (local/provider endpoints): coder model --help`],{layout:`plain`,dim:!0,prefix:` `,slot:`models`}),...L([`(coder config set <key> <value> to change)`],{layout:`plain`,dim:!0,prefix:` ${A.dim(e.configFile)} `,slot:`config`}).map(e=>({...e,usage:`coder config set <key> <value>`})),...L([e.ready?`ready - try: coder run --wait "explain this repo's layout"`:`not ready - install an engine CLI to run tasks: codex (npm install -g @openai/codex, then codex login) or claude (npm install -g @anthropic-ai/claude-code, then claude auth login)`],{layout:e.ready?`good`:`bad`,prefix:``})]},print:(e,{next:t})=>Mr(e,t)});function jr(){H.stdout.write(`${A.bold(`Coder host setup`)}\n\n`)}function Mr(e,t){let n=A.bold,r=A.dim,{codex:i,codexUpdate:a,config:o,claudePlugin:s,agentsSkill:c}=e,l=[];H.stdout.write(`${n(`Available Engines`)}\n`);for(let n of[`codex`,`claude`]){let i=e[n];!i.available||!i.loggedIn?t(e,{slot:n}):H.stdout.write(`${T(`${n.padEnd(8)}${r(`${i.detail}; ${i.auth}`)}`)}\n`)}t(e,{slot:`models`}),a?.updated?l.push(T(`codex ${r(`updated ${a.from} -> ${i.detail} (GPT-6 support)`)}`)):a&&l.push(M(`codex ${a.note}`)),l.push(``),l.push(n(`Config`),` chain: ${o.chain.join(` -> `)} review: ${o.reviewModel}`),H.stdout.write(`${l.join(`
106
+ `)}\n`),l.length=0,t(e,{slot:`config`}),l.push(``);let u=[[`claude plugin`,s??null],[`agents skill `,c??null]];for(let[e,t]of u)t&&l.push(t.installed?T(`${e} ${r(t.note)}`):M(`${e} ${t.note}`),``);l.push(...e.mcp.map(e=>e.installed?T(e.note):M(e.note))),l.length&&H.stdout.write(`${l.join(`
107
+ `)}\n`)}function Nr(e,t){let n=e[t];if(n.available&&n.loggedIn)return[];let r=n.available?t===`codex`?`codex login`:`claude auth login`:`npm install -g ${t===`codex`?`@openai/codex`:`@anthropic-ai/claude-code`}`,i=n.available?`${t.padEnd(8)}not logged in${t===`codex`?` ${A.dim(`(${n.auth})`)}`:``} - run: ${r}`:`${t.padEnd(8)}CLI not installed - run: ${r}`;return[{usage:r,blurb:`${t} ${n.available?`not logged in`:`CLI not installed`}`,cli:{text:i,layout:`bad`,prefix:``,slot:t}}]}const Pr={accept:`approved`,decline:`denied`,closed:`stopped`},Fr=e=>e.answered?Pr[e.answered]:`pending`,Ir=e=>e.scope?` ${A.dim(`${e.approvers} approves this ${e.scope} change`)}`:``;function Lr(e,t){let n=A;if(!t.length)return void H.stdout.write(`${n.dim(`No approvals for task ${e}.`)}\n`);for(let e of t){let t=e.deniedReason?` ${n.dim(`denied: ${e.deniedReason}`)}`:``;H.stdout.write(`${n.cyan(e.id)} ${Fr(e).padEnd(8)} ${n.light(e.reason)}${Ir(e)}${t}\n${B(e.actions)}\n`)}}function Rr(e,t){let n=A;if(!e.length)return void H.stdout.write(`${n.dim(t?`No denied approvals.`:`No pending approvals.`)}\n`);for(let t of e){let e=t.createdAt?` ${n.dim(w(R(t.createdAt)))}`:``;H.stdout.write(`${n.cyan(t.id)} task ${n.cyan(t.taskId)}${e} ${n.light(t.reason)}${Ir(t)}\n${B(t.actions)}\n`)}}const zr=F({name:`approvals`,description:`pending approvals (all tasks, or one)`,usage:`List pending approvals across all tasks, --denied the denied ones (still answerable), or every approval of one task.`,access:`read`,args:{"task-id":x(`one task (default: approvals of every task)`),denied:v(`denied approvals instead of pending ones`),...o},cli:{positional:[`task-id`]},run:async({options:e,args:[t]})=>{let{tasks:n}=await import(`./task-CyqtCXo3.js`).then(e=>e.t);return n.approvals(t,{...e,organization:e.workspace})},json:(e,{args:[t]})=>t?e.map(({taskId:e,...t})=>t):e,next({result:e,args:t}){let n=m(t);if(!e.length)return t[`task-id`]?[]:L([`Check tasks: coder task list${n}`]);let r=e.length===1?t.server===void 0?e[0].id:`${e[0].taskId} ${e[0].id}`:t.server===void 0?`<approval-id>`:`<task-id> <approval-id>`;return L([`Answer: coder task approve ${r} [--deny --reason "<why>"]${n}`])},print:(e,{args:[t],options:n})=>t?Lr(t,e):Rr(e,!!n.denied)}),Br=F({name:`approve`,description:`answer an escalation`,usage:`Answer an escalation the task raised. Accepts by default; --deny rejects it, --reason says why.
108
+ Works any time, also after a deny: the task gets the decision as a message.
109
+ Approval ids are unique, so the task id is optional.`,access:`write`,args:{"task-id":x(`the task, or the approval id alone`),"approval-id":x(`the approval to answer`),deny:v(`reject the request instead of accepting`),reason:x(`why it is denied; the task reads it`),...o},cli:{positional:[`task-id`,`approval-id`]},run:async({options:e,args:[t,n]})=>{let{tasks:r}=await import(`./task-CyqtCXo3.js`).then(e=>e.t);return r.approve(t,n,{...e,organization:e.workspace})},print:({taskId:e,approvalId:t},{options:n})=>H.stdout.write(`${n.deny?`Denied`:`Approved`} ${A.cyan(t)} on task ${A.cyan(e)}; the task has been told.\n`)}),Vr=e=>e===1?``:`s`,Hr=F({name:`archive`,description:`archive a session (or --all-stopped)`,usage:`Archive a task session so it drops out of the default list (see it again with
110
+ \`coder task list --archived [--limit N]\`). Pass --all-stopped to archive every
111
+ finished task. A running task keeps running; steering an archived task
112
+ brings it back.`,access:`write`,args:{"task-id":x(`the task to archive`),"all-stopped":v(`archive every stopped (finished) task`),...o},cli:{positional:[`task-id`]},run:async({options:e,args:[t]})=>{let{tasks:n}=await import(`./task-CyqtCXo3.js`).then(e=>e.t);return n.archive(t,{...e,organization:e.workspace,allStopped:e[`all-stopped`]})},print(e){if(e.count===void 0)return void H.stdout.write(`Archived task ${A.cyan(e.taskId)}.\n`);H.stdout.write(e.count?`Archived ${e.count} stopped task${Vr(e.count)}.\n`:`${A.dim(`No stopped tasks to archive.`)}\n`)}});function Ur(e,t,n){let[r,...i]=e,a=i.join(` `).trim();if(!r||!a)throw new C(`invalid-option`,t,{hint:n});return{id:r,text:a}}function Wr(e,t=!1){let{taskId:n,steered:r}=e;if(r===`queued`){H.stdout.write(`${A.dim(`[coder]`)} follow-up queued for task ${A.cyan(n)}; it runs when the current turn finishes.\n`),t&&H.stdout.write(`\n${A.dim(`[coder] --wait is not available for a queued follow-up.`)}\n`);return}if(!t){H.stdout.write(r===`live`?`${A.dim(`[coder]`)} steered follow-up into running task ${A.cyan(n)}.\n`:`${A.dim(`[coder]`)} resumed task ${A.cyan(n)} with the follow-up (same thread, same id).\n`);return}H.stdout.write(`\n${e.finalMessage||`(no final message)`}\n\n`),H.stderr.write(`${A.dim(`[coder] task=${n} status=${e.status??`unknown`}`)}\n`)}const Gr=F({name:`steer`,description:`continue a task's thread`,usage:`Continue a task's thread with new instructions. They are injected into a live Codex or
113
+ Claude turn at its next tool boundary and queued across a startup or completion race.
114
+ A stopped, finished, or archived task resumes on the same task id. It reuses the
115
+ task's engine, model, and access unless overridden.`,access:`write`,args:{"task-id":x(`the task to continue`),text:s(`the follow-up instructions`),wait:v(`run in the foreground and block until the answer is ready`),model:r(`for this follow-up`),access:x(`lower the task's access for this follow-up`,`<read-only|auto>`),...o},cli:{positional:[`task-id`,`text`],examples:[`coder task steer task-abc "now add tests" # continue that task with a follow-up`]},async run({options:e,args:t}){let{tasks:n}=await import(`./task-CyqtCXo3.js`).then(e=>e.t),{id:r,text:i}=Ur(t,`Missing task id or follow-up text.`,[`Usage: coder task steer <task-id> "<follow-up>" [--wait]`,`Help: coder task steer --help`]);return n.steer(r,i,{...e,access:e.access,organization:e.workspace})},json:(e,{options:t})=>!t.wait||e.steered===`queued`?e:{taskId:e.taskId,status:e.status??null,finalMessage:e.finalMessage??null},next({result:e,args:t}){return e.steered===`queued`&&!t.wait?[]:t.wait&&e.steered!==`queued`?X(e.taskId,t).map(e=>({...e,cli:{...e.cli,stream:`stderr`}})):[Y(e.taskId,t,`Wait in its own background shell, one per task: coder task result ${e.taskId} --wait`)]},print:(e,{options:t})=>Wr(e,t.wait),exit(e,{options:t}){if(t.wait&&e.steered!==`queued`)return e.status===`completed`?0:1}}),Kr=F({name:`ask`,description:`ask about a task without interrupting it`,usage:`Answer a question ABOUT a task without touching it: a read-only sidecar reads
116
+ the task's progress log, result, and workspace and answers; the task never
117
+ sees the question and its thread is not steered. Works whether the task is
118
+ running or stopped. To change what the task does, use \`coder task steer\`.`,access:`read`,args:{"task-id":x(`the task to ask about`),question:s(`the question`),model:r(`for the sidecar (default: the task's own)`),...o},cli:{positional:[`task-id`,`question`],examples:[`coder task ask task-abc "what approach did you take and why?" # probe a decision without derailing the task`]},async run({options:e,args:t}){let{tasks:n}=await import(`./task-CyqtCXo3.js`).then(e=>e.t),{id:r,text:i}=Ur(t,`Missing task id or question.`,[`Usage: coder task ask <task-id> "<question>"`,`Help: coder task ask --help`]);return n.ask(r,i,{...e,organization:e.workspace,onAsking:t=>e.json||H.stderr.write(`${A.dim(`[coder]`)} asking about task ${A.cyan(t)} (read-only sidecar; the task is not interrupted)...\n`)})},json:({ok:e,...t})=>t,print({answer:e,error:t}){e?H.stdout.write(`\n${e}\n`):H.stdout.write(`${A.dim(`(no answer)`)}${t?` ${A.red(t)}`:``}\n`)},exit:e=>+!e.ok}),qr=F({name:`delete`,description:`delete a session (or --all-archived)`,usage:`Delete a task's session from disk. This is permanent. Pass --all-archived to
119
+ delete every archived task at once. A running task must be stopped first.`,access:`write`,approvalPolicy:{handoff:{page:`/tasks/:task-id`,label:`Delete the task`,action:`delete`,args:[`task-id`],button:`Delete`}},args:{"task-id":x(`the task to delete`),"all-archived":v(`delete every archived task`),...o},cli:{positional:[`task-id`]},run:async({options:e,args:[t]})=>{let{tasks:n}=await import(`./task-CyqtCXo3.js`).then(e=>e.t);return n.delete(t,{...e,organization:e.workspace,allArchived:e[`all-archived`]})},print(e){if(e.count===void 0)return void H.stdout.write(`Deleted task ${A.cyan(e.taskId)}.\n`);H.stdout.write(e.count?`Deleted ${e.count} archived task${Vr(e.count)}.\n`:`${A.dim(`No archived tasks to delete.`)}\n`)}});function Jr(e,t,n){let r=A;if(!e.length){let e=t.archived?`archived tasks`:t.running?`running tasks`:t.stopped?`recently stopped tasks`:`recent tasks`;H.stdout.write(`No ${e}.\n`);return}let i=[{header:`task-id`,value:e=>e.taskId,paint:e=>r.cyan(e),max:28},{header:`status`,value:e=>e.status,paint:(e,t)=>O(t.status,e.length),max:16},{header:`engine`,value:e=>(e.engine===`custom`&&e.model?e.model:(e.engine??`-`)+(e.model?`/${e.model}`:``))+(e.effort?`/${e.effort}`:``),paint:e=>r.light(e),max:26},{header:`cwd`,value:e=>e.cwd?V.basename(e.cwd):`-`,paint:e=>r.light(e),max:24},{header:`name`,value:e=>{let t=e.archived?` ${r.dim(`(archived)`)}`:``;return`${e.name?e.name:r.light(e.prompt)}${e.idleMs!==null&&e.idleMs>=12e4?` ${(e.idleMs>6e5?r.red:r.dim)(`· idle ${w(e.idleMs)}`)}`:``}${t}`}}],a=[],o=new Map;for(let t of e){if(!t.flowRunId){let e=a.at(-1);e&&!e.header?e.rows.push(t):a.push({rows:[t]});continue}let e=o.get(t.flowRunId);if(!e){let i=n(t.flowRunId);e={header:i?`(${r.bold(t.flowRunId)} ${i.status}. Flow ${i.name})`:`(${r.bold(t.flowRunId)} flow)`,rows:[]},o.set(t.flowRunId,e),a.push(e)}e.rows.push(t)}H.stdout.write(E(i,a,r))}const Yr=F({name:`list`,description:`list recent tasks (by default running + just stopped)`,usage:`List recent tasks across all workspaces, most recent first: running tasks plus
120
+ ones stopped within the last 30 minutes. Older stopped tasks auto-archive and
121
+ move to --archived. Shortcut: \`coder list\`.`,access:`read`,args:{running:v(`show only running tasks`),stopped:v(`show only recently stopped tasks (not yet archived)`),archived:v(`show only archived tasks (auto-archived or via task archive)`),limit:d(`tasks per page (default: 50; all for every task)`),cursor:x(`continue from the previous page cursor`),dir:x(`only tasks launched in that workspace`),...o},run:async({options:e})=>{let{tasks:t}=await import(`./task-CyqtCXo3.js`).then(e=>e.t);return t.list({...e,organization:e.workspace})},next({result:e,args:t}){let n=m(t),r=L(e.items.length?[`Result: coder task result <task-id>${n}`,...t.archived?[]:[`Older tasks: coder task list --archived [--limit N]${n}`]]:e.items.archived?[`${e.items.archived} archived: coder task list --archived [--limit N]${n}`]:[]);return e.next&&r.push(...L([`Next page: coder task list --cursor ${e.next} --limit ${t.limit??50}${t.running?` --running`:``}${t.stopped?` --stopped`:``}${t.archived?` --archived`:``}${t.dir?` --dir ${JSON.stringify(t.dir)}`:``}${n}`],{layout:`plain`})),r},async print(e,{options:t}){let{readFlowRecord:n}=await import(`./executor-DBW7R7Tf.js`).then(e=>e.A);Jr(e.items,t,n)}});function Xr(e,t={}){let n=Y(e,t,`run this in its own background shell, one per task (never wait on several tasks in one call). Returns with the answer or a pending approval.`);n.cli={...n.cli,layout:`rows`,title:`Next step`};let r=m(t);return[n,...[{usage:`coder task steer ${e} "<follow-up>"${r}`,blurb:`steer the task with a message (use 'ask' without interrupting main thread)`},{usage:`coder task stop ${e}${r}`,blurb:`stop the task`},{usage:`coder task list${r}`,blurb:`recent tasks`},{usage:`coder task --help`,blurb:`all task commands`}].map(e=>({...e,cli:{layout:`rows`,title:`Related`}}))]}function Zr(e,t){H.stdout.write(`${A.dim(`[coder]`)} task ${A.blue(e)} started in the background (${t}).\n`)}function Qr(e){H.stderr.write(`${A.dim(`[coder]`)} Task ${A.cyan(e)} started and is waiting to finish. Press Ctrl-C to detach. It keeps running.\n`)}function $r(e){H.stderr.write(`\n${A.dim(`[coder] Detached. The task is still running.`)}\n`)}function ei(e){H.stdout.write(`\n${W({finalMessage:e.finalMessage??void 0},e.error,`(no final message)`)}\n\n`);let t=e.tokens?` tokens=${N(e.tokens,e.model)}`:``;H.stderr.write(`${A.dim(`[coder] task=${e.taskId} status=${e.status}${t}`)}\n`)}const ti=F({name:`run`,description:`run a task (background; --wait blocks)`,usage:`Dispatch a coding task to the configured engine. Backgrounds by default and\nprints a task id locally or with --server; --wait follows it to the answer.\nShortcut: \`coder run "<text>"\`.\n\nWriting a task: one task per focused goal, independent goals as parallel runs.\nThe worker starts with nothing but the text, so include the goal, file paths,\nconstraints and any context only you have. Delegate rather than doing the work\nyourself first, however small it looks.\n\nWaiting: run \`coder task result <task-id> --wait\` in its own background shell, one\nper task. Never wait on several tasks in one call, or their approvals and answers\nnever reach you one by one.\n\n${_e}`,access:`write`,args:{prompt:s(`the task text`),"output-schema":x(`JSON Schema for the task answer`,`<json>`),name:x(`label the task (shown in list/result)`),agent:x(`run as that agent: its system.md, engine settings, MCP servers and flows; flags override them`,`<id>`),"append-system":x(`standing instructions appended to Coder's system prompt (kept out of prompt previews)`,`<text>`),wait:v(`follow the task until the answer is ready`),model:r(),access:x(`read-only also restricts platforms and connections; auto lets the engine review what leaves the sandbox (default: auto)`,`<read-only|auto>`),mcp:x('attach MCP servers from `mcp` in .coder/config.json by name (or all), or an inline JSON array [{"name","command","args","env","tools"}]; none by default, all adds your engine\'s own MCP servers',`<names|all|json>`),connections:x(`use only these connections (coder connection list), within the agent's`,`<ids>`),"add-dir":s(`give the task another directory beyond --cwd (repeatable); read-only can only read it, auto can also write`,`<dir>`),server:g(`run the task on your Coder server and print its id (--wait follows it)`,`[url]`),workspace:x(`with --server: the workspace to run in (default: the saved one)`,`<slug>`),yes:v(`with --server: connect to a server used for the first time without asking`),repo:x(`with --server: check out a repo from the workspace's installs`,`<owner/name>`),runner:x(`with --server: where it runs (a runner kind or a registered runner)`)},cli:{positional:[`prompt`],exit:[[0,`The task started, or --wait printed a successful answer.`],[1,`Dispatch or the task failed.`],[3,`No engine could start; follow fallback.instructions in the JSON payload.`],[4,`An approval is pending; answer it, then run result --wait again.`],[130,`The foreground wait was detached and the task is still running.`]],examples:[`coder run "add a /health endpoint" # dispatch in the background, print a task id`,`coder result <task-id> --wait # then block until it finishes and print the answer`,`coder run --wait "fix the failing test" # or block on the run itself`,`coder task run --model luna --append-system "tests live in test/, don't touch anything outside of it" "rename foo to bar" # pick an engine via its model alias; --append-system adds standing instructions`,`coder task run --agent reviewer "review the last commit" # run a repo agent from .coder/agents/reviewer`,`coder run --add-dir ../api --add-dir ../shared "update the client for the new endpoint" # let the task reach sibling repos too`]},async run({options:e,args:t,tool:n,next:r}){let{tasks:i}=await import(`./task-CyqtCXo3.js`).then(e=>e.t),a=e.json,o;return n||H.on(`SIGINT`,()=>{o&&($r(o),r({taskId:o,phase:`detached`},{stream:`stderr`,force:!0})),H.exit(130)}),i.run(t.join(` `).trim(),{cwd:e.cwd,agent:e.agent,outputSchema:e[`output-schema`]?JSON.parse(e[`output-schema`]):void 0,model:e.model,access:e.access,name:e.name,appendSystem:e[`append-system`],mcp:e.mcp,connections:e.connections?.split(`,`).map(e=>e.trim()).filter(Boolean),addDirs:e[`add-dir`],wait:!!e.wait,repo:e.repo,runner:e.runner,server:e.server,yes:e.yes,organization:e.workspace,onFallback:({model:e,detail:t,next:n})=>H.stderr.write(`[coder] ${e} failed (${t}); falling back to ${n}.\n`),onNote:e=>H.stderr.write(`[coder] ${e}\n`),onWaiting:e=>{o=e,!a&&!n&&(Qr(e),r({taskId:e,phase:`waiting`},{stream:`stderr`,style:`stdout`}))}})},next({result:e,args:t}){let n=e.phase,r=e.taskId;return n===`detached`?[Y(r,t,`Wait in its own background shell, one per task: coder task result ${r} --wait`)]:n===`waiting`?Xr(r,t):t.wait?X(r,t).map(e=>({...e,cli:{...e.cli,stream:`stderr`}})):Xr(r,t)},print(e,{options:t}){t.wait?ei(e):Zr(e.taskId,e.status)},exit:(e,{options:t})=>t.wait?e.status===`completed`?0:1:void 0}),ni=F({name:`stop`,description:`interrupt a running task`,usage:`Interrupt a running task and mark it cancelled.`,access:`write`,args:{"task-id":x(`the task to stop`),...o},cli:{positional:[`task-id`]},run:async({options:e,args:[t]})=>{let{tasks:n}=await import(`./task-CyqtCXo3.js`).then(e=>e.t);return n.stop(t,{...e,organization:e.workspace})},print:({taskId:e,interrupt:t})=>H.stdout.write(`Stopped task ${A.cyan(e)} ${A.dim(`(${t})`)}\n`)}),ri=I({name:`task`,description:`run, follow and steer coding tasks`,commands:[ti,Yr,at,dt,Gr,Kr,ni,Hr,qr,zr,Br],aliases:{stream:`watch`,ls:`list`}}),ii=F({name:`upgrade`,description:`update the CLI and host plugins`,usage:`Update the coder CLI through whichever package manager installed it, then refresh
122
+ the host plugins to match.`,access:`write`,approvalPolicy:`deny`,args:{"cli-only":v(`update just the CLI`),"plugins-only":v(`refresh just the host plugins`),codex:v(`limit the refresh to the Agent Skills copy (Codex, Pi, ...)`),claude:v(`limit the refresh to the Claude Code plugin`),pm:x(`force a package manager instead of auto-detecting`,`<npm|pnpm|yarn|bun>`)},globalFlags:{json:!1,cwd:!1},run:async({options:e,tool:t})=>{let{upgradeCore:n}=await import(`./dispatch-BkoIU4GU.js`).then(e=>e.k);return n({...e,cliOnly:e[`cli-only`],pluginsOnly:e[`plugins-only`]},t?()=>{}:ai)},print:oi});function ai(e){H.stdout.write(`${A.bold(`Updating coder CLI`)} ${A.dim(`${e}...`)}\n`)}function oi(e){let t=A.bold,n=A.dim,r=(e,r)=>r&&e&&r!==e?`${e} ${n(`->`)} ${t(r)}`:`${r??e??`?`} ${n(`(unchanged)`)}`,i=(e,t)=>`${t.installed?T(`${e} ${r(t.from,t.to)} ${n(`- ${t.note}`)}`):M(`${e} ${t.note}`)}\n`;e.cli&&H.stdout.write(e.cli.changed?`${T(`coder CLI ${r(e.cli.from,e.cli.to)}`)}\n`:`${T(`coder CLI ${e.cli.from} ${n(`(already latest)`)}`)}\n`),e.claudePlugin&&H.stdout.write(i(`claude plugin`,e.claudePlugin)),e.agentsSkill&&H.stdout.write(i(`agents skill `,e.agentsSkill))}const si=te({name:ee,description:c,namespaces:[ri,Kn,xt,en,kr,Sr,Et,fr,Gt],commands:[pr,kt,Ar,tn,ii,Jn]}),ci={run:[`task`,`run`],list:[`task`,`list`],result:[`task`,`result`],dash:[`server`,`serve`]};export{ci as SHORTCUTS,si as cli};
@@ -0,0 +1,5 @@
1
+ import{A as e,C as t,E as n,Ea as r,En as i,I as a,O as o,P as s,T as c,_ as l,b as u,g as d,gt as ee,h as f,j as p,k as te,kn as ne,pn as m,x as h,y as re}from"./args-CJsHYWbt.js";import{W as g,bt as ie,p as _,st as v}from"./state-CxAUec80.js";import{t as ae}from"./types-DHBqXFE2.js";import y from"node:path";import b from"node:fs";import x from"node:net";import{createHash as oe}from"node:crypto";function se(e,t){for(let n of Object.values(e??{}))n.repository=t}function ce(e){let t={...e.url?{url:e.url}:{command:e.command,args:e.args??[]},headers:Object.keys(e.headers??{}).sort(),env:Object.keys(e.env??{}).sort()};return oe(`sha256`).update(JSON.stringify(t)).digest(`hex`)}function le(){try{let e=JSON.parse(b.readFileSync(_(`state`,`global`,`mcp-approvals.json`),`utf8`));return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}catch(e){if(e.code===`ENOENT`||e instanceof SyntaxError)return{};throw e}}function ue(e){return le()[ce(e)]===!0}async function de(e,t,n){if(!t)throw Error(`Usage: coder connection approve <name> [--agent <id>]`);let r=V(e).mcp?.[t],i=[];r&&!n&&i.push(r);let{loadAgents:a}=await import(`./load-BtIDghgd.js`).then(e=>e.l),{INTEGRATIONS:o}=await import(`./integrations-DSZSa8Rc.js`).then(e=>e.r);for(let r of await a(e,o,{includeDisabled:!0})){let e=r.definition.mcp?.[t];e&&(!n||r.id===n)&&i.push(e)}if(!i.length)throw Error(`No MCP server "${t}". Use --cwd to select its repository.`);if(i.some(e=>e.connection))throw Error(`MCP server "${t}" uses a connection and needs no repository approval.`);let s=new Set(i.map(ce));if(s.size!==1)throw Error(`MCP server "${t}" has different definitions. Select one with --agent <id>.`);let c=_(`state`,`global`,`mcp-approvals.json`);b.mkdirSync(y.dirname(c),{recursive:!0});let l=le();return l[[...s][0]]=!0,ie(c,l),b.chmodSync(c,384),{name:t,file:c}}function fe(e){return!/\$\{[^}]+\}/.test(e)&&(/^(?:Bearer\s+\S+|ghp_|github_pat_|xox[a-z]-|sk-|lin_api_)/i.test(e)||/^[A-Za-z0-9_+\/.=-]{32,}$/.test(e))}function pe(e,t){if(!t||typeof t!=`object`)return[];let{url:n,headers:r,env:i}=t,a=e=>e&&typeof e==`object`&&!Array.isArray(e)?Object.entries(e).filter(e=>typeof e[1]==`string`):[],o=[];typeof n==`string`&&[n,...a(r).map(([,e])=>e)].some(e=>/\$\{[^}]+\}/.test(e))&&o.push(`MCP server "${e}" keeps remote URL and header variables literal. Use a connection for credentials.`);for(let[t,n]of[[`headers`,r],[`env`,i]])for(let[r,i]of a(n))fe(i)&&o.push(`MCP server "${e}" has a literal secret in ${t}.${r}. Use a connection instead.`);return o}var me=r({ACCESS:()=>ae,ACCESS_MODES:()=>ge,BRIDGE_HEADERS:()=>U,BUILTIN_MODELS:()=>S,CLAUDE_ACCESS_FLAGS:()=>ve,CLAUDE_SANDBOX_UNAVAILABLE_PATTERN:()=>be,CLAUDE_SIDECAR_FLAGS:()=>ye,CONFIG_PATCHES:()=>Ve,CONFIG_SCHEMA_URL:()=>A,CONFIG_VERSION:()=>1,DEFAULT_CONFIG:()=>v,DEFAULT_EFFORT:()=>he,EFFORTS:()=>C,MACHINE_SANDBOX_ENV:()=>xe,MODEL_SPEC_FORMS:()=>T,PUBLIC_REGISTRY_HOSTS:()=>_e,WORKSPACE_CONFIG_ENV:()=>B,accessSchema:()=>w,aliasTarget:()=>X,assertModelEnabled:()=>K,claudeAutoMode:()=>we,claudeTurnSettings:()=>Te,codexTurnNetwork:()=>Fe,config:()=>at,configJsonSchema:()=>Me,configSet:()=>it,configTargetFile:()=>Q,endpointCandidates:()=>Je,isAliasModel:()=>M,isBuiltinAlias:()=>G,isEndpointModel:()=>j,loadConfig:()=>V,mcpEntrySchema:()=>k,migrateConfigFile:()=>Ge,modelName:()=>Z,modelSpecSchema:()=>E,normalizeBaseUrl:()=>H,parseEngineSpec:()=>$e,persistModelPatch:()=>Ke,removeModel:()=>ze,resolveCodexModel:()=>W,resolveCustomModel:()=>Ye,resolveUserConfigFile:()=>R,resolveWorkspaceConfigFile:()=>z,sameModel:()=>et,schemaIssues:()=>N,splitEngineSpec:()=>J,strictestAccess:()=>Ne,toggleModel:()=>Re,turnHosts:()=>Pe,upgradeConfig:()=>P,validateConfig:()=>F,withDefaults:()=>He,writeConfigFile:()=>$,writeUserConfig:()=>tt});const S={luna:`codex/gpt-6-luna`,sol:`codex/gpt-6.1-sol`,astra:`codex/gpt-6-astra`,sonnet:`claude/sonnet`,opus:`claude/opus`,fable:`claude/fable`,codex:`codex/sol`,claude:`claude/opus`},C=new Set([`low`,`medium`,`high`]),he=`medium`,ge={"read-only":{sandbox:`read-only`,approvalPolicy:`never`,approvalMode:null,approvalsReviewer:null},auto:{sandbox:`workspace-write`,approvalPolicy:`on-request`,approvalMode:`auto`,approvalsReviewer:`auto_review`}},_e=[`registry.npmjs.org`,`registry.yarnpkg.com`,`pypi.org`,`files.pythonhosted.org`,`index.crates.io`,`static.crates.io`,`proxy.golang.org`,`sum.golang.org`],ve={"read-only":[`--permission-mode`,`dontAsk`,`--disallowedTools`,`Edit`,`Write`,`MultiEdit`,`NotebookEdit`],auto:[`--permission-mode`,`auto`]},ye=[`--permission-mode`,`dontAsk`,`--disallowedTools`,`Edit`,`Write`,`MultiEdit`,`NotebookEdit`,`Bash`,`WebFetch`,`WebSearch`,`Task`],be=/failIfUnavailable|sandbox\b[^.\n]*?(?:failed|could ?n[o']t|cannot|unavailable|not available|not supported)/i,xe=`CODER_MACHINE_SANDBOX`,Se=new Set([`localhost`,`127.0.0.1`,`::1`,`[::1]`]);function Ce(e){return e.flatMap(e=>x.isIPv6(e)?[`[${e}]`]:e.startsWith(`[`)||e.includes(`:`)||x.isIP(e)?[e]:[e,`*.${e}`])}function we(e,t){return{environment:[`$defaults`,e?`Host containment: an automated coding task on the user's own developer machine with open internet; the working directory is the user's workspace, the task has its own scratch folder under the temp directory, and nothing else on the machine is the task's.`:`Host containment: an automated coding task on a throwaway cloud machine with open internet and no neighbours; nothing on it is the user’s, it holds no cloud identity, and instance-metadata credentials are never task credentials.`,...t.length?[`Trusted internal domains: ${t.join(`, `)}`]:[]],allow:[`$defaults`,`Public Network Reads: fetching public web pages, documentation, search results and downloads, reading package registries, installing packages, and cloning or fetching public repositories into the workspace or the scratch folder are routine, whatever the host, as long as nothing leaves the machine beyond the request itself: no repository content, secrets, environment or user data in the request body, query or headers.`]}}function Te(e,t,n=[],r=[],i=!0,a,o=!0,s,c=[]){let l=r;if(!i)return JSON.stringify({permissions:{additionalDirectories:r,allow:[`Bash`],...e===`read-only`?{deny:[`Edit`,`Write`,`MultiEdit`,`NotebookEdit`]}:{}},sandbox:{enabled:!1}});if(e===`read-only`){let e=Ce(n);return JSON.stringify({...l.length?{permissions:{additionalDirectories:l}}:{},sandbox:{enabled:!0,failIfUnavailable:!0,allowUnsandboxedCommands:!1,autoAllowBashIfSandboxed:!0,network:{strictAllowlist:!0,...e.length?{allowedDomains:e}:{},...c.length?{allowUnixSockets:c}:{}},filesystem:{denyWrite:[t,...r]}}})}let u=[...Ce(n),..._e];return JSON.stringify({...l.length?{permissions:{additionalDirectories:l}}:{},sandbox:{enabled:!0,allowUnsandboxedCommands:!0,autoAllowBashIfSandboxed:!0,network:{allowedDomains:u,...c.length?{allowUnixSockets:c}:{},...n.some(e=>Se.has(e))?{allowLocalBinding:!0}:{}},filesystem:{...a?{allowWrite:[a]}:{},denyWrite:[t,...l].map(e=>y.join(e,`.git`))}},autoMode:we(o,n),...s?{hooks:{PreToolUse:[{matcher:`Bash`,hooks:[{type:`command`,command:s}]}]}}:{}})}f([`codex`,`claude`,`custom`]),f([`low`,`medium`,`high`]);const w=f(ae,{error:`Use read-only or auto`}),T=`Use <name>[/<effort>] or <engine>/<model>[/<effort>], such as sol, sol/low, claude/opus or codex/gpt-6.1-sol/high.`,E=p().check(te(e=>!!Qe(e),T)),Ee=e({baseUrl:a(),model:p().check(m(1)),envKey:c(p().check(m(1))),wireApi:c(f([`chat`,`responses`])),contextWindow:c(t().check(u(),i())),disabled:c(l())}),De=s([E,h(!1),Ee]),D=e({allowedHosts:d(p()),readOnlyTasks:c(l())}),O=p().check(ne(/^[a-z0-9][a-z0-9_-]*$/i,`agent or flow name`)),Oe=e({allowedEvents:c(d(p()))}),ke=s([l(),e({model:c(E),access:c(w),runner:c(f([`local`,`local-docker`,`vercel-sandbox`,`github-actions`])),integrations:c(o(p(),Oe)),connections:c(d(p())),disabled:c(l())})]),k=e({connection:c(p().check(m(1))),command:c(p().check(m(1))),args:c(d(p())),env:c(o(p(),p())),url:c(p().check(m(1))),type:c(f([`stdio`,`http`],{error:`Use type stdio or http; legacy SSE servers are not supported, use their streamable HTTP URL`})),headers:c(o(p(),p())),tools:c(d(p())),description:c(p()),connect:c(f([`start`,`first-use`]))}).check(te(e=>e.connection?[e.url,e.command,e.args,e.env,e.headers,e.type].every(e=>e===void 0):!!e.command!=!!e.url,`Use a connection alone, without url, command, args, env, headers or type; otherwise supply one of command or url`)),Ae=e({$schema:c(p()),version:h(1),chain:d(E).check(m(1)),reviewModel:E,models:c(o(p().check(ne(/^[a-z0-9][a-z0-9./_-]*$/i,`model name`)),De)),agents:c(o(O,ke)),mcp:c(o(O,k)),network:D}),je=n(re(Ae,{network:n(D)})),A=`https://coder.wular.ai/schema/config.v1.json`,Me=()=>({$id:A,...ee(je,{unrepresentable:`any`})});function j(e){return typeof e==`object`&&!!e}function M(e){return typeof e==`string`}function Ne(...e){return e.includes(`read-only`)?`read-only`:`auto`}const Pe=(e,t)=>e===`auto`||t.readOnlyTasks?t.allowedHosts:[];function Fe(e,t){let n=e===`auto`;if(n||!t.length)return{networkAccess:n,configOverrides:{}};let r=t.map(e=>{let t=e.replace(/^\[(.*)\](?::\d+)?$/,`$1`).replace(/^([^:]+):\d+$/,`$1`);return[x.isIP(t)||Se.has(t)?t:`**.${t}`,`allow`]});return{networkAccess:!0,configOverrides:{"features.network_proxy.enabled":!0,"features.network_proxy.domains":Object.fromEntries(r)}}}const Ie=/^(?!-)[a-z0-9-]{1,63}(?<!-)(?:\.(?!-)[a-z0-9-]{1,63}(?<!-))*(?::\d{1,5})?$/i;function Le(e){if(x.isIP(e))return!0;let t=/^\[([^\]]+)\](?::\d{1,5})?$/.exec(e);return t?x.isIPv6(t[1]):e.length<=253&&Ie.test(e)}function Re(e,t,n){let r=e[t];if(n&&typeof r==`string`)throw Error(`Alias "${t}" can't be turned off; remove it instead.`);j(r)?n?r.disabled=!0:delete r.disabled:n?e[t]=!1:r===!1&&delete e[t]}function ze(e,t){delete e.models?.[t];let n=e=>!q(t)&&typeof e==`string`&&e.split(`/`).slice(0,2).includes(t);n(e.reviewModel)&&delete e.reviewModel;let r=e.chain?.filter(e=>!n(e));r?.length?e.chain=r:delete e.chain}function N(e,t=[]){return e.flatMap(e=>e.code===`invalid_union`?e.errors.flatMap(n=>N(n,[...t,...e.path])):[`${[...t,...e.path].map(String).join(`.`)||`(root)`}: ${e.code===`unrecognized_keys`?`Unrecognized ${e.keys.length===1?`key`:`keys`}: ${e.keys.map(e=>JSON.stringify(e)).join(`, `)}`:e.message}`])}function Be(e){let t=structuredClone(e),n=[],r=(e,t)=>{if(typeof e!=`string`||!e.includes(`:`))return e;let r=e.replaceAll(`:`,`/`);return n.push(`${t}: "${e}" is now "${r}"`),r},i=(e,t,n)=>[e,t??(n?J(S[e]).model:void 0),n].filter(Boolean).join(`/`),a={...t.models};for(let[e,t]of Object.entries(a))typeof t==`string`&&(a[e]=r(t,`models.${e}`)),!(!t||typeof t!=`object`||`baseUrl`in t)&&(`provider`in t||`model`in t?(a[e]=t.disabled?!1:`provider`in t?i(t.provider,t.model,t.effort):String(r(t.model,`models.${e}`)),n.push(`models.${e}: the alias is now ${JSON.stringify(a[e])}`)):t.disabled===!0?(a[e]=!1,n.push(`models.${e}: the toggle is now false`)):(delete a[e],n.push(`models.${e}: an enable toggle is not needed and was removed`)));let o={};for(let[e,r]of Object.entries(t.engines??{})){let{model:t,effort:s}=r??{};(t||s)&&a[e]===void 0&&(t||e!==`custom`)&&(a[e]=i(e,t,s),n.push(`engines.${e}: its model is now the alias models.${e} = "${a[e]}"`)),e===`codex`&&r?.network===!0?(o.readOnlyTasks=!0,n.push(`engines.codex.network is now network.readOnlyTasks, for every engine`)):e===`codex`&&r?.network===!1&&n.push(`engines.codex.network: false was removed; auto tasks keep their network`)}if(delete t.engines,t.approvals&&typeof t.approvals==`object`){let{allowedNetworkHosts:e,...r}=t.approvals;e&&(o.allowedHosts=e,n.push(`approvals.allowedNetworkHosts is now network.allowedHosts`)),Object.keys(r).length?t.approvals=r:delete t.approvals}Object.keys(o).length&&(t.network={...t.network,...o}),Object.keys(a).length&&(t.models=a),Array.isArray(t.chain)&&(t.chain=t.chain.map((e,t)=>r(e,`chain.${t}`))),t.reviewModel&&=r(t.reviewModel,`reviewModel`);for(let[e,o]of Object.entries(t.agents??{}))if(!(!o||typeof o!=`object`))if(o.engine||o.effort){let{engine:r,model:s,effort:c,...l}=o,u=r??(typeof a[s]==`string`?void 0:Y(s,{models:a}));t.agents[e]={...l,model:i(u,s,c)},n.push(`agents.${e}: its engine, model and effort are now model "${t.agents[e].model}"`)}else o.model&&=r(o.model,`agents.${e}.model`);return t.version=1,{config:t,notes:n}}const Ve=[Be];function P(e){let t=typeof e.version==`number`?e.version:0;if(t>1)throw Error(`Written by a newer Coder (config version ${t}); run coder upgrade.`);let n=e,r=[];for(let e of Ve.slice(t)){let t=e(n);n=t.config,r.push(...t.notes)}return{config:n,notes:r,version:t}}function F(e){let t=je.safeParse(e);if(!t.success)return N(t.error.issues);let n=L(v,t.data),r=[];for(let[e,n]of(t.data.network?.allowedHosts??[]).entries())Le(n)||r.push(`network.allowedHosts.${e}: "${n}" is not a host name or IP address`);for(let[e,i]of Object.entries(t.data.models??{})){if(C.has(e)){r.push(`models.${e}: ${e} is an effort, not a model name`);continue}let t=M(i)?X(i,n):void 0,a=t?.model?n.models?.[t.model]:void 0;if(q(e)){t?.engine===e?e===`custom`&&!(a&&j(a))&&r.push(`models.custom: "${t.model??``}" names no custom model`):r.push(`models.${e}: The ${e} alias names a ${e} model, such as ${e}/<model>`);continue}if(t?.engine===`custom`){r.push(`models.${e}: Only custom aliases a custom model`);continue}a&&!j(a)&&r.push(`models.${e}: alias target "${t.model}" is itself a config entry`)}return r}function I(e){if(!b.existsSync(e))return null;try{return JSON.parse(b.readFileSync(e,`utf8`))}catch(t){let n=t instanceof Error?t.message:String(t);throw Error(`Invalid JSON in ${e}: ${n}`)}}function He(e){return L(v,e)}function L(e,t){if(!t||typeof t!=`object`||Array.isArray(t))return t??e;let n={...e},r=e;for(let[e,i]of Object.entries(t))n[e]=i&&typeof i==`object`&&!Array.isArray(i)&&r?.[e]&&typeof r[e]==`object`?L(r[e],i):i;return n}function R(){return _(`config.json`)}function z(e){return y.join(e,`.coder`,`config.json`)}const B=`CODER_WORKSPACE_CONFIG`;function Ue(e,t){let n=t.network?.allowedHosts?.filter(t=>e.network.allowedHosts.includes(t)),r=Object.entries(t.models??{}).filter(([,e])=>e===!1||j(e)&&e.disabled);return{...t.mcp?{mcp:t.mcp}:{},...t.chain?{chain:t.chain.filter(t=>e.chain.includes(t))}:{},...t.reviewModel?{reviewModel:t.reviewModel}:{},models:Object.fromEntries(r.map(([e])=>[e,!1])),...n?{network:{...e.network,allowedHosts:n}}:{}}}function We(e,t,n){let{config:r,version:i}=P(t);return i===1||!e.endsWith(`.json`)?r:n?(process.stderr.write(`${e} is config version ${i}; coder config migrate rewrites it.\n`),r):(b.copyFileSync(e,`${e}.bak`),b.writeFileSync(e,`${JSON.stringify(r,null,2)}\n`,`utf8`),process.stderr.write(`Updated ${e} to config version 1; the old one is ${e}.bak.\n`),r)}function Ge(e,t){let n=Q(e,t),r=I(n);if(!r)return{file:n,version:1,notes:[]};let{config:i,notes:a,version:o}=P(r),s=F(i);if(s.length)throw Error(`Invalid config in ${n}:\n ${s.join(`
2
+ `)}`);return o!==1&&b.writeFileSync(n,`${JSON.stringify(i,null,2)}\n`,`utf8`),{file:n,version:o,notes:a}}function V(e){let t=g(e),n=process.env[B],r=[[R(),I(R())],...n?[[`the workspace config`,JSON.parse(n)]]:[]],i=z(t);r.push([i,I(i)]);let a=v,o=new Set;for(let[e,t]of r){if(!t)continue;let r=We(e,t,e===i),s=F(r);if(s.length)throw Error(`Invalid config in ${e}:\n ${s.join(`
3
+ `)}`);let c=n&&e===i?Ue(a,r):r,l={...a.mcp,...c.mcp};for(let t of Object.keys(c.mcp??{}))e===i?o.add(t):o.delete(t);a={...L(a,c),...Object.keys(l).length?{mcp:l}:{}}}let s=F(a);if(s.length)throw Error(`Invalid merged config:\n ${s.join(`
4
+ `)}`);for(let[e,t]of Object.entries(a.mcp??{}))se({[e]:t},o.has(e));return a}function H(e){return e.replace(/\/+$/,``).replace(/\/(chat\/completions|completions|responses)$/,``)}function Ke(e,t,n){let r=[z(g(e)),R()];for(let e of r){let r;try{r=I(e),r&&=P(r).config}catch{continue}if(j(r?.models?.[t]))return Object.assign(r.models[t],n),!F(r).length&&(b.writeFileSync(e,`${JSON.stringify(r,null,2)}\n`,`utf8`),!0)}return!1}function qe(e){return/\/(chat\/completions|completions|responses)\/*$/.test(e)}function Je(e,t){let n=H(e);return qe(e)||/\/v\d+(alpha|beta)?$/.test(n)?[`${n}/${t}`]:[`${n}/${t}`,`${n}/v1/${t}`]}const U={baseUrl:`x-coder-base-url`,wireApi:`x-coder-wire-api`};function Ye(e,t,n){let r=t.envKey?process.env[t.envKey]:void 0;if(t.envKey&&!r)throw Error(`Missing environment variable: \`${t.envKey}\`.`);let i=`coder-${e}`;return{modelProvider:i,configOverrides:{[`model_providers.${i}`]:{name:e,base_url:`${n}/v1`,wire_api:`responses`,http_headers:{[U.baseUrl]:t.baseUrl,[U.wireApi]:t.wireApi??`chat`,...r?{authorization:`Bearer ${r}`}:{}}},...t.contextWindow?{model_context_window:t.contextWindow}:{}}}}function W(e){if(!e)return null;let[t,n]=(S[e]??``).split(`/`);return t===`codex`&&n?n:e}function G(e){return Object.hasOwn(S,e)}function Xe(e,t){let n=e.models?.[t];return n===void 0?G(t)?S[t]:void 0:M(n)?n:void 0}function Ze(e,t){let n=t?e.models?.[t]:void 0;return n===!1||j(n)&&!!n.disabled}function K(e,t){if(Ze(e,t))throw Error(`model "${t}" is disabled in config`)}const q=e=>e===`codex`||e===`claude`||e===`custom`;function Qe(e){let t=e.split(`/`).map(e=>e.trim()),[n,r,i]=t,a=e=>!!(e&&C.has(e));if(!n||a(n)||t.length>3)return;let o=q(n)?{engine:n}:{model:n};if(t.length===1)return o;if(t.length===2&&a(r))return{...o,effort:r};if(!q(n)||!r||a(r))return;let s=S[r];if(!(s&&!s.startsWith(`${n}/`))&&!(i!==void 0&&!a(i)))return{engine:n,model:r,...i?{effort:i}:{}}}function J(e){let t=Qe(e);if(!t)throw Error(`Invalid model "${e}". ${T}`);return t}function $e(e,t){if(!e)return null;let n=J(String(e).trim()),r=n.engine??null,i=n.model??null,a=n.effort??null;K(t,i??r);let o=Xe(t,i??r??``);if(o){let e=X(o,t),s=e.engine;if(r&&r!==s)throw Error(`Alias "${i??r}" runs on ${s}, not ${r}.`);r=s,a=n.effort??e.effort??null,i=e.model??null}r??=Y(i??void 0,t),K(t,i);let s=r===`codex`?W(i):i;return K(t,s),{engine:r,model:s,effort:a??`medium`}}function Y(e,t){return j(e?t.models?.[e]:void 0)?`custom`:e&&/^(?:claude-|opus|sonnet|haiku|fable)/i.test(e)?`claude`:`codex`}function X(e,t){let n=J(e);return{...n,engine:n.engine??Y(n.model,t)}}function Z(e){let t=`${e.engine}/${e.model}`;return Object.keys(S).find(e=>!q(e)&&S[e]===t)??e.model??e.engine}function et(e,t){return e.engine===t.engine&&W(e.model)===W(t.model)}function tt(e){let t=R();return b.mkdirSync(y.dirname(t),{recursive:!0}),b.writeFileSync(t,`${JSON.stringify({...e,version:1},null,2)}\n`,`utf8`),t}function nt(e,t){return t.split(`.`).reduce((e,t)=>e?.[t],e)}function Q(e,t){return t?z(g(e)):R()}function rt(e,t){let n=V(e);return t?nt(n,t):n}function it(e,t,n,r={}){let i=Q(e,r.workspace);$(i,e=>{let i=t.split(`.`),a=i.at(-1),o=e;for(let e of i.slice(0,-1))(typeof o[e]!=`object`||o[e]===null)&&(o[e]={}),o=o[e];r.unset?delete o[a]:o[a]=n});let a=nt(V(e),t)??null;return{file:i,key:t,...r.unset?{unset:!0}:{value:n},effective:a}}function $(e,t){let n=P(b.existsSync(e)?JSON.parse(b.readFileSync(e,`utf8`)):{}).config;t(n),n.models&&Object.keys(n.models).length===0&&delete n.models;let r=F(n);if(r.length)throw Error(`Refusing to write invalid config:\n ${r.join(`
5
+ `)}`);b.mkdirSync(y.dirname(e),{recursive:!0}),b.writeFileSync(e,`${JSON.stringify(n,null,2)}\n`,`utf8`)}const at={get:(e,t={})=>rt(y.resolve(t.cwd??`.`),e),set:(e,t,n={})=>it(y.resolve(n.cwd??`.`),e,t,n)};export{Ke as A,Re as B,j as C,E as D,Z as E,z as F,$ as G,P as H,et as I,de as J,tt as K,N as L,W as M,Ye as N,H as O,R as P,J as R,G as S,k as T,F as U,Pe as V,He as W,fe as X,ue as Y,pe as Z,Me as _,be as a,Je as b,C as c,w as d,X as f,at as g,Fe as h,ve as i,ze as j,$e as k,xe as l,Te as m,U as n,ye as o,K as p,se as q,S as r,A as s,ge as t,B as u,Q as v,V as w,M as x,me as y,Ne as z};
@@ -0,0 +1 @@
1
+ import{Ea as e}from"./args-CJsHYWbt.js";import{t}from"./errors-DK_trCff.js";import{t as n}from"./types-DHBqXFE2.js";import{J as r,Y as i,w as a}from"./config-_32PHl9g.js";import{n as o,o as s}from"./remote-CY-qYX2C.js";import c from"node:path";import l from"node:process";import{createHash as u}from"node:crypto";var d=e({connection:()=>O});const f=(e,n)=>new t(`invalid-option`,e,n?{hint:n}:{}),p=e=>e.cwd?c.resolve(e.cwd):l.cwd(),m=e=>e.server!==void 0,h=e=>o({...e,organization:e.organization??e.workspace}),g=e=>h(e).connections,_=()=>f(`Signing in needs a Coder server.`,`Repeat with --server <url>, or add it in coder dash`);async function v(e){let[{LocalStore:n},{INTEGRATIONS:r},i]=await Promise.all([import(`./local-BzMvgiwL.js`).then(e=>e.r),import(`./integrations-DSZSa8Rc.js`).then(e=>e.r),import(`./apps-BORri-28.js`).then(e=>e.Ut)]),a={store:new n,config:{store:`memory`,runner:`local`},integrations:r,organizationId:`default`,local:{cwd:e,port:0}},o=async e=>{try{return await e()}catch(e){throw e instanceof i.ConnectionError?new t(`invalid-option`,e.message,{needs:e.needs}):e}};return{ctx:a,list:()=>i.connectionRows(a),add:e=>o(()=>i.addConnection(a,e)),update:(e,t)=>o(()=>i.changeConnection(a,e,t)),remove:e=>o(()=>i.removeConnection(a,e))}}const y=e=>e.owner?{...e,id:e.id.slice(e.owner.id.length+1)}:e,b=e=>`${y(e).id}${e.owner?` --personal`:``}`;async function x(e){return m(e)?g(e).list():(await v(p(e))).list()}async function S(e,t){if(m(e))return(await h(e).credentials.list()).some(n=>n.name===t&&(e.personal||n.scope===`workspace`));let{parseCredentialId:n}=await import(`./apps-BORri-28.js`).then(e=>e.Jt),{ctx:r}=await v(p(e));return(await r.store.list(`credential`)).some(e=>n(e.id).name===t)}async function C(e,t){let n=e.key??(await e.askKey?.())?.trim();if(!n)throw f(`${t} needs a key.`,`Give it with --key, on stdin or at the prompt`);return n}async function w(e,t,n,r){let i=new URL(n,s(e)),a=i.searchParams.get(`state`)??i.searchParams.get(`attempt`);if(!a)throw f(`Sign-in did not start.`);let o=u(`sha256`).update(a).digest(`hex`);e.onAuthorize(i.href);let c=Date.now()+6e5;for(;Date.now()<c;){let n=(await g(e).list(o,t)).find(e=>e.id===t);if(!n)throw f(`The connection was removed before sign-in finished.`);if(n.status===`connected`)return y(n)}throw f(`Sign-in did not finish.`,`Try again: coder connection reconnect ${r}`)}async function T(e,t){let[r,...i]=t.command??[],a=t.access&&{access:t.access},o=t.personal?{scope:`personal`}:{};if(r&&t.url)throw f(`Use either --url or a command, not both.`);if(t.access&&!n.includes(t.access))throw f(`Invalid --access value.`,`Use read-only or auto`);if(r||t.url){let n=t.auth??(t.key?`key`:t.url?void 0:`none`);if(n!==void 0&&![`oauth`,`key`,`none`].includes(n))throw f(`Invalid --auth value.`,`Use oauth, key or none`);if(n===`oauth`&&!m(t))throw _();if(r&&n===`key`&&!t.env)throw f(`Name the variable the key goes in with --env.`);let s=t.tools?.length?{tools:t.tools}:{};return{name:e,provider:`mcp`,...o,...a,...n?{auth:n}:{},endpoint:t.url?{url:t.url,...s}:{command:r,...i.length?{args:i}:{},...s},...n===`key`?{key:await C(t,e),keyIn:t.url?{header:t.header??`Authorization`}:{env:t.env}}:{}}}if(t.env){let n=t.key??(t.credential||await S(t,t.env)?void 0:l.env[t.env]??await C(t,e));return{name:e,provider:`env`,...o,keyIn:{env:t.env},...n?{key:n}:{},...t.credential?{credential:t.credential}:{}}}let{INTEGRATIONS:s}=await import(`./integrations-DSZSa8Rc.js`).then(e=>e.r);if(!m(t)&&!s[e]?.auth.user)throw f(`Say what to connect.`,`Give --env <NAME> for an API key, --url <url> or -- <command> for an MCP server, or a platform name`);if(!m(t))throw _();if(t.personal)throw f(`--personal applies to MCP servers and task secrets.`);return{name:e,provider:e}}async function E(e,t){if(!e)throw f(`Name the connection.`,`See them: coder connection list`);let n=(await x(t)).find(n=>!n.agent&&(t.personal?n.asker&&y(n).id===e:!n.owner&&n.id===e));if(!n)throw f(`No ${t.personal?`personal `:``}connection "${e}".`,`See them: coder connection list`);return n}async function D(e){let{loadAgents:t}=await import(`./load-BtIDghgd.js`).then(e=>e.l),{INTEGRATIONS:n}=await import(`./integrations-DSZSa8Rc.js`).then(e=>e.r),r=(e,t,n)=>({name:e,source:t,target:n.connection?`connection ${n.connection}`:n.url??[n.command,...n.args??[]].join(` `),approved:!!n.connection||i(n)}),o=(e={})=>Object.entries(e).filter(([,e])=>e.repository);return[...o(a(e).mcp).map(([e,t])=>r(e,`repo`,t)),...(await t(e,n,{includeDisabled:!0})).flatMap(e=>o(e.definition.mcp).map(([t,n])=>r(t,`agent ${e.id}`,n)))]}const O={async add(e,n={}){if(!e)throw f(`Name the connection.`,`Usage: coder connection add <name> ...`);let r=await T(e,n),i=m(n)?g(n):await v(p(n)),a;try{a=await i.add(r)}catch(o){if(!(o instanceof t)||o.needs!==`key`||!r.endpoint?.url||r.auth||r.key||!n.askKey)throw o;a=await i.add({...r,auth:`key`,key:await C(n,e),keyIn:{header:n.header??`Authorization`}})}return a.authorize&&n.onAuthorize?w(n,a.id,a.authorize,b(a)):y(a)},async list(e={}){let t=(await x(e)).map(y);return m(e)?{connections:t}:{connections:t,declared:await D(p(e))}},async remove(e,t={}){let n=await E(e,t);return m(t)?await g(t).remove(n.id):await(await v(p(t))).remove(n.id),y(n)},async reconnect(e,t={}){let n=await E(e,t);if(n.auth===`oauth`){if(!m(t))throw _();let{url:e}=await g(t).authorize(n.id);return t.onAuthorize?w(t,n.id,e,b(n)):{...y(n),authorize:e}}if(n.auth!==`key`)throw f(`${n.name} uses no key or sign-in.`);let r=await C(t,n.name);return y(m(t)?await g(t).update(n.id,{key:r}):await(await v(p(t))).update(n.id,{key:r}))},approve:(e,t={})=>r(p(t),e,t.agent)};export{d as n,O as t};
@@ -0,0 +1,2 @@
1
+ import{C as e,Ea as t,Gt as n,T as r,j as i,k as a,pn as o,w as s}from"./args-CJsHYWbt.js";import{at as c,nt as l,p as u,rt as d,yt as f}from"./state-CxAUec80.js";import{z as ee}from"./config-_32PHl9g.js";import p from"node:path";import m from"node:fs";import{execFileSync as h}from"node:child_process";import{createHash as g}from"node:crypto";const _=i().check(o(1)),te=s({access_token:_,token_type:i().check(a(e=>e.toLowerCase()===`bearer`)),refresh_token:r(_),expires_in:r(e().check(n(0))),scope:r(i()),name:r(_),preferred_username:r(_),email:r(_)}),ne=s({error:_,error_description:r(i())});function v(e){let t=new URL(e),n=t.hostname===`localhost`||t.hostname===`[::1]`||/^127\.(?:\d{1,3}\.){2}\d{1,3}$/.test(t.hostname);if(t.protocol!==`https:`&&!(t.protocol===`http:`&&n)||t.username||t.password||t.hash)throw Error(`OAuth URLs require HTTPS or loopback and no credentials or fragment.`);return t}async function y(e,t,n={}){let r=v(t).origin;for(let i=0;i<5;i++){let i=await e(t,{...n,redirect:`manual`,signal:n.signal??AbortSignal.timeout(15e3)});if(i.status<300||i.status>=400)return i;let a=i.headers.get(`location`);if(!a)throw Error(`OAuth redirect has no location.`);let o=v(new URL(a,t).href);if(o.origin!==r)throw Error(`OAuth redirect changed origin.`);if(await i.body?.cancel(),i.status===303||(i.status===301||i.status===302)&&n.method===`POST`)throw Error(`OAuth redirect would discard the request body.`);t=o.href}throw Error(`Too many OAuth redirects.`)}function b(e,t){let n=new Headers({"content-type":`application/x-www-form-urlencoded`,accept:`application/json`}),r=e.tokenEndpointAuthMethod??(e.clientSecret?`client_secret_basic`:`none`);if(r!==`none`&&!e.clientSecret)throw Error(`OAuth client secret is missing.`);if(r===`client_secret_basic`){let t=e=>new URLSearchParams({v:e}).toString().slice(2);n.set(`authorization`,`Basic ${Buffer.from(`${t(e.clientId)}:${t(e.clientSecret)}`).toString(`base64`)}`)}else t.set(`client_id`,e.clientId),r===`client_secret_post`&&t.set(`client_secret`,e.clientSecret);return n}async function x(e,t,n){n.set(`resource`,t.resource);let r=b(t,n),i=await y(e,t.tokenEndpoint,{method:`POST`,headers:r,body:n}),a=await i.json();if(!i.ok){let e=ne.safeParse(a),t={status:i.status,...e.success?e.data:{}};throw n.get(`grant_type`)===`refresh_token`&&i.status>=400&&i.status<500&&e.success&&[`invalid_grant`,`invalid_client`].includes(e.data.error)?new E(`The OAuth connection must be reconnected.`,{cause:t}):Error(`OAuth token request failed.`,{cause:t})}return te.parse(a)}function S(e,t,n){return{...e,accessToken:t.access_token,refreshToken:t.refresh_token??e.refreshToken,expiresAt:t.expires_in===void 0?void 0:n+t.expires_in*1e3,scope:t.scope??e.scope}}async function C(e){let{secret:t,now:n}=e;if(!e.force&&t.accessToken&&(t.expiresAt===void 0?!t.refreshToken:t.expiresAt-n>=6e4))return t.accessToken;if(!t.refreshToken)throw new E(`The OAuth connection must be reconnected.`);let r=S(t,await x(e.fetch,t,new URLSearchParams({grant_type:`refresh_token`,refresh_token:t.refreshToken})),n);return await e.save(r),r.accessToken}const w=e=>g(`sha256`).update(e).digest(`hex`).slice(0,16);function T(e,t){return{...e,...t instanceof Error&&`error`in t&&typeof t.error==`string`?{code:t.error}:{},...t instanceof Error&&t.cause&&typeof t.cause==`object`?t.cause:{},reason:t instanceof Error?t.message:String(t)}}var E=class extends Error{},re=t({ConnectionRefused:()=>D,LocalConnections:()=>B,connectionDescription:()=>J,connectionEnvConflicts:()=>k,connectionEnvironment:()=>Z,connectionEnvironmentKey:()=>A,connectionMcp:()=>X,connectionRevoked:()=>N,connectionServerName:()=>Y,connectionToolName:()=>I,connectionUrlAllowed:()=>L,connectionVariables:()=>M,connectionWarning:()=>P,credentialField:()=>K,engineEnvironment:()=>j,localConnectionToken:()=>ie,localConnections:()=>Q,mcpClient:()=>U,narrowConnections:()=>O,withCredential:()=>q}),D=class extends Error{authenticate;constructor(e,t){super(e),this.authenticate=t}};function O(e,t){return t?e?t.filter(t=>e.includes(t)):t:e}function k(e){let t=new Set,n=new Set;for(let r of e){if(r.provider!==`env`||!r.keyIn||!(`env`in r.keyIn))continue;let e=r.keyIn.env;t.has(e)&&n.add(e),t.add(e)}return n}function A(e=process.env){let t=Object.entries(d(e)).sort(([e],[t])=>e.localeCompare(t));return t.length?g(`sha256`).update(JSON.stringify(t)).digest(`hex`):void 0}function j(e=process.env){return{...Object.fromEntries(Object.entries(e).filter(([e])=>!e.startsWith(`CODER_CONNECTION_`)&&!/^APP_TOKEN(?:_|$)/.test(e)&&![`CODER_MCP_CONNECTION_ENV`,`CODER_REPLY_URL`,`CODER_REPLY_TOKEN`,`CODER_TASK_TOKEN`].includes(e))),...Object.fromEntries(Object.entries(d(e)).filter(([t])=>e[t]===void 0))}}function M(e){let t={};for(let n of Object.values(e))for(let[e,r]of Object.entries(n.env??{}))t[e]=Object.hasOwn(t,e)?null:r;return t}const N=e=>e instanceof D||e instanceof E,P=(e,t)=>N(t)?`${e} needs reconnecting.`:`${e} is temporarily unavailable; skipped for this task.`;function F(e){if(e.status===401||e.status===403)throw new D(`MCP credential was refused`,e.headers.get(`www-authenticate`)??void 0);if(!e.ok)throw Error(`MCP did not answer`)}const I=e=>/^[a-zA-Z0-9_.-]{1,128}$/.test(e);function L(e,t){return!e.username&&!e.password&&(t||!/^(?:(?:[a-z0-9_-]+\.)*localhost\.?|127\.\d+\.\d+\.\d+|\[::1\]|\[::ffff:7f[0-9a-f]{2}:[0-9a-f]{1,4}\])$/i.test(e.hostname))&&(e.protocol===`https:`||e.protocol===`http:`&&[`localhost`,`127.0.0.1`,`[::1]`].includes(e.hostname))}function R(e,t){try{return JSON.parse(m.readFileSync(e,`utf8`))}catch(e){if(e.code===`ENOENT`)return t;throw e}}function z(e,t){m.mkdirSync(p.dirname(e),{recursive:!0});let n=`${e}.${process.pid}.tmp`;try{m.writeFileSync(n,`${JSON.stringify(t,null,2)}\n`,{mode:384}),m.chmodSync(n,384),m.renameSync(n,e)}finally{m.rmSync(n,{force:!0})}}var B=class{secrets;file;credentialFile;lock;constructor(e=u(),t=process.platform,n){this.file=p.join(e,`connections.json`),this.credentialFile=p.join(e,`local-credentials.json`),this.lock=p.join(e,`state`,`global`,`connections.lock`);let r=p.join(e,`credentials.json`);this.secrets=n??(t===`darwin`?{get(e){try{return h(`security`,[`find-generic-password`,`-s`,`coder`,`-a`,e,`-w`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`pipe`]}).trimEnd()}catch(e){if(e.status===44)return;throw Error(`Could not read the connection keychain`)}},put(e,t){try{let n=e=>`"`+e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`)+`"`;if(/[\r\n\0]/.test(e+t))throw Error(`Invalid keychain value`);h(`security`,[`-i`],{input:`add-generic-password -U -s coder -a ${n(e)} -w ${n(t)}\n`,stdio:[`pipe`,`pipe`,`pipe`]})}catch{throw Error(`Could not save the connection keychain`)}},delete(e){try{h(`security`,[`delete-generic-password`,`-s`,`coder`,`-a`,e],{stdio:[`ignore`,`pipe`,`pipe`]})}catch(e){if(e.status!==44)throw Error(`Could not remove the connection keychain`)}}}:{get:e=>R(r,{})[e],put(e,t){z(r,{...R(r,{}),[e]:t})},delete(e){let t=R(r,{});delete t[e],z(r,t)}})}async withLock(e,t){let n=t===void 0?this.lock:`${this.lock}-${g(`sha256`).update(t).digest(`hex`)}`;return f(n,e)}list(){return Object.values(R(this.file,{}))}get(e){let t=this.list().find(t=>t.id===e);if(!t)return;let n;try{n=t.auth===`none`?void 0:this.secrets.get(e)}catch{return{...t,broken:{at:Date.now(),reason:`Needs reconnecting`}}}return{...t,...n?{secret:n}:{}}}put(e){if(e.provider===`env`&&(e.auth!==`key`||e.access!==`auto`||e.endpoint||e.secret||!e.credential||!e.keyIn||!(`env`in e.keyIn)||!l(e.keyIn.env)))throw Error(`Invalid environment connection`);let{secret:t,...n}=e,r=R(this.file,{});t?this.secrets.put(e.id,t):r[e.id]?.auth!==`none`&&r[e.id]&&this.secrets.delete(e.id),r[e.id]=n,z(this.file,r)}delete(e){let t=R(this.file,{}),n=t[e]&&t[e].auth!==`none`;delete t[e],z(this.file,t),n&&this.secrets.delete(e)}credentials(){return Object.entries(R(this.credentialFile,{})).flatMap(([e,t])=>{let n=this.secrets.get(`credential/${e}`);return n?[{id:e,value:{...t,...JSON.parse(n)}}]:[]})}credential(e){let t=R(this.credentialFile,{})[e];if(!t)return;let n=this.secrets.get(`credential/${e}`);return n?{...t,...JSON.parse(n)}:void 0}putCredential(e,t){let{iv:n,tag:r,ciphertext:i,...a}=t;this.secrets.put(`credential/${e}`,JSON.stringify({iv:n,tag:r,ciphertext:i})),z(this.credentialFile,{...R(this.credentialFile,{}),[e]:a})}deleteCredential(e){let t=R(this.credentialFile,{});delete t[e],z(this.credentialFile,t),this.secrets.delete(`credential/${e}`)}};const V=`2026-07-28`,H=e=>/^[\x21-\x7E]([\x20-\x7E]*[\x21-\x7E])?$/.test(e)?e:`=?base64?${Buffer.from(e).toString(`base64`)}?=`;async function U(e,t=fetch,n){let r=`2025-11-25`,i={name:`coder`,version:`1`},a=e=>n?Promise.race([e,new Promise((e,t)=>{let r=()=>t(n.reason??Error(`MCP startup timed out`));n.aborted&&r(),n.addEventListener(`abort`,r,{once:!0})})]):e,o=await a(e.command?W(e):G(e,t,()=>r)),s=1,c=(e,t,n)=>o.rpc(e,r===V?{...t,_meta:{"io.modelcontextprotocol/protocolVersion":r,"io.modelcontextprotocol/clientInfo":i,"io.modelcontextprotocol/clientCapabilities":{}}}:t,s++,n),l,u={initialize:()=>l??=a(c(`initialize`,{protocolVersion:r,capabilities:{},clientInfo:i},n).then(async e=>(r=e?.protocolVersion??r,await o.rpc(`notifications/initialized`),{instructions:e?.instructions,serverInfo:e?.serverInfo}),async e=>{if(e instanceof D)throw e;r=V;let t=await c(`server/discover`,{},n).catch(()=>{throw e});if(!t?.supportedVersions?.includes(V))throw e;return{instructions:t.instructions,serverInfo:t.serverInfo}})),async tools(){await u.initialize();let e=[],t=new Set,r;do{let i=await a(c(`tools/list`,r===void 0?{}:{cursor:r},n));if(!Array.isArray(i?.tools))throw Error(`Invalid tools`);if(e.push(...i.tools.filter(e=>typeof e.name==`string`)),r=i.nextCursor,r!==void 0){if(typeof r!=`string`||t.has(r))throw Error(`Invalid tools cursor`);t.add(r)}}while(r!==void 0);return e},async call(e,t){return await u.initialize(),c(`tools/call`,{name:e,arguments:t})},close:()=>o.close()};return u}async function W(e){let{spawn:t}=await import(`node:child_process`),n=await import(`node:readline`),r=t(e.command,e.args??[],{env:{...j(process.env),...e.env},stdio:[`pipe`,`pipe`,`inherit`]}),i=new Map,a,o=e=>{a=e;for(let t of i.values())t.reject(e);i.clear()};return r.once(`error`,t=>o(Error(`MCP server ${e.name} could not start: ${t.message}`))),r.once(`close`,t=>o(Error(`MCP server ${e.name} exited with status ${t}`))),r.stdin.on(`error`,o),n.createInterface({input:r.stdout,terminal:!1}).on(`line`,e=>{let t;try{t=JSON.parse(e)}catch{return}let n=t.id===void 0?void 0:i.get(t.id);n&&(i.delete(t.id),t.error?n.reject(Error(t.error.message??`MCP error`)):n.resolve(t.result))}),{rpc(e,t,n,o){if(a)return Promise.reject(a);let s=n===void 0?Promise.resolve(void 0):new Promise((e,t)=>i.set(n,{resolve:e,reject:t}));return r.stdin.write(`${JSON.stringify({jsonrpc:`2.0`,method:e,...n===void 0?{}:{id:n},...t?{params:t}:{}})}\n`),s},async close(){r.stdin.end(),r.kill()}}}async function G(e,t,n){let r,i=()=>({...e.headers,"mcp-protocol-version":n(),...r?{"mcp-session-id":r}:{}});return{async rpc(a,o,s,c){let l=await t(e.url,{method:`POST`,redirect:`manual`,...c?{signal:c}:{},headers:{...i(),...n()===V?{"mcp-method":a,...a===`tools/call`?{"mcp-name":H(String(o.name))}:{}}:{},"content-type":`application/json`,accept:`application/json, text/event-stream`},body:JSON.stringify({jsonrpc:`2.0`,method:a,...s===void 0?{}:{id:s},...o?{params:o}:{}})});if(F(l),r=l.headers.get(`mcp-session-id`)??r,s===void 0){await l.body?.cancel();return}let u=await l.text(),d=(l.headers.get(`content-type`)?.includes(`text/event-stream`)?u.split(/\r?\n\r?\n/).flatMap(e=>{let t=e.split(/\r?\n/).filter(e=>e.startsWith(`data:`)).map(e=>e.slice(5).trimStart()).join(`
2
+ `);return t?[JSON.parse(t)]:[]}):[JSON.parse(u)]).find(e=>e.id===s);if(!d?.result||d.error)throw Error(`Invalid MCP response`);return d.result},async close(){r&&await t(e.url,{method:`DELETE`,redirect:`manual`,headers:i()}).then(e=>e.body?.cancel()).catch(()=>{})}}}function K(e){if(e.endpoint?.command){if(!e.keyIn||!(`env`in e.keyIn))throw Error(`Missing key env`);return{env:e.keyIn.env}}return{header:e.keyIn&&`header`in e.keyIn?e.keyIn.header:`Authorization`}}function q(e,t,n){if(t.env)return{...e,env:{...e.env,[t.env]:n},credentialFields:t};let r=t.header;return{...e,headers:{...e.headers,[r]:r.toLowerCase()===`authorization`?`Bearer ${n}`:n},credentialFields:t}}function J(e){let{url:t,command:n}=e.endpoint??{},r=e.login??e.account;return[e.name,t&&URL.canParse(t)?new URL(t).host:n,r&&`as ${r}`].filter(Boolean).join(`, `)}const Y=e=>e.owner?`${e.provider===`mcp`?e.id.slice(e.owner.length+1):e.provider}-user`:e.id;function X(e,t){if(!e.endpoint)throw Error(`Missing endpoint`);let n={...e.endpoint,name:Y(e)};if(t&&(n=q(n,K(e),t)),n.command){if(e.access===`read-only`&&!n.tools?.length)throw Error(`Read-only requires tools`);return n}return e.access===`read-only`?{...n,readOnly:!0}:n}function Z(e,t={}){let n=new Set(c()),r=Object.keys(t).length?{CODER_CONNECTION_ENV_VALUES:JSON.stringify(t)}:{};return{mcp:Object.fromEntries(Object.entries(e).map(([e,t])=>{let{credentialFields:i,...a}=t,o=a=>t[a]&&Object.fromEntries(Object.entries(t[a]).map(([t,o])=>{if(!(t===i?.[a===`env`?`env`:`header`]||n.has(o)))return[t,o];let s=`CODER_CONNECTION_${g(`sha256`).update(`${e}:${a}:${t}`).digest(`hex`).slice(0,24).toUpperCase()}`;return r[s]=o,[t,"${"+s+`}`]}));return[e,{...a,...t.env?{env:o(`env`)}:{},...t.headers?{headers:o(`headers`)}:{}}]})),env:r}}async function Q(e,t,n=new B,r=`auto`){let i=t??n.list().filter(t=>!t.owner&&(e===void 0||e.includes(t.id))).map(e=>e.id),a={},o={},s=[],c=k(n.list().filter(e=>i.includes(e.id)&&!e.owner));return await Promise.all(i.map(async e=>{let t=n.get(e);if(!t||t.owner||![`mcp`,`env`].includes(t.provider))return;if(t.provider===`env`&&(t.auth!==`key`||t.access!==`auto`||t.endpoint||!t.credential||!t.keyIn||!(`env`in t.keyIn)||!l(t.keyIn.env)||c.has(t.keyIn.env)||process.env[t.keyIn.env]!==void 0)){s.push(P(t.name,Error(`Invalid environment connection`)));return}let i=ee(t.access,r);if(t.auth===`oauth`){a[e]={...X({...t,access:i},void 0),connection:e,credentialOnUse:K(t),description:J(t),access:i};return}if(t.broken){s.push(`${t.name} needs reconnecting.`);return}if(t.provider===`env`){let e=t.keyIn.env;try{let r=n.credential(t.credential),i=r?.iv===`plain`?JSON.parse(Buffer.from(r.ciphertext,`base64`).toString(`utf8`)).env[e]:void 0;if(!i)throw Error(`Missing credential`);o[e]=i}catch(e){s.push(P(t.name,e))}return}try{let r=t.auth===`none`?void 0:(await $(n,e,`key`)).token;if(t.auth!==`none`&&!r)throw Error(`Missing credential`);let o=X({...t,access:i},r);a[e]={...o,description:J(t),access:i}}catch(e){s.push(P(t.name,e))}})),{...Z(a,o),ids:i,warnings:s}}function $(e,t,n,r){return e.withLock(async()=>{let i=e.get(t);if(!i||i.owner||i.broken||i.auth!==n)throw Error(`Connection changed during resolution`);if(!i.secret)throw Error(`Missing credential`);let a=i.secret.startsWith(`plain.`)?JSON.parse(Buffer.from(i.secret.slice(6),`base64`).toString(`utf8`)):{key:i.secret};return i.auth===`key`?{token:a.key,current:i}:{token:await C({secret:a,fetch,now:Date.now(),force:!!a.accessToken&&w(a.accessToken)===r,save:async n=>e.withLock(async()=>{let r=e.get(t);if(!r||r.secret!==i.secret||r.auth!==i.auth||r.owner!==i.owner)throw Error(`Connection changed during refresh`);i.secret=`plain.${Buffer.from(JSON.stringify(n)).toString(`base64`)}`,e.put(i)})}),current:i}},t)}async function ie(e,t,n=new B){let r=n.get(e);if(!(r?.auth!==`oauth`||r.broken||!r.secret))try{return(await $(n,e,`oauth`,t)).token}catch(t){if(console.error(`coder: token refresh failed`,T({connection:e},t)),!N(t))throw t;await n.withLock(async()=>{let t=n.get(e);t&&t.secret===r.secret&&n.put({...t,broken:{at:Date.now(),reason:`Needs reconnecting`}})});return}}export{T as C,x as D,w as E,S as O,C as S,v as T,Q as _,Z as a,q as b,N as c,L as d,M as f,j as g,K as h,k as i,Y as l,re as m,B as n,A as o,P as p,J as r,X as s,D as t,I as u,U as v,y as w,E as x,O as y};
@@ -0,0 +1,6 @@
1
+ import{Ca as e,Sa as t,fa as n,ma as r,nr as i,va as a,wa as o,xa as s}from"./args-CJsHYWbt.js";import{t as c}from"./errors-DK_trCff.js";import{ut as l}from"./state-CxAUec80.js";import{t as u}from"./docs-CxklYa3P.js";import{cli as d}from"./cmd-C1gHyVG7.js";import f from"node:path";import p from"node:process";const m=e=>e.replace(/\s*\(repeatable\)/g,``).replace(/--([a-z][\w-]*)/g,`$1`);function h(e={}){return Object.fromEntries(Object.entries(e).flatMap(([e,t])=>{if(e===`json`)return[];let n=i.get(t);if(!n?.description||m(n.description)===n.description)return[[e,t]];let r=t.clone();return i.add(r,{...n,description:m(n.description)}),[[e,r]]}))}function g(e,t){let n=[...t,e.name].join(`/`);return e.name===`watch`||[`docs`,`auth/login`,`setup-host`,`upgrade`].includes(n)?{...e,mcp:!1}:e.mcp===!1?e:{...e,args:h(e.args),mcp:{...e.mcp,description:m(e.description)}}}function _(e,t=[]){let n=[...t,e.name];return{...e,commands:e.commands.map(e=>g(e,n)),namespaces:e.namespaces?.map(e=>_(e,n))}}const v=new Set([`server`,`workspace`,`yes`,`cwd`,`dir`]);function y(e,t,n){let[r]=e.split(`/`),i=(t&&typeof t==`object`&&t.taskId)??n[`task-id`],a=n.id;return r===`task`?typeof i==`string`?`/tasks/${encodeURIComponent(i)}`:`/tasks`:r===`agent`?typeof a==`string`?`/agents/${encodeURIComponent(a)}`:`/agents`:r===`credentials`?`/settings/credentials`:r===`runner`?`/settings/runners`:r===`model`?`/settings/models`:`/settings/connections`}function b(e,t){let n=[...t,e.name].join(`/`),r=g(e,t),i=Object.fromEntries(Object.entries(r.args??{}).filter(([e])=>!v.has(e))),a=r.mcp&&r.mcp.text;return{...r,args:i,run:async(t,n)=>{try{return{...await r.run({...t,server:!0},n),args:t}}catch(n){if(e.approvalPolicy!==`ask`||!(n instanceof c)||n.code!==`approval-pending`)throw n;let r={pending:!0,reason:n.message};return{value:r,output:r,args:t}}},next:e=>(r.next?.(e)??[]).map(e=>({...e,usage:e.usage.replace(/ --server\b/,``)})),mcp:{...r.mcp,text:e=>{let t=e.value,r=t?.pending?`Asked for approval in the thread. ${t.reason} Nothing changes until someone allowed to approve it does, in the thread or on the task's page.`:(a?a(e):JSON.stringify(e.output)??``).replace(/ --server\b/g,``),i=p.env.CODER_DASHBOARD,o=y(n,e.value,e.args),s=o.startsWith(`/tasks/`)?`the task`:o.startsWith(`/agents/`)?`the agent`:o.split(`/`).at(-1);return i?`${r}\n[Open ${s}](${i}${o})`:r}}}}function x({page:e,action:t,args:n},r,i=p.env.CODER_DASHBOARD??``){let[a,...o]=n,s=e.replace(/:([\w-]+)/g,(e,t)=>encodeURIComponent(String(r[t]??``))),c=new URLSearchParams;c.set(t,s===e?String(r[a]??``):`1`);for(let n of o)r[n]!==void 0&&r[n]!==!1&&(e===`/settings/connections`&&t===`add`&&n===`personal`?c.set(`scope`,`personal`):c.set(n,String(r[n])));return`${i}${s}?${c}`}function S(e,t,n){let{args:r,label:i,button:a}=n,o=g(e,t),s=Object.fromEntries(Object.entries(o.args??{}).filter(([e])=>r.includes(e))),c=e=>x(n,e);return{...o,access:`read`,args:s,run:async e=>({value:{link:c(e)},output:{link:c(e)},args:e}),next:()=>[],mcp:{...o.mcp,text:e=>{let t=e.value.link;return a?`Give the person this link; they check it and click ${a} there. [${i}](${t})`:`Give the person this link; they finish there and any key goes straight to Coder, outside the conversation. [${i}](${t})`}}}}function C(e,t){return e.flatMap(e=>{let{approvalPolicy:n=`allow`}=e;return n===`deny`?[]:[typeof n==`object`?S(e,t,n.handoff):b(e,t)]})}function w(e,t=[]){let n=[...t,e.name],r=C(e.commands,n),i=(e.namespaces??[]).map(e=>w(e,n)).filter(e=>!!e);if(!(!r.length&&!i.length))return{...e,commands:r,namespaces:i}}const T=e=>`# Coder dispatch${e?` (${e} host)`:``}`,E=(e,t)=>`## Setup\n\nIf \`coder\` is not on PATH, install it yourself without asking: \`npm install -g @wular/coder\`. When a dispatch fails because engines are missing or logged out, run \`${e}\` and follow its output. It checks engines and auth, fixes what it can, prints the exact fix for the rest, and is safe to re-run. Ask the user before installing an engine CLI or changing auth; if it updated codex, tell the user to restart their codex session.${t?" For a guided setup, suggest `/coder:setup`.":``}`,D=(e,t)=>[`## Using the CLI`,``,"- The CLI is the reference. `coder --help` and every subcommand's `--help` list the flags and exit codes, and each command prints the recommended next step when it returns. Follow it.","- `coder docs` lists the docs; `coder docs <topic>` prints one.",`- ${e}`,...t?[`- ${t}`]:[]].join(`
2
+ `),O=(e,t)=>s({name:e,description:`Use Coder for coding, implementation, or investigation tasks - features, fixes, refactors, debugging, tests, code questions - one coder per focused goal, fanned out in parallel, waiting on each task. Use it when asked, when a task needs another engine (Claude, Codex, custom), or when a subagent is sufficient or required for the task.`,body:[T(t.host),"If `CODER_WORKER` is set in your environment, you are a coder worker. Skip this skill and do your assigned work directly; nested dispatch is disabled.\n\nYou dispatch coding tasks through the `coder` runtime instead of implementing them yourself.",`## Overview
3
+
4
+ Coder delegates coding to supervised subagents of any model - Codex, Claude, or any OpenAI-compatible or local endpoint - from one runtime on every host. Implementation details live in the subagents, so your context stays clean and handoffs are instant. Every task runs sandboxed under one access setting (read-only or auto), is steerable mid-run, and falls back down the configured chain when an engine cannot start.`,E(t.setup,t.guided),"## Use Coder over MCP\n\nEach coder command is also an MCP tool with the same arguments, such as `task/run` or `flow/run`; `load_skill` loads a doc.\n\nSetup: `coder setup-host` adds the server. By hand:\n\n```bash\nclaude mcp add coder -- coder mcp\ncodex mcp add coder -- coder mcp\n```\n\nRestart running sessions after adding it.",D(t.wait,t.gates),'## Running tasks\n\nStart with `coder task run --help`. It says how to write a good task and what happens after dispatch. `coder task --help` lists the rest, result, steer, stop, list and approvals. Then run it:\n\n```bash\ncoder task run "Add a /health endpoint in src/server.ts that returns 200 with the git sha. Do not touch routes outside that file."\n```\n\nFollow what it prints.',"## Flows\n\nWhen the user asks for a repeatable multi-task workflow with verification gates and resume, author a Coder flow instead of hand-fanning tasks. Read `coder docs flows` before writing or editing one, preview with `--dry-run`, and once it runs give the user the real `coder flow watch <run-id>` command."].join(`
5
+
6
+ `)}),k={claude:O(`dispatch`,{host:`Claude`,setup:`coder setup-host claude`,guided:!0,wait:"Run each `coder task result <task-id> --wait` as its own background Bash call (run_in_background), one per task, never several tasks in one call, so each approval and answer re-invokes you."}),agents:O(`coder`,{setup:`coder setup-host`,wait:l,gates:"If your harness sandboxes or gates terminal commands (Codex does both), run every `coder` command with escalated permissions; the runtime is a supervisor with its own sandbox and approval policy."}),cursor:O(`coder`,{host:`Cursor`,setup:`coder setup-host`,wait:l,gates:"If Cursor asks before running `coder` commands, approve or allowlist `coder`; the runtime is a supervisor with its own sandbox and approval policy."})},A=u(n).filter(e=>e.file.startsWith(`docs/`)&&e.name.split(`/`)[0]!==`cli`).map(e=>s({name:e.name.replace(`/`,`-`),description:e.description,file:f.join(n,e.file)})),j=a({...d,version:r(),instructions:t(e,{children:"Coder runs coding agents: subagents on this machine for the work in front of you, and always-on agents in Coder Cloud that work in GitHub, Slack and other apps. On this machine, task/run starts a subagent on any engine (Claude, Codex or a custom model). task/result returns its answer, task/steer continues it, and task/approve answers its permission requests. flow/run runs a TypeScript flow of many tasks; review reviews a diff. For Coder Cloud, pass server to the same tools; sign in once with `coder auth login` in a terminal. agent/push publishes an agent, and connection/add gives tasks accounts, keys and MCP servers. Every result lists its next steps; follow them."}),commands:d.commands.map(e=>g(e,[])),namespaces:[...d.namespaces.map(e=>_(e))],skills:[k.agents,...A]}),M=e=>e.name===`agent`?{...e,namespaces:e.namespaces?.filter(e=>e.name!==`integrations`)}:e,N=a({...d,version:r(),description:`This agent's tasks and settings, and the workspace's agents, models, credentials and connections`,instructions:o(e,{children:[`Coder turns any model into an agent you own. You are one of this workspace's agents, always on in Coder Cloud, and this server is bound to the workspace and to you. Each result ends with its dashboard link and next steps; follow them, and offer the link when a step is not yours. A command that asks waits for Approve or Deny in the thread.`,t(`tasks`,{children:`task/run starts a child task with your agent, its connections and repositories, and at most your access; give it the goal, paths, constraints and context only you have. The other task tools manage your children only; task/approve answers their escalations.`}),t(`agents`,{children:`agent/show gives this agent's platforms, installations and settings. agent/settings changes its engine, model and effort at once when the person asking is a linked member; its other settings ask.`}),o(`settings`,{children:[t(`connections`,{children:`connection/list gives every member's and the workspace's connections with owner and status; rows marked asker are the asking member's.`}),t(`models`,{children:`model/update, alias, enable and disable ask.`}),t(`credentials`,{children:`credentials/list gives the keys by variable.`}),t(`runners`,{children:`runner/default asks.`}),`Every create, add, remove and delete returns a prefilled link to its page under **# Settings** or **# Agents**; give it to the person, who finishes there. Never ask for a key in the chat.`]})]}),commands:C(d.commands,[]),namespaces:d.namespaces.map(e=>w(M(e))).filter(e=>!!e),skills:A});export{j as app,N as cloudApp};
@@ -0,0 +1 @@
1
+ import{createHash as e,timingSafeEqual as t}from"node:crypto";function n(e,n){let r=typeof e==`string`?Buffer.from(e):e,i=typeof n==`string`?Buffer.from(n):n;return r.length===i.length&&t(r,i)}const r=t=>e(`sha256`).update(t).digest(`base64url`),i=e=>Buffer.from(JSON.stringify(e)).toString(`base64url`),a=e=>JSON.parse(Buffer.from(e,`base64url`).toString(`utf8`));export{r as i,i as n,n as r,a as t};