@wular/coder 0.4.1 → 0.4.3

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 (378) hide show
  1. package/README.md +69 -70
  2. package/dist/actions-FzDNxMFf.js +20 -0
  3. package/dist/{adapter-BKVzTDnn.js → adapter-7SEiVsmp.js} +1 -1
  4. package/dist/{adapter-B0oYCI0S.js → adapter-BLEfUqoQ.js} +1 -1
  5. package/dist/{adapter-DPInwbJG.js → adapter-H4GlcKQz.js} +1 -1
  6. package/dist/{add-CE-70LFs.js → add-B50dIJGd.js} +1 -1
  7. package/dist/{add-BxpLHnvD.js → add-D7X3gxap.js} +1 -1
  8. package/dist/{add-ej0X9e3a.js → add-DOEUHIe7.js} +1 -1
  9. package/dist/{add-U-pty9qJ.js → add-QExQhTzi.js} +1 -1
  10. package/dist/{add-json-CEa-6luW.js → add-json-Ck4KIZrT.js} +1 -1
  11. package/dist/{agent-JdtZozvP.js → agent-BPtnEf1q.js} +1 -1
  12. package/dist/{agent-BsYx3Odz.js → agent-BlQ_dNNm.js} +2 -2
  13. package/dist/{alias-DX-Bm86x.js → alias-BwQBovke.js} +1 -1
  14. package/dist/{app-BT5f7zL5.js → app-y6BYm2eH.js} +1 -1
  15. package/dist/{approvals-C-AvFt6s.js → approvals-Cc9cq5T1.js} +2 -2
  16. package/dist/{approve-DOmpQRNd.js → approve-oO9k2fnK.js} +2 -2
  17. package/dist/{apps-CjfrZyM5.js → apps-CU2YalX8.js} +1 -1
  18. package/dist/{archive-BziJ1rQ-.js → archive-C5c_HQS1.js} +2 -2
  19. package/dist/{archive-BUB8gFKD.js → archive-CemlWlVY.js} +2 -2
  20. package/dist/archive-sweep-ehg-fWIt.js +1 -0
  21. package/dist/{args-BOEEdpWk.js → args-DcBCtXhz.js} +1 -1
  22. package/dist/{ask-dE3U3ss2.js → ask-Chu7Twu_.js} +2 -2
  23. package/dist/auth-BOyXPOtu.js +1 -0
  24. package/dist/auth-XbqKSbcD.js +1 -0
  25. package/dist/{chat-bridge-BS9WtP3X.js → chat-bridge-DXgZItGP.js} +1 -1
  26. package/dist/{chat-B_yhNTo0.js → chat-cknlIhVh.js} +1 -1
  27. package/dist/{cli-BilSDkvE.js → cli-B1ObVrL4.js} +5 -5
  28. package/dist/cli.d.ts +1 -1
  29. package/dist/cli.js +1 -1
  30. package/dist/{client-D9IoAuDD.js → client-31YzOj-i.js} +1 -1
  31. package/dist/{config-Da_cwoxI.js → config-DAE_qHYA.js} +1 -1
  32. package/dist/{create-C_iMJV4Y.js → create-CM8B8JxD.js} +1 -1
  33. package/dist/credentials-BXD4Qptk.js +1 -0
  34. package/dist/dash/manifest.json +934 -1014
  35. package/dist/dash/public/assets/chunks/{agent-pills-c9c4ac4d4a10df83.js → agent-pills-b6a6da91c9559d9f.js} +1 -1
  36. package/dist/dash/public/assets/chunks/{agent-settings-form-8be2ddab074aba6d.js → agent-settings-form-b615c677046cd6f2.js} +1 -1
  37. package/dist/dash/public/assets/chunks/agents-grid-f2e7b4ff9e11b6e3.js +1 -0
  38. package/dist/dash/public/assets/chunks/{badge-676b01e0c615bf7b.js → badge-215c7b2631dafc69.js} +1 -1
  39. package/dist/dash/public/assets/chunks/{card-e0901d68b79dfa93.js → card-e86dcc81326d2b14.js} +1 -1
  40. package/dist/dash/public/assets/chunks/{combo-41234c24668b1db1.js → combo-09e246dc9a517fa8.js} +1 -1
  41. package/dist/dash/public/assets/chunks/composer-417166b029f48c47.js +1 -0
  42. package/dist/dash/public/assets/chunks/composer-645ae8fa97a35280.js +1 -0
  43. package/dist/dash/public/assets/chunks/{confirm-f2fe4ba9905a89c6.js → confirm-5ae484241ad888fd.js} +1 -1
  44. package/dist/dash/public/assets/chunks/{connect-apps-aa2a3d82e48ed8c3.js → connect-apps-4147c45f45fde2b1.js} +1 -1
  45. package/dist/dash/public/assets/chunks/{connect-repositories-5389ec8701a3deac.js → connect-repositories-77591110836bdf03.js} +1 -1
  46. package/dist/dash/public/assets/chunks/credentials-list-e005a0783ec93465.js +2 -0
  47. package/dist/dash/public/assets/chunks/{custom-range-4761ab14f05149df.js → custom-range-463e119af4681c61.js} +1 -1
  48. package/dist/dash/public/assets/chunks/{editor-bfe8cd854f8001be.js → editor-804b84f4fe6539cd.js} +4 -4
  49. package/dist/dash/public/assets/chunks/{engines-list-f1191390f5715b39.js → engines-list-ceab51f13c690e8c.js} +1 -1
  50. package/dist/dash/public/assets/chunks/{field-901f1f35c18c39c9.js → field-aa0a4b98a976781e.js} +1 -1
  51. package/dist/dash/public/assets/chunks/filter-91144ac2eec6297f.js +1 -0
  52. package/dist/dash/public/assets/chunks/format-105c706345987fb2.js +1 -0
  53. package/dist/dash/public/assets/chunks/heads-a42817b32d2d7f08.js +1 -0
  54. package/dist/dash/public/assets/chunks/{instructions-052fa45a9daf6db6.js → instructions-3a1dcaff2d868aa5.js} +1 -1
  55. package/dist/dash/public/assets/chunks/instructions-6c6f981fffaa31e4.js +1 -0
  56. package/dist/dash/public/assets/chunks/{list-1d259660d7612c5f.js → list-7270361464fc3c04.js} +1 -1
  57. package/dist/dash/public/assets/chunks/{mcp-list-e3bebbbe831393b8.js → mcp-list-2e715d48666b54ad.js} +1 -1
  58. package/dist/dash/public/assets/chunks/{models-list-44f857a469ca04d5.js → models-list-d3c40f94c761a6e5.js} +1 -1
  59. package/dist/dash/public/assets/chunks/paged-3ddb6077bef42752.js +1 -0
  60. package/dist/dash/public/assets/chunks/{platform-actions-d1426602049926d2.js → platform-actions-271ec3b99a64280b.js} +1 -1
  61. package/dist/dash/public/assets/chunks/runners-list-767e49c7d0ec833a.js +1 -0
  62. package/dist/dash/public/assets/chunks/{segmented-358ff2b4992b8384.js → segmented-de4386ccaac7304d.js} +1 -1
  63. package/dist/dash/public/assets/chunks/{select-7ae25fd8a7d6c338.js → select-a90307706cffa6e0.js} +1 -1
  64. package/dist/dash/public/assets/chunks/{sentinel-c972a33dc69a5135.js → sentinel-b5e032b38604dfd3.js} +1 -1
  65. package/dist/dash/public/assets/chunks/shared-init-7f81ae7bc8c82438.js +2 -0
  66. package/dist/dash/public/assets/chunks/shared-init-933c7f9ee85be766.js +5 -0
  67. package/dist/dash/public/assets/chunks/{tail-7c27aab8ba268bd9.js → tail-4891e727ee526792.js} +1 -1
  68. package/dist/dash/public/assets/chunks/task-actions-ce854925a2dc78fd.js +1 -0
  69. package/dist/dash/public/assets/chunks/task-ddfddeaf07fb684c.js +1 -0
  70. package/dist/dash/public/assets/chunks/task-view-c37dcee08f21a279.js +5 -0
  71. package/dist/dash/public/assets/chunks/tasks-list-baef587999f322d8.js +1 -0
  72. package/dist/dash/public/assets/chunks/{toolbar-a75d2570f07cbb70.js → toolbar-8d98313606ad8a2d.js} +1 -1
  73. package/dist/dash/public/assets/chunks/{versions-list-fc2e0d2a7382e049.js → versions-list-532690efd9f1b0ea.js} +1 -1
  74. package/dist/dash/public/assets/dash-49ca85b59ac65c20.css +1 -0
  75. package/dist/dash/public/assets/dash-account-edc56e85dbaaabe0.css +1 -0
  76. package/dist/dash/public/assets/dash-agents-edba57b67e4005d0.css +1 -0
  77. package/dist/dash/public/assets/dash-agents-new-fe22253fbada2fbf.css +1 -0
  78. package/dist/dash/public/assets/dash-agents-param-slug-adf52e9dacb2d825.css +1 -0
  79. package/dist/dash/public/assets/dash-agents-param-slug-edit-a2937a347689ef29.css +1 -0
  80. package/dist/dash/public/assets/dash-agents-param-slug-platforms-265ba13db32a460d.css +1 -0
  81. package/dist/dash/public/assets/dash-agents-param-slug-settings-8afc52eb0372bc4b.css +1 -0
  82. package/dist/dash/public/assets/dash-agents-param-slug-tasks-6193e646be68dbd2.css +1 -0
  83. package/dist/dash/public/assets/dash-agents-param-slug-usage-ceadb3a1c911c402.css +1 -0
  84. package/dist/dash/public/assets/dash-settings-cf1997cd7f72e518.css +1 -0
  85. package/dist/dash/public/assets/dash-settings-param-tab-b44dac8e79a560e6.css +1 -0
  86. package/dist/dash/public/assets/dash-tasks-916c7100a8058aa3.css +1 -0
  87. package/dist/dash/public/assets/dash-tasks-param-id-194a6ffc20e872f2.css +1 -0
  88. package/dist/dash/public/assets/dash-usage-40940b289f85e0b6.css +1 -0
  89. package/dist/dash/public/assets/pnext-client-13aee92bef5c9e3f.js +1 -0
  90. package/dist/dash/public/assets/pnext-client-1f2686b2044f0df6.js +1 -0
  91. package/dist/dash/public/assets/pnext-client-26130234ebad7067.js +1 -0
  92. package/dist/dash/public/assets/pnext-client-311e35b0076bf406.js +1 -0
  93. package/dist/dash/public/assets/pnext-client-4ade1bf75c9c3d87.js +1 -0
  94. package/dist/dash/public/assets/pnext-client-61cd31b687ede1da.js +1 -0
  95. package/dist/dash/public/assets/pnext-client-61db65dc4223217a.js +1 -0
  96. package/dist/dash/public/assets/pnext-client-6ea656e7705e3f2a.js +1 -0
  97. package/dist/dash/public/assets/pnext-client-7fd0f793f0322cb9.js +1 -0
  98. package/dist/dash/public/assets/pnext-client-88159c0840fcfa4a.js +1 -0
  99. package/dist/dash/public/assets/pnext-client-b03f0c47c066b4f3.js +1 -0
  100. package/dist/dash/public/assets/{pnext-client-1b9ab0963a8ff77b.js → pnext-client-d6478835f543f901.js} +1 -1
  101. package/dist/dash/public/assets/pnext-client-dadb8359021ed590.js +1 -0
  102. package/dist/dash/public/assets/pnext-client-de07532d6aaebf2c.js +1 -0
  103. package/dist/dash/public/assets/pnext-client-f87a31890c8ff224.js +1 -0
  104. package/dist/dash/public/assets/pnext-client-ffe1c123a8e2a350.js +1 -0
  105. package/dist/dash/server/bundle-0.1.6-b29ec45cb963d47f/entry.js +2 -0
  106. package/dist/{default-vYPT26DR.js → default-BMvUMTFp.js} +1 -1
  107. package/dist/default-B_nKaX0-.js +1 -0
  108. package/dist/{delete-D8gEwoOj.js → delete-Bjteibld.js} +2 -2
  109. package/dist/{delete-z1_86nf6.js → delete-riCIKZwj.js} +2 -2
  110. package/dist/{disable-DVKd-0Xb.js → disable-DQC56YFy.js} +1 -1
  111. package/dist/{discover-Dvr_3_Xr.js → discover-Qanr5TEO.js} +1 -1
  112. package/dist/{discover-Df-a8K4R.js → discover-lgTYwoQp.js} +2 -2
  113. package/dist/dispatch-BsW_1m7e.js +14 -0
  114. package/dist/{docs-DKJnqZqt.js → docs-DFs7lOJp.js} +1 -1
  115. package/dist/{docs-BX65z2Iu.js → docs-DKROso-4.js} +2 -2
  116. package/dist/{enable-C8Zf_wpN.js → enable-D2DqZvcU.js} +1 -1
  117. package/dist/{env-CRf6wkM2.js → env-YRY3I60r.js} +1 -1
  118. package/dist/exec-DuUkLMqg.js +11 -0
  119. package/dist/executor-vMppVLB6.js +10 -0
  120. package/dist/flow/builtin/review.js +1 -1
  121. package/dist/flow/index.d.ts +1 -1
  122. package/dist/flow/index.js +1 -1
  123. package/dist/{flow-17k25MHt.js → flow-DmERAnR8.js} +1 -1
  124. package/dist/{github-actions-DwUzm4hC.js → github-actions-C_NkHVJq.js} +1 -1
  125. package/dist/http-D01Udu4u.js +1 -0
  126. package/dist/{index-CZjFX5zV.d.ts → index-B1L4zXZH.d.ts} +2 -1
  127. package/dist/{init-CoMfFxbG.js → init-Bd6JHzBc.js} +1 -1
  128. package/dist/integrations-B2CavXR1.js +5 -0
  129. package/dist/integrations-D1Dwy1kt.js +1 -0
  130. package/dist/lib/broker.js +2 -2
  131. package/dist/{list-DX-z3SBp.js → list-4Uo-0v9s.js} +1 -1
  132. package/dist/{list-BAKvxSbh.js → list-B0ujEZhd.js} +3 -3
  133. package/dist/{list-BYiG8Zav.js → list-B5oa1Bhy.js} +2 -2
  134. package/dist/{list-BxEywhHU.js → list-BjE_l6la.js} +1 -1
  135. package/dist/{list-VToARh3C.js → list-Ck9ibCs1.js} +1 -1
  136. package/dist/{list-CIW2joV1.js → list-DhgK4Zc4.js} +1 -1
  137. package/dist/{list-DpCf4G-H.js → list-KvL7AUhD.js} +2 -2
  138. package/dist/{list-C5w01-8q.js → list-byYLBl1U.js} +1 -1
  139. package/dist/{load-BpEsAn51.js → load-SnZd7xG1.js} +1 -1
  140. package/dist/{local-H3uvqEbq.js → local-BRy1EUq2.js} +1 -1
  141. package/dist/log-view-DeJstSkw.js +3 -0
  142. package/dist/{login-DkkslfBx.js → login-C-ahtDKV.js} +1 -1
  143. package/dist/{login-BFxX4jJy.js → login-zpwke8g1.js} +1 -1
  144. package/dist/{logout-BHAtw4Z8.js → logout-CI6Kf-T6.js} +1 -1
  145. package/dist/{maintenance-C5FklUw3.js → maintenance-BAzr9Jlr.js} +1 -1
  146. package/dist/{match-CXAjDhg7.js → match-DxV1d49D.js} +1 -1
  147. package/dist/{mcp-BgKb2Cdk.js → mcp-CmcL1MCG.js} +1 -1
  148. package/dist/{mcp-CCZOAo06.js → mcp-mhXwtGQT.js} +1 -1
  149. package/dist/{migrate-N-85_N7J.js → migrate-Czh3TEK5.js} +1 -1
  150. package/dist/{migrate-C4vM7DQN.js → migrate-w7KfzUAR.js} +1 -1
  151. package/dist/{model-Bs1StDo3.js → model-JRoTH9QK.js} +1 -1
  152. package/dist/models-C-S7HqSb.js +1 -0
  153. package/dist/{prompt-CEuBMNhk.js → prompt-CMXmt2l9.js} +4 -4
  154. package/dist/{push-CUC55Bqd.js → push-B8BhTyZs.js} +1 -1
  155. package/dist/queue-CirjEskI.js +117 -0
  156. package/dist/refresh-Bmy2r1Ee.js +1 -0
  157. package/dist/{remote-miQNTVRa.js → remote-CxFnEjZl.js} +1 -1
  158. package/dist/{remove-B93LNkZI.js → remove-C15WLaXT.js} +1 -1
  159. package/dist/{remove-C5_xggx7.js → remove-CTZYjjSr.js} +1 -1
  160. package/dist/{remove-eQ8y5C5p.js → remove-CTl-H0f0.js} +1 -1
  161. package/dist/{remove-CuH8a3L9.js → remove-DX2FVo5b.js} +1 -1
  162. package/dist/rename-D1g4TnHQ.js +1 -0
  163. package/dist/{result-BEtQZHaY.js → result-D49VN8PM.js} +3 -3
  164. package/dist/result-DGWyUHYU.js +18 -0
  165. package/dist/{resume-DYzKvyEw.js → resume-ywzc7z6A.js} +2 -2
  166. package/dist/{review-oIBeECZE.js → review-ZC0xG8XY.js} +2 -2
  167. package/dist/{rotate-key-IdMYH7gg.js → rotate-key-Bf8_99ck.js} +1 -1
  168. package/dist/{run-CTtd0Znc.js → run-D7SJ-ieT.js} +2 -2
  169. package/dist/run-DoRQSC_K.js +2 -0
  170. package/dist/{run-CawRGnOg.js → run-ukCf2Mdy.js} +1 -1
  171. package/dist/runner-D-REfOUe.js +1 -0
  172. package/dist/{runner-sUpWJ_k0.js → runner-wDYhkVsM.js} +1 -1
  173. package/dist/schema-DoNO0dPh.js +1 -0
  174. package/dist/sdk.d.ts +4 -2
  175. package/dist/sdk.js +1 -1
  176. package/dist/serve-BJ_Mbm2m.js +8 -0
  177. package/dist/{serve-CPnmrKyf.js → serve-C1MMhM1F.js} +2 -2
  178. package/dist/{serve-GmRO89s5.js → serve-DtrOHaoS.js} +2 -2
  179. package/dist/{serve-CE8YV2e9.js → serve-P9pFkEnE.js} +1 -1
  180. package/dist/{serve-BTeomYxW.js → serve-yjSw0B1a.js} +1 -1
  181. package/dist/{server-Kb22cWfF.js → server-DDWTnmbx.js} +1 -1
  182. package/dist/{setup-host-GFTUzzZJ.js → setup-host-L6Rnn5Cz.js} +1 -1
  183. package/dist/{shared-DVtzWhUT.js → shared-XsUX_ZZb.js} +1 -1
  184. package/dist/{show-COTZEYgc.js → show-CU-jqJ90.js} +1 -1
  185. package/dist/{show-CMUg8SJu.js → show-DVJmB2u-.js} +1 -1
  186. package/dist/{status-D26U--p8.js → status-CBydR7LE.js} +1 -1
  187. package/dist/{steer-C6uARLp5.js → steer-Cm_sHZqs.js} +2 -2
  188. package/dist/{stop-BrGI3hSS.js → stop-DJS7DAPJ.js} +1 -1
  189. package/dist/{stop-ByCAlbmN.js → stop-TrebIIuv.js} +2 -2
  190. package/dist/store-BrNMqJgk.js +42 -0
  191. package/dist/store-j8icrG0v.js +19 -0
  192. package/dist/task-C8lmcNsf.js +1 -0
  193. package/dist/{task-DeglY79z.js → task-CpUI19o2.js} +4 -4
  194. package/dist/task-CvSqiwxo.js +1 -0
  195. package/dist/{test-NEbhlxvo.js → test-CDKz4jY_.js} +1 -1
  196. package/dist/{tools-D0Zfs8Hx.js → tools-DBFeoosk.js} +1 -1
  197. package/dist/{types-I5Cwtl_K.d.ts → types-DMGBYB_K.d.ts} +3 -1
  198. package/dist/{unalias-C9NqmSDq.js → unalias-BfQFBnuK.js} +1 -1
  199. package/dist/{update-BTxYQj7Z.js → update-C4FFOie8.js} +1 -1
  200. package/dist/{upgrade-hA0yWBvx.js → upgrade-DLJqMnUQ.js} +2 -2
  201. package/dist/{usage-BhqoCjvE.js → usage-CSh-xwQ2.js} +1 -1
  202. package/dist/{usage-C4d9X2Uq.js → usage-D8mc4qXK.js} +1 -1
  203. package/dist/{watch-DtRuC0Wc.js → watch-CQu-tJKZ.js} +2 -2
  204. package/dist/{watch-CSdj24ct.js → watch-DmwaEvoi.js} +2 -2
  205. package/dist/{wire-BeT1Axeo.js → wire-DzGLZ3-O.js} +1 -1
  206. package/dist/worker-BLKTMLqa.js +1 -0
  207. package/dist/worker-nHemduM_.js +9 -0
  208. package/dist/{workflow-Dcmdooi8.js → workflow-IrouAus_.js} +1 -1
  209. package/docs/cli.md +145 -0
  210. package/docs/mcp.md +1 -1
  211. package/migrations/0000_initial.sql +8 -0
  212. package/migrations/meta/0000_snapshot.json +75 -1
  213. package/migrations/meta/_journal.json +1 -1
  214. package/package.json +3 -2
  215. package/plugins/agents/skills/coder/SKILL.md +1 -0
  216. package/plugins/claude/.claude-plugin/plugin.json +1 -1
  217. package/plugins/claude/skills/dispatch/SKILL.md +1 -1
  218. package/plugins/cursor/.cursor-plugin/plugin.json +1 -1
  219. package/plugins/cursor/skills/coder/SKILL.md +1 -0
  220. package/src/client/index.ts +10 -2
  221. package/src/client/types.ts +18 -0
  222. package/src/core/defaults.ts +36 -0
  223. package/src/core/task/log-view.ts +120 -6
  224. package/src/server/dash/app/dash/agents/(list)/agent-menu.tsx +4 -0
  225. package/src/server/dash/app/dash/agents/(list)/agents-grid.tsx +18 -35
  226. package/src/server/dash/app/dash/agents/(list)/loading.tsx +7 -1
  227. package/src/server/dash/app/dash/agents/[slug]/(tabs)/layout.tsx +2 -1
  228. package/src/server/dash/app/dash/layout.css +58 -1
  229. package/src/server/dash/app/dash/layout.tsx +29 -7
  230. package/src/server/dash/app/dash/settings/[tab]/credentials-list.tsx +20 -13
  231. package/src/server/dash/app/dash/settings/[tab]/page.tsx +1 -1
  232. package/src/server/dash/app/dash/settings/[tab]/runners-list.tsx +13 -12
  233. package/src/server/dash/app/dash/tasks/[id]/activity.tsx +49 -4
  234. package/src/server/dash/app/dash/tasks/[id]/task-actions.tsx +43 -6
  235. package/src/server/dash/app/dash/tasks/[id]/task-view.css +52 -31
  236. package/src/server/dash/app/dash/tasks/[id]/task-view.tsx +143 -51
  237. package/src/server/dash/app/dash/tasks/composer.css +4 -0
  238. package/src/server/dash/app/dash/tasks/composer.tsx +6 -5
  239. package/src/server/dash/app/dash/tasks/list/task.ts +29 -1
  240. package/src/server/dash/app/dash/tasks/list/tasks-list.css +20 -7
  241. package/src/server/dash/app/dash/tasks/list/tasks-list.tsx +256 -109
  242. package/src/server/dash/app/dash/tasks/list/tasks-section.tsx +9 -13
  243. package/src/server/dash/app/dash/tasks/page.tsx +3 -35
  244. package/src/server/dash/comps/frame/loading-card.tsx +4 -3
  245. package/src/server/dash/comps/frame/page-head.css +10 -0
  246. package/src/server/dash/comps/frame/page-head.tsx +3 -2
  247. package/src/server/dash/comps/frame/task-toasts.tsx +196 -50
  248. package/src/server/dash/comps/nav/side-toggle.tsx +16 -5
  249. package/src/server/dash/comps/ui/card.css +1 -0
  250. package/src/server/dash/comps/ui/filter.css +64 -0
  251. package/src/server/dash/comps/ui/filter.tsx +336 -0
  252. package/src/server/dash/comps/ui/icons.ts +2 -0
  253. package/src/server/dash/comps/ui/menu.tsx +9 -1
  254. package/src/server/dash/comps/ui/select.tsx +2 -2
  255. package/src/server/dash/comps/ui/toast.css +3 -2
  256. package/src/server/dash/comps/ui/toolbar.css +14 -0
  257. package/src/server/dash/utils/client.ts +21 -0
  258. package/src/server/dash/utils/format.ts +12 -4
  259. package/src/server/dash/utils/paged.ts +14 -6
  260. package/dist/actions-Mk3FSlpJ.js +0 -20
  261. package/dist/archive-sweep-CtBcARgN.js +0 -1
  262. package/dist/auth-BFny--17.js +0 -1
  263. package/dist/auth-DWHIzqbA.js +0 -1
  264. package/dist/credentials-B1jv6dkg.js +0 -1
  265. package/dist/dash/public/assets/chunks/agents-grid-951584b6f4c4314e.js +0 -1
  266. package/dist/dash/public/assets/chunks/composer-5534be50bc12385e.js +0 -1
  267. package/dist/dash/public/assets/chunks/composer-d10d4b1d54c4f751.js +0 -1
  268. package/dist/dash/public/assets/chunks/credentials-list-bc5bfcab058176c5.js +0 -2
  269. package/dist/dash/public/assets/chunks/format-eb03fc9d9744d960.js +0 -1
  270. package/dist/dash/public/assets/chunks/heads-f3bcd289663d48fa.js +0 -1
  271. package/dist/dash/public/assets/chunks/instructions-d0a4b0d95009c262.js +0 -1
  272. package/dist/dash/public/assets/chunks/paged-bc6fa0c2b9d52ed7.js +0 -1
  273. package/dist/dash/public/assets/chunks/runners-list-1901af8a5dea1f09.js +0 -1
  274. package/dist/dash/public/assets/chunks/shared-init-88cce66bb3cfe1e5.js +0 -5
  275. package/dist/dash/public/assets/chunks/shared-init-ffb3397e494137c9.js +0 -2
  276. package/dist/dash/public/assets/chunks/task-actions-8e1d93c788d001df.js +0 -1
  277. package/dist/dash/public/assets/chunks/task-fa8b82e95e771c4a.js +0 -1
  278. package/dist/dash/public/assets/chunks/task-view-6d7618d2820a5cb4.js +0 -3
  279. package/dist/dash/public/assets/chunks/tasks-list-f4784e5cbd0ed785.js +0 -1
  280. package/dist/dash/public/assets/dash-9e02d5d1a6d42ee3.css +0 -1
  281. package/dist/dash/public/assets/dash-account-04859899c1838ada.css +0 -1
  282. package/dist/dash/public/assets/dash-agents-9e678137267dec07.css +0 -1
  283. package/dist/dash/public/assets/dash-agents-new-26fa27b17ef9b8d8.css +0 -1
  284. package/dist/dash/public/assets/dash-agents-param-slug-b975c48f8abf3444.css +0 -1
  285. package/dist/dash/public/assets/dash-agents-param-slug-edit-e13fda599bb04843.css +0 -1
  286. package/dist/dash/public/assets/dash-agents-param-slug-platforms-70292932cb27bc96.css +0 -1
  287. package/dist/dash/public/assets/dash-agents-param-slug-settings-71f9a86251723fcc.css +0 -1
  288. package/dist/dash/public/assets/dash-agents-param-slug-tasks-fb8eb2ed71006601.css +0 -1
  289. package/dist/dash/public/assets/dash-agents-param-slug-usage-7c8740f1cdd52c71.css +0 -1
  290. package/dist/dash/public/assets/dash-settings-8eb818da462227e8.css +0 -1
  291. package/dist/dash/public/assets/dash-settings-param-tab-849a1a9542e273f5.css +0 -1
  292. package/dist/dash/public/assets/dash-tasks-81e510e0b6931b42.css +0 -1
  293. package/dist/dash/public/assets/dash-tasks-param-id-bbd2a83342f2ec10.css +0 -1
  294. package/dist/dash/public/assets/dash-usage-8e0259e03eaed1bd.css +0 -1
  295. package/dist/dash/public/assets/pnext-client-03b03b254e525e82.js +0 -1
  296. package/dist/dash/public/assets/pnext-client-1c7859bb888f4ef0.js +0 -1
  297. package/dist/dash/public/assets/pnext-client-3c748afe963fb05d.js +0 -1
  298. package/dist/dash/public/assets/pnext-client-4f47c2cae220f107.js +0 -1
  299. package/dist/dash/public/assets/pnext-client-6ab9fd9b53b794d2.js +0 -1
  300. package/dist/dash/public/assets/pnext-client-6c241786342498e4.js +0 -1
  301. package/dist/dash/public/assets/pnext-client-80b56d420f02b808.js +0 -1
  302. package/dist/dash/public/assets/pnext-client-83135c17bae850a3.js +0 -1
  303. package/dist/dash/public/assets/pnext-client-8e6fa4302ae0396f.js +0 -1
  304. package/dist/dash/public/assets/pnext-client-932c9d8cc0717fc8.js +0 -1
  305. package/dist/dash/public/assets/pnext-client-a42ae63d4de113f9.js +0 -1
  306. package/dist/dash/public/assets/pnext-client-d2ee6f8c1e337032.js +0 -1
  307. package/dist/dash/public/assets/pnext-client-d513f65ec23b7f20.js +0 -1
  308. package/dist/dash/public/assets/pnext-client-ecb88e2a8a109954.js +0 -1
  309. package/dist/dash/public/assets/pnext-client-f1545ee6270bbf9a.js +0 -1
  310. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/boot-B2MFTRO2.js +0 -30
  311. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/build-tier-XJJSL5FR.js +0 -2704
  312. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-2HFY3DQT.js +0 -208
  313. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-2ICEVELW.js +0 -834
  314. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-3UPROT2C.js +0 -35
  315. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-4P5CMIYT.js +0 -1582
  316. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-4TKZKZ3Q.js +0 -131
  317. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-5RDEILQB.js +0 -437
  318. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-62KEQM43.js +0 -25
  319. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-6KQSWT6D.js +0 -831
  320. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-7DCNCW6O.js +0 -724
  321. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-B4THCTQP.js +0 -22
  322. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-C2LIV2MM.js +0 -172
  323. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-CCATPVTW.js +0 -378
  324. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-COXJAPTU.js +0 -89
  325. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-E6IXL2NJ.js +0 -6270
  326. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-FLGRBFAH.js +0 -1198
  327. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-FTJVHFWD.js +0 -61
  328. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-H523KSIH.js +0 -5151
  329. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-HT6KKX6A.js +0 -20
  330. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-JESFYECC.js +0 -438
  331. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-JRPJM2XY.js +0 -17
  332. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-L2IWDUXG.js +0 -107
  333. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-L5P4Y4UC.js +0 -183
  334. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-NQE46AZN.js +0 -647
  335. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-PA4QEARJ.js +0 -129
  336. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-PZ5AXOLW.js +0 -7146
  337. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-SNVPTULL.js +0 -2397
  338. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-T3QZT3PG.js +0 -220
  339. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-VC5O2SDP.js +0 -72
  340. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-WZX4V6CM.js +0 -231
  341. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-XUUIDXY5.js +0 -627
  342. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/chunk-ZHFDO3PR.js +0 -265
  343. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/compile-CE2DN7ZA.js +0 -18
  344. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/config-UREY7XJT.js +0 -16
  345. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/config-loader-UI2XE3PZ.js +0 -17
  346. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/entry.js +0 -219
  347. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/generate-I2PPTDFD.js +0 -16
  348. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/modules-UVOCE4C2.js +0 -48
  349. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/pipeline-UW47K537.js +0 -963
  350. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/proxy-ITGOVJBW.js +0 -26
  351. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/register-4SA55SWT.js +0 -12579
  352. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/router-JNKHLBCZ.js +0 -505
  353. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/routes-PD6J2NXW.js +0 -54
  354. package/dist/dash/server/bundle-0.1.5-1508b6c99c0d1e68/tsconfig-defaults-ZXEH7RQK.js +0 -15
  355. package/dist/default-Bobztoxf.js +0 -1
  356. package/dist/dispatch-BKeAch9E.js +0 -14
  357. package/dist/exec-RZFLclKX.js +0 -11
  358. package/dist/executor-BvAA7Cgw.js +0 -10
  359. package/dist/http-Bkg_OQ6r.js +0 -1
  360. package/dist/integrations-5xCaXSd-.js +0 -1
  361. package/dist/integrations-BAgdVDhj.js +0 -5
  362. package/dist/log-view-dg0TlKLA.js +0 -1
  363. package/dist/models-_5LVGC3m.js +0 -1
  364. package/dist/queue-6io_NOP3.js +0 -116
  365. package/dist/refresh-BIrmrWYq.js +0 -1
  366. package/dist/rename-CYfy03FE.js +0 -1
  367. package/dist/result-BzaM3inj.js +0 -15
  368. package/dist/run-BDYl0CKl.js +0 -2
  369. package/dist/runner-D7ScbIHJ.js +0 -1
  370. package/dist/schema-CU2iFkp8.js +0 -1
  371. package/dist/serve-CQKZxzFE.js +0 -4
  372. package/dist/store-B94tSate.js +0 -42
  373. package/dist/store-DzqXS2wT.js +0 -8
  374. package/dist/task-C6VAg5WU.js +0 -1
  375. package/dist/task-CgOKgkEG.js +0 -1
  376. package/dist/worker-CXndxmGF.js +0 -9
  377. package/dist/worker-DX7P9kWl.js +0 -1
  378. package/src/server/dash/app/dash/token-from-hash.tsx +0 -17
