@wular/coder 0.5.0 → 0.5.2

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 (267) hide show
  1. package/dist/{actions-CkMAM1Km.js → actions-C35tq9KH.js} +2 -2
  2. package/dist/{agent-Bi5nbUhA.js → agent-BZR4Eqdc.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-CCqOsEZH.js +18 -0
  6. package/dist/async-BP5q3Une.js +3 -0
  7. package/dist/{auth-oCvlHitk.js → auth-CJOm9_Vh.js} +1 -1
  8. package/dist/builtin/coder/system.md +6 -3
  9. package/dist/{chat-4AiZEqKh.js → chat-BD2Fu3jU.js} +1 -1
  10. package/dist/cli.js +3 -3
  11. package/dist/{cmd-Cu3OquA_.js → cmd-BH1bmZGs.js} +34 -34
  12. package/dist/{config-D_RuO6gX.js → config-_32PHl9g.js} +1 -1
  13. package/dist/{connection-BXjn7gCC.js → connection-DNzNYpha.js} +1 -1
  14. package/dist/{connections-Cswv7r8Z.js → connections-B90TemYf.js} +1 -1
  15. package/dist/{context-CFrDYenS.js → context-DVGPu7f_.js} +1 -1
  16. package/dist/dash/standalone/server/build-index.json +1 -1
  17. package/dist/dash/standalone/server/manifest.json +1406 -1406
  18. package/dist/dash/standalone/server/modules-server-server-react-server/src/client/{index.54c45900f2153d34.js → index.a036e2c6ae93ec75.js} +3 -5
  19. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/api/{load.252f972b42c690e2.js → load.3e1c235ecb89201a.js} +2 -2
  20. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/create/[id]/{page.11efd0e175db9053.js → page.ff03c26886d248d2.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.5b9c5a4ab975b01e.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.6e80433ca86c927d.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.e419e0eae59a1394.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.53dc6597be8d6049.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.82a238c790c19a6c.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.4a5c6f90ebaccf6f.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.ed696703c6fb5796.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.12dbb62edaa16b4f.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.1e7bb5f00112eeac.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.45adc3fb28e7d33b.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.1693e7dc34f5b94a.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.fbbcdf8fde222f1e.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.099f0e549e964a5c.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.577e64210260faf2.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.2d10853615403293.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.e6088baf4de7f41e.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.f0dfaf4552b8cde1.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.9f09979ad3435fe3.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.adaebe98ec9d32e8.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.e2dc60bbcac65b1f.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.d795b7112534872c.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.b74c6eb40c45b498.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.e27bcba279f82d7b.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.288736c2a52c7df4.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.58bad50dd8e60d63.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.83a490948f585e69.js} +4 -4
  47. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{layout.45a09107b19f0a7e.js → layout.61ad05aceb425910.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.6f71999915848a2c.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.4758811b7fc86d84.js} +5 -5
  50. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{page.5a5188f0fc75dcd2.js → page.7de674df6cd0e824.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.851275e04f8e7305.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.45a224c5e612b15f.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.6cacd41c18de261d.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.79a1355d894b8642.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.30db114aef2c6ff6.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.fa3b9eff6657bc57.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.2a8f6a5679fc5c4d.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.7681780b48e2aa3e.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.e9834546550a3c2c.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.ff9f3b3d88f2b8df.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.3f8a61434ceaa186.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.e439da4bae9d6d6c.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.371225925a83e900.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.c7d02e38464dec0b.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.885e5ae7913d8f5b.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.f8d48c80747830ee.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.70ce5ef3bcf56310.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.783070d7dbd198e4.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.db256c7f111b8f23.js} +22 -57
  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.6a331de70f3baff4.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.7ff2eadf13a3ee90.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.57c90c66384141a0.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.22e4f86847e1a3e2.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.c6b9db3ca88aaa1f.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.743fe359f09f5648.js} +2 -2
  79. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{stream.e3800e736f832124.js → stream.c7ffa724145ce870.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.b0ba5a1b4976ae27.js} +47 -20
  81. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/utils/{action.f22057e7dfac40fe.js → action.44115286faf6c0f8.js} +1 -1
  82. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/utils/{client.c8d7efefb6194d7d.js → client.b9225923da59febe.js} +1 -1
  83. package/dist/dash/standalone/static/assets/chunks/{advanced-list-850a950afe4f6996.js → advanced-list-4a393f37c461986f.js} +1 -1
  84. package/dist/dash/standalone/static/assets/chunks/{agent-pills-9f6fa120182db948.js → agent-pills-f07bea43753a9342.js} +1 -1
  85. package/dist/dash/standalone/static/assets/chunks/agent-settings-form-6c1b6776328cd046.js +1 -0
  86. package/dist/dash/standalone/static/assets/chunks/{agent-toggle-521136f20a71400d.js → agent-toggle-dabbca2fe4006852.js} +1 -1
  87. package/dist/dash/standalone/static/assets/chunks/{agents-grid-bcd13cd7a46224a6.js → agents-grid-a9440caa1768bfd8.js} +1 -1
  88. package/dist/dash/standalone/static/assets/chunks/{back-2d67134b122334f4.js → back-8ca96656264a0d1c.js} +1 -1
  89. package/dist/dash/standalone/static/assets/chunks/{chain-hint-53675e299a865420.js → chain-hint-c7994aad798ef430.js} +1 -1
  90. package/dist/dash/standalone/static/assets/chunks/{combo-cb2c62fe580a8903.js → combo-7b125f3927083749.js} +1 -1
  91. package/dist/dash/standalone/static/assets/chunks/composer-3efd63e2e0192937.js +1 -0
  92. package/dist/dash/standalone/static/assets/chunks/composer-a6cf207b9c69b43f.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-6e26ab941d655b9f.js} +1 -1
  95. package/dist/dash/standalone/static/assets/chunks/{connect-repositories-226bf70aa81c29d8.js → connect-repositories-90f1aedea6de7a99.js} +1 -1
  96. package/dist/dash/standalone/static/assets/chunks/{connections-list-a33d6637e2d52fcf.js → connections-list-90935e956e8f4626.js} +1 -1
  97. package/dist/dash/standalone/static/assets/chunks/{copy-294c6052b3b69424.js → copy-38fa78628f39ec10.js} +1 -1
  98. package/dist/dash/standalone/static/assets/chunks/create-link-a3c963721aa06a72.js +1 -0
  99. package/dist/dash/standalone/static/assets/chunks/{credentials-list-90fc1c6d202e1461.js → credentials-list-ae950b9891d30c29.js} +1 -1
  100. package/dist/dash/standalone/static/assets/chunks/{custom-range-efa1b6a71ba84597.js → custom-range-e9185a23187b3fe6.js} +1 -1
  101. package/dist/dash/standalone/static/assets/chunks/{editor-53a3e1a893644fff.js → editor-e0cc472111713852.js} +3 -3
  102. package/dist/dash/standalone/static/assets/chunks/{field-4d374d5ed3f43d7e.js → field-444bab2e16b91c26.js} +1 -1
  103. package/dist/dash/standalone/static/assets/chunks/instructions-7d9131eb37c4619e.js +1 -0
  104. package/dist/dash/standalone/static/assets/chunks/{instructions-d3dc01b2f90820db.js → instructions-9f173d4229d9b77e.js} +1 -1
  105. package/dist/dash/standalone/static/assets/chunks/{list-16247e39898cd20e.js → list-84356c9286747b10.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-eca9705ab89a2ce5.js} +1 -1
  108. package/dist/dash/standalone/static/assets/chunks/outcome-dialog-3006ae63624b3940.js +1 -0
  109. package/dist/dash/standalone/static/assets/chunks/{outcome-dialog-755fc581cbc2836e.js → outcome-dialog-c4d61a288688f53a.js} +1 -1
  110. package/dist/dash/standalone/static/assets/chunks/outcome-toast-ba59a3c06c25f0fd.js +1 -0
  111. package/dist/dash/standalone/static/assets/chunks/platform-actions-0c61a03082f9d169.js +1 -0
  112. package/dist/dash/standalone/static/assets/chunks/{platform-actions-08e9b3816dcd62b1.js → platform-actions-267a43c805e3c3a6.js} +1 -1
  113. package/dist/dash/standalone/static/assets/chunks/{platform-step-5881a8be1e761e00.js → platform-step-adfc87c1fa86e7e1.js} +1 -1
  114. package/dist/dash/standalone/static/assets/chunks/platform-step-fd1616528b2f6f12.js +1 -0
  115. package/dist/dash/standalone/static/assets/chunks/{runners-list-dd759d408c643a29.js → runners-list-c858c5546c6fd513.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-06cd41b5a2627452.js} +1 -1
  118. package/dist/dash/standalone/static/assets/chunks/{segmented-f646bfa8aa0aa449.js → segmented-15503e745dd97f56.js} +1 -1
  119. package/dist/dash/standalone/static/assets/chunks/{shared-init-b42d2c06c25d1e2b.js → shared-init-02666a6f76606589.js} +1 -1
  120. package/dist/dash/standalone/static/assets/chunks/shared-init-3fcac605fffcc273-2.js +1 -0
  121. package/dist/dash/standalone/static/assets/chunks/shared-init-7a7f1e623f0f5861.js +9 -0
  122. package/dist/dash/standalone/static/assets/chunks/{shared-init-953965859f7bf6b9.js → shared-init-a69029db2d72fb52.js} +1 -1
  123. package/dist/dash/standalone/static/assets/chunks/side-toggle-800f7bacd6de5aa8.js +1 -0
  124. package/dist/dash/standalone/static/assets/chunks/{tail-d13c4cc0cf11ffd1.js → tail-3024b828bce41f94.js} +1 -1
  125. package/dist/dash/standalone/static/assets/chunks/{task-423e6a3f2527f534.js → task-1e6f9ba22fb5e29f.js} +1 -1
  126. package/dist/dash/standalone/static/assets/chunks/{task-actions-5917357eac6504ca.js → task-actions-c8fe1201a56901d9.js} +1 -1
  127. package/dist/dash/standalone/static/assets/chunks/task-view-531e243f8222f802.js +3 -0
  128. package/dist/dash/standalone/static/assets/chunks/{tasks-list-2c5ce592e00fda45.js → tasks-list-5373f9a2772a386a.js} +1 -1
  129. package/dist/dash/standalone/static/assets/chunks/{versions-list-177ae397ad64dcea.js → versions-list-6642a24e9cef352b.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-02b9bb5ae78a37d6.js +1 -0
  139. package/dist/dash/standalone/static/assets/pnext-client-063d14b5b5c893a3.js +1 -0
  140. package/dist/dash/standalone/static/assets/pnext-client-1710a65c5b8280af.js +1 -0
  141. package/dist/dash/standalone/static/assets/pnext-client-2936b44e963219bc.js +1 -0
  142. package/dist/dash/standalone/static/assets/pnext-client-2f14cc4bf71bf456.js +1 -0
  143. package/dist/dash/standalone/static/assets/pnext-client-2f81535a69d0c8a3.js +1 -0
  144. package/dist/dash/standalone/static/assets/pnext-client-368d90341055d7ff.js +1 -0
  145. package/dist/dash/standalone/static/assets/pnext-client-58e0efbceb6c595f.js +1 -0
  146. package/dist/dash/standalone/static/assets/{pnext-client-7ecbd7a0cbe4e231.js → pnext-client-5fc693a6184e48a4.js} +1 -1
  147. package/dist/dash/standalone/static/assets/pnext-client-6ee756a74310a9fe.js +1 -0
  148. package/dist/dash/standalone/static/assets/pnext-client-713f7a6bc55d23fb.js +1 -0
  149. package/dist/dash/standalone/static/assets/pnext-client-7c91f8543cd360fa.js +1 -0
  150. package/dist/dash/standalone/static/assets/pnext-client-827b030f2c8e738e.js +1 -0
  151. package/dist/dash/standalone/static/assets/pnext-client-8b165b7e5c14a1f3.js +1 -0
  152. package/dist/dash/standalone/static/assets/pnext-client-95a81597ac1bdea0.js +1 -0
  153. package/dist/dash/standalone/static/assets/pnext-client-a4c2fb8a94ccce04.js +1 -0
  154. package/dist/dash/standalone/static/assets/pnext-client-a7faaaf8c4cc8145.js +1 -0
  155. package/dist/dash/standalone/static/assets/pnext-client-bab8ffb68e7dd229.js +1 -0
  156. package/dist/dash/standalone/static/assets/pnext-client-d9fab2611c2e7246.js +1 -0
  157. package/dist/dash/standalone/static/assets/pnext-client-f3804c9ffb299fe0.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-MggMiKA0.js} +1 -1
  163. package/dist/env-BwFCHakK.js +1 -0
  164. package/dist/{exec-CAaYFJD1.js → exec-CNygM6yF.js} +2 -2
  165. package/dist/{executor-Chc0zawh.js → executor-Ds4wDCzV.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-CVJU-ZD0.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-CqOUpEtl.js} +1 -1
  176. package/dist/{local-BMGcCk8N.js → local-DFrTuJFN.js} +1 -1
  177. package/dist/{login-BDKTNynK.js → login-93jO9qjx.js} +1 -1
  178. package/dist/maintenance-BuDKnfc7.js +1 -0
  179. package/dist/{mcp-BNz_l5TV2.js → mcp-CTVOR7r6.js} +1 -1
  180. package/dist/{mcp-BGam3G_B.js → mcp-EwT2mCaa.js} +1 -1
  181. package/dist/{mcp-BGx48pyR.js → mcp-cEIva8Pd.js} +6 -4
  182. package/dist/{models-D1NXi6ni.js → models-mKyePWrV.js} +1 -1
  183. package/dist/{permission-BkYxjiFR.js → permission-F6F25GJU.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-Cl-j8r3W.js +1 -0
  188. package/dist/{runner-DG9jrX5H.js → runner-DK0jnzPr.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 +49 -45
  193. package/dist/sdk.js +1 -1
  194. package/dist/serve-Cqlkgdfd.js +8 -0
  195. package/dist/{serve-B-5rDiZm.js → serve-DHe6dZM6.js} +1 -1
  196. package/dist/{session-Dtje9y-r.js → session-BMbMzzPu.js} +1 -1
  197. package/dist/{sessions-DIz9fyRN.js → sessions-BGUfSe8L.js} +1 -1
  198. package/dist/{shared--aE4olIO.js → shared-D-KqAi7b.js} +1 -1
  199. package/dist/{sign-in-wWkyaq5X.js → sign-in-Dv-rdYD4.js} +2 -2
  200. package/dist/{state-Br-Fuaxg.js → state-CxAUec80.js} +1 -1
  201. package/dist/store-BpDipcKB.js +349 -0
  202. package/dist/{task-CFt85vTy.js → task-BRHXn5y1.js} +1 -1
  203. package/dist/task-CzXNLREX.js +7 -0
  204. package/dist/{tool-search-BkdgVolu.js → tool-search-C9Ty3hhL.js} +1 -1
  205. package/dist/{tools-oQvFAnh5.js → tools-BCm26CeV.js} +1 -1
  206. package/dist/{tools-DNgEptor.js → tools-C69W1B6S.js} +1 -1
  207. package/dist/{tools-search-D1zArRyJ.js → tools-search-BDaeCoWe.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-DGhRPDDt.js +7 -0
  212. package/dist/{worker-BMuKKiIa.js → worker-DHNBRRl-.js} +1 -1
  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/side-toggle-8c21d39a1e284887.js +0 -1
  237. package/dist/dash/standalone/static/assets/chunks/task-view-c6ee43d2ddb6db90.js +0 -3
  238. package/dist/dash/standalone/static/assets/dash-param-org-agents-param-slug-platforms-25ae07e0b3f5b252.css +0 -1
  239. package/dist/dash/standalone/static/assets/pnext-client-095026242a079175.js +0 -1
  240. package/dist/dash/standalone/static/assets/pnext-client-1dfeb8c3ef155f87.js +0 -1
  241. package/dist/dash/standalone/static/assets/pnext-client-2358423351524403.js +0 -1
  242. package/dist/dash/standalone/static/assets/pnext-client-28a6557216627768.js +0 -1
  243. package/dist/dash/standalone/static/assets/pnext-client-31a4ee73945fee19.js +0 -1
  244. package/dist/dash/standalone/static/assets/pnext-client-3dfdc76bb8712b82.js +0 -1
  245. package/dist/dash/standalone/static/assets/pnext-client-4355ac87961d78c1.js +0 -1
  246. package/dist/dash/standalone/static/assets/pnext-client-43c7a0046572e0c9.js +0 -1
  247. package/dist/dash/standalone/static/assets/pnext-client-53dc7db68d67e0b1.js +0 -1
  248. package/dist/dash/standalone/static/assets/pnext-client-5835cb35488bdf7f.js +0 -1
  249. package/dist/dash/standalone/static/assets/pnext-client-638b390bc23ab1ae.js +0 -1
  250. package/dist/dash/standalone/static/assets/pnext-client-67f832c6c51a66cd.js +0 -1
  251. package/dist/dash/standalone/static/assets/pnext-client-6fc99f0abe77c2ea.js +0 -1
  252. package/dist/dash/standalone/static/assets/pnext-client-7d99965f28ac7604.js +0 -1
  253. package/dist/dash/standalone/static/assets/pnext-client-8250bd3b86d038a3.js +0 -1
  254. package/dist/dash/standalone/static/assets/pnext-client-bfd06805a43c6dee.js +0 -1
  255. package/dist/dash/standalone/static/assets/pnext-client-ce2943f17e9d9ac3.js +0 -1
  256. package/dist/dash/standalone/static/assets/pnext-client-ed31510d4615a5a5.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/remote-BbXx6S9P.js +0 -1
  262. package/dist/serve-CvnrGAj7.js +0 -12
  263. package/dist/store-CzQLgCzt.js +0 -352
  264. package/dist/task-N0qhnKpK.js +0 -7
  265. package/dist/worker-CIHY9L42.js +0 -7
  266. /package/dist/dash/standalone/server/modules-server-server-react-server/src/core/{types.5bf5a41cedb54154.js → types.9d22123d6296f5af.js} +0 -0
  267. /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{t as e}from"../errors-DK_trCff.js";import"../dispatch-BaW2X6Sc.js";import{n as t}from"../discover-DvzAbQvU.js";import{D as n,O as r,T as i,_ as a,c as o,d as s,f as c,g as l,h as u,m as d,p as f,u as p,v as m,w as h,y as g}from"../executor-Chc0zawh.js";const _=new Proxy({},{get(e,t){return p()?.[t]},has(e,t){let n=p();return n!=null&&t in Object(n)},ownKeys(){let e=p();return e?Reflect.ownKeys(Object(e)):[]},getOwnPropertyDescriptor(e,t){let n=p();if(n!=null&&t in Object(n))return{enumerable:!0,configurable:!0,value:n[t]}}}),v={run(e,t={}){return n(e,t)},list(e={}){return m(e).runs},discover(e){return t(e??process.cwd())},result(e,t={}){return i(e,t)},stream(e,t={}){return r(e,t).events},stop(e,t={}){return o(e,t)},resume(e,t={}){return h(e,t)},archive:a,delete:g};export{e as CoderError,_ as args,v as default,v as flowSdk,s as flow,c as gate,f as log,d as pipeline,u as steer,l as task};
1
+ import{t as e}from"../errors-DK_trCff.js";import"../dispatch-BkoIU4GU.js";import{n as t}from"../discover-BfYHHJN_.js";import{C as n,M as r,O as i,S as a,_ as o,b as s,c,g as l,h as u,j as d,k as f,m as p,p as m,v as h,x as g,y as _}from"../executor-Ds4wDCzV.js";const v=new Proxy({},{get(e,t){return m()?.[t]},has(e,t){let n=m();return n!=null&&t in Object(n)},ownKeys(){let e=m();return e?Reflect.ownKeys(Object(e)):[]},getOwnPropertyDescriptor(e,t){let n=m();if(n!=null&&t in Object(n))return{enumerable:!0,configurable:!0,value:n[t]}}}),y={run(e,t={}){return d(e,t)},list(e={}){return a(e).runs},discover(e){return t(e??process.cwd())},result(e,t={}){return f(e,t)},stream(e,t={}){return r(e,t).events},stop(e,t={}){return c(e,t)},resume(e,t={}){return i(e,t)},archive:g,delete:n};export{e as CoderError,v as args,y as default,y as flowSdk,p as flow,u as gate,l as log,o as onRunStop,h as pipeline,_ as steer,s as task};
@@ -1 +1 @@
1
- import{u as e}from"./args-CJsHYWbt.js";import{command as t}from"./cli.js";import{r as n,t as r}from"./permission-BkYxjiFR.js";const i=t({name:`hook`,description:`Claude's PreToolUse hook for approved actions and read-only servers`,access:`write`,args:{"task-id":e(),servers:e(`the 0600 file with the turn's read-only MCP servers`)},globalFlags:{json:!1},cli:{positional:[`task-id`]},mcp:!1,run:async({args:e,options:t,cwd:i})=>{let a=``;for await(let e of process.stdin)a+=e.toString();let o=JSON.parse(a),s=r(i,e[0],o)??await n(i,e[0],o,t.servers);s&&process.stdout.write(JSON.stringify(s))}});export{i as commandTaskHook};
1
+ import{u as e}from"./args-CJsHYWbt.js";import{command as t}from"./cli.js";import{r as n,t as r}from"./permission-F6F25GJU.js";const i=t({name:`hook`,description:`Claude's PreToolUse hook for approved actions and read-only servers`,access:`write`,args:{"task-id":e(),servers:e(`the 0600 file with the turn's read-only MCP servers`)},globalFlags:{json:!1},cli:{positional:[`task-id`]},mcp:!1,run:async({args:e,options:t,cwd:i})=>{let a=``;for await(let e of process.stdin)a+=e.toString();let o=JSON.parse(a),s=r(i,e[0],o)??await n(i,e[0],o,t.servers);s&&process.stdout.write(JSON.stringify(s))}});export{i as commandTaskHook};
@@ -1156,6 +1156,32 @@ interface SinceMessage {
1156
1156
  text: string;
1157
1157
  sentAt: string;
1158
1158
  }
1159
+ /** A pull request under review: its range, and the head of the reviewer's last finished review there. */
1160
+ interface ReviewTarget {
1161
+ repo: string;
1162
+ number: number;
1163
+ /** The handle whose reviews and comments count as the reviewer's own. */
1164
+ author: string;
1165
+ baseSha: string;
1166
+ headSha: string;
1167
+ since?: string;
1168
+ forcePushed?: boolean;
1169
+ prior?: Array<{
1170
+ file: string;
1171
+ line: number;
1172
+ title: string;
1173
+ state: 'open' | 'replied' | 'resolved';
1174
+ }>;
1175
+ }
1176
+ //#endregion
1177
+ //#region src/flow/builtin/review/post.d.ts
1178
+ /** Where a posted review links: Coder's own site, the task's page and, when themed, its images; `from` names who posted it. */
1179
+ interface ReviewLinks {
1180
+ from: 'cloud' | 'cli';
1181
+ coder: string;
1182
+ images?: string;
1183
+ task?: string;
1184
+ }
1159
1185
  //#endregion
1160
1186
  //#region src/core/config.d.ts
1161
1187
  /**
@@ -1166,8 +1192,8 @@ interface SinceMessage {
1166
1192
  */
1167
1193
  declare const engineSchema: z$1.ZodMiniEnum<{
1168
1194
  custom: "custom";
1169
- claude: "claude";
1170
1195
  codex: "codex";
1196
+ claude: "claude";
1171
1197
  }>;
1172
1198
  declare const effortSchema: z$1.ZodMiniEnum<{
1173
1199
  low: "low";
@@ -1357,7 +1383,7 @@ interface AgentRow {
1357
1383
  runsOn?: string;
1358
1384
  /** Nothing can run any of its models for the caller: no credential of theirs or the workspace's, no sign-in on this machine. */
1359
1385
  needsModel?: true;
1360
- /** Engines, and custom models as `custom/<name>`, that no workspace credential runs, so its settings can't pick them. */
1386
+ /** Engines, and custom models as `custom/<name>`, that no workspace credential runs, so an agent on them answers only members whose own credential does. */
1361
1387
  unrunnable?: string[];
1362
1388
  /** Why its definition is invalid; it answers no events until fixed. */
1363
1389
  problems?: string[];
@@ -1685,6 +1711,7 @@ interface Task {
1685
1711
  source?: string;
1686
1712
  author?: string;
1687
1713
  repo?: string;
1714
+ pullRequest?: number;
1688
1715
  mcp?: McpServerSpec[];
1689
1716
  mcpBindings?: Pick<McpServerSpec, 'name' | 'connection' | 'tools'>[];
1690
1717
  connections?: string[];
@@ -1883,6 +1910,7 @@ interface FlowHooks {
1883
1910
  runId: string;
1884
1911
  requestStop: () => void;
1885
1912
  runningIds: () => string[];
1913
+ stopHooks: Set<() => Promise<void>>;
1886
1914
  }) => void;
1887
1915
  onEvent?: (event: FlowEvent) => void;
1888
1916
  /** A cloud runner's credentials for one model, best first; none skips the model. Unset runs on the process's own logins. */
@@ -1902,9 +1930,12 @@ interface RunContext {
1902
1930
  running: Set<string>;
1903
1931
  taskCount: number;
1904
1932
  stopping: boolean;
1933
+ stopHooks: Set<() => Promise<void>>;
1905
1934
  hooks: FlowHooks;
1906
1935
  /** Caller-owned platform credential; in memory only, never written to flow.json. */
1907
1936
  integrationToken?: string;
1937
+ checksToken?: string;
1938
+ links?: ReviewLinks;
1908
1939
  connections?: {
1909
1940
  mcp: Record<string, McpServerSpec>;
1910
1941
  env: Record<string, string>;
@@ -1914,6 +1945,7 @@ interface RunContext {
1914
1945
  /** The credential each of its tasks runs on, by task id, so a steer resumes on it. */
1915
1946
  credentialEnv?: Map<string, NodeJS.ProcessEnv>;
1916
1947
  }
1948
+ declare function onRunStop(fn: () => Promise<void>): () => void;
1917
1949
  declare class Semaphore {
1918
1950
  limit: number;
1919
1951
  private active;
@@ -1994,6 +2026,8 @@ interface RunOptions {
1994
2026
  cwd?: string;
1995
2027
  /** Platform credential for built-in integrations; never persisted with the run. */
1996
2028
  integrationToken?: string;
2029
+ checksToken?: string;
2030
+ links?: RunContext['links'];
1997
2031
  connections?: RunContext['connections'];
1998
2032
  /** The agent's access, which caps every task this run starts. */
1999
2033
  access?: Access;
@@ -2162,10 +2196,12 @@ declare const flowSdk: {
2162
2196
  declare const description = "Review a code change.";
2163
2197
  declare const args: z.ZodObject<{
2164
2198
  pr: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>;
2199
+ repo: z.ZodOptional<z.ZodString>;
2165
2200
  base: z.ZodOptional<z.ZodString>;
2166
2201
  head: z.ZodOptional<z.ZodString>;
2167
2202
  since: z.ZodOptional<z.ZodString>;
2168
2203
  post: z.ZodOptional<z.ZodBoolean>;
2204
+ eventPr: z.ZodOptional<z.ZodNumber>;
2169
2205
  author: z.ZodOptional<z.ZodString>;
2170
2206
  path: z.ZodOptional<z.ZodArray<z.ZodString>>;
2171
2207
  exclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -2183,6 +2219,7 @@ declare const concurrency = 4;
2183
2219
  declare const Finding: z.ZodObject<{
2184
2220
  file: z.ZodString;
2185
2221
  line: z.ZodNumber;
2222
+ start_line: z.ZodNullable<z.ZodNumber>;
2186
2223
  severity: z.ZodEnum<{
2187
2224
  critical: "critical";
2188
2225
  major: "major";
@@ -2201,9 +2238,13 @@ declare const Finding: z.ZodObject<{
2201
2238
  summary: z.ZodString;
2202
2239
  failure_scenario: z.ZodString;
2203
2240
  }, z.core.$strict>;
2204
- type Finding = z.infer<typeof Finding> & {
2241
+ type Finding = Omit<z.infer<typeof Finding>, 'start_line'> & {
2242
+ start_line?: number;
2205
2243
  fingerprint: string;
2244
+ inline?: boolean;
2206
2245
  };
2246
+ /** The platform pull requests are reviewed on. */
2247
+ declare const REVIEW_PLATFORM = "github";
2207
2248
  interface ReviewSummary {
2208
2249
  baseSha: string;
2209
2250
  headSha: string;
@@ -2212,13 +2253,23 @@ interface ReviewSummary {
2212
2253
  files: number;
2213
2254
  model: string | null;
2214
2255
  elapsedMs: number;
2256
+ /** New inline comments, once a caller posted the review. */
2215
2257
  posted?: number;
2258
+ /** The posted review. */
2259
+ url?: string;
2260
+ checkUrl?: string;
2216
2261
  /** Parts left out of the review, such as uninitialized submodules. */
2217
2262
  warnings?: string[];
2218
2263
  }
2219
2264
  interface ReviewResult {
2265
+ /** The reviewer's headline; may be empty. */
2266
+ title: string;
2220
2267
  findings: Finding[];
2268
+ /** The reviewer's own markdown beyond the findings; may be empty. */
2269
+ body: string;
2221
2270
  summary: ReviewSummary;
2271
+ /** The reviewed pull request, for a caller that posts the review. */
2272
+ pr?: ReviewTarget;
2222
2273
  }
2223
2274
  /** A review's findings as the CLI prints them and a task receives them. */
2224
2275
  declare function renderReviewMarkdown(result: ReviewResult & {
@@ -2235,70 +2286,24 @@ interface ReviewServices {
2235
2286
  reviewTask?: typeof task;
2236
2287
  /** Test-only override for the transient task credential. */
2237
2288
  integrationToken?: string;
2289
+ request?: typeof fetch;
2238
2290
  }
2291
+ /** Posts a pull request review with the driver's token and links, else the local user's, once its head has not moved. */
2292
+ declare function postReviewHere(result: ReviewResult, cwd: string, request?: typeof fetch, token?: string | undefined): Promise<ReviewResult>;
2293
+ /** Posts a finished review run from this machine, as the person signed in to the platform there. */
2294
+ declare function postReviewRun(runId: string, cwd: string): Promise<ReviewResult & {
2295
+ runId: string;
2296
+ }>;
2297
+ /** Git config in the environment that sends `token` to the origin of `url`, the platform's clone host by default, kept out of the command line, with no system or global config read. */
2298
+ declare function fetchEnvironment(token: string, url?: string): Record<string, string>;
2299
+ /** A credentialed fetch that reads none of the checkout's config: it runs in a temporary bare repository holding the checkout's refs and writes into the checkout's object store, so the checkout reads the fetched commits. */
2300
+ declare function fetchInto(cwd: string, exec: ReviewExec, token: string, url?: string): {
2301
+ fetch: ReviewExec;
2302
+ env: Record<string, string>;
2303
+ close(): void;
2304
+ };
2239
2305
  declare function review(a: ReviewArgs, services?: ReviewServices): Promise<ReviewResult>;
2240
2306
  type ReviewExec = (command: string, args: string[], input?: string) => string;
2241
- type ReviewPostFinding = Finding;
2242
- type ReviewPostSummary = Pick<ReviewSummary, 'baseSha' | 'headSha' | 'model' | 'elapsedMs'> & {
2243
- author: string;
2244
- };
2245
- interface ReviewPostInput {
2246
- repo: string;
2247
- pr: number;
2248
- cwd?: string;
2249
- findings: ReviewPostFinding[];
2250
- summary: ReviewPostSummary;
2251
- since?: string;
2252
- }
2253
- interface ReviewTargetInput {
2254
- pr: number | string;
2255
- /** The only repository the target may be in. */
2256
- repo?: string;
2257
- cwd?: string;
2258
- since?: string;
2259
- author?: string;
2260
- }
2261
- interface ReviewTarget {
2262
- pr?: {
2263
- number: number;
2264
- repo: string;
2265
- author: string;
2266
- };
2267
- baseSha: string;
2268
- headSha: string;
2269
- since?: string;
2270
- }
2271
- interface ReviewAuth {
2272
- /** Installation token from the task context. Omit to use local gh auth. */
2273
- token?: string;
2274
- exec?: ReviewExec;
2275
- }
2276
- interface ReviewComment {
2277
- id: number;
2278
- body?: string | null;
2279
- user?: {
2280
- login?: string;
2281
- } | null;
2282
- }
2283
- declare function reviewCli(cwd?: string, token?: string): ReviewExec;
2284
- declare function parseGithubPr(value: number | string): {
2285
- number: number;
2286
- repo?: string;
2287
- };
2288
- declare function reviewFingerprints(comments: Array<{
2289
- body?: string | null;
2290
- }>): Set<string>;
2291
- declare function lastReviewSummary(comments: Array<{
2292
- id: number;
2293
- body?: string | null;
2294
- }>): {
2295
- id: number;
2296
- head: string;
2297
- } | undefined;
2298
- declare function ownReviewComments(comments: ReviewComment[], author: string): ReviewComment[];
2299
- /** Resolve and fetch a GitHub pull request for the integration-generic review flow. */
2300
- declare function resolveReviewTarget(input: ReviewTargetInput, auth?: ReviewAuth): ReviewTarget;
2301
- /** Post unseen findings and upsert the sticky summary through GitHub's integration. */
2302
- declare function postReview(input: ReviewPostInput, auth?: ReviewAuth): number;
2307
+ declare function reviewCli(cwd?: string, env?: Record<string, string>): ReviewExec;
2303
2308
  //#endregion
2304
- export { type FlowTaskOptions as $, type TaskResult as A, PlatformEvent as At, type CacheMigration as B, repositoryRules as C, TaskTurn as Ct, type reviewFingerprints as D, McpConfigEntry as Dt, type reviewCli as E, Effort as Et, type deleteRuns as F, type pipeline as G, type flow as H, type RunOptions as I, type DiscoveredFlow as J, type steer as K, type RunSummary as L, CoderError as M, type RunResult as N, type args$1 as O, config as Ot, type archiveRuns as P, type FlowStep as Q, type StopSummary as R, type renderReviewMarkdown as S, RunnerUpdate as St, type review as T, CustomModelConfig as Tt, type gate as U, type readTurnResults as V, type log as W, type FlowRecord as X, type FlowEvent as Y, type FlowSteerOptions as Z, type fingerprint as _, RunnerKind as _t, type ReviewPostFinding as a, type TurnResult as at, type parseGithubPr as b, RunnerSpec as bt, type ReviewResult as c, AgentRow as ct, type ReviewTarget as d, ConnectionRow as dt, FlowTaskResult as et, type ReviewTargetInput as f, LocalFolder as ft, type description as g, RunnerInput as gt, type concurrency as h, ProbeResult as ht, type ReviewExec as i, Task as it, type readTask as j, SinceMessage as jt, type flowSdk as k, Access as kt, type ReviewServices as l, AppSync as lt, changedLines as m, ModelsShape as mt, type ReviewArgs as n, Approval as nt, ReviewPostInput as o, TaskLogEntry as ot, args as p, LocalFolders as pt, task as q, ReviewAuth as r, Availability as rt, ReviewPostSummary as s, TokenUsage as st, Finding as t, GateResult as tt, ReviewSummary as u, Config as ut, lastReviewSummary as v, RunnerPairing as vt, type resolveReviewTarget as w, CoderConfig as wt, type postReview as x, RunnerTest as xt, type ownReviewComments as y, RunnerRow as yt, type review$1 as z };
2309
+ export { type TurnResult as $, type RunSummary as A, type steer as B, TaskResult as C, Access as Ct, type archiveRuns as D, type RunResult as E, type flow as F, type FlowSteerOptions as G, type DiscoveredFlow as H, type gate as I, type FlowTaskResult as J, type FlowStep as K, type log as L, review$1 as M, type CacheMigration as N, type deleteRuns as O, type readTurnResults as P, type Task as Q, type onRunStop as R, type flowSdk as S, config as St, type CoderError as T, SinceMessage as Tt, type FlowEvent as U, type task as V, type FlowRecord as W, type Approval as X, type GateResult as Y, type Availability as Z, type renderReviewMarkdown as _, TaskTurn as _t, type ReviewResult as a, type ConnectionRow as at, type reviewCli as b, Effort as bt, type args as c, ModelsShape as ct, type description as d, RunnerKind as dt, TaskLogEntry as et, type fetchEnvironment as f, RunnerPairing as ft, type postReviewRun as g, RunnerUpdate as gt, type postReviewHere as h, RunnerTest as ht, type ReviewExec as i, Config as it, type StopSummary as j, type RunOptions as k, type changedLines as l, ProbeResult as lt, fingerprint as m, RunnerSpec as mt, type REVIEW_PLATFORM as n, AgentRow as nt, ReviewServices as o, LocalFolder as ot, fetchInto as p, RunnerRow as pt, FlowTaskOptions as q, ReviewArgs as r, AppSync as rt, ReviewSummary as s, LocalFolders as st, Finding as t, TokenUsage as tt, concurrency as u, RunnerInput as ut, repositoryRules as v, CoderConfig as vt, type readTask as w, PlatformEvent as wt, type args$1 as x, McpConfigEntry as xt, type review as y, CustomModelConfig as yt, type pipeline as z };
@@ -0,0 +1,9 @@
1
+ import{Ea as e,N as t,P as n,S as r,T as i,_ as a,g as o,h as s,j as c,w as l,x as u}from"./args-CJsHYWbt.js";import{n as d}from"./types-DHBqXFE2.js";import{r as f}from"./crypto-Ittsv-m4.js";import{execFileSync as ee}from"node:child_process";import{createHash as te,createHmac as p,randomUUID as ne}from"node:crypto";const m=`https://api.github.com`;function h(e,t=`application/vnd.github+json`){return{accept:t,...e?{authorization:`Bearer ${e}`}:{},"user-agent":`coder`,"x-github-api-version":`2022-11-28`}}function re(e,t){return e.hook.before(`request`,e=>{e.request={...e.request,fetch:t}}),e}async function g(e,t=fetch){let[{createGitHubAdapter:n},{ConsoleLogger:r}]=await Promise.all([import(`./dist-Clxdruuu.js`),import(`./dist-B5qUdWUG.js`)]);return re(n({...typeof e==`string`?{installationToken:e}:e,apiUrl:m,webhookVerifier:()=>!1,logger:new r(`error`)}).octokit,t)}const _=e=>t=>{if(!e.includes(t.status??0))throw t},v=e=>{let[t=``,n=``]=e.split(`/`);return{owner:t,repo:n}};async function ie(e,t,n,r){let i=await(await g(n)).repos.getContent({...v(e),path:t,...r?{ref:r}:{},mediaType:{format:`raw`}}).catch(_([404]));return typeof i?.data==`string`?i.data:void 0}async function ae(e,t,n,r){let i=new URL(`${m}/repos/${e}/contents/${t}`);r.ref&&i.searchParams.set(`ref`,r.ref);let a=await r.fetch(i,{headers:{...h(n),...r.etag?{"if-none-match":r.etag}:{}}});if(a.status===304)return`unchanged`;let o=a.headers.get(`etag`)??void 0;if(a.status===404)return o?{etag:o}:{};if(!a.ok)throw Error(`GitHub answered ${a.status} reading ${e}/${t}`);let s=await a.json(),c=s.type===`file`&&s.encoding===`base64`?Buffer.from(s.content??``,`base64`).toString():void 0;return{...c===void 0?{}:{text:c},...o?{etag:o}:{}}}async function oe(e,t,n){let r=await(await g(n)).repos.getCommit({...v(e),ref:t,mediaType:{format:`sha`}}).catch(_([404,422]));return r?String(r.data).trim():void 0}async function se(e,t,n=fetch){let{login:r,id:i}=e;if(!r||i===void 0){let e=await g(t,n);({login:r,id:i}=r?(await e.users.getByUsername({username:r})).data:(await e.users.getAuthenticated()).data)}return{name:r,email:`${i}+${r}@users.noreply.github.com`,id:Number(i)}}async function ce(e,t,n,r=`HEAD`){let i=await g(n),a=v(e),o=`${t}/`,s=await i.git.getTree({...a,tree_sha:r,recursive:`1`}).catch(_([404]));if(!s)return[];let c=[],l=e=>e.startsWith(o)&&e.slice(o.length).split(`/`).length<=22;if(!s.data.truncated)return s.data.tree.flatMap(e=>e.type===`blob`&&e.path&&l(e.path)?[e.path.slice(o.length)]:[]);let u=async(e,t=``)=>{let{data:n}=await i.git.getTree({...a,tree_sha:e});await Promise.all(n.tree.map(async e=>{let n=t?`${t}/${e.path}`:e.path;n&&(e.type===`blob`&&l(n)?c.push(n.slice(o.length)):e.type===`tree`&&e.sha&&(o.startsWith(`${n}/`)||n.startsWith(o)&&l(n))&&await u(e.sha,n))}))};return await u(r),c.sort()}async function le(e,t,n,r){let i=await(await g(n)).repos.getContent({...v(e),path:t,...r?{ref:r}:{}}).catch(_([404]));return Array.isArray(i?.data)?i.data.map(e=>e.name):[]}async function ue(e,t=fetch){let n=[];for(let r=1;;r++){let i=await t(`${m}/installation/repositories?per_page=100&page=${r}`,{headers:{...h(e),authorization:`token ${e}`},signal:AbortSignal.timeout(1e4)});if(!i.ok)throw Error(`GitHub repositories failed: ${i.status}`);let a=await i.json();if(n.push(...a.repositories.map(e=>e.full_name)),n.length>=a.total_count||a.repositories.length<100)break}return[...new Set(n)]}async function de(e,t){let{data:n}=await(await g(t)).pulls.list({...v(e),state:`open`,sort:`created`,direction:`desc`,per_page:50});return n.map(e=>({number:e.number,title:e.title,author:e.user?.login,createdAt:e.created_at}))}async function fe(e,t){let{data:n}=await(await g(t)).repos.get(v(e));return{owner:n.owner.login,name:n.name,cloneUrl:n.clone_url,defaultBranch:n.default_branch}}async function pe(e,t,n,r){let i=await(await g(n,r)).repos.getCollaboratorPermissionLevel({...v(e),username:t}).catch(()=>void 0);return[`admin`,`maintain`,`write`].includes(i?.data.permission??``)}async function me(e,t,n,r){let i=await g(t,n),a=await i.paginate(i.repos.listCollaborators,{...v(e),affiliation:`all`,per_page:100}).catch(e=>{if(e.status!==403||!r)throw e});if(a)return a.map(e=>String(e.id));let o=[];for(let{id:t,login:n}of await r()){let r=n??(await i.request(`GET /user/{account_id}`,{account_id:Number(t)}).catch(_([404])))?.data.login,a=r&&await i.repos.getCollaboratorPermissionLevel({...v(e),username:r}).catch(_([404]));a&&a.data.permission!==`none`&&String(a.data.user?.id)===t&&o.push(t)}return o}async function he(e,t,n){let r=await g(t,n),[i=``,a=``]=e.split(`/`);return(await r.paginate(r.teams.listReposInOrg,{org:i,team_slug:a,per_page:100})).map(e=>e.full_name)}function ge(e,t,n){let r=`https://github.com/${e}`;return t?`${r}/tree/${n??`HEAD`}/${t}`:r}const y={"read-only":[`read`],auto:[`read`,`write`]};function _e(e,t,n,r){return{name:`github`,command:`github-mcp-server`,args:[`stdio`,`--toolsets=all`,...e.includes(`write`)?[]:[`--read-only`]],env:{GITHUB_PERSONAL_ACCESS_TOKEN:n},description:r?`On the user's token; acts as the user, in repositories both the user and this agent's GitHub App can access.`:`On the installation token; the repositories the app is installed on.`,instructions:[`issue_read reads an issue with its comments.`,`pull_request_read reads a pull request: get, get_diff, get_files, get_comments, get_reviews, get_review_comments.`].join(` `)}}function ve(e,{name:t,description:n,permissions:r,events:i,isPublic:a=!1}){let o=e.replace(/\/$/,``);return{name:t,...n?{description:n}:{},url:o,hook_attributes:{url:`${o}/hooks/github`,active:!0},redirect_url:`${o}/create/github/callback`,callback_urls:[`${o}/install/github/callback`,`${o}/connect/github/callback`],request_oauth_on_install:!0,public:a,default_permissions:r,default_events:[...new Set([...i,`repository`])]}}function ye(e,t){let n=e?`https://github.com/organizations/${encodeURIComponent(e)}/settings/apps/new`:`https://github.com/settings/apps/new`;return t?`${n}?state=${encodeURIComponent(t)}`:n}async function be(e,t=fetch){let n=await t(`${m}/app-manifests/${encodeURIComponent(e)}/conversions`,{method:`POST`,headers:h()});if(!n.ok)throw Error(`GitHub App manifest conversion failed: ${n.status}`);let r=await n.json(),i=r.app_id??r.id;if(!i||!r.slug||!r.pem||!r.webhook_secret||!r.client_id||!r.client_secret)throw Error(`GitHub App manifest conversion response was incomplete`);return{appId:String(i),slug:r.slug,privateKey:r.pem,webhookSecret:r.webhook_secret,clientId:r.client_id,clientSecret:r.client_secret,...r.owner?.login?{owner:{login:r.owner.login,type:r.owner.type}}:{}}}const b=`https://github.com/login/oauth`,xe=e=>`${e.replace(/\/$/,``)}/install/github/callback`;function x(e){let{clientId:t,clientSecret:n}=e;if(!t||!n)throw Error(`This GitHub App has no OAuth client; create it again`);return{clientId:t,clientSecret:n}}async function Se(e,t,n,r){let{clientId:i,clientSecret:a}=x(e),o=await n(`${b}/access_token`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:i,client_secret:a,...t})}),s=await o.json().catch(()=>({}));if(!o.ok||!s.access_token)throw new d(`platform-error`,s.error??String(o.status),`GitHub authorization failed: ${s.error_description??s.error??o.status}`);return{accessToken:s.access_token,...s.refresh_token?{refreshToken:s.refresh_token}:{},...s.expires_in?{expiresAt:r+s.expires_in*1e3}:{}}}async function Ce(e,t){let n=await t(`${m}/user`,{headers:h(e)}),r=await n.json().catch(()=>({}));if(!n.ok||!r.id||!r.login)throw Error(`GitHub user lookup failed: ${n.status}`);return{id:r.id,login:r.login}}async function we(e,t,n,r=fetch){for(let i=1;i<=10;i++){let a=await r(`${m}/user/installations?per_page=100&page=${i}`,{headers:h(e)});if(!a.ok)throw Error(`GitHub installation check failed: ${a.status}`);let o=(await a.json()).installations??[],s=o.find(e=>String(e.id)===n&&String(e.app_id)===t);if(s)return{login:s.account?.login??`unknown`,...s.account?.type?{type:s.account.type}:{}};if(o.length<100)return}}async function S(e){let{createAppAuth:t}=await import(`./dist-node-B8VIVzUc.js`),{token:n}=await t({appId:e.appId,privateKey:e.privateKey})({type:`app`});return n}async function Te(e,t,n=fetch){let r=await S(e),i=await n(`${m}/app/installations/${encodeURIComponent(t)}`,{headers:h(r)});if(i.status===404)return!1;if(!i.ok)throw Error(`GitHub installation lookup failed: ${i.status}`);return!0}async function C(e,t,n,r){let i=new URL(e.url).searchParams.get(`code`);if(!i)throw new d(`missing-code`);let a=await Se(t,{code:i,...n?{redirect_uri:n}:{}},r,Date.now()),o=await Ce(a.accessToken,r);return{id:String(o.id),login:o.login,token:JSON.stringify(a),accessToken:a.accessToken}}const Ee={authorizeUrl(e,{publicUrl:t,state:n}){let r=new URLSearchParams({client_id:x(e).clientId,redirect_uri:`${t.replace(/\/$/,``)}/connect/github/callback`,state:n});return`${b}/authorize?${r}`},async exchange(e,t,{publicUrl:n,fetch:r}){let{accessToken:i,...a}=await C(e,t,`${n.replace(/\/$/,``)}/connect/github/callback`,r);return a},async access(e,t,{fetch:n,now:r,force:i}){let a=JSON.parse(e);if(!a.refreshToken){if(i)throw new d(`platform-error`,`invalid_token`,`The refused token has no refresh token`);return{accessToken:a.accessToken}}if(!i&&(!a.expiresAt||a.expiresAt-3e5>r))return{accessToken:a.accessToken};let o=await Se(t,{grant_type:`refresh_token`,refresh_token:a.refreshToken},n,r);return{accessToken:o.accessToken,refreshed:JSON.stringify(o)}}};function De(e){return Array.isArray(e)?e.every(e=>y[`read-only`].includes(e))?`read-only`:`auto`:e}const Oe={"read-only":{metadata:`read`,contents:`read`,pull_requests:`write`,issues:`write`},auto:{metadata:`read`,contents:`write`,pull_requests:`write`,issues:`write`}};function w(e=`auto`){return{...Oe[De(e)]}}const T={pull_request:[`pull_request`],issue:[`issues`],comment:[`issue_comment`,`pull_request_review_comment`],mention:[`issue_comment`,`pull_request_review_comment`]},ke=[`member`,`membership`,`organization`,`team`];function Ae(e){return[...new Set([...e.flatMap(e=>T[e]??[]),`push`,`repository`,...ke])]}function E(e,t,n){let{events:r}=t;return ve(e,{name:t.name,description:t.description,permissions:{...w(t.access),...r.some(e=>Object.hasOwn(T,e))?{issues:`write`,pull_requests:`write`,checks:`write`}:{},members:`read`},events:Ae(r),isPublic:n})}const D=(e,t)=>t?.type===`Organization`?`https://github.com/organizations/${encodeURIComponent(t.login)}/settings/apps/${e}`:`https://github.com/settings/apps/${e}`,je={read:1,write:2,admin:3},Me={read:`Read-only`,write:`Read and write`,admin:`Admin`},O=e=>e[0].toUpperCase()+e.slice(1).replaceAll(`_`,` `);async function Ne(e,t,{publicUrl:n,spec:r,fetch:i}){let a=await i(`${m}/app`,{headers:h(await S(t))});if(!a.ok)throw Error(`GitHub app lookup failed: ${a.status}`);let o=await a.json(),s=E(n,r),c=new Set(o.events??[]),l=o.permissions??{},u=[],d=s.description??``;d!==(o.description??``)&&u.push(d?{text:`Set the **Description**`,copy:d}:{text:`Clear the **Description**`});for(let[e,t]of Object.entries(s.default_permissions))(je[l[e]??``]??0)<(je[t]??0)&&u.push({text:`Set **${O(e)}** to **${Me[t]??t}**`});for(let e of s.default_events)c.has(e)||u.push({text:`Check the **${O(e)}** event`});for(let e of c)s.default_events.includes(e)||u.push({text:`Uncheck the **${O(e)}** event`});let f=o.owner?.login?{login:o.owner.login,type:o.owner.type}:t.owner;return{url:`${D(o.slug??t.slug,f)}/permissions`,label:`Open app settings`,lines:u}}const Pe={shareable:!0,postOrigins:[`https://github.com`],createPost({publicUrl:e,spec:t,state:n,owner:r,public:i}){let a=E(e,t,i===!0);return{url:ye(r,n),fields:{manifest:JSON.stringify(a)}}},async createCallback(e,{fetch:t}){let n=new URL(e.url).searchParams.get(`code`);if(!n)throw new d(`missing-code`);let r=await be(n,t),i={appId:r.appId,slug:r.slug,privateKey:r.privateKey,webhookSecret:r.webhookSecret,clientId:r.clientId,clientSecret:r.clientSecret,...r.owner?{owner:r.owner}:{}};return{platformAppId:r.appId,name:r.slug,credentials:i}},accountUrl:({login:e})=>`https://github.com/${encodeURIComponent(e)}`,async uninstall(e,t,{fetch:n}){let r=e.id.split(`:`).pop(),i=await n(`${m}/app/installations/${encodeURIComponent(r)}`,{method:`DELETE`,headers:h(await S(t))});if(!i.ok)throw Error(`GitHub answered ${i.status} to the uninstall`)},installationUrl:({id:e,account:t})=>t.type===`Organization`?`https://github.com/organizations/${encodeURIComponent(t.login)}/settings/installations/${e.split(`:`).pop()}`:`https://github.com/settings/installations/${e.split(`:`).pop()}`,settingsUrl(e,t){let{slug:n,owner:r}=t;return r?D(n,r):void 0},drift:(e,t,n)=>Ne(e,t,n),installUrl(e,t,{publicUrl:n,state:r,installation:i}){let{slug:a}=t;if(!i)return`https://github.com/apps/${a}/installations/new?state=${encodeURIComponent(r)}`;let o=new URLSearchParams({client_id:x(t).clientId,redirect_uri:xe(n),state:r});return`${b}/authorize?${o}`},async installedApp(e,{apps:t,fetch:n}){let r=new URL(e.url).searchParams.get(`installation_id`);if(!(!r||!/^\d+$/.test(r))){for(let{app:e,credentials:i}of t)if(await Te(i,r,n).catch(t=>(console.error(`asking GitHub whether ${e.id} owns installation ${r} failed`,t),!1)))return{app:e,installation:r}}},async installCallback(e,{credentials:t,publicUrl:n,fetch:r,installation:i}){let a=i??new URL(e.url).searchParams.get(`installation_id`);if(!a)throw new d(`missing-code`);let{accessToken:o,...s}=await C(e,t,i?xe(n):void 0,r),c=await we(o,t.appId,a,r);if(!c)throw new d(`not-yours`);return{platformInstallId:a,account:c,installer:s.id,user:s}}};async function Fe(e,t,n={},r){let{token:i,expiresAt:a}=await(await g({appId:e.appId,privateKey:e.privateKey,installationId:Number(t)},r)).auth({type:`installation`,installationId:t,...n.permissions?{permissions:n.permissions}:{}});return{token:i,expiresAt:Date.parse(a)}}function Ie(e,t){let{appId:n,privateKey:r}=e,{permissions:i}=Le(t);return te(`sha256`).update(JSON.stringify([n,r,i?Object.entries(i).sort():null])).digest(`base64url`)}function Le(e={}){return e.purpose===`checks`?{permissions:{metadata:`read`,checks:`write`}}:e.tools?{permissions:w(e.tools)}:{}}const Re=async(e,t,n,{fetch:r,hold:i}={})=>{let a=()=>Fe(t,e.id.split(`:`).pop(),Le(n),r);return i?i(Ie(t,n),a):(await a()).token};function k(e){return e&&typeof e==`object`?e:{}}function A(e){return e?.agent===!0||e?.type===`Bot`||e?.login?.endsWith(`[bot]`)===!0}function ze(e,t){return[e,t].filter(e=>!!e).join(`
2
+
3
+ `)}const Be=(e,t)=>RegExp(`(^|[^\\w-])@${t}(?![\\w-])`,`i`).test(e),Ve=[`OWNER`,`MEMBER`],He=[`issue_comment`,`pull_request_review_comment`],Ue=[...He,`ping`];function j(e){try{return JSON.parse(e)}catch{return}}function We(e,t,n){if(!n||!t?.startsWith(`sha256=`))return!1;let r=Buffer.from(p(`sha256`,n).update(e).digest(`hex`),`hex`);return f(Buffer.from(t.slice(7),`hex`),r)}function Ge(e,t,n,r,i){let a=n.installation?.id,o=Ye(n),s=i.user??n.sender;if(a===void 0||!o||!i.number)return;let c=s?.author_association;return{integration:`github`,type:r,appId:t.id,installationId:String(a),deliveryId:e.headers.get(`x-github-delivery`)??``,actor:{id:String(s?.id??s?.login??``),...s?.login?{login:s.login}:{},...c?{role:c}:{},...A(s)?{agent:!0}:{}},text:i.body??``,...Be(i.body??``,i.slug)?{mentioned:!0}:{},repo:o,space:M(n),chat:{thread:N(`${o.owner}/${o.name}`,i.number,i.kind===`pull`)}}}function M(e){let t=e.repository;if(!(!t?.owner?.login||!t.name))return{kind:`repository`,id:`${t.owner.login}/${t.name}`,...typeof t.private==`boolean`?{private:t.private}:{}}}function Ke(e){let t=e,n=M(t),r=t.installation?.id;if(!(!n||r===void 0)&&(t.action===`privatized`||t.action===`publicized`))return{installation:String(r),space:{...n,private:t.action===`privatized`}}}function qe(e){let t=k(e),n=M(t),r=t.installation?.id,i=t.member?.id;if(!(!n||r===void 0||i===void 0)&&[`added`,`edited`,`removed`].includes(t.action??``))return{installation:String(r),space:{kind:n.kind,id:n.id},...t.action===`removed`?{left:String(i)}:{joined:String(i)}}}function Je(e,t){let n=k(t),r=n.installation?.id,i=n.organization?.login;if(r===void 0||!i)return;let a=String(r),o=n.team?.slug?`${i}/${n.team.slug}`:void 0,s=n.repository?.full_name,c=n.action??``;if(e===`membership`&&n.scope===`team`&&o)return{installation:a,team:o};if(e===`team`&&[`added_to_repository`,`removed_from_repository`].includes(c))return s?{installation:a,spaces:[s]}:o?{installation:a,team:o}:void 0;if(e===`team`&&c===`deleted`||e===`organization`&&[`member_added`,`member_removed`].includes(c))return{installation:a}}function Ye(e){let t=e.repository;return t?.owner?.login&&t.name&&t.clone_url&&t.default_branch?{owner:t.owner.login,name:t.name,cloneUrl:t.clone_url,defaultBranch:t.default_branch}:void 0}function N(e,t,n){return{_type:`chat:Thread`,adapterName:`github`,channelId:`github:${e}`,id:`github:${e}:${n?``:`issue:`}${t}`,isDM:!1}}function Xe(e,t,n,r){let i=k(t),a=e.headers.get(`x-github-event`);if(a===`pull_request`){let t=i.pull_request,a=i.action??``,o=i.requested_reviewer?.login?.toLowerCase();if(!t||![`opened`,`synchronize`,`reopened`,`ready_for_review`,`review_requested`].includes(a)||a===`review_requested`&&o!==`${r.slug}[bot]`.toLowerCase()||t.draft||a!==`review_requested`&&A(t.user)||!t.number||t.head?.repo?.full_name!==i.repository?.full_name)return[];let s=Ge(e,n,i,`pull_request`,{user:i.sender??t.user,body:ze(t.title,t.body),number:t.number,kind:`pull`,slug:r.slug});return s?[s]:[]}if(a===`issues`){let t=i.issue;if(!t||![`opened`,`edited`].includes(i.action??``)||A(i.sender??t.user)||!t.number)return[];let a=Ge(e,n,i,`issue`,{user:i.sender??t.user,body:ze(t.title,t.body),number:t.number,slug:r.slug});return a?[a]:[]}return[]}const Ze={installation:[`created`,`deleted`,`suspend`,`unsuspend`,`new_permissions_accepted`],installation_repositories:[`added`,`removed`],repository:[`created`,`deleted`,`renamed`]};function Qe(e,t,n){let r=k(t),i=r.installation?.id,a=r.action;if(i===void 0||!Ze[e??``]?.includes(a??``))return;let o=r.installation?.account,s=Date.now(),c=e===`installation`&&(a===`deleted`||a===`suspend`);return{op:c?`delete`:`upsert`,...e===`repository`&&r.repository?.full_name?{repos:{add:a===`created`||a===`renamed`?[r.repository.full_name]:[],remove:a===`deleted`?[r.repository.full_name]:a===`renamed`&&r.changes?.repository?.name?.from?[`${r.repository.full_name.split(`/`)[0]}/${r.changes.repository.name.from}`]:[]}}:{},...e===`installation_repositories`?{repos:{...r.repository_selection&&(a===`removed`?!r.repositories_removed?.length:!r.repositories_added?.length)?{refresh:!0}:{},add:(r.repositories_added??[]).flatMap(e=>e.full_name?[e.full_name]:[]),remove:(r.repositories_removed??[]).flatMap(e=>e.full_name?[e.full_name]:[])}}:{},installation:{integration:`github`,...e===`installation`&&a===`deleted`?{uninstalled:!0}:{},id:`${n.id}:${i}`,app:n.id,account:{login:o?.login??r.repository?.owner?.login??`unknown`,...o?.type?{type:o.type}:{}},createdAt:s,...r.repositories?{repos:r.repositories.flatMap(e=>e.full_name?[e.full_name]:[])}:{},...c?{deletedAt:s}:{}}}}function $e(e,t){let n=k(e),r=n.repository?.full_name,i=n.ref?.startsWith(`refs/heads/`)&&n.ref.slice(11);if(!r||!i)return;let a=n.installation?.id,o=n.commits??[],s=o.flatMap(e=>[...e.added??[],...e.modified??[],...e.removed??[]]);return{...a===void 0?{}:{installation:`${t.id}:${a}`},repo:r,branch:i,...n.after?{commit:n.after}:{},...n.repository?.default_branch?{defaultBranch:n.repository.default_branch}:{},paths:[...new Set(s)],...!o.length||o.length>=2048?{partial:!0}:{}}}function et(e,t){let n=e.headers.get(`x-github-hook-installation-target-id`);if(!n)return;let r=k(j(t)),i=Ye(r),a=M(r),o=r.issue?r.issue.comments:r.comment&&r.comment.in_reply_to_id===void 0?0:void 0;return{app:n,...r.installation?.id===void 0?{}:{installation:String(r.installation.id)},...i?{repo:i}:{},...a?{space:a}:{},...o===void 0?{}:{index:o}}}function tt(e,t,n,r){let i=e.headers.get(`x-github-event`);if(!i||Ue.includes(i))return;let{webhookSecret:a,slug:o}=r;if(!We(t,e.headers.get(`x-hub-signature-256`),a))return{invalid:!0};let s=j(t),c=i===`repository`?Ke(s):i===`member`?qe(s):void 0;if(c)return{space:c};let l=Je(i,s);if(l)return{members:l};let u=Qe(i,s,n);if(u)return{installation:u};let d=i===`push`?$e(s,n):void 0;return d?{push:d}:{events:Xe(e,s,n,{slug:o})}}function nt(e,t,n){let r=n.raw.comment?.author_association;return{type:e===`mention`&&!Ve.includes(r??``)?`comment`:e,actor:{id:n.author.userId,login:n.author.userName,...r?{role:r}:{}}}}function rt(e){let t=/^github:([^:]+):(issue:)?(\d+)(?::rc:(\d+))?(?::|$)/.exec(e.chat?.thread.id??``);return t?`https://github.com/${t[1]}/${t[2]?`issues`:`pull`}/${t[3]}${t[4]?`#discussion_r${t[4]}`:``}`:void 0}const P=864e5,F=e=>`github:typing:${e}`;function it(e){let t=/^github:[^:]+:(\d+)(?::|$)/.exec(e.chat?.thread.id??``);return t?Number(t[1]):void 0}async function at(e){let[{GitHubAdapter:t},{ConsoleLogger:n}]=await Promise.all([import(`./dist-Clxdruuu.js`),import(`./dist-B5qUdWUG.js`)]);class r extends t{async handleWebhook(e,t){let n=e.headers.get(`x-github-event`)??``,r=await e.clone().text(),i=j(r);if(!He.includes(n)||i?.action!==`edited`||!this.chat)return super.handleWebhook(e,t);if(!await this.webhookVerifier?.(e,r))return new Response(`Invalid signature`,{status:401});let{comment:a,repository:o}=i,s={owner:o.owner.login,repo:o.name},c;if(n===`issue_comment`){let{number:e,pull_request:t}=i.issue,n=t?`pr`:`issue`,r=this.encodeThreadId({...s,prNumber:e,type:n});c=this.parseIssueComment(a,o,e,r,n)}else{let{number:e}=i.pull_request,t=a.in_reply_to_id??a.id,n=this.encodeThreadId({...s,prNumber:e,reviewCommentId:t});c=this.parseReviewComment(a,o,e,n)}return this.chat.processMessageUpdated({adapter:this,threadId:c.threadId,message:c},t),new Response(`ok`,{status:200})}reactions(e,t){let{owner:n,repo:r,prNumber:i,reviewCommentId:a}=this.decodeThreadId(e),o=`/repos/${n}/${r}`;return{owner:n,repo:r,path:t?`${o}/${a?`pulls`:`issues`}/comments/${t}/reactions`:`${o}/issues/${i}/reactions`}}async startTyping(e,t,n){let{owner:r,repo:i,path:a}=this.reactions(e,n?.messageId),{status:o,data:s}=await(await this.getOctokitForThread(r,i)).request(`POST ${a}`,{content:`eyes`});o===201&&await this.chat?.getState().appendToList(F(e),{path:a,id:s.id},{ttlMs:P})}async endTyping(e){let t=this.chat?.getState(),n=await t?.getList(F(e))??[];if(!n.length)return;await t.delete(F(e));let{owner:r,repo:i}=this.reactions(e),a=await this.getOctokitForThread(r,i);await Promise.all(n.map(({path:e,id:t})=>a.request(`DELETE ${e}/${t}`)))}async addReaction(e,t,n){await super.addReaction(e,t,n);let r=this.chat?.getState();if(this.emojiToGitHubReaction(n)!==`eyes`||!r)return;let{path:i}=this.reactions(e,t),a=await r.getList(F(e));if(a.some(e=>e.path===i)){await r.delete(F(e));for(let t of a.filter(e=>e.path!==i))await r.appendToList(F(e),t,{ttlMs:P})}}}let i=e.credentials?.webhookSecret,a=e.installationId,o,s=new r({userName:e.name,apiUrl:`https://api.github.com`,botUserId:0,installationToken:()=>a?o??=e.token(a,{tools:y[`read-only`]}):Promise.reject(Error(`The webhook names no GitHub installation`)),webhookVerifier:(e,t)=>We(t,e.headers.get(`x-hub-signature-256`),i),logger:new n(`error`)});return re(s.octokit,e.fetch),s}const I=/<!-- coder-review:fp=([a-f0-9]{40}) -->\s*$/,ot=/<!-- coder-review head=([a-f0-9]{40}) -->\s*$/;async function L(e,t,n,r={}){let i=await n(t.startsWith(`https://`)?t:`${m}${t}`,{method:r.method??`GET`,headers:{...h(e),...r.body===void 0?{}:{"content-type":`application/json`}},...r.body===void 0?{}:{body:JSON.stringify(r.body)}});if(!i.ok)throw Error(`GitHub ${r.method??`GET`} ${t.replace(m,``)} failed (${i.status}): ${(await i.text()).slice(0,300)}`);let a=i.headers.get(`link`)?.match(/<([^>]+)>;\s*rel="next"/)?.[1];return{data:await i.json(),...a?{next:a}:{}}}async function R(e,t,n){let r=[],i=`${t}${t.includes(`?`)?`&`:`?`}per_page=100`;for(;i;){let t=await L(e,i,n);r.push(...t.data),i=t.next}return r}function st(e){if(typeof e==`number`)return Number.isInteger(e)&&e>0?{number:e}:void 0;if(/^\d+$/.test(e))return{number:Number(e)};let t=e.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/(\d+)/);return t?{number:Number(t[3]),repo:`${t[1]}/${t[2]}`}:void 0}function ct(e){try{return ee(`git`,[`remote`,`get-url`,`origin`],{cwd:e,encoding:`utf8`}).trim().match(/github\.com[:/]([^/]+)\/([^/]+?)(?:\.git)?$/)?.slice(1,3).join(`/`)}catch{return}}function lt(e,t){for(let n of[...e].reverse())if(n.user?.login===t){let e=n.body?.match(ot)?.[1];if(e)return e}}function z(e){let t=new Map;for(let n of e){let e=n.body?.match(I)?.[1];e&&n.html_url&&t.set(e,n.html_url)}return t}async function ut(e,t,n=fetch){let{data:r}=await L(t,`/repos/${e.repo}/pulls/${e.number}`,n);return r.head.sha}async function dt(e,t,n=fetch){let r=`/repos/${e.repo}/pulls/${e.number}`,[{data:i},a]=await Promise.all([L(t,r,n),e.author??L(t,`/user`,n).then(e=>e.data.login)]),o=lt(await R(t,`${r}/reviews`,n),a),s=[];try{let i=await R(t,`${r}/comments`,n),o=i.filter(e=>e.user?.login===a&&I.test(e.body??``)),c=new Set;if(o.length)try{let[r,i]=e.repo.split(`/`),{data:a}=await L(t,`${m}/graphql`,n,{method:`POST`,body:{query:`query($owner:String!,$name:String!,$number:Int!){ repository(owner:$owner,name:$name){ pullRequest(number:$number){ reviewThreads(last:100){ nodes{ isResolved comments(first:1){ nodes{ databaseId } } } } } } }`,variables:{owner:r,name:i,number:e.number}}});if(a.errors?.length||!a.data)throw Error(`Review thread history unavailable`);for(let e of a.data.repository.pullRequest.reviewThreads.nodes)if(e.isResolved)for(let t of e.comments.nodes)c.add(t.databaseId)}catch(e){console.error(`github: review history keeps threads unresolved`,e)}for(let e of o.sort((e,t)=>t.id-e.id)){let t=e.body?.match(/^### ([^\r\n]+)/)?.[1],n=e.line??e.original_line;if(!(!e.path||!n||!t)&&(s.push({file:e.path,line:n,title:t,state:c.has(e.id)?`resolved`:i.some(t=>t.in_reply_to_id===e.id&&t.user?.login&&t.user.login!==a)?`replied`:`open`}),s.length===100))break}}catch(e){console.error(`github: review history unavailable`,e)}return{repo:e.repo,number:e.number,author:a,baseSha:i.base.sha,headSha:i.head.sha,...o?{since:o}:{},...s.length?{prior:s}:{}}}async function ft(e,t,n=fetch){return z((await R(t,`/repos/${e.repo}/pulls/${e.number}/comments`,n)).filter(t=>t.user?.login===e.author))}async function pt(e,t,n,r=fetch){let i=`/repos/${e.repo}/pulls/${e.number}/reviews`,{data:a}=await L(n,i,r,{method:`POST`,body:{commit_id:e.headSha,event:`COMMENT`,body:t.body(new Map),comments:t.comments.map(e=>({path:e.file,line:e.line,side:`RIGHT`,...e.startLine?{start_line:e.startLine,start_side:`RIGHT`}:{},body:e.body}))}});if(t.comments.length)try{let e=z(await R(n,`${i}/${a.id}/comments`,r));await L(n,`${i}/${a.id}`,r,{method:`PUT`,body:{body:t.body(e)}})}catch(e){console.error(`github: review ${a.html_url} keeps its first body`,e)}return{url:a.html_url}}function mt(e){try{return ee(`gh`,[`auth`,`token`],{cwd:e,encoding:`utf8`}).trim()}catch{throw Error(`Pull request reviews on this machine need the GitHub CLI signed in: gh auth login`)}}const ht={startCheck:async(e,t,n,r=fetch)=>{try{let{data:i}=await L(n,`/repos/${e.repo}/check-runs`,r,{method:`POST`,body:{name:t.name,head_sha:e.headSha,status:`in_progress`,...t.detailsUrl?{details_url:t.detailsUrl}:{}}});return{id:i.id,...i.html_url?{url:i.html_url}:{}}}catch(e){console.error(`github: could not start review check`,e);return}},finishCheck:async(e,t,n,r,i=fetch)=>{let a=a=>L(r,`/repos/${e.repo}/check-runs/${t}`,i,{method:`PATCH`,body:{status:`completed`,conclusion:n.conclusion,output:{title:n.title,summary:a},...n.detailsUrl?{details_url:n.detailsUrl}:{}}});try{await a(n.summary)}catch{try{await a(`See the posted review.`)}catch(e){console.error(`github: could not finish review check`,e)}}},parse:st,repository:ct,head:ut,target:dt,threads:ft,post:pt,localToken:mt},gt={id:`github`,brand:{color:`#000000`,icon:`M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12`,dark:`#fff`,svg:`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 98 96" fill="none" style="color:light-dark(#000,#fff)"><g clip-path="url(#github-mark-4)"><path d="M 41.44 69.38 C 28.81 67.85 19.91 58.76 19.91 46.99 C 19.91 42.21 21.63 37.04 24.5 33.59 C 23.26 30.43 23.45 23.73 24.88 20.96 C 28.71 20.48 33.88 22.49 36.94 25.27 C 40.58 24.12 44.41 23.54 49.1 23.54 C 53.79 23.54 57.61 24.12 61.06 25.17 C 64.03 22.49 69.29 20.48 73.12 20.96 C 74.46 23.54 74.65 30.24 73.4 33.5 C 76.47 37.13 78.09 42.01 78.09 46.99 C 78.09 58.76 69.19 67.66 56.37 69.29 C 59.62 71.39 61.82 75.99 61.82 81.25 L 61.82 91.21 C 61.82 94.08 64.22 95.7 67.09 94.55 C 84.41 87.95 98 70.63 98 49.19 C 98 22.11 75.99 0 48.9 0 C 21.82 0 0 22.11 0 49.19 C 0 70.44 13.49 88.05 31.68 94.65 C 34.26 95.61 36.75 93.88 36.75 91.3 L 36.75 83.64 C 35.41 84.22 33.69 84.6 32.16 84.6 C 25.84 84.6 22.11 81.16 19.43 74.74 C 18.38 72.16 17.23 70.63 15.03 70.34 C 13.88 70.25 13.49 69.77 13.49 69.19 C 13.49 68.04 15.41 67.18 17.32 67.18 C 20.1 67.18 22.49 68.91 24.98 72.45 C 26.89 75.22 28.9 76.47 31.29 76.47 C 33.69 76.47 35.22 75.61 37.42 73.4 C 39.05 71.78 40.29 70.34 41.44 69.38 Z" fill="black" style="fill:currentColor"/></g><defs><clipPath id="github-mark-4"><rect width="98" height="96" fill="white"/></clipPath></defs></svg>`},name:`GitHub`,featured:!0,description:`Pull requests, issues, and comments on GitHub repositories`,installLabel:`Connect GitHub`,use:`Mention @{handle} in an issue or pull request.`,organizationApps:!0,publicApps:!0,prompt:[`A conversation is an issue or pull request with its comments and inline review threads; a reply goes to the thread that asked.`,"The repository is checked out on its default branch, without submodules; `git submodule update --init <path>` fetches one the work needs. Push to a pull request's branch only when it lives in this repository and changes were asked for; fork pull requests get reads and comments only.",`Replies are GitHub Markdown; cite file paths; link a pull request after changing it.`,`Reviews from the review tool carry coder-review markers: one review per run, each finding an inline comment.`].join(`
4
+ `),sample:`github:owner/repo:1`,item:e=>e.replace(/:rc:\d+$/,``),author:e=>`${e}[bot]`,events:{mention:{description:`Comment from a repo owner or org member mentioning @<agent>; text has the mention stripped.`,on:`mention`,addressed:!0},pull_request:{description:`Opened, updated, or ready non-draft pull request.`},issue:{description:`Opened or edited issue.`},comment:{description:`New non-agent issue, pull request, or inline review comment.`,on:`message`,noisy:!0}},tools:{presets:y,server:_e,install:`arch=$(uname -m); [ "$arch" = aarch64 ] && arch=arm64; curl -fsSL "https://github.com/github/github-mcp-server/releases/latest/download/github-mcp-server_Linux_$arch.tar.gz" | tar -xz -C /usr/local/bin github-mcp-server`,installHosts:[`github.com`,`release-assets.githubusercontent.com`]},hosts:[`github.com`,`api.github.com`,`codeload.github.com`],collapsed:(e,t)=>`<details><summary>${e}</summary>\n\n${t}\n\n</details>`,get app(){return Pe},auth:{token:Re,get user(){return Ee},canWrite:async(e,t,n)=>!!(e.repo&&e.actor.login)&&pe(`${e.repo.owner}/${e.repo.name}`,e.actor.login,t,n),members:(e,t,n,r)=>me(e.id,t,n,r),teamSpaces:he},repos:{cloneHosts:[`github.com`],credentialUsername:`x-access-token`,readFile:ie,revalidate:ae,listDir:le,tree:ce,commit:oe,list:(e,t,n)=>ue(t,n),get:fe,url:ge,pullRequests:de,pullRequest:it,pullRequestThread:(e,t)=>N(e,t,!0),commitAuthor:se,reviews:ht},target:et,adapter:at,link:rt,ownEvents:tt,event:nt};async function _t(e,t,n=fetch){if(!e.actor.id||!e.installationId)throw Error(`Linear event has no actor or workspace`);let r=await n(`https://api.linear.app/graphql`,{method:`POST`,headers:{authorization:`Bearer ${t}`,"content-type":`application/json`},body:JSON.stringify({query:`query WorkspaceMember($id: String!) { user(id: $id) { id active guest app organization { id } } }`,variables:{id:e.actor.id}}),redirect:`error`,signal:AbortSignal.timeout(5e3)}),i=await r.json(),a=i.data?.user;if(!r.ok||i.errors!==void 0&&(!Array.isArray(i.errors)||i.errors.length>0)||!a)throw Error(`Linear returned no valid workspace member`);return a.id===e.actor.id&&a.active===!0&&a.guest===!1&&a.app===!1&&a.organization?.id===e.installationId}async function vt(e,t,n=fetch){let r=/^linear:([^:]+)/.exec(e.chat?.thread.id??``)?.[1];if(!r)return;let i=await n(`https://api.linear.app/graphql`,{method:`POST`,headers:{authorization:`Bearer ${t}`,"content-type":`application/json`},body:JSON.stringify({query:`query IssueTeam($issue: String!) { issue(id: $issue) { team { id private visibility } } }`,variables:{issue:r}}),redirect:`error`,signal:AbortSignal.timeout(5e3)}),a=await i.json(),o=a.data?.issue?.team;if(!i.ok||Array.isArray(a.errors)&&a.errors.length||typeof o?.id!=`string`)throw Error(`Linear returned no issue team`);return{kind:`team`,id:o.id,private:o.private!==!1||o.visibility!==`public`}}async function yt(e,t,n=fetch){let r=[],i;do{let a=await n(`https://api.linear.app/graphql`,{method:`POST`,headers:{authorization:`Bearer ${t}`,"content-type":`application/json`},body:JSON.stringify({query:`query TeamMembers($team: String!, $after: String) { team(id: $team) { members(first: 100, after: $after) { nodes { id } pageInfo { hasNextPage endCursor } } } }`,variables:{team:e.id,after:i}}),redirect:`error`,signal:AbortSignal.timeout(5e3)}),o=await a.json(),s=o.data?.team?.members;if(!a.ok||Array.isArray(o.errors)&&o.errors.length||!s?.nodes)throw Error(`Linear returned no team members`);r.push(...s.nodes.flatMap(e=>typeof e.id==`string`?[e.id]:[])),i=s.pageInfo?.hasNextPage?s.pageInfo.endCursor:void 0}while(i);return r}const bt={"read-only":[`read`],auto:[`read`,`write`]};function xt(e,t,n,r){return{name:`linear`,url:`https://mcp.linear.app/mcp${e.includes(`write`)?``:`/readonly`}`,headers:{Authorization:`Bearer ${n}`},credentialFields:{header:`Authorization`},description:r?`On the user's token; what the user can see.`:`On the app's token; the workspace the app is installed in.`,instructions:`get_issue reads an issue by id or identifier such as ENG-123.`}}async function St(e,t){let n=new URLSearchParams(await e.text()),r=Object.fromEntries(t.map(e=>[e,n.get(e)?.trim()??``])),i=t.filter(e=>!r[e]);if(i.length)throw new d(`invalid-field`,i[0],`Missing ${i.join(`, `)}`);return r}async function B(e,t,n=fetch,r=Date.now()){let i=await n(e,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams(t)}),a=await i.json().catch(()=>({}));if(!i.ok||!a.access_token)throw new d(`platform-error`,a.error??String(i.status),`${new URL(e).host} refused the token request: ${a.error_description??a.error??i.status}`);return{accessToken:a.access_token,...a.refresh_token?{refreshToken:a.refresh_token}:{},...a.expires_in?{expiresAt:r+a.expires_in*1e3}:{},...a.id_token?{idToken:a.id_token}:{}}}async function V(e,t,n,r=Date.now(),i=!1){if(!e)throw Error(`The installation has no token; connect it again`);let a=JSON.parse(e);if(!a.refreshToken){if(i)throw new d(`platform-error`,`invalid_token`,`The refused token has no refresh token`);return a.accessToken}if(!i&&(a.expiresAt??1/0)-3e5>r)return a.accessToken;let{idToken:o,...s}=await t(a.refreshToken),c={...s,refreshToken:s.refreshToken??a.refreshToken},l=await n?.(JSON.stringify(c));return l?JSON.parse(l).accessToken:c.accessToken}const H=`https://api.linear.app/oauth/token`,Ct=[`clientId`,`clientSecret`,`webhookSecret`],U={Issue:`Issues`,Comment:`Comments`},W=e=>e.replace(/\/$/,``);async function wt(e,t,n){let r=await n(`https://api.linear.app/graphql`,{method:`POST`,headers:{authorization:`Bearer ${e}`,"content-type":`application/json`},body:JSON.stringify({query:t})}),i=await r.json().catch(()=>({}));if(!r.ok||!i.data)throw Error(`Linear refused the query: ${r.status}`);return i.data}function Tt(e,t,n,r,i=!1){return`https://linear.app/oauth/authorize?${new URLSearchParams({client_id:e.clientId,redirect_uri:t,response_type:`code`,scope:r?`read,write,app:mentionable`:i?`read,write`:`read`,state:n,...r?{actor:`app`}:{}})}`}function Et(e,t,n,r){let i=new URL(e.url).searchParams.get(`code`);if(!i)throw new d(`missing-code`);let{clientId:a,clientSecret:o}=t;return B(H,{grant_type:`authorization_code`,code:i,redirect_uri:n,client_id:a,client_secret:o},r)}function Dt(e,t,n,r){let i=new URLSearchParams(n?{"oauth.client_name":n}:{});r&&i.set(`distribution`,`public`),i.set(`developer.name`,W(e).replace(/^https?:\/\//,``)),i.set(`oauth.client_uri`,W(e)),i.append(`oauth.redirect_uris`,`${W(e)}/install/linear/callback`),i.append(`oauth.redirect_uris`,`${W(e)}/connect/linear/callback`),i.set(`webhook.enabled`,`true`),i.set(`webhook.url`,`${W(e)}/hooks/linear?app=${t}`);for(let e of Object.keys(U))i.append(`webhook.resourceTypes`,e);return`https://linear.app/settings/api/applications/new?${i}`}const Ot={shareable:!0,createStep:(e,{name:t,public:n}={},r=ne())=>({intro:`Linear runs the agent as an app of your own OAuth application.`,link:Dt(e,r,t,n),steps:[{text:`Open the link signed in to Linear, check the form and click **Create**.`},{text:`Copy the client ID, the client secret and the webhook signing secret into the fields below.`}],notes:[`The link fills in the name, the callback URLs and the webhook${n?`, and makes the app public so other Linear workspaces can install it`:``}.`,...n?[]:[`To install the app in other Linear workspaces, make it public in its Linear settings.`]],hidden:{key:r},fields:[{name:`clientId`,label:`Client ID`,placeholder:`9f3c2a7d1e8b4c6a0d5e7f1a2b3c4d5e`,required:!0},{name:`clientSecret`,label:`Client secret`,placeholder:`4b1e9c7a2d0f8e3c5a6b9d1f0e2c4a7b`,required:!0},{name:`webhookSecret`,label:`Webhook signing secret`,hint:`shown with the webhook settings`,placeholder:`lin_wh_…`,required:!0}],submit:`Create Linear app`}),settingsUrl:()=>`https://linear.app/settings/api`,values:(e,{publicUrl:t,spec:n})=>({url:`https://linear.app/settings/api`,label:`Open application`,lines:[{text:`Application name`,copy:n.name},{text:`Callback URL`,copy:`${W(t)}/install/linear/callback`},{text:`Callback URL`,copy:`${W(t)}/connect/linear/callback`},{text:`Webhook URL`,copy:`${W(t)}/hooks/linear?app=${e.id.slice(e.id.indexOf(`:`)+1)}`},{text:`Webhook events`,copy:Object.values(U).join(`, `)},{text:`Reinstall the app in each workspace after saving, so people can pick it in @ mentions`}]}),async createCallback(e,{spec:t}){let{key:n,...r}=await St(e,[...Ct,`key`]);if(!/^[0-9a-f-]{36}$/.test(n))throw new d(`invalid-field`,`key`);return{platformAppId:n,name:t.name,credentials:r}},accountUrl:({login:e})=>`https://linear.app/${encodeURIComponent(e)}`,async uninstall(e,t,{fetch:n}){if(!e.token)throw Error(`The installation has no token`);let{accessToken:r,refreshToken:i}=JSON.parse(e.token),a=await n(`https://api.linear.app/oauth/revoke`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams(i?{token:i,token_type_hint:`refresh_token`}:{token:r,token_type_hint:`access_token`})});if(!a.ok)throw Error(`Linear answered ${a.status} to the revoke`)},installationUrl:()=>`https://linear.app/settings/applications`,installUrl(e,t,{publicUrl:n,state:r}){return Tt(t,`${W(n)}/install/linear/callback`,r,!0)},async installCallback(e,{credentials:t,publicUrl:n,fetch:r}){let{idToken:i,...a}=await Et(e,t,`${W(n)}/install/linear/callback`,r),{organization:o,viewer:s}=await wt(a.accessToken,`query { organization { id name urlKey } viewer { id } }`,r);return{platformInstallId:o.id,account:{login:o.urlKey},token:JSON.stringify(a),self:s.id}}},kt={authorizeUrl:(e,{publicUrl:t,state:n,access:r})=>Tt(e,`${W(t)}/connect/linear/callback`,n,!1,!!r),async exchange(e,t,{publicUrl:n,fetch:r,access:i}){let{idToken:a,...o}=await Et(e,t,`${W(n)}/connect/linear/callback`,r),{viewer:s}=await wt(o.accessToken,`query { viewer { id displayName } }`,r);return{id:s.id,login:s.displayName,...i?{token:JSON.stringify(o)}:{}}},async access(e,t,{fetch:n,now:r,force:i}){let{clientId:a,clientSecret:o}=t,s;return{accessToken:await V(e,e=>B(H,{grant_type:`refresh_token`,refresh_token:e,client_id:a,client_secret:o},n,r),async e=>{s=e},r,i),...s?{refreshed:s}:{}}}};function At(e,t,n,r){let{clientId:i,clientSecret:a}=t;return V(e.token,e=>B(H,{grant_type:`refresh_token`,refresh_token:e,client_id:i,client_secret:a},r),n)}const jt=864e5,G=e=>`linear:typing:${e}`;function Mt(e,t,n,r=Date.now()){if(!n||!t)return!1;let i=p(`sha256`,n).update(e).digest();if(!f(Buffer.from(t,`hex`),i))return!1;let a=JSON.parse(e).webhookTimestamp;return typeof a==`number`&&Math.abs(r-a)<=6e4}function Nt(e,t){let n=new URL(e.url).searchParams.get(`app`),r;try{r=JSON.parse(t)}catch{return}let i=r.organizationId,a=r.data?.issue,o=a?.teamId??a?.team?.id;return n&&typeof i==`string`?{app:n,installation:i,...r.type===`Comment`?{space:{kind:`team`,id:typeof o==`string`?o:``}}:{}}:void 0}const Pt=(e,t)=>RegExp(`(^|[^\\w-])@${t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}(?![\\w-])`,`i`).test(e);function Ft(e,t){let n=(e.labels??[]).filter(e=>t.labelIds&&e.id&&!t.labelIds.includes(e.id));return[`stateId`in t&&e.state?.name&&`Moved to ${e.state.name}`,n.length>0&&`Labeled ${n.map(e=>e.name).join(`, `)}`,`priority`in t&&e.priorityLabel&&`Priority ${e.priorityLabel}`,`assigneeId`in t&&(e.assignee?.name?`Assigned to ${e.assignee.name}`:`Unassigned`),(`title`in t||`description`in t)&&`Edited`].filter(e=>!!e)}function It(e,t,n){let r=t.data;if(t.type!==`Issue`||t.actor?.type!==`user`||!t.actor.id||!r?.id||r.botActor||!t.organizationId)return;let i=[r.title,r.description].filter(Boolean).join(`
5
+
6
+ `),a=t.action===`update`&&t.updatedFrom?Ft(r,t.updatedFrom):[],o=t.action===`create`?i:a.length?`${a.join(`
7
+ `)}\n\n${i}`:``;if(!o)return;let s={_type:`chat:Thread`,adapterName:`linear`,channelId:`linear:${r.id}`,id:`linear:${r.id}`,isDM:!1};return{integration:`linear`,type:`issue`,appId:n.id,installationId:t.organizationId,deliveryId:e.headers.get(`linear-delivery`)??``,actor:{id:t.actor.id,...t.actor.name?{login:t.actor.name}:{}},text:o,...t.action===`create`&&Pt(i,n.name)?{mentioned:!0}:{},...r.teamId?{space:{kind:`team`,id:r.teamId}}:{},chat:{thread:s}}}function Lt(e,t,n,r){let i=JSON.parse(t);if(i.type===`Comment`)return;let a=r.webhookSecret;if(!Mt(t,e.headers.get(`linear-signature`),a))return{invalid:!0};if(i.type===`OAuthApp`)return i.action===`revoked`&&i.organizationId&&i.oauthClientId===n.id.slice(7)?{uninstalled:`${n.id}:${i.organizationId}`}:{invalid:!0};let o=It(e,i,n);return o?{events:[o]}:{ack:!0}}async function Rt(e){let[{LinearAdapter:t},{ConsoleLogger:n,defaultEmojiResolver:r}]=await Promise.all([import(`./dist-DX0JzVC6.js`),import(`./dist-B5qUdWUG.js`)]);class i extends t{organization;installedSelf;saveSelf;constructor(e,t,n,r){super(e),this.organization=t,this.installedSelf=n,this.saveSelf=r}async initialize(e){this.chat=e}async resolveConnectIdentity(){let e=this.organization&&await this.installedSelf?.(this.organization);if(!e){await super.resolveConnectIdentity(),this.defaultBotUserId&&this.defaultOrganizationId===this.organization&&await this.saveSelf?.(this.organization,this.defaultBotUserId);return}this.defaultBotUserId=e,this.defaultOrganizationId=this.organization}async handle(){let e=this.chat.getState(),t=`linear:handle:${this.botUserId}`,n=await e.get(t);if(n)return n;let{displayName:r}=await this.getClient().user(this.botUserId);return await e.set(t,r,jt),r}async onCommentEvent(e,t){let{data:n}=e,r=this.chat,i=e.action===`update`;if(!i&&e.action!==`create`||!r||!n.issueId||!n.user)return;let{issueId:a,user:o}=n;await this.withWebhookInstallation(e.organizationId,async()=>{let s=(/@|\/profiles\//.test(n.body)?await this.handle().catch(e=>{console.error(`coder server: could not read the Linear app user`,e)}):void 0)?.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),c=s&&RegExp(`https://linear\\.app/[^/\\s]+/profiles/${s}(?![\\w-])|(?<![\\w-])@${s}(?![\\w-])`,`gi`),l=c?n.body.replace(c,`@${this.userName}`):n.body,u=this.parseMessage({kind:`comment`,organizationId:e.organizationId,comment:{id:n.id,body:l,issueId:a,parentId:n.parentId??void 0,createdAt:n.createdAt,updatedAt:n.updatedAt,url:e.url??void 0,user:{type:`user`,id:o.id,displayName:/\/profiles\/([^/?#]+)/.exec(o.url)?.[1]??``,fullName:o.name,email:o.email,avatarUrl:o.avatarUrl??void 0}}}),d=this.encodeThreadId({issueId:a,commentId:n.parentId||n.id});i?r.processMessageUpdated({adapter:this,threadId:d,message:u},t):r.processMessage(this,d,u,t)})}bound(e){return this.requestContext.getStore()?e():this.organization?this.withInstallation(this.organization,e):Promise.reject(Error(`No Linear workspace to post for`))}postMessage(e,t){return this.bound(()=>super.postMessage(e,t))}editMessage(e,t,n){return this.bound(()=>super.editMessage(e,t,n))}addReaction(e,t,n){return this.bound(()=>super.addReaction(e,t,r.toGChat(n)))}startTyping(e,t,n){let{issueId:r,commentId:i}=this.decodeThreadId(e),a=n?.messageId??i;return this.bound(async()=>{await this.ensureValidToken();let{reaction:t}=await this.getClient().createReaction({...a?{commentId:a}:{issueId:r},emoji:`👀`});await this.chat?.getState().appendToList(G(e),t.id,{ttlMs:jt})})}async endTyping(e){let t=this.chat?.getState(),n=await t?.getList(G(e))??[];n.length&&(await t.delete(G(e)),await this.bound(async()=>{await this.ensureValidToken(),await Promise.all(n.map(e=>this.getClient().deleteReaction(e)))}))}}let a=e.credentials?.webhookSecret,o=e.installationId;return new i({mode:`comments`,userName:e.name,apiUrl:`https://api.linear.app/graphql`,encryptionKey:``,accessToken:()=>o?e.token(o):Promise.reject(Error(`The webhook names no Linear workspace`)),webhookVerifier:(e,t)=>Mt(t,e.headers.get(`linear-signature`),a),logger:new n(`error`)},o,e.installedSelf,e.saveSelf)}const zt={id:`linear`,brand:{color:`#222326`,icon:`M2.886 4.18A11.982 11.982 0 0 1 11.99 0C18.624 0 24 5.376 24 12.009c0 3.64-1.62 6.903-4.18 9.105L2.887 4.18ZM1.817 5.626l16.556 16.556c-.524.33-1.075.62-1.65.866L.951 7.277c.247-.575.537-1.126.866-1.65ZM.322 9.163l14.515 14.515c-.71.172-1.443.282-2.195.322L0 11.358a12 12 0 0 1 .322-2.195Zm-.17 4.862 9.823 9.824a12.02 12.02 0 0 1-9.824-9.824Z`,svg:`<svg xmlns="http://www.w3.org/2000/svg" fill="#222326" viewBox="0 0 100 100" style="fill:light-dark(#222326,#fff)"><path d="M 1.23 61.52 c -0.22 -0.95 0.91 -1.55 1.6 -0.86 L 39.33 97.18 c 0.69 0.69 0.09 1.82 -0.86 1.6 C 20.05 94.45 5.55 79.95 1.23 61.52 Z M 0 46.89 c -0.02 0.28 0.09 0.56 0.29 0.76 L 52.35 99.71 c 0.2 0.2 0.48 0.31 0.76 0.29 2.37 -0.15 4.69 -0.46 6.96 -0.93 0.76 -0.16 1.03 -1.1 0.48 -1.65 L 2.58 39.45 c -0.55 -0.55 -1.49 -0.29 -1.65 0.48 -0.47 2.27 -0.78 4.59 -0.93 6.96 Z M 4.21 29.71 c -0.17 0.37 -0.08 0.81 0.21 1.1 l 64.78 64.78 c 0.29 0.29 0.73 0.37 1.1 0.21 1.79 -0.8 3.52 -1.69 5.19 -2.68 0.55 -0.33 0.64 -1.09 0.18 -1.54 L 8.44 24.34 c -0.45 -0.45 -1.21 -0.37 -1.54 0.18 -0.99 1.67 -1.89 3.4 -2.68 5.19 Z M 12.66 18.07 c -0.37 -0.37 -0.39 -0.96 -0.04 -1.35 C 21.78 6.46 35.11 0 49.95 0 77.59 0 100 22.41 100 50.05 c 0 14.84 -6.46 28.17 -16.72 37.34 -0.39 0.35 -0.98 0.33 -1.35 -0.04 L 12.66 18.07 Z"/></svg>`},name:`Linear`,description:`Issues and comments in a Linear workspace`,installLabel:`Connect Linear`,use:`Mention @{handle} in a comment on an issue.`,sample:`linear:2f1e6a1c-0000-4000-8000-000000000001:c:5b7d3c2a-0000-4000-8000-000000000002`,item:e=>/^linear:[^:]+/.exec(e)?.[0]??e,prompt:[`A conversation is a Linear issue; each comment thread on it is a thread, and a reply goes to the thread that asked.`,`Replies are Markdown; link pull requests and issues by full URL.`].join(`
8
+ `),events:{mention:{description:`Comment mentioning @<agent>; text has the mention stripped.`,on:`mention`,addressed:!0},issue:{description:"Issue created or changed by a person; text starts with the change, such as `Moved to In Review`."},comment:{description:`New comment by a person that does not mention the agent.`,on:`message`,noisy:!0}},tools:{presets:bt,server:xt},hosts:[`api.linear.app`,`mcp.linear.app`],get app(){return Ot},auth:{canWrite:_t,members:yt,space:vt,token:(e,t,n,{save:r,fetch:i}={})=>At(e,t,r,i),get user(){return kt}},target:Nt,adapter:Rt,ownEvents:Lt};function Bt(e,t){let n=new Map;return(async(r,i)=>{let a=new Request(r,i);if(new URL(a.url).origin!==`https://slack.com`||new URL(a.url).pathname!==`/api/users.info`)return e(r,i);let o=new URLSearchParams(await a.clone().text()),s=a.headers.get(`authorization`)?.replace(/^Bearer /,``)??o.get(`token`),c=JSON.stringify([s,o.get(`team_id`)??t,o.get(`user`)]),l=n.get(c);return l||(l=e(r,i).then(async e=>{let t=await e.clone().json().catch(()=>void 0);return(!e.ok||t?.ok!==!0)&&n.delete(c),e}).catch(e=>{throw n.delete(c),e}),n.set(c,l)),(await l).clone()})}async function Vt(e,t,n=fetch){let r=e.account??e.installationId;if(!r||!e.actor.id)throw Error(`Slack event has no workspace or actor`);let i=await n(`https://slack.com/api/users.info`,{method:`POST`,headers:{authorization:`Bearer ${t}`,"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({user:e.actor.id,team_id:r}),redirect:`error`,signal:AbortSignal.timeout(5e3)}),a=await i.json(),o=a.user;if(!i.ok||a.ok!==!0||!o)throw Error(`Slack returned no valid workspace member`);return o.id===e.actor.id&&o.deleted===!1&&o.is_bot===!1&&o.is_restricted===!1&&o.is_ultra_restricted===!1&&(o.is_external===void 0||o.is_external===!1)&&(o.team_id===r||Array.isArray(o.enterprise_user?.teams)&&o.enterprise_user.teams.includes(r))}async function Ht(e,t,n,r){let i=await r(`https://slack.com/api/conversations.${e}`,{method:`POST`,headers:{authorization:`Bearer ${n}`,"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams(t),redirect:`error`,signal:AbortSignal.timeout(5e3)}),a=await i.json();if(!i.ok||a.ok!==!0)throw Error(`Slack conversations.${e} failed`);return a}async function Ut(e,t,n){let{channel:r}=await Ht(`info`,{channel:e},t,n);if(!r)throw Error(`Slack returned no conversation`);return r.is_private===!1&&!r.is_im&&!r.is_mpim}async function Wt(e,t,n=fetch){if(e.space)return{...e.space,private:!await Ut(e.space.id,t,n)}}async function Gt(e,t,n=fetch){let r=[],i=``;do{let a=await Ht(`members`,{channel:e.id,limit:`200`,...i?{cursor:i}:{}},t,n);r.push(...a.members??[]),i=a.response_metadata?.next_cursor??``}while(i);return r}function Kt(e){let t=e?.data?.error;return[`invalid_auth`,`account_inactive`,`token_revoked`].includes(t??``)}async function qt(e,t){let n=await e.token();if(!n)return[];let r=await e.fetch(`https://slack.com/api/conversations.replies`,{method:`POST`,headers:{authorization:`Bearer ${n}`,"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams(t),redirect:`error`,signal:AbortSignal.timeout(5e3)}),i=await r.json();if(!r.ok||i.ok!==!0)throw Error(`Slack returned no thread`);return i.messages??[]}const Jt=e=>new Date(Number(e)*1e3).toISOString();async function Yt(e,t){let n=/^slack:([^:]+):(\d+\.\d+)$/.exec(e.chat?.thread.id??``),r=e.chat?.message;if(!n||!r||e.chat?.thread.isDM)return{};let[,i,a]=n;if(t.after===void 0){if(r.id===a)return{index:0};let[e]=await qt(t,{channel:i,ts:a,limit:`1`});return e?.reply_count===void 0?{}:{index:e.reply_count}}if(t.delivered)return{};let o=t.after;return{since:(await qt(t,{channel:i,ts:a,oldest:o,limit:`1000`})).filter(e=>e.ts&&e.ts!==a&&e.ts!==r.id&&e.ts>o&&!e.bot_id).map(e=>({id:e.ts,author:e.user_profile?.display_name||e.user_profile?.real_name||e.user||``,text:e.text??``,sentAt:Jt(e.ts)}))}}const Xt={"read-only":[`read`],auto:[`read`,`write`]};function Zt(e,t,n,r){let i=!e.includes(`write`);if(r)return{name:`slack`,url:`https://mcp.slack.com/mcp`,headers:{Authorization:`Bearer ${n}`},credentialFields:{header:`Authorization`},readOnly:i,description:`On the user's token; searches and reads everything the user can see.`};let a=`/tmp/coder-slack-${ne()}`;return{name:`slack`,command:`slack-mcp-server`,readOnly:i,description:`On the bot token; reads the channels the bot is in and has no search.`,instructions:[`Read: channels_list lists channels;`,`conversations_history reads a channel's or DM's messages, including messages older than the conversation history the task's history tool returns;`,`conversations_replies reads a thread's by its thread_ts.`,`A channel_id is an id such as C0123, #channel-name, or @user for a DM.`,`Write, when allowed: conversations_add_message posts to a channel or thread; the reaction tools add or remove an emoji reaction.`].join(` `),args:[`--transport`,`stdio`],env:{SLACK_MCP_XOXB_TOKEN:n,SLACK_MCP_USERS_CACHE:`${a}-users.json`,SLACK_MCP_CHANNELS_CACHE:`${a}-channels.json`,SLACK_MCP_LOG_LEVEL:`error`,SLACK_MCP_ADD_MESSAGE_TOOL:i?``:`true`,SLACK_MCP_REACTION_TOOL:i?``:`true`,SLACK_MCP_ATTACHMENT_TOOL:`true`,SLACK_MCP_MARK_TOOL:i?``:`true`},credentialFields:{env:`SLACK_MCP_XOXB_TOKEN`}}}function K(e){return e.replace(/\/$/,``)}function Qt(e,{name:t,description:n,scopes:r,events:i,extras:a}){let o=K(e);return{display_information:{name:t,...n?{description:n.slice(0,140)}:{}},features:{bot_user:{display_name:t,always_online:!0},app_home:{home_tab_enabled:!0,messages_tab_enabled:!0,messages_tab_read_only_enabled:!1},...a},oauth_config:{redirect_urls:[`${o}/install/slack/callback`,`${o}/connect/slack/callback`],scopes:{bot:r,user:un}},settings:{org_deploy_enabled:!0,is_mcp_enabled:!0,event_subscriptions:{request_url:`${o}/hooks/slack`,bot_events:i},interactivity:{is_enabled:!0,request_url:`${o}/hooks/slack`}}}}async function q(e,t,n,r){let{assertSlackOk:i,callSlackApi:a}=await import(`./api-qdpx8FD0.js`),o=await a(e,t,{token:n,fetch:r});return i(e,o),o}async function $t(e,t,n=fetch){let r=await q(`apps.manifest.create`,{manifest:JSON.stringify(t)},e,n);return{appId:r.app_id,clientId:r.credentials.client_id,clientSecret:r.credentials.client_secret,signingSecret:r.credentials.signing_secret}}const J=e=>fn(e.access,e.events);function Y(e,t,n){return Qt(e,{name:t,description:n.description,scopes:J(n),events:hn(n.events),extras:gn(n)})}async function en(e,t=fetch){let n=await t(`https://slack.com/api/tooling.tokens.rotate`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({refresh_token:e})}),r=await n.json();if(!n.ok||!r.ok||!r.token||!r.refresh_token||!r.team_id||!r.user_id)throw new d(`platform-error`,r.error??String(n.status));return{workspace:r.team_id,user:r.user_id,configToken:r.token,configRefreshToken:r.refresh_token,configTokenExpires:(r.exp??0)*1e3}}async function tn(e,t,n,r){return e.use(t,async(e,t,i)=>{let a=e;if(a.configTokenExpires<=Date.now()+6e4){try{let e=await en(a.configRefreshToken,n);if(e.workspace!==a.workspace||e.user!==a.user)throw Error(`Configuration token owner changed`);a=e}catch{throw await i(),new d(`invalid-field`,`token`,`This configuration token could not be refreshed. Paste a new token.`)}await t(a)}return r(a.configToken)})}function nn(e,t,n,r=[]){let i=new URLSearchParams({client_id:e.clientId,state:n,redirect_uri:`${K(t)}/install/slack/callback`});return r.length&&i.set(`scope`,r.join(`,`)),`https://slack.com/oauth/v2/authorize?${i}`}async function rn(e,t,n,r){let i=await r(`https://slack.com/api/oauth.v2.access`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:t.clientId,client_secret:t.clientSecret,code:e,redirect_uri:n})}),a=await i.json();if(!i.ok||!a.ok)throw new d(`platform-error`,a.error??String(i.status));return a}async function an(e,t,n,r=fetch){let i=await rn(e,t,`${K(n)}/install/slack/callback`,r),a=i.is_enterprise_install===!0,o=a?i.enterprise:i.team;if(!i.access_token||!o?.id||!o.name)throw new d(`platform-error`);return{id:o.id,name:o.name,org:a,accessToken:i.access_token,...i.authed_user?.id?{installer:i.authed_user.id}:{}}}const on=e=>`${K(e)}/connect/slack/callback`,sn={authorizeUrl(e,{publicUrl:t,state:n}){return`https://slack.com/oauth/v2/authorize?${new URLSearchParams({client_id:e.clientId,user_scope:un.join(`,`),redirect_uri:on(t),state:n})}`},async exchange(e,t,{publicUrl:n,fetch:r}){let i=new URL(e.url).searchParams.get(`code`);if(!i)throw new d(`missing-code`);let{authed_user:a}=await rn(i,t,on(n),r);if(!a?.id||!a.access_token||a.token_type!==`user`)throw new d(`platform-error`);let o=await q(`auth.test`,{},a.access_token,r);if(o.user_id!==a.id)throw new d(`platform-error`,`invalid_auth`);return{id:a.id,...o.user?{login:o.user}:{},token:JSON.stringify({accessToken:a.access_token})}},async access(e,t,{force:n}){if(n)throw new d(`platform-error`,`invalid_token`,`Slack refused the user token`);return{accessToken:JSON.parse(e).accessToken}}};async function cn(e,t){let n=[],r=``;do{let i=await q(`auth.teams.list`,{limit:1e3,...r?{cursor:r}:{}},e,t);n.push(...i.teams.map(e=>e.id)),r=i.response_metadata?.next_cursor??``}while(r);return n}const ln={createStep:(e,t)=>{let n=t?.saved??[],r=n.length?{field:`token`,equals:`new`}:void 0;return{intro:`The Slack app is created with a configuration token and its bot installed in the token's whole workspace.`,link:`https://api.slack.com/apps`,steps:[{...r?{when:r}:{},text:`Under **Your App Configuration Tokens**, click **Generate Token** and pick the workspace the agent should join.`},{text:`Paste the refresh token below, then approve the install when Slack asks.`,...r?{when:r}:{}}],notes:[`A workspace that requires app approval sends the install to its admins first. In Enterprise Grid, only an org admin can install org-wide.`,`To install the app in other Slack workspaces, click **Activate Public Distribution** under the app's **Manage Distribution**.`],fields:[...n.length?[{name:`token`,label:`Configuration token`,options:[...n.map(({id:e,label:t})=>({value:e,label:t})),{value:`new`,label:`Paste a new token`}]}]:[],{...r?{when:r}:{},name:`refreshToken`,label:`Refresh token`,hint:`Starts with xoxe-1-.`,placeholder:`xoxe-1-…`,required:!0}],submit:`Create Slack app`}},async createCallback(e,{publicUrl:t,spec:n,fetch:r,tokens:i}){if(!i)throw Error(`Configuration token storage is unavailable`);let a=new URLSearchParams(await e.text()),o=a.get(`token`);if(!o||o===`new`){let e=a.get(`refreshToken`);if(!e)throw Error(`Missing refresh token`);if(e.startsWith(`xoxe.xoxp-`))throw new d(`invalid-field`,`access-token`,`That is the access token, xoxe.xoxp-…. Paste the refresh token next to it, which starts with xoxe-1-.`);if(!e.startsWith(`xoxe-1-`))throw new d(`invalid-field`,`refresh-token`,`That is not a refresh token; they start with xoxe-1-. Copy it from Your App Configuration Tokens.`);let t=await en(e,r),n={workspace:t.workspace,user:t.user,workspaceName:t.workspace,credentials:t},s=await q(`auth.test`,{},t.configToken,r).catch(()=>void 0);o=await i.put({...n,workspaceName:s?.team||n.workspaceName})}let{name:s}=n,c=await tn(i,o,r,e=>$t(e,Y(t,s,n),r));return{platformAppId:c.appId,name:s,credentials:{...c,configTokenId:o,scopes:J(n)}}},manifest:(e,{publicUrl:t,spec:n})=>Y(t,e.name,n),async update(e,t,{publicUrl:n,spec:r,fetch:i,saveCredentials:a,tokens:o}){let s=t;if(!s.configTokenId||!o)throw new d(`no-refresh-token`);await tn(o,s.configTokenId,i,t=>q(`apps.manifest.update`,{app_id:s.appId,manifest:JSON.stringify(Y(n,e.name,r))},t,i));let c=J(r);c.join()!==s.scopes?.join()&&await a({...s,scopes:c})},settingsUrl:(e,t)=>`https://api.slack.com/apps/${encodeURIComponent(t.appId)}`,async uninstall(e,t,{fetch:n}){let{clientId:r,clientSecret:i}=t,a=await X(e,t);await q(`apps.uninstall`,{client_id:r,client_secret:i},a,n)},installationUrl:({account:e})=>new URL(`/apps/manage`,e.url??`https://my.slack.com`).href,installUrl(e,t,{publicUrl:n,state:r}){let i=t;return nn(i,n,r,i.scopes??fn(`auto`))},async installCallback(e,{app:t,credentials:n,publicUrl:r,fetch:i,tokens:a}){let o=new URL(e.url).searchParams.get(`code`);if(!o)throw new d(`missing-code`);let s=await an(o,n,r,i),c=n.configTokenId;a&&c&&!s.org&&await a.use(c,(e,t)=>t(e,s.name));let l=await q(`auth.test`,{},s.accessToken,i).then(e=>e.url?.replace(/\/$/,``)).catch(()=>void 0),u=s.org?await cn(s.accessToken,i).catch(()=>null):void 0;return{platformInstallId:s.id,account:{login:s.name,...s.org?{type:`Organization`}:{},...l?{url:l}:{}},token:s.accessToken,...s.org?{covers:u}:{},installer:s.installer,...s.installer?{user:{id:s.installer}}:{}}}},un=[`search:read.public`,`search:read.private`,`search:read.mpim`,`search:read.im`,`search:read.files`,`search:read.users`,`channels:history`,`groups:history`,`mpim:history`,`im:history`,`channels:read`,`groups:read`,`mpim:read`,`im:read`,`users:read`,`users:read.email`,`files:read`,`chat:write`],dn=[`app_mentions:read`,`channels:history`,`groups:history`,`im:history`,`channels:read`,`groups:read`,`im:read`,`mpim:read`,`users:read`,`users:read.email`,`files:read`,`usergroups:read`,`reactions:read`,`reactions:write`];function fn(e=`auto`,t=[]){return[...dn,...t.includes(`dm`)?[`mpim:history`]:[],`chat:write`,`files:write`,`im:write`,`assistant:write`,...(Array.isArray(e)?e.includes(`write`):e===`auto`)?[`channels:join`,`channels:manage`,`groups:write`,`mpim:write`,`usergroups:write`]:[]]}const pn={mention:[`app_mention`,`message.channels`,`message.groups`],dm:[`message.im`,`message.mpim`],channel:[`message.channels`,`message.groups`]},mn=[`mention`,`dm`,`channel`];function hn(e){let t=e.some(e=>mn.includes(e));return[...new Set([...e.flatMap(e=>pn[e]??[]),...t?[`reaction_added`,`member_joined_channel`,`member_left_channel`]:[]]),`team_access_granted`,`team_access_revoked`,`app_uninstalled`,`tokens_revoked`,`app_home_opened`]}function gn(e){return{agent_view:{agent_description:e.description??`${e.name} in your workspace.`}}}function _n(e,t,n=`send it a direct message`){let r=[t.includes(`mention`)&&`mention @${e} in a channel`,t.includes(`dm`)&&n,t.includes(`channel`)&&`write in a channel it is in`].filter(e=>!!e);if(!r.length)return;let i=r.length>1?`${r.slice(0,-1).join(`, `)}, or ${r.at(-1)}`:r[0];return`${i[0].toUpperCase()}${i.slice(1)}.`}const X=async e=>{if(!e.token)throw Error(`Slack installation ${e.id} has no bot token`);return e.token},vn=l({type:i(c()),team_id:i(c()),enterprise_id:i(c()),is_enterprise_install:i(n([a(),c()])),api_app_id:i(c()),challenge:i(c()),authorizations:i(o(l({user_id:i(c()),team_id:i(r(c())),enterprise_id:i(r(c())),is_enterprise_install:i(a())})))}),yn=l({enterprise_id:i(c()),authorizations:i(o(l({enterprise_id:i(c())}))),event:l({type:s([`team_access_granted`,`team_access_revoked`]),team_ids:o(c())})}),bn=l({type:s([`app_uninstalled`,`tokens_revoked`]),tokens:i(l({bot:i(o(c()))}))}),xn=l({type:u(`app_home_opened`),user:c(),tab:u(`home`)}),Sn=`link:`,Cn=`click:`,wn=`ask:`,Tn=l({type:u(`block_actions`),actions:o(l({action_id:c()}))}),En=l({id:c(),username:i(c()),name:i(c())}),Dn=l({user:En,channel:l({id:c()}),message:i(l({ts:c(),thread_ts:i(c())})),trigger_id:i(c()),actions:t([l({action_id:c(),value:c()})])}),On=l({type:u(`view_submission`),user:En,view:l({callback_id:u(`ask`),private_metadata:c(),state:l({values:l({ask:l({ask:l({value:i(r(c()))})})})})})}),kn=l({thread:c(),message:i(c()),value:c()}),An=e=>{let t=e.username??e.name;return{id:e.id,...t?{login:t}:{}}};function jn(e){let t=Dn.safeParse(e).data,n=t?.actions[0];if(!t||!n)return;let r=t.channel.id.startsWith(`D`)?t.message?.thread_ts??``:t.message?.thread_ts??t.message?.ts,i={thread:`slack:${t.channel.id}${r===void 0?``:`:${r}`}`,...t.message?{message:t.message.ts}:{}},a=t.trigger_id;if(n.action_id.startsWith(`ask:`)&&a)return{work:async e=>(await import(`./views-Bxm_5J6T.js`)).openAsk(e,a,i,n.value)};if(n.action_id.startsWith(`click:`))return{click:{...i,value:n.value,actor:An(t.user)}}}function Mn(e){let t=On.safeParse(e).data,n;try{n=t&&kn.safeParse(JSON.parse(t.view.private_metadata)).data}catch{return}if(!t||!n)return;let r=t.view.state.values.ask.ask.value?.trim();return{click:{...n,...r?{text:r}:{},actor:An(t.user)}}}function Nn(e){try{return JSON.parse(e)}catch{let t=new URLSearchParams(e),n=t.get(`payload`);if(!n)return Object.fromEntries(t);try{return JSON.parse(n)}catch{return{}}}}const Pn=n([l({type:s([`member_joined_channel`,`member_left_channel`]),user:c(),channel:c()}),l({type:u(`message`),subtype:s([`channel_convert_to_private`,`channel_convert_to_public`]),channel:c()})]);function Fn(e,t,n,r){let i=Pn.safeParse(e.event).data;if(i&&n){let e={installation:n,...r?{account:r}:{}},t={kind:`channel`,id:i.channel};return i.type===`message`?{space:{...e,space:{...t,private:i.subtype===`channel_convert_to_private`}}}:{space:{...e,space:t,...i.type===`member_joined_channel`?{joined:i.user}:{left:i.user}}}}let a=bn.safeParse(e.event).data;if(a){let e=a.type===`app_uninstalled`||a.tokens?.bot?.length;return n&&e?{uninstalled:`${t}:${n}`}:{ack:!0}}let o=xn.safeParse(e.event).data;if(o)return{work:async e=>(await import(`./views-Bxm_5J6T.js`)).publishHome(e,o.user)};let s=Tn.safeParse(e).data?.actions,c=s?.length?jn(e):void 0;if(c)return c;let l=Mn(e);if(l)return l;if(s?.length&&s.every(e=>e.action_id.startsWith(`link:`)))return{ack:!0};if(e.type&&e.type!==`event_callback`&&e.type!==`url_verification`)return{unhandled:`Slack interaction ${e.type}`};let u=yn.safeParse(e).data,d=u?.enterprise_id??u?.authorizations?.[0]?.enterprise_id;if(!u||!d)return;let f=u.event.team_ids;return{covers:{installation:`${t}:${d}`,...u.event.type===`team_access_granted`?{add:f}:{remove:f}}}}function In(e,t,n){let r=e.headers.get(`x-slack-request-timestamp`)??``;if(!n||!(Math.abs(Date.now()/1e3-Number(r))<=300))return!1;let i=`v0=${p(`sha256`,n).update(`v0:${r}:${t}`).digest(`hex`)}`;return f(e.headers.get(`x-slack-signature`)??``,i)}const Ln=e=>e===`im`||e===`mpim`?`dm`:`channel`;function Rn(e){let t=l({channel:c(),channel_type:i(c())}).safeParse(e).data;if(!t)return;let n=t.channel_type;return{kind:`channel`,id:t.channel,...n===`channel`?{private:!1}:[`group`,`im`,`mpim`].includes(n??``)?{private:!0}:{}}}function zn(e,t){let n=Nn(t),r=vn.safeParse(n).data;if(r?.type===`url_verification`&&r.challenge)return new Response(r.challenge);let i=r?.authorizations?.[0],a=i?.team_id??r?.team_id??n.team?.id,o=String(i?.is_enterprise_install??r?.is_enterprise_install)===`true`,s=o?i?.enterprise_id??r?.enterprise_id??n.enterprise?.id:a,c=i?.user_id,l=Rn(n.event);return r?.api_app_id?{app:r.api_app_id,...s?{installation:s}:{},...o&&a?{account:a}:{},...c?{self:c}:{},...l?{space:l}:{}}:void 0}function Bn(e,t,n,r){let i=zn(e,t),a=i&&!(i instanceof Response)?i:void 0,o=Fn(Nn(t),n.id,a?.installation,a?.account);if(o)return In(e,t,r?.signingSecret)?o:{invalid:!0}}function Vn(e,t,n){let r=n.raw.channel_type;return{type:t.isDM?`dm`:e===`mention`?e:Ln(r),actor:{id:n.author.userId,...n.author.userName?{login:n.author.userName}:{}}}}function Hn(e){let t=/^slack:([^:]+):(\d+)\.(\d+)$/.exec(e.chat?.thread.id??``);return t?`https://slack.com/archives/${t[1]}/p${t[2]}${t[3]}`:void 0}const Un=864e5,Z=e=>`slack:typing:${e}`,Q=`coder-pending:`;function Wn(e,t){return async n=>{let r=n.data,i=n.headers.toJSON(),a=typeof r==`string`?new URLSearchParams(r):void 0,o=a?.get(`token`);a&&o?.startsWith(Q)&&(a.set(`token`,await t(o.slice(14))),r=a.toString());let s=Object.keys(i).find(e=>e.toLowerCase()===`authorization`);s&&i[s].startsWith(`Bearer ${Q}`)&&(i[s]=`Bearer ${await t(i[s].slice(`Bearer ${Q}`.length))}`);let c=await e(new URL(n.url??``,n.baseURL),{method:n.method?.toUpperCase()??`POST`,headers:i,body:r});return{data:await c.text(),status:c.status,statusText:c.statusText,headers:Object.fromEntries(c.headers),config:n,request:{}}}}async function Gn(e){let[{SlackAdapter:t},{ConsoleLogger:n,defaultEmojiResolver:r}]=await Promise.all([import(`./dist-DfD9WmV8.js`),import(`./dist-B5qUdWUG.js`)]);class i extends t{outbound;privateState;hears;active;knows;constructor(e,t,n,r,i,a){super(e),this.outbound=t,this.privateState=n,this.hears=r,this.active=i,this.knows=a}unnamed=!1;async handleReactionEvent(e,t){let n=e.item;if(!(this.knows&&n.type===`message`&&n.channel&&n.ts&&!await this.knows(n.channel,n.ts)))return super.handleReactionEvent(e,t)}handleMessageEvent(e,t){let n=e.subtype===`message_changed`&&e.message?{...e.message,channel:e.channel,channel_type:e.channel_type}:e;if(!(e.type===`message`&&e.subtype!==`message_deleted`&&e.channel_type!==`im`&&!this.parseMessage(n).isMention)||!this.hears)return super.handleMessageEvent(e,t);let r=(async()=>{await this.hears(Ln(e.channel_type),n.text??``)&&(this.unnamed=!!n.thread_ts&&!await this.active?.(this.threadIdForMessageEvent(n)),super.handleMessageEvent(e,t))})();t?.waitUntil?.(r)}lookupUser(e){return this.unnamed?Promise.resolve({displayName:e,realName:e}):super.lookupUser(e)}async initialize(e){let t=e.getState(),n=this.privateState?.()??t,r=new Proxy(t,{get(e,t){let r=Reflect.get(e,t);return typeof r==`function`?(...r)=>{let i=typeof r[0]==`string`&&/^slack:(?:user:|user-by-name:|thread-participants:)/.test(r[0])?n:e;return Reflect.apply(Reflect.get(i,t),i,r)}:r}});await super.initialize(new Proxy(e,{get:(e,t,n)=>t===`getState`?()=>r:Reflect.get(e,t,n)}))}async startTyping(e,t,n){let r=n?.messageId??this.decodeThreadId(e).threadTs;if(r){try{await super.addReaction(e,r,`eyes`)}catch(e){if(e.data?.error===`already_reacted`)return;throw e}await this.chat?.getState().appendToList(Z(e),r,{ttlMs:Un})}}async endTyping(e){let t=this.chat?.getState(),n=await t?.getList(Z(e))??[];n.length&&(await t.delete(Z(e)),await Promise.all(n.map(t=>super.removeReaction(e,t,`eyes`))))}async addReaction(e,t,n){let i=this.chat?.getState(),a=r.toSlack(n).replace(/:/g,``)===`eyes`&&i?await i.getList(Z(e)):[];if(!a.includes(t))return super.addReaction(e,t,n);await i.delete(Z(e));for(let n of a.filter(e=>e!==t))await i.appendToList(Z(e),n,{ttlMs:Un})}markEventDelivered(){}async isDuplicateEventDelivery(){return!1}getToken(){return this.requestContext.getStore()?.token||!this.outbound?super.getToken():this.outbound()}}let a=e.credentials?.signingSecret,o=e.installationId,s=new Map,c=t=>(s.has(t)||s.set(t,e.token(t)),s.get(t));return new i({userName:e.name,apiUrl:`https://slack.com/api/`,appToken:``,socketForwardingSecret:``,clientId:``,clientSecret:``,encryptionKey:``,...a?{signingSecret:a,installationProvider:{getInstallation:async t=>({botToken:`${Q}${t}`,...e.self?{botUserId:e.self}:{}})}}:{webhookVerifier:()=>!1,botToken:()=>o?e.token(o):Promise.reject(Error(`No Slack workspace to post for`))},webClientOptions:{adapter:Wn(e.fetch,c)},logger:new n(`error`)},a&&o?()=>c(o):void 0,e.privateState,e.hears,e.active,e.knows)}const Kn={id:`slack`,brand:{color:`#E3066A`,icon:`M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zM18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zM15.165 18.956a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z`,svg:`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"><g><path d="M 84.04 252.77 c 0 23.13 -18.89 42.02 -42.02 42.02 S 0 275.9 0 252.77 s 18.89 -42.02 42.02 -42.02 h 42.02 v 42.02 Z" fill="#e3066a"/><path d="M 105.21 252.77 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 v 105.21 c 0 23.13 -18.89 42.02 -42.02 42.02 s -42.02 -18.89 -42.02 -42.02 c 0 0 0 -105.21 0 -105.21 Z" fill="#e3066a"/></g><g><path d="M 147.23 84.04 c -23.13 0 -42.02 -18.89 -42.02 -42.02 S 124.1 0 147.23 0 s 42.02 18.89 42.02 42.02 v 42.02 h -42.02 Z" fill="#00b3ff"/><path d="M 147.23 105.21 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 H 42.02 c -23.13 0 -42.02 -18.89 -42.02 -42.02 s 18.89 -42.02 42.02 -42.02 c 0 0 105.21 0 105.21 0 Z" fill="#00b3ff"/></g><g><path d="M 315.96 147.23 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 -18.89 42.02 -42.02 42.02 h -42.02 v -42.02 Z" fill="#41b658"/><path d="M 294.79 147.23 c 0 23.13 -18.89 42.02 -42.02 42.02 s -42.02 -18.89 -42.02 -42.02 V 42.02 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 v 105.21 Z" fill="#41b658"/></g><g><path d="M 252.77 315.96 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 -42.02 -18.89 -42.02 -42.02 v -42.02 h 42.02 Z" fill="#fcc003"/><path d="M 252.77 294.79 c -23.13 0 -42.02 -18.89 -42.02 -42.02 s 18.89 -42.02 42.02 -42.02 h 105.21 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 h -105.21 Z" fill="#fcc003"/></g></svg>`},name:`Slack`,featured:!0,description:`Mentions, direct messages, and channel messages in a Slack workspace`,installLabel:`Add to Slack`,use:(e,t)=>_n(`{handle}`,e,t?`message it here`:void 0),covered:`Slack workspace`,item:e=>e.replace(/^(slack:D[A-Z0-9]+:).+$/,`$1`),sample:`slack:C0000000000:1700000000.000100`,prompt:[`A conversation is a Slack thread, or a whole 1:1 DM with its threads. A group DM works like a channel.`,`Replies render as Slack Markdown: headings, lists, tables, code blocks, quotes. Mention a person as <@USER_ID>.`,`Link pull requests and issues by full URL; a bare number like #123 renders only on GitHub.`].join(`
9
+ `),replyLimit:12e3,events:{mention:{description:`A message that mentions the agent in a channel or group DM.`,on:`mention`,addressed:!0},dm:{description:`Every message in a direct message or group DM with the agent.`,on:`message`,addressed:!0},channel:{description:`Every message in channels the agent is in.`,on:`message`,noisy:!0,addressed:!0}},tools:{presets:Xt,server:Zt,install:`set -eu; arch=$(uname -m); case "$arch" in x86_64) arch=amd64; checksum=d1525962e9b9dbfdd2eaf48d0a81ca1eca7d8f1862b8d34931b812c850b3e568;; aarch64|arm64) arch=arm64; checksum=a307a48d16c2261346bdc257274cdcdb8b2027c867dc971b41d52cef36472c88;; *) exit 1;; esac; file=$(mktemp); trap 'rm -f "$file"' EXIT; curl -fsSL "https://github.com/korotovsky/slack-mcp-server/releases/download/v1.3.0/slack-mcp-server-linux-$arch" -o "$file"; echo "$checksum $file" | sha256sum -c -; install -m 755 "$file" /usr/local/bin/slack-mcp-server`,installHosts:[`github.com`,`release-assets.githubusercontent.com`]},hosts:[`slack.com`,`*.slack.com`],get app(){return ln},target:zn,messages:{asks:!0,post:async(e,t)=>(await import(`./views-Bxm_5J6T.js`)).postMessage(e,t),edit:async(e,t,n)=>(await import(`./views-Bxm_5J6T.js`)).editMessage(e,t,n),direct:async(e,t,n)=>(await import(`./views-Bxm_5J6T.js`)).directMessage(e,t,n)},link:Hn,ownEvents:Bn,adapter:Gn,event:Vn,requestFetch:Bt,isUninstalled:Kt,conversation:Yt,auth:{canWrite:Vt,members:Gt,space:Wt,token:X,get user(){return sn}}};var qn=e({INTEGRATIONS:()=>$,enabledIntegrations:()=>Jn});const $={slack:Kn,github:gt,linear:zt};function Jn(e){if(!e)return $;let t=e.filter(e=>!$[e]);if(t.length)throw Error(`Unknown integration ${t.join(`, `)} in SERVER_INTEGRATIONS; pick from ${Object.keys($).join(`, `)}`);return Object.fromEntries(e.map(e=>[e,$[e]]))}export{Cn as a,wn as i,Jn as n,Sn as o,qn as r,q as s,$ as t};
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import{T as e,ba as t,h as n,j as r,u as i}from"../args-CJsHYWbt.js";import{a}from"../emit-BgeqsCkC.js";import{it as o}from"../state-Br-Fuaxg.js";import{o as s}from"../connections-Cswv7r8Z.js";import{C as c,S as l,a as ee,b as te,c as ne,n as re,o as u,p as d,r as f,t as ie}from"../app-server-BTpa5GBV.js";import p from"node:path";import m from"node:process";import h from"node:fs";import ae from"node:net";const oe=new Set([`turn/start`,`review/start`,`thread/compact/start`]),g=3e4;function _(e,t,n){let r=new Set;return t?.threadId&&r.add(t.threadId),e===`review/start`&&n?.reviewThreadId&&r.add(n.reviewThreadId),r}function v(e={}){let{threadId:t,serviceName:n,ephemeral:r,...i}=e;return JSON.stringify(i)}function y(e,t,n){return n===void 0?{code:e,message:t}:{code:e,message:t,data:n}}function b(e,t){e.destroyed||e.write(`${JSON.stringify(t)}\n`)}const x=new Set([`turn/interrupt`,`turn/steer`,`thread/backgroundTerminals/clean`,`thread/archive`,`thread/delete`]);function se(e){return typeof e?.method==`string`&&x.has(e.method)}function ce(e){e&&(h.mkdirSync(p.dirname(e),{recursive:!0}),h.writeFileSync(e,`${m.pid}\n`,`utf8`))}async function S(){let[x,...S]=m.argv.slice(2);if(x!==`serve`)throw Error(`Usage: coder broker serve --endpoint <value> [--cwd <path>] [--pid-file <path>] [--network-access <true|false>] [--idle-ms <ms>]`);let C=a(t({name:`broker`,description:`The codex app-server broker`,access:`write`,args:{cwd:i(),"pid-file":i(),endpoint:r(),"network-access":e(n([`true`,`false`])),"idle-ms":i()},run(){}}),S),w=C.cwd?p.resolve(m.cwd(),C.cwd):m.cwd(),T=String(C.endpoint),E=c(T),D=C[`pid-file`]?p.resolve(C[`pid-file`]):null,O=C[`network-access`]===`true`,k=Number(C[`idle-ms`]??18e5);ce(D);let A=null,j=``,M={},N=null,P=!1,F=!1,I=null,L=null,R=null,z=new Set,B=new WeakMap,V=new Set,H=new Map;function U(e){m.stderr.write(`[coder broker] ${JSON.parse(o(e,[...V]))}\n`)}function W(e){for(let[t,n]of H)n.socket===e&&(H.delete(t),n.client.exitResolved||n.client.sendMessage({id:t,error:y(-32e3,`Broker client disconnected before answering the server request.`)}))}function le(e,t){let n=L??I;if(!n||n.destroyed){e.sendMessage({id:t.id,error:y(-32601,`No broker client available to answer ${t.method}.`)});return}H.set(t.id,{socket:n,client:e}),b(n,t)}function G(e){if(e!==A||F)return;A=null;let t=e.exitError?.message??`codex app-server exited.`;U(`${t} Starting a fresh one on the next request.`);for(let e of new Set([I,L]))e&&b(e,{method:ie,params:{message:t}});H.clear(),I=null,L=null,R=null}async function K(){let e=u(m.env,M),t=ee.connect(w,{disableBroker:!0,networkAccess:O,bridgeUrl:X.url}),n,r=new Promise((e,t)=>{n=setTimeout(()=>t(Error(`no answer within ${g/1e3}s`)),g)});try{let n=await Promise.race([t,r]);return n.setNotificationHandler(de),n.handleServerRequest=e=>le(n,e),n.exitPromise.then(()=>G(n)),j=e,n}catch(e){throw t.then(e=>e.close()).catch(()=>{}),Error(`codex app-server could not start: ${ne(e)}`)}finally{clearTimeout(n)}}async function q(){let e=A;A=null,H.clear(),await e?.close().catch(()=>{})}async function ue(e){if(N)return N;let t=P||u(m.env,M)!==j;if(A&&!A.exitResolved&&!t)return A;if(A&&!A.exitResolved){let t=`Codex login changed; restarted the shared Codex app-server.`;U(t),b(e,{method:f,params:{message:t}})}return P=!1,await q(),N=K().finally(()=>{N=null}),A=await N,A}function J(e){W(e),I===e&&(I=null),L===e&&(L=null,R=null)}function de(e){let t=I??L;if(t&&(b(t,e),e.method===`turn/completed`&&L===t)){let n=e.params?.threadId??null;(!n||!R||R.has(n))&&(L=null,R=null,I===t&&(I=null))}}async function Y(e){F=!0;let t=new Promise(t=>e.close(t));E.kind===`unix`&&h.existsSync(E.path)&&h.unlinkSync(E.path);let n=s();l(w,O,n)?.endpoint===T&&te(w,O,n);for(let e of z)e.end();await A?.close().catch(()=>{}),await X.close(),await t,D&&h.existsSync(D)&&h.unlinkSync(D)}let X=await d();A=await K();let Z;function Q(){clearTimeout(Z),z.size===0&&(Z=setTimeout(async()=>{U(`No clients for ${k/1e3}s; exiting.`),await Y($),m.exit(0)},k))}let $=ae.createServer(e=>{clearTimeout(Z),z.add(e),e.setEncoding(`utf8`);let t=``;e.on(`data`,async n=>{t+=n;let r=t.indexOf(`
2
+ import{T as e,ba as t,h as n,j as r,u as i}from"../args-CJsHYWbt.js";import{a}from"../emit-BgeqsCkC.js";import{it as o}from"../state-CxAUec80.js";import{o as s}from"../connections-B90TemYf.js";import{C as c,S as l,a as ee,b as te,c as ne,n as re,o as u,p as d,r as f,t as ie}from"../app-server-dnlLhhZb.js";import p from"node:path";import m from"node:process";import h from"node:fs";import ae from"node:net";const oe=new Set([`turn/start`,`review/start`,`thread/compact/start`]),g=3e4;function _(e,t,n){let r=new Set;return t?.threadId&&r.add(t.threadId),e===`review/start`&&n?.reviewThreadId&&r.add(n.reviewThreadId),r}function v(e={}){let{threadId:t,serviceName:n,ephemeral:r,...i}=e;return JSON.stringify(i)}function y(e,t,n){return n===void 0?{code:e,message:t}:{code:e,message:t,data:n}}function b(e,t){e.destroyed||e.write(`${JSON.stringify(t)}\n`)}const x=new Set([`turn/interrupt`,`turn/steer`,`thread/backgroundTerminals/clean`,`thread/archive`,`thread/delete`]);function se(e){return typeof e?.method==`string`&&x.has(e.method)}function ce(e){e&&(h.mkdirSync(p.dirname(e),{recursive:!0}),h.writeFileSync(e,`${m.pid}\n`,`utf8`))}async function S(){let[x,...S]=m.argv.slice(2);if(x!==`serve`)throw Error(`Usage: coder broker serve --endpoint <value> [--cwd <path>] [--pid-file <path>] [--network-access <true|false>] [--idle-ms <ms>]`);let C=a(t({name:`broker`,description:`The codex app-server broker`,access:`write`,args:{cwd:i(),"pid-file":i(),endpoint:r(),"network-access":e(n([`true`,`false`])),"idle-ms":i()},run(){}}),S),w=C.cwd?p.resolve(m.cwd(),C.cwd):m.cwd(),T=String(C.endpoint),E=c(T),D=C[`pid-file`]?p.resolve(C[`pid-file`]):null,O=C[`network-access`]===`true`,k=Number(C[`idle-ms`]??18e5);ce(D);let A=null,j=``,M={},N=null,P=!1,F=!1,I=null,L=null,R=null,z=new Set,B=new WeakMap,V=new Set,H=new Map;function U(e){m.stderr.write(`[coder broker] ${JSON.parse(o(e,[...V]))}\n`)}function W(e){for(let[t,n]of H)n.socket===e&&(H.delete(t),n.client.exitResolved||n.client.sendMessage({id:t,error:y(-32e3,`Broker client disconnected before answering the server request.`)}))}function le(e,t){let n=L??I;if(!n||n.destroyed){e.sendMessage({id:t.id,error:y(-32601,`No broker client available to answer ${t.method}.`)});return}H.set(t.id,{socket:n,client:e}),b(n,t)}function G(e){if(e!==A||F)return;A=null;let t=e.exitError?.message??`codex app-server exited.`;U(`${t} Starting a fresh one on the next request.`);for(let e of new Set([I,L]))e&&b(e,{method:ie,params:{message:t}});H.clear(),I=null,L=null,R=null}async function K(){let e=u(m.env,M),t=ee.connect(w,{disableBroker:!0,networkAccess:O,bridgeUrl:X.url}),n,r=new Promise((e,t)=>{n=setTimeout(()=>t(Error(`no answer within ${g/1e3}s`)),g)});try{let n=await Promise.race([t,r]);return n.setNotificationHandler(de),n.handleServerRequest=e=>le(n,e),n.exitPromise.then(()=>G(n)),j=e,n}catch(e){throw t.then(e=>e.close()).catch(()=>{}),Error(`codex app-server could not start: ${ne(e)}`)}finally{clearTimeout(n)}}async function q(){let e=A;A=null,H.clear(),await e?.close().catch(()=>{})}async function ue(e){if(N)return N;let t=P||u(m.env,M)!==j;if(A&&!A.exitResolved&&!t)return A;if(A&&!A.exitResolved){let t=`Codex login changed; restarted the shared Codex app-server.`;U(t),b(e,{method:f,params:{message:t}})}return P=!1,await q(),N=K().finally(()=>{N=null}),A=await N,A}function J(e){W(e),I===e&&(I=null),L===e&&(L=null,R=null)}function de(e){let t=I??L;if(t&&(b(t,e),e.method===`turn/completed`&&L===t)){let n=e.params?.threadId??null;(!n||!R||R.has(n))&&(L=null,R=null,I===t&&(I=null))}}async function Y(e){F=!0;let t=new Promise(t=>e.close(t));E.kind===`unix`&&h.existsSync(E.path)&&h.unlinkSync(E.path);let n=s();l(w,O,n)?.endpoint===T&&te(w,O,n);for(let e of z)e.end();await A?.close().catch(()=>{}),await X.close(),await t,D&&h.existsSync(D)&&h.unlinkSync(D)}let X=await d();A=await K();let Z;function Q(){clearTimeout(Z),z.size===0&&(Z=setTimeout(async()=>{U(`No clients for ${k/1e3}s; exiting.`),await Y($),m.exit(0)},k))}let $=ae.createServer(e=>{clearTimeout(Z),z.add(e),e.setEncoding(`utf8`);let t=``;e.on(`data`,async n=>{t+=n;let r=t.indexOf(`
3
3
  `);for(;r!==-1;){let n=t.slice(0,r);if(t=t.slice(r+1),r=t.indexOf(`
4
4
  `),!n.trim())continue;let i;try{i=JSON.parse(n)}catch(t){b(e,{id:null,error:y(-32700,`Invalid JSON: ${t instanceof Error?t.message:String(t)}`)});continue}let a=i.id!==void 0&&!i.method?H.get(i.id):void 0;if(a){H.delete(i.id),a.client.exitResolved||a.client.sendMessage(i);continue}if(i.id!==void 0&&i.method===`initialize`){b(e,{id:i.id,result:{userAgent:`coder-broker`,bridgeUrl:X.url}});continue}if(i.method===`initialized`&&i.id===void 0||(i.id!==void 0&&i.method===`broker/shutdown`&&(b(e,{id:i.id,result:{}}),await Y($),m.exit(0)),i.id===void 0||!i.method))continue;for(let[e,t]of Object.entries(i.params?.config??{}))e.startsWith(`model_providers.`)&&t?.http_headers?.authorization&&V.add(String(t.http_headers.authorization).replace(/^Bearer /,``));let o=I&&I!==e||L&&L!==e;if(i.method===`broker/recycle`){P=!0,!o&&A&&(U(`Recycling the shared Codex app-server after a stale-login error.`),P=!1,await q()),b(e,{id:i.id,result:{recycled:!o}});continue}let s=se(i)&&L&&L!==e&&!I;if(o&&!s){b(e,{id:i.id,error:y(re,`Shared Codex broker is busy.`)});continue}if(s){try{if(!A)throw Error(`codex app-server is not running.`);let t=await A.request(i.method,i.params??{});b(e,{id:i.id,result:t})}catch(t){let n=t;b(e,{id:i.id,error:y(n.rpcCode??-32e3,n.message)})}continue}let c=oe.has(i.method);I=e,c&&(L=e,R=_(i.method,i.params??{},null));try{let t=await ue(e),n=B.get(t)??new Map;B.set(t,n);let r=i.method===`thread/start`||i.method===`thread/resume`?v(i.params):null;i.method===`thread/resume`&&n.get(i.params?.threadId)!==r&&await t.request(`thread/unsubscribe`,{threadId:i.params?.threadId});let a=await t.request(i.method,i.params??{});r&&a?.thread?.id&&n.set(a.thread.id,r),b(e,{id:i.id,result:a}),c&&(R=_(i.method,i.params??{},a)),I===e&&(I=null)}catch(t){let n=t;b(e,{id:i.id,error:y(n.rpcCode??-32e3,n.message)}),I===e&&(I=null),L===e&&c&&(L=null,R=null)}}}),e.on(`close`,()=>{z.delete(e),J(e),Q()}),e.on(`error`,()=>{z.delete(e),J(e),Q()})});m.on(`SIGTERM`,async()=>{await Y($),m.exit(0)}),m.on(`SIGINT`,async()=>{await Y($),m.exit(0)}),setInterval(async()=>{z.size===0&&l(w,O,s())?.endpoint!==T&&(await Y($),m.exit(0))},3e4).unref(),$.listen(E.path),Q()}S().catch(e=>{m.stderr.write(`${JSON.parse(o(e instanceof Error?e.message:String(e)))}\n`),m.exit(1)});export{};
@@ -1,2 +1,2 @@
1
- import{Ea as e,s as t}from"./args-CJsHYWbt.js";import{t as n}from"./errors-DK_trCff.js";import{W as r,p as i}from"./state-Br-Fuaxg.js";import{t as a}from"./types-DHBqXFE2.js";import{F as o,w as s}from"./config-D_RuO6gX.js";import{l as c,p as l,u}from"./definition-4on4SG5J.js";import d from"node:path";import{fileURLToPath as f}from"node:url";import p from"node:fs";import{execFile as m}from"node:child_process";import h from"node:os";import g from"node:fs/promises";import{promisify as _}from"node:util";var v={name:`Coder`,description:`Answers engineering questions, reviews pull requests, and makes requested changes.`,integrations:{github:{events:{pull_request:!0,mention:!0,issue:!0,comment:{match:`[Cc]oder`}}},slack:{events:{mention:!0,dm:!0,channel:{match:`[Cc]oder`}}},linear:{events:{mention:!0,issue:!0,comment:{match:`[Cc]oder`}}}}},y=e({AgentLoadError:()=>b,agentsFromSources:()=>D,assertNotReserved:()=>O,builtinDefinitions:()=>w,defaultAgent:()=>T,folderFiles:()=>L,init:()=>V,loadAgents:()=>j,repoAgentOverride:()=>A}),b=class extends Error{};const x=f(new URL(`./builtin/coder/`,import.meta.url)),S={coder:{json:v,builtin:!0,dir:x,systemPrompt:p.readFileSync(d.join(x,`system.md`),`utf8`)}};function C(e,t=!1){let n={},r;try{r=p.readdirSync(e,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>e.name)}catch{return n}for(let i of r){let r=d.join(e,i),a=d.join(r,`agent.json`);p.statSync(a,{throwIfNoEntry:!1})?.isFile()&&(n[i]={json:JSON.parse(p.readFileSync(a,`utf8`)),builtin:t,dir:r})}return n}function w(){return S}function T(){return`coder`}function E(e,t){let n=Object.entries(e.integrations).flatMap(([e,n])=>{let r=t[e]?.events;if(!r)return[];let i=Array.isArray(n.events)?n.events.filter(e=>e in r):n.events&&Object.fromEntries(Object.entries(n.events).filter(([e])=>e in r));return[[e,{...n,...i?{events:i}:{}}]]});return{...e,integrations:Object.fromEntries(n)}}function D(e,t,n){let r=u(e.usage),i=Object.keys(r).filter(t=>!(t in e.definitions));if(i.length){let t=Object.keys(e.definitions).sort().join(`, `)||`none`;throw Error(`Invalid agents:\n agents.${i.sort().join(`, agents.`)}: no agent definition; known ids: ${t}`)}let a=[];for(let[n,i]of Object.entries(e.definitions)){let o=r[n],s=o===!1?{disabled:!0}:o,l=typeof s==`object`&&s.disabled;if(l&&!e.includeDisabled)continue;let u;try{u=c(n,i.json,i.repository??!i.builtin)}catch(e){if(l)continue;throw new b(e instanceof Error?e.message:String(e))}let d=i.builtin?E(u,t):u;a.push({id:n,name:d.name??n,definition:d,...typeof s==`object`?{usage:s}:{},...i.dir?{dir:i.dir}:{},builtin:i.builtin})}let o=l(a.filter(e=>!e.usage?.disabled),t);if(o.length)throw new b(`Invalid agents:\n ${o.join(`
2
- `)}`);return a}function O(e){let t=e.filter(e=>e in w()).sort();if(t.length)throw Error(`Invalid agents:\n agents.${t.join(`, agents.`)}: built-in agent ids are reserved`)}function k(e){let t=o(r(d.resolve(e)));return{file:t,usage:p.existsSync(t)?JSON.parse(p.readFileSync(t,`utf8`)).agents??{}:{}}}function A(e,t,n){let{file:r,usage:i}=k(e),a=i[t],o=typeof a==`boolean`?!a:a?.disabled;return o===void 0||o===n?void 0:r}async function j(e,t,{includeDisabled:n=!1}={}){e=d.resolve(e);let r={...w()},a=C(i(`agents`));for(let e of Object.values(a))e.repository=!1;let o=C(d.join(e,`.coder`,`agents`));O([...Object.keys(a),...Object.keys(o)]),Object.assign(r,a,o);let c={...s(e).agents},{usage:l}=k(e);for(let e of Object.keys(c))!(e in r)&&!(e in l)&&delete c[e];return D({definitions:r,usage:c,includeDisabled:n},t,e)}const M={"**/":`(?:.*/)?`,"/**":`/.*`,"**":`.*`,"*":`[^/]*`,"?":`[^/]`};function N(e){return e.split(/\r?\n/).flatMap(e=>{let t=e.trimEnd();if(!t||t.startsWith(`#`))return[];let n=t.startsWith(`!`);n&&(t=t.slice(1));let r=t.endsWith(`/`);r&&(t=t.slice(0,-1));let i=t.replace(/^\//,``).replace(/[.+^${}()|[\]\\]/g,`\\$&`).replace(/\*\*\/|\/\*\*$|\*\*|\*|\?/g,e=>M[e]),a=t.includes(`/`);return[{pattern:RegExp(a?`^${i}$`:`^(?:.*/)?${i}$`),negate:n,directory:r}]})}const P=(e,t,n)=>e.reduce((e,r)=>(!r.directory||n)&&r.pattern.test(t)?!r.negate:e,!1);async function F(e,t,n=``){let r=[];for(let i of await p.promises.readdir(d.join(e,n),{withFileTypes:!0})){let a=n?`${n}/${i.name}`:i.name;i.isDirectory()&&!P(t,a,!0)?r.push(...await F(e,t,a)):i.isFile()&&!P(t,a,!1)&&r.push(a)}return r}async function I(e){return(await _(m)(`git`,[`-C`,e,`ls-files`,`--cached`,`--others`,`--exclude-standard`,`-z`,`--`,`.`],{maxBuffer:67108864}).catch(()=>void 0))?.stdout.split(`\0`).filter(Boolean)}async function L(e){let t=await I(e)??await F(e,N(await p.promises.readFile(d.join(e,`.gitignore`),`utf8`).catch(()=>``))),n={};for(let r of t){if(r===`agent.json`||r===`system.md`)continue;let t=d.join(e,r);(await p.promises.lstat(t).catch(()=>void 0))?.isFile()&&(n[r]=await p.promises.readFile(t,`utf8`))}return n}const R=/^[a-z0-9][a-z0-9_-]*$/;function z(e,t){if(!R.test(t))return`Use lowercase letters, digits, - or _, starting with a letter or digit.`;let n=d.join(e,`.coder`,`agents`,t);if(p.existsSync(n)&&p.readdirSync(n).length>0)return`${d.relative(e,n)} is not empty; clear it to start over, or edit what is there.`}function B(e,t,n){return{integration:e,type:t,appId:`${e}:sample`,installationId:`sample`,deliveryId:`sample-1`,actor:{id:`user-1`,login:`someone`,role:`member`},text:`Replace me with the text a real event would carry.`,...n?{chat:{thread:{_type:`chat:Thread`,adapterName:e,channelId:n.slice(0,n.lastIndexOf(`:`)),id:n,isDM:!1}}}:{}}}async function V(e,r={}){let{INTEGRATIONS:i}=await import(`./integrations-BVmsk64f.js`).then(e=>e.r),o=d.resolve(r.cwd??`.`);if(!e&&r.askId&&(e=await r.askId(e=>z(o,e))),!e)throw new n(`invalid-option`,`Missing agent id.`,{hint:`Usage: coder agent init <id>`});let s=z(o,e);if(s)throw new n(`invalid-option`,s.includes(`not empty`)?s:`Agent id "${e}": ${s}`);let c=d.join(o,`.coder`,`agents`,e),l=r.askPicks?await r.askPicks(e):{...r.name?{name:r.name}:{},integrations:r.integrations?.length?r.integrations:[Object.keys(i)[0]],events:{},matches:{},access:r.access??`auto`};if(!a.includes(l.access))throw new n(`invalid-option`,`Unknown access "${l.access}"; valid: ${a.join(`, `)}`);let u={},f=r.events??[],p=e=>Object.keys(i[e]?.events??{});for(let e of l.integrations)if(!i[e])throw new n(`invalid-option`,`Unknown integration "${e}"; valid: ${Object.keys(i).join(`, `)}`);for(let e of f)if(!l.integrations.some(t=>p(t).includes(e)))throw new n(`invalid-option`,`No chosen integration has event "${e}".`,{hint:`Events per integration: coder agent integrations show <id>`});for(let[e,i]of Object.entries(r.matches??{}))if(t(i))throw new n(`invalid-option`,`Bad --match for ${e}: ${t(i)}`);for(let e of l.integrations){let t=p(e),i=l.events[e]??(f.length?f.filter(e=>t.includes(e)):[t.includes(`mention`)?`mention`:t[0]]);for(let r of i)if(!t.includes(r))throw new n(`invalid-option`,`${e} has no event "${r}"; valid: ${t.join(`, `)}`);let a={...r.matches,...l.matches[e]??{}},o=i.filter(e=>a[e]);i.length&&(u[e]={events:o.length?Object.fromEntries(i.map(e=>[e,!a[e]||{match:a[e]}])):i})}let m={...l.name?{name:l.name}:{},...r.description?{description:r.description}:{},access:l.access,integrations:u};await g.mkdir(c,{recursive:!0}),await g.writeFile(d.join(c,`agent.json`),`${JSON.stringify(m,null,2)}\n`),await g.writeFile(d.join(c,`system.md`),``);let _=d.join(h.tmpdir(),`coder-agent-samples`,e),v=[];for(let[e,t]of Object.entries(u)){let n=(Array.isArray(t.events)?t.events:Object.keys(t.events??{}))[0];await g.mkdir(_,{recursive:!0});let r=d.join(_,`sample-${e}-${n}.json`),a=B(e,n,i[e]?.sample);await g.writeFile(r,`${JSON.stringify(a,null,2)}\n`),v.push(r)}return{id:e,dir:c,files:[`agent.json`,`system.md`],samples:v,integrations:Object.keys(u)}}export{T as a,j as c,w as i,y as l,D as n,L as o,O as r,V as s,b as t,A as u};
1
+ import{Ea as e,s as t}from"./args-CJsHYWbt.js";import{t as n}from"./errors-DK_trCff.js";import{W as r,p as i}from"./state-CxAUec80.js";import{t as a}from"./types-DHBqXFE2.js";import{F as o,w as s}from"./config-_32PHl9g.js";import{l as c,p as l,u}from"./definition-D0OpQfGX.js";import d from"node:path";import{fileURLToPath as f}from"node:url";import p from"node:fs";import{execFile as m}from"node:child_process";import h from"node:os";import g from"node:fs/promises";import{promisify as _}from"node:util";var v={name:`Coder`,description:`Answers engineering questions, reviews pull requests, and makes requested changes.`,integrations:{github:{events:{pull_request:!0,mention:!0,issue:!0,comment:{match:`[Cc]oder`}}},slack:{events:{mention:!0,dm:!0,channel:{match:`[Cc]oder`}}},linear:{events:{mention:!0,issue:!0,comment:{match:`[Cc]oder`}}}}},y=e({AgentLoadError:()=>b,agentsFromSources:()=>D,assertNotReserved:()=>O,builtinDefinitions:()=>w,defaultAgent:()=>T,folderFiles:()=>L,init:()=>V,loadAgents:()=>j,repoAgentOverride:()=>A}),b=class extends Error{};const x=f(new URL(`./builtin/coder/`,import.meta.url)),S={coder:{json:v,builtin:!0,dir:x,systemPrompt:p.readFileSync(d.join(x,`system.md`),`utf8`)}};function C(e,t=!1){let n={},r;try{r=p.readdirSync(e,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>e.name)}catch{return n}for(let i of r){let r=d.join(e,i),a=d.join(r,`agent.json`);p.statSync(a,{throwIfNoEntry:!1})?.isFile()&&(n[i]={json:JSON.parse(p.readFileSync(a,`utf8`)),builtin:t,dir:r})}return n}function w(){return S}function T(){return`coder`}function E(e,t){let n=Object.entries(e.integrations).flatMap(([e,n])=>{let r=t[e]?.events;if(!r)return[];let i=Array.isArray(n.events)?n.events.filter(e=>e in r):n.events&&Object.fromEntries(Object.entries(n.events).filter(([e])=>e in r));return[[e,{...n,...i?{events:i}:{}}]]});return{...e,integrations:Object.fromEntries(n)}}function D(e,t,n){let r=u(e.usage),i=Object.keys(r).filter(t=>!(t in e.definitions));if(i.length){let t=Object.keys(e.definitions).sort().join(`, `)||`none`;throw Error(`Invalid agents:\n agents.${i.sort().join(`, agents.`)}: no agent definition; known ids: ${t}`)}let a=[];for(let[n,i]of Object.entries(e.definitions)){let o=r[n],s=o===!1?{disabled:!0}:o,l=typeof s==`object`&&s.disabled;if(l&&!e.includeDisabled)continue;let u;try{u=c(n,i.json,i.repository??!i.builtin)}catch(e){if(l)continue;throw new b(e instanceof Error?e.message:String(e))}let d=i.builtin?E(u,t):u;a.push({id:n,name:d.name??n,definition:d,...typeof s==`object`?{usage:s}:{},...i.dir?{dir:i.dir}:{},builtin:i.builtin})}let o=l(a.filter(e=>!e.usage?.disabled),t);if(o.length)throw new b(`Invalid agents:\n ${o.join(`
2
+ `)}`);return a}function O(e){let t=e.filter(e=>e in w()).sort();if(t.length)throw Error(`Invalid agents:\n agents.${t.join(`, agents.`)}: built-in agent ids are reserved`)}function k(e){let t=o(r(d.resolve(e)));return{file:t,usage:p.existsSync(t)?JSON.parse(p.readFileSync(t,`utf8`)).agents??{}:{}}}function A(e,t,n){let{file:r,usage:i}=k(e),a=i[t],o=typeof a==`boolean`?!a:a?.disabled;return o===void 0||o===n?void 0:r}async function j(e,t,{includeDisabled:n=!1}={}){e=d.resolve(e);let r={...w()},a=C(i(`agents`));for(let e of Object.values(a))e.repository=!1;let o=C(d.join(e,`.coder`,`agents`));O([...Object.keys(a),...Object.keys(o)]),Object.assign(r,a,o);let c={...s(e).agents},{usage:l}=k(e);for(let e of Object.keys(c))!(e in r)&&!(e in l)&&delete c[e];return D({definitions:r,usage:c,includeDisabled:n},t,e)}const M={"**/":`(?:.*/)?`,"/**":`/.*`,"**":`.*`,"*":`[^/]*`,"?":`[^/]`};function N(e){return e.split(/\r?\n/).flatMap(e=>{let t=e.trimEnd();if(!t||t.startsWith(`#`))return[];let n=t.startsWith(`!`);n&&(t=t.slice(1));let r=t.endsWith(`/`);r&&(t=t.slice(0,-1));let i=t.replace(/^\//,``).replace(/[.+^${}()|[\]\\]/g,`\\$&`).replace(/\*\*\/|\/\*\*$|\*\*|\*|\?/g,e=>M[e]),a=t.includes(`/`);return[{pattern:RegExp(a?`^${i}$`:`^(?:.*/)?${i}$`),negate:n,directory:r}]})}const P=(e,t,n)=>e.reduce((e,r)=>(!r.directory||n)&&r.pattern.test(t)?!r.negate:e,!1);async function F(e,t,n=``){let r=[];for(let i of await p.promises.readdir(d.join(e,n),{withFileTypes:!0})){let a=n?`${n}/${i.name}`:i.name;i.isDirectory()&&!P(t,a,!0)?r.push(...await F(e,t,a)):i.isFile()&&!P(t,a,!1)&&r.push(a)}return r}async function I(e){return(await _(m)(`git`,[`-C`,e,`ls-files`,`--cached`,`--others`,`--exclude-standard`,`-z`,`--`,`.`],{maxBuffer:67108864}).catch(()=>void 0))?.stdout.split(`\0`).filter(Boolean)}async function L(e){let t=await I(e)??await F(e,N(await p.promises.readFile(d.join(e,`.gitignore`),`utf8`).catch(()=>``))),n={};for(let r of t){if(r===`agent.json`||r===`system.md`)continue;let t=d.join(e,r);(await p.promises.lstat(t).catch(()=>void 0))?.isFile()&&(n[r]=await p.promises.readFile(t,`utf8`))}return n}const R=/^[a-z0-9][a-z0-9_-]*$/;function z(e,t){if(!R.test(t))return`Use lowercase letters, digits, - or _, starting with a letter or digit.`;let n=d.join(e,`.coder`,`agents`,t);if(p.existsSync(n)&&p.readdirSync(n).length>0)return`${d.relative(e,n)} is not empty; clear it to start over, or edit what is there.`}function B(e,t,n){return{integration:e,type:t,appId:`${e}:sample`,installationId:`sample`,deliveryId:`sample-1`,actor:{id:`user-1`,login:`someone`,role:`member`},text:`Replace me with the text a real event would carry.`,...n?{chat:{thread:{_type:`chat:Thread`,adapterName:e,channelId:n.slice(0,n.lastIndexOf(`:`)),id:n,isDM:!1}}}:{}}}async function V(e,r={}){let{INTEGRATIONS:i}=await import(`./integrations-DSZSa8Rc.js`).then(e=>e.r),o=d.resolve(r.cwd??`.`);if(!e&&r.askId&&(e=await r.askId(e=>z(o,e))),!e)throw new n(`invalid-option`,`Missing agent id.`,{hint:`Usage: coder agent init <id>`});let s=z(o,e);if(s)throw new n(`invalid-option`,s.includes(`not empty`)?s:`Agent id "${e}": ${s}`);let c=d.join(o,`.coder`,`agents`,e),l=r.askPicks?await r.askPicks(e):{...r.name?{name:r.name}:{},integrations:r.integrations?.length?r.integrations:[Object.keys(i)[0]],events:{},matches:{},access:r.access??`auto`};if(!a.includes(l.access))throw new n(`invalid-option`,`Unknown access "${l.access}"; valid: ${a.join(`, `)}`);let u={},f=r.events??[],p=e=>Object.keys(i[e]?.events??{});for(let e of l.integrations)if(!i[e])throw new n(`invalid-option`,`Unknown integration "${e}"; valid: ${Object.keys(i).join(`, `)}`);for(let e of f)if(!l.integrations.some(t=>p(t).includes(e)))throw new n(`invalid-option`,`No chosen integration has event "${e}".`,{hint:`Events per integration: coder agent integrations show <id>`});for(let[e,i]of Object.entries(r.matches??{}))if(t(i))throw new n(`invalid-option`,`Bad --match for ${e}: ${t(i)}`);for(let e of l.integrations){let t=p(e),i=l.events[e]??(f.length?f.filter(e=>t.includes(e)):[t.includes(`mention`)?`mention`:t[0]]);for(let r of i)if(!t.includes(r))throw new n(`invalid-option`,`${e} has no event "${r}"; valid: ${t.join(`, `)}`);let a={...r.matches,...l.matches[e]??{}},o=i.filter(e=>a[e]);i.length&&(u[e]={events:o.length?Object.fromEntries(i.map(e=>[e,!a[e]||{match:a[e]}])):i})}let m={...l.name?{name:l.name}:{},...r.description?{description:r.description}:{},access:l.access,integrations:u};await g.mkdir(c,{recursive:!0}),await g.writeFile(d.join(c,`agent.json`),`${JSON.stringify(m,null,2)}\n`),await g.writeFile(d.join(c,`system.md`),``);let _=d.join(h.tmpdir(),`coder-agent-samples`,e),v=[];for(let[e,t]of Object.entries(u)){let n=(Array.isArray(t.events)?t.events:Object.keys(t.events??{}))[0];await g.mkdir(_,{recursive:!0});let r=d.join(_,`sample-${e}-${n}.json`),a=B(e,n,i[e]?.sample);await g.writeFile(r,`${JSON.stringify(a,null,2)}\n`),v.push(r)}return{id:e,dir:c,files:[`agent.json`,`system.md`],samples:v,integrations:Object.keys(u)}}export{T as a,j as c,w as i,y as l,D as n,L as o,O as r,V as s,b as t,A as u};