@wular/coder 0.4.10 → 0.4.12

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 (358) hide show
  1. package/README.md +3 -1
  2. package/dist/actions-BT7_eKXm.js +10 -0
  3. package/dist/{adapter-BeezVK-B.js → adapter-BT8ECcRG.js} +1 -1
  4. package/dist/{adapter-ChaISKgI.js → adapter-CU9H4g6c.js} +1 -1
  5. package/dist/{adapter-MD6ahqPR.js → adapter-CVd5klMH.js} +1 -1
  6. package/dist/{agent-B8ItyuHN.js → agent-BA6xr8QY.js} +2 -2
  7. package/dist/apps-D-v5sQJk.js +367 -0
  8. package/dist/args-CbO_Ck9Z.js +11 -0
  9. package/dist/async-XNO3nqum.js +3 -0
  10. package/dist/auth-DuXnSNf9.js +1 -0
  11. package/dist/base64url-CsVsW4Id.js +1 -0
  12. package/dist/chat-CgQdDRhs.js +13 -0
  13. package/dist/cli.js +19 -1
  14. package/dist/{client-DzwzCsue.js → client-C4QCT6cG.js} +2 -2
  15. package/dist/cmd-DX5ByXo3.js +119 -0
  16. package/dist/connection-DNxi2btM.js +1 -0
  17. package/dist/context-65bOofts.js +7 -0
  18. package/dist/dash/standalone/node_modules/contextjsx/dist/index.mjs +1 -0
  19. package/dist/dash/standalone/node_modules/contextjsx/dist/jsx-runtime.mjs +1 -0
  20. package/dist/dash/standalone/node_modules/contextjsx/dist/src-BJ0QFeB8.mjs +2 -0
  21. package/dist/dash/standalone/node_modules/contextjsx/package.json +70 -0
  22. package/dist/dash/standalone/server/build-index.json +1 -1
  23. package/dist/dash/standalone/server/manifest.json +1187 -1187
  24. package/dist/dash/standalone/server/modules-server-server-react-server/src/agent/context/turn.dac8eb211c500271.js +141 -0
  25. package/dist/dash/standalone/server/modules-server-server-react-server/src/client/{index.843431e3538fd9a4.js → index.0de14cb4e30bd70d.js} +1 -5
  26. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/api/{load.7ae462ef36271be8.js → load.be791a5eaf328738.js} +1 -1
  27. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/connect/{page.806027fde54ab723.js → page.0fbfdba5254f7ae5.js} +1 -1
  28. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/create/[id]/{page.bd04d2d3eba00676.js → page.70913bd4075da914.js} +2 -2
  29. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{notify.857748e260c691e3.js → notify.61aab176baeefebd.js} +1 -1
  30. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{page.25153459858542f9.js → page.815371ed0d5dd4fa.js} +3 -3
  31. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/account/{sign-out.ff98573f362d76f3.js → sign-out.1d6af804f9ec043d.js} +1 -1
  32. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{agents-grid.8efd14bc39281da9.js → agents-grid.f43bcc1148ce3650.js} +1 -1
  33. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{connect-apps.d1e67db29b12dc0a.js → connect-apps.f3af8cc8540719d7.js} +2 -2
  34. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/(list)/{page.0f7d5e3e42462870.js → page.c6efd5432c1a4a75.js} +7 -7
  35. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{layout.05210ffa6038791f.js → layout.a795379254982121.js} +7 -7
  36. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{page.19fe116c0f802cb1.js → page.a2cb6d1f1714259a.js} +8 -8
  37. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{page.f87fd8eb66f73af0.js → page.996172c951739b35.js} +12 -16
  38. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/platforms/{platform-actions.b6c3d3184e167d0b.js → platform-actions.8e7ca54dd1821e98.js} +3 -3
  39. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/settings/{agent-settings-form.28220621573033d7.js → agent-settings-form.aa9e157d141481d7.js} +4 -4
  40. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/settings/{page.2f7467868f599ebc.js → page.44d886e60ae04303.js} +6 -6
  41. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/tasks/{loading.ec94096015346f2c.js → loading.521c9e7b8d77f557.js} +1 -1
  42. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/tasks/{page.a92a36a8ce21088c.js → page.828cfb8112404792.js} +1 -1
  43. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/usage/{page.8935a5fe5c08bcf1.js → page.45e18b6dc3019af4.js} +3 -3
  44. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/(tabs)/{versions-list.5b97ab6d40e2e639.js → versions-list.c8d76988c734dda2.js} +1 -1
  45. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/edit/{loading.bedcc1aba372fbce.js → loading.b1367e864b4fb406.js} +1 -1
  46. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/[slug]/edit/{page.14760e9eedd6ff8e.js → page.dd11f2618e08becd.js} +6 -6
  47. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{agent-toggle.a6ee8bd882178e29.js → agent-toggle.1579dc8acbaacf92.js} +2 -2
  48. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/agent/{hero.8be1dd4ea3ed6e17.js → hero.ad5cc342db794e5d.js} +1 -1
  49. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{connect-repositories.59d89152fe845af2.js → connect-repositories.43b4b28f194ea842.js} +1 -1
  50. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{editor.77f68d431408745b.js → editor.776856fe1ed1a642.js} +6 -6
  51. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/editor/{import-picker.a7b01817a821819a.js → import-picker.eafa5b41a2ed571f.js} +3 -3
  52. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/agents/new/{page.c4570fd80bdda68c.js → page.7d84ef2b178b34d2.js} +4 -4
  53. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{layout.19006c2d7dc8d114.js → layout.393cf7429eea189e.js} +3 -3
  54. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/operator/{operator-apps.d350a52d27f69fa6.js → operator-apps.a244f3199e7cf09c.js} +4 -4
  55. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/operator/{page.4a652f5080c2b863.js → page.980adfb7c5714752.js} +4 -4
  56. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/{page.d39f7a1719f50c6d.js → page.24a1987405ed7b17.js} +1 -1
  57. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{connections-list.ff7e1dadcd4df17f.js → connections-list.21ec9dc73ce68656.js} +3 -3
  58. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{credentials-list.87a1f8ab71eb4bed.js → credentials-list.683476f62a9ecde7.js} +3 -3
  59. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{credentials.a535c9c6dd8b4cdf.js → credentials.b43dd3d97c536c2a.js} +8 -8
  60. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{engines-list.29fffd07c1c3b771.js → engines-list.9e116751bd34e2cc.js} +1 -1
  61. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{list.0c87d55cf4ef382c.js → list.083f5c665df04b1b.js} +2 -2
  62. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{models-list.6fea9faddb8300bb.js → models-list.537f63f8e5dd085d.js} +3 -3
  63. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{page.295245052b93af90.js → page.dfed4ae6ffc74434.js} +12 -12
  64. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{runners-list.a4a38e54d834a1ec.js → runners-list.3afa989490bbe77c.js} +4 -4
  65. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/[tab]/{secrets-list.50f487766f87383c.js → secrets-list.0d175ee815b22cd7.js} +3 -3
  66. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{layout.c42e0ab39cb2c0e0.js → layout.3e8289f888fa444c.js} +1 -1
  67. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/settings/{page.6997506eaa1a4824.js → page.06feaa5fbb06f1e6.js} +1 -1
  68. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{create-link.9458b49dc99bbaaa.js → create-link.ff95e4b6977d0474.js} +3 -3
  69. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/setup/{page.77e402bb6e8e7f7e.js → page.f06fda0df59beeb5.js} +4 -4
  70. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{activity.fcda6f18c8207c99.js → activity.3c79cf14feff12bf.js} +1 -1
  71. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{loading.56520888d5270b88.js → loading.47cbb34ea8d2e33f.js} +1 -1
  72. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{page.d0f039221a27b8ef.js → page.abed2a8424ef3da0.js} +4 -4
  73. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{task-actions.f5f2016d2dc7f422.js → task-actions.587da79d68ab8d14.js} +3 -3
  74. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/[id]/{task-view.a292baa2410cdf64.js → task-view.dc294bb94b7437e1.js} +7 -7
  75. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{composer.2d4122eb33addbdd.js → composer.5072aacdce127689.js} +5 -5
  76. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{task.a0c68180db5fb4c1.js → task.0a1b5878dccd3b37.js} +1 -1
  77. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{tasks-list.021bdc2f3d90af2d.js → tasks-list.1162926f7498c732.js} +10 -10
  78. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/list/{tasks-section.13f64b0836ae406b.js → tasks-section.1d687c986db53a73.js} +5 -5
  79. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/tasks/{page.b78f0df100410db0.js → page.d5d8cb5033823c9c.js} +2 -2
  80. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/app/dash/[org]/usage/{page.93c2306069c03c68.js → page.fb21ebe90d49dac1.js} +2 -2
  81. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{stream.95a2468086aceb84.js → stream.e2915852cf82c86b.js} +1 -1
  82. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/comps/frame/{task-toasts.e1a484113e1df660.js → task-toasts.0ed8ccaae81b9d53.js} +2 -2
  83. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/utils/{action.968bcab0f5e3665d.js → action.b9a5c37272250e82.js} +1 -1
  84. package/dist/dash/standalone/server/modules-server-server-react-server/src/server/dash/utils/{client.189224c16057d7a1.js → client.a3928fa2dcd27b75.js} +1 -1
  85. package/dist/dash/standalone/static/assets/chunks/{action-410bdc82c416bc01.js → action-71685b2d5ad9f359.js} +1 -1
  86. package/dist/dash/standalone/static/assets/chunks/{agent-pills-0c0b8d40b9bfc78f.js → agent-pills-15da36c2cb81991b.js} +1 -1
  87. package/dist/dash/standalone/static/assets/chunks/agent-settings-form-6e6a87d6e673daa8.js +1 -0
  88. package/dist/dash/standalone/static/assets/chunks/{agent-toggle-5ede0c449e88cb9d.js → agent-toggle-ca98586e3b4ce9ae.js} +1 -1
  89. package/dist/dash/standalone/static/assets/chunks/{agents-grid-ffb18df48e951ecb.js → agents-grid-29c399e46b4e9e2b.js} +1 -1
  90. package/dist/dash/standalone/static/assets/chunks/{back-602db2cfdccf2e7f.js → back-fa9d6e37f9828093.js} +1 -1
  91. package/dist/dash/standalone/static/assets/chunks/{combo-df2685e277db02c0.js → combo-86f3e11d1f6f6cee.js} +1 -1
  92. package/dist/dash/standalone/static/assets/chunks/{composer-e1cefed81ea89b7e.js → composer-85e0ec7163ae18b7.js} +1 -1
  93. package/dist/dash/standalone/static/assets/chunks/composer-910bb87127972f62.js +1 -0
  94. package/dist/dash/standalone/static/assets/chunks/{confirm-d163e6865d66dfab.js → confirm-c29a1db0130638d2.js} +1 -1
  95. package/dist/dash/standalone/static/assets/chunks/{connect-apps-ce3c9d049ebad459.js → connect-apps-b73490e04ae6398d.js} +1 -1
  96. package/dist/dash/standalone/static/assets/chunks/{connect-repositories-0aa9abc77b9c3d48.js → connect-repositories-0de82daaf654b1d3.js} +1 -1
  97. package/dist/dash/standalone/static/assets/chunks/{connections-list-6eddeb8583ded10f.js → connections-list-c50f58b4b28d10bb.js} +1 -1
  98. package/dist/dash/standalone/static/assets/chunks/{copy-0cc00656953531be.js → copy-445c11202f136275.js} +1 -1
  99. package/dist/dash/standalone/static/assets/chunks/create-link-6d64a2d5f9ce6de0.js +1 -0
  100. package/dist/dash/standalone/static/assets/chunks/{credentials-list-1b6a81e9b4934dc8.js → credentials-list-bee95799b2319b3b.js} +1 -1
  101. package/dist/dash/standalone/static/assets/chunks/{custom-range-cae5567874db83ca.js → custom-range-a0630599f907b30e.js} +1 -1
  102. package/dist/dash/standalone/static/assets/chunks/{editor-d55d247a1d7de5f0.js → editor-b9951819f21b2e43.js} +2 -2
  103. package/dist/dash/standalone/static/assets/chunks/{engines-list-288559344de4d4b9.js → engines-list-2720c3e8fa12b2f7.js} +1 -1
  104. package/dist/dash/standalone/static/assets/chunks/{field-693bb870ad0bdee8.js → field-b82a0f895266791c.js} +1 -1
  105. package/dist/dash/standalone/static/assets/chunks/{instructions-a3d7688e421f2a08.js → instructions-affaaeff366b1725.js} +1 -1
  106. package/dist/dash/standalone/static/assets/chunks/instructions-fd7402ac5aa8b50e.js +1 -0
  107. package/dist/dash/standalone/static/assets/chunks/{list-2a59237cb7cb0a7c.js → list-d918f79562d497eb.js} +1 -1
  108. package/dist/dash/standalone/static/assets/chunks/{models-list-5ed9ee02f9b66d98.js → models-list-12bc7aceaa52f5b0.js} +1 -1
  109. package/dist/dash/standalone/static/assets/chunks/{notice-7d84ffab32ff24ca.js → notice-57db7a1f05b7308c.js} +1 -1
  110. package/dist/dash/standalone/static/assets/chunks/{outcome-dialog-3cffe3507ea92af2.js → outcome-dialog-5cf575a5e6921a5d.js} +1 -1
  111. package/dist/dash/standalone/static/assets/chunks/outcome-dialog-b219595be320108a.js +1 -0
  112. package/dist/dash/standalone/static/assets/chunks/platform-actions-1d27d2ba7eee9ff1.js +1 -0
  113. package/dist/dash/standalone/static/assets/chunks/{platform-actions-4dc31567d00c4cb2.js → platform-actions-dba96dcb0f6513db.js} +1 -1
  114. package/dist/dash/standalone/static/assets/chunks/{runners-list-984246a8f9450da1.js → runners-list-36f8c5ecfcf8e9ae.js} +1 -1
  115. package/dist/dash/standalone/static/assets/chunks/{secrets-list-88f8b30abbab52f0.js → secrets-list-d7dbafd24dd18481.js} +1 -1
  116. package/dist/dash/standalone/static/assets/chunks/{segmented-79c9c69b702e0b90.js → segmented-8f809ebe712e92a7.js} +1 -1
  117. package/dist/dash/standalone/static/assets/chunks/shared-init-cc13a835f3508618.js +2 -0
  118. package/dist/dash/standalone/static/assets/chunks/shared-init-f475017dd5811e33.js +5 -0
  119. package/dist/dash/standalone/static/assets/chunks/side-toggle-0aa237eba3dfe9c1.js +1 -0
  120. package/dist/dash/standalone/static/assets/chunks/{tail-99e29a541a072002.js → tail-b1c46587301ef397.js} +1 -1
  121. package/dist/dash/standalone/static/assets/chunks/task-681061023bdf0a49.js +5 -0
  122. package/dist/dash/standalone/static/assets/chunks/{task-actions-1cdca1e8d3eee490.js → task-actions-c9e46e81604e85c5.js} +1 -1
  123. package/dist/dash/standalone/static/assets/chunks/{task-view-fdcde0e31f63b737.js → task-view-134186a544917ceb.js} +1 -1
  124. package/dist/dash/standalone/static/assets/chunks/{tasks-list-3ad1c93deff4fb2e.js → tasks-list-352a3222d878de0f.js} +1 -1
  125. package/dist/dash/standalone/static/assets/chunks/{versions-list-60ac4d8f715bf5f7.js → versions-list-21cb854e6a7108a7.js} +1 -1
  126. package/dist/dash/standalone/static/assets/pnext-client-05df74b071ddb0b3.js +1 -0
  127. package/dist/dash/standalone/static/assets/pnext-client-2c19cca257f78ae6.js +1 -0
  128. package/dist/dash/standalone/static/assets/pnext-client-2db05dfa62642a65.js +1 -0
  129. package/dist/dash/standalone/static/assets/pnext-client-36b0d6085a073880.js +1 -0
  130. package/dist/dash/standalone/static/assets/{pnext-client-0b3b70f1aefb9947.js → pnext-client-576c06599e241231.js} +1 -1
  131. package/dist/dash/standalone/static/assets/pnext-client-6aa0f19a30d58d63.js +1 -0
  132. package/dist/dash/standalone/static/assets/pnext-client-6b30b71f452f2f07.js +1 -0
  133. package/dist/dash/standalone/static/assets/pnext-client-6ccb4d4fff812db3.js +1 -0
  134. package/dist/dash/standalone/static/assets/pnext-client-74eb465defba421e.js +1 -0
  135. package/dist/dash/standalone/static/assets/pnext-client-8c692d12b2fd90d6.js +1 -0
  136. package/dist/dash/standalone/static/assets/pnext-client-92e17d39063a9ced.js +1 -0
  137. package/dist/dash/standalone/static/assets/pnext-client-93246aea268c2682.js +1 -0
  138. package/dist/dash/standalone/static/assets/pnext-client-9954dcbc0c579e0d.js +1 -0
  139. package/dist/dash/standalone/static/assets/{pnext-client-8f96a4b8a00ff460.js → pnext-client-c0dfa1cdde9a9855.js} +1 -1
  140. package/dist/dash/standalone/static/assets/pnext-client-c28d38d4aafd4af6.js +1 -0
  141. package/dist/dash/standalone/static/assets/{pnext-client-ab36b406301fd2a4.js → pnext-client-c2c30dcb6dc31d60.js} +1 -1
  142. package/dist/dash/standalone/static/assets/pnext-client-dbf741073e11eac0.js +1 -0
  143. package/dist/dash/standalone/static/assets/pnext-client-e29194a27280333f.js +1 -0
  144. package/dist/dash/standalone/static/assets/{pnext-client-0d90849808b6eb05.js → pnext-client-f8a7e692b27caad9.js} +1 -1
  145. package/dist/dash/standalone/static/assets/pnext-client-fc5b8cfcba2a9f63.js +1 -0
  146. package/dist/discover-CPZdprlQ.js +1 -0
  147. package/dist/docs-x-l7gjFE.js +2 -0
  148. package/dist/drive-Y-ZlgiUW.js +1 -0
  149. package/dist/env-B9JG6gwo.js +1 -0
  150. package/dist/errors-XBA-Ls4n.js +10 -0
  151. package/dist/exec-iFssTO5V.js +3 -0
  152. package/dist/executor-Dt2FFT-y.js +11 -0
  153. package/dist/flow/builtin/review/index.d.ts +2 -0
  154. package/dist/flow/builtin/review/index.js +16 -0
  155. package/dist/flow/index.d.ts +1 -1
  156. package/dist/flow/index.js +1 -1
  157. package/dist/http-BZfjbiov.js +1 -0
  158. package/dist/{types-8zO5Tc9c.d.ts → index-BdkdNI1v.d.ts} +710 -137
  159. package/dist/{integrations-DPxWtNnS.js → integrations-DyInAa5g.js} +2 -2
  160. package/dist/lib/broker.js +2 -2
  161. package/dist/load-zhcrwSRF.js +2 -0
  162. package/dist/local-D55UkW93.js +5 -0
  163. package/dist/maintenance-BfxcatXH.js +1 -0
  164. package/dist/{match-BfjPZ7gJ.js → match-Bq4sDuCy.js} +1 -1
  165. package/dist/mcp-Bta09QCU.js +13 -0
  166. package/dist/mcp-CUITALl1.js +1 -0
  167. package/dist/models-C1O2DrXx.js +1 -0
  168. package/dist/output-D95NoAA9.js +16 -0
  169. package/dist/prompt-onpyIyXK.js +8 -0
  170. package/dist/prompts-B8pKhMcu.js +4 -0
  171. package/dist/refresh-D-0K9fo3.js +1 -0
  172. package/dist/{remote-f-uny3XZ.js → remote-CDm0YUU3.js} +1 -1
  173. package/dist/runner-CTFTuaz_.js +1 -0
  174. package/dist/runner.json +1 -1
  175. package/dist/runner.tgz +0 -0
  176. package/dist/{runners-vsoGeyuc.js → runners-CYTicTb7.js} +3 -3
  177. package/dist/schema.d.ts +1 -1
  178. package/dist/schema.js +8 -1
  179. package/dist/sdk.d.ts +12552 -4
  180. package/dist/sdk.js +1 -1
  181. package/dist/serve-Bzs_lEg-.js +1 -0
  182. package/dist/serve-CWtLyyTz.js +12 -0
  183. package/dist/serve-DE6A-rBk.js +4 -0
  184. package/dist/{slack-Kpj-G9FE.js → slack-Bo5l13Rs.js} +4 -4
  185. package/dist/task-BU1JEK9X.js +7 -0
  186. package/dist/task-CPzBITsp.js +1 -0
  187. package/dist/tools-BMaKWTa6.js +1 -0
  188. package/dist/tools-CM4UCsId.js +1 -0
  189. package/dist/turn-DMvPfhb5.js +3 -0
  190. package/dist/{views-LmbLfqpu.js → views-DEdKqLm_.js} +1 -1
  191. package/dist/{wire-DshFMRsS.js → wire-JMNPv8f6.js} +1 -1
  192. package/dist/worker-BuP_Lem1.js +9 -0
  193. package/dist/worker-C1tuzq5n.js +1 -0
  194. package/docs/agents/index.md +19 -21
  195. package/docs/cli/agent.md +137 -0
  196. package/docs/cli/auth.md +48 -0
  197. package/docs/cli/connection.md +89 -0
  198. package/docs/cli/credentials.md +58 -0
  199. package/docs/cli/flow.md +158 -0
  200. package/docs/cli/index.md +139 -0
  201. package/docs/cli/model.md +116 -0
  202. package/docs/cli/runner.md +92 -0
  203. package/docs/cli/server.md +89 -0
  204. package/docs/cli/task.md +271 -0
  205. package/docs/flows.md +0 -6
  206. package/docs/mcp.md +8 -8
  207. package/docs/review.md +4 -0
  208. package/package.json +3 -1
  209. package/plugins/agents/skills/coder/SKILL.md +16 -1
  210. package/plugins/claude/.claude-plugin/plugin.json +1 -1
  211. package/plugins/claude/.mcp.json +5 -0
  212. package/plugins/claude/skills/dispatch/SKILL.md +16 -1
  213. package/plugins/cursor/.cursor-plugin/plugin.json +1 -1
  214. package/plugins/cursor/skills/coder/SKILL.md +16 -1
  215. package/dist/actions-C3Mgpl9J.js +0 -2
  216. package/dist/add-B26QSwPY.js +0 -6
  217. package/dist/add-BbXuvqj1.js +0 -1
  218. package/dist/add-Bk8drM-8.js +0 -1
  219. package/dist/add-CD_L-WW8.js +0 -2
  220. package/dist/agent-DHpMqHVi.js +0 -1
  221. package/dist/alias-CScCzXhS.js +0 -2
  222. package/dist/app-wHQJHu6N.js +0 -1
  223. package/dist/approvals-BIGQBbCM.js +0 -2
  224. package/dist/approve-BnZ3v-3c.js +0 -1
  225. package/dist/approve-DFSy7Z72.js +0 -2
  226. package/dist/apps-6BgpUsFh.js +0 -372
  227. package/dist/archive-CU0nhUeJ.js +0 -4
  228. package/dist/archive-CY2lvp_c.js +0 -3
  229. package/dist/args-BekfmD9t.js +0 -1
  230. package/dist/ask-CLDgHB_Y.js +0 -4
  231. package/dist/auth-C3KrIUf1.js +0 -1
  232. package/dist/auth-CGeSfgNb.js +0 -1
  233. package/dist/chat-AbW-LOHo.js +0 -13
  234. package/dist/chat-bridge-WK-pKNfw.js +0 -2
  235. package/dist/cli-Fp28pM4Y.js +0 -9
  236. package/dist/config-DoVedq6T.js +0 -3
  237. package/dist/connection-5V8doFL7.js +0 -1
  238. package/dist/connection-Cb0TK201.js +0 -1
  239. package/dist/create-CrjRdQip.js +0 -1
  240. package/dist/credentials-DoL9w8D1.js +0 -1
  241. package/dist/dash/standalone/server/modules-server-server-react-server/src/core/event-prompt.87f064ca0141e796.js +0 -30
  242. package/dist/dash/standalone/static/assets/chunks/agent-settings-form-5a2601316e2ab283.js +0 -1
  243. package/dist/dash/standalone/static/assets/chunks/composer-08e49d49c0c3ee94.js +0 -1
  244. package/dist/dash/standalone/static/assets/chunks/create-link-bc365f8dfe88e6b3.js +0 -1
  245. package/dist/dash/standalone/static/assets/chunks/instructions-3f18e035338b0d0b.js +0 -1
  246. package/dist/dash/standalone/static/assets/chunks/outcome-dialog-f6fb8c69efa66508.js +0 -1
  247. package/dist/dash/standalone/static/assets/chunks/platform-actions-ecd7200f7749c258.js +0 -1
  248. package/dist/dash/standalone/static/assets/chunks/shared-init-962398d15ee67c92.js +0 -5
  249. package/dist/dash/standalone/static/assets/chunks/shared-init-ae95a674d381c095.js +0 -2
  250. package/dist/dash/standalone/static/assets/chunks/side-toggle-7ada95cc7601eb49.js +0 -1
  251. package/dist/dash/standalone/static/assets/chunks/task-95daa40d39de664f.js +0 -1
  252. package/dist/dash/standalone/static/assets/pnext-client-12faa1754e3ef3be.js +0 -1
  253. package/dist/dash/standalone/static/assets/pnext-client-23384b239b81a761.js +0 -1
  254. package/dist/dash/standalone/static/assets/pnext-client-23e200dd9b7a79c0.js +0 -1
  255. package/dist/dash/standalone/static/assets/pnext-client-2562299eef46e62c.js +0 -1
  256. package/dist/dash/standalone/static/assets/pnext-client-3a4ada64991e6a40.js +0 -1
  257. package/dist/dash/standalone/static/assets/pnext-client-71e7ecdfcf86be84.js +0 -1
  258. package/dist/dash/standalone/static/assets/pnext-client-726c29bbb81054c0.js +0 -1
  259. package/dist/dash/standalone/static/assets/pnext-client-825e9f5b63950ef4.js +0 -1
  260. package/dist/dash/standalone/static/assets/pnext-client-894cff70289fb7a3.js +0 -1
  261. package/dist/dash/standalone/static/assets/pnext-client-9bc9b14c08020649.js +0 -1
  262. package/dist/dash/standalone/static/assets/pnext-client-b8c585cae8da7778.js +0 -1
  263. package/dist/dash/standalone/static/assets/pnext-client-bab4305b41abb15a.js +0 -1
  264. package/dist/dash/standalone/static/assets/pnext-client-bd80926822b3993d.js +0 -1
  265. package/dist/dash/standalone/static/assets/pnext-client-cd4c7b4318fa1846.js +0 -1
  266. package/dist/dash/standalone/static/assets/pnext-client-db55344d00b7888f.js +0 -1
  267. package/dist/dash/standalone/static/assets/pnext-client-eddcd5df2b28120f.js +0 -1
  268. package/dist/default-tTTSBdXq.js +0 -1
  269. package/dist/delete-DM2sA12f.js +0 -2
  270. package/dist/delete-DR37NTr1.js +0 -4
  271. package/dist/disable-Dz_zLPX5.js +0 -1
  272. package/dist/discover-CqabH4Fx.js +0 -3
  273. package/dist/dispatch-BJZqI7sj.js +0 -8
  274. package/dist/docs-BV9SC67g.js +0 -2
  275. package/dist/docs-b2mAKC8Z.js +0 -2
  276. package/dist/drive-CU2HOCfR.js +0 -1
  277. package/dist/enable-Cfeki-ne.js +0 -1
  278. package/dist/env-DSddo-fz.js +0 -1
  279. package/dist/exec-DcWxZar6.js +0 -3
  280. package/dist/executor-LkokKTTd.js +0 -11
  281. package/dist/flow/builtin/review.d.ts +0 -2
  282. package/dist/flow/builtin/review.js +0 -12
  283. package/dist/flow-BQcdyrVK.js +0 -1
  284. package/dist/history-D_A5odLI.js +0 -8
  285. package/dist/http-CXaW1e7x.js +0 -1
  286. package/dist/init-DU_S43NG.js +0 -1
  287. package/dist/integrations-Dwvxl7i2.js +0 -1
  288. package/dist/list-7yd9K7d8.js +0 -1
  289. package/dist/list-BJ0j5eP9.js +0 -4
  290. package/dist/list-Boaz5b5n.js +0 -2
  291. package/dist/list-CIS-GYO1.js +0 -1
  292. package/dist/list-CR0_Emod2.js +0 -4
  293. package/dist/list-CnHZriYt.js +0 -3
  294. package/dist/list-_EH6c041.js +0 -1
  295. package/dist/list-i2r3Nlyz.js +0 -1
  296. package/dist/load-C-GZnuok.js +0 -2
  297. package/dist/local-Fs-dx_dP.js +0 -5
  298. package/dist/login-CzD2EMD_.js +0 -1
  299. package/dist/login-DISw6--d.js +0 -1
  300. package/dist/logout-DMnc5yri.js +0 -1
  301. package/dist/maintenance-BVDuG9Hg.js +0 -1
  302. package/dist/mcp-B-hy3eM-.js +0 -11
  303. package/dist/mcp-CbN-QcpF.js +0 -1
  304. package/dist/mcp-server-DQqSgD3P.js +0 -1
  305. package/dist/model-Ckyoyji3.js +0 -1
  306. package/dist/models-VaiIYlOW.js +0 -1
  307. package/dist/output-BKeyLbvt.js +0 -5
  308. package/dist/prompt-DQyPCLUo.js +0 -8
  309. package/dist/prompts-CEf7z4i_.js +0 -77
  310. package/dist/push-BNomfHJ3.js +0 -1
  311. package/dist/reconnect-Bd_jna1M.js +0 -1
  312. package/dist/refresh-D-broYEx.js +0 -1
  313. package/dist/remove-CCYHc1FN.js +0 -1
  314. package/dist/remove-DMTz_c25.js +0 -1
  315. package/dist/remove-DdcQ-6by.js +0 -1
  316. package/dist/remove-VtavIuGm.js +0 -1
  317. package/dist/rename-CKMyelWN.js +0 -1
  318. package/dist/result-CH3_tVXO.js +0 -5
  319. package/dist/result-DvOqIwhh.js +0 -18
  320. package/dist/resume-6j3RUpqa.js +0 -3
  321. package/dist/review-B4ETH5ki.js +0 -7
  322. package/dist/review-DDYD3Yvq.d.ts +0 -566
  323. package/dist/rotate-key-Byk_wI73.js +0 -1
  324. package/dist/run-DKJW7qwy.js +0 -2
  325. package/dist/run-DkYzyUnp.js +0 -5
  326. package/dist/run-LCE1XiyU.js +0 -2
  327. package/dist/runner-CxtzTgVq.js +0 -1
  328. package/dist/runner-Dnu1Vx_i.js +0 -1
  329. package/dist/schema-Brm7WIKd.js +0 -8
  330. package/dist/sdk-CKTCrtGe.d.ts +0 -12655
  331. package/dist/serve-C1zag2nr.js +0 -1
  332. package/dist/serve-C6tsUF0D.js +0 -2
  333. package/dist/serve-CCxSxXgv.js +0 -1
  334. package/dist/serve-D8J-sEqm.js +0 -12
  335. package/dist/server-B4SRYM2L.js +0 -1
  336. package/dist/setup-host-EaP4GPKB.js +0 -6
  337. package/dist/show-CjUG_aIp.js +0 -1
  338. package/dist/show-xdsqD6de.js +0 -1
  339. package/dist/status-BxV_ITeF.js +0 -1
  340. package/dist/steer-DZ3nkHfC.js +0 -4
  341. package/dist/stop-DGTUYxd6.js +0 -3
  342. package/dist/stop-qDw_DjOB.js +0 -1
  343. package/dist/task-C506SkPR.js +0 -1
  344. package/dist/task-CQmx_2SI.js +0 -7
  345. package/dist/task-Ls_-kcSx.js +0 -1
  346. package/dist/test-DF_qVK6S.js +0 -1
  347. package/dist/tools-S3eRQOVm.js +0 -1
  348. package/dist/unalias-CklkAN1B.js +0 -1
  349. package/dist/update-CZaFjwOJ.js +0 -2
  350. package/dist/upgrade-CUhFmPhl.js +0 -2
  351. package/dist/usage-DTAlb2rC.js +0 -1
  352. package/dist/watch-CJruitc6.js +0 -5
  353. package/dist/watch-p0j69fVA.js +0 -9
  354. package/dist/worker-BHXjDzRp.js +0 -1
  355. package/dist/worker-nyRZuq4g.js +0 -2
  356. package/dist/workflow-CJJUiSfv.js +0 -1
  357. package/docs/agents/prompt.md +0 -220
  358. package/docs/cli.md +0 -155
