@wular/coder 0.5.0 → 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 (266) hide show
  1. package/dist/{actions-CkMAM1Km.js → actions-DO8MvHwc.js} +2 -2
  2. package/dist/{agent-Bi5nbUhA.js → agent-Cgala63h.js} +1 -1
  3. package/dist/{app-server-BTpa5GBV.js → app-server-dnlLhhZb.js} +1 -1
  4. package/dist/{approvals-CRwkc9vB.js → approvals-C8XV7CK2.js} +1 -1
  5. package/dist/apps-BORri-28.js +18 -0
  6. package/dist/async-BS9tyhva.js +3 -0
  7. package/dist/{auth-oCvlHitk.js → auth-C16ylySv.js} +1 -1
  8. package/dist/builtin/coder/system.md +6 -3
  9. package/dist/{chat-4AiZEqKh.js → chat-czruXAt3.js} +1 -1
  10. package/dist/cli.js +3 -3
  11. package/dist/{cmd-Cu3OquA_.js → cmd-C1gHyVG7.js} +34 -34
  12. package/dist/{config-D_RuO6gX.js → config-_32PHl9g.js} +1 -1
  13. package/dist/{connection-BXjn7gCC.js → connection-CgA5_NJ7.js} +1 -1
  14. package/dist/{connections-Cswv7r8Z.js → connections-B90TemYf.js} +1 -1
  15. package/dist/{context-CFrDYenS.js → context-C1XBbfEL.js} +1 -1
  16. package/dist/dash/standalone/server/build-index.json +1 -1
  17. package/dist/dash/standalone/server/manifest.json +1391 -1391
  18. package/dist/dash/standalone/server/modules-server-server-react-server/src/client/{index.54c45900f2153d34.js → index.91e126d7a389d4bd.js} +0 -3
  19. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/api/{load.252f972b42c690e2.js → load.858c062c7891a2c1.js} +2 -2
  20. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/create/[id]/{page.11efd0e175db9053.js → page.9375ab741dc9791e.js} +3 -3
  21. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{notify.59ae138dc182d7c3.js → notify.c36570a56d279ce2.js} +1 -1
  22. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{page.e9386951cedea737.js → page.13fdd9cc55ad3a52.js} +3 -3
  23. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{sign-out.713d3ec10951fde5.js → sign-out.38a7f39cddc670f7.js} +1 -1
  24. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{agents-grid.f989d6f2d9ece6e4.js → agents-grid.2385ffa8fdad08d6.js} +1 -1
  25. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{page.0f88720e52db99a2.js → page.5ca6921e50484f8c.js} +6 -6
  26. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{layout.8d2f0997462fc958.js → layout.afc4a8a5a8360975.js} +7 -7
  27. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{page.bc93891522c8120d.js → page.ba65063a1aa99a62.js} +7 -7
  28. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{page.cf5cf9afe38ab0e4.js → page.03c5e72b0fe50ba9.js} +11 -11
  29. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{platform-actions.c44c7df7841719f2.js → platform-actions.7c8c75bd0c05df4a.js} +3 -3
  30. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{platform-step.6e90cbfe308f28a0.js → platform-step.d6a980d1181dc940.js} +1 -1
  31. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/settings/{agent-settings-form.61de585104c2be10.js → agent-settings-form.b5299f5130a4e8af.js} +16 -17
  32. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/settings/{page.4d06f759984a63b3.js → page.fad77cea17947d47.js} +8 -9
  33. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/tasks/{loading.ea2925eab1d2e594.js → loading.4120e6979eaed441.js} +1 -1
  34. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/tasks/{page.fb069bf82b727d27.js → page.474b3524d5ea53b7.js} +1 -1
  35. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/usage/{page.0a472a0e269b8c01.js → page.7868a07efcaa26f4.js} +3 -3
  36. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{versions-list.7ef7dfd5d8f5de43.js → versions-list.ba93a53773cab8a8.js} +1 -1
  37. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/edit/{loading.007326a04f05d46c.js → loading.6e53829bd1f3021d.js} +1 -1
  38. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/edit/{page.a26aa7bc6ab655f0.js → page.5798ede8ba8ace97.js} +6 -6
  39. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/platforms/[app]/{app-cards.361918fe58349aa1.js → app-cards.55778a4b3177846d.js} +2 -2
  40. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/platforms/[app]/{page.3f60cf67517d0d31.js → page.ce391cad0d78795f.js} +3 -3
  41. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{agent-toggle.ffbf9a8b8b2fbde7.js → agent-toggle.0cec822c6099f058.js} +2 -2
  42. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{hero.0ae015a4fbe6321e.js → hero.7151c467e7ecf6a5.js} +1 -1
  43. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{connect-repositories.9abe365f0098d358.js → connect-repositories.4e121d31ed0cfe02.js} +1 -1
  44. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{editor.6548f8f757578f90.js → editor.f314d92af0bb33b0.js} +8 -8
  45. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{import-picker.577b1d84c7ab84e1.js → import-picker.11028d5329ad537b.js} +3 -3
  46. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/new/{page.2b326d00ccef5544.js → page.1476d31e4554e88b.js} +4 -4
  47. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{layout.45a09107b19f0a7e.js → layout.150d950d191db477.js} +3 -3
  48. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/operator/{operator-apps.f8d679f2d06b0ebc.js → operator-apps.3e72de86b86a7338.js} +6 -6
  49. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/operator/{page.5aa3ddc669366703.js → page.6a4be3b1a473ff8c.js} +5 -5
  50. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{page.5a5188f0fc75dcd2.js → page.262ed73437c17872.js} +1 -1
  51. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{advanced-list.73cdadb2968a39d2.js → advanced-list.7180570379e2625c.js} +1 -1
  52. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{connection-add.353ec01fbb814f78.js → connection-add.632b1847c16ecd42.js} +4 -4
  53. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{connections-list.cf4061ae909272c3.js → connections-list.4378ae707b2092ed.js} +5 -5
  54. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{credentials-list.fc4cff0289267551.js → credentials-list.e47897acb6867df8.js} +4 -4
  55. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{credentials.db01de2581ac65f3.js → credentials.6bd06f96afbe7329.js} +8 -8
  56. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{list.e7d6a422f6a869ea.js → list.38e70272eeb98cd0.js} +3 -3
  57. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{models-list.acb92b39cab1d11c.js → models-list.a08cd37d0f7ff86c.js} +6 -6
  58. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{page.95fe939e36e5be55.js → page.f096b5a9ac419326.js} +13 -13
  59. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{runners-list.5764eac3307d67cc.js → runners-list.0df1f9329df1b67d.js} +6 -6
  60. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{secrets-list.d316bb157f747f6c.js → secrets-list.6d2f56fa7d6fcab0.js} +4 -4
  61. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{layout.4eb70f2de8674f93.js → layout.0fd865c865e5bab4.js} +1 -1
  62. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{model-options.dc630cb6e2cbf83a.js → model-options.0d6077fe68db3af9.js} +2 -5
  63. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{model-pick.a143e77f5ed5f9d3.js → model-pick.695538b2edf9dd15.js} +1 -1
  64. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{page.70cad0e981c33fa5.js → page.c57b81c2197cce0f.js} +1 -1
  65. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{create-link.18bd2b92cd23b73f.js → create-link.60aadbe43ea1e39c.js} +3 -3
  66. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{outcome-toast.95f7be49430248eb.js → outcome-toast.e2b9ef0344b1a1a2.js} +1 -1
  67. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{page.e39ee9236664d043.js → page.c456ad99c8a9f875.js} +4 -4
  68. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{activity.441e82ab00344fb2.js → activity.2ec05d78d609b7b2.js} +1 -1
  69. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{page.24e121ea6eb578ba.js → page.578be2f6c89fcba0.js} +6 -6
  70. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{task-actions.4a4052a38db4bad3.js → task-actions.d131453dd2a423c3.js} +4 -4
  71. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{task-view.0cd3ec2655f44cc7.js → task-view.3d72a4ecd2b3826e.js} +7 -53
  72. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{composer-data.73225456d60d63e3.js → composer-data.c16854be11a561e4.js} +1 -1
  73. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{composer.ee326fbf5e526fb1.js → composer.97be3e67214889c1.js} +24 -82
  74. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{pending-approvals.7607998094780fdd.js → pending-approvals.9175908da02960e1.js} +1 -1
  75. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{tasks-list.e486cbd16ea3e963.js → tasks-list.028798c79227a366.js} +8 -8
  76. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{tasks-section.01510523d1556d59.js → tasks-section.9a9d13057b326f25.js} +4 -4
  77. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{page.ede64f82388f9480.js → page.045c6db0c56975b2.js} +3 -3
  78. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/usage/{page.0499098badd3f5f8.js → page.938d29ff7edb678d.js} +2 -2
  79. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{stream.e3800e736f832124.js → stream.2cdb8eabd8f6df70.js} +1 -1
  80. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{task-toasts.3b7eeee29fc327de.js → task-toasts.8733901ca0e4c246.js} +1 -1
  81. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/utils/{action.f22057e7dfac40fe.js → action.56cea462eb725c39.js} +1 -1
  82. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/utils/{client.c8d7efefb6194d7d.js → client.685154f230716834.js} +1 -1
  83. package/dist/dash/standalone/static/assets/chunks/{advanced-list-850a950afe4f6996.js → advanced-list-b75a9c2bd11026de.js} +1 -1
  84. package/dist/dash/standalone/static/assets/chunks/{agent-pills-9f6fa120182db948.js → agent-pills-54564413a57d7fa7.js} +1 -1
  85. package/dist/dash/standalone/static/assets/chunks/agent-settings-form-55d294dad2ce5a0d.js +1 -0
  86. package/dist/dash/standalone/static/assets/chunks/{agent-toggle-521136f20a71400d.js → agent-toggle-b5dcc4ea6292fb3d.js} +1 -1
  87. package/dist/dash/standalone/static/assets/chunks/{agents-grid-bcd13cd7a46224a6.js → agents-grid-69461c53abbba433.js} +1 -1
  88. package/dist/dash/standalone/static/assets/chunks/{back-2d67134b122334f4.js → back-ba5e4340a9f8bbd2.js} +1 -1
  89. package/dist/dash/standalone/static/assets/chunks/{chain-hint-53675e299a865420.js → chain-hint-491eb09a20a15702.js} +1 -1
  90. package/dist/dash/standalone/static/assets/chunks/{combo-cb2c62fe580a8903.js → combo-6df61e8a1cc31037.js} +1 -1
  91. package/dist/dash/standalone/static/assets/chunks/composer-198b844da57b82a3.js +1 -0
  92. package/dist/dash/standalone/static/assets/chunks/composer-b26a3332a1243461.js +1 -0
  93. package/dist/dash/standalone/static/assets/chunks/{composer-data-890f71bade4f0616.js → composer-data-b05f3d93fdc472d7.js} +1 -1
  94. package/dist/dash/standalone/static/assets/chunks/{confirm-d6b2c5b1deccd1e8.js → confirm-14d018653fbe50fc.js} +1 -1
  95. package/dist/dash/standalone/static/assets/chunks/{connect-repositories-226bf70aa81c29d8.js → connect-repositories-5118edc019fc7890.js} +1 -1
  96. package/dist/dash/standalone/static/assets/chunks/{connections-list-a33d6637e2d52fcf.js → connections-list-5412dad7e0def52f.js} +1 -1
  97. package/dist/dash/standalone/static/assets/chunks/{copy-294c6052b3b69424.js → copy-04781f9af4e10f06.js} +1 -1
  98. package/dist/dash/standalone/static/assets/chunks/create-link-0651addf1461f901.js +1 -0
  99. package/dist/dash/standalone/static/assets/chunks/{credentials-list-90fc1c6d202e1461.js → credentials-list-e64c973aee5602d3.js} +1 -1
  100. package/dist/dash/standalone/static/assets/chunks/{custom-range-efa1b6a71ba84597.js → custom-range-b6919bab9846ebf7.js} +1 -1
  101. package/dist/dash/standalone/static/assets/chunks/{editor-53a3e1a893644fff.js → editor-68e9ccd1764fc512.js} +3 -3
  102. package/dist/dash/standalone/static/assets/chunks/{field-4d374d5ed3f43d7e.js → field-adcb6e6a5f9b7131.js} +1 -1
  103. package/dist/dash/standalone/static/assets/chunks/instructions-0022dd3bdd57c13f.js +1 -0
  104. package/dist/dash/standalone/static/assets/chunks/{instructions-d3dc01b2f90820db.js → instructions-7b274685ceb26457.js} +1 -1
  105. package/dist/dash/standalone/static/assets/chunks/{list-16247e39898cd20e.js → list-662f042656857c82.js} +1 -1
  106. package/dist/dash/standalone/static/assets/chunks/model-options-5e07b3318d69d218.js +1 -0
  107. package/dist/dash/standalone/static/assets/chunks/{models-list-6d93523660503dfb.js → models-list-ae1e2eff30d21824.js} +1 -1
  108. package/dist/dash/standalone/static/assets/chunks/outcome-dialog-546fe090efc129c2.js +1 -0
  109. package/dist/dash/standalone/static/assets/chunks/{outcome-dialog-755fc581cbc2836e.js → outcome-dialog-fd86ded4c44c2de7.js} +1 -1
  110. package/dist/dash/standalone/static/assets/chunks/outcome-toast-c00becdb638cd9a8.js +1 -0
  111. package/dist/dash/standalone/static/assets/chunks/platform-actions-2be223e68e648134.js +1 -0
  112. package/dist/dash/standalone/static/assets/chunks/{platform-actions-08e9b3816dcd62b1.js → platform-actions-f3979ab69a6ceb53.js} +1 -1
  113. package/dist/dash/standalone/static/assets/chunks/{platform-step-5881a8be1e761e00.js → platform-step-5454b6c0a19caefd.js} +1 -1
  114. package/dist/dash/standalone/static/assets/chunks/platform-step-9a52703f4c4f6a31.js +1 -0
  115. package/dist/dash/standalone/static/assets/chunks/{runners-list-dd759d408c643a29.js → runners-list-20d42f19fb4bec8a.js} +1 -1
  116. package/dist/dash/standalone/static/assets/chunks/{runtime-9b28886f3cbe0ed3-1.js → runtime-3fcac605fffcc273-1.js} +1 -1
  117. package/dist/dash/standalone/static/assets/chunks/{secrets-list-be1f634a1b077baa.js → secrets-list-89f89ee70edb3856.js} +1 -1
  118. package/dist/dash/standalone/static/assets/chunks/{segmented-f646bfa8aa0aa449.js → segmented-66a8c77c6294fec3.js} +1 -1
  119. package/dist/dash/standalone/static/assets/chunks/shared-init-3fcac605fffcc273-2.js +1 -0
  120. package/dist/dash/standalone/static/assets/chunks/{shared-init-953965859f7bf6b9.js → shared-init-96225b8c7758de9d.js} +1 -1
  121. package/dist/dash/standalone/static/assets/chunks/shared-init-96cde32cd50254c0.js +1 -0
  122. package/dist/dash/standalone/static/assets/chunks/shared-init-abd7653140f37a0c.js +9 -0
  123. package/dist/dash/standalone/static/assets/chunks/side-toggle-8a410cc6d6bd9b1d.js +1 -0
  124. package/dist/dash/standalone/static/assets/chunks/{tail-d13c4cc0cf11ffd1.js → tail-40f16e09eade7eee.js} +1 -1
  125. package/dist/dash/standalone/static/assets/chunks/{task-423e6a3f2527f534.js → task-396d849e58e50d59.js} +1 -1
  126. package/dist/dash/standalone/static/assets/chunks/{task-actions-5917357eac6504ca.js → task-actions-0b3054dc0f8d17c0.js} +1 -1
  127. package/dist/dash/standalone/static/assets/chunks/task-view-9e026dc5da58af5b.js +3 -0
  128. package/dist/dash/standalone/static/assets/chunks/{tasks-list-2c5ce592e00fda45.js → tasks-list-04c6568d7f7237b7.js} +1 -1
  129. package/dist/dash/standalone/static/assets/chunks/{versions-list-177ae397ad64dcea.js → versions-list-ceb756236e69b761.js} +1 -1
  130. package/dist/dash/standalone/static/assets/chunks/{wular-pnext-9b28886f3cbe0ed3-0.js → wular-pnext-3fcac605fffcc273-0.js} +1 -1
  131. package/dist/dash/standalone/static/assets/{dash-param-org-agents-param-slug-00243b34eb094b95.css → dash-param-org-agents-param-slug-dd4ac319a0d62432.css} +1 -1
  132. package/dist/dash/standalone/static/assets/{dash-param-org-agents-param-slug-settings-9f8faa8f7d714699.css → dash-param-org-agents-param-slug-platforms-9d2e1439f3f7e81b.css} +1 -1
  133. package/dist/dash/standalone/static/assets/{dash-param-org-agents-param-slug-usage-0e037c66e3977f33.css → dash-param-org-agents-param-slug-settings-f21d4fcd3948139b.css} +1 -1
  134. package/dist/dash/standalone/static/assets/{dash-param-org-agents-param-slug-tasks-129adcdc293ceac8.css → dash-param-org-agents-param-slug-tasks-c8d6aa06f6e75f4c.css} +1 -1
  135. package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-usage-9cc128ba8af6ef62.css +1 -0
  136. package/dist/dash/standalone/static/assets/{dash-param-org-tasks-8a44e171984d32a1.css → dash-param-org-tasks-be3cb3d64573f3d9.css} +1 -1
  137. package/dist/dash/standalone/static/assets/{dash-param-org-tasks-param-id-b9d3a7a1bd1dd666.css → dash-param-org-tasks-param-id-c20a0537bc82620d.css} +1 -1
  138. package/dist/dash/standalone/static/assets/pnext-client-07b41bfab64b61c0.js +1 -0
  139. package/dist/dash/standalone/static/assets/pnext-client-0d388d56250f9f46.js +1 -0
  140. package/dist/dash/standalone/static/assets/pnext-client-1443e45181b60bb0.js +1 -0
  141. package/dist/dash/standalone/static/assets/pnext-client-27207e4f43f9a21b.js +1 -0
  142. package/dist/dash/standalone/static/assets/{pnext-client-7ecbd7a0cbe4e231.js → pnext-client-435db60553fa3a67.js} +1 -1
  143. package/dist/dash/standalone/static/assets/pnext-client-523dd4071aa294ba.js +1 -0
  144. package/dist/dash/standalone/static/assets/pnext-client-5f6bda3919f68382.js +1 -0
  145. package/dist/dash/standalone/static/assets/pnext-client-684fd8ad16563ed3.js +1 -0
  146. package/dist/dash/standalone/static/assets/pnext-client-6b952cdda9a1eb2b.js +1 -0
  147. package/dist/dash/standalone/static/assets/pnext-client-6fe9e98f7dd8dcbf.js +1 -0
  148. package/dist/dash/standalone/static/assets/pnext-client-730c2c507a159f9e.js +1 -0
  149. package/dist/dash/standalone/static/assets/pnext-client-7c46573e45b67166.js +1 -0
  150. package/dist/dash/standalone/static/assets/pnext-client-83a865c3d75705bd.js +1 -0
  151. package/dist/dash/standalone/static/assets/pnext-client-907d1db4fb398a1d.js +1 -0
  152. package/dist/dash/standalone/static/assets/pnext-client-9baf701f3e641d09.js +1 -0
  153. package/dist/dash/standalone/static/assets/pnext-client-a57705e4e1047a9e.js +1 -0
  154. package/dist/dash/standalone/static/assets/{pnext-client-ed31510d4615a5a5.js → pnext-client-b1af82c6f0db0033.js} +1 -1
  155. package/dist/dash/standalone/static/assets/pnext-client-cede3bd7b2735942.js +1 -0
  156. package/dist/dash/standalone/static/assets/pnext-client-d9a3996f22b6816b.js +1 -0
  157. package/dist/dash/standalone/static/assets/pnext-client-f95364a0073ca4ce.js +1 -0
  158. package/dist/{definition-4on4SG5J.js → definition-D0OpQfGX.js} +1 -1
  159. package/dist/{discover-DvzAbQvU.js → discover-BfYHHJN_.js} +1 -1
  160. package/dist/{dispatch-BaW2X6Sc.js → dispatch-BkoIU4GU.js} +2 -2
  161. package/dist/{docs-CbgaMPvq.js → docs-CxklYa3P.js} +1 -1
  162. package/dist/{drive-Tk6JvQK5.js → drive-B7SBFfcb.js} +1 -1
  163. package/dist/env-BwFCHakK.js +1 -0
  164. package/dist/{exec-CAaYFJD1.js → exec-D9jF2F-H.js} +2 -2
  165. package/dist/{executor-Chc0zawh.js → executor-DBW7R7Tf.js} +6 -6
  166. package/dist/flow/builtin/review/index.d.ts +2 -2
  167. package/dist/flow/builtin/review/index.js +10 -15
  168. package/dist/flow/index.d.ts +2 -2
  169. package/dist/flow/index.js +1 -1
  170. package/dist/{hook-COWDSO4a.js → hook-DN__zYOG.js} +1 -1
  171. package/dist/{index-ezhbF5wC.d.ts → index-CTAQrCRU.d.ts} +71 -66
  172. package/dist/integrations-DSZSa8Rc.js +9 -0
  173. package/dist/lib/broker.js +1 -1
  174. package/dist/{load-PqaDHiHX.js → load-BtIDghgd.js} +2 -2
  175. package/dist/{local-BzZuOwgI.js → local-BzMvgiwL.js} +1 -1
  176. package/dist/{local-BMGcCk8N.js → local-GIxwz_Or.js} +1 -1
  177. package/dist/{login-BDKTNynK.js → login-LlZrIlxb.js} +1 -1
  178. package/dist/maintenance-DyiyHI8S.js +1 -0
  179. package/dist/{mcp-BGam3G_B.js → mcp-Caq72REF.js} +1 -1
  180. package/dist/{mcp-BNz_l5TV2.js → mcp-CrtKQoVi.js} +1 -1
  181. package/dist/{mcp-BGx48pyR.js → mcp-cEIva8Pd.js} +6 -4
  182. package/dist/{models-D1NXi6ni.js → models-BVxs3I8o.js} +1 -1
  183. package/dist/{permission-BkYxjiFR.js → permission-RSZM3DUk.js} +1 -1
  184. package/dist/post-DLenID75.js +11 -0
  185. package/dist/{refresh-yfEi5SQs.js → refresh-CWEpTAkD.js} +1 -1
  186. package/dist/{remote-rArUa01V.js → remote-BDMuKaON.js} +1 -1
  187. package/dist/{remote-BbXx6S9P.js → remote-CY-qYX2C.js} +1 -1
  188. package/dist/{runner-DG9jrX5H.js → runner-CKMOh5Q3.js} +1 -1
  189. package/dist/runner.json +1 -1
  190. package/dist/runner.tgz +0 -0
  191. package/dist/schema.js +1 -1
  192. package/dist/sdk.d.ts +15 -45
  193. package/dist/sdk.js +1 -1
  194. package/dist/serve-D23JqDip.js +12 -0
  195. package/dist/{serve-B-5rDiZm.js → serve-YlU04KO7.js} +1 -1
  196. package/dist/{session-Dtje9y-r.js → session-D7eeJIaH.js} +1 -1
  197. package/dist/{sessions-DIz9fyRN.js → sessions-BGUfSe8L.js} +1 -1
  198. package/dist/{shared--aE4olIO.js → shared-BzNReirj.js} +1 -1
  199. package/dist/{sign-in-wWkyaq5X.js → sign-in-Dr6sU7vz.js} +2 -2
  200. package/dist/{state-Br-Fuaxg.js → state-CxAUec80.js} +1 -1
  201. package/dist/store-BrnWdtRw.js +349 -0
  202. package/dist/{task-CFt85vTy.js → task-CyqtCXo3.js} +1 -1
  203. package/dist/task-DN4assR8.js +7 -0
  204. package/dist/{tool-search-BkdgVolu.js → tool-search-C9Ty3hhL.js} +1 -1
  205. package/dist/{tools-DNgEptor.js → tools-Ck-ZWtmB.js} +1 -1
  206. package/dist/{tools-oQvFAnh5.js → tools-DVtBtED6.js} +1 -1
  207. package/dist/{tools-search-D1zArRyJ.js → tools-search-BNDea9vZ.js} +1 -1
  208. package/dist/{turn-Cc-v-eSy.js → turn-eI4iRPsq.js} +1 -1
  209. package/dist/{update-check-UyRob3yy.js → update-check-Bap3dwaj.js} +1 -1
  210. package/dist/{views-3TxH367C.js → views-Bxm_5J6T.js} +1 -1
  211. package/dist/{worker-BMuKKiIa.js → worker-DJANNSCT.js} +1 -1
  212. package/dist/worker-DeuC38Vp.js +7 -0
  213. package/docs/agents/coder.md +1 -1
  214. package/docs/cli/index.md +5 -3
  215. package/docs/connections.md +1 -1
  216. package/docs/flows.md +1 -1
  217. package/docs/review.md +36 -8
  218. package/docs/self-host.md +2 -1
  219. package/package.json +1 -1
  220. package/plugins/claude/.claude-plugin/plugin.json +1 -1
  221. package/plugins/cursor/.cursor-plugin/plugin.json +1 -1
  222. package/dist/apps-B6mUToTa.js +0 -18
  223. package/dist/async-CNhQ4wyZ.js +0 -3
  224. package/dist/dash/standalone/static/assets/chunks/agent-settings-form-a8ee12513a02b1c5.js +0 -1
  225. package/dist/dash/standalone/static/assets/chunks/composer-4a46a458495ce3ba.js +0 -1
  226. package/dist/dash/standalone/static/assets/chunks/composer-92553de43276510b.js +0 -1
  227. package/dist/dash/standalone/static/assets/chunks/create-link-b2480a7601967e94.js +0 -1
  228. package/dist/dash/standalone/static/assets/chunks/instructions-734d21dfb8f6393e.js +0 -1
  229. package/dist/dash/standalone/static/assets/chunks/model-options-d29e934a3de20ab4.js +0 -1
  230. package/dist/dash/standalone/static/assets/chunks/outcome-dialog-77e13c848000a3dc.js +0 -1
  231. package/dist/dash/standalone/static/assets/chunks/outcome-toast-9d5e9713c23882f5.js +0 -1
  232. package/dist/dash/standalone/static/assets/chunks/platform-actions-832904f5694ef902.js +0 -1
  233. package/dist/dash/standalone/static/assets/chunks/platform-step-29469fd4eaddc42a.js +0 -1
  234. package/dist/dash/standalone/static/assets/chunks/shared-init-926144b364908b3c.js +0 -9
  235. package/dist/dash/standalone/static/assets/chunks/shared-init-9b28886f3cbe0ed3-2.js +0 -1
  236. package/dist/dash/standalone/static/assets/chunks/shared-init-b42d2c06c25d1e2b.js +0 -1
  237. package/dist/dash/standalone/static/assets/chunks/side-toggle-8c21d39a1e284887.js +0 -1
  238. package/dist/dash/standalone/static/assets/chunks/task-view-c6ee43d2ddb6db90.js +0 -3
  239. package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-platforms-25ae07e0b3f5b252.css +0 -1
  240. package/dist/dash/standalone/static/assets/pnext-client-095026242a079175.js +0 -1
  241. package/dist/dash/standalone/static/assets/pnext-client-1dfeb8c3ef155f87.js +0 -1
  242. package/dist/dash/standalone/static/assets/pnext-client-2358423351524403.js +0 -1
  243. package/dist/dash/standalone/static/assets/pnext-client-28a6557216627768.js +0 -1
  244. package/dist/dash/standalone/static/assets/pnext-client-31a4ee73945fee19.js +0 -1
  245. package/dist/dash/standalone/static/assets/pnext-client-3dfdc76bb8712b82.js +0 -1
  246. package/dist/dash/standalone/static/assets/pnext-client-4355ac87961d78c1.js +0 -1
  247. package/dist/dash/standalone/static/assets/pnext-client-43c7a0046572e0c9.js +0 -1
  248. package/dist/dash/standalone/static/assets/pnext-client-53dc7db68d67e0b1.js +0 -1
  249. package/dist/dash/standalone/static/assets/pnext-client-5835cb35488bdf7f.js +0 -1
  250. package/dist/dash/standalone/static/assets/pnext-client-638b390bc23ab1ae.js +0 -1
  251. package/dist/dash/standalone/static/assets/pnext-client-67f832c6c51a66cd.js +0 -1
  252. package/dist/dash/standalone/static/assets/pnext-client-6fc99f0abe77c2ea.js +0 -1
  253. package/dist/dash/standalone/static/assets/pnext-client-7d99965f28ac7604.js +0 -1
  254. package/dist/dash/standalone/static/assets/pnext-client-8250bd3b86d038a3.js +0 -1
  255. package/dist/dash/standalone/static/assets/pnext-client-bfd06805a43c6dee.js +0 -1
  256. package/dist/dash/standalone/static/assets/pnext-client-ce2943f17e9d9ac3.js +0 -1
  257. package/dist/dash/standalone/static/assets/pnext-client-f0496bf51e161ddd.js +0 -1
  258. package/dist/env-_AxrvBXP.js +0 -1
  259. package/dist/integrations-BVmsk64f.js +0 -9
  260. package/dist/maintenance-d43Ml540.js +0 -1
  261. package/dist/serve-CvnrGAj7.js +0 -12
  262. package/dist/store-CzQLgCzt.js +0 -352
  263. package/dist/task-N0qhnKpK.js +0 -7
  264. package/dist/worker-CIHY9L42.js +0 -7
  265. /package/dist/dash/standalone/server/modules-server-server-react-server/src/core/{types.5bf5a41cedb54154.js → types.9d22123d6296f5af.js} +0 -0
  266. /package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{task-view.aae9fa481b9015d1.css.pnext-asset.js → task-view.440367ae07204ee7.css.pnext-asset.js} +0 -0