@@ -1,116 +0,0 @@
1
- import{Bn as e,a as t,c as n}from"./store-DzqXS2wT.js";import{g as r,h as i,i as a,m as o,o as s,p as c,s as l}from"./schema-CU2iFkp8.js";import{i as u,r as d,t as f}from"./client-D9IoAuDD.js";import{b as p,c as m,f as h,m as g,v as _,y as v}from"./shared-DVtzWhUT.js";import{randomBytes as y}from"node:crypto";import{and as b,asc as x,desc as S,eq as C,getTableColumns as w,ilike as T,inArray as E,isNotNull as D,isNull as O,or as k,sql as A}from"drizzle-orm";import{CasingCache as j}from"drizzle-orm/casing";function M(e,t){if(typeof t==`number`)return A`to_jsonb(coalesce(case when jsonb_typeof(${e}) = 'number' then (${e} #>> '{}')::numeric end, 0) + ${t}::numeric)`;if(!t||typeof t!=`object`||Array.isArray(t))return e;let n=Object.entries(t).map(([t,n])=>A`${t}::text, ${M(A`(${e} -> ${t}::text)`,n)}`);return A`(case when jsonb_typeof(${e}) = 'object' then ${e} else '{}'::jsonb end || jsonb_build_object(${A.join(n,A`, `)}))`}var N=class{db;constructor(e){this.db=e}async metrics(e,t){let n=await this.db.select({status:c.status,total:A`count(*)::int`,recent:A`count(*) filter (where ${c.createdAt} >= ${new Date(t).toISOString()}::timestamptz)::int`}).from(c).where(C(c.organizationId,e)).groupBy(c.status),r={tasks:{queued:0,running:0,waiting:0,completed:0,failed:0,cancelled:0},queueDepth:0};for(let e of n)r.tasks[e.status]=e.recent,e.status===`queued`&&(r.queueDepth=e.total);return r}where(e,t){return b(C(c.organizationId,e),C(c.publicId,t))}fence(e,t,n={}){return b(this.where(e,t),n.generation===void 0?void 0:C(c.generation,n.generation),n.attempts===void 0?void 0:C(c.attempts,n.attempts),n.tokenHash===void 0?void 0:n.tokenHash===null?O(c.tokenHash):C(c.tokenHash,n.tokenHash),n.handle===void 0?void 0:n.handle===null?O(c.handle):C(c.handle,n.handle),n.lastSeenAt===void 0?void 0:n.lastSeenAt===null?O(c.lastSeenAt):C(c.lastSeenAt,new Date(n.lastSeenAt)),n.updatedAt===void 0?void 0:C(c.updatedAt,new Date(n.updatedAt)),n.statuses?E(c.status,n.statuses):void 0)}async enqueue(e,t,n,r,i){let a=this.insertion(e,t,n,r,i),[o]=i===void 0?await g(this.db,a):await d(this.db,[A`select pg_advisory_xact_lock(1, hashtext(${e}))`],a);if(!o?.allowed)throw Error(`Organization task queue is full`);return!!o.inserted}insertion(e,t,n,r,i,u){let d=t.event,f=new Date(n).toISOString(),p=e=>A`${e===void 0?null:JSON.stringify(e)}::jsonb`,m=r?A`
2
- receipt as (
3
- insert into ${a} (key, value, expires_at)
4
- select ${_(e,`delivery`,r.key)}, ${p({at:n})}, ${new Date(n+r.ttlMs).toISOString()}::timestamptz
5
- from capacity where allowed ${u?A`and (${u.create} or exists (select 1 from target))`:A``}
6
- on conflict (key) do update set value = excluded.value, expires_at = excluded.expires_at
7
- where ${a.expiresAt} <= ${f}::timestamptz
8
- returning key
9
- ),`:A``;return A`
10
- with ${u?A`target as materialized (${u.target}),`:A``} capacity as (
11
- select ${i===void 0?A`true`:A`(select count(*) from ${c} where organization_id = ${e} and status = 'queued') < ${i} ${r?A`or exists (select 1 from ${a} where key = ${_(e,`delivery`,r.key)} and expires_at > ${f}::timestamptz)`:A``}`} ${u?A`or exists (select 1 from target) or not ${u.create}`:A``} as allowed
12
- ), ${m} ${u?A`advanced as (
13
- update ${c} set inbox_seq = inbox_seq + 1 where id in (select id from target) and exists (select 1 from receipt)
14
- returning id, inbox_seq, generation
15
- ), forwarded as (
16
- insert into ${o} (organization_id, task_id, seq, generation, at, kind, value)
17
- select ${e}, id, inbox_seq, generation, ${f}::timestamptz, 'steer', ${p({text:d?.text})} from advanced returning seq
18
- ),`:A``} inserted as (
19
- insert into ${c} (organization_id, public_id, source, status, agent, flow, runner, permissions,
20
- app_id, installation_id, event, prompt, args, mcp, author, definition, credential, requester,
21
- runner_id, usage, tools, tool_scopes, context, files, attempts, created_at, updated_at)
22
- select ${e}, ${t.id}, ${t.source}, 'queued', ${t.agent}, ${t.flow}, ${t.runner}, ${t.permissions??null},
23
- ${d?A`coalesce((select id from ${s} where key = ${d.appId} and organization_id in (${e}, '')), 0)`:A`null`},
24
- ${d?A`coalesce((select id from ${l} where key = ${`${d.appId}:${d.installationId}`} and organization_id = ${e}), 0)`:A`null`},
25
- ${p(d)}, ${t.prompt??null}, ${p(t.args)}, ${p(t.mcp)}, ${t.author??null}, ${p(t.definition)},
26
- ${t.credential??null}, ${t.requester??null}, ${t.runnerId??null}, ${p(t.usage)}, ${p(t.tools)},
27
- ${p(t.toolScopes)}, ${p(t.context)}, ${p(t.files)}, 0, ${f}::timestamptz, ${f}::timestamptz
28
- from capacity where allowed ${u?A`and ${u.create} and not exists (select 1 from target)`:A``} ${r?A`and exists (select 1 from receipt)`:A``}
29
- returning id
30
- ) select allowed, exists (select 1 from inserted) as inserted ${u?A`, exists (select 1 from forwarded) as steered`:A``} from capacity`}async deliver(e,t,r,i,a,o,s=!0){if(!a)return s&&await this.enqueue(e,t,r,i,o)?{taskId:t.id}:{};let l=t.event,u=A`select id from ${c} where organization_id = ${e} and status in ('queued', 'running', 'waiting')
31
- and agent = ${t.agent} and source = ${t.source} and flow = 'default'
32
- and requester is not distinct from ${t.requester??null}
33
- and event->>'appId' is not distinct from ${l?.appId??null}
34
- and event->>'installationId' is not distinct from ${l?.installationId??null}
35
- and event->'chat'->'thread'->>'id' is not distinct from ${l?.chat?.thread.id??null}
36
- and event->'actor'->>'id' = ${l?.actor.id||null}
37
- order by created_at desc, public_id desc limit 1 for update`,f=this.insertion(e,t,r,i,o,{target:u,create:s}),p=[A`select pg_advisory_xact_lock(3, hashtext(${JSON.stringify([e,n(t)])}))`];o!==void 0&&s&&p.push(A`select pg_advisory_xact_lock(1, hashtext(${e}))`);let[m]=await d(this.db,p,f);if(!m?.allowed)throw Error(`Organization task queue is full`);return m.inserted?{taskId:t.id}:m.steered?{steered:!0}:{}}async claim(t,n,r=!1,i){let a=i===void 0?A`true`:A`(select count(*) from ${c} active where active.organization_id = ${c.organizationId} and active.status in ('running', 'waiting')) < ${i}`;if(!r){let[e]=await u(this.db,()=>g(this.db,A`select exists (select 1 from ${c} where status = 'queued' and ${a})
38
- and ${n===void 0?A`true`:A`(select count(*) from ${c} where status in ('running', 'waiting')) < ${n}`} as ready`));if(!e?.ready)return}let o=y(32).toString(`base64url`),s=A`translate(rtrim(replace(encode(convert_to(format('{"task":%s,"organization":%s,"attempt":%s}',
39
- to_json(public_id), to_json(organization_id), attempts + 1), 'UTF8'), 'base64'), E'\\n', ''), '='), '+/', '-_') || '.' || ${o}`,l=A`with stamp as materialized (select date_trunc('milliseconds', clock_timestamp()) as at), picked as materialized (
40
- select id, ${s} as bearer from ${c} where status = 'queued'
41
- and ${a}
42
- ${n===void 0?A``:A`and (select count(*) from ${c} where status in ('running', 'waiting')) < ${n}`}
43
- order by created_at, id limit 1 for update
44
- ), claimed as (
45
- update ${c} set status = 'running', attempts = attempts + 1, locked_at = (select at from stamp),
46
- started_at = (select at from stamp), updated_at = (select at from stamp), last_seen_at = (select at from stamp),
47
- token_hash = translate(rtrim(encode(sha256(convert_to(picked.bearer, 'UTF8')), 'base64'), '='), '+/', '-_')
48
- from picked where ${c.id} = picked.id returning ${c}.*
49
- ) select to_jsonb(claimed) as record, exists (select 1 from ${c} where status = 'queued' and id <> claimed.id
50
- and ${i===void 0?A`true`:A`(select count(*) from ${c} active where active.organization_id = ${c.organizationId} and active.status in ('running', 'waiting')) + case when ${c.organizationId} = claimed.organization_id then 1 else 0 end < ${i}`})
51
- and ${n===void 0?A`true`:A`(select count(*) from ${c} where status in ('running', 'waiting')) + 1 < ${n}`} as more from claimed`,[m]=await d(this.db,n===void 0&&i===void 0?[]:[A`select pg_advisory_xact_lock(2, 0)`],l);if(!m)return;let h=new j(f),_=Object.fromEntries(Object.entries(w(c)).map(([e,t])=>{let n=m.record[h.getColumnCasing(t)];return[e,n===null?null:t.mapFromDriverValue(n)]}));return{organizationId:_.organizationId,status:p(_),token:e(_.publicId,_.organizationId,_.attempts,o).token,more:m.more}}async touch(e,t,n,r,i,a=!1){let o=E(c.status,[`running`,`waiting`]),s=new Date(i).toISOString(),[l]=await this.db.update(c).set({lastSeenAt:A`case when ${o} then ${s}::timestamptz else ${c.lastSeenAt} end`,updatedAt:A`case when ${o} then ${s}::timestamptz else ${c.updatedAt} end`}).where(this.fence(e,t,{tokenHash:n,attempts:r,statuses:a?[`running`,`waiting`,`completed`,`failed`,`cancelled`]:[`running`,`waiting`]})).returning();return l&&p(l)}async patchTask(e,t,n,r,i={}){let{answer:a,archivedAt:o,lastSeenAt:s,...l}=n,[u]=await this.db.update(c).set({...Object.fromEntries(Object.entries(l).map(([e,t])=>[e,t??null])),...a===void 0?{}:{answer:A`coalesce(${c.answer}, '[]'::jsonb) || ${JSON.stringify([a])}::jsonb`},...Object.hasOwn(n,`archivedAt`)?{archivedAt:o===void 0?null:new Date(o)}:{},...Object.hasOwn(n,`lastSeenAt`)?{lastSeenAt:s===void 0?null:new Date(s)}:{},updatedAt:new Date(r)}).where(this.fence(e,t,i)).returning({id:c.id});return!!u}async requeue(e,t,n,r={}){let[i]=await this.db.update(c).set({status:`queued`,lockedAt:null,handle:null,tokenHash:null,lastSeenAt:null,updatedAt:new Date(n)}).where(this.fence(e,t,{...r,statuses:[`running`,`waiting`]})).returning({id:c.id});return!!i}async finish(e,t,n,r,i={}){let a=new Date(r),[o]=await this.db.update(c).set({status:n.status,result:n.result??null,error:n.error??null,tokens:n.tokens??null,lastSeenAt:a,lockedAt:null,finishedAt:a,updatedAt:a}).where(this.fence(e,t,{...i,statuses:[`queued`,`running`,`waiting`]})).returning({id:c.id});return!!o}async continueTask(e,t,n,r,i){let o=A`(select value from ${a} where key = ${v(e,`note`)} ||
52
- case when ${c.source} = ${c.event}->>'integration' then
53
- (${c.event}->>'appId') || ':' || (${c.event}->>'installationId') || ':' || coalesce(${c.event}->'chat'->'thread'->>'id', ${c.event}->>'deliveryId')
54
- else 'task:' || ${c.publicId} end
55
- and (${a.expiresAt} is null or ${a.expiresAt} > ${new Date(r).toISOString()}::timestamptz))`,s=A`(${JSON.stringify(n.context??{})}::jsonb - 'note') || jsonb_strip_nulls(jsonb_build_object('note', nullif(${o}, '""'::jsonb)))`,[l]=await this.db.update(c).set({prompt:n.prompt??null,context:s,status:`queued`,attempts:0,generation:A`${c.generation} + 1`,inboxAck:-1,result:null,error:null,tokens:null,handle:null,tokenHash:null,lastSeenAt:null,logCursor:null,lockedAt:null,startedAt:null,finishedAt:null,cancelRequestedAt:null,approval:null,answer:null,updatedAt:new Date(r)}).where(this.fence(e,t,{...i,statuses:[`completed`,`failed`,`cancelled`]})).returning({context:c.context});return l&&(n.context=l.context??void 0),!!l}async completeTask(e,t,n,i){let{outcome:s,usage:l,note:u}=n,d=new Date(i).toISOString(),f=u&&_(e,`note`,u.key),p=u?u.value?A`, note as (
56
- insert into ${a} (key, value, expires_at)
57
- select ${f}, ${JSON.stringify(u.value)}::jsonb, ${new Date(i+u.ttlMs).toISOString()}::timestamptz from finished
58
- on conflict (key) do update set value = excluded.value, expires_at = excluded.expires_at
59
- )`:A`, note as (delete from ${a} where key = ${f} and exists (select 1 from finished))`:A``,[m]=await g(this.db,A`
60
- with finished as (
61
- update ${c} set status = ${s.status}, result = ${JSON.stringify(s.result??null)}::jsonb,
62
- error = ${s.error??null}, tokens = ${JSON.stringify(s.tokens??null)}::jsonb,
63
- last_seen_at = ${d}::timestamptz, locked_at = null, finished_at = ${d}::timestamptz, updated_at = ${d}::timestamptz
64
- where ${this.fence(e,t,{attempts:n.attempts,tokenHash:n.tokenHash,statuses:[`running`,`waiting`]})}
65
- returning id, installation_id, generation
66
- ), inbox as (delete from ${o} where (task_id, generation) in (select id, generation from finished)), recorded as (
67
- insert into ${r} (organization_id, task_id, installation_id, agent, target, engine, model, credential, runner_ms, tokens, at, updated_at)
68
- select ${e}, id, installation_id, ${l.agent}, ${l.target}, ${l.engine??null}, ${l.model??null},
69
- ${l.credential}, ${l.runnerElapsedMs}, ${JSON.stringify(l.tokens??null)}::jsonb, ${new Date(l.at).toISOString()}::timestamptz, ${d}::timestamptz from finished
70
- on conflict (task_id) do update set installation_id = excluded.installation_id, agent = excluded.agent, target = excluded.target,
71
- engine = excluded.engine, model = excluded.model, credential = excluded.credential, runner_ms = ${r.runnerMs} + excluded.runner_ms,
72
- tokens = ${M(A`${r.tokens}`,l.tokens)}, at = excluded.at, updated_at = excluded.updated_at
73
- ) ${p}
74
- select exists (select 1 from finished) as completed`);return!!m?.completed}async cancel(e,n,r,i={}){let a=new Date(r).toISOString(),[s]=await g(this.db,A`
75
- with cancelled as (
76
- update ${c} set status = case when status = 'queued' then 'cancelled' else status end,
77
- finished_at = case when status = 'queued' then ${a}::timestamptz else finished_at end,
78
- inbox_seq = case when status = 'queued' then inbox_seq else inbox_seq + 1 end,
79
- cancel_requested_at = ${a}::timestamptz, updated_at = ${a}::timestamptz
80
- where ${this.fence(e,n,{...i,statuses:t})} returning id, generation, inbox_seq, status
81
- ), message as (
82
- insert into ${o} (organization_id, task_id, seq, generation, kind, value, at)
83
- select ${e}, id, inbox_seq, generation, 'cancel', 'null'::jsonb, ${a}::timestamptz from cancelled where status in ('running', 'waiting')
84
- ) select exists(select 1 from cancelled) as accepted`);return!!s?.accepted}async cancelRequested(e,t){let[n]=await u(this.db,()=>this.db.select({at:c.cancelRequestedAt}).from(c).where(this.where(e,t)));return!!n?.at}filter(e,t){let n=t.status?[t.status]:t.statuses,r=t.q?.trim(),i=r&&`%${r.replace(/[\\%_]/g,`\\$&`)}%`;return b(C(c.organizationId,e),n?E(c.status,n):void 0,t.agent?C(c.agent,t.agent):void 0,t.source?C(c.source,t.source):void 0,t.archived===void 0?void 0:t.archived?D(c.archivedAt):O(c.archivedAt),i?k(T(A`${c.event}->>'text'`,i),T(c.prompt,i),T(c.agent,i),T(c.publicId,i)):void 0)}pageQuery(e,t){let{before:n}=t,r=t.summary?{publicId:c.publicId,source:c.source,agent:c.agent,flow:c.flow,prompt:c.prompt,event:A`case when ${c.event} is not null then jsonb_build_object('integration', ${c.event}->>'integration', 'type', ${c.event}->>'type', 'text', ${c.event}->>'text') end`.as(`event`),status:c.status,attempts:c.attempts,createdAt:c.createdAt,startedAt:c.startedAt,finishedAt:c.finishedAt}:w(c),i=this.db.select(r).from(c).where(b(this.filter(e,t),n?A`(${c.createdAt}, ${c.publicId}) < (${new Date(n.createdAt).toISOString()}::timestamptz, ${n.id})`:void 0)).orderBy(S(c.createdAt),S(c.publicId));return t.limit===void 0?i:i.limit(t.limit)}record(e,t){return t?m({task:m({id:e.publicId,source:e.source,agent:e.agent,flow:e.flow,prompt:e.prompt,event:e.event}),status:e.status,attempts:e.attempts,createdAt:h(e.createdAt),startedAt:e.startedAt?h(e.startedAt):void 0,finishedAt:e.finishedAt?h(e.finishedAt):void 0}):p(e)}async list(e,t={}){return(await u(this.db,()=>this.pageQuery(e,t))).map(e=>this.record(e,t.summary))}countQuery(e,n){return this.db.select({all:A`count(*)::int`.as(`all`),active:A`(count(*) filter (where ${E(c.status,t)}))::int`.as(`active`),waiting:A`(count(*) filter (where ${C(c.status,`waiting`)}))::int`.as(`waiting`)}).from(c).where(this.filter(e,n))}async counts(e,t={}){let[n]=await u(this.db,()=>this.countQuery(e,t));return n??{all:0,active:0,waiting:0}}async listWithCounts(e,t){let n=this.db.$with(`totals`).as(this.countQuery(e,t)),r=this.db.$with(`page`).as(this.pageQuery(e,{...t,limit:t.limit??20})),i=Object.fromEntries(Object.keys(r._.selectedFields).map(e=>[e,r[e]])),a=await u(this.db,()=>this.db.with(n,r).select({...i,all:n.all,active:n.active,waiting:n.waiting}).from(n).leftJoin(r,A`true`).orderBy(S(r.createdAt),S(r.publicId))),{all:o=0,active:s=0,waiting:c=0}=a[0]??{};return{items:a.filter(e=>e.publicId!==null&&e.publicId!==void 0).map(e=>this.record(e,t.summary)),counts:{all:o,active:s,waiting:c}}}async runningCount(){let[e]=await u(this.db,()=>this.db.select({value:A`count(*)::int`}).from(c).where(E(c.status,[`running`,`waiting`])));return e?.value??0}async running(){return(await u(this.db,()=>this.db.select().from(c).where(E(c.status,[`running`,`waiting`])))).map(e=>({organizationId:e.organizationId,status:p(e)}))}async appendLogs(e,t,n,r,a,o,s){let l=n.length?A`, inserted as (
85
- insert into ${i} (organization_id, task_id, seq, at, level, line)
86
- select ${e}, accepted.id, entry.seq, to_timestamp(entry.at / 1000.0), entry.level, entry.line
87
- from accepted cross join jsonb_to_recordset(${JSON.stringify(n)}::jsonb) as entry(seq int, at bigint, level text, line text)
88
- )`:A``,[u]=await g(this.db,A`
89
- with accepted as (
90
- update ${c} set log_cursor = ${a.cursor}, log_seq = ${a.seq}, log_bytes = ${a.bytes}, updated_at = ${new Date(o).toISOString()}::timestamptz
91
- where ${this.fence(e,t,s)} and coalesce(log_seq, 0) = ${r.seq} and coalesce(log_cursor, -1) = ${r.cursor}
92
- returning id
93
- ) ${l} select exists (select 1 from accepted) as accepted`);return!!u?.accepted}async readInbox(e,n,r,i){return(await u(this.db,()=>this.db.select({seq:o.seq,generation:o.generation,at:o.at,kind:o.kind,value:o.value}).from(o).innerJoin(c,C(c.id,o.taskId)).where(b(this.where(e,n),C(c.generation,r),E(c.status,t),C(o.generation,r),A`${o.seq} > ${i}`)).orderBy(x(o.seq)).limit(100))).map(e=>({...e,at:h(e.at)}))}async appendInbox(e,n,r,i,a,s){let[l]=await g(this.db,A`
94
- with next as (
95
- update ${c} set inbox_seq = inbox_seq + 1 where ${this.fence(e,n,{generation:s,statuses:t})} returning id, inbox_seq, generation
96
- ) insert into ${o} (organization_id, task_id, seq, generation, kind, value, at)
97
- select ${e}, id, inbox_seq, generation, ${r}, ${JSON.stringify(i??null)}::jsonb, ${new Date(a).toISOString()}::timestamptz from next returning seq`);return l&&{seq:l.seq,generation:s,at:a,kind:r,value:i}}async fetchInbox(e,t,n,r,i){let[a]=await u(this.db,()=>g(this.db,A`
98
- select coalesce(jsonb_agg(jsonb_build_object('seq', i.seq, 'generation', i.generation, 'at', extract(epoch from i.at) * 1000, 'kind', i.kind, 'value', i.value) order by i.seq) filter (where i.seq is not null), '[]'::jsonb) as entries
99
- from ${c} left join ${o} i on i.task_id = ${c.id} and i.generation = ${c.generation} and i.seq > ${i}
100
- where ${this.fence(e,t,{tokenHash:n,attempts:r,statuses:[`running`,`waiting`]})} group by ${c.id}`));return a?.entries}async ackInbox(e,t,n,r){if(r.generation!==void 0&&r.generation!==n.generation)return!1;let[i]=await g(this.db,A`
101
- with current as (
102
- select id from ${c} where ${this.fence(e,t,{...r,generation:n.generation,statuses:void 0})}
103
- and inbox_seq >= ${n.seq} and (status in ('running', 'waiting') or (status in ('completed', 'failed', 'cancelled') and inbox_ack >= ${n.seq})) for update
104
- ), applied as (
105
- delete from ${o} where task_id in (select id from current) and generation = ${n.generation} and seq <= ${n.seq} returning seq, kind, value
106
- ), answers as (
107
- select jsonb_agg(a.value order by a.seq) as value from jsonb_to_recordset(${JSON.stringify(n.answers??[])}::jsonb) a(seq int, value jsonb)
108
- where exists (select 1 from applied where applied.seq = a.seq and applied.kind = 'ask')
109
- ), updated as (
110
- update ${c} set inbox_ack = greatest(inbox_ack, ${n.seq}), answer = coalesce(answer, '[]'::jsonb) || coalesce(answers.value, '[]'::jsonb),
111
- status = case when exists(select 1 from applied where kind = 'cancel') then 'cancelled'
112
- when exists(select 1 from applied where kind = 'approve' and value->>'approvalId' = ${c.approval}->>'id') then 'running' else status end,
113
- approval = case when exists(select 1 from applied where kind = 'approve' and value->>'approvalId' = ${c.approval}->>'id') then null else approval end,
114
- finished_at = case when exists(select 1 from applied where kind = 'cancel') then now() else finished_at end
115
- from answers where id in (select id from current)
116
- ) select exists (select 1 from current) as accepted`);return!!i?.accepted}async pendingInbox(){return(await u(this.db,()=>this.db.select().from(c).where(b(E(c.status,[`running`,`waiting`]),A`exists (select 1 from ${o} where ${o.taskId} = ${c.id} and ${o.generation} = ${c.generation})`)))).map(e=>({organizationId:e.organizationId,status:p(e)}))}};export{N as DrizzleQueue};
@@ -1 +0,0 @@
1
- import{D as e,bn as t}from"./dispatch-BKeAch9E.js";import{i as n}from"./cli-BilSDkvE.js";const r=n({name:`upgrade refresh`,options:{},run:()=>e(t())});export{r as commandRefreshUpdate};
@@ -1 +0,0 @@
1
- import{xt as e}from"./dispatch-BKeAch9E.js";import{i as t,t as n}from"./cli-BilSDkvE.js";import{p as r}from"./output-BKeyLbvt.js";import{runnerOptions as i}from"./remove-B93LNkZI.js";import a from"node:process";const o=t({name:`runner rename`,globalFlags:{cwd:!1},help:{usage:`coder runner rename <id> <name> [--server [url]] [--json]`,flags:[n]},options:i,args:2,async run({options:t,args:[n,r]}){let{updateRunner:i}=await import(`./runner-sUpWJ_k0.js`).then(e=>e.a);if(!n||!r)throw new e(`invalid-option`,`Usage: coder runner rename <id> <name>`);return i(n,{name:r},t)},print:(e,{args:[t]})=>a.stdout.write(`Renamed ${t} to ${r.bold(e.name)}.\n`)});export{o as commandRunnerRename};
@@ -1,15 +0,0 @@
1
- import{Dn as e,Nt as t,cn as n,wt as r}from"./dispatch-BKeAch9E.js";import{i,r as a}from"./cli-BilSDkvE.js";import{S as o,a as s,d as c,m as l,o as u,p as d,s as f,u as p,x as m,y as h}from"./output-BKeyLbvt.js";import{i as g,l as _,n as v,s as y,t as b}from"./args-BOEEdpWk.js";import x from"node:process";const S={server:g,workspace:y,yes:v};function C(e,t,n,r=d){let i=e?.error?.message??t;return e?.finalMessage||(i?`${r.red(`error:`)} ${i}`:n)}const w=1e3;function T(e,t=d,{truncate:n=!0}={}){let r=e=>e.split(`
2
- `).map(e=>` ${t.dim(e)}`);return!n||e.length<=w?[t.dim(`prompt:`),...r(e)]:[t.dim(`prompt:`),...r(e.slice(0,500).trimEnd()),t.light(` … <${e.length-w} chars trimmed> …`),...r(e.slice(-500).trimStart())]}function E(e,t=d){let n=[];e.permissions&&n.push([`perms`,e.permissions]),e.cwd&&n.push([`cwd`,e.cwd]);for(let t of e.addDirs??[])n.push([`add-dir`,t]);return n.map(([e,n])=>`${t.dim(e.padEnd(8))} ${n}`)}function D(e,t){if(t)return e.createdAt?`started ${s(r(e.createdAt))} ago`:``;let n=e.createdAt&&e.completedAt?Date.parse(e.completedAt)-Date.parse(e.createdAt):null;return[e.completedAt?`finished ${s(r(e.completedAt))} ago`:``,n!==null&&n>=0?`took ${s(n)}`:``].filter(Boolean).join(` · `)}function O(e,{status:r,tokens:i,tokenModel:a,files:o,live:s=!1,style:u=d}){let f=D(e,n.includes(e.status)||r===`waiting-approval`),m=e=>u.dim(e.padEnd(8));return[`${m(`task`)} ${u.cyan(e.id)}`,...e.name?[`${m(`name`)} ${e.name}`]:[],`${m(`status`)} ${l(r)}${f?` ${u.dim(`(${f})`)}`:``}`,`${m(`engine`)} ${t(e)}`,...E(e,u),...i?[`${m(`tokens`)} ${s?c(i):p(i,a??e.model)}${s?u.dim(` (so far)`):``}`]:[],...k(o,m,u)]}const k=(e,t,n)=>e?.length?[`${t(`files`)} ${e.join(`, `)} ${n.dim(`(shell edits not included)`)}`]:[];function A(e,{tokens:t,tokenModel:n,files:r,statusChanged:i=!0,style:a=d}){let o=e=>a.dim(e.padEnd(8)),c=e.createdAt&&e.completedAt?Date.parse(e.completedAt)-Date.parse(e.createdAt):null;return[...i?[`${o(`status`)} ${l(e.status)}${c!==null&&c>=0?` ${a.dim(`(took ${s(c)})`)}`:``}`]:[],...t?[`${o(`tokens`)} ${p(t,n??e.model)}`]:[],...k(r,o,a)]}function j(e,t=300,{plain:n=!1,style:r=d}={}){if(e.length<=t)return e;let i=`<${e.length-t} more chars>`;return`${e.slice(0,t)} ${n?i:r.dim(i)}`}const M=` `.repeat(8),N={assistant:`●`,reasoning:`✻`,tool:`→`,"tool-result":` `,usage:`·`,status:`·`,info:`·`,error:`✘`,steer:`⚑`};function P(e,t){let n=/^\x1b\[[0-9;]*m/.exec(t(``))?.[0];return t(n&&e.includes(F)?e.split(F).join(`${F}${n}`):e)}const F=`\x1B[0m`;function I(e,t,n,r,i=r.dim){if(!e)return``;let a=(e.length>t?e.slice(0,t):e).split(`
3
- `).map(e=>P(e,i));return e.length>t&&(a[a.length-1]+=` ${r.light(`<${e.length-t} more chars>`)}`),a.length>n?[...a.slice(0,n),r.light(`… +${a.length-n} more lines`)].join(`
4
- `):a.join(`
5
- `)}var L=class e{opts;view;isApproval;separated=!1;entryAt=null;style;static async create(t={}){let n=await import(`./log-view-dg0TlKLA.js`).then(e=>e.n);return new e(t,new n.LogView(t.cwd),n.isApproval)}constructor(e,t,n){this.opts=e,this.view=t,this.isApproval=n,this.style=e.style??d}get lastAssistantMessage(){return this.view.lastAssistantMessage}render(e){let t=Date.parse(String(e.at??``));this.entryAt=Number.isFinite(t)?t:null;let[n]=this.view.reduce({seq:0,at:t,level:`out`,line:``,entry:e});if(!n)return[];this.separated=n.separated;let r=this.style,i=n.sourceKind,a=n.title,o=this.opts.trim??500,c=this.opts.explicitTrim||o===1/0?1/0:6;if(n.kind===`usage`)return this.compose(i,r.dim(a),!1);if(n.kind===`approval`)return this.compose(i,this.approval(a,n.detail??``),!1);if(n.kind===`assistant`)return this.compose(i,a,!0);if(n.kind===`steer`)return this.compose(i,r.yellow(a),!0);if(n.kind===`error`)return this.compose(i,r.red(a),!0);if(n.kind===`reasoning`){let e=Math.round((n.durationMs??0)/1e3),t=e>=1?`thought ${s(e*1e3)} · `:``,l=c===1/0?`${r.dim(t)}${I(a,o,1/0,r)}`:this.clip(`${t}${a.split(`
6
- `)[0]??``}`,3,r.dim);return this.compose(i,l,!1)}if(n.kind===`tool`)return this.compose(i,this.clip(a.replace(/\s*\n\s*/g,` `),2,r.light),!1);if(n.kind===`tool-result`){let e=[n.tool?r.dim(`from ${n.tool}`):``,n.tone===`error`?r.red(n.exitCode===void 0?`failed`:`exit ${n.exitCode}`):``,(n.durationMs??0)>=3e3?r.dim(s(n.durationMs)):``].filter(Boolean),t=I(a,o,c,r),l=[...e.length?[e.join(r.dim(` · `))]:[],...t?[t]:[]];return this.compose(i,l.join(`
7
- `),!1)}return this.compose(i,this.clip(a,3,r.dim),!1)}approval(e,t){let n=this.style,r=this.opts.width?this.opts.width-M.length:1/0,i=`${e}${t?`. ${t}`:``}`;return!t||m(i)<=r?`${n.light(e)}${t?n.dim(`. ${t}`):``}`:[this.clip(e,1,n.light),this.clip(t,2,n.dim)].join(`
8
- `)}clip(e,t,n){let r=this.opts.trim??500;if(this.opts.explicitTrim||r===1/0)return I(e,r,1/0,this.style,n);let i=this.opts.width;return i?o(e,Math.max(i-M.length,24),t).map(e=>P(e,n)).join(`
9
- `):n(e)}compose(e,t,n){let r=this.separated?[``]:[],i=N[e]??(this.isApproval(e)?`⚑`:`·`),[a=``,...o]=t.split(`
10
- `);return[...r,`${this.gutter(e)}${this.style.dim(i)} ${a}`,...o.map(e=>n?e:`${M}${e}`)]}gutter(e){let t=` `.repeat(6);return e===`tool-result`||!this.opts.startedAt||this.entryAt===null?t:`${this.style.dim(u(this.entryAt-this.opts.startedAt).padStart(5))} `}};const R=(e,t)=>e===`completed`?t.green(e):e===`failed`?t.red(e):e===`running`?t.yellow(e):t.dim(e);function z(e){return e.startedAt===void 0?``:s((e.finishedAt??Date.now())-e.startedAt)}function B(e){let t=(e.result?.output??``).trim().split(`
11
- `);for(let e=t.length-1;e>=0;--e){let n=t[e].trim();if(n.startsWith(`{`))try{let e=JSON.parse(n).reply;return typeof e==`string`?e:void 0}catch{return}}}function V(e,t){x.stdout.write(`${t.bold(e.task.id)} ${R(e.status,t)}${e.error?` ${t.red(e.error)}`:``}${z(e)?` ${t.dim(`took ${z(e)}`)}`:``}\n`),e.credential&&x.stdout.write(`${t.dim(`credential`)} ${e.credential}\n`);let n=B(e);n&&x.stdout.write(`\n${t.bold(`Reply`)}\n${n.trim()}\n`)}function H(e,t=!1){let{task:n,steps:r,result:i}=e;return{taskId:n.id,name:n.name??null,prompt:n.prompt??null,system:n.system??null,status:e.status,engine:n.engine,model:n.model??null,effort:n.effort??null,permissions:n.permissions??null,cwd:n.cwd??null,addDirs:n.addDirs??[],createdAt:n.createdAt??null,completedAt:n.completedAt??null,...e.idleMs===void 0?{}:{idleMs:e.idleMs,lastActivityAt:e.lastActivityAt??null,stalled:e.stalled},pendingApprovals:e.pendingApprovals,...r.length?{steps:r}:{},turnCount:e.turns.length,...t?{turns:e.turns}:{},result:i}}async function U(t,r,i={}){let{task:a,steps:o,result:c,turns:l,pendingApprovals:u}=t,p=d,m=n.includes(a.status),g=O(a,{status:t.status,tokens:c?.tokens??t.liveTokens??null,tokenModel:c?.model,files:c?.touchedFiles?.map(t=>e(a.cwd??r,t)),live:!c?.tokens&&!!t.liveTokens,style:p});if(a.prompt&&g.push(...T(a.prompt,p)),u.length){g.push(``,p.dim(`pending approvals:`));for(let e of u)g.push(` ${p.cyan(e.id)} ${e.summary}`),e.cwd&&g.push(` ${p.dim(`runs in ${e.cwd}`)}`),g.push(` ${p.bold(`coder task approve ${a.id} ${e.id}`)} ${p.dim(`(--deny to reject)`)}`)}if(o.length){g.push(``,p.dim(`steps:`));let e=await L.create({cwd:a.cwd??r,startedAt:Date.parse(a.createdAt??``)||void 0,width:h(),style:p}),t=c?.finalMessage&&String(o.at(-1)?.message??``).trim()===String(c.finalMessage).trim()?o.slice(0,-1):o;for(let n of t)g.push(...e.render(n))}if(g.push(``),i.turns&&l.length)l.forEach((e,t)=>{t&&g.push(``),g.push(p.dim(`Turn ${t+1} of ${l.length}. ${j(String(e.prompt??``))}`)),g.push(String(e.finalMessage||p.dim(`(no final message)`)))});else if(c)g.push(C({...c,error:c.error??void 0},a.error,`(no final message)`,p)),l.length>1&&g.push(p.dim(`Turn ${l.length} of ${l.length}. All answers are in coder task result ${a.id} --turns.`));else if(m){let{lastLog:e}=t;g.push(p.dim(t.stalled?`Result pending. No progress for ${s(t.idleMs??0)}. The task may be stalled.${e?` Last: ${j(e.message??e.kind??``)}`:``}`:`Result pending. The task is still running.`))}else g.push(p.dim(`(no result)`));if(m&&!i.wait){let e=[`Wait in a background shell; do not poll: coder task result ${a.id} --wait`,`Follow live: coder task watch ${a.id}`];t.stalled&&e.push(`Check the transcript: coder task result ${a.id} --tail all`),g.push(``,f(e,p))}x.stdout.write(`${g.join(`
12
- `)}\n`)}const W=i({name:`task result`,help:{usage:`coder task result [task-id] [--server [url]]`,summary:`Show a task's status and its final answer (result pending while it runs), plus
13
- any pending approvals. --wait blocks until it finishes, then prints. --tail <n>
14
- includes the last n progress-log steps (--tail all for the whole transcript).
15
- Defaults to the most recent task. Shortcut: \`coder result\`.`,flags:[[`--wait`,`block until the task finishes, then print`],[`--turns`,`every turn's answer (a steered task accretes turns)`],[`--tail <n|all>`,`include the last n progress-log steps (default: 0, final result only)`],a],exitCodes:[[`0`,`The task completed successfully.`],[`1`,`The task failed or was cancelled.`],[`4`,`An approval is pending; answer it, then run --wait again.`]],examples:[[`coder result <task-id> --wait`,`block until the task finishes, print the answer`],[`coder result <task-id> --turns`,`every turn's answer for a steered task`]]},options:{...b,tail:_,wait:v,turns:v,...S},args:1,run:async({options:e,args:[t]})=>{let{tasks:n}=await import(`./task-C6VAg5WU.js`).then(e=>e.t);return n.result(t,{...e,organization:e.workspace,onWaiting:e=>x.stderr.write(`${d.dim(`[coder] waiting for task ${e} to finish...`)}\n`)})},json:(e,{options:t})=>`attempts`in e?e:H(e,t.turns),print:(e,{options:t,cwd:n})=>`attempts`in e?V(e,d):U(e,n,t),exit:(e,{options:t})=>t.wait&&!(`attempts`in e)?e.task.status===`completed`?0:1:void 0});export{L as LogRenderer,W as commandResult,C as finalMessageLine,V as printOutcome,T as promptBlock,B as replyOf,R as statusStyle,O as taskHeaderLines,A as taskSummaryLines,j as trimStep};
@@ -1,2 +0,0 @@
1
- import{d as e,i as t,n,p as r}from"./cli-BilSDkvE.js";import{p as i,r as a,s as o,u as s}from"./output-BKeyLbvt.js";import{c,i as l,n as u,s as d,t as f}from"./args-BOEEdpWk.js";import{printOutcome as p}from"./result-BzaM3inj.js";import{printLine as m}from"./watch-DtRuC0Wc.js";import{TASK_FLAGS as h}from"./task-CgOKgkEG.js";import g from"node:process";function _(t){let n=e([{usage:`coder task result ${t} --wait`,blurb:`run in a background shell; returns with the answer or a pending approval`},{usage:`coder task steer ${t} "<follow-up>"`,blurb:`steer the task with a message (use 'ask' without interrupting main thread)`},{usage:`coder task stop ${t}`,blurb:`stop the task`},{usage:`coder task list`,blurb:`recent tasks`},{usage:`coder task --help`,blurb:`all task commands`}],i,i.blue);return[...r(`Next step`,n.slice(0,1),i),...r(`Related`,n.slice(1),i)].join(`
2
- `)}function v(e,t){g.stdout.write(`${i.dim(`[coder]`)} task ${i.blue(e)} started in the background (${t}).\n`),g.stdout.write(`${_(e)}\n`)}function y(e){g.stderr.write(`${i.dim(`[coder]`)} Task ${i.cyan(e)} started and is waiting to finish. Press Ctrl-C to detach. It keeps running.\n`),g.stderr.write(`${_(e)}\n`)}function b(e){g.stderr.write(`\n${i.dim(`[coder] Detached. The task is still running.`)}\n\n${o([`Wait for the answer: coder task result ${e} --wait`],a)}\n`)}function x(e){g.stdout.write(`\n${e.finalMessage||(e.error?`${i.red(`error:`)} ${e.error}`:`(no final message)`)}\n\n`);let t=e.tokens?` tokens=${s(e.tokens,e.model)}`:``;g.stderr.write(`${i.dim(`[coder] task=${e.taskId} status=${e.status}${t}`)}\n`)}const S=t({name:`task run`,help:{usage:`coder task run "<task text>"`,summary:`Dispatch a coding task to the configured engine. Backgrounds by default and\nprints a task id; --wait runs in the foreground and prints the answer.\nShortcut: \`coder run "<text>"\`.\n\nWriting a task: one task per focused goal, independent goals as parallel runs.\nThe worker starts with nothing but the text, so include the goal, file paths,\nconstraints and any context only you have. Delegate rather than doing the work\nyourself first, however small it looks.\n\n${n}`,flags:[[`--output-schema <json>`,`JSON Schema for the task answer`],[`--name <name>`,`label the task (shown in list/result)`],[`--agent <id>`,`run as that agent: its system.md, engine settings, MCP servers and flows; flags override them`],[`--system <text>`,`standing instructions prepended to the task (kept out of prompt previews)`],...h,[`--server [url] [--workspace <slug>]`,`run the task on your Coder server and follow it here (--background prints its id); --resume continues a finished server task`],[`--repo <owner/name>`,`with --server: check out a repo from the workspace's installs`],[`--runner <name>`,`with --server: where it runs (a runner kind or a registered runner)`]],exitCodes:[[`0`,`The task started, or --wait printed a successful answer.`],[`1`,`Dispatch or the task failed.`],[`3`,`No engine could start; follow fallback.instructions in the JSON payload.`],[`4`,`An approval is pending; answer it, then run result --wait again.`],[`130`,`The foreground wait was detached and the task is still running.`]],examples:[[`coder run "add a /health endpoint"`,`dispatch in the background, print a task id`],[`coder result <task-id> --wait`,`then block until it finishes and print the answer`],[`coder run --wait "fix the failing test"`,`or block on the run itself`],[`coder task run --model luna --system "tests live in test/, don't touch anything outside of it" "rename foo to bar"`,`pick an engine via its model alias; --system adds standing instructions`],[`coder task run --agent reviewer "review the last commit"`,`run a repo agent from .coder/agents/reviewer`],[`coder run --add-dir ../api --add-dir ../shared "update the client for the new endpoint"`,`let the task reach sibling repos too`]]},options:{...f,agent:d,"output-schema":d,engine:d,model:d,effort:d,permissions:d,resume:d,host:d,name:d,system:d,mcp:d,"add-dir":c,background:u,wait:u,"simulate-approval":u,server:l,workspace:d,yes:u,repo:d,runner:d},args:1/0,async run({options:e,args:t}){let{tasks:n}=await import(`./task-C6VAg5WU.js`).then(e=>e.t),r=e.json,a;return g.on(`SIGINT`,()=>{a&&b(a),g.exit(130)}),n.run(t.join(` `).trim(),{cwd:e.cwd,agent:e.agent,outputSchema:e[`output-schema`]?JSON.parse(e[`output-schema`]):void 0,engine:e.engine,model:e.model,effort:e.effort,permissions:e.permissions,name:e.name,system:e.system,resume:e.resume,mcp:e.mcp,addDirs:e[`add-dir`],wait:e.server===void 0?e.wait:!e.background,simulateApproval:e[`simulate-approval`],repo:e.repo,runner:e.runner,server:e.server,yes:e.yes,organization:e.workspace,onFallback:({engine:e,detail:t,next:n})=>g.stderr.write(`[coder] ${e} failed to start (${t}); falling back to ${n}.\n`),onNote:e=>g.stderr.write(`[coder] ${e}\n`),onWaiting:e=>{a=e,r||y(e)},onLog:e=>r?g.stdout.write(`${JSON.stringify(e,null,2)}\n`):m(e,i)})},print(e,{options:t}){if(`attempts`in e)return t.background?void g.stdout.write(`${e.task.id}\n`):p(e,i);t.wait?x(e):v(e.taskId,e.status)},exit:(e,{options:t})=>(`attempts`in e?!t.background:t.wait)?e.status===`completed`?0:1:void 0});export{S as commandTask};
@@ -1 +0,0 @@
1
- import{s as e}from"./cli-BilSDkvE.js";const t=e(`runner`,{add:async()=>(await import(`./add-BxpLHnvD.js`)).commandRunnerAdd,default:async()=>(await import(`./default-Bobztoxf.js`)).commandRunnerDefault,test:async()=>(await import(`./test-NEbhlxvo.js`)).commandRunnerTest,serve:async()=>(await import(`./serve-CE8YV2e9.js`)).commandRunnerServe,list:async()=>(await import(`./list-C5w01-8q.js`)).commandRunnerList,rename:async()=>(await import(`./rename-CYfy03FE.js`)).commandRunnerRename,remove:async()=>(await import(`./remove-B93LNkZI.js`)).commandRunnerRemove},{menu:[{usage:`add <kind>`,blurb:`connect a runner`},{usage:`default <id>`,blurb:`set the default in its scope`},{usage:`test <id>`,blurb:`check a runner connection`},{usage:`serve --url <public url>`,blurb:`run your server's tasks on this machine`},{usage:`list`,blurb:`list your runners and the workspace's`},{usage:`rename <id> <name>`,blurb:`rename a runner`},{usage:`remove <id>`,blurb:`remove a runner`}],description:[`Run your Coder server's tasks on your own machine, reached through any tunnel.`],exampleCommand:`runner serve`});export{t as commandRunner};
@@ -1 +0,0 @@
1
- import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{sql as t}from"drizzle-orm";import{bigint as n,bigserial as r,boolean as i,index as a,integer as o,jsonb as s,pgSchema as c,primaryKey as l,text as u,timestamp as d,unique as f}from"drizzle-orm/pg-core";var p=e({agent:()=>b,agentVersion:()=>x,chatItem:()=>M,chatState:()=>j,coder:()=>m,engineCredential:()=>T,integrationApp:()=>C,integrationAppInstallation:()=>w,platformLink:()=>y,runner:()=>E,secret:()=>S,tables:()=>N,task:()=>D,taskInbox:()=>O,taskLog:()=>k,usage:()=>A});const m=c(`coder`),h=m.table,g=()=>d({withTimezone:!0}),_={createdAt:g().notNull().defaultNow(),updatedAt:g().notNull().defaultNow()},v={id:r({mode:`number`}).primaryKey(),organizationId:u().notNull()},y=h(`platform_link`,{id:r({mode:`number`}).primaryKey(),platform:u().notNull(),platformUserId:u().notNull(),userId:u().notNull(),name:u().notNull(),email:u().notNull(),organizations:s().$type(),token:u(),createdAt:g().notNull().defaultNow()},e=>[f().on(e.platform,e.platformUserId),a().on(e.userId)]),b=h(`agent`,{...v,slug:u().notNull(),name:u().notNull(),description:u(),source:u().$type().notNull(),repo:u(),path:u(),currentVersion:o().notNull(),settings:s().$type(),..._},e=>[f().on(e.organizationId,e.slug)]),x=h(`agent_version`,{id:r({mode:`number`}).primaryKey(),agentId:n({mode:`number`}).notNull().references(()=>b.id),version:o().notNull(),definition:s().$type().notNull(),systemPrompt:u().notNull(),files:s().$type(),commit:u(),importedFrom:u().notNull(),createdAt:g().notNull().defaultNow()},e=>[f().on(e.agentId,e.version)]),S=h(`secret`,{...v,kind:u().$type().notNull(),iv:u().notNull(),tag:u().notNull(),ciphertext:u().notNull(),keyVersion:o().notNull(),..._},e=>[a().on(e.organizationId,e.kind)]),C=h(`integration_app`,{...v,key:u().notNull(),integration:u().notNull(),platformAppId:u().notNull(),agent:u().notNull(),name:u().notNull(),agentsRepo:u(),branch:u(),credentialsSecretId:n({mode:`number`}).notNull().references(()=>S.id),..._},e=>[f().on(e.organizationId,e.key),f().on(e.integration,e.platformAppId)]),w=h(`integration_app_installation`,{...v,key:u().notNull(),appId:n({mode:`number`}).notNull().references(()=>C.id),platformInstallId:u().notNull(),account:s().$type().notNull(),tokenSecretId:n({mode:`number`}).references(()=>S.id),installer:u(),connections:s().$type(),settings:s().$type(),..._,deletedAt:g()},e=>[f().on(e.key),a().on(e.organizationId,e.appId)]),T=h(`engine_credential`,{...v,secretId:n({mode:`number`}).notNull().references(()=>S.id).unique(),owner:u(),engine:u().$type().notNull(),label:u().notNull(),isDefault:i().notNull().default(!1),account:s().$type(),..._},e=>[f().on(e.organizationId,e.owner,e.label).nullsNotDistinct()]),E=h(`runner`,{...v,publicId:u().notNull(),owner:u(),name:u().notNull(),kind:u().$type().notNull(),scope:u().$type().notNull(),config:s().$type().notNull(),createdBy:u(),isDefault:i().notNull().default(!1),lastSeen:d({withTimezone:!0}),secretId:n({mode:`number`}).notNull().references(()=>S.id),..._},e=>[f().on(e.organizationId,e.publicId)]),D=h(`task`,{...v,publicId:u().notNull(),source:u().$type().notNull(),status:u().$type().notNull(),agent:u().notNull(),flow:u().notNull(),runner:u().notNull(),permissions:u().$type(),appId:n({mode:`number`}).references(()=>C.id),installationId:n({mode:`number`}).references(()=>w.id),event:s().$type(),prompt:u(),args:s().$type(),mcp:s().$type(),author:u(),definition:s().$type().notNull(),credential:u(),requester:u(),runnerId:u(),usage:s().$type(),tools:s().$type().notNull(),toolScopes:s().$type(),context:s().$type(),files:s().$type(),result:s().$type(),error:u(),tokens:s(),handle:u(),tokenHash:u(),lastSeenAt:g(),logCursor:o(),logSeq:o(),logBytes:o(),archivedAt:g(),approval:s(),answer:s(),attempts:o().notNull().default(0),inboxSeq:o().notNull().default(-1),inboxAck:o().notNull().default(-1),generation:o().notNull().default(0),lockedAt:g(),startedAt:g(),finishedAt:g(),cancelRequestedAt:g(),..._},e=>[f().on(e.organizationId,e.publicId),a().on(e.publicId),a().on(e.organizationId,e.createdAt.desc(),e.publicId.desc()),a().on(e.organizationId).where(t`${e.status} = 'queued'`),a().on(e.status,e.createdAt)]),O=h(`task_inbox`,{...v,taskId:n({mode:`number`}).notNull().references(()=>D.id,{onDelete:`cascade`}),seq:o().notNull(),generation:o().notNull().default(0),kind:u().$type().notNull(),value:s(),at:g().notNull()},e=>[f().on(e.taskId,e.seq),a().on(e.taskId,e.generation,e.seq)]),k=h(`task_log`,{...v,taskId:n({mode:`number`}).notNull().references(()=>D.id,{onDelete:`cascade`}),seq:o().notNull(),at:g().notNull(),level:u().$type().notNull(),line:u().notNull()},e=>[f().on(e.taskId,e.seq)]),A=h(`usage`,{...v,taskId:n({mode:`number`}).notNull().references(()=>D.id,{onDelete:`cascade`}).unique(),installationId:n({mode:`number`}).references(()=>w.id),agent:u().notNull(),target:u().notNull(),engine:u(),model:u(),credential:u().notNull(),runnerMs:o().notNull(),tokens:s(),at:g().notNull(),..._},e=>[a().on(e.organizationId,e.at)]),j=h(`chat_state`,{key:u().primaryKey(),value:s().notNull(),expiresAt:g()},e=>[a().on(e.expiresAt).where(t`${e.expiresAt} is not null`)]),M=h(`chat_item`,{key:u().notNull(),seq:n({mode:`number`}).generatedAlwaysAsIdentity(),value:s().notNull(),expiresAt:g()},e=>[l({columns:[e.key,e.seq]}),a().on(e.expiresAt).where(t`${e.expiresAt} is not null`)]),N={platformLink:y,agent:b,agentVersion:x,secret:S,integrationApp:C,integrationAppInstallation:w,engineCredential:T,runner:E,task:D,taskInbox:O,taskLog:k,usage:A,chatState:j,chatItem:M};export{T as a,y as c,S as d,N as f,A as g,k as h,j as i,E as l,O as m,x as n,C as o,D as p,M as r,w as s,b as t,p as u};
@@ -1,4 +0,0 @@
1
- import{t as e}from"./rolldown-runtime-DT7IzrpZ.js";import{$ as t,At as n,K as r,Qt as i,Tn as a,U as o,W as s,bn as c,dt as l,et as u,kt as d,lt as f,q as p,tt as m,vt as h,xt as g,zt as _}from"./dispatch-BKeAch9E.js";import{i as v,n as y,r as b,u as x}from"./load-BpEsAn51.js";import{c as S,d as C,l as ee,n as te}from"./integrations-BAgdVDhj.js";import{c as ne}from"./models-_5LVGC3m.js";import{o as w}from"./local-H3uvqEbq.js";import{a as T,d as E,f as re,l as D,n as ie,o as ae,p as O,r as k,s as oe,t as se,u as ce}from"./http-Bkg_OQ6r.js";import{$ as le,$t as ue,A as de,An as fe,At as pe,B as me,Bn as he,Bt as ge,C as _e,Cn as ve,Ct as ye,D as be,Dn as xe,Dt as Se,E as Ce,En as we,Et as Te,F as Ee,Fn as De,G as Oe,Gn as ke,Gt as Ae,H as je,Hn as Me,Ht as Ne,I as Pe,In as A,It as Fe,J as Ie,Jn as Le,Jt as Re,K as ze,Kn as j,Kt as Be,L as Ve,Lt as He,M as Ue,Mn as We,Mt as Ge,N as Ke,Nn as qe,Nt as Je,O as Ye,On as Xe,Ot as M,P as Ze,Pn as N,Pt as Qe,Q as $e,Qn as et,Qt as tt,R as nt,Rt as rt,S as it,Sn as at,St as ot,T as P,Tn as st,Tt as F,U as ct,Un as lt,Ut as ut,V as dt,Vn as ft,Vt as pt,W as mt,Wn as ht,Wt as gt,X as _t,Xn as I,Xt as vt,Y as yt,Yn as bt,Yt as xt,Z as St,Zn as L,Zt as Ct,_ as R,_n as wt,_t as Tt,an as Et,b as Dt,bn as Ot,bt as kt,cn as At,ct as jt,d as Mt,dt as Nt,en as Pt,et as Ft,f as It,fn as Lt,ft as Rt,g as zt,gn as Bt,gt as Vt,h as Ht,hn as z,ht as Ut,i as Wt,in as Gt,it as Kt,j as qt,jn as Jt,jt as Yt,k as Xt,kn as Zt,kt as Qt,l as $t,ln as en,m as tn,mn as nn,mt as rn,nn as an,o as on,on as sn,ot as cn,pn as B,pt as ln,qn as V,qt as un,r as dn,rn as fn,rt as pn,s as mn,sn as hn,st as gn,t as _n,tn as vn,u as yn,v as H,vn as U,vt as bn,w as xn,wn as Sn,wt as Cn,x as wn,xn as Tn,xt as En,y as W,yn as G,yt as K,z as Dn,zn as On,zt as kn}from"./store-DzqXS2wT.js";import{n as An,r as jn}from"./env-CRf6wkM2.js";import{l as Mn}from"./schema-CU2iFkp8.js";import{r as Nn,t as Pn}from"./migrate-N-85_N7J.js";import{n as Fn,r as In}from"./usage-BhqoCjvE.js";import q from"node:path";import J from"node:process";import*as Y from"zod/mini";import Ln from"node:fs";import{randomBytes as Rn,randomUUID as zn}from"node:crypto";import X from"node:fs/promises";import{isDeepStrictEqual as Bn}from"node:util";import Vn from"node:http";import{sql as Hn}from"drizzle-orm";async function Un(e){try{return await X.readdir(e,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}}async function Z(e){try{return await X.lstat(e),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}}async function Wn(e,t){if(e===t||!await Z(e))return 0;let n=await Un(e),r=n.filter(e=>e.isDirectory()).length;if(!await Z(t))return await a(e,t),r;for(let r of n)await a(q.join(e,r.name),q.join(t,r.name));return await X.rmdir(e),r}async function Gn(e){let t=q.dirname(e),n=q.basename(e);for(let e of await Un(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 X.unlink(q.join(t,e.name)).catch(e=>{if(e.code!==`ENOENT`)throw e})}}async function Kn(e,t){if(await Gn(e),e===t||!await Z(e))return 0;if(!await Z(t))return await a(e,t),1;let n=JSON.parse(await X.readFile(e,`utf8`)),r=JSON.parse(await X.readFile(t,`utf8`)),i={...n,...r,...n.rows||r.rows?{rows:{...n.rows,...r.rows}}:{}},o=`${t}.${process.pid}.${zn()}.tmp`;try{await X.writeFile(o,`${JSON.stringify(i)}\n`,{mode:384,flag:`wx`}),await X.rename(o,t),await X.unlink(e)}finally{await X.rm(o,{force:!0})}return 1}async function qn(){let e=d(),t=n(`state`),r=d(`archive`),i=d(`flows-archived`),a=d(`usage.json`),o=d(`runner`,`usage.json`),s={from:n(`checkouts`),to:d(`checkouts`)},c={from:n(`update-check.json`),to:d(`update-check.json`)},l={cache:e,tasks:0,flows:0,files:0},u=(await Un(t)).filter(e=>e.isDirectory()).map(e=>({archive:n(`state`,e.name,`archive`),flows:n(`state`,e.name,`flows-archived`),usage:n(`state`,e.name,`usage.json`),runnerUsage:n(`state`,e.name,`runner`,`usage.json`)}));await Gn(a),await Gn(o);for(let e of u)l.tasks+=await Wn(e.archive,r),l.flows+=await Wn(e.flows,i),l.files+=await Kn(e.usage,a),l.files+=await Kn(e.runnerUsage,o);return await Wn(s.from,s.to),l.files+=await Kn(c.from,c.to),l}async function Jn(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 Yn(e){let t=(e.now??Date.now)(),n=e.health,{body:r,status:i}=n&&t-n.at<5e3?n:await Xn(e);e.health=i===200?{at:n&&t-n.at<5e3?n.at:t,body:r,status:i}:void 0;let a=Math.max(0,t-(e.limits?.startedAt??t))/1e3;return T({...r,uptime:a},i,{"cache-control":`no-store`})}async function Xn(e){let t=e.config.store===`postgres`?`down`:`none`,n={online:0,total:0},r=!0;try{if(e.config.store===`postgres`){if(!e.databaseHealth)throw Error(`Database health probe is unavailable`);await e.databaseHealth(),t=`ok`}n=e.healthRunners?await e.healthRunners():await Jn(e)}catch{r=!1,e.config.store===`postgres`&&(t=`down`)}return{body:{ok:r,version:c(),db:t,runners:n},status:r?200:503}}async function Zn(e){let t=(e.now??Date.now)();if(e.queue.metrics&&!e.local)return{...await e.queue.metrics(e.organizationId,t-864e5),runnersOnline:(await Jn(e)).online,requests:e.limits?.requests??0,rateLimitRejections:e.limits?.rejections??0};let n=await e.queue.list(e.organizationId),r=e.local?[...It(e.local.cwd,!1),...It(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 Jn(e)).online,requests:e.limits?.requests??0,rateLimitRejections:e.limits?.rejections??0}}async function Qn(e,t,n,r){if(!t.auth)return T({mode:Fe(t),organization:{id:t.organizationId},server:$n(t)});let i=t.session;return T({mode:Fe(t),user:i.user,organization:i.organizations.find(e=>e.id===i.organizationId)??null,organizations:i.organizations,manageMembersUrl:`${t.auth.issuer}/auth/onboarding`,server:$n(t)})}function $n(e){return{name:e.config.name??`Coder`,store:e.config.store,...e.config.publicUrl?{url:e.config.publicUrl}:{},subscriptions:{claude:!!e.config.subscriptions?.claude,codex:!!e.config.subscriptions?.codex}}}async function er(e,t,n,r){let i=e.headers.get(`content-type`)??``,a=i.includes(`application/json`)?await e.json().catch(()=>void 0):await e.formData().then(e=>Object.fromEntries(e.entries()),()=>void 0);if(!a||typeof a!=`object`)return T({error:`Send the workspace as a form or JSON body.`},400);let o=typeof a.organization==`string`?a.organization:``,s=o?await t.auth.setOrganization(e.headers,o):void 0;if(!s)return T({error:`You are not a member of that workspace.`},403);let{cookies:c,...l}=s,u=i.includes(`application/json`)?T({organization:l}):O(`/dash`,303);for(let e of c)u.headers.append(`set-cookie`,e);return u}async function tr(e,t,n,r){let i=t.session.user.id;n.id;let a=(await e.json().catch(()=>({}))).engine??``;if(!or.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=`login-${Rn(12).toString(`base64url`)}`,c=he(s,t.organizationId,0),l={owner:i,engine:a,state:`starting`,tokenHash:c.hash,runner:o.kind,createdAt:sr(t),expiresAt:sr(t)+ar};await cr(t,s,l);let u;try{let e=await o.start({id:s},{CODER_SERVER:t.config.publicUrl??``,CODER_TASK_TOKEN:c.token,CODER_LOGIN:a}),n=await t.store.patchLogin(s,{handle:e},{tokenHash:l.tokenHash});if(!n)return await o.stop(e).catch(()=>{}),T({error:`This sign-in is gone. Start again.`},409);u=n}catch(e){return await t.store.delete(`login`,s),T({error:e instanceof Error?e.message:String(e)},502)}return T(lr(s,u),201)}async function nr(e,t,n,r){t.session.user.id;let i=n.id??``,a=i&&!i.includes(`/`)?await ur(t,i):void 0;return a?T(lr(i,a)):T({error:`This sign-in is gone. Start again.`},404)}async function rr(e,t,n,r){t.session.user.id;let i=n.id??``,a=i&&!i.includes(`/`)?await ur(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:A(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 ir(e,t,n,r){t.session.user.id;let i=n.id??``,a=i&&!i.includes(`/`)?await ur(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 ar=6e5,or=new Set([`claude`,`codex`]),sr=e=>(e.now??Date.now)();function cr(e,t,n){return e.store.put(`login`,t,n,{ttlMs:Math.max(1,n.expiresAt-sr(e))})}function lr(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}:{},...t.label?{label:t.label}:{}}}async function ur(e,t){let n=await e.store.get(`login`,t);return n&&n.owner===e.session?.user.id?n:void 0}async function dr(e,t,n,r){let i=n.id,a=t.callbackLogin,o=Date.now()+25e3;for(;!a.input&&Date.now()<o&&!e.signal.aborted;){await new Promise(e=>setTimeout(e,250));let e=await t.store.get(`login`,i);if(!e)return new Response(`Unauthorized`,{status:401});a=e}if(!a.input)return T({});let s=await t.store.patchLogin(i,{input:null},{input:a.input,tokenHash:a.tokenHash});return T(s?{code:N(t.config,a.input)}:{})}async function fr(e,t,n,r){n.id;let i=t.callbackLogin;return T({engine:i.engine})}async function pr(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),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=`${a.engine}-subscription`,r=o.result?.account;return await t.store.completeLogin(i,a.tokenHash,n,{...De(t.config,{env:c}),engine:a.engine,createdAt:(t.now??Date.now)(),...r?.email||r?.plan?{account:{...typeof r.email==`string`?{email:r.email}:{},...typeof r.plan==`string`?{plan:r.plan}:{}}}:{}})?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(a.state===`starting`?await t.store.patchLogin(i,{...l,state:`open`},{state:`starting`,tokenHash:a.tokenHash})??await t.store.patchLogin(i,l,{...s,state:[`open`,`verifying`]}):await t.store.patchLogin(i,l,s))?T({ok:!0}):T({error:`This sign-in changed. Try again.`},409)}async function mr(e,t,n,r){let i=n.id,a=t.operatorApp??!1;if(!/^[a-z0-9_-]+$/.test(r.pathname.split(`/`)[2]))return;let o=a?`*`:t.session?.user.id??`anonymous`,s=t.integrations[i];if(!s)return j(`Unknown integration "${i}"; run coder agent integrations list to see them`,404);let c=t.config.publicUrl;if(!c)return j(`PUBLIC_URL is not set on this server; set it to the address platforms should call and restart`,400);t.fetch,t.now?.();let l=V(r.searchParams);if(!l)return j(`Setup link is missing or malformed; start again from the agent's Platforms tab`,400);if(!l.definition.integrations[i])return j(`This agent declares no ${i} integration in its agent.json`,400);if(l.state.public&&!a)return j(`Only the server operator creates public apps`,403);let u=lt(i,l.state),d=l.state.tx?await I(t,l.state.tx,`create`,o)===u?l.state.tx:void 0:await L(t,`create`,o,u);if(!d)return j(`This app creation link is invalid, expired, or already used`,403);let f={...l.state,tx:d};return s.app.createPage({publicUrl:c,state:f,definition:l.definition,encodedState:w(f)})}async function hr(e,t,n,r){let i=n.id,a=t.operatorApp??!1;if(!/^[a-z0-9_-]+$/.test(r.pathname.split(`/`)[2]))return;let o=a?`*`:t.session?.user.id??`anonymous`,s=t.integrations[i];if(!s)return j(`Unknown integration "${i}"; run coder agent integrations list to see them`,404);let c=t.config.publicUrl;if(!c)return j(`PUBLIC_URL is not set on this server; set it to the address platforms should call and restart`,400);let l=t.fetch??fetch,u=t.now?.()??Date.now(),d=k(r.searchParams.get(`state`)),f=V(r.searchParams)??(d&&V(new URLSearchParams(Object.entries(d).filter(([,e])=>e!==void 0))))??void 0;if(!f)return j(`Setup state was lost between the platform and this server; start again`,400);if(!f.state.tx||!await bt(t,f.state.tx,`create`,o,lt(i,f.state)))return j(`This app creation link is invalid, expired, or already used`,403);let p=await s.app.createCallback(e,{publicUrl:c,...f,fetch:l}).catch(e=>j(`Creating the ${i} app failed: ${e instanceof Error?e.message:e}`,400));if(p instanceof Response)return p;let m={id:`${i}:${p.platformAppId}`,integration:i,agent:f.state.agent,name:p.name,...f.state.repo?{agentsRepo:f.state.repo}:{},...f.state.repo?{branch:f.state.branch??`main`}:{},...a?{builtin:!0}:{},credentials:A(t.config,p.credentials),createdAt:u};if(await t.store.put(`app`,m.id,m),a)return j(`Created ${p.name}. Every workspace on this server can now connect it from its dashboard.`);let h=await L(t,`install`,o,m.id),g=`/dash/agents/${encodeURIComponent(m.agent)}/platforms`;return O(`${c}/install/${i}?app=${encodeURIComponent(m.id)}&state=${w({tx:h,back:g})}`)}async function gr(e,t,n,r){let i=n.id,a=t.operatorApp??!1;if(!/^[a-z0-9_-]+$/.test(r.pathname.split(`/`)[2]))return;let o=a?`*`:t.session?.user.id??`anonymous`,s=t.integrations[i];if(!s)return j(`Unknown integration "${i}"; run coder agent integrations list to see them`,404);let c=t.config.publicUrl;if(!c)return j(`PUBLIC_URL is not set on this server; set it to the address platforms should call and restart`,400);let l=t.fetch??fetch,u=t.now?.()??Date.now(),d=new URLSearchParams(await e.clone().text()),f=k(r.searchParams.get(`state`)),p=V(r.searchParams)??(f&&V(new URLSearchParams(Object.entries(f).filter(([,e])=>e!==void 0))))??(d&&V(d));if(!p)return j(`Setup state was lost between the platform and this server; start again`,400);if(!p.state.tx||!await bt(t,p.state.tx,`create`,o,lt(i,p.state)))return j(`This app creation link is invalid, expired, or already used`,403);let m=await s.app.createCallback(e,{publicUrl:c,...p,fetch:l}).catch(e=>j(`Creating the ${i} app failed: ${e instanceof Error?e.message:e}`,400));if(m instanceof Response)return m;let h={id:`${i}:${m.platformAppId}`,integration:i,agent:p.state.agent,name:m.name,...p.state.repo?{agentsRepo:p.state.repo}:{},...p.state.repo?{branch:p.state.branch??`main`}:{},...a?{builtin:!0}:{},credentials:A(t.config,m.credentials),createdAt:u};if(await t.store.put(`app`,h.id,h),a)return j(`Created ${m.name}. Every workspace on this server can now connect it from its dashboard.`);let g=await L(t,`install`,o,h.id),_=`/dash/agents/${encodeURIComponent(h.agent)}/platforms`;return O(`${c}/install/${i}?app=${encodeURIComponent(h.id)}&state=${w({tx:g,back:_})}`)}async function _r(e,t,n,r){let i=n.id,a=t.operatorApp??!1;if(!/^[a-z0-9_-]+$/.test(r.pathname.split(`/`)[2]))return;let o=a?`*`:t.session?.user.id??`anonymous`,s=t.integrations[i];if(!s)return j(`Unknown integration "${i}"; run coder agent integrations list to see them`,404);let c=t.config.publicUrl;if(!c)return j(`PUBLIC_URL is not set on this server; set it to the address platforms should call and restart`,400);t.fetch,t.now?.();let l=k(r.searchParams.get(`state`)),u=r.searchParams.get(`app`),d=l?.tx?await I(t,l.tx,`install`,o):void 0;if(!d||u&&u!==d)return j(`This installation link is invalid, expired, or already used`,403);let f=await t.store.get(`app`,u??d);if(!f)return j(`This app is not known to this server; create it first`,400);let p=N(t.config,f.credentials);return O(s.app.installUrl(f,p,{publicUrl:c,state:r.searchParams.get(`state`)??w({})}))}async function vr(e,t,n,r){let i=n.id,a=t.operatorApp??!1;if(!/^[a-z0-9_-]+$/.test(r.pathname.split(`/`)[2]))return;let o=a?`*`:t.session?.user.id??`anonymous`,s=t.integrations[i];if(!s)return j(`Unknown integration "${i}"; run coder agent integrations list to see them`,404);let c=t.config.publicUrl;if(!c)return j(`PUBLIC_URL is not set on this server; set it to the address platforms should call and restart`,400);let l=t.fetch??fetch,u=t.now?.()??Date.now(),d=k(r.searchParams.get(`state`)),f=r.searchParams.get(`app`),p=d?.tx?await I(t,d.tx,`install`,o):void 0;if(!p||f&&f!==p||!await bt(t,d.tx,`install`,o,p))return j(`This installation link is invalid, expired, or already used`,403);let m=await t.store.get(`app`,f??p),h=d?.link?await t.store.get(`installation`,d.link):void 0,g=m??(h&&await ke(t,h,i));if(!g)return d&&!d.link?j(`Connected.`):j(`This install does not match any app on this server; create the app first`,400);let _=N(t.config,g.credentials),v=await s.app.installCallback(e,{app:g,credentials:_,publicUrl:c,fetch:l,connect:Me(t,g,c)}).catch(e=>j(e instanceof Error?e.message:String(e),400));if(v instanceof Response)return v;let y=`${g.id}:${v.platformInstallId}`,b=t.session;v.user&&b&&t.auth&&await t.auth.link(b.user,i,v.user.id,{organizations:b.organizations.map(e=>e.id),...v.user.token?{token:A(t.config,v.user.token)}:{}});let x=await t.store.get(`installation`,y),S={...x,id:y,app:g.id,integration:i,account:v.account??x?.account??h?.account??{login:`unknown`},...v.token?{token:A(t.config,v.token)}:{},...v.installer?{installer:v.installer}:{},createdAt:x?.createdAt??u};delete S.deletedAt;let C=h&&!h.deletedAt?h:void 0;C&&(S=ht(S,C.integration,C.id));try{await t.store.put(`installation`,y,S)}catch{return j(`This ${i} installation is already connected to another workspace; disconnect it there first`,409)}if(C&&await t.store.put(`installation`,C.id,ht(C,i,y)),s.renew){let e=await(await import(`./store-DzqXS2wT.js`).then(e=>e.q)).renewInstallation({...t,fetch:l},g,v.platformInstallId).then(()=>void 0,e=>e instanceof Error?e.message:String(e));if(e)return j(`Connected, but ${i} did not start sending events yet. ${e}. Coder tries again within the hour.`,502)}let ee=ft(d?.back);return ee?O(`${c.replace(/\/$/,``)}${ee}`):v.response}const Q=(e,t=200)=>ee(`<title>Coder</title><p>${S(e)}</p>`,t);function yr(e,t,n){return n&&t.organizations.some(e=>e.id===n)?{...On(e,n),session:t}:void 0}async function br(e,t){let n=await e.store.get(`installation`,t);return n&&!n.deletedAt?e.store.get(`app`,n.app):void 0}async function xr(e,t,n,r){let i=t.linkContext,a=i.session,o=e=>{let t=et(i,e);return t&&a.organizations.some(e=>e.id===t)?{...On(i,t),session:a}:i},s=r.searchParams.get(`token`)??``,c=o(s);if(await I(c,s,`link`,a.user.id))return await At(e,void 0,t.dashboardHosts)??new Response(`UI is not built`,{status:503});let l=await Le(c,s,`link-start`,a.user.id);if(!l)return new Response(`This link is invalid or has expired.`,{status:400});let u=await L(c,`link`,a.user.id,l,3e5);return O(`/connect?token=${encodeURIComponent(u)}`)}async function Sr(e,t,n,r){let i=t.linkContext,a=i.session,o=e=>{let t=et(i,e);return t&&a.organizations.some(e=>e.id===t)?{...On(i,t),session:a}:i},s=await e.json().catch(()=>({})),c=typeof s.token==`string`?await Le(o(s.token),s.token,`link`,a.user.id):void 0;if(!c)return T({error:`This link is invalid or has expired.`},400);let l=JSON.parse(c);return await t.auth.link(a.user,l.platform,l.platformUserId,{organizations:a.organizations.map(e=>e.id)})===`taken`?T({error:`That platform account is connected to someone else.`},409):T({ok:!0,...l})}async function Cr(e,t,n,r){let i=t.integrations[n.integration].auth.user,a=t.config.publicUrl,o=t.linkContext.session,s=r.searchParams.get(`installation`)??``,c=yr(t,o,s?await t.installationOrganization?.(s):void 0);if(!c)return Q(`Only members of the workspace this agent works for can link here.`,403);let l=await br(c,s);if(!l)return Q(`This installation is no longer connected.`,404);let u=await L(c,`link-oauth`,o.user.id,s);return O(i.authorizeUrl(N(t.config,l.credentials),{publicUrl:a,state:u}))}async function wr(e,t,n,r){let i=t.integrations[n.integration],a=i.auth.user,o=t.config.publicUrl,s=t.linkContext.session,c=r.searchParams.get(`state`)??``,l=yr(t,s,et(t,c)),u=l&&await Le(l,c,`link-oauth`,s.user.id),d=l&&u?await br(l,u):void 0;if(!l||!d)return Q(`This link is invalid or has expired.`,400);let f=await a.exchange(e,N(t.config,d.credentials),{publicUrl:o,fetch:t.fetch??fetch}).catch(e=>e instanceof Error?e:Error(String(e)));return f instanceof Error?Q(f.message,400):await t.auth.link(s.user,i.id,f.id,{organizations:s.organizations.map(e=>e.id),...f.token?{token:A(t.config,f.token)}:{}})===`taken`?Q(`That ${i.id} account is connected to someone else.`,409):Q(`Linked ${f.login??f.id} on ${i.id} to your Coder account. Mention the agent again to start.`)}const Tr=Y.object({installation:Y.string().check(Y.minLength(1)),integration:Y.string().check(Y.minLength(1)),token:Y.string().check(Y.minLength(1)),account:Y.optional(Y.string())});async function Er(e,t){let n;try{n=await e.json()}catch{return new Response(`Invalid JSON`,{status:400})}let r=Tr.safeParse(n);if(!r.success)return new Response(`Invalid connection`,{status:400});let{installation:i,integration:a,token:o,account:s}=r.data,c=await t.store.get(`installation`,i);if(!c||c.deletedAt)return new Response(`Unknown installation`,{status:404});let l={kind:`oauth`,token:A(t.config,o),...s?{account:s}:{}};return await Wt(t.store,`installation`,i,{connections:{...c.connections,[a]:l}}),T({ok:!0})}async function Dr(e,t,n,r){let i=await t.store.get(`app`,n);if(!i)return T({error:`Unknown app`},404);let a=t.config.publicUrl;if(!a)return T({error:`PUBLIC_URL is not set on this server`},400);let o=await L(t,`install`,t.session?.user.id??`anonymous`,i.id),s=w({tx:o,...r?{back:r}:{}});return T({url:`${a.replace(/\/$/,``)}/install/${i.integration}?app=${encodeURIComponent(i.id)}&state=${s}`})}async function Or(e,t,n,r){let i=r.searchParams.get(`agent`),a=t.serverOrganizationId,[o,s]=await Promise.all([t.store.list(`app`),a!==void 0&&a!==t.organizationId&&t.scope?t.scope(a).store.list(`app`).then(e=>e.map(({id:e,value:t})=>({id:e,value:{...t,builtin:!0}}))):[]]),c=[...o,...s];return T(c.filter(({value:e})=>!i||e.agent===i).map(({id:e,value:t})=>{let{credentials:n,...r}=t;return{id:e,value:r}}))}async function kr(e,t,n,r){let i=r.searchParams.get(`agent`),[a,o]=await Promise.all([t.store.list(`installation`),i?t.store.list(`app`):[]]),s=new Set(o.filter(({value:e})=>e.agent===i).map(({id:e})=>e));return T(a.filter(({value:e})=>!i||s.has(e.app)).map(({id:e,value:t})=>{let{token:n,connections:r,...i}=t;return{id:e,value:i}}))}function Ar(e){return T(Object.values(e.integrations).map(e=>({id:e.id,name:e.name,brand:e.brand,description:e.description,installLabel:e.installLabel??`Connect ${e.id}`,organizationApps:e.organizationApps===!0,events:Object.fromEntries(Object.entries(e.events).map(([e,{description:t,noisy:n,addressed:r}])=>[e,{description:t,...n?{noisy:n}:{},...r?{addressed:r}:{}}])),presets:e.tools.presets,repositories:!!e.repos})))}async function jr(e){let t=new Map;for(let{value:n}of await e.store.list(`installation`)){let r=e.integrations[n.integration];if(n.deletedAt||!r?.repos)continue;let i=await e.store.get(`app`,n.app);if(i)try{let a=await r.auth.token(n.token?{...n,token:N(e.config,n.token)}:n,N(e.config,i.credentials));for(let e of await r.repos.list(n,a))t.has(e)||t.set(e,{repo:e,integration:r.id})}catch{}}return T([...t.values()].sort((e,t)=>e.repo.localeCompare(t.repo)))}async function Mr(e,t){let n=(await e.store.list(`installation`)).filter(({value:t})=>!t.deletedAt&&e.integrations[t.integration]?.repos),r=new Map((await dn(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=i.token?{...i,token:N(e.config,i.token)}:i,o=await n.auth.token(r,N(e.config,a.credentials));if((await n.repos.list(r,o)).includes(t))return{contents:n,token:o,app:a,installation:i}}catch{}}}async function Nr(e,t,n){let r=await Mr(e,t);if(!r)return T({error:`No installed app can read ${t}`},400);let i=await r.contents.repos.listDir(t,ct,r.token,n).catch(()=>[]),a=await Promise.all(i.map(async i=>{let a=await r.contents.repos.readFile(t,`${ct}/${i}/agent.json`,r.token,n).catch(()=>void 0);if(a===void 0)return;let o={};try{o=JSON.parse(a)}catch{}let s=await U(e.store,i),c=s?.source===`repo`&&s.repo===t,l=c?await G(e.store,i):void 0;return{id:i,name:typeof o.name==`string`?o.name:i,...typeof o.description==`string`?{description:o.description}:{},...c?{version:s.currentVersion,...l?.source?{commit:l.source.commit}:{}}:{},...s&&!c?{taken:!0}:{}}}));return T({repo:t,agents:a.filter(Boolean)})}async function Pr(e,t,n,r){let i=r.searchParams.get(`repo`);return i?Nr(t,i,r.searchParams.get(`ref`)||`HEAD`):T({error:`repo is required`},400)}async function Fr(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 Mr(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 U(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 mt(t.store,e.contents,i.repo,n,e.token,(t.now??Date.now)(),{slugs:r});return await ze(t,o),T({imported:o.map(e=>e.agent)})}catch(e){return T({error:e instanceof Error?e.message:String(e)},400)}}async function Ir(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 Lr(e,t,n){let r=await Bt(e.store,t);return await Tn(e.store,n,t,r)?Bt(e.store,t):r}async function $(e,t){let n=(e.now??Date.now)(),r=e.local?await le(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)??{}):Lr(e,t,n)}}async function Rr(e,t,n,r){let i=n.slug;if(n.version&&Number(n.version),n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return D();let{now:a,local:o,loadCurrent:s}=await $(t,i);if(!o&&t.store.listAgentSummaries&&(await at(t.store,a),re(r)))return T(await Ur(t,r));let c=o??(t.store.listAgentSummaries?await t.store.listAgentSummaries():await wt(t.store));if(!o&&!t.store.listAgentSummaries&&await at(t.store,a,c)&&(c=await wt(t.store)),re(r))return T(await Ur(t,r,c));let l;return T(await Promise.all(c.map(async({record:e,version:n})=>{e.source===`repo`&&e.repo&&(l??=t.store.list(`app`));let r=await Ir(t,e,n,l);return{...e,definition:n?.definition,...r?{sourceUrl:r}:{}}})))}async function zr(e,t,n,r){let i=n.slug;if(n.version&&Number(n.version),n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return D();let{now:a,local:o,loadCurrent:s}=await $(t,i),c=E(r,10,50),l=ie(r),[u,d]=await Promise.all([o?s().then(e=>e.record):U(t.store,i),o?Promise.resolve(o.flatMap(({version:e})=>e?[{value:e}]:[])):t.store.listVersions?.(i,c+1,l)]);return u?T(await Wr(t,u,c,l??u.currentVersion+1,d)):T({error:`No agent named "${i}"`},404)}async function Br(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 D();let{now:o,local:s,loadCurrent:c}=await $(t,i),l=s?s.find(({version:e})=>e?.version===a)?.version:await G(t.store,i,a);return l?T(l):T({error:`No version ${a} for agent "${i}"`},404)}async function Vr(e,t,n,r){let i=n.slug;if(n.version&&Number(n.version),n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return D();let{now:a,local:o,loadCurrent:s}=await $(t,i),c=r.searchParams.get(`versions`)!==`0`,l=r.searchParams.get(`content`)!==`0`,[{record:u,version:d},f]=await Promise.all([!l&&!o&&t.store.listAgentSummaries&&!v()[i]?t.store.listAgentSummaries({slug:i}).then(e=>e[0]??{}):s(),c?o?o.flatMap(({version:e})=>e?[{value:e}]:[]):t.store.listVersions?t.store.listVersions(i):t.store.list(`agentversion`,{prefix:`${i}:`}):[]]);if(!u)return T({error:`No agent named "${i}"`},404);let p=f.map(({value:e})=>{let{systemPrompt:t,files:n,...r}=e;return r}),m=await Ir(t,u,d);return T({...u,...d?{definition:d.definition,...l&&`systemPrompt`in d?{systemPrompt:d.systemPrompt,...d.files?{files:d.files}:{}}:{}}:{},...m?{sourceUrl:m}:{},...c?{versions:p}:{}})}const Hr={builtin:`builtin`,dashboard:`upload`,repository:`repo`};async function Ur(e,t,n){let r=E(t,24,100),i=ie(t),a=t.searchParams.get(`q`)?.trim().toLowerCase(),o=Hr[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).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 v=ce(_,r,e=>e.record.id);return{...v,...c?{connectable:[...d,...p.map(e=>({...e,value:{...e.value,builtin:!0}}))].filter(({value:e})=>e.builtin&&!h.has(e.id)).map(({value:e})=>({id:e.id,integration:e.integration}))}:{},items:await Promise.all(v.items.map(async({record:t,version:n,ids:r})=>{let i=await Ir(e,t,n,u);return{...t,definition:n?.definition,...i?{sourceUrl:i}:{},platforms:r.map(e=>({id:e,state:g(t.id,e)}))}}))}}async function Wr(e,t,n,r,i){let a=r-n-2,o=(i??await e.store.list(`agentversion`,{prefix:`${t.id}:`,...a>0?{after:st(t.id,a)}:{},limit:n+1})).map(({value:e})=>{let{systemPrompt:t,files:n,definition:r,...i}=e;return i}).filter(e=>e.version<r).reverse();return ce(o,n,e=>e.version)}function Gr(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 Kr(e,t,n,r){let i=n.slug;if(n.version&&Number(n.version),n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return D();let{now:a,local:o,loadCurrent:s}=await $(t,i),c=await e.json().catch(()=>void 0);try{let e=x({[i]:c})[i];if(!e||typeof e!=`object`)throw Error(`settings must be an object`);let{record:n,version:r}=await s();if(!n||!r)throw Error(`No agent named "${i}".`);return Sn({...n,settings:void 0},r,e,t.integrations),t.local?(await xn(t,t=>{t.agents={...t.agents,[i]:e}}),await le(t.store,t.local.cwd,t.integrations),T(await U(t.store,i))):T(await ve(t.store,i,e,(t.now??Date.now)()))}catch(e){return T({error:e instanceof Error?e.message:String(e)},400)}}async function qr(e,t,n,r){let i=n.slug;if(n.version&&Number(n.version),n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return D();let{now:a,local:o,loadCurrent:s}=await $(t,i),{record:c}=await s();if(!c)return T({error:`No agent named "${i}"`},404);if(c.source===`builtin`)return T({error:`Built-in agents cannot be deleted.`},400);if(t.local&&!await $e(t.local.cwd,t.integrations,i))return T({error:`Delete .coder/agents/${i} in the repo`},409);for(let{id:e}of await t.store.list(`agentversion`,{prefix:`${i}:`}))await t.store.delete(`agentversion`,e);return await t.store.delete(`agent`,i),T({ok:!0})}async function Jr(e,t,n,r){let i=n.slug;if(n.version&&Number(n.version),n.version&&!/^\d+$/.test(r.pathname.split(`/`).at(-1)))return D();let{now:a,local:o,loadCurrent:s}=await $(t,i),c=await e.json().catch(()=>void 0);if(!c||typeof c.systemPrompt!=`string`||c.files!==void 0&&!Gr(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{b([i]);let[e]=y({definitions:{[i]:{json:c.definition,builtin:!1}},usage:void 0},t.integrations);if(!e)throw Error(`No agent named "${i}".`);let n=t.local?await U(t.store,i):void 0,r=t.local&&n?await G(t.store,i):void 0,a=c.files;t.local&&(await Ft(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 le(t.store,t.local.cwd,t.integrations));let o=t.local?void 0:await Ot(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 G(t.store,i),l=o?.unchanged??Bn(r&&{...r,createdAt:0},{...s,createdAt:0});await ze(t,[s]);let u=o?.record??await U(t.store,i);return T({...u,definition:s.definition,version:s.version,unchanged:l})}catch(e){return T({error:e instanceof Error?e.message:String(e)},400)}}async function Yr(e,t,n,r){let a=n.id,o=Number(r.searchParams.get(`after`)??-1),s=Number.isFinite(o)?o:-1;r.searchParams.has(`limit`)&&E(r,500,2e3);let c=await t.store.get(`task`,a);if(!c||t.local&&c.handle?.startsWith(`cli:`)&&c.task.flow==="default"){let n=c?.task.cwd??t.local?.cwd;if(!n||!Mt(n,a,!1))return T({error:`No task "${a}"`},404);{let t=Number(e.headers.get(`last-event-id`)??s);return Qr(e,Number.isFinite(t)?t:s,async e=>{let t=Mt(n,a);if(!t)return;let r=_(n,a),o=Math.max(t.finishedAt??0,Date.parse(r?.resumedAt??r?.createdAt??``)||0),s=P.has(t.status)&&!t.error&&t.status!==`cancelled`&&(!t.result||(Ln.statSync(q.join(i(n,a),`result.json`),{throwIfNoEntry:!1})?.mtimeMs??0)<o);return{status:t,lines:yn(n,a,e,500),pendingResult:s}})}}let l=Number(e.headers.get(`last-event-id`)??s);return Qr(e,Number.isFinite(l)?l:s,async e=>{let n=await t.store.get(`task`,a);if(!n)return;let r=n.task.runner===`github-actions`&&n.handle,i=r&&P.has(n.status)?(await(await We(t,n.task))?.status(n.handle).catch(()=>void 0))?.state===`running`:!1;return{status:n,lines:([`running`,`waiting`].includes(n.status)||r)&&n.handle?await un(t,n,e,500).catch(()=>Re(t.store,a,e,500)):await Re(t.store,a,e,500),pendingLogs:i}})}const Xr=1e3;function Zr(e){let{status:t,approval:n,answer:r,result:i,error:a,startedAt:o,finishedAt:s}=e;return{status:t,approval:n??null,answer:r,result:i,error:a,startedAt:o,finishedAt:s,turns:Ze(e).turns}}function Qr(e,t,n){let r=new TextEncoder,i=Date.now()+5e4,a=t,o=``,s=!1,c=new ReadableStream({async start(t){let c=e=>t.enqueue(r.encode(e));c(`retry: ${Xr}\n\n`);try{for(;!s&&!e.signal.aborted&&Date.now()<i;){let e=await n(a);if(!e)break;let{status:t,lines:r,pendingLogs:i,pendingResult:s}=e;for(let e of r)c(`id: ${e.seq}\nevent: log\ndata: ${JSON.stringify(e)}\n\n`),a=e.seq;let l=JSON.stringify(Zr(t)),u=i||s||P.has(t.status)&&r.length===500;if(l!==o&&!u&&(c(`event: status\ndata: ${l}\n\n`),o=l),r.length!==500){if(P.has(t.status)&&!u){c(`event: end
2
- data: {}
3
-
4
- `);break}await new Promise(e=>setTimeout(e,Xr))}}}finally{s||t.close()}},cancel(){s=!0}});return new Response(c,{headers:{"content-type":`text/event-stream; charset=utf-8`,"cache-control":`no-cache, no-transform`}})}var $r=class{options;entries=new Map;pending=new Map;constructor(e={ttlMs:6e5,max:100}){this.options=e}get size(){return this.entries.size}get inFlight(){return this.pending.size}has(e){return this.entries.has(e)}keys(){return this.entries.keys()}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;for(let[t,n]of this.entries)t!==e&&r-n.at>=this.options.ttlMs&&this.entries.delete(t);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(()=>i?.value).finally(()=>this.pending.delete(e)),this.pending.set(e,a)),a}};const ei=/^[a-z0-9][a-z0-9-]*$/,ti=new Set([`openrouter.ai`,`ai-gateway.vercel.sh`,`api.groq.com`,`api.together.xyz`]);function ni(e){return{builtin:{codex:p,claude:s},models:e.models??{}}}async function ri(e,t){let{baseUrl:n,envKey:r,key:i}=await H(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 ii(t,n,r)?await Kt(t,r):void 0,o=i||a,s=t.settings??={},c=s.probes??=new $r({ttlMs:6e5,max:100,now:t.now,accept:e=>e.reachable}),l=`${new URL(n).host}|${r??``}|${C(String(o??``))}`;return T(await c.get(l,()=>ne({baseUrl:n},{key:o,fetch:t.fetch})))}async function ii(e,t,n){let r=new URL(t).host;if(ti.has(r))return!0;let i=(await _e(e)).models??{};return Object.values(i).some(e=>`baseUrl`in e&&e.envKey===n&&new URL(e.baseUrl).host===r)}async function ai(e,t,n,r){return T(ni(await _e(t)))}async function oi(e,t,n,r){let{name:i=``,...a}=await H(e);return!ei.test(i)||u(i)?T({error:`Invalid model name "${i}"`},400):W(t,e=>{if(e.models?.[i])throw new R(`"${i}" already exists`);e.models={...e.models,[i]:a}})}async function si(e,t,n,r){let i=n.name;return W(t,e=>{if(!e.models?.[i])throw new R(`No model "${i}"`);l(e,i)})}async function ci(e,t,n,i){let a=n.name,{spec:c}=await H(e);return W(t,e=>{if(!ei.test(a))throw new R(`Invalid alias name "${a}"`);let t=e.models?.[a];if(t&&m(t))throw new R(`"${a}" is a custom model name`);let n=f(c,h(e));if(!n?.model||n.engine===`custom`)throw new R(`"${c}" does not name a codex or claude model`);let i=n.engine===`claude`?s:p,l=c.split(`:`).some(e=>r.has(e)||o.has(e));e.models={...e.models,[a]:{provider:n.engine,model:i[n.model]??n.model,...l&&n.effort?{effort:n.effort}:{}}}})}async function li(e,n,r,i){let a=r.name;return W(n,e=>{let n=e.models??={},r=n[a];r&&(m(r)||t(r))?r.disabled=!0:n[a]={disabled:!0}})}async function ui(e,n,r,i){let a=r.name;return W(n,e=>{let n=e.models??={},r=n[a];r&&(m(r)||t(r))?delete r.disabled:delete n[a]})}const di=/^[a-z0-9][a-z0-9_-]*$/i;async function fi(e,t,n,r){return T((await _e(t)).mcp??{})}async function pi(e,t,n,r){let{name:i=``,...a}=await H(e);return di.test(i)?W(t,e=>{e.mcp={...e.mcp,[i]:a}}):T({error:`Invalid server name "${i}"`},400)}async function mi(e,t,n,r){let i=n.name;return W(t,e=>{if(!e.mcp?.[i])throw new R(`No MCP server "${i}"`);delete e.mcp[i]})}const hi={npm:[`npx`,`-y`],pypi:[`uvx`],oci:[`docker`,`run`,`-i`,`--rm`]},gi=(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 _i(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]=gi([{...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 vi(e){let t=e.remotes?.find(e=>e.type===`streamable-http`||e.type===`sse`);if(t)return{type:t.type===`sse`?`sse`:`http`,url:t.url,env:[],headers:gi(t.headers)};let n=e.packages?.find(e=>hi[e.registryType]&&(e.transport?.type??`stdio`)===`stdio`);if(!n)return;let[r,...i]=hi[n.registryType],a=[],o=_i(n.runtimeArguments,`runtime`,a),s=_i(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:gi(n.environmentVariables),headers:[]}}async function yi(e,t,n){let r=n.searchParams.get(`q`)?.trim()??``,i=t.settings??={},a=await(i.registry??=new $r({ttlMs:6e5,max:100,now:t.now})).get(r,()=>bi(t,r));return a?T(a):T({error:`The MCP registry did not answer. Try again.`},502)}async function bi(e,t){let n=new URLSearchParams({version:`latest`,limit:`30`});t&&n.set(`search`,t);try{let t=await(e.fetch??fetch)(`https://registry.modelcontextprotocol.io/v0.1/servers?${n}`,{headers:{accept:`application/json`},signal:AbortSignal.timeout(2e4)});if(!t.ok)return;let{servers:r=[]}=await t.json();return r.flatMap(({server:e})=>{let t=vi(e);return t?[{name:e.name,title:e.title??e.name.split(`/`).pop()??e.name,description:e.description??``,...t}]:[]})}catch{return}}const xi=`/api/auth/callback`,Si=`/.well-known/oauth-client.json`,Ci=`/.well-known/oauth-cli-client.json`,wi=`openid profile email offline_access organizations:read`;function Ti(e,t){return{client_id:`${e}${Si}`,client_name:`Coder at ${new URL(e).host}`,redirect_uris:[`${e}${xi}`],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:wi}}function Ei(e){return{client_id:`${e}${Ci}`,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:wi}}function Di(e,t){return{resource:new URL(e).origin,authorization_servers:[t],bearer_methods_supported:[`header`],scopes_supported:wi.split(` `)}}function Oi(e){let t=T(e);return t.headers.set(`cache-control`,`public, max-age=3600`),t}function ki(e,t,n,r){return t.config.publicUrl&&t.auth?Oi(Ti(t.config.publicUrl,t.auth.jwks)):void 0}function Ai(e,t,n,r){return t.config.publicUrl&&t.auth?Oi(Ei(t.config.publicUrl)):void 0}function ji(e,t,n,r){return t.config.publicUrl&&t.auth?Oi(Di(t.config.publicUrl,t.auth.issuer)):void 0}const Mi=[z(`GET`,Si,ki,pe),z(`GET`,Ci,Ai,pe),z(`GET`,`/.well-known/oauth-protected-resource`,ji,pe),z(`GET`,`/health`,(e,t)=>Yn(t)),z(`GET`,`/`,Et,Je),z(`GET`,`/login`,en,He),...nn(`/login`,sn,He).filter(e=>e.method!==`GET`),z(`POST`,`/dash/token`,Gt,ot),...nn(`/dash`,fn,En)],Ni=[z(`GET`,`/api/auth/capabilities`,(e,t)=>T({wular:t.auth?.issuer??null})),...nn(`/api/auth`,(e,t)=>t.auth.handler(e),Tt),z(`GET`,`/me`,Qn,rn),z(`POST`,`/me/organization`,er,Ge)],Pi=[...B(`/tasks`,[z(`GET`,`/:id/messages`,gt,Cn),z(`POST`,`/:id/ack`,pt,Cn),z(`POST`,`/:id/heartbeat`,Ne,Cn),z(`POST`,`/:id/result`,Be,bn),z(`POST`,`/:id/credential`,Ae,bn),z(`GET`,`/:id`,ut,kn)]),...B(`/logins`,[z(`GET`,`/:id/input`,dr,Qt),z(`GET`,`/:id`,fr,Qt),z(`POST`,`/:id`,pr,Qt)]),...B(`/runners`,[z(`POST`,`/register`,Pt)])],Fi=[...B(`/create`,[z(`GET`,`/:id`,mr,K),z(`POST`,`/:id`,mr,K),z(`GET`,`/:id/callback`,hr,K),z(`POST`,`/:id/callback`,gr,K)]),...B(`/install`,[z(`GET`,`/:id`,_r,F),z(`POST`,`/:id`,_r,F),z(`GET`,`/:id/callback`,vr,F),z(`POST`,`/:id/callback`,vr,F)])],Ii=B(`/connect`,[z(`GET`,``,xr,ge),z(`POST`,``,Sr,ge),z(`GET`,`/:integration`,Cr,Yt),z(`GET`,`/:integration/callback`,wr,Yt)]),Li=[...B(`/hooks`,[z(`POST`,`/*`,(e,t,n)=>nt(e,t,n[`*`]),(e,t,n)=>t.integrations[n[`*`]]?t:D())]),...Fi,...Ii],Ri=[z(`GET`,`/metrics`,async(e,t)=>T(await Zn(t),200,{"cache-control":`no-store`}),Vt),z(`GET`,`/usage`,Fn),z(`GET`,`/usage/totals`,In)],zi=B(``,[z(`GET`,`/folders`,(e,t)=>T(Xe(t.local.cwd))),z(`POST`,`/folders/check`,async(e,t)=>{let n=await e.json().catch(()=>void 0);return T(we(n?.path))}),z(`POST`,`/folders/clone`,async(e,t)=>{let n=await e.json().catch(()=>void 0);return T(await xe(n?.url))}),z(`POST`,`/folders/pick`,async(e,t)=>T(await Zt()))],Se),Bi=B(``,[z(`GET`,`/engines/status`,async(e,t)=>T(await $t())),z(`POST`,`/engines/:engine/login`,Nt),z(`POST`,`/engines/:engine/logout`,Rt)],ye),Vi=[z(`POST`,`/apps/:id/install`,(e,t,n,r)=>Dr(e,t,n.id,r.searchParams.get(`back`))),z(`GET`,`/apps`,Or),z(`GET`,`/installations`,kr),z(`POST`,`/connections`,(e,t)=>Er(e,t)),z(`GET`,`/integrations`,(e,t)=>Ar(t)),z(`GET`,`/repositories`,(e,t)=>jr(t))],Hi=[z(`GET`,`/agents/import`,Pr),z(`POST`,`/agents/import`,Fr),z(`GET`,`/agents`,Rr),z(`PATCH`,`/agents/:slug/settings`,Kr),z(`GET`,`/agents/:slug/versions`,zr),z(`GET`,`/agents/:slug/versions/:version`,Br),z(`GET`,`/agents/:slug`,Vr),z(`DELETE`,`/agents/:slug`,qr,(e,t)=>Qe(t,`Only an owner or admin can delete an agent.`)),z(`PUT`,`/agents/:slug`,Jr)],Ui=[z(`GET`,`/credentials`,jt),z(`POST`,`/credentials`,pn,kt),z(`POST`,`/credentials/:label/default`,cn),z(`DELETE`,`/credentials/:label`,gn),z(`POST`,`/logins`,tr,M),z(`GET`,`/logins/:id`,nr,M),z(`POST`,`/logins/:id`,rr,M),z(`DELETE`,`/logins/:id`,ir,M)],Wi=[z(`GET`,`/runners`,tt),z(`POST`,`/runners`,vt),z(`POST`,`/runners/pair`,ue),z(`POST`,`/runners/:id/test`,xt),z(`PATCH`,`/runners/:id`,vn),z(`DELETE`,`/runners/:id`,Ct)],Gi=[z(`GET`,`/tasks`,Ue),z(`POST`,`/tasks`,Ce),z(`GET`,`/tasks/:id`,Ke),z(`DELETE`,`/tasks/:id`,Ee),z(`GET`,`/tasks/:id/logs`,Ve),z(`GET`,`/tasks/:id/stream`,Yr),z(`POST`,`/tasks/:id/steer`,Pe),z(`POST`,`/tasks/:id/ask`,Xt),z(`POST`,`/tasks/:id/continue`,qt),z(`POST`,`/tasks/:id/approve`,be),z(`POST`,`/tasks/:id/cancel`,de),z(`POST`,`/tasks/:id/archive`,Ye)],Ki=[z(`GET`,`/config`,wn),z(`PATCH`,`/config`,Dt),z(`PUT`,`/config`,it)],qi=[z(`POST`,`/models/probe`,(e,t)=>ri(e,t)),z(`GET`,`/models`,ai),z(`POST`,`/models`,oi),z(`DELETE`,`/models/:name`,si),z(`POST`,`/models/:name/alias`,ci),z(`POST`,`/models/:name/disable`,li),z(`POST`,`/models/:name/enable`,ui)],Ji=[z(`GET`,`/mcp`,fi),z(`POST`,`/mcp`,pi),z(`DELETE`,`/mcp/:name`,mi),z(`GET`,`/mcp-registry`,(e,t,n,r)=>yi(e,t,r))],Yi=[z(`GET`,`/flows`,Dn),z(`GET`,`/pulls`,me),z(`POST`,`/flows/:name/run`,je),z(`POST`,`/review`,dt)],Xi=B(`/admin`,[...Ri,...zi,...Bi,...Vi,...Hi,...Ui,...Wi,...Gi,...Ki,...qi,...Ji,...Yi]).map(e=>({...e,guard:Ut(e.guard)})),Zi=[...Pi,...Xi,...Ni,...Li,...Mi];async function Qi(e,t,n){if(!Te(e,t))return D();let r=new URL(e.url);return n.scope instanceof Response?n.scope:(t=n.scope??t,await Lt(Zi,e,t,r)??hn(e,t,r))}const $i=`x-coder-request-scope`;function ea(e,{sessions:t,cookies:n}){let r=e.auth;return r?{...e,auth:{...r,session(e,i){let a=JSON.stringify([...[`cookie`,`authorization`,`x-coder-organization`].map(t=>e.get(t)),!!i]),o=t.get(a);return o||(o=r.session(e,i).then(e=>(e?.cookies&&n.push(...e.cookies),e)),t.set(a,o)),o}}}:e}function ta(e,t,n){let r=t.requestScopes??=new Map,i=e.headers.get($i),a=n&&i?r.get(i):void 0;if(a)return{req:e,ctx:ea(t,a),end(){}};let o=new Headers(e.headers);if(o.delete($i),!t.auth)return{req:i?new Request(e,{headers:o}):e,ctx:t,end(){}};let s=zn(),c={sessions:new Map,cookies:[]};return r.set(s,c),o.set($i,s),{req:new Request(e,{headers:o}),ctx:ea(t,c),cookies:c.cookies,end:()=>r.delete(s)}}async function na(e,t,n={}){t.limits??=new _t((t.now??Date.now)()),t.limits.requests++,t.settings??={},t.dashboardHosts??=new an;let r=()=>ra(e,t,n);return t.dbProfile?t.dbProfile.request(n.inProcess===!0,r):r()}async function ra(e,t,n){let r=await ae(e,se(new URL(e.url).pathname));if(r instanceof Response)return r;let i=ta(r,t,n.inProcess===!0),a=!1;try{let r=n.clientIp??`unknown`,o=await St(i.req,i.ctx,r),s=ia(o instanceof Response?o:await Qi(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`;return e.method!==`GET`&&s.ok&&![`hooks`,`tasks`,`logins`].includes(c[1])&&mn(t),e.method!==`GET`&&s.ok&&!(l&&c.length===4&&c[2]&&c[3]===`heartbeat`)&&!(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`)&&yt(t,u&&c.length===3&&e.method===`POST`||u&&c.length===5&&!!c[3]&&c[4]===`continue`),a=!!s.body&&(s.headers.get(`content-type`)??``).includes(`text/html`),a?aa(s,i.end):s}finally{a||i.end()}}function ia(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 aa(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 oa(e={}){let t=e.env??J.env,n=An(t,e.host??`node`),r=e.runner??n.runner;if((e.host===`vercel`||t.VERCEL)&&(r===`local`||r===`local-docker`))throw new g(`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 g(`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 g(`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 g(`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?Rn(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 _n(s,{local:!!e.local});if(c.connection)try{let e=await Nn(c.connection.db);if(!e.applied)throw new g(`server`,`The database is not set up yet.`,{hint:`Create the tables: coder server migrate`});e.pending&&i.push(`database is ${e.pending} migration${e.pending===1?``:`s`} behind; run coder server migrate`)}catch(e){throw await c.close(),e}try{s.store===`memory`&&await at(c.store(c.defaultOrganizationId),Date.now());let n=c.connection&&s.auth?await(await import(`./auth-BFny--17.js`)).createAuth(c.connection.db,s):void 0,r=e.cwd??J.cwd(),l=c.store(c.defaultOrganizationId),u=Jt({kind:s.runner,workDir:s.workDir,config:s.runnerConfig,local:!(e.host===`vercel`||t.VERCEL),sandbox:{region:qe(s.databaseUrl),snapshots:{get:e=>l.get(`snapshot`,e),put:(e,t)=>l.put(`snapshot`,e,t)}}});if(!u[s.runner])throw await c.close(),new g(`invalid-option`,`Runner ${s.runner} is not configured.`,{hint:`Set RUNNER_CONFIG to JSON containing url and secret.`});let d=new an,f=new _t,p=new Map,m=new Map,h=t=>{let i=p.get(t);if(i)return i;let o=c.store(t),l={limits:f,...c.connection?{databaseHealth:async()=>{await c.connection.db.execute(Hn`select 1`)},healthRunners:async()=>{let[e]=await c.connection.db.select({total:Hn`count(*)::int`,online:Hn`count(*) filter (where ${Mn.lastSeen} > clock_timestamp() - interval '5 minutes')::int`}).from(Mn);return e??{online:0,total:0}}}:{},config:s,settings:{},organizationId:t,integrations:a,runners:u,store:o,queue:c.queue,requestScopes:m,dashboardHosts:d,dbProfile:c.connection?.profile,chatState:c.chatState,loadAgent:Oe(a,{cwd:r,config:s,store:o}),...n?{auth:n}:{},scope:h,webhookTarget:(e,t)=>c.webhookTarget(e,t),appRecord:e=>c.appRecord(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 p.set(t,l),l};globalThis.__coder={handle:e=>na(e,h(c.defaultOrganizationId),{inProcess:!0})};let _=h(c.defaultOrganizationId),v;return e.local&&(await tn(_),v=setImmediate(()=>{zt(_).catch(()=>void 0)})),{config:s,context:h,defaultContext:_,warnings:i,...o?{mintedToken:o}:{},sweep:c.sweep,close:async()=>{v&&clearImmediate(v),await _.local?.usageSync?.catch(()=>void 0),await Ht(_),await c.close()}}}catch(e){throw await c.close(),e}}var sa=e({serve:()=>da,serverHandler:()=>la});function ca(e){try{let t=new URL(e);return ln.has(t.hostname)?Number(t.port||(t.protocol===`https:`?443:80)):void 0}catch{return}}function la(e=J.env,t=e.VERCEL?`vercel`:`node`){jn();let n,r=()=>n??=oa({env:e,host:t}).catch(e=>{throw n=void 0,e});return Object.assign(async(t,n)=>{let i=await r(),a=n?e=>n(e):e=>void e.catch(()=>{}),o=e=>({...i.context(e),waitUntil:a,scope:o});return na(t,o(i.defaultContext.organizationId),{clientIp:e.VERCEL?t.headers.get(`x-forwarded-for`)?.split(`,`,1)[0]?.trim():void 0})},{scheduled:async()=>{let e=await r();await Promise.all([e.sweep(),import(`./store-DzqXS2wT.js`).then(e=>e.q).then(t=>t.renewInstallations(e.defaultContext)),Ie(e.defaultContext,!1,!0),on(e.defaultContext)])},close:async()=>{let e=n;n=void 0,await(await e)?.close()}})}async function ua(e={}){jn();let t=e.env??J.env;if(e.runner&&!fe.includes(e.runner))throw new g(`invalid-option`,`Invalid --runner value: use ${fe.join(`, `)}`);if(e.port!==void 0&&(!Number.isInteger(e.port)||e.port<1||e.port>65535))throw new g(`invalid-option`,`Invalid port: use 1 through 65535.`);let n=t.PORT&&/^\d+$/.test(t.PORT)?Number(t.PORT):void 0,r=ca(t.PUBLIC_URL),i=e.port??n??r??8787;if(!Number.isInteger(i)||i<1||i>65535)throw new g(`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 g(`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&&!ln.has(s))throw new g(`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 g(`invalid-option`,`A memory server cannot run on Vercel.`,{hint:`Set DATABASE_URL for a real deployment.`});let l,u,d=c?new Promise((e,t)=>{u=t,l=()=>{qn().then(e,t)}}):void 0,f=d?.then(()=>void 0).catch(()=>void 0),p=c?{cwd:e.cwd??J.cwd(),port:i,cacheMaintenance:f}:void 0,m=await oa({cwd:e.cwd,env:a,runner:e.runner,...p?{local:p}:{}}),h=m.defaultContext,_=()=>{m.sweep().catch(()=>{}),import(`./store-DzqXS2wT.js`).then(e=>e.q).then(e=>e.renewInstallations(h)).catch(()=>{})};_();let v=setInterval(_,36e5);v.unref();let y=setInterval(()=>{Ie(h,!1,!0).catch(()=>{}),on(h).catch(()=>{}),t.PUBLIC_URL||import(`./store-DzqXS2wT.js`).then(e=>e.q).then(e=>e.renewInstallations(h,`sync`)).catch(()=>{})},6e4);y.unref();let b=Vn.createServer(oe((e,t)=>na(e,h,{clientIp:t}),{limit:se,admit:e=>o||rt(e.socket.remoteAddress,e.url??`/`)})),x=m.config.publicUrl;r!==void 0&&r!==i&&m.warnings.push(`PUBLIC_URL points at port ${r} but the server listens on ${i}`),await new Promise((e,t)=>{b.once(`error`,t),b.listen(i,s,e)}).catch(async e=>{throw u?.(e),clearInterval(y),clearInterval(v),await m.close(),e});let S=l?setTimeout(l,0):void 0,C=!1,ee=async()=>{C||(C=!0,clearInterval(y),clearInterval(v),await new Promise((e,t)=>b.close(n=>n?t(n):e())),await f,S&&clearTimeout(S),await m.close())},te=h.auth?`Wular Auth (${h.auth.issuer})`:void 0,ne=`http://localhost:${i}`,w=Fe(h),T=w===`local`?ne:x,E=m.config.store===`memory`?m.mintedToken??t.ADMIN_TOKEN:void 0;return{address:ne,publicUrl:x,warnings:m.warnings,close:ee,runner:m.config.runner,store:m.config.store,mode:w,...d?{cacheMigration:d}:{},maxTasks:m.config.maxTasks??m.config.limits?.concurrentTasks??10,...te?{signIn:te}:{},...m.mintedToken?{mintedToken:m.mintedToken}:{},...m.config.store===`postgres`&&t.DATABASE_URL?{database:Pn(t.DATABASE_URL)}:{},...ln.has(new URL(T).hostname)?{dashboard:`${T}/dash${E?`#token=${encodeURIComponent(E)}`:``}`}:{}}}async function da(e={}){try{return await ua(e)}catch(e){if(e instanceof g)throw e;let t=e instanceof Error&&e.cause instanceof Error?`: ${e.cause.message}`:``;throw new g(`server`,`${e instanceof Error?e.message:String(e)}${t}`)}}export{wi as a,xi as i,sa as n,Si as o,la as r,da as t};
@@ -1,42 +0,0 @@
1
- import{at as e,lt as t,nt as n,tt as r}from"./store-DzqXS2wT.js";import{a as i,d as a,g as o,h as s,i as c,l,m as u,n as d,p as f,r as p,t as m}from"./schema-CU2iFkp8.js";import{i as h}from"./client-D9IoAuDD.js";import{C as g,S as _,_ as v,a as y,b as ee,c as b,d as x,f as S,h as C,i as w,l as T,n as E,o as D,p as O,r as k,s as A,u as j,v as M,w as N,x as P,y as te}from"./shared-DVtzWhUT.js";import{i as ne,t as re}from"./usage-BhqoCjvE.js";import{isDeepStrictEqual as F}from"node:util";import{and as I,asc as L,desc as ie,eq as R,gt as z,gte as B,ilike as V,inArray as H,isNull as U,lt as W,lte as G,or as K,sql as q}from"drizzle-orm";import{alias as J}from"drizzle-orm/pg-core";function ae(e,t,n){return e.db.transaction(async r=>{let[i]=await r.insert(m).values({organizationId:e.organizationId,slug:t.id,name:t.name,description:t.description??null,source:t.source,repo:t.repo??null,path:t.path??null,currentVersion:0,createdAt:A(t.createdAt),updatedAt:A(t.updatedAt)}).onConflictDoUpdate({target:[m.organizationId,m.slug],set:{slug:t.id}}).returning(),a=w(i),[o]=a.currentVersion?await r.select().from(d).where(I(R(d.agentId,i.id),R(d.version,a.currentVersion))):[],s=o&&N(o,t.id),c=!!(s&&F(s.definition,n.definition)&&s.systemPrompt===n.systemPrompt&&F(s.files,n.files)),l=c?s:{...n,version:a.currentVersion+1},u={...t,currentVersion:l.version,createdAt:a.createdAt,...a.settings?{settings:a.settings}:{},updatedAt:a.updatedAt};if(c&&F(u,a))return{record:a,version:l,unchanged:c};u={...u,updatedAt:t.updatedAt};let f=c?q``:q`with published as (
2
- insert into ${d} (agent_id, version, definition, system_prompt, files, commit, imported_from, created_at)
3
- values (${i.id}, ${l.version}, ${JSON.stringify(l.definition)}::jsonb, ${l.systemPrompt},
4
- ${l.files?JSON.stringify(l.files):null}::jsonb, ${l.commit??null}, ${l.importedFrom}, ${A(l.createdAt).toISOString()}::timestamptz)
5
- returning version
6
- )`;return await r.execute(q`${f} update ${m} set
7
- name = ${u.name}, description = ${u.description??null}, source = ${u.source},
8
- repo = ${u.repo??null}, path = ${u.path??null},
9
- current_version = ${c?q`${l.version}`:q`(select version from published)`}, updated_at = ${A(u.updatedAt).toISOString()}::timestamptz
10
- where id = ${i.id}`),{record:u,version:l,unchanged:c}})}function oe(e){let t=m;return{key:t.slug,rows:async(n,r)=>{let i=e.db.select().from(t).where(I(e.mine(t.organizationId),n)).orderBy(L(t.slug));return(await(r===void 0?i:i.limit(r))).map(e=>({id:e.slug,value:w(e)}))},put:async(n,r)=>{let i={name:r.name,description:r.description??null,source:r.source,repo:r.repo??null,path:r.path??null,currentVersion:r.currentVersion,settings:r.settings??null,createdAt:A(r.createdAt),updatedAt:A(r.updatedAt)};await e.db.insert(t).values({organizationId:e.organizationId,slug:n,...i}).onConflictDoUpdate({target:[t.organizationId,t.slug],set:i})},delete:async n=>{await e.db.delete(t).where(I(e.mine(t.organizationId),R(t.slug,n)))}}}async function Y(e,t,n){let r=t.lastIndexOf(`:`);return(await e.db.insert(d).values({agentId:await k(e,t.slice(0,r)),version:Number(t.slice(r+1)),definition:n.definition,systemPrompt:n.systemPrompt,files:n.files??null,commit:n.commit??null,importedFrom:n.importedFrom,createdAt:A(n.createdAt)}).onConflictDoNothing().returning({id:d.id})).length>0}function se(e){let t=d,n=q`${m.slug} || ':' || lpad(${t.version}::text, 6, '0')`;return{key:n,split:(e,n,r)=>I(R(m.slug,e),n===void 0?void 0:r?R(t.version,n):z(t.version,n)),rows:async(r,i)=>{let a=e.db.select({row:t,slug:m.slug,key:n}).from(t).innerJoin(m,R(m.id,t.agentId)).where(I(e.mine(m.organizationId),r)).orderBy(L(m.slug),L(t.version));return(await(i===void 0?a:a.limit(i))).map(({row:e,slug:t,key:n})=>({id:n,value:N(e,t)}))},put:async(t,n)=>{await Y(e,t,n)},delete:async n=>{let r=n.lastIndexOf(`:`),i=await k(e,n.slice(0,r)).catch(()=>void 0);i!==void 0&&await e.db.delete(t).where(I(R(t.agentId,i),R(t.version,Number(n.slice(r+1)))))}}}const X=(e,t)=>b({id:e.key,integration:e.integration,agent:e.agent,name:e.name,agentsRepo:e.agentsRepo,branch:e.branch,builtin:e.organizationId===``||void 0,credentials:O(t),createdAt:S(e.createdAt)});function ce(e){let t=y;return{key:t.key,rows:async(n,r)=>{let i=e.db.select({row:t,sealed:a}).from(t).innerJoin(a,R(a.id,t.credentialsSecretId)).where(I(e.mine(t.organizationId),n)).orderBy(L(t.key));return(await(r===void 0?i:i.limit(r))).map(({row:e,sealed:t})=>({id:e.key,value:X(e,t)}))},put:(n,r)=>e.transaction(`app:${n}`,async e=>{let[i]=await e.db.select({secretId:t.credentialsSecretId,sealed:a}).from(t).innerJoin(a,R(a.id,t.credentialsSecretId)).where(I(e.mine(t.organizationId),R(t.key,n))),o=i?.secretId??await E(e,`app`,r.credentials);i&&O(i.sealed)!==r.credentials&&await C(e,o,r.credentials);let s={integration:r.integration,platformAppId:n.slice(n.indexOf(`:`)+1),agent:r.agent,name:r.name,agentsRepo:r.agentsRepo??null,branch:r.branch??null,credentialsSecretId:o,createdAt:A(r.createdAt),updatedAt:e.at()};await e.db.insert(t).values({organizationId:e.organizationId,key:n,...s}).onConflictDoUpdate({target:[t.organizationId,t.key],set:s})}),delete:n=>e.transaction(`app:${n}`,async e=>{let[r]=await e.db.delete(t).where(I(e.mine(t.organizationId),R(t.key,n))).returning({secretId:t.credentialsSecretId});r&&await e.db.delete(a).where(R(a.id,r.secretId))})}}function Z(e,t,n){return b({id:e.key,app:t.key,integration:t.integration,account:e.account,token:n?O(n):void 0,installer:e.installer,connections:e.connections,settings:e.settings,createdAt:S(e.createdAt),deletedAt:e.deletedAt?S(e.deletedAt):void 0})}function le(e){let t=j;return{key:t.key,rows:async(n,r)=>{let i=e.db.select({row:t,app:{key:y.key,integration:y.integration},sealed:a}).from(t).innerJoin(y,R(y.id,t.appId)).leftJoin(a,R(a.id,t.tokenSecretId)).where(I(e.mine(t.organizationId),n)).orderBy(L(t.key));return(await(r===void 0?i:i.limit(r))).map(({row:e,app:t,sealed:n})=>({id:e.key,value:Z(e,t,n)}))},put:(n,r)=>e.transaction(`installation:${n}`,async e=>{let[i]=await e.db.select({secretId:t.tokenSecretId,organizationId:t.organizationId,sealed:a}).from(t).leftJoin(a,R(a.id,t.tokenSecretId)).where(R(t.key,n)),o=()=>Error(`Installation "${n}" belongs to another workspace.`);if(i&&i.organizationId!==e.organizationId)throw o();let s=i?.secretId??null;r.token&&(s?(!i?.sealed||O(i.sealed)!==r.token)&&await C(e,s,r.token):s=await E(e,`installation`,r.token));let c={appId:await D(e,r.app),platformInstallId:n.slice(r.app.length+1),account:r.account,tokenSecretId:r.token?s:null,installer:r.installer??null,connections:r.connections??null,settings:r.settings??null,createdAt:A(r.createdAt),updatedAt:e.at(),deletedAt:r.deletedAt===void 0?null:A(r.deletedAt)},[l]=await e.db.insert(t).values({organizationId:e.organizationId,key:n,...c}).onConflictDoUpdate({target:t.key,set:c,setWhere:e.mine(t.organizationId)}).returning({id:t.id});if(!l)throw o();!r.token&&i?.secretId&&await e.db.delete(a).where(R(a.id,i.secretId))}),delete:n=>e.transaction(`installation:${n}`,async e=>{let[r]=await e.db.delete(t).where(I(e.mine(t.organizationId),R(t.key,n))).returning({secretId:t.tokenSecretId});r?.secretId&&await e.db.delete(a).where(R(a.id,r.secretId))})}}async function ue(e,t){let n=J(j,`locked`),[r]=await e.db.select({row:n,app:{key:y.key,integration:y.integration},sealed:a}).from(n).innerJoin(y,R(y.id,n.appId)).leftJoin(a,R(a.id,n.tokenSecretId)).where(I(e.mine(n.organizationId),R(n.key,t))).for(`update`,{of:n});return r&&Z(r.row,r.app,r.sealed)}const Q=(e,t)=>b({iv:t.iv,tag:t.tag,ciphertext:t.ciphertext,engine:e.engine,owner:e.owner,account:e.account,isDefault:e.isDefault,createdAt:S(e.createdAt)}),de=(e,t)=>`credential:${JSON.stringify([e.organizationId,t??null])}`;async function fe(t,n){let r=i;return(await t.db.select({row:r,sealed:a}).from(r).innerJoin(a,R(a.id,r.secretId)).where(I(t.mine(r.organizationId),n?R(r.owner,n):U(r.owner))).orderBy(L(r.label)).for(`update`)).map(({row:t,sealed:n})=>({id:e(t.owner??void 0,t.label),value:Q(t,n),row:t,sealed:n}))}async function pe(e,n,r,o){let s=i;if(!o){if(!n)return;await e.db.delete(s).where(R(s.id,n.row.id)),await e.db.delete(a).where(R(a.id,n.row.secretId));return}let c=O(o),l={engine:o.engine,isDefault:o.isDefault??!1,account:o.account??null,createdAt:o.createdAt===void 0?n?.row.createdAt??e.at():A(o.createdAt),updatedAt:e.at()};if(n){O(n.sealed)!==c&&await C(e,n.row.secretId,c),await e.db.update(s).set(l).where(R(s.id,n.row.id));return}let{owner:u,label:d}=t(r);await e.db.insert(s).values({organizationId:e.organizationId,owner:u??null,label:d,secretId:await E(e,`engine`,c),...l})}function me(n){let r=i,o=(e,r)=>{let{owner:i}=t(e);return n.transaction(de(n,i),async t=>pe(t,(await fe(t,i)).find(t=>t.id===e),e,r))};return{key:q`coalesce(${r.owner} || '/', '') || ${r.label}`,rows:async(t,i)=>{let o=n.db.select({row:r,sealed:a}).from(r).innerJoin(a,R(a.id,r.secretId)).where(I(n.mine(r.organizationId),t)).orderBy(L(r.owner),L(r.label));return(await(i===void 0?o:o.limit(i))).map(({row:t,sealed:n})=>({id:e(t.owner??void 0,t.label),value:Q(t,n)}))},put:(e,t)=>o(e,t),delete:e=>o(e,null)}}function $(e,t){let n=c,r=te(e.organizationId,t),i=n.key;return{key:i,where:e=>I(e.id===void 0?q`${n.key} like ${`${T(r+(e.prefix??``))}%`}`:R(n.key,r+e.id),e.after===void 0?void 0:z(n.key,r+e.after)),rows:async(t,a)=>{let o=e.db.select({id:i,value:q`${n.value}`}).from(n).where(I(q`${n.key} like ${`${T(r)}%`}`,e.live(n.expiresAt),t)).orderBy(L(n.key));return(await(a===void 0?o:o.limit(a))).map(e=>({id:e.id.slice(r.length),value:e.value}))},put:async(i,a,o)=>{let s=t===`login`?o??e.at():o;await e.db.insert(n).values({key:r+(t===`config`?`workspace`:i),value:a,expiresAt:t===`config`?null:s}).onConflictDoUpdate({target:n.key,set:{value:a,expiresAt:t===`config`?null:t===`login`&&!o?q`${n.expiresAt}`:s}})},delete:async i=>{await e.db.delete(n).where(R(n.key,r+(t===`config`?`workspace`:i)))}}}function he(e){let t=l,n=n=>I(e.mine(t.organizationId),R(t.publicId,n));return{key:t.publicId,rows:async(n,r)=>{let i=e.db.select({row:t,sealed:a}).from(t).innerJoin(a,R(a.id,t.secretId)).where(I(e.mine(t.organizationId),n)).orderBy(L(t.publicId));return(await(r===void 0?i:i.limit(r))).map(({row:e,sealed:t})=>({id:e.publicId,value:b({name:e.name,owner:e.owner,kind:e.kind,scope:e.scope,config:e.config,createdBy:e.createdBy,default:e.isDefault,lastSeen:e.lastSeen?S(e.lastSeen):void 0,secret:O(t),createdAt:S(e.createdAt),updatedAt:S(e.updatedAt)})}))},put:(r,i)=>e.transaction(`runner:${e.organizationId}:${r}`,async e=>{let[o]=await e.db.select({id:t.id,secretId:t.secretId,sealed:a}).from(t).innerJoin(a,R(a.id,t.secretId)).where(n(r)),s={owner:i.owner??null,name:i.name,kind:i.kind,scope:i.scope,config:i.config,createdBy:i.createdBy??null,isDefault:i.default,lastSeen:i.lastSeen===void 0?null:A(i.lastSeen),updatedAt:A(i.updatedAt)};if(o){O(o.sealed)!==i.secret&&await C(e,o.secretId,i.secret),await e.db.update(t).set(s).where(R(t.id,o.id));return}await e.db.insert(t).values({organizationId:e.organizationId,publicId:r,secretId:await E(e,`runner`,i.secret),createdAt:A(i.createdAt),...s})}),delete:r=>e.transaction(`runner:${e.organizationId}:${r}`,async e=>{let[i]=await e.db.delete(t).where(n(r)).returning({secretId:t.secretId});i&&await e.db.delete(a).where(R(a.id,i.secretId))})}}function ge(e){let t=f;return{key:t.publicId,rows:async(n,r)=>{let i=e.db.select().from(t).where(I(e.mine(t.organizationId),n)).orderBy(L(t.publicId));return(await(r===void 0?i:i.limit(r))).map(e=>({id:e.publicId,value:ee(e)}))},put:async(n,r)=>{let{task:i}=r,a={source:i.source,status:r.status,agent:i.agent,flow:i.flow,runner:i.runner,permissions:i.permissions??null,appId:i.event?await D(e,i.event.appId):null,installationId:i.event?await x(e,`${i.event.appId}:${i.event.installationId}`):null,event:i.event??null,prompt:i.prompt??null,args:i.args??null,mcp:i.mcp??null,author:i.author??null,definition:i.definition,credential:i.credential??null,requester:i.requester??null,runnerId:i.runnerId??null,usage:i.usage??null,tools:i.tools,toolScopes:i.toolScopes??null,context:i.context??null,files:i.files??null,result:r.result??null,error:r.error??null,tokens:r.tokens??null,handle:r.handle??null,tokenHash:r.tokenHash??null,lastSeenAt:r.lastSeenAt===void 0?null:A(r.lastSeenAt),logCursor:r.logCursor??null,logSeq:r.logSeq??null,logBytes:r.logBytes??null,archivedAt:r.archivedAt===void 0?null:A(r.archivedAt),approval:r.approval??null,answer:r.answer??null,attempts:r.attempts,generation:r.generation??0,inboxSeq:r.inboxSeq??-1,inboxAck:r.inboxAck?.generation===(r.generation??0)?r.inboxAck.seq:-1,createdAt:A(r.createdAt),startedAt:r.startedAt===void 0?null:A(r.startedAt),finishedAt:r.finishedAt===void 0?null:A(r.finishedAt),cancelRequestedAt:r.cancelRequestedAt===void 0?null:A(r.cancelRequestedAt),updatedAt:A(r.updatedAt)};await e.db.insert(t).values({organizationId:e.organizationId,publicId:n,...a}).onConflictDoUpdate({target:[t.organizationId,t.publicId],set:{...a,archivedAt:q`coalesce(${t.archivedAt}, ${a.archivedAt})`}})},delete:async n=>{await e.db.delete(t).where(I(e.mine(t.organizationId),R(t.publicId,n)))}}}function _e(e){let t=s,n=q`${f.publicId} || ':' || lpad(${t.seq}::text, 6, '0')`;return{key:n,split:(n,r,i)=>I(e.mine(f.organizationId),R(f.publicId,n),r===void 0?void 0:i?R(t.seq,r):z(t.seq,r)),rows:async(r,i)=>{let a=e.db.select({row:t,key:n}).from(t).innerJoin(f,R(f.id,t.taskId)).where(I(e.mine(t.organizationId),r)).orderBy(L(f.publicId),L(t.seq));return(await(i===void 0?a:a.limit(i))).map(({row:e,key:t})=>({id:t,value:{at:S(e.at),level:e.level,line:e.line}}))},put:async(n,r)=>{let i=n.lastIndexOf(`:`),a={at:A(r.at),level:r.level,line:r.line};await e.db.insert(t).values({organizationId:e.organizationId,taskId:await P(e,n.slice(0,i)),seq:Number(n.slice(i+1)),...a}).onConflictDoUpdate({target:[t.taskId,t.seq],set:a})},delete:async n=>{let r=n.lastIndexOf(`:`),i=await P(e,n.slice(0,r)).catch(()=>void 0);i!==void 0&&await e.db.delete(t).where(I(R(t.taskId,i),R(t.seq,Number(n.slice(r+1)))))}}}function ve(e){let t=u,n=q`${f.publicId} || ':' || lpad(${t.seq}::text, 8, '0')`;return{key:n,split:(n,r,i)=>I(e.mine(f.organizationId),R(f.publicId,n),r===void 0?void 0:i?R(t.seq,r):z(t.seq,r)),rows:async(r,i)=>{let a=e.db.select({row:t,key:n}).from(t).innerJoin(f,R(f.id,t.taskId)).where(I(e.mine(t.organizationId),r)).orderBy(L(f.publicId),L(t.seq));return(await(i===void 0?a:a.limit(i))).map(({row:e,key:t})=>({id:t,value:{seq:e.seq,generation:e.generation,at:S(e.at),kind:e.kind,value:e.value}}))},put:async(n,r)=>{let i=n.lastIndexOf(`:`);await e.db.insert(t).values({organizationId:e.organizationId,taskId:await P(e,n.slice(0,i)),seq:r.seq,generation:r.generation,kind:r.kind,value:r.value,at:A(r.at)})},delete:async n=>{let r=n.lastIndexOf(`:`),i=await P(e,n.slice(0,r)).catch(()=>void 0);i!==void 0&&await e.db.delete(t).where(I(R(t.taskId,i),R(t.seq,Number(n.slice(r+1)))))}}}function ye(e){let t=o;return{key:f.publicId,rows:async(n,r)=>{let i=e.db.select({row:t,taskId:f.publicId,installationId:j.key}).from(t).innerJoin(f,R(f.id,t.taskId)).leftJoin(j,R(j.id,t.installationId)).where(I(e.mine(t.organizationId),n)).orderBy(L(f.publicId));return(await(r===void 0?i:i.limit(r))).map(({row:e,taskId:t,installationId:n})=>({id:t,value:b({installationId:n,taskId:t,agent:e.agent,target:e.target,engine:e.engine,model:e.model,credential:e.credential,runnerElapsedMs:e.runnerMs,tokens:e.tokens,at:S(e.at)})}))},put:async(n,r)=>{let i=await P(e,n),a={installationId:r.installationId?await x(e,r.installationId):null,agent:r.agent,target:r.target,engine:r.engine??null,model:r.model??null,credential:r.credential,runnerMs:r.runnerElapsedMs,tokens:r.tokens??null,at:A(r.at),updatedAt:e.at()};await e.db.insert(t).values({organizationId:e.organizationId,taskId:i,...a}).onConflictDoUpdate({target:t.taskId,set:a})},delete:async n=>{let r=await P(e,n).catch(()=>void 0);r!==void 0&&await e.db.delete(t).where(R(t.taskId,r))}}}var be=class u{db;organizationId;now;encryption;publishAgent=(e,t)=>ae(this,e,t);kinds;constructor(e,t,n=Date.now,r={}){this.db=e,this.organizationId=t,this.now=n,this.encryption=r,this.kinds={agent:oe(this),agentversion:se(this),app:ce(this),installation:le(this),credential:me(this),task:ge(this),tasklog:_e(this),inbox:ve(this),usage:ye(this),delivery:$(this,`delivery`),note:$(this,`note`),login:$(this,`login`),config:$(this,`config`),runner:he(this),snapshot:$(this,`snapshot`)}}static async webhookTarget(e,t,n){let r=J(a,`installation_secret`),[i]=await h(e,()=>e.select({app:y,credentials:a,installation:j,token:r}).from(y).innerJoin(a,R(a.id,y.credentialsSecretId)).leftJoin(j,I(R(j.appId,y.id),R(j.key,n??``),U(j.deletedAt))).leftJoin(r,R(r.id,j.tokenSecretId)).where(I(R(y.integration,t.slice(0,t.indexOf(`:`))),R(y.platformAppId,t.slice(t.indexOf(`:`)+1)))));return i&&{organizationId:i.app.organizationId,app:X(i.app,i.credentials),...i.installation?{bound:{organizationId:i.installation.organizationId,installation:Z(i.installation,i.app,i.token)}}:{}}}static async appRecord(e,t){let[n]=await h(e,()=>e.select({row:y,sealed:a}).from(y).innerJoin(a,R(a.id,y.credentialsSecretId)).where(I(R(y.integration,t.slice(0,t.indexOf(`:`))),R(y.platformAppId,t.slice(t.indexOf(`:`)+1)))));return n&&{organizationId:n.row.organizationId,app:X(n.row,n.sealed)}}static async installationOrganization(e,t){let[n]=await h(e,()=>e.select({organizationId:j.organizationId}).from(j).where(R(j.key,t)));return n?.organizationId}static async installations(e,t){return h(e,()=>e.select({key:j.key,organizationId:j.organizationId}).from(j).where(I(q`${j.key} like ${`${T(t)}:%`}`,U(j.deletedAt))))}static async taskOrganization(e,t,n){let[r]=await h(e,()=>e.select({organizationId:f.organizationId}).from(f).where(I(R(f.publicId,t),R(f.tokenHash,n))));return r?.organizationId}async getApps(e){return e.length?(await h(this.db,()=>this.db.select({row:y,sealed:a}).from(y).innerJoin(a,R(a.id,y.credentialsSecretId)).where(I(H(y.organizationId,[this.organizationId,``]),H(y.key,e))))).map(e=>({id:e.row.key,value:X(e.row,e.sealed)})):[]}async listCredentials(t){let n=i;return(await h(this.db,()=>this.db.select({row:n,sealed:a}).from(n).innerJoin(a,R(a.id,n.secretId)).where(I(this.mine(n.organizationId),t.owner?K(U(n.owner),R(n.owner,t.owner)):U(n.owner),t.engine?R(n.engine,t.engine):void 0)).orderBy(L(n.owner),L(n.label)))).map(({row:t,sealed:n})=>({id:e(t.owner??void 0,t.label),value:Q(t,n)}))}async updateMetadata(e,t,n){let r=e===`app`?y:e===`installation`?j:l,i=e===`app`?[`name`,`agentsRepo`,`branch`]:e===`installation`?[`account`,`connections`,`settings`,`deletedAt`]:[`name`,`config`,`lastSeen`,`updatedAt`];if(Object.keys(n).some(e=>!i.includes(e)))throw Error(`Invalid metadata fields`);let a=Object.fromEntries(Object.entries(n).map(([e,t])=>[e,t===void 0?null:[`deletedAt`,`updatedAt`,`lastSeen`].includes(e)?A(t):t])),o=e===`runner`?l.publicId:e===`app`?y.key:j.key,[s]=await this.db.update(r).set({...a,updatedAt:typeof n.updatedAt==`number`?A(n.updatedAt):this.at()}).where(I(this.mine(r.organizationId),R(o,t))).returning({id:r.id});return!!s}withAppLock(e,t){return this.transaction(`app:${e}`,t)}withConfigLock(e){return this.db.transaction(async t=>{let n=M(this.organizationId,`config`,`workspace`);return await t.insert(c).values({key:n,value:{},expiresAt:null}).onConflictDoNothing(),await t.select({key:c.key}).from(c).where(R(c.key,n)).for(`update`),e(new u(t,this.organizationId,this.now,this.encryption))})}transaction(e,t){return this.db.transaction(async n=>(await n.execute(q`select pg_advisory_xact_lock(3, hashtext(${e}))`),t(new u(n,this.organizationId,this.now,this.encryption))))}withCredential(e,n,i){if(e===`runner`)return this.withAppLock(`runners:${this.organizationId}`,e=>r(e,`runner`,n,i));if(e===`installation`)return this.transaction(`installation:${n}`,async e=>{let t=await ue(e,n),r=await i(t,t?[{id:n,value:t}]:[],e);for(let t of r??[])t.value===null?await e.delete(`installation`,t.id):await e.put(`installation`,t.id,t.value);return!!r?.length});let{owner:a}=t(n);return this.transaction(de(this,a),async e=>{let t=await fe(e,a),r=t.map(({id:e,value:t})=>({id:e,value:t})),o=await i(r.find(e=>e.id===n)?.value,r,e);for(let n of o??[])await pe(e,t.find(e=>e.id===n.id),n.id,n.value);return!!o?.length})}at(){return A(this.now())}live(e){return K(U(e),z(e,this.at()))}mine(e){return R(e,this.organizationId)}async get(e,t){let n=this.kinds[e],r=v(t),i=n.where?n.where({id:t}):n.split&&r?n.split(r[0],r[1],!0):q`${n.key} = ${t}`,a=(await h(this.db,async()=>await n.rows(i,1)))[0]?.value;return a||e!==`app`||this.organizationId===``?a:new u(this.db,``,this.now,this.encryption).get(e,t)}async patchLogin(e,t,n={}){let[r]=await this.db.update(c).set({value:q`jsonb_strip_nulls(${c.value} || ${JSON.stringify(t)}::jsonb)`}).where(I(R(c.key,M(this.organizationId,`login`,e)),this.live(c.expiresAt),q`(${c.value}->>'expiresAt')::bigint > ${this.now()}`,...Object.entries(n).map(([e,t])=>Array.isArray(t)?H(q`${c.value}->>${e}`,t):q`${c.value}->>${e} = ${t}`))).returning({value:q`${c.value}`});return r?.value}completeLogin(e,t,r,i){return n(this,e,t,r,i)}async taskInputs(t,n,r){let a=q`coalesce(${r??null}, ${m.settings}->>'engine', ${d.definition}->>'engine')`,o=this.db.select({owner:i.owner,label:i.label}).from(i).where(I(this.mine(i.organizationId),n?K(U(i.owner),R(i.owner,n)):U(i.owner),q`(${a} is null or ${i.engine} = ${a})`)).orderBy(q`${i.owner} is not null desc`,ie(i.isDefault),L(i.label)).limit(1).as(`selected_credential`),[s]=await h(this.db,()=>this.db.select({record:m,version:d,credentialLabel:o.label,credentialOwner:o.owner}).from(m).leftJoin(d,I(R(d.agentId,m.id),R(d.version,m.currentVersion))).leftJoinLateral(o,q`true`).where(I(this.mine(m.organizationId),R(m.slug,t))));return s?{record:w(s.record),...s.version?{version:N(s.version,s.record.slug)}:{},...s.credentialLabel?{credential:e(s.credentialOwner??void 0,s.credentialLabel)}:{}}:{}}async listAgentsWithVersions(e){return(await h(this.db,()=>this.db.select({record:m,version:d}).from(m).leftJoin(d,I(R(d.agentId,m.id),R(d.version,m.currentVersion))).where(I(this.mine(m.organizationId),e===void 0?void 0:R(m.slug,e))).orderBy(L(m.slug)))).map(({record:e,version:t})=>({record:w(e),...t?{version:N(t,e.slug)}:{}}))}async listAgentSummaries(e={}){let t=e.q?`%${T(e.q)}%`:void 0,n=this.db.select({record:m,version:_}).from(m).leftJoin(d,I(R(d.agentId,m.id),R(d.version,m.currentVersion))).where(I(this.mine(m.organizationId),e.slug===void 0?void 0:R(m.slug,e.slug),e.after?z(m.slug,e.after):void 0,e.source?R(m.source,e.source):void 0,t?K(V(m.slug,t),V(m.name,t),V(m.description,t),V(m.repo,t)):void 0,e.platform?q`${d.definition}->'integrations' ? ${e.platform}`:void 0)).orderBy(L(m.slug));return(await h(this.db,()=>e.limit===void 0?n:n.limit(e.limit))).map(({record:e,version:t})=>({record:w(e),...t?{version:g(t,e.slug)}:{}}))}async listVersions(e,t,n){let r=this.db.select({version:_}).from(d).innerJoin(m,R(m.id,d.agentId)).where(I(this.mine(m.organizationId),R(m.slug,e),n===void 0?t===void 0?void 0:G(d.version,m.currentVersion):W(d.version,n),t===void 0?void 0:B(d.version,n===void 0?q`${m.currentVersion} + 1 - ${t}`:n-t))).orderBy(L(d.version));return(await h(this.db,()=>r)).map(({version:t})=>({id:`${e}:${String(t.version).padStart(6,`0`)}`,value:g(t,e)}))}async put(e,t,n,r={}){let i=r.ttlMs===void 0?null:A(this.now()+r.ttlMs);await this.kinds[e].put(t,n,i)}async putMany(e,t){if(!t.length)return;if(e!==`tasklog`){await Promise.all(t.map(t=>this.put(e,t.id,t.value)));return}let n=t[0].id.lastIndexOf(`:`),r=t[0].id.slice(0,n),i=t.map(e=>{let t=e.id.lastIndexOf(`:`),n=e.value;if(e.id.slice(0,t)!==r)throw Error(`A log batch must belong to one task`);return{organizationId:this.organizationId,taskId:q`(select ${f.id} from ${f} where ${f.organizationId} = ${this.organizationId} and ${f.publicId} = ${r})`,seq:Number(e.id.slice(t+1)),at:A(n.at),level:n.level,line:n.line}});await this.db.insert(s).values(i).onConflictDoUpdate({target:[s.taskId,s.seq],set:{at:q`excluded.at`,level:q`excluded.level`,line:q`excluded.line`}})}async list(e,t={}){let n=this.kinds[e];if(n.where)return h(this.db,async()=>await n.rows(n.where(t),t.limit));let r=t.prefix?.endsWith(`:`)?t.prefix.slice(0,-1):void 0,i=t.after===void 0?void 0:v(t.after);if(n.split&&r&&!r.includes(`:`)&&(t.after===void 0||i?.[0]===r))return h(this.db,async()=>await n.rows(n.split(r,i?.[1]),t.limit));let a=t.prefix?q`${n.key} like ${`${T(t.prefix)}%`}`:void 0,o=t.after?q`${n.key} > ${t.after}`:void 0,s=a&&o?I(a,o):a??o;return h(this.db,async()=>await n.rows(s,t.limit))}async delete(e,t){await this.kinds[e].delete(t)}async create(e,t,n,r={}){if(e===`agentversion`)return Y(this,t,n);if(e!==`delivery`)throw Error(`Atomic create is not supported for ${e}`);let i=r.ttlMs===void 0?null:A(this.now()+r.ttlMs);return(await this.db.insert(c).values({key:M(this.organizationId,e,t),value:n,expiresAt:i}).onConflictDoUpdate({target:c.key,set:{value:n,expiresAt:i},setWhere:G(c.expiresAt,this.at())}).returning({key:c.key})).length>0}async claimDeliveryLease(e,t,n){let r=q`clock_timestamp() + ${n}::int * interval '1 millisecond'`,[i]=await this.db.insert(c).values({key:M(this.organizationId,`delivery`,e),value:{owner:t,failures:0},expiresAt:r}).onConflictDoUpdate({target:c.key,set:{value:q`${c.value} || ${JSON.stringify({owner:t})}::jsonb`,expiresAt:r},setWhere:q`${c.expiresAt} <= clock_timestamp()`}).returning({value:c.value});return i?i.value.failures:void 0}async updateDeliveryLease(e,t,n,r={ttlMs:3e4}){let i=I(R(c.key,M(this.organizationId,`delivery`,e)),q`${c.value}->>'owner' = ${t} and ${c.expiresAt} > clock_timestamp()`),a=q`clock_timestamp() + ${r.ttlMs}::int * interval '1 millisecond'`;return(n===void 0?await this.db.delete(c).where(i).returning({key:c.key}):await this.db.update(c).set({value:n.next===void 0?n:q`${JSON.stringify(n)}::jsonb || jsonb_build_object('next', floor(extract(epoch from (${a})) * 1000))`,expiresAt:a}).where(i).returning({key:c.key})).length>0}async updateDelivery(e,t,n,r={}){let i=I(R(c.key,M(this.organizationId,`delivery`,e)),q`${c.value}->>'owner' = ${t}`,this.live(c.expiresAt));return(n===void 0?await this.db.delete(c).where(i).returning({key:c.key}):await this.db.update(c).set({value:n,expiresAt:r.ttlMs===void 0?null:A(this.now()+r.ttlMs)}).where(i).returning({key:c.key})).length>0}async take(e,t){return e===`delivery`?(await this.db.delete(c).where(I(R(c.key,M(this.organizationId,e,t)),this.live(c.expiresAt))).returning({key:c.key})).length>0:await this.get(e,t)!==void 0&&(await this.delete(e,t),!0)}async usageTotals(e){let t=o,n=e.by===`agent`?q`${t.agent}`:e.by===`engine`?q`coalesce(${t.engine}, 'unknown')`:e.by===`installation`?q`coalesce(${j.key}, 'none')`:q`to_char(${t.at} at time zone ${ne(e.tz)}, 'YYYY-MM-DD')`,r=I(this.mine(t.organizationId),B(t.at,A(e.since)),e.until===void 0?void 0:W(t.at,A(e.until)),e.agent?R(t.agent,e.agent):void 0),i=q`coalesce(
11
- case when jsonb_typeof(${t.tokens} -> 'total') = 'number' then (${t.tokens} ->> 'total')::numeric end,
12
- (select sum((v #>> '{}')::numeric)
13
- from jsonb_path_query(coalesce(${t.tokens}, 'null'::jsonb), 'strict $.**') v
14
- where jsonb_typeof(v) = 'number')
15
- )`,a={tasks:q`count(*)`,runnerMs:q`coalesce(sum(${t.runnerMs}), 0)`,tokenCount:q`coalesce(sum(${i}), 0)`},s=e.top?q`case when ${t.agent} in (
16
- select ${t.agent} from ${t} where ${r} group by ${t.agent}
17
- order by ${a[e.top.by]} desc, ${t.agent} limit ${e.top.count}
18
- ) then ${t.agent} end`:e.parts?.length?q`case when ${H(t.agent,e.parts)} then ${t.agent} end`:q`null::text`,c=e.by===`installation`?q`left join ${j} on ${j.id} = ${t.installationId}`:q``,l=await h(this.db,()=>this.db.execute(q`
19
- select ${n} as key, ${s} as part, ${a.tasks}::int as tasks,
20
- ${a.runnerMs}::float8 as runner_ms,
21
- ${a.tokenCount}::float8 as token_count
22
- from ${t} ${c}
23
- where ${r}
24
- group by 1, 2
25
- `)),u=Array.isArray(l)?l:l.rows,d=new Map;for(let e of u){let t={tasks:Number(e.tasks),runnerMs:Number(e.runner_ms),tokenCount:Number(e.token_count)},n=d.get(e.key)??{key:e.key,tasks:0,runnerMs:0,tokenCount:0};re(n,t),e.part&&((n.parts??={})[e.part]=t),d.set(e.key,n)}return[...d.values()].sort((e,t)=>e.key.localeCompare(t.key))}async sweep(e=1e3){if(!Number.isInteger(e)||e<1)throw Error(`Sweep batch must be positive`);let t=this.at().toISOString();await this.db.execute(q`
26
- with expired_state as (
27
- delete from ${c} where expires_at <= clock_timestamp() and key in (
28
- select key from ${c} where expires_at <= clock_timestamp() order by expires_at limit ${e}
29
- )
30
- ), lists as (
31
- select expired.key from ${p} as expired
32
- where expired.key like 'k:%' and expired.expires_at <= ${t}::timestamptz
33
- and not exists (select 1 from ${p} as newer where newer.key = expired.key and newer.seq > expired.seq)
34
- order by expired.expires_at limit ${e}
35
- ), expired_items as (
36
- select key, seq from ${p} where key in (select key from lists) order by seq limit ${e}
37
- ), expired_queue as (
38
- select key, seq from ${p} where key like 'q:%' and expires_at <= ${t}::timestamptz order by expires_at limit ${e}
39
- )
40
- delete from ${p} where (key, seq) in (
41
- select key, seq from expired_items union all select key, seq from expired_queue
42
- )`)}};export{be as DrizzleStore};