package/dist/sdk.js CHANGED
@@ -1 +1 @@
1
- import{R as e}from"./prompts-CEf7z4i_.js";import{D as t,T as n,U as r}from"./dispatch-BJZqI7sj.js";import{n as i,o as a,t as o}from"./remote-f-uny3XZ.js";import{n as s}from"./executor-LkokKTTd.js";import{n as c}from"./agent-B8ItyuHN.js";import{t as l}from"./connection-Cb0TK201.js";import{t as u}from"./docs-BV9SC67g.js";import{t as d}from"./models-VaiIYlOW.js";import{n as f}from"./task-C506SkPR.js";import p from"./flow/index.js";import{n as m}from"./runner-CxtzTgVq.js";import{n as h}from"./apps-6BgpUsFh.js";import{v as g}from"./runners-vsoGeyuc.js";import{n as _}from"./maintenance-BVDuG9Hg.js";import{r as v,t as y}from"./serve-D8J-sEqm.js";const b=f,x=l,S=t,C=u,w=a,T={serve:y,rotateKey:_,workflow:g,app:{create:h},handler:v},E={list:(e={})=>o(e).folders.list(),check:(e,t={})=>o(t).folders.check(e)},D=c;var O={task:b,flow:p,model:d,config:e,connection:x,setupHost:n,upgrade:S,docs:C,review:s,auth:w,agent:D,credentials:i,folders:E,runner:m,server:T};export{r as CoderError,D as agent,w as auth,e as config,x as connection,i as credentials,O as default,C as docs,p as flow,E as folders,d as model,s as review,m as runner,T as server,n as setupHost,b as task,S as upgrade};
1
+ import{Q as e,Z as t,Zt as n,_t as r}from"./output-D95NoAA9.js";import{n as i,o as a,t as o}from"./remote-CDm0YUU3.js";import{a as s}from"./executor-Dt2FFT-y.js";import{n as c}from"./agent-BA6xr8QY.js";import{t as l}from"./connection-DNxi2btM.js";import{n as u}from"./docs-x-l7gjFE.js";import{t as d}from"./models-C1O2DrXx.js";import{n as f}from"./task-CPzBITsp.js";import p from"./flow/index.js";import{n as m}from"./runner-CTFTuaz_.js";import{n as h}from"./apps-D-v5sQJk.js";import{v as g}from"./runners-CYTicTb7.js";import{n as _}from"./maintenance-BfxcatXH.js";import{r as v,t as y}from"./serve-CWtLyyTz.js";const b=f,x=l,S=e,C=u,w=a,T={serve:y,rotateKey:_,workflow:g,app:{create:h},handler:v},E={list:(e={})=>o(e).folders.list(),check:(e,t={})=>o(t).folders.check(e)},D=c;var O={task:b,flow:p,model:d,config:r,connection:x,setupHost:t,upgrade:S,docs:C,review:s,auth:w,agent:D,credentials:i,folders:E,runner:m,server:T};export{n as CoderError,D as agent,w as auth,r as config,x as connection,i as credentials,O as default,C as docs,p as flow,E as folders,d as model,s as review,m as runner,T as server,t as setupHost,b as task,S as upgrade};
@@ -0,0 +1 @@
1
+ import{qi as e}from"./core-DwsAMCnL.js";import{_ as t}from"./errors-XBA-Ls4n.js";import{Zt as n}from"./output-D95NoAA9.js";import{a as r,t as i}from"./remote-CDm0YUU3.js";import{p as a}from"./slack-Bo5l13Rs.js";import{h as o,o as s,s as c,t as l}from"./http-BZfjbiov.js";import u from"node:path";import d from"node:fs";import{createHmac as f,randomBytes as p}from"node:crypto";import m from"node:os";import h from"node:http";var g=e({runnerController:()=>w,serveRunner:()=>x});const _=()=>t(`runners.json`);function v(){try{return JSON.parse(d.readFileSync(_(),`utf8`))}catch{return{}}}function y(e){d.mkdirSync(u.dirname(_()),{recursive:!0}),d.writeFileSync(_(),JSON.stringify(e,null,2),{mode:384})}const b=e=>[`cloudflared tunnel --url http://localhost:${e}`,`ngrok http ${e}`,`tailscale funnel ${e}`,`VS Code: forward port ${e} in the Ports view and set its visibility to Public`];async function x(e={}){let a=e.port??4100,u=e.token?e.runnerUrl??process.env.CODER_RUNNER_URL:e.url;if(!u)throw new n(`invalid-option`,e.token?`Expose this runner and set CODER_RUNNER_URL or --runner-url to its public HTTPS address.`:`Expose this runner with a tunnel, then pass its public URL with --url.`,{hint:b(a)});let d=e.token?r({...e,server:e.url??e.server,yes:!0}):r(e),f=v(),g=f[d]??{secret:p(32).toString(`base64url`)},_=new o(t(`runner`)),x=w({secret:g.secret,server:d,runner:_}),S=h.createServer(c(async e=>{let t=await s(e,l(new URL(e.url).pathname));return t instanceof Response?t:x(t)}));await new Promise((e,t)=>{S.once(`error`,t),S.listen(a,`127.0.0.1`,e)});let C=()=>new Promise(e=>S.close(()=>e())),T=e.name??m.hostname(),E=async(e,t)=>{let r=await fetch(`${d}/runners/register`,{method:`POST`,redirect:`manual`,signal:AbortSignal.timeout(5e3),headers:{"content-type":`application/json`},body:JSON.stringify({...e?{token:e}:{id:g.id,organizationId:g.organizationId},name:T,url:u,secret:g.secret,...t?{offline:t}:{}})});if(!r.ok)throw new n(`server`,`Runner registration failed`,{status:r.status});return r.json()},D;try{if(e.token){let t=await E(e.token);D=t,g.organizationId=t.organizationId}else{let t=g.id&&g.organizationId?await E().catch(e=>{if(!(e instanceof n&&e.status===401))throw e}):void 0;if(t)D=t;else{let t=i(e),n=await t.me();D=await t.runners.add({kind:`http`,name:T,scope:e.workspace||!n.user?`workspace`:`personal`,config:{url:u,secret:g.secret}}),g.organizationId=n.organization?.id,g.id=D.id,D=await E()}}g.id=D.id,y({...f,[d]:g})}catch(e){throw await C(),e}let O=Promise.resolve(),k=setInterval(()=>{O=O.then(()=>E().then(()=>{})).catch(()=>{})},6e4);return{...D,port:a,server:d,close:async()=>{clearInterval(k),await O,await E(void 0,!0).catch(()=>{}),await C()}}}const S=3e5,C=(e,t=200)=>new Response(JSON.stringify(e),{status:t,headers:{"content-type":`application/json`}});function w(e){let t=e.now??Date.now,n=new Map,r=(r,i)=>{let o=r.headers.get(`x-coder-timestamp`)??``,s=r.headers.get(`x-coder-nonce`)??``,c=r.headers.get(`x-coder-signature`)??``,l=Number(o);if(!s||!Number.isFinite(l)||Math.abs(t()-l)>S)return!1;let u=f(`sha256`,e.secret).update(`${i}.${o}.${s}`).digest(`base64url`);if(!a(c,u))return!1;for(let[e,r]of n)r<t()&&n.delete(e);return!n.has(s)&&(n.set(s,l+S),!0)};return async t=>{let n=t.method===`GET`?``:await t.text();if(!r(t,n))return C({error:`Unauthorized`},401);let[,i,a]=new URL(t.url).pathname.split(`/`).map(decodeURIComponent);try{if(t.method===`POST`&&i===`start`&&!a){let t=JSON.parse(n);if(typeof t.task!=`string`||!t.env)return C({error:`Invalid start`},400);let r=t.env.CODER_TASK_TOKEN;if(typeof r!=`string`)return C({error:`Invalid start`},400);let i={CODER_SERVER:e.server,CODER_TASK_TOKEN:r,CODER_INBOX_MODE:e.runner.push?`push`:`poll`,...t.env.CODER_LOGIN===`claude`||t.env.CODER_LOGIN===`codex`?{CODER_LOGIN:t.env.CODER_LOGIN}:{}};return C({handle:await e.runner.start({id:t.task},i)})}if(t.method===`GET`&&i===`health`&&!a)return C({ok:!0});if(!a)return C({error:`Not found`},404);if(t.method===`POST`&&i===`messages`&&e.runner.push){let{entries:t}=JSON.parse(n);return!Array.isArray(t)||!t.length?C({error:`Invalid messages`},400):C(await e.runner.push(a,t))}return t.method===`GET`&&i===`status`?C(await e.runner.status(a)):t.method===`POST`&&i===`stop`?(await e.runner.stop(a),new Response(null,{status:204})):C({error:`Not found`},404)}catch(e){return C({error:e instanceof Error?e.message:String(e)},400)}}}export{g as n,x as t};
@@ -0,0 +1,12 @@
1
+ import{qi as e}from"./core-DwsAMCnL.js";import{O as t,U as n,_ as r,g as i,xn as a}from"./errors-XBA-Ls4n.js";import{Et as o,Ft as s,Ht as c,Ot as l,St as u,Zt as d,bt as f,ft as p,lt as m,pt as h,ut as g,xt as _}from"./output-D95NoAA9.js";import{a as v,c as y,h as b,i as x,n as S,r as ee}from"./load-zhcrwSRF.js";import{d as C,m as w}from"./slack-Bo5l13Rs.js";import{n as te}from"./integrations-DyInAa5g.js";import{i as ne,t as re}from"./discover-CPZdprlQ.js";import{u as ie}from"./actions-BT7_eKXm.js";import{r as ae}from"./models-C1O2DrXx.js";import{n as oe}from"./base64url-CsVsW4Id.js";import{a as T,d as E,f as D,l as se,n as ce,o as le,p as ue,r as de,s as fe,t as pe,u as me}from"./http-BZfjbiov.js";import{$ as he,$n as ge,$t as _e,A as ve,An as ye,At as be,Bn as xe,Bt as Se,C as Ce,Cn as we,Cr as Te,Ct as Ee,D as De,Dn as Oe,E as ke,En as Ae,Et as je,F as Me,Fn as Ne,G as O,Gn as Pe,Gt as Fe,H as Ie,Hn as Le,Ht as k,I as Re,In as ze,It as Be,J as Ve,Jn as He,Jt as Ue,K as We,Kn as Ge,Kt as Ke,L as qe,Ln as Je,Lt as Ye,M as Xe,Mn as Ze,Mt as Qe,N as $e,Nn as et,Nt as A,O as j,On as tt,Ot as nt,P as rt,Pn as it,Pt as M,Q as at,Qn as ot,Qt as st,R as ct,Rn as lt,Rt as ut,S as N,Sn as dt,Sr as ft,St as pt,T as mt,Tn as ht,Tt as gt,U as _t,Un as vt,Ut as yt,V as bt,Vn as xt,Vt as St,W as Ct,Wn as wt,Wt as P,X as Tt,Xn as Et,Xt as Dt,Y as Ot,Yn as kt,Yt as At,Z as jt,Zn as Mt,Zt as Nt,_ as Pt,_n as Ft,_t as It,a as Lt,an as Rt,ar as zt,at as Bt,b as Vt,br as F,c as I,cn as Ht,cr as Ut,ct as Wt,d as Gt,dn as Kt,dr as qt,en as Jt,er as Yt,et as Xt,f as Zt,fn as Qt,fr as $t,ft as en,g as tn,gn as nn,gt as L,h as R,hn as rn,hr as an,ht as on,i as sn,in as cn,ir as ln,it as un,j as z,jn as dn,jt as fn,k as pn,kn as mn,kt as hn,l as gn,ln as _n,lr as vn,lt as yn,m as bn,mn as xn,mr as Sn,mt as Cn,nn as wn,nr as Tn,nt as En,o as Dn,on as On,or as kn,ot as An,p as jn,pn as Mn,pr as Nn,pt as Pn,q as Fn,qn as In,qt as Ln,r as Rn,rn as zn,rr as Bn,rt as Vn,s as Hn,sn as Un,sr as Wn,st as Gn,tn as Kn,tr as qn,tt as Jn,u as Yn,un as Xn,ur as Zn,ut as Qn,v as $n,vn as er,vr as tr,vt as nr,w as rr,x as ir,xr as B,xt as ar,y as or,yr as V,yt as sr,z as cr,zn as lr,zt as ur}from"./apps-D-v5sQJk.js";import{n as dr,r as fr}from"./env-B9JG6gwo.js";import{C as H,S as pr,a as mr,g as hr,i as gr,m as _r,n as vr,o as yr,x as U}from"./runners-CYTicTb7.js";import{S as br,_ as xr,a as Sr,b as Cr,f as wr,g as W,h as G,i as Tr,m as Er,n as Dr,p as Or,x as kr}from"./local-D55UkW93.js";import{r as Ar}from"./client-C4QCT6cG.js";import{M as jr}from"./schema.js";import K from"node:path";import q from"node:process";import Mr from"node:fs";import{spawnSync as Nr}from"node:child_process";import{createHash as Pr,randomBytes as Fr,randomUUID as Ir}from"node:crypto";import J from"node:fs/promises";import{isDeepStrictEqual as Lr,promisify as Rr}from"node:util";import zr from"node:http";import{gunzip as Br,gzip as Vr}from"node:zlib";async function Hr(e){try{return await J.readdir(e,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}}async function Y(e){try{return await J.lstat(e),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}}async function Ur(e,t){if(e===t||!await Y(e))return 0;let n=await Hr(e),r=n.filter(e=>e.isDirectory()).length;if(!await Y(t))return await a(e,t),r;for(let r of n)await a(K.join(e,r.name),K.join(t,r.name));return await J.rmdir(e),r}async function Wr(e){let t=K.dirname(e),n=K.basename(e);for(let e of await Hr(t)){let r=e.name.startsWith(n)?e.name.slice(n.length):``;if(!e.isFile()||!(r===`.tmp`||/^\.\d+(?:\.[a-f0-9-]{36})?\.tmp$/.test(r)))continue;let i=Number(e.name.slice(n.length+1).split(`.`)[0]);if(Number.isInteger(i)&&i>0)try{process.kill(i,0);continue}catch(e){if(e.code!==`ESRCH`)continue}await J.unlink(K.join(t,e.name)).catch(e=>{if(e.code!==`ENOENT`)throw e})}}async function Gr(e,t){if(await Wr(e),e===t||!await Y(e))return 0;if(!await Y(t))return await a(e,t),1;let n=JSON.parse(await J.readFile(e,`utf8`)),r=JSON.parse(await J.readFile(t,`utf8`)),i={...n,...r,...n.rows||r.rows?{rows:{...n.rows,...r.rows}}:{}},o=`${t}.${process.pid}.${Ir()}.tmp`;try{await J.writeFile(o,`${JSON.stringify(i)}\n`,{mode:384,flag:`wx`}),await J.rename(o,t),await J.unlink(e)}finally{await J.rm(o,{force:!0})}return 1}async function Kr(){let e=i(),t=r(`state`),n=i(`archive`),a=i(`flows-archived`),o=i(`usage.json`),s=i(`runner`,`usage.json`),c={from:r(`checkouts`),to:i(`checkouts`)},l={from:r(`update-check.json`),to:i(`update-check.json`)},u={cache:e,tasks:0,flows:0,files:0},d=(await Hr(t)).filter(e=>e.isDirectory()).map(e=>({archive:r(`state`,e.name,`archive`),flows:r(`state`,e.name,`flows-archived`),usage:r(`state`,e.name,`usage.json`),runnerUsage:r(`state`,e.name,`runner`,`usage.json`)}));await Wr(o),await Wr(s);for(let e of d)u.tasks+=await Ur(e.archive,n),u.flows+=await Ur(e.flows,a),u.files+=await Gr(e.usage,o),u.files+=await Gr(e.runnerUsage,s);return await Ur(c.from,c.to),u.files+=await Gr(l.from,l.to),u}async function qr(e){let t=(e.now??Date.now)(),n=await e.store.list(`runner`);return{online:1+n.filter(({value:e})=>e.lastSeen!==void 0&&t-e.lastSeen<3e5).length,total:1+n.length}}async function Jr(e){let t=(e.now??Date.now)(),n=e.healthyAt!==void 0&&t-e.healthyAt<5e3,r=n||await Yr(e);return e.healthyAt=r?n?e.healthyAt:t:void 0,T({ok:r},r?200:503,{"cache-control":`no-store`})}async function Yr(e){return e.config.store===`postgres`?e.databaseHealth?e.databaseHealth().then(()=>!0,()=>!1):!1:!0}async function Xr(e){let t=(e.now??Date.now)();if(!e.local)return{...await e.queue.metrics(e.organizationId,t-864e5),runnersOnline:(await qr(e)).online,requests:e.limits?.requests??0,rateLimitRejections:e.limits?.rejections??0};let n=await e.queue.list(e.organizationId),r=e.local?[...M(e.local.cwd,!1),...M(e.local.cwd,!0)]:[],i=new Map([...r,...n.map(e=>e.status===`queued`?e:r.find(t=>t.task.id===e.task.id)??e)].map(e=>[e.task.id,e])),a={queued:0,running:0,waiting:0,completed:0,failed:0,cancelled:0},o=0;for(let e of i.values())e.createdAt>=t-864e5&&a[e.status]++,e.status===`queued`&&o++;return{tasks:a,queueDepth:o,runnersOnline:(await qr(e)).online,requests:e.limits?.requests??0,rateLimitRejections:e.limits?.rejections??0}}const Zr=Rr(Br),Qr=Rr(Vr);async function $r(e,t,n){return T(await t.store.listHistory(n.id))}async function ei(e,t,n){let r=await t.store.get(`history`,`${n.id}:${n.conversation}`);if(!r)return T({error:`No saved history`},404);try{return T({engine:r.engine,conversation:r.conversation,data:U(t.config,r.data),...r.state?{state:U(t.config,r.state)}:{}})}catch(e){return console.error(`coder server: history ${n.id}/${n.conversation} could not be decrypted`,e),T({error:`The saved history cannot be read`},422)}}async function ti(e,t,n){let r=await e.json().catch(()=>void 0);if(r?.engine!==`claude`&&r?.engine!==`codex`||typeof r.conversation!=`string`||!ie.test(r.conversation)||typeof r.data!=`string`||r.state!==void 0&&(!r.state||typeof r.state!=`object`||Array.isArray(r.state)))return T({error:`Invalid history`},400);let i;try{i=(await Zr(Buffer.from(r.data,`base64`),{maxOutputLength:67108864})).toString(`utf8`)}catch{return T({error:`Invalid history`},400)}let a=await Ft(t,t.callbackTask,!0);return await t.store.put(`history`,`${n.id}:${r.conversation}`,{engine:r.engine,conversation:r.conversation,data:H(t.config,(await Qr(a(i))).toString(`base64`)),...r.state?{state:H(t.config,JSON.parse(a(JSON.stringify(r.state))))}:{},savedAt:(t.now??Date.now)()}),T({ok:!0})}async function ni(e,t,n,r){let i=t.session.user.id;n.id;let a=(await e.json().catch(()=>({}))).engine??``;if(!si.has(a)||!t.config.subscriptions?.[a])return T({error:`Sign in with ${a||`that engine`} is off on this server.`},403);let o=t.runners[t.config.runner];if(!o||o.kind===`github-actions`)return T({error:`Sign-in cannot run on the ${t.config.runner} runner.`},409);let s=(await t.store.list(`login`)).find(({value:e})=>e.owner===i&&e.engine===a&&e.state!==`done`&&e.state!==`failed`&&e.expiresAt>X(t));if(s)return T(li(s.id,s.value));let c=`login-${Fr(12).toString(`base64url`)}`,l=er(c,t.organizationId,0),u={owner:i,engine:a,state:`starting`,tokenHash:l.hash,runner:o.kind,createdAt:X(t),expiresAt:X(t)+oi};await ci(t,c,u);let d;try{let e=await o.start({id:c},{CODER_SERVER:t.config.publicUrl??``,CODER_TASK_TOKEN:l.token,CODER_LOGIN:a},void 0,{timeoutMs:oi,hosts:[_r[a].api,..._r[a].account]}),n=await t.store.patchLogin(c,{handle:e},{tokenHash:u.tokenHash});if(!n)return await o.stop(e).catch(()=>{}),T({error:`This sign-in is gone. Start again.`},409);d=n}catch(e){return await t.store.delete(`login`,c),T({error:e instanceof Error?e.message:String(e)},502)}return T(li(c,d),201)}async function ri(e,t,n,r){t.session.user.id;let i=n.id??``;if(!r.searchParams.has(`state`)){let e=i&&!i.includes(`/`)?await Z(t,i):void 0;return e?T(li(i,e)):T({error:`This sign-in is gone. Start again.`},404)}let a=await t.store.watch(`login`,i);try{let n=i&&!i.includes(`/`)?await Z(t,i):void 0;if(!n)return T({error:`This sign-in is gone. Start again.`},404);let o=r.searchParams.get(`state`),s=Date.now()+25e3;for(;o&&n.state===o&&Date.now()<s&&!e.signal.aborted;)if(await a.wait(Math.min(1e4,s-Date.now()),e.signal),n=await Z(t,i),!n)return T({error:`This sign-in is gone. Start again.`},404);return T(li(i,n))}finally{a.close()}}async function ii(e,t,n,r){t.session.user.id;let i=n.id??``,a=i&&!i.includes(`/`)?await Z(t,i):void 0;if(!a)return T({error:`This sign-in is gone. Start again.`},404);let o=await e.json().catch(()=>({})),s=typeof o.code==`string`?o.code.trim():``;return a.engine!==`claude`||a.state!==`open`||!s||!await t.store.patchLogin(i,{state:`verifying`,input:H(t.config,s)},{state:`open`,tokenHash:a.tokenHash})?T({error:`This sign-in is not waiting for a code.`},409):T({ok:!0})}async function ai(e,t,n,r){t.session.user.id;let i=n.id??``,a=i&&!i.includes(`/`)?await Z(t,i):void 0;return a?(await t.store.delete(`login`,i),a.handle&&await t.runners[a.runner]?.stop(a.handle).catch(()=>{}),T({ok:!0})):T({error:`This sign-in is gone. Start again.`},404)}const oi=6e5,si=new Set([`claude`,`codex`]),X=e=>(e.now??Date.now)();function ci(e,t,n){return e.store.put(`login`,t,n,{ttlMs:Math.max(1,n.expiresAt-X(e))})}function li(e,t){return{id:e,engine:t.engine,state:t.state,expiresAt:t.expiresAt,...t.url?{url:t.url}:{},...t.code?{code:t.code}:{},...t.error?{error:t.error}:{}}}async function Z(e,t){let n=await e.store.get(`login`,t);return n&&n.owner===e.session?.user.id?n:void 0}function ui(e,t){let n=t.handle&&e.runners[t.runner]?.stop(t.handle);if(!n)return;let r=n.catch(e=>console.error(`coder server: could not stop the machine of a finished ${t.engine} sign-in`,e));e.waitUntil?.(r)}async function di(e,t,n,r){let i=n.id,a=await t.store.watch(`login`,i),o=Date.now()+25e3;try{for(;;){if(e.signal.aborted)return T({});let n=await t.store.get(`login`,i);if(!n||n.tokenHash!==t.callbackLogin.tokenHash)return new Response(`Unauthorized`,{status:401});if(n.input){let e=await t.store.patchLogin(i,{input:null},{input:n.input,tokenHash:n.tokenHash});return T(e?{code:U(t.config,n.input)}:{})}if(n.state===`verifying`||n.state===`done`||n.state===`failed`||Date.now()>=o)return T({});await a.wait(Math.min(1e4,o-Date.now()),e.signal)}}finally{a.close()}}async function fi(e,t,n,r){return T({engine:t.callbackLogin.engine})}async function pi(e,t,n,r){let i=n.id,a=t.callbackLogin,o=await e.json().catch(()=>({}));if(a.state===`done`||a.state===`failed`)return T({ok:!0});let s={state:[`starting`,`open`,`verifying`],tokenHash:a.tokenHash};if(typeof o.error==`string`)return await t.store.patchLogin(i,{state:`failed`,error:o.error.slice(0,500)},s)&&ui(t,a),T({ok:!0});let c=o.result?.env;if(c){let e=a.engine===`claude`?`CLAUDE_CODE_OAUTH_TOKEN`:`CODEX_AUTH_JSON`;if(Object.keys(c).join()!==e||typeof c[e]!=`string`)return T({error:`Invalid sign-in result`},400);let n=o.result?.account;return await t.store.completeLogin(i,a.tokenHash,{...pr(t.config,{env:c}),createdAt:(t.now??Date.now)(),...n?.email||n?.plan?{account:{...typeof n.email==`string`?{email:n.email}:{},...typeof n.plan==`string`?{plan:n.plan}:{}}}:{}})?(ui(t,a),T({ok:!0})):T({error:`This sign-in changed. Try again.`},409)}let l={...typeof o.url==`string`&&/^https:\/\//.test(o.url)?{url:o.url}:{},...typeof o.code==`string`?{code:o.code.slice(0,64)}:{}};return await t.store.patchLogin(i,l.url?{...l,state:`open`}:l,s)?T({ok:!0}):T({error:`This sign-in changed. Try again.`},409)}const mi=e=>`audit:${String(9999999999999-e).padStart(13,`0`)}:${Fr(4).toString(`hex`)}`,hi=e=>e.config.name??`Wular`,gi=e=>Wn(e,e.serverOrganizationId??e.organizationId);async function _i(e,t,n){let r=(e.now??Date.now)(),i=e.session?.user,a={at:r,actor:i?{id:i.id,name:i.name,email:i.email}:{id:`admin-token`},action:t,target:n};await gi(e).store.put(`snapshot`,mi(r),a)}async function vi(e,t){let n=await gi(t).store.list(`app`),r=Object.values(t.integrations).filter(e=>e.app.builtin===`shared`).map(e=>{let t=n.find(({value:t})=>t.builtin&&t.integration===e.id)?.value;return{integration:e.id,name:e.name,brand:e.brand,organizationApps:e.organizationApps===!0,...t?{app:{id:t.id,name:t.name,createdAt:t.createdAt}}:{}}}),i=t.config.publicUrl,a=!!i&&R.has(new URL(i).hostname);return T({name:hi(t),platforms:r,...a?{unreachable:!0}:{}})}async function yi(e,t,n){let r=t.integrations[n.integration];if(!r)return T({error:`Unknown integration "${n.integration}".`},404);if(r.app.builtin!==`shared`)return T({error:`Create ${r.name} apps in your workspace from the agent's Platforms tab.`},400);if(!t.config.publicUrl)return T({error:`Set PUBLIC_URL on this server first. Platforms call it.`},400);let i=await e.json().catch(()=>void 0),a=e=>typeof e==`string`&&e.trim()||void 0,o=a(i?.name)??hi(t),s=r.organizationApps?a(i?.owner):void 0,c=await Rn(gi(t),r.id,{name:o,owner:s});return await _i(t,`Started setting up a shared app`,`${o} on ${r.name}`),T({url:c})}async function bi(e,t){let n=await gi(t).store.list(`snapshot`,{prefix:`audit:`,limit:100});return T(n.map(e=>e.value))}const xi=e=>`create-finished:${w(e)}`;async function Si(e,t){let n=await e.store.get(`delivery`,xi(t));return n&&`target`in n?n.target:void 0}async function Ci(e,t,n){let r=e.operatorApp??!1,i=r?`*`:e.session?.user.id??`anonymous`;if(!e.integrations[t])return{error:`Unknown integration "${t}"; run coder agent integrations list to see them`,status:404};if(!e.config.publicUrl)return{error:`PUBLIC_URL is not set on this server; set it to the address platforms should call and restart`,status:400};if(r&&e.integrations[t].app.builtin!==`shared`)return{error:`Create this app in your workspace from the agent's Platforms tab.`,status:400};let a=Yn(n);if(!a)return{error:`Setup link is missing or malformed; start again from the agent's Platforms tab`,status:400};if(!a.definition.integrations[t])return{error:`This agent declares no ${t} integration in its agent.json`,status:400};if(a.state.public&&!r&&!e.integrations[t].publicApps)return{error:`${e.integrations[t].name} apps cannot be public here. Create a private one.`,status:400};let o=Dn(t,a.state),s=a.state.tx?await ft(e,a.state.tx,`create`,i)===o?a.state.tx:void 0:await Te(e,`create`,i,o);return s?{state:{...a.state,tx:s},definition:a.definition}:{error:`This app creation link is invalid, expired, or already used`,status:403}}async function wi(e,t,n,r){let i=r.searchParams.get(`tx`);if(t.operatorApp&&i&&(await ft(t,i,`create`,`*`)||await Si(t,i)===n.id))return await Sn(e,t.dashboardHosts)??Nn();let a=new URLSearchParams(r.searchParams);return a.set(`create`,n.id),ue(`${Hn(t)}${Zt(bn(t),`/setup`)}?${a}`)}async function Ti(e,t,n){let r=await Ci(e,t,n);if(`error`in r)return T({error:r.error},r.status);let{app:i}=e.integrations[t],a=r.state.tx,o=i.createStep&&(e.operatorApp||r.state.public)?i.createStep(e.config.publicUrl,{saved:await He(e,t),name:r.definition.name,public:r.state.public}):void 0,s=e.config.publicUrl;if(i.createPost&&R.has(new URL(s).hostname))return T({error:`${e.integrations[t].name} cannot reach ${s}. Set a public address first.`},400);let c=e.operatorApp?void 0:gn(e,r.state.agent),l=i.createPost?.({publicUrl:s,...r,encodedState:oe({tx:a,...c?{back:c}:{}})});return T({tx:a,...l?{post:l}:{},...o?{create:o}:{}})}async function Ei(e,t,n,r){return Ti(t,n.id,r.searchParams)}async function Di(e,t,n){let r=await e.json().catch(()=>void 0);return Ti(t,n.integration,new URLSearchParams(r&&typeof r==`object`?r:{}))}async function Oi(e,t,n,r,i){let a=t.operatorApp??!1,o=a?`*`:t.session?.user.id??`anonymous`,s=t.integrations[n];if(!s)return I(t,`unknown-integration`,{platform:n},i);if(a&&s.app.builtin!==`shared`)return T({error:`Create this app in your workspace from the agent's Platforms tab.`},400);let c=t.config.publicUrl;if(!c)return I(t,`no-public-url`,{},i);let l=r?await Gt(t,r,n,o):void 0;if(!l)return I(t,`create-expired`,{platform:n},i);a&&await t.store.put(`delivery`,xi(r),{at:t.now?.()??Date.now(),target:n},{ttlMs:6e5});let u=a?`/create/${n}`:gn(t,l.state.agent),d=a?{tx:r}:{},f=a?void 0:(await sn(t)).find(e=>e.integration===n),p=await s.app.createCallback(e,{publicUrl:c,...l,fetch:t.fetch??fetch,tokens:In(t,n),...f?{shared:U(t.config,f.credentials)}:{}}).catch(r=>r instanceof C&&r.code===`invalid-field`&&e.headers.get(`accept`)===`application/json`?T({error:r.message},400):r instanceof C?I(t,r.code,{platform:n,error:r.error,...d},u):(console.error(`coder server: creating the ${n} app failed`,r),I(t,`failed`,{platform:n,...d},u)));if(p instanceof Response)return p;let m={id:`${n}:${p.platformAppId}`,integration:n,agent:l.state.agent,name:p.name,...l.state.repo?{agentsRepo:l.state.repo}:{},...l.state.repo?{branch:l.state.branch??`main`}:{},...a?{builtin:!0}:{},...`shared`in p?{shared:f.id,credentials:``}:{credentials:H(t.config,p.credentials)},createdAt:t.now?.()??Date.now()};if(await t.store.put(`app`,m.id,m),s.app.values&&await t.store.put(`delivery`,Pe(m.id),{version:0,manifest:s.app.values(m,{publicUrl:c,definition:l.definition}).lines,changed:!1}),a)return await _i(t,`Created the shared app`,`${p.name} on ${s.name}`),I(t,`created`,{platform:n,app:p.name,...d},u);let h=await Te(t,`install`,o,m.id);return ue(`${c}/install/${n}?app=${encodeURIComponent(m.id)}&state=${oe({tx:h,back:u})}`)}async function ki(e,t,n,r){let i=de(r.searchParams.get(`state`));return Oi(e,t,n.id,i?.tx,Lt(i?.back))}async function Ai(e,t,n,r){let i=new URLSearchParams(await e.clone().text()).get(`tx`),a=await Oi(e,t,n.id,i,void 0),o=a.headers.get(`location`);return o&&e.headers.get(`accept`)===`application/json`?T({url:o}):a}async function ji(e,t,n,r){if(t.source!==`repo`||!t.repo)return;let i=(await(r??e.store.list(`app`))).find(({value:e})=>e.agent===t.id&&e.agentsRepo===t.repo)?.value;return((i&&e.integrations[i.integration])??Object.values(e.integrations).find(e=>e.repos))?.repos?.url(t.repo,t.path,i?.branch??n?.commit)}async function Mi(e,t,n){return x()[t]&&await Er(e,n),Or(e.store,t)}async function Q(e,t){let n=(e.now??Date.now)();(!t||x()[t])&&await Er(e,n);let r=e.local?await Tr(e.store,e.local.cwd,e.integrations,t).catch(()=>void 0):void 0;return{now:n,local:r,loadCurrent:()=>r?Promise.resolve(r.find(({record:e})=>e.id===t)??{}):Mi(e,t,n)}}async function Ni(e,t,{after:n,q:r,source:i,platform:a,limit:o}){return t?(t??[]).filter(({version:e})=>!a||!!e?.definition?.integrations?.[a]).map(({record:e})=>e).filter(e=>(!n||e.id>n)&&(!i||e.source===i)&&(!r||[e.id,e.name,e.description,e.repo].some(e=>e?.toLowerCase().includes(r)))).sort((e,t)=>e.id.localeCompare(t.id)).slice(0,o):(await e.store.listAgentSummaries({after:n,q:r,source:i,platform:a,limit:o})).map(({record:e})=>e)}async function Pi(e,t,n,r){let i=r.searchParams.get(`fields`);if(i&&![`id`,`id,name`].includes(i))return T({error:`Invalid fields`},400);let{local:a}=await Q(t);if(!a&&D(r)&&!i)return T(await zi(t,r));let o=E(r,200);if(i){let e=await Ni(t,a,{after:ce(r),q:r.searchParams.get(`q`)?.trim().toLowerCase(),source:Ri[r.searchParams.get(`type`)??``],platform:r.searchParams.get(`platform`)??void 0,limit:o+ +!!D(r)}),n=e=>i===`id`?{id:e.id}:{id:e.id,name:e.name},s=me(e,o,e=>e.id);return T(D(r)?{...s,items:s.items.map(n)}:e.map(n))}let s=a??await t.store.listAgentSummaries({limit:o});if(D(r))return T(await zi(t,r,s));let c,l=v();return T(await Promise.all(s.slice(0,o).map(async({record:e,version:n})=>{e.source===`repo`&&e.repo&&(c??=t.store.list(`app`));let r=await ji(t,e,n,c);return{...e,problems:wr(e,n,t.integrations),...e.id===l?{default:!0}:{},definition:n?.definition,...r?{sourceUrl:r}:{}}})))}async function Fi(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),c=E(r,10,50),l=ce(r),[u,d]=await Promise.all([o?s().then(e=>e.record):G(t.store,i),o?Promise.resolve(o.flatMap(({version:e})=>e?[{value:e}]:[])):t.store.listVersions(i,c+1,l)]);return u?T(await Bi(t,u,c,l??u.currentVersion+1,d)):T({error:`No agent named "${i}"`},404)}async function Ii(e,t,n,r){let i=n.slug,a=n.version?Number(n.version):void 0;if(n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return se();let{now:o,local:s,loadCurrent:c}=await Q(t,i),l=s?s.find(({version:e})=>e?.version===a)?.version:await W(t.store,i,a);return l?T(l):T({error:`No version ${a} for agent "${i}"`},404)}async function Li(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),c=r.searchParams.get(`versions`)!==`0`,l=r.searchParams.get(`content`)!==`0`,u=r.searchParams.get(`handles`)===`1`,d=t.session?.user.id,[{record:f,version:p},m,h,g]=await Promise.all([!l&&!o?t.store.listAgentSummaries({slug:i}).then(e=>e[0]??{}):s(),c?o?o.flatMap(({version:e})=>e?[{value:e}]:[]):t.store.listVersions(i):[],u?Ze(t,i):[],u?rn(t.store,i):void 0]);if(!f)return T({error:`No agent named "${i}"`},404);let _=u?await nt(t,{engine:f.settings?.engine??p?.definition.engine,model:f.settings?.model??p?.definition.model},d):void 0,v=p?.definition.integrations??{},y=e=>{let t=v[e]?.events;return Array.isArray(t)?t.includes(`mention`):!!(t&&`mention`in t)},b=[],x=Object.keys(t.integrations),S=(e,t)=>x.indexOf(e.value.integration)-x.indexOf(t.value.integration);for(let{value:e}of[...h].sort(S))y(e.integration)&&!b.some(t=>t.integration===e.integration&&t.name.toLowerCase()===e.name.toLowerCase())&&b.push({name:e.name,integration:e.integration,platform:t.integrations[e.integration]?.name??e.integration});let ee=m.map(({value:e})=>{let{systemPrompt:t,files:n,...r}=e;return r}),C=await ji(t,f,p);return T({...f,problems:wr(f,p,t.integrations),...p?{definition:p.definition,...l&&`systemPrompt`in p?{systemPrompt:p.systemPrompt,...p.files?{files:p.files}:{}}:{}}:{},...C?{sourceUrl:C}:{},...c?{versions:ee}:{},...b.length?{handles:b}:{},...g?.failed?{deliveries:{failed:g.failed,recent:g.recent.map(e=>({at:e.at,platform:t.integrations[e.integration]?.name??e.integration,...e.type?{type:e.type}:{},error:e.error,...e.url?{url:e.url}:{}}))}}:{},..._?{..._.usable?{}:{needsModel:!0}}:{}})}const Ri={builtin:`builtin`,dashboard:`upload`,repository:`repo`};async function zi(e,t,n){let r=E(t,24,100),i=ce(t),a=t.searchParams.get(`q`)?.trim().toLowerCase(),o=Ri[t.searchParams.get(`type`)??``],s=t.searchParams.get(`platform`),c=t.searchParams.get(`connect`)===`1`,l=e.serverOrganizationId,u=e.store.list(`app`),[d,f,p,m]=await Promise.all([u,e.store.list(`installation`),c&&l!==void 0&&l!==e.organizationId&&e.scope?e.scope(l).store.list(`app`):[],n?n.filter(({record:e})=>(!i||e.id>i)&&(!o||e.source===o)&&(!a||[e.id,e.name,e.description,e.repo].some(e=>e?.toLowerCase().includes(a)))):e.store.listAgentSummaries({after:i,source:o,q:a,platform:s??void 0,limit:r+1})]),h=new Set(f.filter(({value:e})=>!e.deletedAt&&!e.uninstalled).map(({value:e})=>e.app)),g=(e,t)=>{let n=d.filter(({value:n})=>n.agent===e&&n.integration===t);return n.length?n.some(({value:e})=>h.has(e.id))?`installed`:`created`:`none`},_=[];for(let{record:e,version:t}of m){let n=Object.keys(t?.definition?.integrations??{}).sort();if(!(s&&!n.includes(s))&&(_.push({record:e,version:t,ids:n}),_.length>r))break}let y=me(_,r,e=>e.record.id),b=v();return{...y,...c?{connectable:[...d,...p].filter(({value:t})=>t.builtin&&e.integrations[t.integration]?.app.builtin===`shared`&&!h.has(t.id)).map(({value:e})=>({id:e.id,integration:e.integration,agent:e.agent}))}:{},items:await Promise.all(y.items.map(async({record:t,version:n,ids:r})=>{let i=await ji(e,t,n,u);return{...t,problems:wr(t,n,e.integrations),...t.id===b?{default:!0}:{},definition:n?.definition,...i?{sourceUrl:i}:{},platforms:r.map(e=>({id:e,state:g(t.id,e)}))}}))}}async function Bi(e,t,n,r,i){let a=(i??await e.store.listVersions(t.id,n+1,r)).map(({value:e})=>{let{systemPrompt:t,files:n,definition:r,...i}=e;return i}).filter(e=>e.version<r).reverse();return me(a,n,e=>e.version)}var Vi=class{options;entries=new Map;pending=new Map;constructor(e){this.options=e}async get(e,t){let n=this.options.now??Date.now,r=n(),i=this.entries.get(e);if(i&&r-i.at<this.options.ttlMs)return i.value;let a=this.pending.get(e);return a||(a=Promise.resolve().then(t).then(t=>{if(t===void 0)return i?.value;if(this.options.accept&&!this.options.accept(t))return i?.value??t;this.entries.set(e,{value:t,at:n()});let r=this.entries.keys().next().value;return this.entries.size>this.options.max&&r!==void 0&&this.entries.delete(r),t}).catch(t=>(console.error(`coder server: model probe failed for ${e}`,t),i?.value)).finally(()=>this.pending.delete(e)),this.pending.set(e,a)),a}};const Hi=/^[a-z0-9][a-z0-9-]*$/,Ui=new Set([`openrouter.ai`,`ai-gateway.vercel.sh`,`api.groq.com`,`api.together.xyz`]);function Wi(e){return{builtin:{codex:h,claude:g},models:e.models??{}}}async function Gi(e,t){let{baseUrl:n,envKey:r,key:i}=await yt(e);if(!n||!/^https?:\/\//.test(n)||!URL.canParse(n))return T({error:`An http or https base URL is required`},400);let a=!i&&r&&await Ki(t,n,r)?await Ee(t,r):void 0,o=i||a,s=t.settings??={},c=s.probes??=new Vi({ttlMs:6e5,max:100,now:t.now,accept:e=>e.reachable}),l=`${new URL(n).host}|${r??``}|${w(String(o??``))}`;return T(await c.get(l,()=>ae({baseUrl:n},{key:o,fetch:t.fetch})))}async function Ki(e,t,n){let r=new URL(t).host;if(Ui.has(r))return!0;let i=(await Ue(e)).models??{};return Object.values(i).some(e=>`baseUrl`in e&&e.envKey===n&&new URL(e.baseUrl).host===r)}async function qi(e,t,n,r){return T(Wi(await Ue(t)))}async function Ji(e,t,n,r){let{name:i=``,...a}=await yt(e);return!Hi.test(i)||_(i)?T({error:`Invalid model name "${i}"`},400):P(t,e=>{if(e.models?.[i])throw new k(`"${i}" already exists`);e.models={...e.models,[i]:a}})}async function Yi(e,t,n,r){let i=n.name;return P(t,e=>{if(!e.models?.[i])throw new k(`No model "${i}"`);l(e,i)})}async function Xi(e,t,n,r){let i=n.name,{spec:a}=await yt(e);return P(t,e=>{if(!Hi.test(i))throw new k(`Invalid alias name "${i}"`);let t=e.models?.[i];if(t&&u(t))throw new k(`"${i}" is a custom model name`);let n=o(a,s(e));if(!n?.model||n.engine===`custom`)throw new k(`"${a}" does not name a codex or claude model`);let r=n.engine===`claude`?g:h,c=a.split(`:`).some(e=>p.has(e)||m.has(e));e.models={...e.models,[i]:{provider:n.engine,model:r[n.model]??n.model,...c&&n.effort?{effort:n.effort}:{}}}})}async function Zi(e,t,n,r){let i=n.name;return P(t,e=>{let t=e.models??={},n=t[i];n&&(u(n)||f(n))?n.disabled=!0:t[i]={disabled:!0}})}async function Qi(e,t,n,r){let i=n.name;return P(t,e=>{let t=e.models??={},n=t[i];n&&(u(n)||f(n))?delete n.disabled:delete t[i]})}async function $i(e,t){let{now:n,local:r}=await Q(t),[i,a,o]=await Promise.all([Ni(t,r,{limit:200}),Ue(t),t.store.list(`runner`)]),s=v(),c=i.filter(e=>!e.settings?.disabled).sort((e,t)=>Number(t.id===s)-Number(e.id===s)).map(({id:e,name:t})=>({id:e,name:t,...e===s?{default:!0}:{}})),l=Fe(t,a),u=Object.values(t.integrations).find(e=>e.repos);return T({agents:c,...l.chain?.[0]?{engine:l.chain[0]}:{},engines:l.engines??{},models:Wi(a),runners:Wt(t,o,n).map(({id:e,name:t,default:n})=>({id:e,name:t,default:n})),flows:ne(re(),`builtin`).map(e=>e.name),...t.local?{folders:Mt(t.local.cwd)}:{},...u?{connectLabel:u.installLabel??`Connect ${u.id}`}:{}})}async function ea(e,t){let n=(await e.store.list(`installation`)).filter(({value:t})=>!t.deletedAt&&e.integrations[t.integration]?.repos),r=new Map((await xe(e.store,n.map(({value:e})=>e.app))).map(({id:e,value:t})=>[e,t]));for(let{value:i}of n){let n=e.integrations[i.integration];if(i.deletedAt||!n?.repos)continue;let a=r.get(i.app);if(!(!a||a.integration!==n.id))try{let r=await Se(e,n,i,U(e.config,a.credentials));if(i.repos?.includes(t)||(await n.repos.list(St(e,i),r)).includes(t))return{contents:n,token:r,app:a,installation:i}}catch(e){console.error(`coder server: repository access for ${i.id} failed`,e)}}}async function ta(e,t,n){let r=await ea(e,t);if(!r)return T({error:`No installed app can read ${t}`},400);let i=await r.contents.repos.listDir(t,xt,r.token,n).catch(()=>[]),a=await Promise.all(i.map(async i=>{let a=await r.contents.repos.readFile(t,`${xt}/${i}/agent.json`,r.token,n).catch(()=>void 0);if(a===void 0)return;let o={};try{let e=JSON.parse(a);e&&typeof e==`object`&&(o=e)}catch{}let s=Object.entries(o.mcp&&typeof o.mcp==`object`&&!Array.isArray(o.mcp)?o.mcp:{}).flatMap(([e,t])=>c(e,t)),l=await G(e.store,i),u=l?.source===`repo`&&l.repo===t,d=u?await W(e.store,i):void 0;return{id:i,name:typeof o.name==`string`?o.name:i,...s.length?{warnings:s}:{},...typeof o.description==`string`?{description:o.description}:{},...u?{version:l.currentVersion,...d?.source?{commit:d.source.commit}:{}}:{},...l&&!u?{taken:!0}:{}}}));return T({repo:t,agents:a.filter(Boolean)})}async function na(e,t,n,r){let i=r.searchParams.get(`repo`);return i?ta(t,i,r.searchParams.get(`ref`)||`HEAD`):T({error:`repo is required`},400)}async function ra(e,t,n,r){let i=await e.json().catch(()=>void 0),a=i?.agents;if(typeof i?.repo!=`string`||i.ref!==void 0&&typeof i.ref!=`string`||a!==void 0&&!(Array.isArray(a)&&a.every(e=>typeof e==`string`)))return T({error:`repo is required, ref must be a string and agents a list of ids`},400);try{let e=await ea(t,i.repo);if(!e)return T({error:`No installed app can read ${i.repo}`},400);let n=i.ref??`HEAD`,r=a??await e.contents.repos.listDir(i.repo,`.coder/agents`,e.token,n);for(let e of r){let n=await G(t.store,e);if(n&&(n.source!==`repo`||n.repo!==i.repo))return T({error:`Agent id "${e}" is already taken`},409)}let o=await Le(t.store,e.contents,i.repo,n,e.token,(t.now??Date.now)(),{slugs:r});return await Ge(t,o),T({imported:o.map(e=>e.agent)})}catch(e){return T({error:e instanceof Error?e.message:String(e)},400)}}function ia(e){if(!e||Array.isArray(e)||typeof e!=`object`)return!1;let t=Object.entries(e);if(t.length>100)return!1;let n=0;for(let[e,r]of t){if(typeof r!=`string`||e.startsWith(`/`)||e.includes(`\\`)||e.includes(`\0`)||e.split(`/`).includes(`..`)||e===`agent.json`||e===`system.md`)return!1;n+=Buffer.byteLength(e)+Buffer.byteLength(r)}return n<=262144}async function aa(e,t){return(await wt(e,[t])).flatMap(({app:e,error:t,check:n})=>{let r={id:e.id,integration:e.integration,name:e.name};return t?[{...r,error:t}]:n?n.changed?[{...r,drift:!0}]:[]:[{...r,updated:!0}]})}async function oa(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),c=await e.json().catch(()=>void 0);try{let e=b({[i]:c})[i];if(!e||typeof e!=`object`)throw Error(`settings must be an object`);let{disabled:n,...r}=e,a=n?{...r,disabled:n}:r,{record:o,version:l}=await s();if(!o||!l)throw Error(`No agent named "${i}".`);if(br({...o,settings:void 0},l,r,t.integrations),t.local){let e=y(t.local.cwd,i,!!n);return e?T({error:`Agent "${i}" is ${n?`enabled`:`disabled`} by agents.${i} in ${e}. Change it there.`},409):(await At(t,e=>{e.agents={...e.agents,[i]:a}}),await Tr(t.store,t.local.cwd,t.integrations),T(await G(t.store,i)))}return T(await kr(t.store,i,a,(t.now??Date.now)()))}catch(e){return T({error:e instanceof Error?e.message:String(e)},400)}}async function sa(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),{record:c}=await s();return c?c.source===`builtin`?T({error:`Built-in agents cannot be deleted.`},400):t.local&&!await Dr(t.local.cwd,t.integrations,i)?T({error:`Delete .coder/agents/${i} in the repo`},409):(await t.store.delete(`agent`,i),T({ok:!0})):T({error:`No agent named "${i}"`},404)}async function ca(e,t,n,r){let i=n.slug,{now:a,local:o,loadCurrent:s}=await Q(t,i),c=await e.json().catch(()=>void 0);if(!c||typeof c.systemPrompt!=`string`||c.files!==void 0&&!ia(c.files)||c.name!==void 0&&typeof c.name!=`string`||c.description!==void 0&&typeof c.description!=`string`)return T({error:`definition and systemPrompt are required; files must contain strings`},400);try{ee([i]);let[e]=S({definitions:{[i]:{json:c.definition,builtin:!1}},usage:void 0},t.integrations);if(!e)throw Error(`No agent named "${i}".`);let n=t.local?await G(t.store,i):void 0,r=t.local&&n?await W(t.store,i):void 0,a=c.files;t.local&&(await Sr(t.local.cwd,t.integrations,i,{definition:{...c.definition,...c.name===void 0?{}:{name:c.name},...c.description===void 0?{}:{description:c.description}},systemPrompt:c.systemPrompt,...a?{files:a}:{}}),await Tr(t.store,t.local.cwd,t.integrations));let o=t.local?void 0:await xr(t.store,{id:i,name:c.name??e.name,description:c.description??e.definition.description,source:`upload`,definition:e.definition,systemPrompt:c.systemPrompt,files:a,importedFrom:`upload`},(t.now??Date.now)()),s=o?.version??await W(t.store,i),l=o?.unchanged??Lr(r&&{...r,createdAt:0},{...s,createdAt:0}),u=await aa(t,s),d=o?.record??await G(t.store,i);return T({...d,definition:s.definition,version:s.version,unchanged:l,apps:u})}catch(e){return T({error:e instanceof Error?e.message:String(e)},400)}}async function la(e,t,n,r){let i=n.id,a=Number(r.searchParams.get(`after`)??-1),o=Number.isFinite(a)?a:-1;r.searchParams.has(`limit`)&&E(r,500,2e3);let s=await t.store.get(`task`,i);if(!s||t.local&&s.handle?.startsWith(`cli:`)&&s.task.flow==="default"){let n=s?.task.cwd??t.local?.cwd;if(!n||!A(n,i,!1))return T({error:`No task "${i}"`},404);{let r=Number(e.headers.get(`last-event-id`)??o);return _a(e,t,`cli:${n}:${i}`,Number.isFinite(r)?r:o,async e=>{let t=A(n,i);if(t)return{status:t,lines:Qe(n,i,e,500),pendingResult:ua(n,t,!t.result)}})}}let c=Number(e.headers.get(`last-event-id`)??o),l=t.statementTimeout??((e,t)=>t());return _a(e,t,i,Number.isFinite(c)?c:o,e=>l(ha,async()=>{let n=await t.store.get(`task`,i);if(n)return{status:await ht(t,n),lines:await nn(t.store,i,e,500)}}))}function ua(e,r,i=!1){if(!Dt.has(r.status)||r.error||r.status===`cancelled`)return!1;let a=t(e,r.task.id),o=Date.parse(a?.resumedAt??a?.createdAt??``)||0;return i||(Mr.statSync(K.join(n(e,r.task.id),`result.json`),{throwIfNoEntry:!1})?.mtimeMs??0)<o}const da=1e3,$=3e4;function fa(e,t,n,r){let i=[...new Set((r.searchParams.get(`tasks`)??``).split(`,`).filter(Boolean))].slice(0,100),a=Date.now(),o=t.taskWatcher??new ma,s=o.tag(t),[c,l]=(e.headers.get(`last-event-id`)??``).split(`-`),u=Number(c),d=u>0&&`-${l}`===s,f=d?Math.min(Math.max(u,a-29e4),a):a,p=u>0&&(!d||u<f)?`event: reset
2
+ data: {}
3
+
4
+ `:``,m=new TextEncoder,h=()=>{},g=new ReadableStream({start(n){n.enqueue(m.encode(`retry: ${da}\nid: ${f}${s}\n\n${p}`)),h=o.watch(t,i,f,e=>n.enqueue(m.encode(e)),()=>n.close(),d);let r=()=>{h();try{n.close()}catch{}};e.signal.aborted?r():e.signal.addEventListener(`abort`,r)},cancel(){h()}});return new Response(g,{headers:{"content-type":`text/event-stream; charset=utf-8`,"cache-control":`no-cache, no-transform`}})}function pa(e,t){let{task:n,approval:r,archivedAt:i,createdAt:a,startedAt:o,finishedAt:s}=e;return{id:n.id,agent:n.agent,status:e.status,approval:r??null,archivedAt:e.autoArchived&&!t?void 0:i,createdAt:a,startedAt:o,finishedAt:s,...Cn(e),...t?{result:e.result??null,error:e.error??null,answer:e.answer??null}:{}}}var ma=class{options;watches=new Set;timer;counts=new Map;runners=new Map;reading=!1;closed=!1;last=Date.now();scans=new Map;left=new Map;archived=new Map;reads=0;generation=Ir().slice(0,8);constructor(e={}){this.options=e}watch(e,t,n,r,i,a=!1){if(this.closed)return queueMicrotask(i),()=>{};let o=Date.now();this.watches.size||(this.last=o);let s={ctx:e,ids:new Set(t),sent:new Map,gone:new Set,from:n,fresh:!0,...a?{runners:``}:{},tag:this.tag(e),beat:o,marked:o,until:o+(this.options.lifeMs??29e4),send:r,close:i};return this.watches.add(s),this.timer||(this.timer=setInterval(()=>this.tick(),this.options.pollMs??1e3),this.timer.unref?.()),this.tick(),()=>this.drop(s)}tag(e){return`-${Pr(`sha256`).update(e.organizationId).digest(`hex`).slice(0,8)}${e.queue instanceof Qn?`.${this.generation}`:``}`}runnersChanged(e){this.runners.delete(e)}close(){this.closed=!0;for(let e of[...this.watches]){this.drop(e);try{e.close()}catch{}}}drop(e){this.watches.delete(e)&&([...this.watches].some(t=>t.ctx.organizationId===e.ctx.organizationId)||(this.counts.delete(e.ctx.organizationId),this.runners.delete(e.ctx.organizationId)),this.watches.size||(clearInterval(this.timer),this.timer=void 0,this.counts.clear(),this.runners.clear()))}tick(){let e=Date.now();for(let t of[...this.watches])if(e>=t.until){this.drop(t);try{t.close()}catch{}}else e-t.beat>=(this.options.heartbeatMs??2e4)&&(t.beat=e,this.send(t,`: ping
5
+
6
+ `));this.reading||!this.watches.size||(this.reading=!0,this.read(e).finally(()=>this.reading=!1))}send(e,t){try{e.send(t)}catch{this.drop(e)}}async read(e){let t=[...this.watches],n=new Map;for(let e of t){let t=n.get(e.ctx.organizationId)??{ctx:e.ctx,ids:new Set};for(let n of e.ids)t.ids.add(n);n.set(e.ctx.organizationId,t)}let r=Math.min(this.last,...t.flatMap(e=>e.fresh?[e.from]:[]));this.reads++;let i=await this.changes(n,r-$,e).catch(e=>{console.error(`coder server: task events failed`,e)});if(i){this.last=e;try{for(let[e,{ctx:t}]of n){let n=this.counts.get(e),r=JSON.stringify([[...i.rows.get(e)??[]].map(([e,t])=>[e,t.status,t.archivedAt]).sort(),[...i.deleted.get(e)?.keys()??[]].sort()]),a=n?.fingerprint!==r,o=t.local?[...i.rows.get(e)?.values()??[]].filter(e=>!e.archivedAt&&[`queued`,`running`,`waiting`].includes(e.status)).length:a?(await t.queue.counts(e,{archived:!1,statuses:[`queued`,`running`,`waiting`]})).active:n.active;[...this.watches].some(t=>t.ctx.organizationId===e)&&this.counts.set(e,{active:o,fingerprint:r})}}catch(e){console.error(`coder server: task counts failed`,e);return}await Promise.all([...n].filter(([t])=>e-(this.runners.get(t)?.at??-1/0)>=15e3).map(async([t,{ctx:n}])=>{try{this.runners.set(t,{at:e,records:await n.store.list(`runner`)})}catch(e){console.error(`coder server: runner events failed`,e)}}));for(let n of t){if(!this.watches.has(n))continue;let t=[];try{t=this.news(n,i,e);let r=this.counts.get(n.ctx.organizationId)?.active;r!==void 0&&r!==n.active&&(n.active=r,t.push(`id: ${e}${n.tag}\nevent: counts\ndata: ${JSON.stringify({active:r})}\n\n`)),t.push(...this.runnerNews(n,e))}catch{}!t.length&&e-n.marked>=(this.options.heartbeatMs??2e4)&&t.push(`id: ${e}${n.tag}\n\n`),t.length&&(n.marked=e,this.send(n,t.join(``)))}}}runnerNews(e,t){let n=this.runners.get(e.ctx.organizationId);if(!n)return[];let r=Wt(e.ctx,n.records,t),i=JSON.stringify(r.map(({lastSeen:e,...t})=>t.online?t:{...t,lastSeen:e})),a=e.runners;return e.runners=i,a===void 0||a===i?[]:[`id: ${t}${e.tag}\nevent: runners\ndata: ${JSON.stringify({items:r})}\n\n`]}async changes(e,n,r){let i=await[...e.values()][0].ctx.queue.changes([...e].map(([e,t])=>({organizationId:e,ids:[...t.ids]})),n),a=new Map;for(let{organizationId:e,status:t}of i.rows){let n=a.get(e)??new Map;a.set(e,n.set(t.task.id,t))}let o=new Map;for(let{organizationId:e,id:t,at:n}of i.deleted){let r=o.get(e)??new Map;o.set(e,r.set(t,n))}for(let[n,{ctx:i}]of e){if(!i.local)continue;let e=[...a.get(n)?.values()??[]],o=this.scans.get(i.local.cwd);if(!o||r-o.at>=(this.options.localScanMs??4e3)||e.some(e=>e.updatedAt>o.at)){let e=!o||r-o.archivedAt>=(this.options.archiveScanMs??15e3);await ut(i,i.local.cwd);let n=e?M(i.local.cwd,!0):o.archived,a=M(i.local.cwd,!1),s=new Set(a.map(e=>e.task.id)),c=[...a,...n.filter(e=>!s.has(e.task.id))],l=new Set(c.map(e=>e.task.id)),u=this.left.get(i.local.cwd)??new Map;for(let e of o?.rows??[])l.has(e.task.id)||u.set(e.task.id,o.at);for(let[e,t]of u)(t<r-6e5||l.has(e))&&u.delete(e);let d=this.archived.get(i.local.cwd)??new Set;for(let e of d)l.has(e)?d.delete(e):t(i.local.cwd,e)||(u.set(e,o?.at??r),d.delete(e));this.left.set(i.local.cwd,u),this.scans.set(i.local.cwd,o={at:r,rows:c,archived:n,archivedAt:e?r:o.archivedAt})}a.set(n,new Map(zn(i.local.cwd,o.rows,e).map(e=>[e.task.id,e])))}return{rows:a,deleted:o}}news(e,{rows:t,deleted:n},r){let{ctx:i}=e,a=t.get(i.organizationId)??new Map,o=[],s=(t,n)=>{let i=JSON.stringify(n);e.sent.get(t)!==i&&(e.sent.set(t,i),o.push(`id: ${r}${e.tag}\nevent: task\ndata: ${i}\n\n`))},c=e=>({id:e,deleted:!0}),l=t=>{let n=i.local&&A(i.local.cwd,t,e.ids.has(t));if(s(t,n?pa(n,e.ids.has(t)):c(t)),e.gone.add(t),n&&i.local){let e=this.archived.get(i.local.cwd)??new Set;this.archived.set(i.local.cwd,e.add(t))}};for(let[t,n]of a){let a=e.ids.has(t);e.gone.delete(t);let o=pa(a&&i.local&&n.local&&Dt.has(n.status)?A(i.local.cwd,t)??n:n,a);if(i.local&&n.local&&e.sent.get(t)!==JSON.stringify(o)&&r-(n.finishedAt??0)<$&&ua(i.local.cwd,n)){e.sent.has(t)||e.sent.set(t,``);continue}a||i.local&&!e.fresh||n.updatedAt>e.from-$?s(t,o):e.fresh&&e.sent.set(t,JSON.stringify(o))}for(let t of e.ids)a.has(t)||l(t);for(let[t,r]of n.get(i.organizationId)??[])r>e.from-$&&s(t,c(t));if(i.local){for(let t of e.sent.keys())!a.has(t)&&!e.ids.has(t)&&!e.gone.has(t)&&l(t);for(let[t,n]of this.left.get(i.local.cwd)??[])n>e.from-$&&!a.has(t)&&e.sent.get(t)!==JSON.stringify(c(t))&&l(t)}return e.fresh=!1,e.from=r,o}};const ha=1e4;var ga=class{options;feeds=new Map;closed=!1;reads=0;constructor(e={}){this.options=e}watch(e,t,n,r,i){if(this.closed)return queueMicrotask(i),()=>{};let a=this.feeds.get(e),o=a?.reading!==void 0&&Date.now()-a.reading>=(this.options.stallMs??1e4);if(!a||o){let t={key:e,read:n,watches:new Set,head:1/0};if(a){clearTimeout(a.timer);for(let e of a.watches)t.watches.add(Object.assign(e,{feed:t}));a.watches.clear()}this.feeds.set(e,a=t)}let s={cursor:t,feed:a,timers:[],send:r,close:i};s.timers=[setTimeout(()=>this.end(s),this.options.lifeMs??5e4),setInterval(()=>this.send(s,`: ping
7
+
8
+ `),this.options.heartbeatMs??2e4)];for(let e of s.timers)e.unref?.();return a.watches.add(s),a.reading===void 0&&t<a.head&&(clearTimeout(a.timer),this.read(a)),()=>this.drop(s)}close(){this.closed=!0;for(let e of[...this.feeds.values()])for(let t of[...e.watches])this.end(t)}drop(e){let{feed:t}=e;for(let t of e.timers)clearTimeout(t);!t.watches.delete(e)||t.watches.size||(clearTimeout(t.timer),this.feeds.get(t.key)===t&&this.feeds.delete(t.key))}end(e,t=``){try{t&&e.send(t),e.close()}catch{}this.drop(e)}send(e,t){try{e.send(t)}catch{this.drop(e)}}async read(e){if(e.timer=void 0,this.feeds.get(e.key)!==e||!e.watches.size)return;let t=[...e.watches],n=Math.min(...t.map(e=>e.cursor));e.reading=Date.now(),this.reads++;let r=await e.read(n).catch(e=>(console.error(`coder server: task log read failed`,e),null));if(e.reading=void 0,this.feeds.get(e.key)!==e)return;let i=t.filter(t=>e.watches.has(t)),a=i.length<e.watches.size?0:this.options.pollMs??1e3;if(r===void 0)for(let e of i)this.end(e);else if(r){let{status:t,lines:o,pendingLogs:s,pendingResult:c}=r,l=o.length===500,u=Dt.has(t.status)&&!l&&!s&&!c,d=o.map(e=>[e.seq,`id: ${e.seq}\nevent: log\ndata: ${JSON.stringify(e)}\n\n`]);e.head=Math.max(n,o.at(-1)?.seq??n),l&&(a=0);for(let e of i){let t=d.flatMap(([t,n])=>t>e.cursor?[n]:[]).join(``);!l&&!u&&!e.caught&&(e.caught=!0,t+=`event: caught-up
9
+ data: {}
10
+
11
+ `),e.cursor=Math.max(e.cursor,o.at(-1)?.seq??-1),u?this.end(e,`${t}event: end\ndata: {}\n\n`):t&&this.send(e,t)}}this.feeds.get(e.key)===e&&(e.timer=setTimeout(()=>void this.read(e),a),e.timer.unref?.())}};function _a(e,t,n,r,i){let a=t.logWatcher??new ga,o=new TextEncoder,s=()=>{},c=new ReadableStream({start(c){c.enqueue(o.encode(`retry: ${da}\n\n`)),s=a.watch(`${t.organizationId}:${n}`,r,i,e=>c.enqueue(o.encode(e)),()=>c.close());let l=()=>{s();try{c.close()}catch{}};e.signal.aborted?l():e.signal.addEventListener(`abort`,l)},cancel(){s()}});return new Response(c,{headers:{"content-type":`text/event-stream; charset=utf-8`,"cache-control":`no-cache, no-transform`}})}const va={npm:[`npx`,`-y`],pypi:[`uvx`],oci:[`docker`,`run`,`-i`,`--rm`]},ya=(e=[])=>e.map(({name:e,description:t,isRequired:n,isSecret:r,value:i,default:a})=>({name:e,...t?{description:t}:{},...i??a?{placeholder:i??a}:{},required:n===!0,secret:r===!0}));function ba(e=[],t,n){return e.flatMap((e,r)=>{let i=`${t}:${r}`,a=Object.entries(e.variables??{}),o=e.value??e.default,s=(e,t,r)=>{let[i]=ya([{...r,name:e}]);return n.push({...i,label:t}),`{${e}}`};if(a.length)for(let[e,t]of a)o=o?.replaceAll(`{${e}}`,s(`${i}:${e}`,e,t));else o===void 0&&(e.valueHint||e.isRequired)&&(o=s(i,e.valueHint??e.name??i,e));return[...e.type===`named`&&e.name?[e.name]:[],...o===void 0?[]:[o]]})}function xa(e){let t=e.remotes?.find(e=>e.type===`streamable-http`);if(t)return{type:`http`,url:t.url,env:[],headers:ya(t.headers)};let n=e.packages?.find(e=>va[e.registryType]&&(e.transport?.type??`stdio`)===`stdio`);if(!n)return;let[r,...i]=va[n.registryType],a=[],o=ba(n.runtimeArguments,`runtime`,a),s=ba(n.packageArguments,`package`,a);return{type:`stdio`,command:n.runtimeHint??r,args:[...!n.runtimeHint||n.runtimeHint===r?i:[],...o,n.identifier,...s],...a.length?{argumentInputs:a}:{},env:ya(n.environmentVariables),headers:[]}}function Sa(e,t){let[n=``,r]=e.replace(/^v/,``).split(`+`)[0].split(/-(.*)/),[i=``,a]=t.replace(/^v/,``).split(`+`)[0].split(/-(.*)/),o=n.localeCompare(i,`en`,{numeric:!0});if(o)return o;if(r===void 0||a===void 0)return Number(r===void 0)-Number(a===void 0);let s=r.split(`.`),c=a.split(`.`);for(let e=0;e<Math.max(s.length,c.length);e++){let t=s[e],n=c[e];if(t===void 0||n===void 0)return Number(t!==void 0)-Number(n!==void 0);let r=/^\d+$/.test(t),i=/^\d+$/.test(n),a=r===i?t.localeCompare(n,`en`,{numeric:r}):Number(i)-Number(r);if(a)return a}return 0}var Ca=class{sources=[{url:`https://api.mcp.github.com/v0.1/servers`,curated:!0,rows:new Map,ready:!1,failed:!1},{url:`https://registry.modelcontextprotocol.io/v0.1/servers`,curated:!1,rows:new Map,ready:!1,failed:!1}];refreshAt=0;timer;controller;closed=!1;inFlight;response(e,t){if((e.now??Date.now)()>=this.refreshAt&&this.refresh(e),!this.inFlight&&this.sources.some(e=>e.failed)&&!this.sources.some(e=>[...e.rows.values()].some(e=>e.found)))return T({error:`The MCP registry did not answer. Try again.`},502);let n=t.trim().toLowerCase(),r=new Set,i=this.sources.flatMap(e=>[...e.rows].flatMap(([t,{found:i}],a)=>{if(r.has(t)||(r.add(t),!i))return[];let o=[i.name.split(`/`).pop(),i.title].map(e=>e.toLowerCase()),s=!n||o.includes(n)?0:o.some(e=>e.startsWith(n))?1:o.some(e=>e.includes(n))?2:i.description.toLowerCase().includes(n)?3:4;if(s===4)return[];let c=n&&i.verified&&s<3?0:1;return[{found:i,curated:e.curated,order:a,vendor:c,quality:s}]})),a=e=>Number(e===3);return i.sort((e,t)=>a(e.quality)-a(t.quality)||Number(t.curated)-Number(e.curated)||(e.curated?e.order-t.order:e.vendor-t.vendor||e.quality-t.quality||e.found.name.localeCompare(t.found.name))),T(i.slice(0,30).map(({found:e})=>e),200,this.sources.every(e=>e.ready)?{}:{partial:`true`})}refresh(e){if(this.inFlight||this.closed)return;this.timer&&clearTimeout(this.timer);let t=this.controller=new AbortController;this.inFlight=Promise.all(this.sources.map(n=>this.fill(e,n,t.signal))).then(()=>{}).finally(()=>{this.inFlight=void 0,this.refreshAt=(e.now??Date.now)()+36e5,this.closed||(this.timer=setTimeout(()=>this.refresh(e),36e5),this.timer.unref())}),e.waitUntil?.(this.inFlight)}async fill(e,t,n){let r=new Map,i=new Set,a;try{do{let o=new URLSearchParams({limit:`100`});a&&o.set(`cursor`,a);let s=await(e.fetch??fetch)(`${t.url}?${o}`,{headers:{accept:`application/json`},signal:AbortSignal.any([n,AbortSignal.timeout(2e4)])});if(!s.ok)throw Error(`Registry unavailable`);let{servers:c,metadata:l}=await s.json();for(let{server:e,_meta:n}of c){let i=n?.[`io.modelcontextprotocol.registry/official`]?.isLatest===!0,a=e.version??``,o=r.get(e.name);if(o&&(o.latest===i?Sa(o.version,a)>=0:o.latest))continue;let s=xa(e),c=/^[a-z0-9-]+(?:\.[a-z0-9-]+)+\//i.test(e.name)&&!/^io\.github(?:\.|\/)/i.test(e.name);r.set(e.name,{version:a,latest:i,found:s?{name:e.name,title:e._meta?.[`io.modelcontextprotocol.registry/publisher-provided`]?.github?.displayName??e.title??e.name.split(`/`).pop()??e.name,description:e.description??``,...c?{verified:!0}:{},...t.curated?{curated:!0}:{},...s}:void 0})}if(t.ready||(t.rows=new Map(r)),a=l?.nextCursor,a&&i.has(a))throw Error(`Registry cursor repeated`);a&&i.add(a)}while(a);t.rows=r,t.ready=!0,t.failed=!1}catch{t.failed=!0}}close(){this.closed=!0,this.timer&&clearTimeout(this.timer),this.controller?.abort()}};async function wa(e,t,n){let r=t.settings??={};return(r.registry??=new Ca).response(t,n.searchParams.get(`q`)??``)}const Ta=`/api/auth/callback`,Ea=`/.well-known/oauth-client.json`,Da=`/.well-known/oauth-cli-client.json`,Oa=`openid profile email offline_access organizations:read`;function ka(e,t){return{client_id:`${e}${Ea}`,client_name:`Coder at ${new URL(e).host}`,redirect_uris:[`${e}${Ta}`],post_logout_redirect_uris:[`${e}/?signed_out=1`],grant_types:[`authorization_code`,`refresh_token`],response_types:[`code`],token_endpoint_auth_method:`private_key_jwt`,token_endpoint_auth_signing_alg:`ES256`,jwks:t,scope:Oa}}function Aa(e){return{client_id:`${e}${Da}`,client_name:`Coder CLI for ${new URL(e).host}`,redirect_uris:[`http://127.0.0.1/callback`],grant_types:[`authorization_code`,`refresh_token`,`urn:ietf:params:oauth:grant-type:device_code`],response_types:[`code`],token_endpoint_auth_method:`none`,scope:Oa}}function ja(e,t){return{resource:new URL(e).origin,authorization_servers:[t],bearer_methods_supported:[`header`],scopes_supported:Oa.split(` `)}}function Ma(e){let t=T(e);return t.headers.set(`cache-control`,`public, max-age=3600`),t}function Na(e,t,n,r){return Ma(ka(t.config.publicUrl,t.auth.jwks))}function Pa(e,t,n,r){return Ma(Aa(t.config.publicUrl))}function Fa(e,t,n,r){return Ma(ja(t.config.publicUrl,t.auth.issuer))}const Ia=[B(`GET`,`/runner/:file`,mr),B(`GET`,ge,qn),B(`GET`,Ea,Na,rt),B(`GET`,Da,Pa,rt),B(`GET`,`/.well-known/oauth-protected-resource`,Fa,rt),B(`GET`,`/health`,(e,t)=>Jr(t)),B(`GET`,`/`,qt,ct),B(`GET`,`/login`,an,_t),...F(`/login`,$t,_t).filter(e=>e.method!==`GET`),B(`POST`,`/dash/token`,Zn,mt),...F(`/dash/:org/operator`,vn,qe),...F(`/dash`,vn,rr)],La=[B(`GET`,`/api/auth/capabilities`,(e,t)=>T({wular:t.auth?.issuer??null})),...F(`/api/auth`,(e,t)=>t.auth.handler(e),or),B(`GET`,`/me`,jn,tn)],Ra=[...V(`/tasks`,[B(`GET`,`/:id/messages`,Tt,De),B(`POST`,`/:id/ack`,Fn,De),B(`POST`,`/:id/heartbeat`,Ve,De),B(`POST`,`/:id/logs`,at,$e),B(`POST`,`/:id/result`,he,bt),B(`POST`,`/:id/credential`,jt,bt),B(`POST`,`/:id/reply`,Jn,O),B(`POST`,`/:id/react`,Xt,O),B(`GET`,`/:id/history`,$r,O),B(`GET`,`/:id/history/:conversation`,ei,O),B(`POST`,`/:id/history`,ti,bt),B(`GET`,`/:id`,Ot,ir)]),...V(`/logins`,[B(`GET`,`/:id/input`,di,Xe),B(`GET`,`/:id`,fi,Xe),B(`POST`,`/:id`,pi,Xe)]),...V(`/runners`,[B(`POST`,`/register`,Gn)])],za=[...V(`/create`,[B(`GET`,`/:id`,wi,N),B(`POST`,`/:id`,Ei,N),B(`GET`,`/:id/callback`,ki,N),B(`POST`,`/:id/callback`,Ai,N)]),...V(`/install`,[B(`GET`,`/:id`,xn,j),B(`POST`,`/:id`,xn,j),B(`GET`,`/:id/callback`,Mn,j),B(`POST`,`/:id/callback`,Mn,j)])],Ba=V(`/connect`,[B(`GET`,``,zt,We),B(`POST`,``,Bn,We),B(`GET`,`/:integration`,ln,Me),B(`GET`,`/:integration/callback`,Tn,Me)]),Va=[...V(`/hooks`,[B(`POST`,`/*`,(e,t,n)=>Ht(e,t,n[`*`]),(e,t,n)=>t.integrations[n[`*`]]?t:se())]),...za,...Ba],Ha=[B(`GET`,`/metrics`,async(e,t)=>T(await Xr(t),200,{"cache-control":`no-store`}),$n),B(`GET`,`/usage`,dt),B(`GET`,`/usage/totals`,we)],Ua=V(``,[B(`GET`,`/folders`,(e,t)=>T(Mt(t.local.cwd))),B(`POST`,`/folders/check`,async(e,t)=>{let n=await e.json().catch(()=>void 0);return T(kt(n?.path))}),B(`POST`,`/folders/clone`,async(e,t)=>{let n=await e.json().catch(()=>void 0);return T(await Et(n?.url))}),B(`POST`,`/folders/pick`,async(e,t)=>T(await ot()))],ve),Wa=V(``,[B(`GET`,`/engines/status`,async(e,t)=>T(await fn(t))),B(`POST`,`/engines/:engine/login`,hn),B(`POST`,`/engines/:engine/logout`,be)],ke),Ga=[B(`POST`,`/apps/:id/install`,(e,t,n,r)=>ye(e,t,n.id,r.searchParams.get(`back`))),B(`POST`,`/apps/create/:integration`,Di),B(`GET`,`/apps`,it),B(`DELETE`,`/apps/:id`,Je),B(`GET`,`/apps/:id/drift`,ze),B(`POST`,`/apps/:id/update`,lt),B(`GET`,`/installations`,Ne),B(`GET`,`/connections`,sr,L),B(`POST`,`/connections`,It,L),B(`PATCH`,`/connections/:id`,ar,L),B(`DELETE`,`/connections/:id`,nr,L),B(`POST`,`/connections/:id/authorize`,on,L),B(`GET`,`/integrations`,(e,t,n,r)=>et(t,r)),B(`GET`,`/repositories`,(e,t)=>dn(t)),B(`POST`,`/repositories/refresh`,(e,t)=>dn(t,!0))],Ka=[B(`GET`,`/agents/import`,na),B(`POST`,`/agents/import`,ra),B(`GET`,`/agents`,Pi),B(`PATCH`,`/agents/:slug/settings`,oa),B(`GET`,`/agents/:slug/versions`,Fi),B(`GET`,`/agents/:slug/versions/:version`,Ii),B(`GET`,`/agents/:slug`,Li),B(`DELETE`,`/agents/:slug`,sa,(e,t)=>cr(t,`Only an owner or admin can delete an agent.`)),B(`PUT`,`/agents/:slug`,ca)],qa=[B(`GET`,`/credentials`,je),B(`POST`,`/credentials`,pt,Ce),B(`DELETE`,`/credentials/:name`,gt),B(`POST`,`/logins`,ni,z),B(`GET`,`/logins/:id`,ri,z),B(`POST`,`/logins/:id`,ii,z),B(`DELETE`,`/logins/:id`,ai,z)],Ja=[B(`GET`,`/runners`,Bt),B(`POST`,`/runners`,Vn),B(`POST`,`/runners/pair`,An),B(`POST`,`/runners/:id/test`,En),B(`PATCH`,`/runners/:id`,yn),B(`DELETE`,`/runners/:id`,un)],Ya=[B(`GET`,`/composer`,$i),B(`GET`,`/tasks`,wn),B(`POST`,`/tasks`,Nt),B(`GET`,`/tasks/:id`,cn),B(`DELETE`,`/tasks/:id`,Rt),B(`GET`,`/tasks/:id/logs`,Un),B(`GET`,`/tasks/:id/stream`,la),B(`POST`,`/tasks/:id/steer`,On),B(`POST`,`/tasks/:id/ask`,Jt),B(`POST`,`/tasks/:id/approve`,st),B(`POST`,`/tasks/:id/cancel`,Kn),B(`POST`,`/tasks/:id/archive`,_e),B(`GET`,`/events`,fa)],Xa=[B(`GET`,`/config`,Ln),B(`PATCH`,`/config`,Ke)],Za=[B(`POST`,`/models/probe`,(e,t)=>Gi(e,t)),B(`GET`,`/models`,qi),B(`POST`,`/models`,Ji),B(`DELETE`,`/models/:name`,Yi),B(`POST`,`/models/:name/alias`,Xi),B(`POST`,`/models/:name/disable`,Zi),B(`POST`,`/models/:name/enable`,Qi)],Qa=[B(`GET`,`/mcp-registry`,(e,t,n,r)=>wa(e,t,r))],$a=V(`/operator`,[B(`GET`,`/apps`,vi),B(`POST`,`/apps/:integration`,yi),B(`GET`,`/audit`,bi)],Re),eo=[B(`GET`,`/flows`,_n),B(`GET`,`/pulls`,Xn),B(`POST`,`/flows/:name/run`,Qt),B(`POST`,`/review`,Kt)],to=V(`/admin`,[...Ha,...Ua,...Wa,...Ga,...Ka,...qa,...Ja,...Ya,...Xa,...Za,...Qa,...eo,...$a]).map(e=>({...e,guard:Pt(e.guard)})),no=[B(`GET`,`/connections/oauth/callback`,(e,t,n,r)=>Yt(e,t,r),Vt),...Ra,...to,...La,...Va,...Ia];async function ro(e,t,n){if(!pn(e,t))return se();let r=new URL(e.url);return n.scope instanceof Response?n.scope:(t=n.scope??t,await tr(no,e,t,r)??vn(e,t))}const io=`x-coder-request-scope`;function ao(e,{sessions:t,operators:n,cookies:r}){let i=e.auth;return i?{...e,auth:{...i,session(e,n){let a=JSON.stringify([...[`cookie`,`authorization`].map(t=>e.get(t)),!!n]),o=t.get(a);if(!o){let s=new Headers(e);s.delete(`x-coder-organization`),o=i.session(s,n,r),t.set(a,o)}let s=e.get(`x-coder-organization`);return s?o.then(e=>e&&(e.stale?e:kn(e,s))):o},setOrganization:(e,t)=>i.setOrganization(e,t,r),operator(e){let t=e.get(`cookie`)??``,a=n.get(t);return a||(a=i.operator(e,r),n.set(t,a)),a}}}:e}function oo(e,t,n){let r=t.requestScopes??=new Map,i=e.headers.get(io),a=n&&i?r.get(i):void 0;if(a)return{req:e,ctx:ao(t,a),end(){}};let o=new Headers(e.headers);if(o.delete(io),!t.auth)return{req:i?new Request(e,{headers:o}):e,ctx:t,end(){}};let s=Ir(),c={sessions:new Map,operators:new Map,cookies:[]};return r.set(s,c),o.set(io,s),{req:new Request(e,{headers:o}),ctx:ao(t,c),cookies:c.cookies,end:()=>r.delete(s)}}async function so(e,t,n={}){t.limits??=new tt((t.now??Date.now)()),t.limits.requests++,t.settings??={},t.taskWatcher??=new ma,t.logWatcher??=new ga,t.dashboardHosts??=new Ut;let r=()=>co(e,t,n);return t.dbProfile?t.dbProfile.request(n.inProcess===!0,r):r()}async function co(e,t,n){let r=await le(e,pe(new URL(e.url).pathname));if(r instanceof Response)return r;let i=oo(r,t,n.inProcess===!0),a=!1;try{let r=n.clientIp??`unknown`,o=await mn(i.req,i.ctx,r),s=lo(o instanceof Response?o:await ro(i.req,i.ctx,o),i.cookies),c=new URL(e.url).pathname.split(`/`),l=c[1]===`tasks`,u=c[1]===`admin`&&c[2]===`tasks`;if(e.method!==`GET`&&s.ok&&![`hooks`,`tasks`,`logins`].includes(c[1])&&!(o instanceof Response)){let e=o.scope instanceof Response?void 0:o.scope??i.ctx;e&&Pn(e,e.organizationId)}return e.method!==`GET`&&s.ok&&!(l&&c.length===4&&c[2]&&[`heartbeat`,`logs`].includes(c[3]))&&!(u&&c.length===5&&c[3]&&[`steer`,`ask`,`approve`,`archive`].includes(c[4]))&&(l||u||c[1]===`admin`&&c[2]===`review`||c[1]===`admin`&&c[2]===`flows`&&c.length===5&&c[3]&&c[4]===`run`)&&Oe(t,u&&c.length===3&&e.method===`POST`),a=!!s.body&&(s.headers.get(`content-type`)??``).includes(`text/html`),a?uo(s,i.end):s}finally{a||i.end()}}function lo(e,t=[]){if(!t.length)return e;let n=new Headers(e.headers);for(let e of t)n.append(`set-cookie`,e);return new Response(e.body,{status:e.status,statusText:e.statusText,headers:n})}function uo(e,t){let n=e.body.getReader(),r=new ReadableStream({async pull(e){try{let{done:r,value:i}=await n.read();r?(t(),e.close()):e.enqueue(i)}catch(n){t(),e.error(n)}},cancel(e){return t(),n.cancel(e)}});return new Response(r,e)}async function fo(e={}){let t=e.env??q.env,n=dr(t,e.host??`node`),r=e.runner??n.runner;if((e.host===`vercel`||t.VERCEL)&&(r===`local`||r===`local-docker`))throw new d(`invalid-option`,`The ${r} runner cannot run on Vercel.`,{hint:`Leave RUNNER unset to use vercel-sandbox.`});if(n.store===`memory`&&r!==`local`&&r!==`local-docker`)throw new d(`invalid-option`,`The ${r} runner needs a database.`,{hint:`Set DATABASE_URL, or use RUNNER=local for a memory server.`});if(!n.publicUrl)throw new d(`invalid-option`,`PUBLIC_URL is required to start a Coder server.`,{hint:`Set PUBLIC_URL to the address platforms and browsers use.`});let i=[];if(n.store===`memory`&&!e.local&&i.push(`test server, not for production: everything is in memory, nothing survives a restart, no sign-in; set DATABASE_URL for a real deployment`),!t.SERVER_ENCRYPTION_KEY&&!e.local&&i.push(`secrets are stored unencrypted; set SERVER_ENCRYPTION_KEY (openssl rand -base64 32)`),n.store===`postgres`&&!n.encryptionKey)throw new d(`invalid-option`,`SERVER_ENCRYPTION_KEY is required for a Postgres server.`,{hint:`Set SERVER_ENCRYPTION_KEY (openssl rand -base64 32); sign-in keys derive from it.`});let a=te(n.integrations),o=n.store===`memory`&&!n.adminToken?Fr(18).toString(`base64url`):void 0;n.store===`postgres`&&n.adminToken&&i.push(`ADMIN_TOKEN is ignored with Postgres; owners and admins sign in with coder auth login`);let s={...n,...n.store===`postgres`?{adminToken:void 0}:{},...o?{adminToken:o}:{},...e.runner?{runner:e.runner}:{}},c=await lr(s,{local:!!e.local});try{s.store===`memory`&&await Cr(c.store(c.defaultOrganizationId),Date.now());let n=c.connection&&s.auth?await(await import(`./auth-DuXnSNf9.js`)).createAuth(c.connection.db,s):void 0,r=e.cwd??q.cwd(),l=c.store(c.defaultOrganizationId),u=gr({kind:s.runner,workDir:s.workDir,config:s.runnerConfig,local:!(e.host===`vercel`||t.VERCEL),sandbox:{region:hr(s.databaseUrl),snapshots:yr(l)}});if(!u[s.runner])throw await c.close(),new d(`invalid-option`,`Runner ${s.runner} is not configured.`,{hint:`Set RUNNER_CONFIG to JSON containing url and secret.`});let f=new Ut,p=new tt,m=new Ca,h=new Map,g=new Map,_=new ma,v=new ga,y=t=>{let i=h.get(t);if(i)return i;let o=c.store(t),l=new Map,d={registry:m},b={limits:p,...c.connection?{databaseHealth:async()=>{await c.connection.db.execute(jr`select 1`)},statementTimeout:c.connection.statementTimeout}:{},config:s,settings:d,organizationId:t,integrations:a,runners:u,store:o,queue:c.queue,requestScopes:g,taskWatcher:_,logWatcher:v,dashboardHosts:f,dbProfile:c.connection?.profile,chatState:c.chatState,fileReads:l,repositoryLists:new Map,loadAgent:vt(a,{...e.local?{cwd:r}:{},config:s,store:o,fileReads:l,settings:d}),...n?{auth:n}:{},scope:y,webhookTarget:(e,t)=>c.webhookTarget(e,t),appRecord:e=>c.appRecord(e),apps:e=>c.apps(e),installationOrganization:e=>c.installationOrganization(e),installations:e=>c.installations(e),serverOrganizationId:c.defaultOrganizationId,taskOrganization:(e,t)=>c.taskOrganization(e,t),...e.local?{local:e.local}:{}};return h.set(t,b),b};globalThis.__coder={handle:e=>so(e,y(c.defaultOrganizationId),{inProcess:!0})};let b=y(c.defaultOrganizationId);b.local&&fn(b).catch(()=>{});let x;return e.local&&(await Be(b),x=setImmediate(()=>{ur(b).catch(()=>void 0)})),{config:s,context:y,defaultContext:b,warnings:i,...o?{mintedToken:o}:{},sweep:c.sweep,close:async()=>{m.close(),_.close(),v.close(),x&&clearImmediate(x),await b.local?.usageSync?.catch(()=>void 0),await Ye(b),await c.close()}}}catch(e){throw await c.close(),e}}var po=e({serve:()=>bo,serverHandler:()=>go});const mo=36e5;function ho(e){try{let t=new URL(e);return R.has(t.hostname)?Number(t.port||(t.protocol===`https:`?443:80)):void 0}catch{return}}function go(e=q.env,t=e.VERCEL?`vercel`:`node`){fr();let n,r,i=()=>n??=fo({env:e,host:t}).catch(e=>{throw n=void 0,e}),a=e=>Promise.all([e.sweep(),Ae(e.defaultContext,!1,!0),en(e.defaultContext)]).then(()=>void 0);return Object.assign(async(t,n)=>{let o=await i(),s=n?e=>n(e):e=>void e.catch(()=>{}),c=Date.now();(r===void 0||c-r>=mo)&&(r=c,s(o.defaultContext.store.create(`delivery`,`maintenance:${o.config.publicUrl}`,{at:c},{ttlMs:mo}).then(e=>e?a(o):void 0).catch(e=>console.error(`coder server: maintenance failed`,e))));let l=e=>({...o.context(e),waitUntil:s,scope:l});return so(t,l(o.defaultContext.organizationId),{clientIp:e.VERCEL?t.headers.get(`x-forwarded-for`)?.split(`,`,1)[0]?.trim():void 0})},{scheduled:async()=>{let e=await i();await a(e)},close:async()=>{let e=n;n=void 0,r=void 0,await(await e)?.close()}})}function _o(e){let t=Nr(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-t`],{encoding:`utf8`}),n=Number(t.stdout?.split(`
12
+ `)[0]);if(n)return{pid:n,command:Nr(`ps`,[`-o`,`command=`,`-p`,String(n)],{encoding:`utf8`}).stdout?.trim().slice(0,120)||`another process`}}function vo(e){let t=_o(e),n=t&&/\bcoder (dash|server serve)\b/.test(t.command);return new d(`server`,t?n?`Coder is already running on port ${e} (pid ${t.pid}): http://localhost:${e}`:`Port ${e} is in use by ${t.command} (pid ${t.pid}).`:`Port ${e} is in use.`,{hint:t?`Stop it with \`kill ${t.pid}\`, or use another port: --port ${e+1}`:`Use another port: --port ${e+1}`})}async function yo(e={}){fr();let t=e.env??q.env;if(e.runner&&!vr.includes(e.runner))throw new d(`invalid-option`,`Invalid --runner value: use ${vr.join(`, `)}`);if(e.port!==void 0&&(!Number.isInteger(e.port)||e.port<1||e.port>65535))throw new d(`invalid-option`,`Invalid port: use 1 through 65535.`);let n=t.PORT&&/^\d+$/.test(t.PORT)?Number(t.PORT):void 0,r=ho(t.PUBLIC_URL),i=e.port??n??r??8787;if(!Number.isInteger(i)||i<1||i>65535)throw new d(`invalid-option`,`Invalid PORT: use 1 through 65535.`);let a=t.PUBLIC_URL?t:{...t,PUBLIC_URL:`http://localhost:${i}`},o=!!(t.DATABASE_URL||t.POSTGRES_URL);if(o&&e.memory)throw new d(`invalid-option`,`A memory server cannot use DATABASE_URL.`,{hint:`Unset DATABASE_URL, or drop --memory.`});let s=(e.host??t.HOST??(o?void 0:`127.0.0.1`))?.replace(/^\[(.*)\]$/,`$1`),c=!o&&!e.memory;if(c&&!R.has(s))throw new d(`invalid-option`,`A local server listens on loopback only.`,{hint:`Reach it through a tunnel or a proxy on this machine; set DATABASE_URL for a deployment, or use --memory for a test server.`});if(e.memory&&t.VERCEL)throw new d(`invalid-option`,`A memory server cannot run on Vercel.`,{hint:`Set DATABASE_URL for a real deployment.`});let l,u,f=c?new Promise((e,t)=>{u=t,l=()=>{Kr().then(e,t)}}):void 0,p=f?.then(()=>void 0).catch(()=>void 0),m=c?{cwd:e.cwd??q.cwd(),port:i,cacheMaintenance:p}:void 0,h=await fo({cwd:e.cwd,env:a,runner:e.runner,...m?{local:m}:{}}),g=h.defaultContext,_=()=>{h.sweep().catch(e=>console.error(`coder server: sweep failed`,e))};_();let v=setInterval(_,mo);v.unref();let y=setInterval(()=>{Ae(g,!1,!0).catch(e=>console.error(`coder server: scheduled kick failed`,e)),en(g).catch(e=>console.error(`coder server: inbox flush failed`,e))},6e4);y.unref();let b=zr.createServer(fe((e,t)=>so(e,g,{clientIp:t}),{admit:e=>o||Ct(e.socket.remoteAddress,e.url??`/`)})),x=h.config.publicUrl;r!==void 0&&r!==i&&h.warnings.push(`PUBLIC_URL points at port ${r} but the server listens on ${i}`),await new Promise((e,t)=>{b.once(`error`,t),b.listen(i,s,e)}).catch(async e=>{throw u?.(e),clearInterval(y),clearInterval(v),await h.close(),e.code===`EADDRINUSE`?vo(i):e}),l?.();let S=!1,ee=async()=>{S||(S=!0,clearInterval(y),clearInterval(v),g.taskWatcher?.close(),g.logWatcher?.close(),await new Promise((e,t)=>b.close(n=>n?t(n):e())),await p,await h.close())},C=g.auth?`Wular Auth (${g.auth.issuer})`:void 0,w=`http://localhost:${i}`,te=Ie(g),ne=te===`local`?w:x,re=h.config.store===`memory`?h.mintedToken??t.ADMIN_TOKEN:void 0;return{address:w,publicUrl:x,warnings:h.warnings,close:ee,runner:h.config.runner,store:h.config.store,mode:te,...f?{cacheMigration:f}:{},maxTasks:h.config.maxTasks??h.config.limits?.concurrentTasks??10,...C?{signIn:C}:{},...h.mintedToken?{mintedToken:h.mintedToken}:{},...h.config.store===`postgres`&&t.DATABASE_URL?{database:Ar(t.DATABASE_URL)}:{},...R.has(new URL(ne).hostname)?{dashboard:`${ne}/dash${re?`#token=${encodeURIComponent(re)}`:``}`}:{}}}async function bo(e={}){try{return await yo(e)}catch(e){if(e instanceof d)throw e;let t=e instanceof Error&&e.cause instanceof Error?`: ${e.cause.message}`:``;throw new d(`server`,`${e instanceof Error?e.message:String(e)}${t}`)}}export{Oa as a,Ta as i,po as n,Ea as o,go as r,bo as t};
@@ -0,0 +1,4 @@
1
+ import{F as e,wi as t}from"./core-DwsAMCnL.js";import{d as n,g as r,h as i,u as a}from"./args-CbO_Ck9Z.js";import{Pn as o}from"./zod-BoqHoRCH.js";import{randomUUID as s}from"node:crypto";const c=`2025-11-25`,l=[c,`2025-06-18`,`2025-03-26`,`2024-11-05`],u=(e,t,n)=>({jsonrpc:`2.0`,...e===void 0?{}:{id:e},error:{code:t,message:n}}),d=e=>{if(typeof e!=`object`||!e||Array.isArray(e))return!1;let{jsonrpc:t,method:n,id:r}=e;return t===`2.0`&&(n===void 0||typeof n==`string`)&&(r===void 0||typeof r==`string`||typeof r==`number`)},f=e=>{let t=e?.id;return typeof t==`string`||typeof t==`number`?t:void 0};function p(e){let t=new Map;return async({id:n,method:r,params:i={}},a=``)=>{if(r===void 0)return;if(n===void 0){r===`notifications/cancelled`&&t.get(a)?.get(i.requestId)?.abort();return}let o=t.get(a);o||t.set(a,o=new Map);let s=new AbortController;o.set(n,s);try{if(r===`initialize`){let t=i.protocolVersion;return{jsonrpc:`2.0`,id:n,result:{protocolVersion:l.includes(t)?t:c,capabilities:e.capabilities,serverInfo:{name:e.name,version:`0`},...e.instructions?{instructions:e.instructions}:{}}}}let t=r===`ping`?()=>({}):Object.hasOwn(e.handlers,r)?e.handlers[r]:void 0;return t?{jsonrpc:`2.0`,id:n,result:await t(i,s.signal)}:u(n,-32601,`Method not found: ${r}`)}catch(e){let t=e.code;return u(n,typeof t==`number`?t:-32603,String(e?.message??e))}finally{o.delete(n),o.size||t.delete(a)}}}function m(e){let t=p(e),n=(e,t,n,r)=>{e.writeHead(t,{...n?{"content-type":`application/json`}:{},...r?{"mcp-session-id":r}:{},...t===405?{allow:`POST`}:{}}),e.end(n?JSON.stringify(n):void 0)},r=async(e,r)=>{if(e.method!==`POST`)return n(r,405);let{origin:i,host:a}=e.headers;if(i!==void 0&&i!==`http://${a}`)return n(r,403);let o=e.headers[`mcp-protocol-version`];if(typeof o==`string`&&!l.includes(o))return n(r,400,u(void 0,-32600,`Unsupported protocol version: ${o}`));let s=``;e.setEncoding(`utf8`);for await(let t of e)s+=t;let c;try{c=JSON.parse(s)}catch{return n(r,400,u(void 0,-32700,`Parse error`))}if(!d(c))return n(r,400,u(f(c),-32600,`Invalid request`));let p=c.method===`initialize`&&c.id!==void 0,m=e.headers[`mcp-session-id`],h=p?crypto.randomUUID():typeof m==`string`?m:``,g=await t(c,h).catch(()=>u(c.id,-32603,`Internal error`));if(!g)return n(r,202);n(r,200,g,p?h:void 0)};return(e,t)=>{r(e,t).catch(()=>t.destroy())}}function h(e){let t=p(e),n=e=>process.stdout.write(`${JSON.stringify(e)}\n`),r=new Promise(e=>process.stdin.once(`end`,e)),i=``,a=e=>{i+=e;for(let e=i.indexOf(`
2
+ `);e>=0;e=i.indexOf(`
3
+ `)){let r=i.slice(0,e).trim();if(i=i.slice(e+1),!r)continue;let a;try{a=JSON.parse(r)}catch{n(u(void 0,-32700,`Parse error`));continue}if(!d(a)){n(u(f(a),-32600,`Invalid request`));continue}let{id:o}=a;t(a).catch(()=>o===void 0?void 0:u(o,-32603,`Internal error`)).then(e=>e&&n(e))}};return process.stdin.setEncoding(`utf8`),process.stdin.on(`data`,a),{close:async()=>{process.stdin.off(`data`,a),process.stdin.pause()},done:r}}const g=e=>({type:`text`,text:e}),_=e=>({content:[g(e)],isError:!0}),v=e=>e.replace(/[^A-Za-z0-9_-]/g,`_`);function y(s){let{commands:c,skills:l}=a(s),u=new Map;for(let e of c)if(e.command.mcp!==!1){if(u.has(e.id))throw Error(`contextjsx: two commands have the tool id "${e.id}"`);u.set(e.id,e)}let d=new Map;for(let e of l){let{name:t}=i(e);if(d.has(t))throw Error(`contextjsx: two skills are named "${t}"`);d.set(t,e)}let f=new Map;for(let e of[...u.keys(),...d.size?[`load_skill`]:[]]){let t=f.get(v(e));if(t!==void 0)throw Error(`contextjsx: tools "${t}" and "${e}" both map to ${v(e)}`);f.set(v(e),e)}let p=new Map,m=({id:t,command:n})=>{let r=p.get(t);return r||p.set(t,r=e(o(n.args??{}),{io:`input`})),r},h=[...(s.resources??[]).map(e=>({uri:e.uri,name:e.name??e.uri,description:e.description,mimeType:e.mimeType,read:()=>e.read()})),...[...u.values()].map(({id:e,path:t,command:r})=>({uri:`${s.name}://help/${e}`,name:`help ${t.join(` `)}`,description:r.description,mimeType:`text/plain`,read:()=>n(s,r)}))];return{name:s.name,instructions:r(s),capabilities:h.length?{tools:{},resources:{}}:{tools:{}},handlers:{"tools/list":()=>({tools:[...[...u.values()].map(e=>({name:e.id,description:(e.command.mcp||void 0)?.description??e.command.description,inputSchema:m(e),annotations:{readOnlyHint:e.command.access===`read`}})),...d.size?[{name:`load_skill`,description:`Load a skill named in the server instructions; returns its full text`,inputSchema:{type:`object`,properties:{name:{type:`string`,description:`skill name`}},required:[`name`]},annotations:{readOnlyHint:!0}}]:[]]}),"tools/call":async(e,n)=>{let r=e.name,a=e.arguments??{};if(r===`load_skill`&&d.size){let e=d.get(a.name);return e?{content:[g(i(e).text)]}:_(`Unknown skill ${JSON.stringify(a.name)}. Skills: ${[...d.keys()].join(`, `)}`)}let s=u.get(r);if(!s)throw Object.assign(Error(`Unknown tool ${r}`),{code:-32602});let{command:c}=s,l=o(c.args??{}).safeParse(a);if(!l.success)return _(`Invalid arguments for ${r}:\n${t(l.error)}\n\nSchema: ${JSON.stringify(m(s))}`);try{let e=await c.run(l.data,{signal:n}),t=c.mcp&&c.mcp.text?c.mcp.text(e):typeof e==`string`?e:JSON.stringify(e)??``,r=c.next?.({result:e,args:l.data}).map(e=>`${e.usage} # ${e.blurb}`);return{content:[g(t),...r?.length?[g(r.join(`
4
+ `))]:[]]}}catch(e){return _(String(e?.message??e))}},"resources/list":()=>({resources:h.map(({uri:e,name:t,description:n,mimeType:r})=>({uri:e,name:t,description:n,...r?{mimeType:r}:{}}))}),"resources/read":async e=>{let t=h.find(t=>t.uri===e.uri);if(!t)throw Object.assign(Error(`Unknown resource ${e.uri}`),{code:-32002});return{contents:[{uri:t.uri,...t.mimeType?{mimeType:t.mimeType}:{},text:await t.read()}]}}}}}async function b(e,t){let n=y(e);if(t===`stdio`)return h(n);let r=`127.0.0.1`,i=s(),a=m(n),{createServer:o}=await import(`node:http`),c=o((t,n)=>{if(t.headers.authorization!==`Bearer ${i}`)return n.statusCode=401,n.end();if((t.url??`/`).split(`?`)[0]!==`/${e.name}`)return n.statusCode=404,n.end();a(t,n)});return await new Promise((e,n)=>{c.once(`error`,n),c.listen(t.http.port??0,r,()=>{c.off(`error`,n),e()})}),{url:`http://${r}:${c.address().port}/${e.name}`,token:i,close:()=>new Promise(e=>{c.closeAllConnections(),c.close(()=>e())})}}export{b as serve};
@@ -1,5 +1,5 @@
1
- import{Ar as e,Cr as t,Or as n,Sr as r,_r as i,br as a,gr as o,hr as s,yr as c}from"./prompts-CEf7z4i_.js";import{t as l}from"./types-D_xnfP7m.js";import{createHash as u,createHmac as d,randomUUID as f,timingSafeEqual as ee}from"node:crypto";import{isIP as te}from"node:net";function p(e,t){let n=typeof e==`string`?Buffer.from(e):e,r=typeof t==`string`?Buffer.from(t):t;return n.length===r.length&&ee(n,r)}const ne=e=>u(`sha256`).update(e).digest(`base64url`),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 g(e,t){return e.hook.before(`request`,e=>{e.request={...e.request,fetch:t}}),e}async function _(e,t=fetch){let[{createGitHubAdapter:n},{ConsoleLogger:r}]=await Promise.all([import(`./dist-B2jiMMxZ.js`),import(`./dist-DAnSqY1s.js`).then(e=>e.a)]);return g(n({...typeof e==`string`?{installationToken:e}:e,apiUrl:m,webhookVerifier:()=>!1,logger:new r(`error`)}).octokit,t)}const v=e=>t=>{if(!e.includes(t.status??0))throw t},y=e=>{let[t=``,n=``]=e.split(`/`);return{owner:t,repo:n}};async function re(e,t,n,r){let i=await(await _(n)).repos.getContent({...y(e),path:t,...r?{ref:r}:{},mediaType:{format:`raw`}}).catch(v([404]));return typeof i?.data==`string`?i.data:void 0}async function ie(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 ae(e,t,n){let r=await(await _(n)).repos.getCommit({...y(e),ref:t,mediaType:{format:`sha`}}).catch(v([404,422]));return r?String(r.data).trim():void 0}async function oe(e,t,n,r=`HEAD`){let i=await _(n),a=y(e),o=`${t}/`,s=await i.git.getTree({...a,tree_sha:r,recursive:`1`}).catch(v([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 se(e,t,n,r){let i=await(await _(n)).repos.getContent({...y(e),path:t,...r?{ref:r}:{}}).catch(v([404]));return Array.isArray(i?.data)?i.data.map(e=>e.name):[]}async function ce(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 le(e,t){let{data:n}=await(await _(t)).pulls.list({...y(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 ue(e,t){let{data:n}=await(await _(t)).repos.get(y(e));return{owner:n.owner.login,name:n.name,cloneUrl:n.clone_url,defaultBranch:n.default_branch}}async function de(e,t,n,r){let i=await(await _(n,r)).repos.getCollaboratorPermissionLevel({...y(e),username:t}).catch(()=>void 0);return[`admin`,`maintain`,`write`].includes(i?.data.permission??``)}function fe(e,t,n){let r=`https://github.com/${e}`;return t?`${r}/tree/${n??`HEAD`}/${t}`:r}var b=class extends Error{code;error;constructor(e,t,n){super(n??(t?`${e} (${t})`:e)),this.code=e,this.error=t}};const x={read:[`read`],write:[`read`,`write`]};function pe(e,t,n){return{name:`github`,command:`github-mcp-server`,args:[`stdio`,`--toolsets=all`,...e.includes(`write`)?[]:[`--read-only`]],env:{GITHUB_PERSONAL_ACCESS_TOKEN:n}}}function me(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 he(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 ge(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 S=`https://github.com/login/oauth`,C=e=>`${e.replace(/\/$/,``)}/install/github/callback`;function w(e){let{clientId:t,clientSecret:n}=e;if(!t||!n)throw Error(`This GitHub App has no OAuth client; create it again from the dashboard`);return{clientId:t,clientSecret:n}}async function T(e,t,n,r){let{clientId:i,clientSecret:a}=w(e),o=await n(`${S}/access_token`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:i,client_secret:a,...t})}),s=await o.json().catch(()=>({}));if(!o.ok||!s.access_token)throw new b(`platform-error`,s.error??String(o.status),`GitHub authorization failed: ${s.error??o.status}`);return{accessToken:s.access_token,...s.refresh_token?{refreshToken:s.refresh_token}:{},...s.expires_in?{expiresAt:r+s.expires_in*1e3}:{}}}async function _e(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 ve(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 E(e){let{createAppAuth:t}=await import(`./dist-node-Bv1kCqyi.js`).then(e=>e.n),{token:n}=await t({appId:e.appId,privateKey:e.privateKey})({type:`app`});return n}async function ye(e,t,n=fetch){let r=await E(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 D(e,t,n,r){let i=new URL(e.url).searchParams.get(`code`);if(!i)throw new b(`missing-code`);let a=await T(t,{code:i,...n?{redirect_uri:n}:{}},r,Date.now()),o=await _e(a.accessToken,r);return{id:String(o.id),login:o.login,token:JSON.stringify(a),accessToken:a.accessToken}}const be={authorizeUrl(e,{publicUrl:t,state:n}){let r=new URLSearchParams({client_id:w(e).clientId,redirect_uri:`${t.replace(/\/$/,``)}/connect/github/callback`,state:n});return`${S}/authorize?${r}`},async exchange(e,t,{publicUrl:n,fetch:r}){let{accessToken:i,...a}=await D(e,t,`${n.replace(/\/$/,``)}/connect/github/callback`,r);return a},async access(e,t,{fetch:n,now:r}){let i=JSON.parse(e);if(!i.expiresAt||i.expiresAt-3e5>r||!i.refreshToken)return{accessToken:i.accessToken};let a=await T(t,{grant_type:`refresh_token`,refresh_token:i.refreshToken},n,r);return{accessToken:a.accessToken,refreshed:JSON.stringify(a)}}};function xe(e){return Array.isArray(e)?l.find(t=>e.every(e=>x[t].includes(e)))??`write`:e}const Se={read:{metadata:`read`,contents:`read`,pull_requests:`write`,issues:`write`},write:{metadata:`read`,contents:`write`,pull_requests:`write`,issues:`write`}};function O(e=`write`){return{...Se[xe(e)]}}const k={pull_request:[`pull_request`],issue:[`issues`],comment:[`issue_comment`,`pull_request_review_comment`],mention:[`issue_comment`,`pull_request_review_comment`]};function Ce(e){return[...new Set([...e.flatMap(e=>k[e]??[]),`push`])]}function A(e,t,n,r){let i=t.integrations.github??{},a=Array.isArray(i.events)?i.events:Object.keys(i.events??{});return me(e,{name:t.name??n,description:t.description,permissions:{...O(t.access),...a.some(e=>Object.hasOwn(k,e))?{issues:`write`,pull_requests:`write`}:{}},events:Ce(a),isPublic:r})}const j=(e,t)=>t?.type===`Organization`?`https://github.com/organizations/${encodeURIComponent(t.login)}/settings/apps/${e}`:`https://github.com/settings/apps/${e}`,M={read:1,write:2,admin:3},we={read:`Read-only`,write:`Read and write`,admin:`Admin`},N=e=>e[0].toUpperCase()+e.slice(1).replaceAll(`_`,` `);async function Te(e,t,{publicUrl:n,definition:r,fetch:i}){let a=await i(`${m}/app`,{headers:h(await E(t))});if(!a.ok)throw Error(`GitHub app lookup failed: ${a.status}`);let o=await a.json(),s=A(n,r,e.agent),c=new Set(o.events??[]),l=o.permissions??{},u=[],d=s.description??``;d!==(o.description??``)&&u.push(d?{text:`Set the **Description**`,copy:d}:{text:`Clear the **Description**`});for(let[e,t]of Object.entries(s.default_permissions))(M[l[e]??``]??0)<(M[t]??0)&&u.push({text:`Set **${N(e)}** to **${we[t]??t}**`});for(let e of s.default_events)c.has(e)||u.push({text:`Check the **${N(e)}** event`});for(let e of c)s.default_events.includes(e)||u.push({text:`Uncheck the **${N(e)}** event`});let f=o.owner?.login?{login:o.owner.login,type:o.owner.type}:t.owner;return{url:`${j(o.slug??t.slug,f)}/permissions`,label:`Open app settings`,lines:u}}const Ee={builtin:`shared`,postOrigins:[`https://github.com`],createPost({publicUrl:e,state:t,definition:n,encodedState:r}){let i=A(e,n,t.agent,t.public===!0);return{url:he(t.owner,r),fields:{manifest:JSON.stringify(i)}}},async createCallback(e,{fetch:t}){let n=new URL(e.url).searchParams.get(`code`);if(!n)throw new b(`missing-code`);let r=await ge(n,t),i={appId:r.appId,slug:r.slug,privateKey:r.privateKey,webhookSecret:r.webhookSecret,clientId:r.clientId,clientSecret:r.clientSecret,...r.owner?{owner:r.owner}:{}};return{platformAppId:r.appId,name:r.slug,credentials:i}},accountUrl:({login:e})=>`https://github.com/${encodeURIComponent(e)}`,settingsUrl(e,t){let{slug:n,owner:r}=t;return r?j(n,r):void 0},drift:(e,t,n)=>Te(e,t,n),installUrl(e,t,{publicUrl:n,state:r,installation:i}){let{slug:a}=t;if(!i)return`https://github.com/apps/${a}/installations/new?state=${encodeURIComponent(r)}`;let o=new URLSearchParams({client_id:w(t).clientId,redirect_uri:C(n),state:r});return`${S}/authorize?${o}`},async installedApp(e,{apps:t,fetch:n}){let r=new URL(e.url).searchParams.get(`installation_id`);if(!(!r||!/^\d+$/.test(r))){for(let{app:e,credentials:i}of t)if(await ye(i,r,n).catch(t=>(console.error(`coder server: 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 b(`missing-code`);let{accessToken:o,...s}=await D(e,t,i?C(n):void 0,r),c=await ve(o,t.appId,a,r);if(!c)throw new b(`not-yours`);return{platformInstallId:a,account:c,installer:s.id,user:s}}};function P(e){return e&&typeof e==`object`?e:{}}function F(e){return e?.agent===!0||e?.type===`Bot`||e?.login?.endsWith(`[bot]`)===!0}function I(e,t){return[e,t].filter(e=>!!e).join(`
1
+ import{$t as e,Qt as t,an as n,cn as r,en as i,gn as a,in as o,mn as s,sn as c}from"./errors-XBA-Ls4n.js";import{t as l}from"./types-D_xnfP7m.js";import{createHash as u,createHmac as d,randomUUID as f,timingSafeEqual as ee}from"node:crypto";import{isIP as te}from"node:net";function p(e,t){let n=typeof e==`string`?Buffer.from(e):e,r=typeof t==`string`?Buffer.from(t):t;return n.length===r.length&&ee(n,r)}const ne=e=>u(`sha256`).update(e).digest(`base64url`),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 g(e,t){return e.hook.before(`request`,e=>{e.request={...e.request,fetch:t}}),e}async function _(e,t=fetch){let[{createGitHubAdapter:n},{ConsoleLogger:r}]=await Promise.all([import(`./dist-B2jiMMxZ.js`),import(`./dist-DAnSqY1s.js`).then(e=>e.a)]);return g(n({...typeof e==`string`?{installationToken:e}:e,apiUrl:m,webhookVerifier:()=>!1,logger:new r(`error`)}).octokit,t)}const v=e=>t=>{if(!e.includes(t.status??0))throw t},y=e=>{let[t=``,n=``]=e.split(`/`);return{owner:t,repo:n}};async function re(e,t,n,r){let i=await(await _(n)).repos.getContent({...y(e),path:t,...r?{ref:r}:{},mediaType:{format:`raw`}}).catch(v([404]));return typeof i?.data==`string`?i.data:void 0}async function ie(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 ae(e,t,n){let r=await(await _(n)).repos.getCommit({...y(e),ref:t,mediaType:{format:`sha`}}).catch(v([404,422]));return r?String(r.data).trim():void 0}async function oe(e,t,n,r=`HEAD`){let i=await _(n),a=y(e),o=`${t}/`,s=await i.git.getTree({...a,tree_sha:r,recursive:`1`}).catch(v([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 se(e,t,n,r){let i=await(await _(n)).repos.getContent({...y(e),path:t,...r?{ref:r}:{}}).catch(v([404]));return Array.isArray(i?.data)?i.data.map(e=>e.name):[]}async function ce(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 le(e,t){let{data:n}=await(await _(t)).pulls.list({...y(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 ue(e,t){let{data:n}=await(await _(t)).repos.get(y(e));return{owner:n.owner.login,name:n.name,cloneUrl:n.clone_url,defaultBranch:n.default_branch}}async function de(e,t,n,r){let i=await(await _(n,r)).repos.getCollaboratorPermissionLevel({...y(e),username:t}).catch(()=>void 0);return[`admin`,`maintain`,`write`].includes(i?.data.permission??``)}function fe(e,t,n){let r=`https://github.com/${e}`;return t?`${r}/tree/${n??`HEAD`}/${t}`:r}var b=class extends Error{code;error;constructor(e,t,n){super(n??(t?`${e} (${t})`:e)),this.code=e,this.error=t}};const x={read:[`read`],write:[`read`,`write`]};function pe(e,t,n){return{name:`github`,command:`github-mcp-server`,args:[`stdio`,`--toolsets=all`,...e.includes(`write`)?[]:[`--read-only`]],env:{GITHUB_PERSONAL_ACCESS_TOKEN:n}}}function me(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 he(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 ge(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 S=`https://github.com/login/oauth`,C=e=>`${e.replace(/\/$/,``)}/install/github/callback`;function w(e){let{clientId:t,clientSecret:n}=e;if(!t||!n)throw Error(`This GitHub App has no OAuth client; create it again from the dashboard`);return{clientId:t,clientSecret:n}}async function T(e,t,n,r){let{clientId:i,clientSecret:a}=w(e),o=await n(`${S}/access_token`,{method:`POST`,headers:{accept:`application/json`,"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:i,client_secret:a,...t})}),s=await o.json().catch(()=>({}));if(!o.ok||!s.access_token)throw new b(`platform-error`,s.error??String(o.status),`GitHub authorization failed: ${s.error??o.status}`);return{accessToken:s.access_token,...s.refresh_token?{refreshToken:s.refresh_token}:{},...s.expires_in?{expiresAt:r+s.expires_in*1e3}:{}}}async function _e(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 ve(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 E(e){let{createAppAuth:t}=await import(`./dist-node-Bv1kCqyi.js`).then(e=>e.n),{token:n}=await t({appId:e.appId,privateKey:e.privateKey})({type:`app`});return n}async function ye(e,t,n=fetch){let r=await E(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 D(e,t,n,r){let i=new URL(e.url).searchParams.get(`code`);if(!i)throw new b(`missing-code`);let a=await T(t,{code:i,...n?{redirect_uri:n}:{}},r,Date.now()),o=await _e(a.accessToken,r);return{id:String(o.id),login:o.login,token:JSON.stringify(a),accessToken:a.accessToken}}const be={authorizeUrl(e,{publicUrl:t,state:n}){let r=new URLSearchParams({client_id:w(e).clientId,redirect_uri:`${t.replace(/\/$/,``)}/connect/github/callback`,state:n});return`${S}/authorize?${r}`},async exchange(e,t,{publicUrl:n,fetch:r}){let{accessToken:i,...a}=await D(e,t,`${n.replace(/\/$/,``)}/connect/github/callback`,r);return a},async access(e,t,{fetch:n,now:r}){let i=JSON.parse(e);if(!i.expiresAt||i.expiresAt-3e5>r||!i.refreshToken)return{accessToken:i.accessToken};let a=await T(t,{grant_type:`refresh_token`,refresh_token:i.refreshToken},n,r);return{accessToken:a.accessToken,refreshed:JSON.stringify(a)}}};function xe(e){return Array.isArray(e)?l.find(t=>e.every(e=>x[t].includes(e)))??`write`:e}const Se={read:{metadata:`read`,contents:`read`,pull_requests:`write`,issues:`write`},write:{metadata:`read`,contents:`write`,pull_requests:`write`,issues:`write`}};function O(e=`write`){return{...Se[xe(e)]}}const k={pull_request:[`pull_request`],issue:[`issues`],comment:[`issue_comment`,`pull_request_review_comment`],mention:[`issue_comment`,`pull_request_review_comment`]};function Ce(e){return[...new Set([...e.flatMap(e=>k[e]??[]),`push`])]}function A(e,t,n,r){let i=t.integrations.github??{},a=Array.isArray(i.events)?i.events:Object.keys(i.events??{});return me(e,{name:t.name??n,description:t.description,permissions:{...O(t.access),...a.some(e=>Object.hasOwn(k,e))?{issues:`write`,pull_requests:`write`}:{}},events:Ce(a),isPublic:r})}const j=(e,t)=>t?.type===`Organization`?`https://github.com/organizations/${encodeURIComponent(t.login)}/settings/apps/${e}`:`https://github.com/settings/apps/${e}`,M={read:1,write:2,admin:3},we={read:`Read-only`,write:`Read and write`,admin:`Admin`},N=e=>e[0].toUpperCase()+e.slice(1).replaceAll(`_`,` `);async function Te(e,t,{publicUrl:n,definition:r,fetch:i}){let a=await i(`${m}/app`,{headers:h(await E(t))});if(!a.ok)throw Error(`GitHub app lookup failed: ${a.status}`);let o=await a.json(),s=A(n,r,e.agent),c=new Set(o.events??[]),l=o.permissions??{},u=[],d=s.description??``;d!==(o.description??``)&&u.push(d?{text:`Set the **Description**`,copy:d}:{text:`Clear the **Description**`});for(let[e,t]of Object.entries(s.default_permissions))(M[l[e]??``]??0)<(M[t]??0)&&u.push({text:`Set **${N(e)}** to **${we[t]??t}**`});for(let e of s.default_events)c.has(e)||u.push({text:`Check the **${N(e)}** event`});for(let e of c)s.default_events.includes(e)||u.push({text:`Uncheck the **${N(e)}** event`});let f=o.owner?.login?{login:o.owner.login,type:o.owner.type}:t.owner;return{url:`${j(o.slug??t.slug,f)}/permissions`,label:`Open app settings`,lines:u}}const Ee={builtin:`shared`,postOrigins:[`https://github.com`],createPost({publicUrl:e,state:t,definition:n,encodedState:r}){let i=A(e,n,t.agent,t.public===!0);return{url:he(t.owner,r),fields:{manifest:JSON.stringify(i)}}},async createCallback(e,{fetch:t}){let n=new URL(e.url).searchParams.get(`code`);if(!n)throw new b(`missing-code`);let r=await ge(n,t),i={appId:r.appId,slug:r.slug,privateKey:r.privateKey,webhookSecret:r.webhookSecret,clientId:r.clientId,clientSecret:r.clientSecret,...r.owner?{owner:r.owner}:{}};return{platformAppId:r.appId,name:r.slug,credentials:i}},accountUrl:({login:e})=>`https://github.com/${encodeURIComponent(e)}`,settingsUrl(e,t){let{slug:n,owner:r}=t;return r?j(n,r):void 0},drift:(e,t,n)=>Te(e,t,n),installUrl(e,t,{publicUrl:n,state:r,installation:i}){let{slug:a}=t;if(!i)return`https://github.com/apps/${a}/installations/new?state=${encodeURIComponent(r)}`;let o=new URLSearchParams({client_id:w(t).clientId,redirect_uri:C(n),state:r});return`${S}/authorize?${o}`},async installedApp(e,{apps:t,fetch:n}){let r=new URL(e.url).searchParams.get(`installation_id`);if(!(!r||!/^\d+$/.test(r))){for(let{app:e,credentials:i}of t)if(await ye(i,r,n).catch(t=>(console.error(`coder server: 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 b(`missing-code`);let{accessToken:o,...s}=await D(e,t,i?C(n):void 0,r),c=await ve(o,t.appId,a,r);if(!c)throw new b(`not-yours`);return{platformInstallId:a,account:c,installer:s.id,user:s}}};function P(e){return e&&typeof e==`object`?e:{}}function F(e){return e?.agent===!0||e?.type===`Bot`||e?.login?.endsWith(`[bot]`)===!0}function I(e,t){return[e,t].filter(e=>!!e).join(`
2
2
 
3
- `)}const De=[`OWNER`,`MEMBER`],Oe=[`issue_comment`,`pull_request_review_comment`,`ping`];function L(e){try{return JSON.parse(e)}catch{return}}function R(e,t,n){if(!n||!t?.startsWith(`sha256=`))return!1;let r=Buffer.from(d(`sha256`,n).update(e).digest(`hex`),`hex`);return p(Buffer.from(t.slice(7),`hex`),r)}function z(e,t,n,r,i){let a=n.installation?.id,o=B(n),s=i.user??n.sender;if(a===void 0||!o||!i.number)return;let c=s?.author_association;return{integration:`github`,type:r,appId:t.id,installationId:String(a),deliveryId:e.headers.get(`x-github-delivery`)??``,actor:{id:String(s?.id??s?.login??``),...s?.login?{login:s.login}:{},...c?{role:c}:{},...F(s)?{agent:!0}:{}},text:i.body??``,repo:o,chat:{thread:V(`${o.owner}/${o.name}`,i.number,i.kind===`pull`)}}}function B(e){let t=e.repository;return t?.owner?.login&&t.name&&t.clone_url&&t.default_branch?{owner:t.owner.login,name:t.name,cloneUrl:t.clone_url,defaultBranch:t.default_branch}:void 0}function V(e,t,n){return{_type:`chat:Thread`,adapterName:`github`,channelId:`github:${e}`,id:`github:${e}:${n?``:`issue:`}${t}`,isDM:!1}}function ke(e,t,n,r){let i=P(t),a=e.headers.get(`x-github-event`);if(a===`pull_request`){let t=i.pull_request,a=i.action??``,o=i.requested_reviewer?.login?.toLowerCase();if(!t||![`opened`,`synchronize`,`reopened`,`ready_for_review`,`review_requested`].includes(a)||a===`review_requested`&&o!==`${r.slug}[bot]`.toLowerCase()||t.draft||a!==`review_requested`&&F(t.user)||!t.number||t.head?.repo?.full_name!==i.repository?.full_name)return[];let s=z(e,n,i,`pull_request`,{user:i.sender??t.user,body:I(t.title,t.body),number:t.number,kind:`pull`});return s?[s]:[]}if(a===`issues`){let t=i.issue;if(!t||![`opened`,`edited`].includes(i.action??``)||F(i.sender??t.user)||!t.number)return[];let r=z(e,n,i,`issue`,{user:i.sender??t.user,body:I(t.title,t.body),number:t.number});return r?[r]:[]}return[]}async function Ae(e,t,n={},r){let{token:i,expiresAt:a}=await(await _({appId:e.appId,privateKey:e.privateKey,installationId:Number(t)},r)).auth({type:`installation`,installationId:t,...n.repositories?{repositoryNames:n.repositories}:{},...n.permissions?{permissions:n.permissions}:{}});return{token:i,expiresAt:Date.parse(a)}}function je(e,t){let{appId:n,privateKey:r}=e,{repositories:i,permissions:a}=H(t);return u(`sha256`).update(JSON.stringify([n,r,i?[...i].sort():null,a?Object.entries(a).sort():null])).digest(`base64url`)}const Me={installation:[`created`,`deleted`,`suspend`,`unsuspend`,`new_permissions_accepted`],installation_repositories:[`added`,`removed`],repository:[`created`,`deleted`,`renamed`]};function Ne(e,t,n){let r=P(t),i=r.installation?.id,a=r.action;if(i===void 0||!Me[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 Pe(e,t){let n=P(e),r=n.repository?.full_name,i=t.branch??n.repository?.default_branch;if(!r||r!==t.agentsRepo||!i||n.ref!==`refs/heads/${i}`||!n.after||!n.commits)return;let a=[...new Set(n.commits.flatMap(e=>[...e.added??[],...e.modified??[],...e.removed??[]]))].filter(e=>e.startsWith(`.coder/agents/`));return a.length?{repo:r,ref:n.after,branch:i,paths:a}:void 0}function Fe(e,t){let n=P(e),r=n.repository?.full_name,i=n.ref?.startsWith(`refs/heads/`)&&n.ref.slice(11),a=n.installation?.id;if(!r||!i||a===void 0)return;let o=n.commits??[],s=o.flatMap(e=>[...e.added??[],...e.modified??[],...e.removed??[]]);if(!(o.length&&o.length<2048&&!s.some(e=>e.startsWith(`.coder/`))))return{installation:`${t.id}:${a}`,repo:r,branch:i,...n.repository?.default_branch?{defaultBranch:n.repository.default_branch}:{}}}function H(e={}){return{...e.repo?{repositories:[e.repo.name]}:{},...e.tools?{permissions:O(e.tools)}:{}}}const Ie={id:`github`,brand:{color:`#000000`,icon:`M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12`,dark:`#fff`,svg:`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 98 96" fill="none" style="color:light-dark(#000,#fff)"><g clip-path="url(#github-mark-4)"><path d="M 41.44 69.38 C 28.81 67.85 19.91 58.76 19.91 46.99 C 19.91 42.21 21.63 37.04 24.5 33.59 C 23.26 30.43 23.45 23.73 24.88 20.96 C 28.71 20.48 33.88 22.49 36.94 25.27 C 40.58 24.12 44.41 23.54 49.1 23.54 C 53.79 23.54 57.61 24.12 61.06 25.17 C 64.03 22.49 69.29 20.48 73.12 20.96 C 74.46 23.54 74.65 30.24 73.4 33.5 C 76.47 37.13 78.09 42.01 78.09 46.99 C 78.09 58.76 69.19 67.66 56.37 69.29 C 59.62 71.39 61.82 75.99 61.82 81.25 L 61.82 91.21 C 61.82 94.08 64.22 95.7 67.09 94.55 C 84.41 87.95 98 70.63 98 49.19 C 98 22.11 75.99 0 48.9 0 C 21.82 0 0 22.11 0 49.19 C 0 70.44 13.49 88.05 31.68 94.65 C 34.26 95.61 36.75 93.88 36.75 91.3 L 36.75 83.64 C 35.41 84.22 33.69 84.6 32.16 84.6 C 25.84 84.6 22.11 81.16 19.43 74.74 C 18.38 72.16 17.23 70.63 15.03 70.34 C 13.88 70.25 13.49 69.77 13.49 69.19 C 13.49 68.04 15.41 67.18 17.32 67.18 C 20.1 67.18 22.49 68.91 24.98 72.45 C 26.89 75.22 28.9 76.47 31.29 76.47 C 33.69 76.47 35.22 75.61 37.42 73.4 C 39.05 71.78 40.29 70.34 41.44 69.38 Z" fill="black" style="fill:currentColor"/></g><defs><clipPath id="github-mark-4"><rect width="98" height="96" fill="white"/></clipPath></defs></svg>`},name:`GitHub`,featured:!0,description:`Pull requests, issues, and comments on GitHub repositories`,installLabel:`Connect GitHub`,use:`Mention @{handle} in an issue or pull request.`,organizationApps:!0,publicApps:!0,prompt:[`A conversation is an issue or pull request with its comments, or one inline review comment thread.`,`issue_read reads an issue and its comments. pull_request_read reads a pull request: get, get_diff and get_files for the change, get_comments for its conversation, get_reviews and get_review_comments for reviews and inline comments.`,`Review findings are inline review comments marked coder-review:fp.`,`A task starts on the default branch; a pull request's changes are read with pull_request_read. Check out and push a pull request's branch only when it is in this repository and the request asks for changes; a fork pull request gets reads and comments only.`,`Replies are GitHub Markdown. Cite repository file paths when discussing code; link the pull request after making changes.`].join(`
4
- `),sample:`github:owner/repo:1`,author:e=>`${e}[bot]`,events:{mention:{description:`Comment from a repo owner or org member mentioning @<agent>; text has the mention stripped.`,on:`mention`,addressed:!0},pull_request:{description:`Opened, updated, or ready non-draft pull request.`},issue:{description:`Opened or edited issue.`},comment:{description:`New non-agent issue, pull request, or inline review comment.`,on:`message`,noisy:!0}},tools:{presets:x,server:pe,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`],get app(){return Ee},auth:{token:async(e,t,n,{fetch:r,hold:i}={})=>{let a=()=>Ae(t,e.id.split(`:`).pop(),H(n),r);return i?i(je(t,n),a):(await a()).token},get user(){return be},canWrite:async(e,t,n)=>!!(e.repo&&e.actor.login)&&de(`${e.repo.owner}/${e.repo.name}`,e.actor.login,t,n)},repos:{cloneHosts:[`github.com`],credentialUsername:`x-access-token`,readFile:re,revalidate:ie,listDir:se,tree:oe,commit:ae,list:(e,t,n)=>ce(t,n),get:ue,url:fe,pullRequests:le,pullRequest:e=>{let t=/^github:[^:]+:(\d+)(?::|$)/.exec(e.chat?.thread.id??``);return t?Number(t[1]):void 0},pullRequestThread:(e,t)=>V(e,t,!0)},target(e,t){let n=e.headers.get(`x-github-hook-installation-target-id`);if(!n)return;let r=P(L(t)),i=B(r),a=r.issue?r.issue.comments:r.comment&&r.comment.in_reply_to_id===void 0?0:void 0;return{app:n,...r.installation?.id===void 0?{}:{installation:String(r.installation.id)},...i?{repo:i}:{},...a===void 0?{}:{index:a}}},adapter:async e=>(await import(`./adapter-BeezVK-B.js`)).githubAdapter(e),link(e){let t=/^github:([^:]+):(issue:)?(\d+)(?::rc:(\d+))?(?::|$)/.exec(e.chat?.thread.id??``);return t?`https://github.com/${t[1]}/${t[2]?`issues`:`pull`}/${t[3]}${t[4]?`#discussion_r${t[4]}`:``}`:void 0},ownEvents(e,t,n,r){let i=e.headers.get(`x-github-event`);if(!i||Oe.includes(i))return;let{webhookSecret:a,slug:o}=r;if(!R(t,e.headers.get(`x-hub-signature-256`),a))return{invalid:!0};let s=L(t),c=Ne(i,s,n);if(c)return{installation:c};let l=Pe(s,n),u=i===`push`?Fe(s,n):void 0;return l?{changes:l,...u?{pushed:u}:{}}:u?{pushed:u}:{events:ke(e,s,n,{slug:o})}},event(e,t,n){let r=n.raw.comment?.author_association;return{type:e===`mention`&&!De.includes(r??``)?`comment`:e,actor:{id:n.author.userId,login:n.author.userName,...r?{role:r}:{}}}}};function Le(e,t,n,r=Date.now()){if(!n||!t)return!1;let i=d(`sha256`,n).update(e).digest();if(!p(Buffer.from(t,`hex`),i))return!1;let a=JSON.parse(e).webhookTimestamp;return typeof a==`number`&&Math.abs(r-a)<=6e4}async function Re(e,t,n=fetch){if(!e.actor.id||!e.installationId)throw Error(`Linear event has no actor or workspace`);let r=await n(`https://api.linear.app/graphql`,{method:`POST`,headers:{authorization:`Bearer ${t}`,"content-type":`application/json`},body:JSON.stringify({query:`query CoderWorkspaceMember($id: String!) { user(id: $id) { id active guest app organization { id } } }`,variables:{id:e.actor.id}}),redirect:`error`,signal:AbortSignal.timeout(5e3)}),i=await r.json(),a=i.data?.user;if(!r.ok||i.errors!==void 0&&(!Array.isArray(i.errors)||i.errors.length>0)||!a)throw Error(`Linear returned no valid workspace member`);return a.id===e.actor.id&&a.active===!0&&a.guest===!1&&a.app===!1&&a.organization?.id===e.installationId}function ze(e,t){let n=new Map;return(async(r,i)=>{let a=new Request(r,i);if(new URL(a.url).origin!==`https://slack.com`||new URL(a.url).pathname!==`/api/users.info`)return e(r,i);let o=new URLSearchParams(await a.clone().text()),s=a.headers.get(`authorization`)?.replace(/^Bearer /,``)??o.get(`token`),c=JSON.stringify([s,o.get(`team_id`)??t,o.get(`user`)]),l=n.get(c);return l||(l=e(r,i).then(async e=>{let t=await e.clone().json().catch(()=>void 0);return(!e.ok||t?.ok!==!0)&&n.delete(c),e}).catch(e=>{throw n.delete(c),e}),n.set(c,l)),(await l).clone()})}async function Be(e,t,n=fetch){let r=e.within??e.installationId;if(!r||!e.actor.id)throw Error(`Slack event has no workspace or actor`);let i=await n(`https://slack.com/api/users.info`,{method:`POST`,headers:{authorization:`Bearer ${t}`,"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({user:e.actor.id,team_id:r}),redirect:`error`,signal:AbortSignal.timeout(5e3)}),a=await i.json(),o=a.user;if(!i.ok||a.ok!==!0||!o)throw Error(`Slack returned no valid workspace member`);return o.id===e.actor.id&&o.deleted===!1&&o.is_bot===!1&&o.is_restricted===!1&&o.is_ultra_restricted===!1&&(o.is_external===void 0||o.is_external===!1)&&(o.team_id===r||Array.isArray(o.enterprise_user?.teams)&&o.enterprise_user.teams.includes(r))}function U(e){return e.replace(/\/$/,``)}function Ve(e,{name:t,description:n,scopes:r,events:i,extras:a}){let o=U(e),s=new URL(o).hostname;return{display_information:{name:t,...n?{description:n.slice(0,140)}:{}},features:{bot_user:{display_name:t,always_online:!0},app_home:{home_tab_enabled:!0,messages_tab_enabled:!0,messages_tab_read_only_enabled:!1},...s.includes(`.`)&&!te(s)?{unfurl_domains:[s]}:{},...a},oauth_config:{redirect_urls:[`${o}/install/slack/callback`],scopes:{bot:r}},settings:{org_deploy_enabled:!0,event_subscriptions:{request_url:`${o}/hooks/slack`,bot_events:i},interactivity:{is_enabled:!0,request_url:`${o}/hooks/slack`}}}}async function W(e,t,n,r){let{assertSlackOk:i,callSlackApi:a}=await import(`./api-qdpx8FD0.js`),o=await a(e,t,{token:n,fetch:r});return i(e,o),o}async function He(e,t,n=fetch){let r=await W(`apps.manifest.create`,{manifest:JSON.stringify(t)},e,n);return{appId:r.app_id,clientId:r.credentials.client_id,clientSecret:r.credentials.client_secret,signingSecret:r.credentials.signing_secret}}function G(e){let t=e.integrations.slack?.events;return Array.isArray(t)?t:Object.keys(t??{})}const K=e=>X(e.access,G(e));function q(e,t,n){return Ve(e,{name:t,description:n.description,scopes:K(n),events:Xe(G(n)),extras:Ze(e,n)})}async function J(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 b(`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 Y(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 J(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 b(`invalid-field`,`token`,`This configuration token could not be refreshed. Paste a new token.`)}await t(a)}return r(a.configToken)})}function Ue(e,t,n,r=[]){let i=new URLSearchParams({client_id:e.clientId,state:n,redirect_uri:`${U(t)}/install/slack/callback`});return r.length&&i.set(`scope`,r.join(`,`)),`https://slack.com/oauth/v2/authorize?${i}`}async function We(e,t,n,r=fetch){let i=await r(`https://slack.com/api/oauth.v2.access`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:t.clientId,client_secret:t.clientSecret,code:e,redirect_uri:`${U(n)}/install/slack/callback`})}),a=await i.json(),o=a.is_enterprise_install===!0,s=o?a.enterprise:a.team;if(!i.ok||!a.ok||!a.access_token||!s?.id||!s.name)throw new b(`platform-error`,a.error??String(i.status));return{id:s.id,name:s.name,org:o,accessToken:a.access_token,...a.authed_user?.id?{installer:a.authed_user.id}:{}}}async function Ge(e,t){let n=[],r=``;do{let i=await W(`auth.teams.list`,{limit:1e3,...r?{cursor:r}:{}},e,t);n.push(...i.teams.map(e=>e.id)),r=i.response_metadata?.next_cursor??``}while(r);return n}const Ke={builtin:`own`,createStep:(e,t)=>{let n=t?.saved??[],r=n.length?{field:`token`,equals:`new`}:void 0;return{intro:`Coder creates the Slack app with a configuration token and installs its bot 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,state:n,definition:r,fetch:i,tokens:a}){if(!a)throw Error(`Configuration token storage is unavailable`);let o=new URLSearchParams(await e.text()),s=o.get(`token`);if(!s||s===`new`){let e=o.get(`refreshToken`);if(!e)throw Error(`Missing refresh token`);if(e.startsWith(`xoxe.xoxp-`))throw new b(`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 b(`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 J(e,i),n={workspace:t.workspace,user:t.user,workspaceName:t.workspace,credentials:t},r=await W(`auth.test`,{},t.configToken,i).catch(()=>void 0);s=await a.put({...n,workspaceName:r?.team||n.workspaceName})}let c=r.name??n.agent,l=await Y(a,s,i,e=>He(e,q(t,c,r),i));return{platformAppId:l.appId,name:c,credentials:{...l,configTokenId:s,scopes:K(r)}}},manifest:(e,{publicUrl:t,definition:n})=>q(t,e.name,n),async update(e,t,{publicUrl:n,definition:r,fetch:i,saveCredentials:a,tokens:o}){let s=t;if(!s.configTokenId||!o)throw new b(`no-refresh-token`);await Y(o,s.configTokenId,i,t=>W(`apps.manifest.update`,{app_id:s.appId,manifest:JSON.stringify(q(n,e.name,r))},t,i));let c=K(r);c.join()!==s.scopes?.join()&&await a({...s,scopes:c})},settingsUrl:(e,t)=>`https://api.slack.com/apps/${encodeURIComponent(t.appId)}`,installUrl(e,t,{publicUrl:n,state:r}){let i=t;return Ue(i,n,r,i.scopes??X(`write`))},async installCallback(e,{app:t,credentials:n,publicUrl:r,fetch:i,tokens:a}){let o=new URL(e.url).searchParams.get(`code`);if(!o)throw new b(`missing-code`);let s=await We(o,n,r,i),c=n.configTokenId;a&&c&&!s.org&&await a.use(c,(e,t)=>t(e,s.name));let l=await W(`auth.test`,{},s.accessToken,i).then(e=>e.url?.replace(/\/$/,``)).catch(()=>void 0),u=s.org?await Ge(s.accessToken,i).catch(()=>null):void 0;return{platformInstallId:s.id,account:{login:s.name,...s.org?{type:`Organization`}:{},...l?{url:l}:{}},token:s.accessToken,...s.org?{covers:u}:{},installer:s.installer,...s.installer?{user:{id:s.installer}}:{}}}},qe=[`app_mentions:read`,`channels:history`,`groups:history`,`im:history`,`channels:read`,`groups:read`,`im:read`,`mpim:read`,`users:read`,`users:read.email`,`files:read`,`usergroups:read`,`reactions:read`,`reactions:write`,`commands`,`links:read`,`links:write`];function X(e=`write`,t=[]){return[...qe,...t.includes(`dm`)?[`mpim:history`]:[],`chat:write`,`files:write`,`im:write`,`assistant:write`,...(Array.isArray(e)?e.includes(`write`):e===`write`)?[`channels:join`,`channels:manage`,`groups:write`,`mpim:write`,`usergroups:write`]:[]]}const Je={mention:[`app_mention`],dm:[`message.im`,`message.mpim`],channel:[`message.channels`,`message.groups`]},Ye=[`mention`,`dm`,`channel`];function Xe(e){let t=e.some(e=>Ye.includes(e));return[...new Set([...e.flatMap(e=>Je[e]??[]),...t?[`reaction_added`]:[]]),`team_access_granted`,`team_access_revoked`,`app_uninstalled`,`tokens_revoked`,`app_home_opened`,`link_shared`]}function Ze(e,t){return{slash_commands:[{command:`/setup`,url:`${e.replace(/\/$/,``)}/hooks/slack`,description:`Configure this agent`,usage_hint:`repo owner/name | model <name> | show`}],agent_view:{agent_description:t.description??`${t.name??`Coder`} in your workspace.`}}}const Qe={read:[`read`],write:[`read`,`write`]};function $e(e,t,n){let r=!e.includes(`write`),i=`/tmp/coder-slack-${f()}`;return{name:`slack`,command:`slack-mcp-server`,readOnly:r,args:[`--transport`,`stdio`],env:{SLACK_MCP_XOXB_TOKEN:n,SLACK_MCP_USERS_CACHE:`${i}-users.json`,SLACK_MCP_CHANNELS_CACHE:`${i}-channels.json`,SLACK_MCP_LOG_LEVEL:`error`,SLACK_MCP_ADD_MESSAGE_TOOL:r?``:`true`,SLACK_MCP_REACTION_TOOL:r?``:`true`,SLACK_MCP_ATTACHMENT_TOOL:`true`,SLACK_MCP_MARK_TOOL:r?``:`true`},credentialFields:{env:`SLACK_MCP_XOXB_TOKEN`}}}const et=r({type:t(n()),team_id:t(n()),enterprise_id:t(n()),is_enterprise_install:t(e([i(),n()])),api_app_id:t(n()),challenge:t(n()),authorizations:t(o(r({user_id:t(n()),team_id:t(a(n())),enterprise_id:t(a(n())),is_enterprise_install:t(i())})))}),tt=r({enterprise_id:t(n()),authorizations:t(o(r({enterprise_id:t(n())}))),event:r({type:s([`team_access_granted`,`team_access_revoked`]),team_ids:o(n())})}),nt=r({type:s([`app_uninstalled`,`tokens_revoked`]),tokens:t(r({bot:t(o(n()))}))}),rt=r({type:c(`app_home_opened`),user:n(),tab:c(`home`)}),it=r({type:c(`link_shared`),channel:n(),message_ts:n(),unfurl_id:t(n()),source:t(n()),links:o(r({url:n()}))}),at=`link:`,ot=r({type:c(`block_actions`),actions:o(r({action_id:n()}))});function Z(e){try{return JSON.parse(e)}catch{let t=new URLSearchParams(e),n=t.get(`payload`);if(!n)return Object.fromEntries(t);try{return JSON.parse(n)}catch{return{}}}}function st(e,t,n){let r=nt.safeParse(e.event).data;if(r){let e=r.type===`app_uninstalled`||r.tokens?.bot?.length;return n&&e?{uninstalled:`${t}:${n}`}:{ack:!0}}let i=rt.safeParse(e.event).data;if(i)return{work:async e=>(await import(`./views-LmbLfqpu.js`)).publishHome(e,i.user)};let a=it.safeParse(e.event).data;if(a)return{work:async e=>(await import(`./views-LmbLfqpu.js`)).unfurl(e,a)};let o=ot.safeParse(e).data?.actions;if(o?.length&&o.every(e=>e.action_id.startsWith(`link:`)))return{ack:!0};if(e.type&&e.type!==`event_callback`&&e.type!==`url_verification`)return{unhandled:`Slack interaction ${e.type}`};let s=tt.safeParse(e).data,c=s?.enterprise_id??s?.authorizations?.[0]?.enterprise_id;if(!s||!c)return;let l=s.event.team_ids;return{covers:{installation:`${t}:${c}`,...s.event.type===`team_access_granted`?{add:l}:{remove:l}}}}function ct(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=${d(`sha256`,n).update(`v0:${r}:${t}`).digest(`hex`)}`;return p(e.headers.get(`x-slack-signature`)??``,i)}const Q=e=>e===`im`||e===`mpim`?`dm`:`channel`;function lt(e,t,n=`send it a direct message`){let r=[t.includes(`mention`)&&`mention @${e} in a channel`,t.includes(`dm`)&&n,t.includes(`channel`)&&`write in a channel it is in`].filter(e=>!!e);if(!r.length)return;let i=r.length>1?`${r.slice(0,-1).join(`, `)}, or ${r.at(-1)}`:r[0];return`${i[0].toUpperCase()}${i.slice(1)}.`}const $={id:`slack`,brand:{color:`#E3066A`,icon:`M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zM18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zM15.165 18.956a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z`,svg:`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"><g><path d="M 84.04 252.77 c 0 23.13 -18.89 42.02 -42.02 42.02 S 0 275.9 0 252.77 s 18.89 -42.02 42.02 -42.02 h 42.02 v 42.02 Z" fill="#e3066a"/><path d="M 105.21 252.77 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 v 105.21 c 0 23.13 -18.89 42.02 -42.02 42.02 s -42.02 -18.89 -42.02 -42.02 c 0 0 0 -105.21 0 -105.21 Z" fill="#e3066a"/></g><g><path d="M 147.23 84.04 c -23.13 0 -42.02 -18.89 -42.02 -42.02 S 124.1 0 147.23 0 s 42.02 18.89 42.02 42.02 v 42.02 h -42.02 Z" fill="#00b3ff"/><path d="M 147.23 105.21 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 H 42.02 c -23.13 0 -42.02 -18.89 -42.02 -42.02 s 18.89 -42.02 42.02 -42.02 c 0 0 105.21 0 105.21 0 Z" fill="#00b3ff"/></g><g><path d="M 315.96 147.23 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 -18.89 42.02 -42.02 42.02 h -42.02 v -42.02 Z" fill="#41b658"/><path d="M 294.79 147.23 c 0 23.13 -18.89 42.02 -42.02 42.02 s -42.02 -18.89 -42.02 -42.02 V 42.02 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 v 105.21 Z" fill="#41b658"/></g><g><path d="M 252.77 315.96 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 -42.02 -18.89 -42.02 -42.02 v -42.02 h 42.02 Z" fill="#fcc003"/><path d="M 252.77 294.79 c -23.13 0 -42.02 -18.89 -42.02 -42.02 s 18.89 -42.02 42.02 -42.02 h 105.21 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 h -105.21 Z" fill="#fcc003"/></g></svg>`},name:`Slack`,featured:!0,description:`Mentions, direct messages, and channel messages in a Slack workspace`,installLabel:`Add to Slack`,use:e=>lt(`{handle}`,e),covered:`Slack workspace`,sample:`slack:C0000000000:1700000000.000100`,prompt:[`A conversation is a Slack thread or a whole 1:1 DM. A group DM works like a channel.`,`conversations_replies reads a thread. conversations_history reads a channel or DM, including DM messages older than your history.`,`Your final message renders as Markdown with headings, tables, lists, code blocks and quotes.`,`Mention a person as <@USER_ID>.`].join(`
5
- `),replyLimit:12e3,events:{mention:{description:`A message that mentions the agent in a channel or group DM.`,on:`mention`,addressed:!0},dm:{description:`Every message in a direct message or group DM with the agent.`,on:`message`,addressed:!0},command:{description:`/setup and other slash commands`,on:`command`},channel:{description:`Every message in channels the agent is in. Slack delivers at most 30,000 events per workspace per app per hour.`,on:`message`,noisy:!0,addressed:!0}},tools:{presets:Qe,server:$e,install:`set -eu; arch=$(uname -m); case "$arch" in x86_64) arch=amd64; checksum=d1525962e9b9dbfdd2eaf48d0a81ca1eca7d8f1862b8d34931b812c850b3e568;; aarch64|arm64) arch=arm64; checksum=a307a48d16c2261346bdc257274cdcdb8b2027c867dc971b41d52cef36472c88;; *) exit 1;; esac; file=$(mktemp); trap 'rm -f "$file"' EXIT; curl -fsSL "https://github.com/korotovsky/slack-mcp-server/releases/download/v1.3.0/slack-mcp-server-linux-$arch" -o "$file"; echo "$checksum $file" | sha256sum -c -; install -m 755 "$file" /usr/local/bin/slack-mcp-server`,installHosts:[`github.com`,`release-assets.githubusercontent.com`]},hosts:[`slack.com`,`*.slack.com`],get app(){return Ke},target(e,t){let n=Z(t),r=et.safeParse(n).data;if(r?.type===`url_verification`&&r.challenge)return new Response(r.challenge);let i=r?.authorizations?.[0],a=i?.team_id??r?.team_id??n.team?.id,o=String(i?.is_enterprise_install??r?.is_enterprise_install)===`true`,s=o?i?.enterprise_id??r?.enterprise_id??n.enterprise?.id:a,c=i?.user_id;return r?.api_app_id?{app:r.api_app_id,...s?{installation:s}:{},...o&&a?{within:a}:{},...c?{self:c}:{}}:void 0},welcome:async(e,t,n)=>(await import(`./views-LmbLfqpu.js`)).welcome(e,t,n),link(e){let t=/^slack:([^:]+):(\d+)\.(\d+)$/.exec(e.chat?.thread.id??``);return t?`https://slack.com/archives/${t[1]}/p${t[2]}${t[3]}`:void 0},ownEvents(e,t,n,r){let i=$.target(e,t),a=st(Z(t),n.id,i&&!(i instanceof Response)?i.installation:void 0);if(a)return ct(e,t,r?.signingSecret)?a:{invalid:!0}},adapter:async e=>(await import(`./adapter-ChaISKgI.js`)).slackAdapter(e),event(e,t,n){let r=n.raw.channel_type;return{type:t.isDM?`dm`:e===`mention`?e:Q(r),actor:{id:n.author.userId,...n.author.userName?{login:n.author.userName}:{}}}},requestFetch:ze,isUninstalled(e){let t=e?.data?.error;return[`invalid_auth`,`account_inactive`,`token_revoked`].includes(t??``)},conversation:async(e,t)=>(await import(`./conversation-DT-35cEt.js`)).slackConversation(e,t),auth:{canWrite:Be,async token(e){if(!e.token)throw Error(`Slack installation ${e.id} has no bot token`);return e.token}}};export{W as a,Ie as c,b as d,g as f,lt as i,R as l,ne as m,Q as n,Re as o,p,$ as r,Le as s,at as t,x as u};
3
+ `)}const De=[`OWNER`,`MEMBER`],Oe=[`issue_comment`,`pull_request_review_comment`,`ping`];function L(e){try{return JSON.parse(e)}catch{return}}function R(e,t,n){if(!n||!t?.startsWith(`sha256=`))return!1;let r=Buffer.from(d(`sha256`,n).update(e).digest(`hex`),`hex`);return p(Buffer.from(t.slice(7),`hex`),r)}function z(e,t,n,r,i){let a=n.installation?.id,o=B(n),s=i.user??n.sender;if(a===void 0||!o||!i.number)return;let c=s?.author_association;return{integration:`github`,type:r,appId:t.id,installationId:String(a),deliveryId:e.headers.get(`x-github-delivery`)??``,actor:{id:String(s?.id??s?.login??``),...s?.login?{login:s.login}:{},...c?{role:c}:{},...F(s)?{agent:!0}:{}},text:i.body??``,repo:o,chat:{thread:V(`${o.owner}/${o.name}`,i.number,i.kind===`pull`)}}}function B(e){let t=e.repository;return t?.owner?.login&&t.name&&t.clone_url&&t.default_branch?{owner:t.owner.login,name:t.name,cloneUrl:t.clone_url,defaultBranch:t.default_branch}:void 0}function V(e,t,n){return{_type:`chat:Thread`,adapterName:`github`,channelId:`github:${e}`,id:`github:${e}:${n?``:`issue:`}${t}`,isDM:!1}}function ke(e,t,n,r){let i=P(t),a=e.headers.get(`x-github-event`);if(a===`pull_request`){let t=i.pull_request,a=i.action??``,o=i.requested_reviewer?.login?.toLowerCase();if(!t||![`opened`,`synchronize`,`reopened`,`ready_for_review`,`review_requested`].includes(a)||a===`review_requested`&&o!==`${r.slug}[bot]`.toLowerCase()||t.draft||a!==`review_requested`&&F(t.user)||!t.number||t.head?.repo?.full_name!==i.repository?.full_name)return[];let s=z(e,n,i,`pull_request`,{user:i.sender??t.user,body:I(t.title,t.body),number:t.number,kind:`pull`});return s?[s]:[]}if(a===`issues`){let t=i.issue;if(!t||![`opened`,`edited`].includes(i.action??``)||F(i.sender??t.user)||!t.number)return[];let r=z(e,n,i,`issue`,{user:i.sender??t.user,body:I(t.title,t.body),number:t.number});return r?[r]:[]}return[]}async function Ae(e,t,n={},r){let{token:i,expiresAt:a}=await(await _({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 je(e,t){let{appId:n,privateKey:r}=e,{permissions:i}=H(t);return u(`sha256`).update(JSON.stringify([n,r,i?Object.entries(i).sort():null])).digest(`base64url`)}const Me={installation:[`created`,`deleted`,`suspend`,`unsuspend`,`new_permissions_accepted`],installation_repositories:[`added`,`removed`],repository:[`created`,`deleted`,`renamed`]};function Ne(e,t,n){let r=P(t),i=r.installation?.id,a=r.action;if(i===void 0||!Me[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 Pe(e,t){let n=P(e),r=n.repository?.full_name,i=t.branch??n.repository?.default_branch;if(!r||r!==t.agentsRepo||!i||n.ref!==`refs/heads/${i}`||!n.after||!n.commits)return;let a=[...new Set(n.commits.flatMap(e=>[...e.added??[],...e.modified??[],...e.removed??[]]))].filter(e=>e.startsWith(`.coder/agents/`));return a.length?{repo:r,ref:n.after,branch:i,paths:a}:void 0}function Fe(e,t){let n=P(e),r=n.repository?.full_name,i=n.ref?.startsWith(`refs/heads/`)&&n.ref.slice(11),a=n.installation?.id;if(!r||!i||a===void 0)return;let o=n.commits??[],s=o.flatMap(e=>[...e.added??[],...e.modified??[],...e.removed??[]]);if(!(o.length&&o.length<2048&&!s.some(e=>e.startsWith(`.coder/`))))return{installation:`${t.id}:${a}`,repo:r,branch:i,...n.repository?.default_branch?{defaultBranch:n.repository.default_branch}:{}}}function H(e={}){return e.tools?{permissions:O(e.tools)}:{}}const Ie={id:`github`,brand:{color:`#000000`,icon:`M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12`,dark:`#fff`,svg:`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 98 96" fill="none" style="color:light-dark(#000,#fff)"><g clip-path="url(#github-mark-4)"><path d="M 41.44 69.38 C 28.81 67.85 19.91 58.76 19.91 46.99 C 19.91 42.21 21.63 37.04 24.5 33.59 C 23.26 30.43 23.45 23.73 24.88 20.96 C 28.71 20.48 33.88 22.49 36.94 25.27 C 40.58 24.12 44.41 23.54 49.1 23.54 C 53.79 23.54 57.61 24.12 61.06 25.17 C 64.03 22.49 69.29 20.48 73.12 20.96 C 74.46 23.54 74.65 30.24 73.4 33.5 C 76.47 37.13 78.09 42.01 78.09 46.99 C 78.09 58.76 69.19 67.66 56.37 69.29 C 59.62 71.39 61.82 75.99 61.82 81.25 L 61.82 91.21 C 61.82 94.08 64.22 95.7 67.09 94.55 C 84.41 87.95 98 70.63 98 49.19 C 98 22.11 75.99 0 48.9 0 C 21.82 0 0 22.11 0 49.19 C 0 70.44 13.49 88.05 31.68 94.65 C 34.26 95.61 36.75 93.88 36.75 91.3 L 36.75 83.64 C 35.41 84.22 33.69 84.6 32.16 84.6 C 25.84 84.6 22.11 81.16 19.43 74.74 C 18.38 72.16 17.23 70.63 15.03 70.34 C 13.88 70.25 13.49 69.77 13.49 69.19 C 13.49 68.04 15.41 67.18 17.32 67.18 C 20.1 67.18 22.49 68.91 24.98 72.45 C 26.89 75.22 28.9 76.47 31.29 76.47 C 33.69 76.47 35.22 75.61 37.42 73.4 C 39.05 71.78 40.29 70.34 41.44 69.38 Z" fill="black" style="fill:currentColor"/></g><defs><clipPath id="github-mark-4"><rect width="98" height="96" fill="white"/></clipPath></defs></svg>`},name:`GitHub`,featured:!0,description:`Pull requests, issues, and comments on GitHub repositories`,installLabel:`Connect GitHub`,use:`Mention @{handle} in an issue or pull request.`,organizationApps:!0,publicApps:!0,prompt:[`A conversation is an issue or pull request with its comments, or one inline review comment thread.`,`issue_read reads an issue and its comments. pull_request_read reads a pull request: get, get_diff and get_files for the change, get_comments for its conversation, get_reviews and get_review_comments for reviews and inline comments.`,`Review findings are inline review comments marked coder-review:fp.`,`A task starts on the default branch; a pull request's changes are read with pull_request_read. Check out and push a pull request's branch only when it is in this repository and the request asks for changes; a fork pull request gets reads and comments only.`,`Replies are GitHub Markdown. Cite repository file paths when discussing code; link the pull request after making changes.`].join(`
4
+ `),sample:`github:owner/repo:1`,author:e=>`${e}[bot]`,events:{mention:{description:`Comment from a repo owner or org member mentioning @<agent>; text has the mention stripped.`,on:`mention`,addressed:!0},pull_request:{description:`Opened, updated, or ready non-draft pull request.`},issue:{description:`Opened or edited issue.`},comment:{description:`New non-agent issue, pull request, or inline review comment.`,on:`message`,noisy:!0}},tools:{presets:x,server:pe,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`],get app(){return Ee},auth:{token:async(e,t,n,{fetch:r,hold:i}={})=>{let a=()=>Ae(t,e.id.split(`:`).pop(),H(n),r);return i?i(je(t,n),a):(await a()).token},get user(){return be},canWrite:async(e,t,n)=>!!(e.repo&&e.actor.login)&&de(`${e.repo.owner}/${e.repo.name}`,e.actor.login,t,n)},repos:{cloneHosts:[`github.com`],credentialUsername:`x-access-token`,readFile:re,revalidate:ie,listDir:se,tree:oe,commit:ae,list:(e,t,n)=>ce(t,n),get:ue,url:fe,pullRequests:le,pullRequest:e=>{let t=/^github:[^:]+:(\d+)(?::|$)/.exec(e.chat?.thread.id??``);return t?Number(t[1]):void 0},pullRequestThread:(e,t)=>V(e,t,!0)},target(e,t){let n=e.headers.get(`x-github-hook-installation-target-id`);if(!n)return;let r=P(L(t)),i=B(r),a=r.issue?r.issue.comments:r.comment&&r.comment.in_reply_to_id===void 0?0:void 0;return{app:n,...r.installation?.id===void 0?{}:{installation:String(r.installation.id)},...i?{repo:i}:{},...a===void 0?{}:{index:a}}},adapter:async e=>(await import(`./adapter-BT8ECcRG.js`)).githubAdapter(e),link(e){let t=/^github:([^:]+):(issue:)?(\d+)(?::rc:(\d+))?(?::|$)/.exec(e.chat?.thread.id??``);return t?`https://github.com/${t[1]}/${t[2]?`issues`:`pull`}/${t[3]}${t[4]?`#discussion_r${t[4]}`:``}`:void 0},ownEvents(e,t,n,r){let i=e.headers.get(`x-github-event`);if(!i||Oe.includes(i))return;let{webhookSecret:a,slug:o}=r;if(!R(t,e.headers.get(`x-hub-signature-256`),a))return{invalid:!0};let s=L(t),c=Ne(i,s,n);if(c)return{installation:c};let l=Pe(s,n),u=i===`push`?Fe(s,n):void 0;return l?{changes:l,...u?{pushed:u}:{}}:u?{pushed:u}:{events:ke(e,s,n,{slug:o})}},event(e,t,n){let r=n.raw.comment?.author_association;return{type:e===`mention`&&!De.includes(r??``)?`comment`:e,actor:{id:n.author.userId,login:n.author.userName,...r?{role:r}:{}}}}};function Le(e,t,n,r=Date.now()){if(!n||!t)return!1;let i=d(`sha256`,n).update(e).digest();if(!p(Buffer.from(t,`hex`),i))return!1;let a=JSON.parse(e).webhookTimestamp;return typeof a==`number`&&Math.abs(r-a)<=6e4}async function Re(e,t,n=fetch){if(!e.actor.id||!e.installationId)throw Error(`Linear event has no actor or workspace`);let r=await n(`https://api.linear.app/graphql`,{method:`POST`,headers:{authorization:`Bearer ${t}`,"content-type":`application/json`},body:JSON.stringify({query:`query CoderWorkspaceMember($id: String!) { user(id: $id) { id active guest app organization { id } } }`,variables:{id:e.actor.id}}),redirect:`error`,signal:AbortSignal.timeout(5e3)}),i=await r.json(),a=i.data?.user;if(!r.ok||i.errors!==void 0&&(!Array.isArray(i.errors)||i.errors.length>0)||!a)throw Error(`Linear returned no valid workspace member`);return a.id===e.actor.id&&a.active===!0&&a.guest===!1&&a.app===!1&&a.organization?.id===e.installationId}function ze(e,t){let n=new Map;return(async(r,i)=>{let a=new Request(r,i);if(new URL(a.url).origin!==`https://slack.com`||new URL(a.url).pathname!==`/api/users.info`)return e(r,i);let o=new URLSearchParams(await a.clone().text()),s=a.headers.get(`authorization`)?.replace(/^Bearer /,``)??o.get(`token`),c=JSON.stringify([s,o.get(`team_id`)??t,o.get(`user`)]),l=n.get(c);return l||(l=e(r,i).then(async e=>{let t=await e.clone().json().catch(()=>void 0);return(!e.ok||t?.ok!==!0)&&n.delete(c),e}).catch(e=>{throw n.delete(c),e}),n.set(c,l)),(await l).clone()})}async function Be(e,t,n=fetch){let r=e.within??e.installationId;if(!r||!e.actor.id)throw Error(`Slack event has no workspace or actor`);let i=await n(`https://slack.com/api/users.info`,{method:`POST`,headers:{authorization:`Bearer ${t}`,"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({user:e.actor.id,team_id:r}),redirect:`error`,signal:AbortSignal.timeout(5e3)}),a=await i.json(),o=a.user;if(!i.ok||a.ok!==!0||!o)throw Error(`Slack returned no valid workspace member`);return o.id===e.actor.id&&o.deleted===!1&&o.is_bot===!1&&o.is_restricted===!1&&o.is_ultra_restricted===!1&&(o.is_external===void 0||o.is_external===!1)&&(o.team_id===r||Array.isArray(o.enterprise_user?.teams)&&o.enterprise_user.teams.includes(r))}function U(e){return e.replace(/\/$/,``)}function Ve(e,{name:t,description:n,scopes:r,events:i,extras:a}){let o=U(e),s=new URL(o).hostname;return{display_information:{name:t,...n?{description:n.slice(0,140)}:{}},features:{bot_user:{display_name:t,always_online:!0},app_home:{home_tab_enabled:!0,messages_tab_enabled:!0,messages_tab_read_only_enabled:!1},...s.includes(`.`)&&!te(s)?{unfurl_domains:[s]}:{},...a},oauth_config:{redirect_urls:[`${o}/install/slack/callback`],scopes:{bot:r}},settings:{org_deploy_enabled:!0,event_subscriptions:{request_url:`${o}/hooks/slack`,bot_events:i},interactivity:{is_enabled:!0,request_url:`${o}/hooks/slack`}}}}async function W(e,t,n,r){let{assertSlackOk:i,callSlackApi:a}=await import(`./api-qdpx8FD0.js`),o=await a(e,t,{token:n,fetch:r});return i(e,o),o}async function He(e,t,n=fetch){let r=await W(`apps.manifest.create`,{manifest:JSON.stringify(t)},e,n);return{appId:r.app_id,clientId:r.credentials.client_id,clientSecret:r.credentials.client_secret,signingSecret:r.credentials.signing_secret}}function G(e){let t=e.integrations.slack?.events;return Array.isArray(t)?t:Object.keys(t??{})}const K=e=>X(e.access,G(e));function q(e,t,n){return Ve(e,{name:t,description:n.description,scopes:K(n),events:Xe(G(n)),extras:Ze(e,n)})}async function J(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 b(`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 Y(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 J(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 b(`invalid-field`,`token`,`This configuration token could not be refreshed. Paste a new token.`)}await t(a)}return r(a.configToken)})}function Ue(e,t,n,r=[]){let i=new URLSearchParams({client_id:e.clientId,state:n,redirect_uri:`${U(t)}/install/slack/callback`});return r.length&&i.set(`scope`,r.join(`,`)),`https://slack.com/oauth/v2/authorize?${i}`}async function We(e,t,n,r=fetch){let i=await r(`https://slack.com/api/oauth.v2.access`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:t.clientId,client_secret:t.clientSecret,code:e,redirect_uri:`${U(n)}/install/slack/callback`})}),a=await i.json(),o=a.is_enterprise_install===!0,s=o?a.enterprise:a.team;if(!i.ok||!a.ok||!a.access_token||!s?.id||!s.name)throw new b(`platform-error`,a.error??String(i.status));return{id:s.id,name:s.name,org:o,accessToken:a.access_token,...a.authed_user?.id?{installer:a.authed_user.id}:{}}}async function Ge(e,t){let n=[],r=``;do{let i=await W(`auth.teams.list`,{limit:1e3,...r?{cursor:r}:{}},e,t);n.push(...i.teams.map(e=>e.id)),r=i.response_metadata?.next_cursor??``}while(r);return n}const Ke={builtin:`own`,createStep:(e,t)=>{let n=t?.saved??[],r=n.length?{field:`token`,equals:`new`}:void 0;return{intro:`Coder creates the Slack app with a configuration token and installs its bot 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,state:n,definition:r,fetch:i,tokens:a}){if(!a)throw Error(`Configuration token storage is unavailable`);let o=new URLSearchParams(await e.text()),s=o.get(`token`);if(!s||s===`new`){let e=o.get(`refreshToken`);if(!e)throw Error(`Missing refresh token`);if(e.startsWith(`xoxe.xoxp-`))throw new b(`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 b(`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 J(e,i),n={workspace:t.workspace,user:t.user,workspaceName:t.workspace,credentials:t},r=await W(`auth.test`,{},t.configToken,i).catch(()=>void 0);s=await a.put({...n,workspaceName:r?.team||n.workspaceName})}let c=r.name??n.agent,l=await Y(a,s,i,e=>He(e,q(t,c,r),i));return{platformAppId:l.appId,name:c,credentials:{...l,configTokenId:s,scopes:K(r)}}},manifest:(e,{publicUrl:t,definition:n})=>q(t,e.name,n),async update(e,t,{publicUrl:n,definition:r,fetch:i,saveCredentials:a,tokens:o}){let s=t;if(!s.configTokenId||!o)throw new b(`no-refresh-token`);await Y(o,s.configTokenId,i,t=>W(`apps.manifest.update`,{app_id:s.appId,manifest:JSON.stringify(q(n,e.name,r))},t,i));let c=K(r);c.join()!==s.scopes?.join()&&await a({...s,scopes:c})},settingsUrl:(e,t)=>`https://api.slack.com/apps/${encodeURIComponent(t.appId)}`,installUrl(e,t,{publicUrl:n,state:r}){let i=t;return Ue(i,n,r,i.scopes??X(`write`))},async installCallback(e,{app:t,credentials:n,publicUrl:r,fetch:i,tokens:a}){let o=new URL(e.url).searchParams.get(`code`);if(!o)throw new b(`missing-code`);let s=await We(o,n,r,i),c=n.configTokenId;a&&c&&!s.org&&await a.use(c,(e,t)=>t(e,s.name));let l=await W(`auth.test`,{},s.accessToken,i).then(e=>e.url?.replace(/\/$/,``)).catch(()=>void 0),u=s.org?await Ge(s.accessToken,i).catch(()=>null):void 0;return{platformInstallId:s.id,account:{login:s.name,...s.org?{type:`Organization`}:{},...l?{url:l}:{}},token:s.accessToken,...s.org?{covers:u}:{},installer:s.installer,...s.installer?{user:{id:s.installer}}:{}}}},qe=[`app_mentions:read`,`channels:history`,`groups:history`,`im:history`,`channels:read`,`groups:read`,`im:read`,`mpim:read`,`users:read`,`users:read.email`,`files:read`,`usergroups:read`,`reactions:read`,`reactions:write`,`commands`,`links:read`,`links:write`];function X(e=`write`,t=[]){return[...qe,...t.includes(`dm`)?[`mpim:history`]:[],`chat:write`,`files:write`,`im:write`,`assistant:write`,...(Array.isArray(e)?e.includes(`write`):e===`write`)?[`channels:join`,`channels:manage`,`groups:write`,`mpim:write`,`usergroups:write`]:[]]}const Je={mention:[`app_mention`],dm:[`message.im`,`message.mpim`],channel:[`message.channels`,`message.groups`]},Ye=[`mention`,`dm`,`channel`];function Xe(e){let t=e.some(e=>Ye.includes(e));return[...new Set([...e.flatMap(e=>Je[e]??[]),...t?[`reaction_added`]:[]]),`team_access_granted`,`team_access_revoked`,`app_uninstalled`,`tokens_revoked`,`app_home_opened`,`link_shared`]}function Ze(e,t){return{slash_commands:[{command:`/setup`,url:`${e.replace(/\/$/,``)}/hooks/slack`,description:`Configure this agent`,usage_hint:`repo owner/name | model <name> | show`}],agent_view:{agent_description:t.description??`${t.name??`Coder`} in your workspace.`}}}const Qe={read:[`read`],write:[`read`,`write`]};function $e(e,t,n){let r=!e.includes(`write`),i=`/tmp/coder-slack-${f()}`;return{name:`slack`,command:`slack-mcp-server`,readOnly:r,args:[`--transport`,`stdio`],env:{SLACK_MCP_XOXB_TOKEN:n,SLACK_MCP_USERS_CACHE:`${i}-users.json`,SLACK_MCP_CHANNELS_CACHE:`${i}-channels.json`,SLACK_MCP_LOG_LEVEL:`error`,SLACK_MCP_ADD_MESSAGE_TOOL:r?``:`true`,SLACK_MCP_REACTION_TOOL:r?``:`true`,SLACK_MCP_ATTACHMENT_TOOL:`true`,SLACK_MCP_MARK_TOOL:r?``:`true`},credentialFields:{env:`SLACK_MCP_XOXB_TOKEN`}}}const et=c({type:r(s()),team_id:r(s()),enterprise_id:r(s()),is_enterprise_install:r(a([i(),s()])),api_app_id:r(s()),challenge:r(s()),authorizations:r(e(c({user_id:r(s()),team_id:r(n(s())),enterprise_id:r(n(s())),is_enterprise_install:r(i())})))}),tt=c({enterprise_id:r(s()),authorizations:r(e(c({enterprise_id:r(s())}))),event:c({type:t([`team_access_granted`,`team_access_revoked`]),team_ids:e(s())})}),nt=c({type:t([`app_uninstalled`,`tokens_revoked`]),tokens:r(c({bot:r(e(s()))}))}),rt=c({type:o(`app_home_opened`),user:s(),tab:o(`home`)}),it=c({type:o(`link_shared`),channel:s(),message_ts:s(),unfurl_id:r(s()),source:r(s()),links:e(c({url:s()}))}),at=`link:`,ot=c({type:o(`block_actions`),actions:e(c({action_id:s()}))});function Z(e){try{return JSON.parse(e)}catch{let t=new URLSearchParams(e),n=t.get(`payload`);if(!n)return Object.fromEntries(t);try{return JSON.parse(n)}catch{return{}}}}function st(e,t,n){let r=nt.safeParse(e.event).data;if(r){let e=r.type===`app_uninstalled`||r.tokens?.bot?.length;return n&&e?{uninstalled:`${t}:${n}`}:{ack:!0}}let i=rt.safeParse(e.event).data;if(i)return{work:async e=>(await import(`./views-DEdKqLm_.js`)).publishHome(e,i.user)};let a=it.safeParse(e.event).data;if(a)return{work:async e=>(await import(`./views-DEdKqLm_.js`)).unfurl(e,a)};let o=ot.safeParse(e).data?.actions;if(o?.length&&o.every(e=>e.action_id.startsWith(`link:`)))return{ack:!0};if(e.type&&e.type!==`event_callback`&&e.type!==`url_verification`)return{unhandled:`Slack interaction ${e.type}`};let s=tt.safeParse(e).data,c=s?.enterprise_id??s?.authorizations?.[0]?.enterprise_id;if(!s||!c)return;let l=s.event.team_ids;return{covers:{installation:`${t}:${c}`,...s.event.type===`team_access_granted`?{add:l}:{remove:l}}}}function ct(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=${d(`sha256`,n).update(`v0:${r}:${t}`).digest(`hex`)}`;return p(e.headers.get(`x-slack-signature`)??``,i)}const Q=e=>e===`im`||e===`mpim`?`dm`:`channel`;function lt(e,t,n=`send it a direct message`){let r=[t.includes(`mention`)&&`mention @${e} in a channel`,t.includes(`dm`)&&n,t.includes(`channel`)&&`write in a channel it is in`].filter(e=>!!e);if(!r.length)return;let i=r.length>1?`${r.slice(0,-1).join(`, `)}, or ${r.at(-1)}`:r[0];return`${i[0].toUpperCase()}${i.slice(1)}.`}const $={id:`slack`,brand:{color:`#E3066A`,icon:`M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zM18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zM15.165 18.956a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z`,svg:`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"><g><path d="M 84.04 252.77 c 0 23.13 -18.89 42.02 -42.02 42.02 S 0 275.9 0 252.77 s 18.89 -42.02 42.02 -42.02 h 42.02 v 42.02 Z" fill="#e3066a"/><path d="M 105.21 252.77 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 v 105.21 c 0 23.13 -18.89 42.02 -42.02 42.02 s -42.02 -18.89 -42.02 -42.02 c 0 0 0 -105.21 0 -105.21 Z" fill="#e3066a"/></g><g><path d="M 147.23 84.04 c -23.13 0 -42.02 -18.89 -42.02 -42.02 S 124.1 0 147.23 0 s 42.02 18.89 42.02 42.02 v 42.02 h -42.02 Z" fill="#00b3ff"/><path d="M 147.23 105.21 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 H 42.02 c -23.13 0 -42.02 -18.89 -42.02 -42.02 s 18.89 -42.02 42.02 -42.02 c 0 0 105.21 0 105.21 0 Z" fill="#00b3ff"/></g><g><path d="M 315.96 147.23 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 -18.89 42.02 -42.02 42.02 h -42.02 v -42.02 Z" fill="#41b658"/><path d="M 294.79 147.23 c 0 23.13 -18.89 42.02 -42.02 42.02 s -42.02 -18.89 -42.02 -42.02 V 42.02 c 0 -23.13 18.89 -42.02 42.02 -42.02 s 42.02 18.89 42.02 42.02 v 105.21 Z" fill="#41b658"/></g><g><path d="M 252.77 315.96 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 -42.02 -18.89 -42.02 -42.02 v -42.02 h 42.02 Z" fill="#fcc003"/><path d="M 252.77 294.79 c -23.13 0 -42.02 -18.89 -42.02 -42.02 s 18.89 -42.02 42.02 -42.02 h 105.21 c 23.13 0 42.02 18.89 42.02 42.02 s -18.89 42.02 -42.02 42.02 h -105.21 Z" fill="#fcc003"/></g></svg>`},name:`Slack`,featured:!0,description:`Mentions, direct messages, and channel messages in a Slack workspace`,installLabel:`Add to Slack`,use:e=>lt(`{handle}`,e),covered:`Slack workspace`,sample:`slack:C0000000000:1700000000.000100`,prompt:[`A conversation is a Slack thread or a whole 1:1 DM. A group DM works like a channel.`,`conversations_replies reads a thread. conversations_history reads a channel or DM, including DM messages older than your history.`,`Your final message renders as Markdown with headings, tables, lists, code blocks and quotes.`,`Mention a person as <@USER_ID>.`].join(`
5
+ `),replyLimit:12e3,events:{mention:{description:`A message that mentions the agent in a channel or group DM.`,on:`mention`,addressed:!0},dm:{description:`Every message in a direct message or group DM with the agent.`,on:`message`,addressed:!0},command:{description:`/setup and other slash commands`,on:`command`},channel:{description:`Every message in channels the agent is in. Slack delivers at most 30,000 events per workspace per app per hour.`,on:`message`,noisy:!0,addressed:!0}},tools:{presets:Qe,server:$e,install:`set -eu; arch=$(uname -m); case "$arch" in x86_64) arch=amd64; checksum=d1525962e9b9dbfdd2eaf48d0a81ca1eca7d8f1862b8d34931b812c850b3e568;; aarch64|arm64) arch=arm64; checksum=a307a48d16c2261346bdc257274cdcdb8b2027c867dc971b41d52cef36472c88;; *) exit 1;; esac; file=$(mktemp); trap 'rm -f "$file"' EXIT; curl -fsSL "https://github.com/korotovsky/slack-mcp-server/releases/download/v1.3.0/slack-mcp-server-linux-$arch" -o "$file"; echo "$checksum $file" | sha256sum -c -; install -m 755 "$file" /usr/local/bin/slack-mcp-server`,installHosts:[`github.com`,`release-assets.githubusercontent.com`]},hosts:[`slack.com`,`*.slack.com`],get app(){return Ke},target(e,t){let n=Z(t),r=et.safeParse(n).data;if(r?.type===`url_verification`&&r.challenge)return new Response(r.challenge);let i=r?.authorizations?.[0],a=i?.team_id??r?.team_id??n.team?.id,o=String(i?.is_enterprise_install??r?.is_enterprise_install)===`true`,s=o?i?.enterprise_id??r?.enterprise_id??n.enterprise?.id:a,c=i?.user_id;return r?.api_app_id?{app:r.api_app_id,...s?{installation:s}:{},...o&&a?{within:a}:{},...c?{self:c}:{}}:void 0},welcome:async(e,t,n)=>(await import(`./views-DEdKqLm_.js`)).welcome(e,t,n),link(e){let t=/^slack:([^:]+):(\d+)\.(\d+)$/.exec(e.chat?.thread.id??``);return t?`https://slack.com/archives/${t[1]}/p${t[2]}${t[3]}`:void 0},ownEvents(e,t,n,r){let i=$.target(e,t),a=st(Z(t),n.id,i&&!(i instanceof Response)?i.installation:void 0);if(a)return ct(e,t,r?.signingSecret)?a:{invalid:!0}},adapter:async e=>(await import(`./adapter-CU9H4g6c.js`)).slackAdapter(e),event(e,t,n){let r=n.raw.channel_type;return{type:t.isDM?`dm`:e===`mention`?e:Q(r),actor:{id:n.author.userId,...n.author.userName?{login:n.author.userName}:{}}}},requestFetch:ze,isUninstalled(e){let t=e?.data?.error;return[`invalid_auth`,`account_inactive`,`token_revoked`].includes(t??``)},conversation:async(e,t)=>(await import(`./conversation-DT-35cEt.js`)).slackConversation(e,t),auth:{canWrite:Be,async token(e){if(!e.token)throw Error(`Slack installation ${e.id} has no bot token`);return e.token}}};export{W as a,Ie as c,b as d,g as f,lt as i,R as l,ne as m,Q as n,Re as o,p,$ as r,Le as s,at as t,x as u};
@@ -0,0 +1,7 @@
1
+ import{qi as e}from"./core-DwsAMCnL.js";import{D as t,En as n,F as r,It as i,O as a,Q as o,S as s,Sn as c,Tn as l,U as u,Z as d,at as f,d as p,g as m,gt as h,v as g,wn as ee,yn as _}from"./errors-XBA-Ls4n.js";import{Ct as v,I as y,Kt as b,L as x,O as te,ct as ne,gt as S,j as re,mt as ie,ot as C,q as w,st as T}from"./output-D95NoAA9.js";import{t as E}from"./integrations-DyInAa5g.js";import{a as D,c as O,d as k,m as A,s as j,t as M,u as N}from"./actions-BT7_eKXm.js";import{t as ae}from"./log-view-CL3_S0IQ.js";import{i as P}from"./mcp-Bta09QCU.js";import{a as oe,d as se,r as ce,s as le,u as ue}from"./exec-iFssTO5V.js";import{n as de}from"./async-XNO3nqum.js";import F from"node:path";import I from"node:process";import{execFile as fe}from"node:child_process";import{createHash as L}from"node:crypto";import R from"node:os";import z from"node:net";import B from"node:fs/promises";import{promisify as V}from"node:util";import H from"node:http";import{gunzipSync as U,gzipSync as W}from"node:zlib";const G=e=>L(`sha256`).update(e).digest(`hex`);function K(e,t,n){if(e===`claude`)return F.join(w(),process.env.CLAUDE_CODE_PROJECT_DIR_NAME||`coder`,`${t}.jsonl`);let r=new Date(JSON.parse(n.slice(0,n.indexOf(`
2
+ `))).timestamp).toISOString().slice(0,19).replaceAll(`:`,`-`);return F.join(f(),`sessions`,...r.slice(0,10).split(`-`),`rollout-${r}-${t}.jsonl`)}function q(e,t){return t.flatMap(e=>[e,...e.startsWith(`Bearer `)?[e.slice(7)]:[]]).filter(e=>e.length>=8).flatMap(e=>[e,JSON.stringify(e).slice(1,-1)]).sort((e,t)=>t.length-e.length).reduce((e,t)=>e.replaceAll(t,`[REDACTED]`),e)}function J(e,t){let n=new Map;return{async restore(){let t=await e(`/history`).catch(e=>(console.error(`coder runner: saved history could not be listed`,e),[])),r=t.at(-1),i;return await Promise.all(t.map(async({engine:t,conversation:a})=>{if(N.test(a))try{let{data:o,state:s}=await e(`/history/${a}`);a===r.conversation&&(i=s);let c=U(Buffer.from(o,`base64`)).toString(`utf8`);for(let e of c.split(`
3
+ `))e.trim()&&JSON.parse(e);let[l]=await A({engine:t},a);l||(l=K(t,a,c),await B.mkdir(F.dirname(l),{recursive:!0,mode:448}),await B.writeFile(l,c,{mode:384})),n.set(a,{engine:t,hash:G(c),file:l})}catch(e){console.error(`coder runner: history ${a} could not be restored`,e)}})),{...r?{resume:{...i,engine:r.engine,threadId:r.conversation}}:{},restored:!!(r&&n.has(r.conversation))}},async save(r){let i=new Map([...n].map(([e,{engine:t}])=>[e,t]));if(r?.engine===`claude`||r?.engine===`codex`)for(let e of k(r))i.delete(e),i.set(e,r.engine);let a=await t();for(let[t,o]of i){let i=n.get(t)?.file,s=i&&await B.stat(i).then(e=>e.isFile(),()=>!1)?i:(await A({engine:o},t))[0],c=s?await B.readFile(s,`utf8`).catch(()=>``):``,l=t===r?.threadId;if(!c||!l&&G(c)===n.get(t)?.hash)continue;let u=W(q(c,a)).toString(`base64`);if(u.length>3145728){console.error(`coder runner: history ${t} is too large to save`);continue}let d=l?JSON.parse(q(JSON.stringify({previousThreadIds:r.previousThreadIds,pendingRollover:r.pendingRollover}),a)):void 0;await e(`/history`,{method:`POST`,body:JSON.stringify({engine:o,conversation:t,data:u,...d?{state:d}:{}})}).then(()=>n.set(t,{engine:o,hash:G(c),file:s}),e=>console.error(`coder runner: history ${t} was not saved`,e))}}}}var pe=e({INBOX_COMMAND:()=>Pe,INBOX_SOCKET:()=>je,applyTaskMessage:()=>De,checkout:()=>Q,checkoutCache:()=>he,inboxSocket:()=>Me,prepareRepo:()=>we,receiveInbox:()=>Fe,releaseCheckout:()=>ge,requestInboxControl:()=>Ee,runTask:()=>ke,sendInbox:()=>Ne,startInboxControl:()=>Te,taskServer:()=>X,withCheckoutLock:()=>$});const Y=V(fe);function X(){let e=I.env.CODER_SERVER?.replace(/\/+$/,``),t=I.env.CODER_TASK_TOKEN;if(!e||!t)throw Error(`CODER_SERVER and CODER_TASK_TOKEN are required with --task`);return{server:e,token:t}}async function Z(e,t,n,r=``,i={}){let a=await fetch(`${e}/tasks/${encodeURIComponent(n)}${r}`,{...i,signal:i.signal?AbortSignal.any([i.signal,AbortSignal.timeout(3e4)]):AbortSignal.timeout(3e4),headers:{authorization:`Bearer ${t}`,...i.body?{"content-type":`application/json`}:{},...i.headers}}),o=await a.json().catch(()=>({}));if(!a.ok)throw Object.assign(Error(o.error??`Coder server answered ${a.status}`),{status:a.status});return o}function me(e){return e.length>0&&!e.startsWith(`-`)&&!e.endsWith(`/`)&&!e.endsWith(`.`)&&!e.endsWith(`.lock`)&&!/[\x00-\x20\x7f~^:?*[\\]/.test(e)&&!e.includes(`..`)&&!e.includes(`@{`)&&!e.includes(`//`)}async function Q(e,t,n,r,i){let a=e.event?.repo;if(!a)return t;let o=F.join(t,`repo`);if(!me(a.defaultBranch))throw Error(`Invalid repository ref`);let s=new URL(a.cloneUrl),c=E[e.event.integration]?.repos?.cloneHosts??[];if(s.protocol!==`https:`||!c.includes(s.hostname))throw Error(`Repository clone host does not match the integration`);await B.mkdir(t,{recursive:!0});let l=await B.mkdtemp(F.join(t,`.git-credential-`)),u=F.join(l,`token`),d=F.join(l,`askpass.sh`);n&&(await B.writeFile(u,n,{mode:384}),await B.writeFile(d,`#!/bin/sh
4
+ case "$1" in *Username*) printf x-access-token;; *) command cat "$CODER_GIT_TOKEN_FILE";; esac
5
+ `,{mode:448}));let f=n?{env:{...I.env,GIT_ASKPASS:d,CODER_GIT_TOKEN_FILE:u,GIT_TERMINAL_PROMPT:`0`}}:void 0;try{let e={...f,signal:i,maxBuffer:67108864};if(r)return await $(r,async()=>{if(!await B.stat(F.join(r,`.git`)).catch(()=>void 0)){let t=await B.mkdtemp(`${r}-clone-`);try{await Y(`git`,[`clone`,`--depth`,`50`,a.cloneUrl,t],e),await B.rename(t,r)}finally{await B.rm(t,{recursive:!0,force:!0})}}await Y(`git`,[`-C`,r,`worktree`,`prune`,`--expire`,`now`],e),await Y(`git`,[`-C`,r,`remote`,`set-url`,`origin`,a.cloneUrl],e),await Y(`git`,[`-C`,r,`fetch`,`--depth`,`50`,`origin`,a.defaultBranch],e),await Y(`git`,[`-C`,r,`worktree`,`add`,`--detach`,o,`FETCH_HEAD`],e)}),o;await B.stat(F.join(o,`.git`)).then(()=>!0).catch(()=>!1)||await Y(`git`,[`clone`,`--depth`,`50`,a.cloneUrl,o],e),await Y(`git`,[`-C`,o,`fetch`,`--depth`,`50`,`origin`,a.defaultBranch],e),await Y(`git`,[`-C`,o,`checkout`,`--detach`,`FETCH_HEAD`],e)}finally{await B.rm(l,{recursive:!0,force:!0})}return o}function he(e){let t=e.event?.repo;if(t){if(![t.owner,t.name].every(e=>/^[\w.-]+$/.test(e)&&!/^\.+$/.test(e)))throw Error(`Invalid repository name`);return m(`checkouts`,new URL(t.cloneUrl).hostname,t.owner,t.name)}}async function $(e,t){return l(`${e}.lock`,t,1/0,3e5)}async function ge(e){if(!(await B.stat(F.join(e,`.git`)).catch(()=>void 0))?.isFile())return;let t=await Y(`git`,[`-C`,e,`rev-parse`,`--git-common-dir`]).catch(async t=>{if(await B.stat(F.join(e,`.git`)).catch(()=>void 0))throw t});if(!t)return;let{stdout:n}=t,r=F.resolve(e,n.trim());await $(F.dirname(r),async()=>{await B.stat(F.join(e,`.git`)).catch(()=>void 0)&&await Y(`git`,[`--git-dir`,r,`worktree`,`remove`,`--force`,e])})}const _e=1048576;async function ve(e){let t={maxBuffer:67108864};await Y(`git`,[`-C`,e,`add`,`--intent-to-add`,`--all`],t);let{stdout:n}=await Y(`git`,[`-C`,e,`diff`,`HEAD`],t);return Buffer.byteLength(n)>_e?`${Buffer.from(n).subarray(0,_e).toString()}\n[diff truncated]`:n}async function ye(e,t){delete I.env.CODER_SERVER,delete I.env.CODER_TASK_TOKEN,delete I.env.APP_TOKEN;for(let t of Object.keys(e.tokens))delete I.env[P(t)];for(let t of e.engineCredentials??[])for(let e of Object.keys(t.credential.env))delete I.env[e];let{CODEX_AUTH_JSON:n,[ie]:r,...a}=e.credential.env;if(Object.assign(I.env,a),I.env[S]=JSON.stringify(e.config??{}),I.env.CODER_MCP_MODE=`cloud`,I.env.CODER_MCP_CONNECTION_ENV=JSON.stringify(i(e.connections??{})),!n)return;let o=await B.mkdtemp(F.join(t,`.codex-`));return await B.writeFile(F.join(o,`auth.json`),n,{mode:384}),I.env.CODEX_HOME=o,o}async function be(e,t){let{ANTHROPIC_API_KEY:n,CLAUDE_CODE_OAUTH_TOKEN:r}=e.credential.env;if(e.credential.engine!==`claude`||!n&&!r)return;let i=await B.mkdtemp(F.join(t,`.claude-`));return I.env.CLAUDE_CONFIG_DIR=i,I.env.CLAUDE_CODE_PROJECT_DIR_NAME=`coder`,i}async function xe(e,t,n){let r=n?await B.readFile(F.join(n,`auth.json`),`utf8`).catch(()=>``):``,i=(e=``)=>{let t=[];try{JSON.parse(e,(e,n)=>(typeof n==`string`&&/token|key/i.test(e)&&t.push(n),n))}catch{e&&console.error(`coder runner: history credentials could not be parsed`)}return t};return[t,...Object.values(e.tokens),...e.postToken?[e.postToken]:[],...Object.values(e.nativeTokens??{}),...Object.values(e.connectionEnv??{}),...Object.entries(e.credential.env).filter(([e])=>/KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|AUTH/i.test(e)).map(([,e])=>e),...i(e.credential.env.CODEX_AUTH_JSON),...e.engineCredentials?.flatMap(e=>[...Object.values(e.credential.env),...i(e.credential.env.CODEX_AUTH_JSON)])??[],...i(r)]}async function Se(e,t,n,r){if(!r)return;let i=await B.readFile(F.join(r,`auth.json`),`utf8`).catch(()=>``);i&&i!==n.credential.env.CODEX_AUTH_JSON&&await Z(e.server,e.token,t,`/credential`,{method:`POST`,body:JSON.stringify({authJson:i,credentialId:n.task.credential})}).catch(()=>{}),await B.rm(r,{recursive:!0,force:!0})}const Ce=[[`bun.lock`,`bun`,[`install`,`--frozen-lockfile`]],[`bun.lockb`,`bun`,[`install`,`--frozen-lockfile`]],[`pnpm-lock.yaml`,`npx`,[`-y`,`pnpm`,`install`,`--frozen-lockfile`]],[`yarn.lock`,`npx`,[`-y`,`yarn`,`install`,`--frozen-lockfile`]],[`package-lock.json`,`npm`,[`ci`]]];async function we(e,t){let n=X(),r=await Z(n.server,n.token,e),i=r.task.event;if(!i?.repo)throw Error(`The task has no repository`);let a=await Q(r.task,t,r.tokens[i.integration]);for(let[e,t,n]of Ce)if(await B.stat(F.join(a,e)).catch(()=>void 0)){await Y(t,n,{cwd:a,maxBuffer:67108864}).catch(()=>{});break}let o=(await Y(`git`,[`-C`,a,`rev-parse`,`HEAD`])).stdout.trim();return console.log(`coder-snapshot ${o}`),{sha:o}}function Te(e,t,n){let r=new Set,i=ne(F.join(e,`inbox-control`),{apply(e){let i=e.entry;if(e.task!==t||!Number.isInteger(i?.seq)||i.seq<0||!Number.isInteger(i.generation)||i.generation<0||![`steer`,`ask`,`approve`].includes(i.kind))throw Error(`Invalid engine inbox command`);let a=n(i);return r.add(a),a.finally(()=>r.delete(a)).catch(()=>{}),a}});return{close:async()=>{i(),await Promise.allSettled([...r])}}}function Ee(e,t,n){let r=T({task:t,generation:n.generation,seq:n.seq});return C(`apply`,{task:t,entry:n},{dir:F.join(e,`inbox-control`),id:r,keepReply:!0,timeoutMs:3e4})}async function De(e,t,n,r=D(t.mcp)){let i={task:t.name?.slice(6)??t.id,generation:n.generation,seq:n.seq},s=F.join(u(e,t.id),`inbox-control`,`${T(i)}.transcript.jsonl`);return l(`${s}.lock`,async()=>{let c=await B.readFile(s,`utf8`).catch(e=>{if(e.code===`ENOENT`)return``;throw e});for(let e of c.split(`
6
+ `)){if(!e.trim())continue;let t;try{t=JSON.parse(e)}catch{continue}if(T(t.command)===T(i)&&Object.hasOwn(t,`result`))return t.result}let l=n.value;if(n.kind===`steer`){let s=String(l?.text??n.value??``),c=!1;t.threadId||(c=await o(e,t.id,()=>{let n=a(e,t.id)??t;if(n.threadId)return!1;if(n.steerClosed||![`running`,`queued`].includes(n.status))throw Error(`Task stopped before it opened a conversation`);return g(e,t.id,s),!0})),c||await j(e,a(e,t.id)??t,s,{command:i,resolveConnections:r})}else if(n.kind===`ask`){let r=await M(e,t,String(l?.question??n.value??``),{command:i});return r.finalMessage??r.error?.message??``}else n.kind===`approve`&&x(u(e,t.id),String(l?.approvalId??l?.id??``),l?.decision===`deny`||l?.decision===`decline`?`decline`:`accept`);await B.mkdir(F.dirname(s),{recursive:!0}),await B.appendFile(s,JSON.stringify({command:i,result:null})+`
7
+ `)})}async function Oe(e){for(let t=1;;t++)try{return await e()}catch(e){let n=e.status;if(n!==void 0&&n<500||t>=6)throw e;console.error(`coder runner: Coder server did not take the request, trying again: ${e instanceof Error?e.message:e}`),await new Promise(e=>setTimeout(e,1e3*2**(t-1)))}}async function ke(e,t){let n=X();h(`runner.credentials.start`);let r=await Oe(()=>Z(n.server,n.token,e)).catch(async t=>{throw await Z(n.server,n.token,e,`/result`,{method:`POST`,body:JSON.stringify({status:`failed`,error:t instanceof Error?t.message:String(t)})}).catch(()=>{}),t});h(`runner.credentials.done`);let i=r.task.event,o=i&&r.tokens[i.integration],s=I.env.CODER_INBOX_MODE===`poll`;delete I.env.CODER_INBOX_MODE;let l=I.env.CODER_CHECKOUT_CACHE;delete I.env.CODER_CHECKOUT_CACHE;let u,d,f={CODEX_HOME:I.env.CODEX_HOME,CLAUDE_CONFIG_DIR:I.env.CLAUDE_CONFIG_DIR},p,m=new AbortController,g=setTimeout(()=>m.abort(Error(`timeout`)),r.timeoutMs??18e5),ee=setInterval(()=>{Z(n.server,n.token,e,`/heartbeat`,{method:`POST`,signal:AbortSignal.timeout(1e4)}).catch(()=>{})},3e4),_,v=async()=>{let i=c(F.join(t,`.runner-task.json`)),o=_&&i?.generation===r.generation?a(_,i.id):void 0;await p?.save(o??void 0).catch(e=>console.error(`coder runner: history upload failed`,e)),d&&await B.rm(d,{recursive:!0,force:!0}),await Se(n,e,r,u)},y=!1,b=async t=>{y=!0,await v(),await Oe(()=>Z(n.server,n.token,e,`/result`,{method:`POST`,body:JSON.stringify(t)}))};try{let i=(async()=>{[u,d]=await Promise.all([ye(r,t),be(r,t)]),p=r.task.flow==="default"?J((t,r)=>Z(n.server,n.token,e,t,r),()=>xe(r,n.token,u)):void 0,h(`runner.environment.done`);let i=await p?.restore();return h(`runner.history.done`),i})();h(`runner.checkout.start`);let a=Promise.race([Q(r.task,t,o,l,m.signal),new Promise((e,t)=>m.signal.addEventListener(`abort`,()=>t(m.signal.reason),{once:!0}))]).then(e=>(_=e,h(`runner.checkout.done`),e)),[c,g]=await Promise.allSettled([a,i]);if(c.status===`rejected`)throw c.reason;if(g.status===`rejected`)throw g.reason;return m.signal.throwIfAborted(),await Ae(e,t,n,r,c.value,o,s,m.signal,v,b,g.value,r.engineCredentials?async e=>{if(e===r.credential.engine)return!0;let n=r.engineCredentials.find(t=>t.credential.engine===e);if(!n)return!1;await v();for(let[e,t]of Object.entries(f))t===void 0?delete I.env[e]:I.env[e]=t;return r.credential=n.credential,r.task={...r.task,credential:n.id,usage:{...r.task.usage,engine:e,model:void 0,effort:void 0}},[u,d]=await Promise.all([ye(r,t),be(r,t)]),!0}:void 0)}catch(e){throw y||await b({status:`failed`,error:e instanceof Error?e.message:String(e),...r.task.event&&E[r.task.event.integration]?.isUninstalled?.(e)?{installationRevoked:!0}:{}}).catch(e=>console.error(`coder runner: result delivery failed`,e)),e}finally{clearTimeout(g),clearInterval(ee);try{_&&await ge(_)}finally{delete I.env[S],delete I.env.CODER_MCP_MODE,delete I.env.CODER_MCP_CONNECTION_ENV}}}async function Ae(e,i,o,l,f,m,h,g,x,ne,S,ie){let C=l.task.event,w=l.task.flow==="default"?l.postToken:m,T=new AbortController,D,k,A=!1,j=await Fe({root:i,generation:l.generation,apply:async t=>{let n=D&&a(f,D);if(!n)throw Error(`The task is not ready`);if(t.kind===`cancel`){await O(f,n),A=!0,await G(),await x();return}return Ee(u(f,n.id),e,t)}}),M=j.ack().seq>=0?j.ack():void 0,N,P=()=>{if(N)return N;if(!M)return Promise.resolve();let t=M;return N=Z(o.server,o.token,e,`/ack`,{method:`POST`,body:JSON.stringify(t),signal:T.signal}).then(()=>{M&&M.seq<=t.seq&&(M=void 0)}).catch(e=>{throw(e.status===401||e.status===403)&&(M=void 0),e}).finally(()=>{N=void 0}),N},I=async()=>{let t=await Z(o.server,o.token,e,`/messages?after=${j.ack().seq}`,{signal:T.signal});try{t.length&&await j.apply(t)}finally{t.length&&j.ack().seq>=0&&(M=j.ack()),await P().catch(()=>{})}},fe=setInterval(()=>{P().catch(()=>{})},1e3),L=c(F.join(i,`.runner-task.json`)),R=new Map,z=new Map,B=(l.logCursor??-1)+1,V=0,H=[],U,W=()=>{for(let e of z.values())for(let t of e()){if(V>=2097152)continue;let e=Buffer.byteLength(t)>65536?`A task log entry exceeded 64 KB`:t;H.push({seq:B++,at:Date.now(),level:`out`,line:e}),V+=Buffer.byteLength(e)}return U||(U=(async()=>{for(;H.length;){let t=0,n=H.slice(0,100).filter(e=>(t+=Buffer.byteLength(JSON.stringify(e)))<524288);if(!n.length)throw Error(`Task log batch is too large`);let r=!1;for(let t=0;t<3;t++)try{await Z(o.server,o.token,e,`/logs`,{method:`POST`,signal:AbortSignal.timeout(5e3),body:JSON.stringify({entries:n})}),r=!0;break}catch(e){if(t===2)throw e;await new Promise(e=>setTimeout(e,1e3))}r&&H.splice(0,n.length)}})().finally(()=>{U=void 0}),U)},G=()=>W().catch(e=>{console.error(`coder runner: log delivery failed`,e)}),K,q,J=!1,pe=L?.generation===l.generation?L.usageStart:0,Y=L?.generation===l.generation?L.turn:0,X=Y+1,me=(e,t=!1,n=!1)=>oe(E[C.integration],C,e,w,l.task.author,t,n),Q=async t=>{await Z(o.server,o.token,e,`/result`,{method:`POST`,body:JSON.stringify({status:`waiting`,approval:t})})};try{let t=S?.restored&&S.resume?.engine===re({engine:l.task.usage?.engine??l.task.definition.engine,model:l.task.usage?.model??l.task.definition.model},v(f)).engine,c,m=ce({cwd:f,...L?.generation===l.generation?{resumeTaskId:L.id,resumeTurn:Y}:{},...S?.resume?{resume:S.resume}:{},agent:l.task.agent,flow:l.task.flow,task:t?{...l.task,context:{...l.task.context,messages:void 0}}:l.task,toolEnvironment:{tokens:{...l.tokens,...l.nativeTokens},native:Object.keys(l.nativeTokens??{})},replyEndpoint:{url:`${o.server}/tasks/${encodeURIComponent(e)}`,token:o.token},connections:l.connections,connectionEnv:l.connectionEnv,post:l.task.source===C?.integration,...w?{postToken:w}:{},onStart(e){k=e},onWorker(e,t){c=t,t.once(`error`,()=>{c=void 0})},async onTask(e,t){if(D=e,g.aborted){let t=a(f,e);throw t&&await O(f,t),g.reason}z.has(e)||z.set(e,_(F.join(u(f,e),`log.jsonl`))),R.has(e)||R.set(e,ee(u(f,e),e=>{(!e||e===`log.jsonl`)&&W().catch(()=>{})})),W().catch(()=>{}),n(F.join(i,`.runner-task.json`),{generation:l.generation,id:e,turn:t??Y,usageStart:pe}),await P().catch(()=>{}),await I().catch(()=>{}),clearInterval(K),h&&(K=setInterval(()=>{q||=I().catch(()=>{}).finally(()=>{q=void 0})},4e3))},onApproval:Q,onEngine:ie}),x=new Promise((e,t)=>{let n=()=>t(g.reason);g.addEventListener(`abort`,n,{once:!0}),g.aborted&&n()}),T=await Promise.race([m,x]);if(X=(T.turn??Y)+1,D&&l.task.flow==="default"){let e=[...T.postedMessages??[]],t=d(f,D,c);try{for(;;){let n=r(f,D);for(let[t,r]of n.slice(X).entries()){let n=ue(l.task,r,A,r);n.skipped&&p(f,D,{kind:`status`,message:b}),l.task.source===C?.integration&&n.text&&!n.duplicate&&e.push(...await le(f,D,X+t,()=>me(n.text,n.problem))),T.reply=n.text,T.ok=r.status===0}X=Math.max(X,n.length);let i=a(f,D);if(i?.status===`running`||i?.status===`queued`){await Promise.race([se(f,D,Q,(e,t)=>y(e,t,{turn:X,worker:c,signal:g})),x]);continue}if(i?.rollingOver){await Promise.race([y(f,D,{rollover:!0,worker:c,signal:g}),x]);continue}if(c?.exitCode===null&&!c.signalCode||s(f,D)||de(u(f,D))){await Promise.race([t.wait(3e4),x]);continue}if(!J){clearInterval(K),await q,await j.close(),J=!0;continue}if(r(f,D).length<=X)break}}finally{t.close()}let n=(a(f,D)?.turnUsage??[]).slice(pe).flatMap(e=>e.tokens?[e.tokens]:[]);T.tokens=n.length?n.reduce((e,t)=>ae(e,t)):te(f,D)?.tokens??T.tokens,e.length&&(T.postedMessages=e)}for(await G();M;)g.throwIfAborted(),await P().catch(()=>{}),M&&await new Promise(e=>setTimeout(e,1e3));return await ne({status:A?`cancelled`:T.ok?`completed`:`failed`,result:T.reply??T.result,tokens:T.tokens,...T.postedMessages?.length?{postedMessages:T.postedMessages}:{},...f===i?{}:{diff:await ve(f).catch(()=>void 0)}}),T}catch(n){if(g.aborted){k?.requestStop();let n=new Set([...D?[D]:[],...k?.runningIds()??[],...t(f).filter(t=>t.name===`agent:${e}`||k&&t.flowRunId===k.runId).map(e=>e.id)]);for(let e of n){z.has(e)||z.set(e,_(F.join(u(f,e),`log.jsonl`)));let t=a(f,e);t&&await O(f,t)}}throw await G(),n}finally{for(let e of R.values())e.close();await U?.catch(()=>{}),clearInterval(fe),clearInterval(K),T.abort(),await Promise.allSettled([q,N]),J||await j.close()}}const je=`/tmp/coder-inbox.sock`,Me=e=>F.join(R.tmpdir(),`coder-${L(`sha256`).update(e).digest(`hex`).slice(0,24)}.sock`);function Ne(e,t){return new Promise((n,r)=>{let i=H.request({socketPath:e,path:`/messages`,method:`POST`,headers:{"content-type":`application/json`}},e=>{let t=``;e.on(`data`,e=>{t+=e}),e.on(`end`,()=>{if(e.statusCode!==200)return r(Error(`Task inbox answered ${e.statusCode}`));try{n(JSON.parse(t))}catch(e){r(e)}}),e.on(`error`,r)});i.setTimeout(1e4,()=>i.destroy(Error(`Task inbox timed out`))),i.on(`error`,r),i.end(JSON.stringify({entries:t}))})}const Pe=`const http=require('node:http');const req=http.request({socketPath:process.env.CODER_INBOX_SOCKET||'/tmp/coder-inbox.sock',path:'/messages',method:'POST',headers:{'content-type':'application/json'}},res=>{res.pipe(process.stdout);res.on('end',()=>{if(res.statusCode!==200)process.exitCode=1})});req.on('error',()=>{process.exitCode=1});req.setTimeout(10000,()=>req.destroy());req.end(JSON.stringify({entries:JSON.parse(process.env.CODER_INBOX_MESSAGES)}));`;async function Fe(e){let t=F.join(e.root,`.runner-inbox.json`),r=c(t),i=r?.generation===e.generation?r:{generation:e.generation,seq:-1,answers:[]},a=Promise.resolve(),o=r=>{let o=async()=>{if(!Array.isArray(r)||r.some(t=>!Number.isInteger(t.seq)||t.seq<0||t.generation!==e.generation||![`steer`,`ask`,`approve`,`cancel`].includes(t.kind)))throw Error(`Invalid task messages`);for(let a of[...r].sort((e,t)=>e.seq-t.seq)){if(a.seq<=i.seq)continue;let r=await e.apply(a),o={generation:e.generation,seq:a.seq,answers:[...i.answers??[],...a.kind===`ask`?[{seq:a.seq,value:r}]:[]]};n(t,o),i=o}return i},s=a.then(o,o);return a=s.then(()=>{},()=>{}),s},s=e.socketPath??I.env.CODER_INBOX_SOCKET??Me(e.root);if(await B.lstat(s).then(()=>!0,()=>!1)){if(!await new Promise((e,t)=>{let n=z.connect(s);n.once(`connect`,()=>{n.destroy(),e(!1)}),n.once(`error`,n=>n.code===`ECONNREFUSED`?e(!0):t(n))}))throw Error(`The task inbox is already running`);await B.unlink(s)}let l=H.createServer(async(e,t)=>{if(e.method!==`POST`||e.url!==`/messages`){t.writeHead(404).end();return}let n=``;try{for await(let t of e)if(n+=t,Buffer.byteLength(n)>1048576)throw Error(`Messages too large`);let r=await o(JSON.parse(n).entries);t.writeHead(200,{"content-type":`application/json`}).end(JSON.stringify(r))}catch{t.writeHead(409).end()}});return await B.mkdir(e.root,{recursive:!0}),await new Promise((e,t)=>{l.once(`error`,t),l.listen(s,e)}),await B.chmod(s,384),{apply:o,ack:()=>i,close:async()=>{await a,await new Promise(e=>l.close(()=>e()))}}}export{Me as a,ke as c,pe as d,$ as f,he as i,Ne as l,je as n,we as o,De as r,ge as s,Pe as t,X as u};
@@ -0,0 +1 @@
1
+ import{qi as e}from"./core-DwsAMCnL.js";import{Bt as t,D as n,E as r,I as i,O as a,P as o,Sn as s,T as c,U as l,et as u,it as d,l as f,p,y as m}from"./errors-XBA-Ls4n.js";import{Ct as h,D as g,E as _,F as v,H as y,I as b,L as x,M as S,P as C,Zt as w,k as T,w as E}from"./output-D95NoAA9.js";import{v as D}from"./prompt-onpyIyXK.js";import{t as O}from"./remote-CDm0YUU3.js";import{c as k,i as A,l as ee,n as j,r as M,s as N,t as P}from"./actions-BT7_eKXm.js";import F from"node:path";import I from"node:process";var L=e({tasks:()=>$});function R(e){return{cwd:e.cwd?F.resolve(e.cwd):I.cwd(),...e.server===void 0?{}:{api:O(e)}}}function z(e,t){let n=m(e,t);if(n)return n;throw new w(`invalid-option`,t?`No task found for "${t}".`:`No tasks found for this workspace.`,{hint:t?[`List tasks: coder task list`,`Start one: coder run "<text>"`]:[`Start one: coder run "<text>"`]})}async function B(e,t){if(t)return e.tasks.get(t);let[n]=await e.tasks.list({limit:1});if(!n)throw new w(`server`,`No server tasks found.`);return n}function V(e){throw new w(`invalid-option`,`Missing task id.`,{hint:e})}async function H(e,n={}){if(n.outputSchema!==void 0&&(!n.outputSchema||typeof n.outputSchema!=`object`||Array.isArray(n.outputSchema)))throw new w(`invalid-option`,`outputSchema must be an object.`);let{cwd:r,api:i}=R(n);if(i){let t=await i.tasks.create({source:`cli`,prompt:e,...n.cwd?{cwd:n.cwd}:{},...n.outputSchema?{outputSchema:n.outputSchema}:{},...n.repo?{repo:n.repo}:{},...n.agent?{agent:n.agent}:{},...n.engine?{engine:n.engine}:{},...n.model?{model:n.model}:{},...n.effort?{effort:n.effort}:{},...n.permissions?{permissions:n.permissions}:{},...n.runner?{runner:n.runner}:{},...n.mcp?{mcp:n.mcp.split(`,`).map(e=>e.trim())}:{},...n.connections?{connections:n.connections}:{}});return n.wait?i.tasks.wait(t.task.id,{onLog:n.onLog}):t}let a=n.agent?await(await import(`./exec-iFssTO5V.js`).then(e=>e.i)).agentTaskOptions(r,n.agent,n.mcp,void 0,n.connections):void 0,o=a?.connected??await t(n.connections);for(let e of o.warnings)n.onNote?.(e);let s=h(r),c=a??S(n.mcp,s.mcp,{},o.mcp),l={prompt:e,outputSchema:n.outputSchema,cwd:r,engine:n.engine??a?.engine,model:n.model??(n.engine?void 0:a?.model),effort:n.effort??(n.engine?void 0:a?.effort),permissions:n.permissions??a?.permissions,name:n.name,system:n.system,...a?{agentPrompt:{developer:a.developer}}:{},wait:n.wait,simulateApproval:n.simulateApproval,addDirs:n.addDirs,...n.agent?{agentId:n.agent}:{},mcp:c.mcp,mcpBindings:c.mcpBindings,mcpWarnings:c.warnings,connectionEnv:o.env,connections:o.ids,nativeMcp:c.nativeMcp,...n.onFallback?{onFallback:n.onFallback}:{},...n.onNote?{onNote:n.onNote}:{}},u=await _(l,{config:s});if(!n.wait){let e=u.taskId;return{taskId:e,status:u.task.status,startupCheck:u.startupCheck,commands:{result:`coder task result ${e} --wait`,steer:`coder task steer ${e} "<follow-up>"`,stop:`coder task stop ${e}`,list:`coder task list`}}}for(;;){let t=u.taskId;n.onWaiting?.(t);let i=await b(r,t),{task:a,result:o}=i,c=o?.error?.message??``;if(a.status===`failed`&&g(a.permissions??`auto`,c))throw new w(`read-only-unavailable`,c);let d=C(r,i,s);if(d!==void 0){if(d===null)throw new w(`chain-exhausted`,c,{payload:E(u.engine,c,a.permissions??`auto`,n.system,e)});n.onFallback?.({engine:u.engine,detail:c,next:d}),u=await _({...l,engine:d,model:void 0,effort:void 0,name:void 0,simulateApproval:void 0},{config:s});continue}return{taskId:t,status:a.status,finalMessage:o?.finalMessage,...c||a.error?{error:c||a.error}:{},tokens:o?.tokens??null,model:o?.model??a.model??null}}}async function U(e,t={}){let{cwd:n,api:r}=R(t);if(r){let n=await B(r,e);return t.wait?r.tasks.wait(n.task.id):n}let i=z(n,e);if(t.wait){u.includes(i.status)&&t.onWaiting?.(i.id);let e=await v(n,i);if(i=e.task,e.reason===`approval`)throw new w(`approval-pending`,`Approval needed for task ${i.id}: ${e.approval.summary}`,{taskId:i.id,approval:e.approval})}let{steps:a,result:s,turns:d}=T(n,i.id,{tail:t.tail}),p=y(l(n,i.id)).filter(e=>!e.response),m=u.includes(i.status),h=m?c(n,i):i.updatedAt,g=f(h),_=m?o(n,i.id,200):[];return{taskId:i.id,status:m&&p.length?`waiting-approval`:i.status,task:i,result:s,steps:a,turns:d,pendingApprovals:p.map(e=>({id:e.id,summary:e.summary,cwd:e.cwd??null})),...m?{idleMs:g,lastActivityAt:h??null,stalled:p.length===0&&g>6e5,lastLog:_.at(-1),liveTokens:_.reverse().find(e=>e.kind===`usage`&&String(e.at??``)>=(i.resumedAt??``))?.tokens??null}:{}}}async function W(e={}){let{cwd:t,api:n}=R(e);if(n){let t=await n.tasks.list({status:e.running?`running`:void 0,limit:e.limit===`all`?200:e.limit,archived:e.archived});return e.stopped?t.filter(e=>d.includes(e.status)):t}let{tasks:i,clipped:a}=M(t,{...e,dir:e.dir??e.cwd}),o=i.map(e=>{let n=u.includes(e.status)?y(l(t,e.id)).filter(e=>!e.response).length:0;return{taskId:e.id,status:n?`waiting-approval`:e.status,pendingApprovals:n,engine:e.engine??null,model:e.model??null,effort:e.effort??null,name:e.name??null,cwd:e.cwd??null,prompt:String(e.prompt??``).replace(/\s+/g,` `).trim().slice(0,80),updatedAt:e.updatedAt,archived:e.archived??!1,flowRunId:e.flowRunId??null,idleMs:u.includes(e.status)?f(c(t,e)):null}}),s=!o.length&&!e.archived?r(t,{migrate:!1}).length:0;return Object.assign(o,{clipped:a,archived:s})}async function*G(e,t){let n=-1;for(;;){let r=await e.tasks.stream(t,n);if(!r.ok||!r.body){let n=await e.tasks.get(t);if(d.includes(n.status))return;if(r.status===401)continue;throw new w(`server`,`The task stream answered ${r.status}.`)}let i=!1;for await(let e of D(r.body))if(e.event===`log`){let t=JSON.parse(e.data);n=t.seq,yield t}else e.event===`end`&&(i=!0);if(i)return}}async function*K(e){yield*await e}async function q(e,t={}){let{cwd:n,api:r}=R(t);if(r){let n=await B(r,e);return{task:n,events:t.from===void 0?G(r,n.task.id):K(r.tasks.logs(n.task.id,t.from-1)),final:()=>r.tasks.get(n.task.id)}}let c=z(n,e);return{task:c,events:t.from===void 0?ee(n,c.id,{tail:t.tail}):K(o(n,c.id,1/0).slice(t.from)),async final(){let e=i(n,a(n,c.id)??c),t=s(F.join(l(n,c.id),`result.json`));return{taskId:c.id,status:e.status,result:t,task:e}}}}async function J(e,t,n={}){let{cwd:r,api:i}=R(n);if(i){let r=await i.tasks.steer(e,t,{...n.model?{model:n.model}:{},...n.effort?{effort:n.effort}:{},...n.permissions?{permissions:n.permissions}:{}});return n.wait?i.tasks.wait(e):r}let o=await N(r,z(r,e),t,{model:n.model,effort:n.effort,permissions:n.permissions});if(!n.wait||o.steered===`queued`)return o;let c=a(r,o.taskId),u=c?(await b(r,c.id)).task:null,d=s(F.join(l(r,o.taskId),`result.json`));return{...o,status:u?.status??null,finalMessage:d?.finalMessage??null}}async function Y(e,t,n={}){let{cwd:r,api:i}=R(n);if(i)return i.tasks.ask(e,t);let a=z(r,e);n.onAsking?.(a.id);let o=await P(r,a,t,{model:n.model,effort:n.effort});return{taskId:a.id,answer:o.finalMessage||null,...o.error?{error:o.error.message}:{},ok:o.status===0}}async function X(e,t={}){let{cwd:n,api:r}=R(t);if(r)return(e?[await r.tasks.get(e)]:await r.tasks.list({limit:200})).flatMap(e=>e.approval?[{taskId:e.task.id,...e.approval}]:[]);if(!e)return j(n);let i=z(n,e);return y(l(n,i.id)).map(e=>({taskId:i.id,id:e.id,summary:e.summary,cwd:e.cwd??null,createdAt:e.createdAt,answered:e.response?.decision??null}))}async function Z(e,t,n={}){let{cwd:r,api:i}=R(n),a=n.deny?`decline`:`accept`;if(i){if(!e||!t)throw new w(`invalid-option`,`Server approvals need a task id and approval id.`,{hint:`Usage: coder task approve <task-id> <approval-id> --server <url>`});return i.tasks.approve(e,t,a)}if(e&&!t&&e.startsWith(`apr-`)&&(t=e,e=j(r).find(e=>e.id===t)?.taskId,!e))throw new w(`invalid-option`,`No pending approval "${t}".`,{hint:`List them: coder task approvals`});if(!e||!t)throw new w(`invalid-option`,`Missing approval id.`,{hint:[`List them: coder task approvals`,`Usage: coder task approve [task-id] <approval-id> [--deny]`]});let o=z(r,e);return x(l(r,o.id),t,a),{taskId:o.id,approvalId:t,decision:a}}async function Q(e,t={}){let{cwd:n,api:r}=R(t);if(r)return r.tasks.cancel(e??V([]));let i=z(n,e),{interrupt:a}=await k(n,i);return{taskId:i.id,status:`cancelled`,interrupt:a}}async function te(e,t={}){let{cwd:r,api:i}=R(t);if(i){let n=t.allStopped?(await i.tasks.list({limit:200})).filter(e=>d.includes(e.status)).map(e=>e.task.id):[e??V([])];return await Promise.all(n.map(e=>i.tasks.archive(e))),{archived:n,count:n.length}}if(t.allStopped){let e=n(r).filter(e=>d.includes(e.status));for(let t of e)p(r,t);return{archived:e.map(e=>e.id),count:e.length}}e||V([`Archive one: coder task archive <task-id>`,`Archive all stopped: coder task archive --all-stopped`]);let a=z(r,e);return p(r,a),{taskId:a.id,archived:!0}}async function ne(e,t={}){let{cwd:n,api:i}=R(t);if(i){let n=t.allArchived?(await i.tasks.list({limit:200,archived:!0})).map(e=>e.task.id):[e??V([])];return await Promise.all(n.map(e=>i.tasks.delete(e))),{deleted:n,count:n.length}}if(t.allArchived){let e=r(n).filter(e=>A(n,e)).map(e=>e.id);return{deleted:e,count:e.length}}e||V([`Delete one: coder task delete <task-id>`,`Delete all archived: coder task delete --all-archived`]);let a=z(n,e);if(a.status===`running`)throw new w(`invalid-option`,`Task ${a.id} is still running.`,{hint:`Stop it first: coder task stop ${a.id}`});return A(n,a),{taskId:a.id,deleted:!0}}async function*re(e,t={}){yield*(await q(e,t)).events}const $={run:H,result:U,list:W,watch:q,stream:re,steer:J,ask:Y,approvals:X,approve:Z,stop:Q,archive:te,delete:ne};export{$ as n,L as t};
@@ -0,0 +1 @@
1
+ import{qi as e}from"./core-DwsAMCnL.js";import{cn as t,jn as n,kn as r,mn as i,on as a,u as o}from"./errors-XBA-Ls4n.js";import{c as s,s as c,t as l}from"./args-CbO_Ck9Z.js";import{f as u}from"./actions-BT7_eKXm.js";import{n as d}from"./turn-DMvPfhb5.js";import{r as f}from"./async-XNO3nqum.js";import{renderReviewMarkdown as p}from"./flow/builtin/review/index.js";import m from"node:path";import h from"node:process";import{randomUUID as g}from"node:crypto";import _ from"node:fs/promises";async function v(e,t,n=fetch){let r=h.env.CODER_REPLY_URL,i=h.env.CODER_REPLY_TOKEN;if(!r||!i)throw Error(`This task has no conversation to post to`);let a=JSON.stringify({id:g(),...t});for(let t=0;;t++){let o;try{o=await n(`${r}/${e}`,{method:`POST`,headers:{authorization:`Bearer ${i}`,"content-type":`application/json`},body:a,signal:AbortSignal.timeout(6e4)})}catch(e){if(t<2)continue;throw e}let s=await o.json().catch(()=>void 0);if(!o.ok)throw Error(s?.error??`The conversation ${e} failed (${o.status})`);return{ok:!0}}}async function y(){let e=h.env.CODER_HISTORY_TASK;if(!e)throw Error(`CODER_HISTORY_TASK is not set`);return{file:e,task:JSON.parse(await _.readFile(e,`utf8`))}}const b=[n({name:`reply`,description:`Post a reply now, during your turn, such as before longer work. Your final message is a reply too; never send the same text twice.`,args:{text:l(i(),`Markdown to post.`)},access:`write`,run:async({text:e},t)=>{let{file:n,task:r}=await y();if(!r.conversation)throw Error(`Only conversation tasks can reply`);if(typeof e!=`string`||!e.trim())throw Error(`Reply text is required`);let i=await v(`reply`,{text:e.trim()},t.fetch);return o(m.dirname(n),{kind:`reply`,message:e.trim()}),i}}),n({name:`react`,description:`React to a message in this conversation with an emoji, by default the one that started your turn.`,args:{emoji:l(i(),`An emoji name such as thumbsup, or the emoji itself.`),message:c(`A message id from the conversation.`)},access:`write`,run:async({emoji:e,message:t},n)=>{let{task:r}=await y();if(!r.conversation)throw Error(`Only conversation tasks can react`);if(typeof e!=`string`||!e.trim())throw Error(`Emoji is required`);if(t!==void 0&&(typeof t!=`string`||!t.trim()))throw Error(`Message id must be a non-empty string`);let i=d(r.currentPrompt??r.prompt??``,!0)?.[0],a=t??i?.message?.id??i?.messages?.[0]?.id;if(i&&!a)throw Error(`This turn has no message to react to; give a message id`);return v(`react`,{emoji:e.trim(),...a?{message:a}:{}},n.fetch)}}),n({name:`history`,description:"Search or read this task's earlier conversation, including your tool calls and results, oldest first. With query, the messages containing that exact text; without, the messages from `from` on.",args:{query:c(`Exact text to find, case-insensitive, 1 to 500 characters: a word or phrase from the message, not a question.`),from:l(t(a()),`Message index to start at; default the oldest, or after the last match.`),limit:l(t(a()),`Messages to return, 1 to 20; default 10.`)},access:`read`,run:async e=>u((await y()).task,e)})];var x=e({asyncTools:()=>C,taskApp:()=>T});const S={name:`review`,flow:`review`,limit:5,args:(e,t)=>({base:e.base??`HEAD`,...e.path?.length?{path:e.path}:{},...e.exclude?.length?{exclude:e.exclude}:{},cwd:t}),render:(e,t)=>p({...e,runId:t})},C=[S];function w(){let e=h.env.CODER_HISTORY_TASK;if(!e)throw Error(`CODER_HISTORY_TASK is not set`);return m.dirname(e)}const T=r({name:`coder`,description:`This task's tools: review its changes; in a conversation, reply, react and read its history`,commands:[n({name:`review`,description:`Review your changes with a separate read-only reviewer that checks each finding against the repository. One review at a time, ${S.limit} per task.`,args:{base:c(`The ref to compare with; default HEAD, so only uncommitted changes.`),path:s(`Review only these paths, relative to the task directory.`),exclude:s(`Leave these paths out.`),timeout:l(t(a()),`Stop the review after this many seconds.`)},access:`read`,run:async({timeout:e,...t})=>({runId:await f(w(),S,t,e),status:`started`})}),...b]});export{x as n,C as t};
@@ -0,0 +1 @@
1
+ import{c as e}from"./args-CbO_Ck9Z.js";import{command as t}from"./cli.js";const n=t({name:`tools`,description:`serve a task's tools over stdio`,access:`write`,args:{tools:e(`the tools to serve: review, reply, react, history`)},globalFlags:{json:!1,cwd:!1},cli:{positional:[`tools`]},mcp:!1,async run({args:e}){let{taskApp:t}=await import(`./tools-BMaKWTa6.js`).then(e=>e.n),{serve:n}=await import(`./serve-DE6A-rBk.js`),r=e.flat(),i=r.find(e=>!t.commands?.some(t=>t.name===e));if(i)throw Error(`Unknown task tool "${i}"`);await(await n({...t,commands:t.commands?.filter(e=>r.includes(e.name))},`stdio`)).done}});export{n as commandTools};
@@ -0,0 +1,3 @@
1
+ import{An as e,Fn as t,Nn as n,On as r,Pn as i}from"./errors-XBA-Ls4n.js";const a=e=>e.replace(/&(amp|lt|gt);/g,(e,t)=>({amp:`&`,lt:`<`,gt:`>`})[t]);function o(e=``,t=!1){let n=/<event>\n([^]*?)\n<\/event>/g;if(!t&&(!e.trimStart().startsWith(`<event>`)||e.replace(n,``).trim()))return;let r=[];for(let[,i]of e.matchAll(n))try{let e=JSON.parse(a(i));if(!e||typeof e!=`object`||Array.isArray(e)){if(!t)return;continue}r.push(e)}catch(e){if(console.error(`coder: unreadable event prompt`,e),!t)return}return r.length?r:void 0}function s(e,t,n=[]){let r=[e??``,...n].flatMap(e=>(o(e,!0)??[]).flatMap(e=>typeof e.mustReply==`boolean`?[e.mustReply]:[]));return r.length?r.includes(!0):t}function c(e){let t=e.chat?.message;if(!t)return{text:e.text,author:{id:e.actor.id,...e.actor.login?{handle:e.actor.login}:{}}};let{author:n,metadata:r}=t;return{id:t.id,...e.conversation?.index===void 0?{}:{index:e.conversation.index},text:e.text,mention:t.isMention===!0,author:{id:n.userId,handle:n.userName,name:n.fullName,bot:n.isBot===!0},sentAt:r.dateSent,...r.edited?{edited:!0}:{},...t.attachments.length?{attachments:t.attachments.map(({type:e,url:t,name:n})=>({type:e,...t?{url:t}:{},...n?{name:n}:{}}))}:{},...t.links?.length?{links:t.links.map(({url:e,title:t})=>({url:e,...t?{title:t}:{}}))}:{}}}function l(e,t){let n=e.at(-1),r=n.chat?.thread,i=e.some(e=>e.mustReply),a=new Set(e.flatMap(e=>e.chat?.message?.id??[])),o=e.flatMap(e=>e.conversation?.since??[]).filter(({id:e,...t})=>{let n=e??JSON.stringify(t);return!a.has(n)&&!!a.add(n)}),s=o.slice(0,50).map(({id:e,...t})=>t),l=e.reduce((e,t)=>e+(t.conversation?.more??0),0)+o.length-s.length;return{handle:n.integration,event:n.type,...n.mustReply===void 0&&e.length===1?{}:{mustReply:i},...n.repo?{repository:`${n.repo.owner}/${n.repo.name}`}:{},...r?{conversation:{id:r.id,dm:r.isDM,...r.channelVisibility?{visibility:r.channelVisibility}:{}}}:{},...e.length===1?{message:c(n)}:{messages:e.map(c)},...n.promptContext?{context:n.promptContext}:{},...s.length?{since:s}:{},...l?{more:l}:{},...t?{requester:t}:{}}}function u(t,i){return e(n(`event`,{children:n(r,{children:JSON.stringify(l(t,i))})}))}function d(t,i){let{message:a,...o}=l([t]),s={...o,event:`reactions`,mustReply:!1,reactions:i};return e(n(`event`,{children:n(r,{children:JSON.stringify(s)})}))}function f(e,t,n){if(!t)return e;let r=n===void 0?``:`\n**Pull request:** ${t.owner}/${t.name}#${n}`;return`**Repo:** ${t.owner}/${t.name}${r}\n\n${e}`}function p(t,i){return t.length?`${e(n(`history`,{children:n(r,{children:t.map(e=>`${e.user}: ${e.text}`).join(`
2
+ `)})}))}\n\n${i}`:i}const m=e(n(`summary-request`,{children:[`Summarize this conversation so a new engine conversation can continue it. Return only the summary: no tools, no reply to the platform.`,`Use these headings in order, each even if empty: Goal; Decisions; Preferences and constraints; Files and PRs touched; Open items.`,`Name who asked for or decided each thing. Keep durable facts, including any earlier summary. Leave out details a speaker asked to forget, without quoting them.`].filter(Boolean).join(`
3
+ `)}));function h(a,o){return`${e(t(i,{children:[n(`summary`,{children:n(r,{children:a.summary})}),n(`recent`,{children:n(r,{children:a.recent})})]}))}\n\n${o}`}export{d as a,h as c,p as i,o as n,s as o,u as r,f as s,m as t};
@@ -1,4 +1,4 @@
1
- import{a as e,i as t,r as n,t as r}from"./slack-Kpj-G9FE.js";const i=e=>({type:`mrkdwn`,text:e}),a=e=>({type:`section`,text:i(e.length>3e3?`${e.slice(0,2999)}…`:e)}),o=e=>e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`),s=(e,t)=>`<${e}|${o(t)}>`,c={queued:`Queued`,running:`Running`,waiting:`Needs approval`,completed:`Completed`,failed:`Failed`,cancelled:`Cancelled`},l=(e,t,n,i)=>({type:`button`,action_id:`${r}${e}`,text:{type:`plain_text`,text:n},url:t,...i?{style:`primary`}:{}});function u(e,r,i){let s=i?.slug??r,c=i?.listens.find(e=>e.integration===n.id)?.events??[],u=c.map(e=>n.events[e]?.description??e),d=t(o(r),c,`message it here`);return{type:`home`,blocks:[a([`*${o(i?.name??r)}*`,i?.description&&o(i.description)].filter(Boolean).join(`
1
+ import{a as e,i as t,r as n,t as r}from"./slack-Bo5l13Rs.js";const i=e=>({type:`mrkdwn`,text:e}),a=e=>({type:`section`,text:i(e.length>3e3?`${e.slice(0,2999)}…`:e)}),o=e=>e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`),s=(e,t)=>`<${e}|${o(t)}>`,c={queued:`Queued`,running:`Running`,waiting:`Needs approval`,completed:`Completed`,failed:`Failed`,cancelled:`Cancelled`},l=(e,t,n,i)=>({type:`button`,action_id:`${r}${e}`,text:{type:`plain_text`,text:n},url:t,...i?{style:`primary`}:{}});function u(e,r,i){let s=i?.slug??r,c=i?.listens.find(e=>e.integration===n.id)?.events??[],u=c.map(e=>n.events[e]?.description??e),d=t(o(r),c,`message it here`);return{type:`home`,blocks:[a([`*${o(i?.name??r)}*`,i?.description&&o(i.description)].filter(Boolean).join(`
2
2
  `)),...d?[a(`*Use it here*\n${d}`)]:[],...u.length?[a(`*Listens to*\n${u.join(`
3
3
  `)}`)]:[],{type:`divider`},{type:`actions`,elements:[l(`agent`,`${e.dash}/agents/${encodeURIComponent(s)}/platforms`,`Open in Coder`,!0),l(`coder`,e.home.replace(/\/$/,``),`Make your own agent`)]}]}}async function d(t,n){if(!t.publicUrl||!t.dashUrl||!t.installationId)return;let r=u({home:t.publicUrl,dash:t.dashUrl},t.name,await t.agent?.());await e(`views.publish`,{user_id:n,view:r},await t.token(t.installationId),t.fetch)}async function f(r,i,{open:s,setup:c}){if(!r.installationId)return;let u=await r.agent?.(),d=u?.name??r.name,f=t(o(r.name),u?u.listens.find(e=>e.integration===n.id)?.events??[]:[`mention`],`message it here`),p=[a([`*${o(d)} is in your workspace*`,u?.description&&o(u.description)].filter(Boolean).join(`
4
4
  `)),...f?[a(`*Use it*\n${f}`)]:[],...c?[a(`*One step left*\nAdd a model so ${o(d)} can start working.`)]:[],{type:`actions`,elements:[...c?[l(`model`,c,`Add a model`,!0)]:[],l(`agent`,s,`Open in Coder`,!c)]}];await e(`chat.postMessage`,{channel:i,text:`${d} is in your workspace`,blocks:p},await r.token(r.installationId),r.fetch)}function p(e,t){let n=Math.floor(t.startedAt/1e3),r=t.title.length>150?`${t.title.slice(0,149)}…`:t.title;return{blocks:[{...a(`*${s(e,r)}*`),fields:[i(`*Agent*\n${o(t.agent)}`),i(`*Status*\n${c[t.status]??t.status}`),i(`*From*\n${o(t.from)}`),i(`*Started*\n<!date^${n}^{date_short_pretty} at {time}|${new Date(t.startedAt).toISOString()}>`)]},{type:`context`,elements:[i(`Coder task ${o(t.id)}`)]}]}}function m(e,t){let r=t.listens.map(e=>e.name),c=t.listens.length===1&&t.listens[0].integration===n.id;return{blocks:[{...a([`*${s(e,t.name)}*`,t.description&&o(t.description)].filter(Boolean).join(`
@@ -1 +1 @@
1
- import{B as e}from"./prompts-CEf7z4i_.js";import t from"node:process";async function n(n,r,i){let a=n.envKey?t.env[n.envKey]:void 0,o=!1;for(let t of e(n.baseUrl,r))try{let e=await fetch(t,{method:`POST`,headers:{"content-type":`application/json`,...a?{Authorization:`Bearer ${a}`}:{}},body:JSON.stringify(i),signal:AbortSignal.timeout(5e3)});if(o=!0,e.status!==404&&e.status!==405&&e.status!==501)return{baseUrl:t.slice(0,-(r.length+1))}}catch{}return{reachable:o}}async function r(e){let t=await n(e,`responses`,{model:e.model,input:[],stream:!1});if(`baseUrl`in t)return{wireApi:`responses`,baseUrl:t.baseUrl};let r=await n(e,`chat/completions`,{model:e.model,messages:[],stream:!1});return`baseUrl`in r?{wireApi:`chat`,baseUrl:r.baseUrl}:t.reachable||r.reachable?{wireApi:`chat`}:null}export{r as t};
1
+ import{yt as e}from"./output-D95NoAA9.js";import t from"node:process";async function n(n,r,i){let a=n.envKey?t.env[n.envKey]:void 0,o=!1;for(let t of e(n.baseUrl,r))try{let e=await fetch(t,{method:`POST`,headers:{"content-type":`application/json`,...a?{Authorization:`Bearer ${a}`}:{}},body:JSON.stringify(i),signal:AbortSignal.timeout(5e3)});if(o=!0,e.status!==404&&e.status!==405&&e.status!==501)return{baseUrl:t.slice(0,-(r.length+1))}}catch{}return{reachable:o}}async function r(e){let t=await n(e,`responses`,{model:e.model,input:[],stream:!1});if(`baseUrl`in t)return{wireApi:`responses`,baseUrl:t.baseUrl};let r=await n(e,`chat/completions`,{model:e.model,messages:[],stream:!1});return`baseUrl`in r?{wireApi:`chat`,baseUrl:r.baseUrl}:t.reachable||r.reachable?{wireApi:`chat`}:null}export{r as t};