@@ -1 +1 @@
1
- import{d as e}from"./args-CJsHYWbt.js";import{command as t}from"./cli.js";const n=t({name:`tools`,description:`serve a task's tools over stdio`,access:`write`,args:{tools:e(`the tools to serve: review, reply, react, history`)},globalFlags:{json:!1,cwd:!1},cli:{positional:[`tools`]},mcp:!1,async run({args:e}){let{taskApp:t,taskTools:n}=await import(`./tools-oQvFAnh5.js`).then(e=>e.i),{serve:r}=await import(`./serve-DoYbHm_k.js`),i=e.flat(),a=i.find(e=>!t.commands?.some(t=>t.name===e));if(a)throw Error(`Unknown task tool "${a}"`);await(await r(n(i),`stdio`)).done}});export{n as commandTools};
1
+ import{d as e}from"./args-CJsHYWbt.js";import{command as t}from"./cli.js";const n=t({name:`tools`,description:`serve a task's tools over stdio`,access:`write`,args:{tools:e(`the tools to serve: review, reply, react, history`)},globalFlags:{json:!1,cwd:!1},cli:{positional:[`tools`]},mcp:!1,async run({args:e}){let{taskApp:t,taskTools:n}=await import(`./tools-DVtBtED6.js`).then(e=>e.i),{serve:r}=await import(`./serve-DoYbHm_k.js`),i=e.flat(),a=i.find(e=>!t.commands?.some(t=>t.name===e));if(a)throw Error(`Unknown task tool "${a}"`);await(await r(n(i),`stdio`)).done}});export{n as commandTools};
@@ -1 +1 @@
1
- import{C as e,Ea as t,T as n,ba as r,d as i,h as a,j as o,t as s,u as c,va as l}from"./args-CJsHYWbt.js";import{a as u}from"./state-Br-Fuaxg.js";import{E as d}from"./dispatch-BaW2X6Sc.js";import{g as f}from"./approvals-CRwkc9vB.js";import{f as p}from"./view-D-rbQ1Kz.js";import{a as m}from"./async-CNhQ4wyZ.js";import h from"node:path";import g from"node:process";import{randomUUID as _}from"node:crypto";import v from"node:fs/promises";async function y(e,t,n=fetch){let r=g.env.CODER_REPLY_URL,i=g.env.CODER_REPLY_TOKEN;if(!r||!i)throw Error(`This task has no conversation to post to`);let a=JSON.stringify({id:_(),...t});for(let t=0;;t++){let o;try{o=await n(`${r}/${e}`,{method:`POST`,headers:{authorization:`Bearer ${i}`,"content-type":`application/json`},body:a,signal:AbortSignal.timeout(6e4)})}catch(e){if(t<2)continue;throw e}let s=await o.json().catch(()=>void 0);if(!o.ok)throw Error(s?.error??`The conversation ${e} failed (${o.status})`);return{ok:!0}}}async function b(){let e=g.env.CODER_HISTORY_TASK;if(!e)throw Error(`CODER_HISTORY_TASK is not set`);return{file:e,task:JSON.parse(await v.readFile(e,`utf8`))}}const x=[r({name:`reply`,description:`Post a reply now, such as before longer work. Never repeat text you already posted or will put in your final message.`,args:{text:s(o(),`Markdown to post.`)},access:`write`,run:async({text:e},t)=>{let{file:n,task:r}=await b();if(!r.conversation)throw Error(`Only conversation tasks can reply`);if(typeof e!=`string`||!e.trim())throw Error(`Reply text is required`);let i=await y(`reply`,{text:e.trim()},t.fetch);return u(h.dirname(n),{kind:`reply`,message:e.trim()}),i}}),r({name:`react`,description:`React to a message in this conversation with an emoji, by default the one that started your turn.`,args:{emoji:s(o(),`An emoji name such as thumbsup, or the emoji itself.`),message:c(`A message id from the conversation.`)},access:`write`,run:async({emoji:e,message:t},n)=>{let{task:r}=await b();if(!r.conversation)throw Error(`Only conversation tasks can react`);if(typeof e!=`string`||!e.trim())throw Error(`Emoji is required`);if(t!==void 0&&(typeof t!=`string`||!t.trim()))throw Error(`Message id must be a non-empty string`);let i=p(r.currentPrompt??r.prompt??``,!0)?.[0],a=t??i?.message?.id??i?.messages?.[0]?.id;if(i&&!a)throw Error(`This turn has no message to react to; give a message id`);return y(`react`,{emoji:e.trim(),...a?{message:a}:{}},n.fetch)}}),r({name:`history`,description:[`Search or read your own earlier turns in this task, including anything compacted out of your context, oldest first.`,"With query, the messages containing that exact text; without, the messages from `from` on.",`An event's message.index counts from 0; when your history starts later, read earlier messages with the platform's tools when they matter.`,`Messages from bots never arrive as turns; the platform's tools read the thread itself, theirs included.`].join(` `),args:{query:c(`Exact text to find, case-insensitive, 1 to 500 characters: a word or phrase from the message, not a question.`),from:s(n(e()),`Message index to start at; default the oldest, or after the last match.`),limit:s(n(e()),`Messages to return, 1 to 20; default 10.`),role:s(n(a([`all`,`conversation`])),`conversation: only platform messages and your replies; all (default): tool calls and results too.`)},access:`read`,run:async e=>d((await b()).task,e)})];var S=t({asyncTools:()=>w,taskApp:()=>D,taskTools:()=>O});const C={name:`review`,flow:`review`,limit:5,platform:`github`,args:(e,t,n)=>({...e.pr===void 0?{base:e.base??`HEAD`}:{pr:e.pr,post:!0,...n?{author:n}:{}},...e.path?.length?{path:e.path}:{},...e.exclude?.length?{exclude:e.exclude}:{},...e.depth?{depth:e.depth}:{},cwd:t}),render:async(e,t)=>{let{renderReviewMarkdown:n}=await import(`./flow/builtin/review/index.js`);return n({...e,runId:t})}},w=[C],T=[...w.map(e=>e.name),`escalate`];function E(){let e=g.env.CODER_HISTORY_TASK;if(!e)throw Error(`CODER_HISTORY_TASK is not set`);return h.dirname(e)}const D=l({name:`task`,description:`This task's own tools.`,commands:[r({name:`escalate`,description:[`Ask a human to approve actions your environment refused.`,`Actions outside the sandbox are reviewed and may be refused; then take another way.`,`If the task truly needs refused actions, escalate them all in one call with the exact commands, then continue or end your turn.`,`The decision arrives as a message, in this turn while it runs, else in a new one.`,`Approved actions stay approved for the rest of the task; run them outside the sandbox directly.`].join(` `),args:{reason:c(`One short sentence: what the actions are for.`),actions:i(`Each action is exactly the command you will run once approved, nothing added; notes go in reason.`)},access:`read`,run:({reason:e,actions:t})=>{let n=(t??[]).map(e=>e.trim()).filter(Boolean);if(!e?.trim()||!n.length)throw Error(`reason and actions are required`);let r=E();return{approvalId:f(g.cwd(),h.basename(r),r,{reason:e.trim(),actions:n}).id,status:`pending`}}}),r({name:`review`,description:`Review your changes with a separate read-only reviewer that checks each finding against the repository. One review at a time, ${C.limit} per turn.`,args:{pr:s(n(e()),`A pull request to review and post the review on.`),base:c(`The ref to compare with; default HEAD, so only uncommitted changes.`),path:i(`Review only these paths, relative to the task directory.`),exclude:i(`Leave these paths out.`),depth:s(n(a([`low`,`medium`,`high`])),`What to report: low only critical and major defects, high nits too; medium by default.`),timeout:s(n(e()),`Stop the review after this many seconds.`)},access:`read`,run:async({timeout:e,...t})=>({runId:await m(E(),C,t,e),status:`started`})}),...x]});function O(e){let t=e.filter(e=>T.includes(e));return{...D,...t.length?{instructions:[`${t.join(` and `)} ${t.length>1?`return`:`returns`} at once;`,`the result arrives later as a message, in a new turn if yours has ended.`].join(` `)}:{},commands:D.commands.filter(t=>e.includes(t.name))}}export{S as i,D as n,O as r,w as t};
1
+ import{C as e,Ea as t,T as n,ba as r,d as i,h as a,j as o,t as s,u as c,va as l}from"./args-CJsHYWbt.js";import{a as u}from"./state-CxAUec80.js";import{E as d}from"./dispatch-BkoIU4GU.js";import{g as f}from"./approvals-C8XV7CK2.js";import{f as p}from"./view-D-rbQ1Kz.js";import{a as m}from"./async-BS9tyhva.js";import h from"node:path";import g from"node:process";import{randomUUID as _}from"node:crypto";import v from"node:fs/promises";async function y(e,t,n=fetch){let r=g.env.CODER_REPLY_URL,i=g.env.CODER_REPLY_TOKEN;if(!r||!i)throw Error(`This task has no conversation to post to`);let a=JSON.stringify({id:_(),...t});for(let t=0;;t++){let o;try{o=await n(`${r}/${e}`,{method:`POST`,headers:{authorization:`Bearer ${i}`,"content-type":`application/json`},body:a,signal:AbortSignal.timeout(6e4)})}catch(e){if(t<2)continue;throw e}let s=await o.json().catch(()=>void 0);if(!o.ok)throw Error(s?.error??`The conversation ${e} failed (${o.status})`);return{ok:!0}}}async function b(){let e=g.env.CODER_HISTORY_TASK;if(!e)throw Error(`CODER_HISTORY_TASK is not set`);return{file:e,task:JSON.parse(await v.readFile(e,`utf8`))}}const x=[r({name:`reply`,description:`Post a reply now, such as before longer work. Never repeat text you already posted or will put in your final message.`,args:{text:s(o(),`Markdown to post.`)},access:`write`,run:async({text:e},t)=>{let{file:n,task:r}=await b();if(!r.conversation)throw Error(`Only conversation tasks can reply`);if(typeof e!=`string`||!e.trim())throw Error(`Reply text is required`);let i=await y(`reply`,{text:e.trim()},t.fetch);return u(h.dirname(n),{kind:`reply`,message:e.trim()}),i}}),r({name:`react`,description:`React to a message in this conversation with an emoji, by default the one that started your turn.`,args:{emoji:s(o(),`An emoji name such as thumbsup, or the emoji itself.`),message:c(`A message id from the conversation.`)},access:`write`,run:async({emoji:e,message:t},n)=>{let{task:r}=await b();if(!r.conversation)throw Error(`Only conversation tasks can react`);if(typeof e!=`string`||!e.trim())throw Error(`Emoji is required`);if(t!==void 0&&(typeof t!=`string`||!t.trim()))throw Error(`Message id must be a non-empty string`);let i=p(r.currentPrompt??r.prompt??``,!0)?.[0],a=t??i?.message?.id??i?.messages?.[0]?.id;if(i&&!a)throw Error(`This turn has no message to react to; give a message id`);return y(`react`,{emoji:e.trim(),...a?{message:a}:{}},n.fetch)}}),r({name:`history`,description:[`Search or read your own earlier turns in this task, including anything compacted out of your context, oldest first.`,"With query, the messages containing that exact text; without, the messages from `from` on.",`An event's message.index counts from 0; when your history starts later, read earlier messages with the platform's tools when they matter.`,`Messages from bots never arrive as turns; the platform's tools read the thread itself, theirs included.`].join(` `),args:{query:c(`Exact text to find, case-insensitive, 1 to 500 characters: a word or phrase from the message, not a question.`),from:s(n(e()),`Message index to start at; default the oldest, or after the last match.`),limit:s(n(e()),`Messages to return, 1 to 20; default 10.`),role:s(n(a([`all`,`conversation`])),`conversation: only platform messages and your replies; all (default): tool calls and results too.`)},access:`read`,run:async e=>d((await b()).task,e)})];var S=t({asyncTools:()=>w,taskApp:()=>D,taskTools:()=>O});const C={name:`review`,flow:`review`,limit:5,platform:`github`,args:(e,t,n)=>({...e.pr===void 0?{base:e.base??`HEAD`}:{pr:e.pr,...n?{post:!0,author:n}:{}},...e.path?.length?{path:e.path}:{},...e.exclude?.length?{exclude:e.exclude}:{},...e.depth?{depth:e.depth}:{},cwd:t}),render:async(e,t)=>{let{renderReviewMarkdown:n}=await import(`./flow/builtin/review/index.js`),r=e,i=n({...r,runId:t});return r.summary.url?`${i}\nThe review is on the pull request, so a reply repeating it adds nothing. Still answer anything else asked.\n`:r.pr?`${i}\nNot posted. To post it on the pull request as the user, escalate \`coder review --post --run ${t}\`.\n`:i}},w=[C],T=[...w.map(e=>e.name),`escalate`];function E(){let e=g.env.CODER_HISTORY_TASK;if(!e)throw Error(`CODER_HISTORY_TASK is not set`);return h.dirname(e)}const D=l({name:`task`,description:`This task's own tools.`,commands:[r({name:`escalate`,description:[`Ask a human to approve actions your environment refused.`,`Actions outside the sandbox are reviewed and may be refused; then take another way.`,`If the task truly needs refused actions, escalate them all in one call with the exact commands, then continue or end your turn.`,`The decision arrives as a message, in this turn while it runs, else in a new one.`,`Approved actions stay approved for the rest of the task; run them outside the sandbox directly.`].join(` `),args:{reason:c(`One short sentence: what the actions are for.`),actions:i(`Each action is exactly the command you will run once approved, nothing added; notes go in reason.`)},access:`read`,run:({reason:e,actions:t})=>{let n=(t??[]).map(e=>e.trim()).filter(Boolean);if(!e?.trim()||!n.length)throw Error(`reason and actions are required`);let r=E();return{approvalId:f(g.cwd(),h.basename(r),r,{reason:e.trim(),actions:n}).id,status:`pending`}}}),r({name:`review`,description:`Review changes with a read-only reviewer. One at a time, ${C.limit} per turn.`,args:{pr:s(n(e()),`A pull request to review. Posts the review (summary + findings) and a check, so do not announce or repeat them.`),base:c(`The ref to compare with; default HEAD, so only uncommitted changes.`),path:i(`Review only these paths, relative to the task directory.`),exclude:i(`Leave these paths out.`),depth:s(n(a([`low`,`medium`,`high`])),`What to report: low only critical and major defects, high nits too; medium by default.`),timeout:s(n(e()),`Stop the review after this many seconds.`)},access:`read`,run:async({timeout:e,...t})=>({runId:await m(E(),C,t,e),status:`started`})}),...x]});function O(e){let t=e.filter(e=>T.includes(e));return{...D,...t.length?{instructions:[`${t.join(` and `)} ${t.length>1?`return`:`returns`} at once;`,`the result arrives later as a message, in a new turn if yours has ended.`].join(` `)}:{},commands:D.commands.filter(t=>e.includes(t.name))}}export{S as i,D as n,O as r,w as t};
@@ -1 +1 @@
1
- import{command as e}from"./cli.js";const t=e({name:`tools-search`,description:`serve a turn's tool search over stdio`,access:`write`,globalFlags:{json:!1,cwd:!1},mcp:!1,async run(){let{serveToolSearch:e}=await import(`./tool-search-BkdgVolu.js`).then(e=>e.r),{serverCredential:t}=await import(`./mcp-BGam3G_B.js`);await e({credential:e=>t(e),localCredential:async(e,t)=>{let{localConnectionToken:n}=await import(`./connections-Cswv7r8Z.js`).then(e=>e.m);return n(e.connection??e.name,t)}})}});export{t as commandToolsSearch};
1
+ import{command as e}from"./cli.js";const t=e({name:`tools-search`,description:`serve a turn's tool search over stdio`,access:`write`,globalFlags:{json:!1,cwd:!1},mcp:!1,async run(){let{serveToolSearch:e}=await import(`./tool-search-C9Ty3hhL.js`).then(e=>e.r),{serverCredential:t}=await import(`./mcp-Caq72REF.js`);await e({credential:e=>t(e),localCredential:async(e,t)=>{let{localConnectionToken:n}=await import(`./connections-B90TemYf.js`).then(e=>e.m);return n(e.connection??e.name,t)}})}});export{t as commandToolsSearch};
@@ -1,3 +1,3 @@
1
- import{Sa as e,_a as t,ya as n}from"./args-CJsHYWbt.js";import{d as r}from"./approvals-CRwkc9vB.js";function i(e){let t=e.chat?.message;if(!t)return{text:e.text,author:{id:e.actor.id,...e.actor.login?{handle:e.actor.login}:{}}};let{author:n,metadata:r}=t;return{id:t.id,thread:e.chat.thread.id,...e.conversation?.index===void 0?{}:{index:e.conversation.index},text:e.text,...t.isMention?{mention:!0}:{},author:{id:n.userId,handle:n.userName,name:n.fullName,...n.isBot?{bot:!0}:{}},sentAt:r.dateSent,...r.edited?{edited:!0}:{},...t.attachments.length?{attachments:t.attachments.map(({type:e,url:t,name:n})=>({type:e,...t?{url:t}:{},...n?{name:n}:{}}))}:{},...t.links?.length?{links:t.links.map(({url:e,title:t})=>({url:e,...t?{title:t}:{}}))}:{}}}function a(e,t){let n=e.at(-1),r=n.chat?.thread,a=e.some(e=>e.mustReply),o=new Set(e.flatMap(e=>e.chat?.message?.id??[])),s=e.flatMap(e=>e.conversation?.since??[]).filter(({id:e,...t})=>{let n=e??JSON.stringify(t);return!o.has(n)&&!!o.add(n)}),c=s.slice(0,50),l=e.reduce((e,t)=>e+(t.conversation?.more??0),0)+s.length-c.length;return{handle:n.integration,event:n.type,...n.mustReply===void 0&&e.length===1?{}:{mustReply:a},...n.repo?{repository:`${n.repo.owner}/${n.repo.name}`}:{},...r?{conversation:{id:r.id,dm:r.isDM,...r.channelVisibility?{visibility:r.channelVisibility}:{}}}:{},...e.length===1?{message:i(n)}:{messages:e.map(i)},...c.length?{since:c}:{},...l?{more:l}:{},...t?{requester:{name:t.name}}:{}}}function o(r,i){return n(e(`event`,{children:e(t,{children:JSON.stringify(a(r,i))})}))}function s(r,i){let{message:o,...s}=a([r]),c={...s,event:`reactions`,mustReply:!1,reactions:i};return n(e(`event`,{children:e(t,{children:JSON.stringify(c)})}))}function c(e,t,n){if(!t)return e;let r=n===void 0?``:`\n**Pull request:** ${t.owner}/${t.name}#${n}`;return`**Repo:** ${t.owner}/${t.name}${r}\n\n${e}`}function l(r,i){return r.length?`${n(e(`history`,{children:e(t,{children:r.map(e=>`${e.user}: ${e.text}`).join(`
1
+ import{Sa as e,_a as t,ya as n}from"./args-CJsHYWbt.js";import{d as r}from"./approvals-C8XV7CK2.js";function i(e){let t=e.chat?.message;if(!t)return{text:e.text,author:{id:e.actor.id,...e.actor.login?{handle:e.actor.login}:{}}};let{author:n,metadata:r}=t;return{id:t.id,thread:e.chat.thread.id,...e.conversation?.index===void 0?{}:{index:e.conversation.index},text:e.text,...t.isMention?{mention:!0}:{},author:{id:n.userId,handle:n.userName,name:n.fullName,...n.isBot?{bot:!0}:{}},sentAt:r.dateSent,...r.edited?{edited:!0}:{},...t.attachments.length?{attachments:t.attachments.map(({type:e,url:t,name:n})=>({type:e,...t?{url:t}:{},...n?{name:n}:{}}))}:{},...t.links?.length?{links:t.links.map(({url:e,title:t})=>({url:e,...t?{title:t}:{}}))}:{}}}function a(e,t){let n=e.at(-1),r=n.chat?.thread,a=e.some(e=>e.mustReply),o=new Set(e.flatMap(e=>e.chat?.message?.id??[])),s=e.flatMap(e=>e.conversation?.since??[]).filter(({id:e,...t})=>{let n=e??JSON.stringify(t);return!o.has(n)&&!!o.add(n)}),c=s.slice(0,50),l=e.reduce((e,t)=>e+(t.conversation?.more??0),0)+s.length-c.length;return{handle:n.integration,event:n.type,...n.mustReply===void 0&&e.length===1?{}:{mustReply:a},...n.repo?{repository:`${n.repo.owner}/${n.repo.name}`}:{},...r?{conversation:{id:r.id,dm:r.isDM,...r.channelVisibility?{visibility:r.channelVisibility}:{}}}:{},...e.length===1?{message:i(n)}:{messages:e.map(i)},...c.length?{since:c}:{},...l?{more:l}:{},...t?{requester:{name:t.name}}:{}}}function o(r,i){return n(e(`event`,{children:e(t,{children:JSON.stringify(a(r,i))})}))}function s(r,i){let{message:o,...s}=a([r]),c={...s,event:`reactions`,mustReply:!1,reactions:i};return n(e(`event`,{children:e(t,{children:JSON.stringify(c)})}))}function c(e,t,n){if(!t)return e;let r=n===void 0?``:`\n**Pull request:** ${t.owner}/${t.name}#${n}`;return`**Repo:** ${t.owner}/${t.name}${r}\n\n${e}`}function l(r,i){return r.length?`${n(e(`history`,{children:e(t,{children:r.map(e=>`${e.user}: ${e.text}`).join(`
2
2
  `)})}))}\n\n${i}`:i}function u(i,a){let o=i?.turns??[],s=o.at(-2)?.finishedAt??0,c=(i?.approvals??[]).filter(e=>e.change&&o.length>0&&(e.response?.decision===`accept`||e.response?.decision===`decline`)&&Date.parse(e.response.answeredAt??``)>=s);return c.length?`${n(e(`decisions`,{children:e(t,{children:c.map(r).join(`
3
3
  `)})}))}\n\n${a}`:a}export{c as a,s as i,o as n,l as r,u as t};
@@ -1 +1 @@
1
- import{Ea as e}from"./args-CJsHYWbt.js";import{f as t}from"./state-Br-Fuaxg.js";import n from"node:process";import r from"node:fs";import{spawn as i}from"node:child_process";var a=e({PM_COMMANDS:()=>c,clearUpdateCache:()=>p,compareVersions:()=>u,detectPackageManager:()=>g,newerVersion:()=>m,refreshUpdateCache:()=>h});const o=`@wular/coder`,s=`https://registry.npmjs.org/${o}/latest`,c={npm:[`npm`,`install`,`-g`,`${o}@latest`],pnpm:[`pnpm`,`add`,`-g`,`${o}@latest`],yarn:[`yarn`,`global`,`add`,`${o}@latest`],bun:[`bun`,`add`,`-g`,`${o}@latest`]};function l(){return t(`update-check.json`)}function u(e,t){let n=String(e).split(`.`).map(e=>parseInt(e,10)||0),r=String(t).split(`.`).map(e=>parseInt(e,10)||0);for(let e=0;e<3;e+=1){if((n[e]??0)>(r[e]??0))return 1;if((n[e]??0)<(r[e]??0))return-1}return 0}function d(){try{return JSON.parse(r.readFileSync(l(),`utf8`))}catch{return null}}function f(e){try{r.mkdirSync(t(),{recursive:!0}),r.writeFileSync(l(),JSON.stringify(e))}catch{}}function p(){try{r.rmSync(l(),{force:!0})}catch{}}function m(e,t){if(n.env.CODER_NO_UPDATE_CHECK||n.env.CI)return;let r=d();if(!r?.checkedAt||Date.now()-r.checkedAt>864e5)try{i(n.execPath,[t,`upgrade`,`refresh`],{detached:!0,stdio:`ignore`}).unref()}catch{}return r?.latest&&u(r.latest,e)>0?r.latest:void 0}async function h(e){let t=d()?.latest??null;try{let e=await fetch(s,{signal:AbortSignal.timeout(3e3),headers:{accept:`application/json`}});if(e.ok){let n=await e.json();n?.version&&(t=n.version)}}catch{}f({checkedAt:Date.now(),latest:t,current:e})}function g(e){let t=e;try{t=r.realpathSync(e)}catch{}let n=t.replace(/\\/g,`/`);return/\/\.bun\//.test(n)?{pm:`bun`,command:c.bun}:/\/\.pnpm\//.test(n)||/\/pnpm(-global)?\//i.test(n)||/\/Library\/pnpm\//.test(n)?{pm:`pnpm`,command:c.pnpm}:/\/\.config\/yarn\/global\//.test(n)||/\/yarn\/global\//.test(n)||/\/Yarn\/Data\/global\//.test(n)?{pm:`yarn`,command:c.yarn}:{pm:`npm`,command:c.npm}}export{h as a,g as i,p as n,a as o,u as r,c as t};
1
+ import{Ea as e}from"./args-CJsHYWbt.js";import{f as t}from"./state-CxAUec80.js";import n from"node:process";import r from"node:fs";import{spawn as i}from"node:child_process";var a=e({PM_COMMANDS:()=>c,clearUpdateCache:()=>p,compareVersions:()=>u,detectPackageManager:()=>g,newerVersion:()=>m,refreshUpdateCache:()=>h});const o=`@wular/coder`,s=`https://registry.npmjs.org/${o}/latest`,c={npm:[`npm`,`install`,`-g`,`${o}@latest`],pnpm:[`pnpm`,`add`,`-g`,`${o}@latest`],yarn:[`yarn`,`global`,`add`,`${o}@latest`],bun:[`bun`,`add`,`-g`,`${o}@latest`]};function l(){return t(`update-check.json`)}function u(e,t){let n=String(e).split(`.`).map(e=>parseInt(e,10)||0),r=String(t).split(`.`).map(e=>parseInt(e,10)||0);for(let e=0;e<3;e+=1){if((n[e]??0)>(r[e]??0))return 1;if((n[e]??0)<(r[e]??0))return-1}return 0}function d(){try{return JSON.parse(r.readFileSync(l(),`utf8`))}catch{return null}}function f(e){try{r.mkdirSync(t(),{recursive:!0}),r.writeFileSync(l(),JSON.stringify(e))}catch{}}function p(){try{r.rmSync(l(),{force:!0})}catch{}}function m(e,t){if(n.env.CODER_NO_UPDATE_CHECK||n.env.CI)return;let r=d();if(!r?.checkedAt||Date.now()-r.checkedAt>864e5)try{i(n.execPath,[t,`upgrade`,`refresh`],{detached:!0,stdio:`ignore`}).unref()}catch{}return r?.latest&&u(r.latest,e)>0?r.latest:void 0}async function h(e){let t=d()?.latest??null;try{let e=await fetch(s,{signal:AbortSignal.timeout(3e3),headers:{accept:`application/json`}});if(e.ok){let n=await e.json();n?.version&&(t=n.version)}}catch{}f({checkedAt:Date.now(),latest:t,current:e})}function g(e){let t=e;try{t=r.realpathSync(e)}catch{}let n=t.replace(/\\/g,`/`);return/\/\.bun\//.test(n)?{pm:`bun`,command:c.bun}:/\/\.pnpm\//.test(n)||/\/pnpm(-global)?\//i.test(n)||/\/Library\/pnpm\//.test(n)?{pm:`pnpm`,command:c.pnpm}:/\/\.config\/yarn\/global\//.test(n)||/\/yarn\/global\//.test(n)||/\/Yarn\/Data\/global\//.test(n)?{pm:`yarn`,command:c.yarn}:{pm:`npm`,command:c.npm}}export{h as a,g as i,p as n,a as o,u as r,c as t};
@@ -1,2 +1,2 @@
1
- import{T as e,j as t,w as n}from"./args-CJsHYWbt.js";import{a as r,i,o as a,s as o}from"./integrations-BVmsk64f.js";const s=e=>({type:`mrkdwn`,text:e}),c=e=>({type:`plain_text`,text:e}),l=e=>({type:`section`,text:s(e.length>3e3?`${e.slice(0,2999)}…`:e)}),u=e=>e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`),d=({id:e,url:t,label:n,primary:r})=>({type:`button`,action_id:`${a}${e}`,text:{type:`plain_text`,text:n},url:t,...r?{style:`primary`}:{}}),f=(e,t)=>l([`*${u(e)}*`,t&&u(t)].filter(Boolean).join(`
1
+ import{T as e,j as t,w as n}from"./args-CJsHYWbt.js";import{a as r,i,o as a,s as o}from"./integrations-DSZSa8Rc.js";const s=e=>({type:`mrkdwn`,text:e}),c=e=>({type:`plain_text`,text:e}),l=e=>({type:`section`,text:s(e.length>3e3?`${e.slice(0,2999)}…`:e)}),u=e=>e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`),d=({id:e,url:t,label:n,primary:r})=>({type:`button`,action_id:`${a}${e}`,text:{type:`plain_text`,text:n},url:t,...r?{style:`primary`}:{}}),f=(e,t)=>l([`*${u(e)}*`,t&&u(t)].filter(Boolean).join(`
2
2
  `));function p({title:e,text:t,sections:n,links:r},i){return[f(e,t),...n.map(e=>({...f(e.title,e.text),...e.link?{accessory:d(e.link)}:{}})),...i?[{type:`divider`}]:[],{type:`actions`,elements:r.map(d)}]}async function m(e,t){let n=await e.home?.(t);!n||!e.installationId||await o(`views.publish`,{user_id:t,view:{type:`home`,blocks:p(n,!0)}},await e.token(e.installationId),e.fetch)}async function h(e,t,n){e.installationId&&await o(`chat.postMessage`,{channel:t,text:n.title,blocks:p(n),unfurl_links:!1,unfurl_media:!1},await e.token(e.installationId),e.fetch)}function g(e){let[,t=``,n=``]=/^slack:([^:]+):?(.*)$/.exec(e)??[];return{channel:t,...n?{thread_ts:n}:{}}}function _(e){return u(e).replace(/\*\*([^*\n]+)\*\*/g,`*$1*`).replace(/\[([^\]]+)\]\((https?:[^)\s]+)\)/g,`<$2|$1>`)}const v=e=>e.length>200?`${e.slice(0,199)}…`:e;function y({markdown:e,card:t,collapsed:n,buttons:a=[],hint:o,link:u}){let f=[...a.map((e,t)=>({type:`button`,action_id:`${e.ask?i:r}${t}`,text:{type:`plain_text`,text:e.label},value:e.ask?JSON.stringify({value:e.value,label:e.label,ask:e.ask}):e.value,...e.style?{style:e.style}:{},...e.confirm?{confirm:{title:{type:`plain_text`,text:`${e.label}?`},text:{type:`plain_text`,text:e.confirm.slice(0,300)},confirm:{type:`plain_text`,text:e.label},deny:{type:`plain_text`,text:`Cancel`}}}:{}})),...u?[d({id:`open`,...u})]:[]],p=n?.items&&n.items.length<=50?n.items:void 0,m=t?.outcome?{success:`complete`,failure:`error`}[t.outcome]:`pending`;return[t?{type:`card`,title:c(t.title),body:c(v(t.body)),...t.status?{subtext:s(v(_(t.status)))}:{},...f.length?{actions:f}:{}}:l(_(e)),...n?[p?{type:`plan`,block_id:`plan-${crypto.randomUUID()}`,title:n.summary,tasks:p.map((e,t)=>({task_id:`task-${t+1}`,title:e,status:m}))}:{...l(_(`**${n.summary}**\n${n.markdown}`)),expand:!1}]:[],...f.length&&!t?[{type:`actions`,elements:f}]:[],...o?[{type:`context`,elements:[s(_(o))]}]:[]]}const b=n({value:t(),label:t(),ask:n({label:t(),placeholder:e(t())})});async function x(e,t,n,r){let i=b.parse(JSON.parse(r));e.installationId&&await o(`views.open`,{trigger_id:t,view:{type:`modal`,callback_id:`ask`,title:c(i.label.slice(0,24)),submit:c(i.label.slice(0,24)),close:c(`Cancel`),private_metadata:JSON.stringify({...n,value:i.value}),blocks:[{type:`input`,block_id:`ask`,optional:!0,label:c(i.ask.label),element:{type:`plain_text_input`,action_id:`ask`,multiline:!0,focus_on_load:!0,...i.ask.placeholder?{placeholder:c(i.ask.placeholder)}:{}}}]}},await e.token(e.installationId),e.fetch)}async function S({ctx:e,thread:t},n){return(await o(`chat.postMessage`,{...g(t.id),text:n.markdown,blocks:y(n),unfurl_links:!1,unfurl_media:!1},await e.token(e.installationId),e.fetch)).ts}async function C({ctx:e,thread:t},n,r){await o(`chat.update`,{channel:g(t.id).channel,ts:n,text:r.markdown,blocks:y(r)},await e.token(e.installationId),e.fetch)}export{h as directMessage,C as editMessage,x as openAsk,S as postMessage,m as publishHome};
@@ -1 +1 @@
1
- import{u as e}from"./args-CJsHYWbt.js";import{i as t}from"./output-BKeyLbvt.js";import{command as n}from"./cli.js";import{T as r}from"./state-Br-Fuaxg.js";const i=n({name:`worker`,description:`run a task's turns, detached`,access:`write`,args:{"task-id":e()},globalFlags:{json:!1},cli:{positional:[`task-id`]},mcp:!1,async run({args:[e],cwd:n}){let{runWorker:i}=await import(`./worker-CIHY9L42.js`),a=r(n,e);a||t(`Worker: task ${e} not found.`),await i(n,a),process.exit(0)}});export{i as commandWorker};
1
+ import{u as e}from"./args-CJsHYWbt.js";import{i as t}from"./output-BKeyLbvt.js";import{command as n}from"./cli.js";import{T as r}from"./state-CxAUec80.js";const i=n({name:`worker`,description:`run a task's turns, detached`,access:`write`,args:{"task-id":e()},globalFlags:{json:!1},cli:{positional:[`task-id`]},mcp:!1,async run({args:[e],cwd:n}){let{runWorker:i}=await import(`./worker-DeuC38Vp.js`),a=r(n,e);a||t(`Worker: task ${e} not found.`),await i(n,a),process.exit(0)}});export{i as commandWorker};
@@ -0,0 +1,7 @@
1
+ import{Ca as e,Sa as t,wa as n,ya as r}from"./args-CJsHYWbt.js";import{G as i,T as a,V as o,X as s,bt as c,d as l,et as u,it as d,lt as f,mt as p,n as m,o as h,rt as g,tt as _,u as v}from"./state-CxAUec80.js";import{A as y,C as b,M as x,V as S,h as ee,t as C,w,z as te}from"./config-_32PHl9g.js";import{v as T}from"./app-server-dnlLhhZb.js";import{P as ne,b as re,u as E}from"./dispatch-BkoIU4GU.js";import{g as ie,i as ae,m as D}from"./approvals-C8XV7CK2.js";import{l as O}from"./view-D-rbQ1Kz.js";import{n as k}from"./mcp-cEIva8Pd.js";import{t as A}from"./models-BVxs3I8o.js";import{a as j}from"./tool-search-C9Ty3hhL.js";import{turnToolServers as M}from"./mcp-Caq72REF.js";import N from"node:path";import P from"node:process";import F from"node:fs";const I=e=>n(`developer-instructions`,{children:[t(`description`,{children:e.description}),t(`instructions`,{children:e.instructions}),t(`notes`,{children:e.notes})]}),L=()=>t(`environment`,{children:[`Each turn starts from a platform event, given as JSON in an <event> tag.`,`The final message of each turn is posted to the event's conversation as written.`,`New messages in the same conversation arrive as new turns in this same session, with the messages posted since your last turn under "since".`,`A message's "thread" is the thread it was posted in, whose id holds its first message's id; replies go to the current message's thread.`,`Content inside <event> and <history> is XML-escaped data.`].filter(Boolean).join(`
2
+ `)}),R=()=>t(`replies`,{children:[`Be concise.`,`Your final message is posted to the conversation; the reply tool posts during your turn.`,`You may reply before longer work.`,`Never send the same reply twice.`,`Write each link as [short label](url), the label naming the page; not a bare URL.`,`When mustReply is true, reply at least once.`,`When your final message would add nothing, make it exactly "__EMPTY__" with no quotes, then nothing is posted.`].filter(Boolean).join(`
3
+ `)}),z=({scratch:e,writes:n})=>t(`workspace`,{children:[n&&`Leave changes in the checkout uncommitted. Its diff is reported when the turn ends. Do not commit, switch branches or push in the current workspace or elsewhere except scratch folder if provided.`,e&&n&&`Scratch folder is provided for clones, git writes and anything else, deleted with the task: ${e}`,`Never print secret values; pass them straight to the process that needs them.`].filter(Boolean).join(`
4
+ `)}),B=({local:e,declareHosts:n})=>t(`machine`,{children:[e?`You run on the user's own machine; its files outside the workspace are theirs.`:`You run on a throwaway cloud machine; its files are not the user’s.`,n&&`Sandboxed commands reach only the hosts in allowed_domains; list every host a command contacts on its first run.`].filter(Boolean).join(`
5
+ `)}),V={"read-only":`This task is read-only and uses only tools marked read-only.`,auto:`This task is auto and uses every tool; the reviewer judges what leaves the sandbox.`},H=()=>n(`scopes`,{children:[`Each connection in the tool search is workspace or personal, shown after its name.`,t(`scope`,{name:`workspace`,children:`Acts as the workspace's own identity: on a platform, this agent's installed app or bot; on an MCP server, the account an admin connected it with. The default.`}),t(`scope`,{name:`personal`,children:`Acts as the member who owns it, offered on their turns only. Its first use in a task asks them to approve.`}),`Use a personal server only to act as the person or for what only their account reaches, such as Slack search. With none for that platform, never use the workspace server as them; give them the connection/add link. More: load_skill connections.`]}),U=({conversation:e,local:n,writes:r})=>t(`runtime`,{children:[!e&&r&&(n?`Do the work yourself; do not load the coder skill or dispatch Coder tasks.`:`Do the work yourself; do not dispatch Coder tasks.`),`Your turn ends with your final message; verify your work before it.${e?``:` ${f}`}`,e&&n&&`Do not load the coder skill.`].filter(Boolean).join(`
6
+ `)}),oe=r=>n(e,{children:[t(L,{}),t(R,{}),r.platform&&t(`platform`,{name:r.platform.name,children:r.platform.prompt})]}),W=r=>n(e,{children:[t(z,{...r}),!r.structured&&t(`result`,{children:`When finished, give a concise summary of what you did and found, naming the files or folders you changed.`}),t(`task-instructions`,{children:r.appendSystem})]}),G=r=>n(e,{children:[t(I,{...r.developer}),t(U,{...r}),t(B,{...r}),t(`access`,{children:r.access&&V[r.access]}),r.connections&&t(H,{}),r.conversation?t(oe,{...r}):t(W,{...r})]}),K=e=>r(t(G,{...e})),q={claude:{CLAUDE_CODE_DISABLE_AUTO_MEMORY:`1`},codex:{"features.memories":!1}};async function J(e,t,n,r={}){let i=e=>n({kind:`warning`,phase:`starting`,message:e}),a=te(t.access,t.promptParts?.access),s=await M(t,o(e,t.id),E(t.mcp,P.env,void 0,{onWarning:i}),{access:a});s.listed.length&&n({kind:`status`,phase:`starting`,message:`This turn's servers are ${s.listed.map(e=>e.name).join(`, `)}.`});let c=t.promptParts?K({...t.promptParts,...r,access:a,connections:s.listed.some(e=>j(e))}):t.systemPrompt;return{...s,systemPrompt:c}}function Y(e){P.connected&&P.send?.(e,void 0,void 0,e=>{e&&e.code!==`EPIPE`&&P.stderr.write(`coder worker: ${e.message}\n`)})}function X(e){return e.currentPrompt??e.prompt??``}async function se(e,t,n){_(e,t.id,{status:`running`,steerEndpoint:null,turnId:null,turnUsage:t.turnUsage??[]});let r=o(e,t.id),i=N.join(r,`log.jsonl`),s=p(i,F.existsSync(i)?F.statSync(i).size:0),l,u=n=>{let r=s().flatMap(e=>{let t=O(e);return t?[t]:[]}),i=r.flatMap(e=>e.message?.startsWith(`Steer accepted live:
7
+ `)?[e.message.slice(m.length)]:[]),a=r.filter(e=>e.kind===`reply`).at(-1)?.message;return T(`worker.record.start`,{taskId:t.id,finalized:!1}),ue(e,t,n,{steers:i,lastReply:a})},f=await n(t,{onResult:e=>{!l&&e.status===0&&!e.error&&(l=u(e))}}),h=[...t.previousThreadIds??[]];f.status===0&&t.threadId&&f.threadId&&t.threadId!==f.threadId&&!h.includes(t.threadId)&&h.push(t.threadId);let g=new Date().toISOString();return T(`worker.engine.closed`,{taskId:t.id}),l??=u(f),c(N.join(r,`result.json`),JSON.parse(d(f))),T(`worker.record.start`,{taskId:t.id,finalized:!0}),_(e,t.id,{turnUsage:[...a(e,t.id)?.turnUsage??[],{at:l,tokens:f.tokens,model:f.model}],status:f.status===0?`completed`:`failed`,completedAt:g,threadId:f.threadId,resumeThreadId:f.threadId,previousThreadIds:h,steerEndpoint:null,turnId:f.turnId??null}),T(`worker.result.recorded`,{taskId:t.id,finalized:!0}),f}function Z(e,t){let n=0;return()=>{Date.now()-n>=1e4&&(n=Date.now(),s(e,t))}}function Q(e,t,{echo:n}){let r=r=>{let i=JSON.parse(d(typeof r==`string`?{message:r}:r));h(e,t,i),n&&i.message&&P.stderr.write(`[coder] ${i.message}\n`)};for(let e of Object.keys(g()))P.env[e]!==void 0&&r({kind:`warning`,message:`${e} is temporarily unavailable; skipped for this task.`});return r}async function ce(e,t,{echo:n,env:r={},onResult:a}){let o=w(e),s=Q(e,t.id,{echo:n}),c=t.model?o.models?.[t.model]:void 0,l=c&&b(c)?c:void 0;if(l&&!l.wireApi&&t.model){let n=await A(l);n&&(l={...l,...n},o.models[t.model]=l,y(e,t.model,n),h(e,t.id,{kind:`info`,message:`detected wire api for ${t.model}: ${n.wireApi} @ ${l.baseUrl}`}))}let u=C[t.access??`auto`]??C.auto,d=u.approvalMode===`auto`,f=S(t.access??`auto`,o.network),p=ee(t.access??`auto`,f),m={approvalPolicy:u.approvalPolicy,approvalsReviewer:u.approvalsReviewer,...d?{onApprovalRequest:D(e=>s(e))}:{}},g=await J(e,t,s);try{return await ne(e,{availabilityChecked:P.env.CODER_ENGINE_CHECKED===`1`,prompt:X(t),developerInstructions:g.systemPrompt,outputSchema:t.outputSchema,model:x(t.model),...l&&t.model?{customModel:{alias:t.model,entry:l}}:{},configOverrides:{...Object.keys(r).length?{"shell_environment_policy.set":r}:{},...t.agentId?q.codex:{},...p.configOverrides},effort:t.effort,sandbox:u.sandbox,...m,networkAccess:p.networkAccess,mcpServers:g.servers,nativeMcp:t.nativeMcp??!1,writableRoots:u.sandbox===`read-only`?[]:[...t.addDirs??[],i(t.id)],onHeartbeat:Z(e,t.id),onResult:a,resumeThreadId:t.resumeThreadId??null,onControlReady:(n,r,i)=>{_(e,t.id,{status:`running`,steerEndpoint:n,threadId:r,turnId:i})},onProgress:n=>{s(n);let r=typeof n==`object`?n.threadId:null,i=typeof n==`object`?n.turnId:null;(r||i)&&_(e,t.id,{status:`running`,...r?{threadId:r}:{},...i?{turnId:i}:{}})}})}finally{_(e,t.id,{steerEndpoint:null})}}async function le(e,t,{echo:n,env:r={},onResult:a}){let s=o(e,t.id),c=w(e),l=Q(e,t.id,{echo:n}),u=await J(e,t,l,{declareHosts:(C[t.access??`auto`]??C.auto).approvalMode===`auto`});try{return await re(e,{env:{...r,...t.agentId?q.claude:{}},prompt:X(t),systemPrompt:u.systemPrompt,excludeDynamicSections:t.conversation,settingSources:t.agentId&&t.source&&![`cli`,`dashboard`,`schedule`].includes(t.source)?`project,local`:void 0,outputSchema:t.outputSchema,model:t.model,effort:t.effort,access:t.access,approvalTaskId:t.id,allowedNetworkHosts:S(t.access??`auto`,c.network),additionalDirectories:t.addDirs,scratch:i(t.id),local:t.promptParts?.local??!0,mcpServers:u.servers,nativeMcp:t.nativeMcp??!1,promptCacheTtl:t.conversation&&(r.ANTHROPIC_API_KEY||P.env.ANTHROPIC_API_KEY)?`1h`:void 0,taskRoot:s,resumeSessionId:t.resumeThreadId??null,onHeartbeat:Z(e,t.id),onResult:a,onSteerReady:n=>{_(e,t.id,{status:`running`,steerEndpoint:n})},onProgress:n=>{l(n),n.threadId&&_(e,t.id,{status:`running`,threadId:n.threadId})}})}finally{_(e,t.id,{steerEndpoint:null})}}function ue(e,t,n,r={}){let{steers:i=[],lastReply:a}=r,s=t.turnUsage?.at(-1)?.at,l=o(e,t.id);c(N.join(l,`result.json`),JSON.parse(d(n)));let u={at:new Date(Math.max(Date.now(),s?Date.parse(s)+1:0)).toISOString(),prompt:t.currentPrompt??t.prompt??null,...i.length?{steers:i}:{},...a?{lastReply:a}:{},...n};return F.appendFileSync(N.join(l,`results.jsonl`),`${d(u)}\n`,`utf8`),T(`worker.result.recorded`,{taskId:t.id,finalized:!1}),Y(`result`),u.at}function $(e){return async(e,t,n)=>{let r=await k(E(t.mcp,P.env,void 0,{onWarning:()=>{}})),i=t.access!==`read-only`,a={...r.env,...i?de(t):{}};try{let r=t.engine===`claude`?le:ce;return await se(e,t,(t,i)=>r(e,t,{...n,...i,env:a}))}finally{await r.close()}}}function de(e){let t=i(e.id);return{TMPDIR:t,BUN_TMPDIR:t,BUN_INSTALL_CACHE_DIR:N.join(t,`.bun-cache`),npm_config_cache:N.join(t,`.npm-cache`),PIP_CACHE_DIR:N.join(t,`.pip-cache`),UV_CACHE_DIR:N.join(t,`.uv-cache`),CARGO_HOME:N.join(t,`.cargo`),GOPATH:N.join(t,`go`),GOCACHE:N.join(t,`.go-cache`),...e.engine===`claude`?{CLAUDE_CODE_TMPDIR:t}:{}}}async function fe(e){if(P.env.CODER_MCP_MODE!==`cloud`||!e.name?.startsWith(`agent:`))return{};let[{liveConnections:t},{turnServers:n}]=await Promise.all([import(`./task-DN4assR8.js`).then(e=>e.l),import(`./actions-DO8MvHwc.js`).then(e=>e.t)]),r=await t(e)(e.connections??[]);for(let e of Object.keys(P.env))e.startsWith(`CODER_CONNECTION_`)&&delete P.env[e];Object.assign(P.env,r.env);let{selected:i,bindings:a}=n(e,r.mcp);return{mcp:i.mcp,mcpBindings:a}}async function pe(e,t){for(;;){let n=await u(e,t,()=>{let n=a(e,t);if(!n)return[];let r=n.status===`failed`||n.status===`cancelled`?[]:v(e,t);return r.length||(l(e,t),_(e,t,{steerClosed:!0,steerEndpoint:null}),Y(`settled`)),r});if(!n.length)return;for(let r of n)try{let n=a(e,t),i=_(e,t,{status:`running`,currentPrompt:r,resumedAt:new Date().toISOString(),error:void 0,resumeThreadId:n?.threadId??null,...n?await fe(n):{}});h(e,t,{message:`Running steered follow-up.`}),await $(i)(e,i,{echo:!1})}catch(n){let r=n instanceof Error?n.message:String(n);_(e,t,{status:`failed`,error:r,completedAt:new Date().toISOString()}),h(e,t,{kind:`error`,message:r});return}}}async function me(e,t){if(t.dispatchId&&!t.resumedAt)try{F.writeFileSync(N.join(o(e,t.id),`start-${t.dispatchId}`),``,{flag:`wx`})}catch(e){if(e.code===`EEXIST`)return;throw e}_(e,t.id,{status:`running`,pid:P.pid,steerClosed:!1});let n;try{if(t.name?.startsWith(`agent:`)){let{startInboxControl:r,applyTaskMessage:i}=await import(`./task-DN4assR8.js`).then(e=>e.l);n=r(o(e,t.id),t.name.slice(6),n=>i(e,a(e,t.id)??t,n))}P.env.CODER_SIMULATE_APPROVAL===`1`&&!t.resumedAt&&ie(e,t.id,o(e,t.id),{reason:`A dev hook (${ae}) raised this escalation at the start of the task.`,actions:[`echo simulated`]}),await $(t)(e,t,{echo:!1}),await pe(e,t.id)}catch(n){let r=n instanceof Error?n.message:String(n);throw _(e,t.id,{status:`failed`,error:r}),h(e,t.id,{kind:`error`,message:r}),n}finally{await u(e,t.id,()=>{a(e,t.id)?.pid===P.pid&&(_(e,t.id,{steerClosed:!0,steerEndpoint:null}),Y(`settled`))}),await n?.close()}}export{me as runWorker};
@@ -8,7 +8,7 @@ The built-in agent. On the hosted service it has an install link per platform; s
8
8
 
9
9
  ## On GitHub
10
10
 
11
- - A pull request opening, updating, or becoming ready gets a read-only [review](../review.md), posted as inline comments with a sticky summary. Reruns update the summary and never repeat a finding, and a new push replaces a review that has not started yet.
11
+ - A pull request opening, updating, or becoming ready gets a read-only [review](../review.md) through the agent's `review` tool, posted as one GitHub review with inline comments. Reruns never repeat a finding.
12
12
  - A review request for the agent does the same.
13
13
  - A mention (`@<app>` from a repository owner or member), in the conversation or in a finding's thread, answers from the diff and the repository, or makes the requested change on a branch and links the pull request.
14
14
  - An issue opening or edit reads the issue and the repository, then answers, makes the change and links the pull request, or asks one clarifying question.
package/docs/cli/index.md CHANGED
@@ -14,7 +14,7 @@ Coder turns any model into an agent you own: tasks on this machine, from your co
14
14
  - [model](model.md): manage models: built-ins, aliases, custom endpoints
15
15
  - [connection](connection.md): platform accounts and MCP servers tasks use
16
16
 
17
- ## `review [--base <base>] [--head <head>] [--pr <pr>] [--since <since>] [--path <path>] [--exclude <exclude>] [--post] [--md] [--model <model>] [--depth <depth>] [--json] [--cwd <cwd>]`
17
+ ## `review [--base <base>] [--head <head>] [--pr <pr>] [--since <since>] [--path <path>] [--exclude <exclude>] [--post] [--run <run>] [--md] [--model <model>] [--depth <depth>] [--json] [--cwd <cwd>]`
18
18
 
19
19
  review changed code with a built-in flow
20
20
 
@@ -22,7 +22,7 @@ Review changed code with a read-only agent. Every reported finding is checked
22
22
  against the repository. Runs the built-in `review` flow. A local review covers
23
23
  everything since the merge-base with the origin default branch, including
24
24
  uncommitted and untracked files. Changed submodules are reviewed file by file.
25
- PR reviews can post deduplicated inline comments.
25
+ PR reviews can post one review with inline comments, never repeating a finding.
26
26
 
27
27
  Related: `coder flow watch`, `coder docs review`.
28
28
 
@@ -32,7 +32,8 @@ Related: `coder flow watch`, `coder docs review`.
32
32
  - `--since <since>` keep only PR files and hunks changed since this commit
33
33
  - `--path <path>` review only this path, relative to cwd (repeatable)
34
34
  - `--exclude <exclude>` leave this path out, relative to cwd (repeatable)
35
- - `--post` post deduplicated inline comments and sticky PR summary
35
+ - `--post` post the review on the pull request, as the signed-in gh user
36
+ - `--run <run>` with --post, post this finished review run instead of reviewing again
36
37
  - `--md` markdown output (the default)
37
38
  - `--model <model>` model name[/effort] or engine/model[/effort] (sol/low, claude/opus, codex/gpt-6.1-sol/high) for the review task (default: reviewModel)
38
39
  - `--depth <depth>` what to report: low only critical and major, high nits too (default: medium)
@@ -45,6 +46,7 @@ coder review --base main # review everything since main locally
45
46
  coder review --path src --exclude src/gen # review src without generated code
46
47
  coder review --pr 42 --post # review and post to pull request 42
47
48
  coder review --depth high # report nits too
49
+ coder review --post --run <id> # post a finished review run
48
50
  ```
49
51
 
50
52
  ## `config [action] [key] [value] [--workspace] [--json] [--cwd <cwd>]`
@@ -17,7 +17,7 @@ For workspace Acme, agent Coder, and member Ada:
17
17
  | | Workspace | Ada's personal |
18
18
  |---|---|---|
19
19
  | Slack | `slack`: Coder's bot. Reads the channels it's in, can't search, posts as Coder. | `slack-user`: Ada's account. Searches everything Ada can see; acts as Ada. |
20
- | GitHub | `github-acme`: the app's installation on `acme`. Comments as `coder-cloud-ai[bot]`. | `github-user`: Ada's sign-in. A pull request shows Ada as its author. |
20
+ | GitHub | `github-acme`: the app's installation on `acme`. Comments, commits and pushes as `coder-cloud-ai[bot]`. | `github-user`: Ada's sign-in. Once Ada approves the act-as request, the turn commits and pushes as Ada, and a pull request lists Ada as its author. |
21
21
  | Linear | `linear-acme`: the app. "My issues" are the app's. | `linear-user`: Ada's sign-in. "My issues" are hers. |
22
22
  | Notion (MCP) | `notion`: a Notion MCP token from Acme's workspace owner. | `notion-user`: Ada's own Notion sign-in. |
23
23
 
package/docs/flows.md CHANGED
@@ -63,7 +63,7 @@ So a crash resumes where it stopped, and an edit to step 3 re-runs from step 3.
63
63
  2. `~/.coder/flows/`, in every workspace.
64
64
  3. Built-in flows, which a repo flow of the same name overrides.
65
65
 
66
- A path runs that file directly. `coder flow discover` lists what's runnable here. The built-in `review` is the `coder review` code review. It takes `pr`, `post`, `base`, `head`, `since`, `model` and `depth` and returns `{ findings, summary }`.
66
+ A path runs that file directly. `coder flow discover` lists what's runnable here. The built-in `review` is the `coder review` code review. It takes `pr`, `post`, `base`, `head`, `since`, `model` and `depth` and returns `{ note, body, findings, summary, pr? }`. Posting happens inside the flow; server tasks use the `review` tool instead of running this flow by name.
67
67
 
68
68
  ## Running
69
69
 
package/docs/review.md CHANGED
@@ -4,7 +4,7 @@ description: coder review, a read-only review of local changes or a pull request
4
4
 
5
5
  # Review
6
6
 
7
- `coder review`, or `/review <pr>` in the dashboard's **# Tasks → [New task]**, runs one read-only review task over local changes or a pull request, checks every finding against the repository, and prints the ones that hold. With `--post` it comments inline on the pull request and keeps one sticky summary; a posted finding is never posted again, even after its line moves. A local review covers everything since the merge-base with the origin default branch, committed or not, and never touches the index or working tree.
7
+ `coder review` runs one read-only review task over local changes or a pull request, checks every finding against the repository, and prints the ones that hold. With `--post` it posts one review on the pull request: the reviewer's one-line title and markdown body, followed by a list and footer built by code, and an inline comment for each new finding. A posted finding is never posted again, even after its line moves. A local review covers everything since the merge-base with the origin default branch, committed or not, and never touches the index or working tree.
8
8
 
9
9
  ```sh
10
10
  coder review # local changes since the default branch
@@ -19,12 +19,13 @@ coder review --pr 42 --post # pull request 42, posted as comments
19
19
  | `--base <ref>` | Older side of a local diff | Merge-base of `HEAD` and the origin default branch |
20
20
  | `--head <ref>` | Newer side of a local diff, commits only | The working tree |
21
21
  | `--pr <n \| url>` | Pull request number in the origin repo, or a GitHub pull request URL | Local diff |
22
- | `--since <sha>` | Keep only pull request hunks changed after this commit | Head in the previous sticky summary |
23
- | `--path <p>` | Review only this pathspec; repeatable | Everything |
24
- | `--exclude <p>` | Leave this pathspec out; repeatable | Nothing |
25
- | `--post` | Post inline comments and update the sticky summary; needs `--pr` | Print only |
22
+ | `--since <sha>` | Keep only pull request hunks changed after this commit | Head of the last posted review |
23
+ | `--path <p>` | Review only this pathspec, repeatable | Everything |
24
+ | `--exclude <p>` | Leave this pathspec out, repeatable | Nothing |
25
+ | `--post` | Post the review on the pull request as the signed-in `gh` user. Needs `--pr` | Print only |
26
+ | `--run <id>` | With `--post`, post a finished review run instead of reviewing again | Review now |
26
27
  | `--md` | Print Markdown | Enabled unless `--json` is used |
27
- | `--json` | Print `{ findings, summary, runId }` | Disabled |
28
+ | `--json` | Print `{ title, body, findings, summary, pr?, runId }` | Disabled |
28
29
  | `--model <spec>` | [Model spec](models.md#pick-a-model) for the review task | The workspace's `reviewModel` |
29
30
  | `--depth <low\|medium\|high>` | What to report: `low` critical and major defects, `medium` any defect a maintainer would act on, `high` also minor issues | `medium` |
30
31
  | `--cwd <dir>` | Checkout to review | Current directory |
@@ -37,12 +38,39 @@ The reviewer reads `AGENTS.md`, `CLAUDE.md`, and an optional `.coder/review.md`
37
38
 
38
39
  ## Submodules
39
40
 
40
- Changed submodules are reviewed file by file under their path. Uninitialized ones, ones missing a needed commit, and nested repositories that are not submodules are skipped with a warning, and submodule findings are never posted inline.
41
+ Changed submodules are reviewed file by file under their path. Uninitialized ones, ones missing a needed commit, and nested repositories that are not submodules are skipped with a warning. Submodule findings are listed in the posted review with their full path, never inline.
41
42
 
42
43
  ## Exit codes
43
44
 
44
45
  The command exits `0` when the review completes, even with findings, `1` when the diff, review, or posting fails, `3` when no engine starts, and `4` while a task awaits approval.
45
46
 
47
+ ## Posted review
48
+
49
+ One GitHub review per run: the reviewer's title and body, then the findings list headed `Reviewed b34340e: 3 issues` (the compare range on a rerun), each title linked to its inline thread at `file:12` or `file:12-20`. Basic output uses bold severity words and a small Markdown footer linking coder cloud (or coder cli) and the task when present. Inline comments put the bold severity between the title and failure. The CLI and self-hosted servers use basic output, with no images. With nothing found, `Nothing to report.`
50
+
51
+ Reviews post plain Markdown: bold severity words and a `Posted by` line. A server with `REVIEW_ASSETS` set ([Self-host](self-host.md)) shows themed severity pills and buttons from that path or URL instead. coder.wular.ai sets it to the SVGs its site serves.
52
+
53
+ - A rerun reviews only commits since the last posted review, and never posts a finding twice. After a force-push it says so.
54
+ - The reviewer sees up to 100 earlier findings on the pull request with their state, never reply text. Only a resolved thread settles one.
55
+ - Posting stops if the pull request moved since it was read: `The pull request moved to <sha7> since this review. Review again.`
56
+ - Model text cannot ping, add HTML, images or links.
57
+ - On a Coder server the review also runs a `Coder review` check on the head commit:
58
+ - `success`: clean, with no unresolved earlier findings.
59
+ - `neutral`: findings, earlier findings still unresolved (`no new issues, N unresolved`), or the review itself failed.
60
+ - `skipped`: the head moved. `cancelled`: stopped or timed out.
61
+
62
+ Findings never fail the check. Red means the change is broken, not that Coder had an opinion or an outage. Resolve a thread on GitHub to clear it. Any event on a pull request gets the check. It uses a separate checks-only token, and agent tokens never carry Checks. An installation that has not accepted the Checks permission yet gets reviews without the check. The CLI and local reviews post no check.
63
+
64
+ ## Who posts
65
+
66
+ - A pull request event or any task on a repository on a Coder server: the agent's `review` tool. The runner drives it with the agent's app token and the review posts as the app. A task started elsewhere, such as from Slack, gets its findings unposted. A `read-only` task posts only on its own event's pull request. The reviewer itself never gets the token.
67
+ - The `review` tool of a task on this machine: the findings come back unposted. Posting them as you takes your approval of `coder review --post --run <id>`.
68
+ - `coder review --pr <n> --post`: posts as the `gh` user signed in here.
69
+
70
+ A repository's own `.coder/flows/review.ts` replaces the built-in flow but gets neither the app's token nor the checks token, so it cannot post or set checks as the app.
71
+
72
+ A reviewer runs as the same OS user as its task, so a read-only sandbox stops writes, not reads: files the task's turn holds, including its git credential, are reachable. Only a machine sandbox or a separate user isolates them.
73
+
46
74
  ## From a task
47
75
 
48
- Every task has a `review` tool. It reviews the task's uncommitted changes in the background, or those since `base`, and sends the findings to the task as a message. One review runs at a time, at most 5 per turn.
76
+ Every task has a `review` tool. It reviews the task's uncommitted changes in the background, or those since `base`, or a pull request, and sends the findings to the task as a message. One review runs at a time, at most 5 per turn.
package/docs/self-host.md CHANGED
@@ -27,6 +27,7 @@ Required variables carry a *.
27
27
  | `CODER_CACHE_HOME` | path | OS cache directory for `wular-coder` | Archived tasks, flows and usage |
28
28
  | `WORK_DIR` | path | `~/.coder/state/global/server-tasks` | Where the local runner keeps each task's work folder: its working directory, or its checkout with a repository. The folder stays across turns and goes with `task delete` |
29
29
  | `SERVER_NAME` | string | `Coder` | What the dashboard calls this server, in its sidebar server menu |
30
+ | `REVIEW_ASSETS` | path or URL | unset | Themed images for posted pull request reviews (`sev-*` and `btn-*` SVGs, dark and light); a path resolves against `PUBLIC_URL`. Unset posts plain Markdown reviews |
30
31
  | `ISSUES_URL` | URL | `https://github.com/muzam1l/coder/issues/new` | Where the dashboard sends bug reports from its Report issue button |
31
32
  | `SERVER_LIMITS` | JSON | `{}` | Request rates and task slots ([Limits and monitoring](#limits-and-monitoring)) |
32
33
  | `CLAUDE_SUBSCRIPTIONS` | `1` | off | Offer **[Sign in with Claude]** for personal credentials |
@@ -98,7 +99,7 @@ Installs start from the dashboard. **[Connect GitHub]** adds the shared GitHub a
98
99
 
99
100
  Operators set up the shared apps in the dashboard's Operator area at `/dash/<workspace>/operator`, one per platform, named `SERVER_NAME` or Wular unless they pick a name, and every operator action lands in its audit log. Entering it asks for a fresh Wular Auth sign-in and lasts an hour, or 15 minutes without activity; on local and memory servers the admin token holder is the operator.
100
101
 
101
- Each task gets the narrowest platform token: on GitHub an installation token for the event's repository with only the permissions its tools need, on Slack the install's bot token.
102
+ Each task gets the narrowest platform token: on GitHub an installation token for the event's repository with only the permissions its tools need, on Slack the install's bot token. Each turn's git pushes with the installation covering the repository and commits as the app's bot. A member who approves acting as them on their GitHub connection gets the turn's pushes and commits under their own GitHub account instead. A GitHub App also asks for Checks: Read and write, for review checks; existing apps list it under **[Update on GitHub]**, and each installation accepts it once.
102
103
 
103
104
  ## Credentials
104
105
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wular/coder",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "The runtime for agents, your rules, any model, everywhere.",
5
5
  "type": "module",
6
6
  "main": "./dist/sdk.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "coder",
3
- "version": "0.4.13",
3
+ "version": "0.5.1",
4
4
  "description": "Delegate coding tasks to supervised Coder subagents running on Codex, Claude, or any OpenAI-compatible model. Your main context stays clean.",
5
5
  "author": {
6
6
  "name": "muzam1l"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "coder",
3
3
  "displayName": "Coder",
4
- "version": "0.4.13",
4
+ "version": "0.5.1",
5
5
  "description": "Delegate coding tasks to supervised Coder subagents running on Codex, Claude, or any OpenAI-compatible model. Your main context stays clean.",
6
6
  "author": {
7
7
  "name": "muzam1l"