@wular/coder 0.4.2 → 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 (320) hide show
  1. package/dist/actions-FzDNxMFf.js +20 -0
  2. package/dist/{adapter-BKVzTDnn.js → adapter-7SEiVsmp.js} +1 -1
  3. package/dist/{adapter-B0oYCI0S.js → adapter-BLEfUqoQ.js} +1 -1
  4. package/dist/{adapter-DPInwbJG.js → adapter-H4GlcKQz.js} +1 -1
  5. package/dist/{add-DRsPpQFl.js → add-B50dIJGd.js} +1 -1
  6. package/dist/{add-DkpUwhtO.js → add-D7X3gxap.js} +1 -1
  7. package/dist/{add-C2y-mVzl.js → add-DOEUHIe7.js} +1 -1
  8. package/dist/{add-CLYTF_up.js → add-QExQhTzi.js} +1 -1
  9. package/dist/{add-json-5uPnWPoD.js → add-json-Ck4KIZrT.js} +1 -1
  10. package/dist/{agent-r5mMcehf.js → agent-BPtnEf1q.js} +1 -1
  11. package/dist/{agent-hw3zKw8y.js → agent-BlQ_dNNm.js} +2 -2
  12. package/dist/{alias-_0Rwf2cA.js → alias-BwQBovke.js} +1 -1
  13. package/dist/{app-oE8G1-bi.js → app-y6BYm2eH.js} +1 -1
  14. package/dist/{approvals-DbVrsxec.js → approvals-Cc9cq5T1.js} +2 -2
  15. package/dist/{approve-DeAhFL-m.js → approve-oO9k2fnK.js} +2 -2
  16. package/dist/{apps-eujHiNca.js → apps-CU2YalX8.js} +1 -1
  17. package/dist/{archive-BCUfymIB.js → archive-C5c_HQS1.js} +2 -2
  18. package/dist/{archive-DZ6vpMHb.js → archive-CemlWlVY.js} +2 -2
  19. package/dist/archive-sweep-ehg-fWIt.js +1 -0
  20. package/dist/{args-BOEEdpWk.js → args-DcBCtXhz.js} +1 -1
  21. package/dist/{ask-BU2WVxVM.js → ask-Chu7Twu_.js} +2 -2
  22. package/dist/auth-BOyXPOtu.js +1 -0
  23. package/dist/auth-XbqKSbcD.js +1 -0
  24. package/dist/{chat-bridge-BS9WtP3X.js → chat-bridge-DXgZItGP.js} +1 -1
  25. package/dist/{chat-B_yhNTo0.js → chat-cknlIhVh.js} +1 -1
  26. package/dist/{cli-DWCR7iqa.js → cli-B1ObVrL4.js} +5 -5
  27. package/dist/cli.d.ts +1 -1
  28. package/dist/cli.js +1 -1
  29. package/dist/{client-D9IoAuDD.js → client-31YzOj-i.js} +1 -1
  30. package/dist/{config-12pK4qW7.js → config-DAE_qHYA.js} +1 -1
  31. package/dist/{create-D3f6q0Yq.js → create-CM8B8JxD.js} +1 -1
  32. package/dist/credentials-BXD4Qptk.js +1 -0
  33. package/dist/dash/manifest.json +949 -915
  34. package/dist/dash/public/assets/chunks/{agent-pills-dd0b7643e125bbf1.js → agent-pills-b6a6da91c9559d9f.js} +1 -1
  35. package/dist/dash/public/assets/chunks/{agent-settings-form-45ae6aeaaed2b568.js → agent-settings-form-b615c677046cd6f2.js} +1 -1
  36. package/dist/dash/public/assets/chunks/agents-grid-f2e7b4ff9e11b6e3.js +1 -0
  37. package/dist/dash/public/assets/chunks/{badge-676b01e0c615bf7b.js → badge-215c7b2631dafc69.js} +1 -1
  38. package/dist/dash/public/assets/chunks/{card-e0901d68b79dfa93.js → card-e86dcc81326d2b14.js} +1 -1
  39. package/dist/dash/public/assets/chunks/{combo-952a457d52360d88.js → combo-09e246dc9a517fa8.js} +1 -1
  40. package/dist/dash/public/assets/chunks/composer-417166b029f48c47.js +1 -0
  41. package/dist/dash/public/assets/chunks/composer-645ae8fa97a35280.js +1 -0
  42. package/dist/dash/public/assets/chunks/{confirm-f2fe4ba9905a89c6.js → confirm-5ae484241ad888fd.js} +1 -1
  43. package/dist/dash/public/assets/chunks/{connect-apps-661f3b3a85f1776a.js → connect-apps-4147c45f45fde2b1.js} +1 -1
  44. package/dist/dash/public/assets/chunks/{connect-repositories-5389ec8701a3deac.js → connect-repositories-77591110836bdf03.js} +1 -1
  45. package/dist/dash/public/assets/chunks/credentials-list-e005a0783ec93465.js +2 -0
  46. package/dist/dash/public/assets/chunks/{custom-range-03ba6fb2ade7d282.js → custom-range-463e119af4681c61.js} +1 -1
  47. package/dist/dash/public/assets/chunks/{editor-34cb529d6d8a4b09.js → editor-804b84f4fe6539cd.js} +4 -4
  48. package/dist/dash/public/assets/chunks/{engines-list-2f1acee3ecc8461a.js → engines-list-ceab51f13c690e8c.js} +1 -1
  49. package/dist/dash/public/assets/chunks/{field-901f1f35c18c39c9.js → field-aa0a4b98a976781e.js} +1 -1
  50. package/dist/dash/public/assets/chunks/filter-91144ac2eec6297f.js +1 -0
  51. package/dist/dash/public/assets/chunks/format-105c706345987fb2.js +1 -0
  52. package/dist/dash/public/assets/chunks/heads-a42817b32d2d7f08.js +1 -0
  53. package/dist/dash/public/assets/chunks/{instructions-052fa45a9daf6db6.js → instructions-3a1dcaff2d868aa5.js} +1 -1
  54. package/dist/dash/public/assets/chunks/instructions-6c6f981fffaa31e4.js +1 -0
  55. package/dist/dash/public/assets/chunks/{list-87b359bebd26986a.js → list-7270361464fc3c04.js} +1 -1
  56. package/dist/dash/public/assets/chunks/{mcp-list-b42f0d2ee463b37d.js → mcp-list-2e715d48666b54ad.js} +1 -1
  57. package/dist/dash/public/assets/chunks/{models-list-0669d26fd662aec3.js → models-list-d3c40f94c761a6e5.js} +1 -1
  58. package/dist/dash/public/assets/chunks/paged-3ddb6077bef42752.js +1 -0
  59. package/dist/dash/public/assets/chunks/{platform-actions-c92ca3c6198a9387.js → platform-actions-271ec3b99a64280b.js} +1 -1
  60. package/dist/dash/public/assets/chunks/runners-list-767e49c7d0ec833a.js +1 -0
  61. package/dist/dash/public/assets/chunks/{segmented-358ff2b4992b8384.js → segmented-de4386ccaac7304d.js} +1 -1
  62. package/dist/dash/public/assets/chunks/{select-1013702bdfb1ade4.js → select-a90307706cffa6e0.js} +1 -1
  63. package/dist/dash/public/assets/chunks/{sentinel-c972a33dc69a5135.js → sentinel-b5e032b38604dfd3.js} +1 -1
  64. package/dist/dash/public/assets/chunks/shared-init-7f81ae7bc8c82438.js +2 -0
  65. package/dist/dash/public/assets/chunks/shared-init-933c7f9ee85be766.js +5 -0
  66. package/dist/dash/public/assets/chunks/{tail-7c27aab8ba268bd9.js → tail-4891e727ee526792.js} +1 -1
  67. package/dist/dash/public/assets/chunks/task-actions-ce854925a2dc78fd.js +1 -0
  68. package/dist/dash/public/assets/chunks/task-ddfddeaf07fb684c.js +1 -0
  69. package/dist/dash/public/assets/chunks/task-view-c37dcee08f21a279.js +5 -0
  70. package/dist/dash/public/assets/chunks/tasks-list-baef587999f322d8.js +1 -0
  71. package/dist/dash/public/assets/chunks/{toolbar-f964fa864699f095.js → toolbar-8d98313606ad8a2d.js} +1 -1
  72. package/dist/dash/public/assets/chunks/{versions-list-fc2e0d2a7382e049.js → versions-list-532690efd9f1b0ea.js} +1 -1
  73. package/dist/dash/public/assets/{dash-account-96fc41be318839fa.css → dash-account-edc56e85dbaaabe0.css} +1 -1
  74. package/dist/dash/public/assets/dash-agents-edba57b67e4005d0.css +1 -0
  75. package/dist/dash/public/assets/dash-agents-new-fe22253fbada2fbf.css +1 -0
  76. package/dist/dash/public/assets/dash-agents-param-slug-adf52e9dacb2d825.css +1 -0
  77. package/dist/dash/public/assets/dash-agents-param-slug-edit-a2937a347689ef29.css +1 -0
  78. package/dist/dash/public/assets/dash-agents-param-slug-platforms-265ba13db32a460d.css +1 -0
  79. package/dist/dash/public/assets/dash-agents-param-slug-settings-8afc52eb0372bc4b.css +1 -0
  80. package/dist/dash/public/assets/dash-agents-param-slug-tasks-6193e646be68dbd2.css +1 -0
  81. package/dist/dash/public/assets/dash-agents-param-slug-usage-ceadb3a1c911c402.css +1 -0
  82. package/dist/dash/public/assets/{dash-settings-53b8e6a8f656fa1a.css → dash-settings-cf1997cd7f72e518.css} +1 -1
  83. package/dist/dash/public/assets/dash-settings-param-tab-b44dac8e79a560e6.css +1 -0
  84. package/dist/dash/public/assets/dash-tasks-916c7100a8058aa3.css +1 -0
  85. package/dist/dash/public/assets/dash-tasks-param-id-194a6ffc20e872f2.css +1 -0
  86. package/dist/dash/public/assets/{dash-usage-884943221f76ad93.css → dash-usage-40940b289f85e0b6.css} +1 -1
  87. package/dist/dash/public/assets/pnext-client-13aee92bef5c9e3f.js +1 -0
  88. package/dist/dash/public/assets/pnext-client-1f2686b2044f0df6.js +1 -0
  89. package/dist/dash/public/assets/pnext-client-26130234ebad7067.js +1 -0
  90. package/dist/dash/public/assets/pnext-client-311e35b0076bf406.js +1 -0
  91. package/dist/dash/public/assets/pnext-client-4ade1bf75c9c3d87.js +1 -0
  92. package/dist/dash/public/assets/pnext-client-61cd31b687ede1da.js +1 -0
  93. package/dist/dash/public/assets/{pnext-client-2693db10b197ade1.js → pnext-client-61db65dc4223217a.js} +1 -1
  94. package/dist/dash/public/assets/pnext-client-6ea656e7705e3f2a.js +1 -0
  95. package/dist/dash/public/assets/pnext-client-7fd0f793f0322cb9.js +1 -0
  96. package/dist/dash/public/assets/pnext-client-88159c0840fcfa4a.js +1 -0
  97. package/dist/dash/public/assets/pnext-client-b03f0c47c066b4f3.js +1 -0
  98. package/dist/dash/public/assets/{pnext-client-1afa4148bea69ad2.js → pnext-client-d6478835f543f901.js} +1 -1
  99. package/dist/dash/public/assets/pnext-client-dadb8359021ed590.js +1 -0
  100. package/dist/dash/public/assets/pnext-client-de07532d6aaebf2c.js +1 -0
  101. package/dist/dash/public/assets/pnext-client-f87a31890c8ff224.js +1 -0
  102. package/dist/dash/public/assets/pnext-client-ffe1c123a8e2a350.js +1 -0
  103. package/dist/{default-CwQXCtoB.js → default-BMvUMTFp.js} +1 -1
  104. package/dist/default-B_nKaX0-.js +1 -0
  105. package/dist/{delete-cS01oOIb.js → delete-Bjteibld.js} +2 -2
  106. package/dist/{delete-BD6AnCLg.js → delete-riCIKZwj.js} +2 -2
  107. package/dist/{disable-BMWWeYFQ.js → disable-DQC56YFy.js} +1 -1
  108. package/dist/{discover-Dvr_3_Xr.js → discover-Qanr5TEO.js} +1 -1
  109. package/dist/{discover-Cfx5RPU7.js → discover-lgTYwoQp.js} +2 -2
  110. package/dist/dispatch-BsW_1m7e.js +14 -0
  111. package/dist/{docs-DWegDRiu.js → docs-DFs7lOJp.js} +1 -1
  112. package/dist/{docs-BX65z2Iu.js → docs-DKROso-4.js} +2 -2
  113. package/dist/{enable-Cfzeau2x.js → enable-D2DqZvcU.js} +1 -1
  114. package/dist/{env-CRf6wkM2.js → env-YRY3I60r.js} +1 -1
  115. package/dist/exec-DuUkLMqg.js +11 -0
  116. package/dist/executor-vMppVLB6.js +10 -0
  117. package/dist/flow/builtin/review.js +1 -1
  118. package/dist/flow/index.d.ts +1 -1
  119. package/dist/flow/index.js +1 -1
  120. package/dist/{flow-kAxxVOiR.js → flow-DmERAnR8.js} +1 -1
  121. package/dist/{github-actions-DwUzm4hC.js → github-actions-C_NkHVJq.js} +1 -1
  122. package/dist/http-D01Udu4u.js +1 -0
  123. package/dist/{index-CZjFX5zV.d.ts → index-B1L4zXZH.d.ts} +2 -1
  124. package/dist/{init-C4tDFH4G.js → init-Bd6JHzBc.js} +1 -1
  125. package/dist/integrations-B2CavXR1.js +5 -0
  126. package/dist/integrations-D1Dwy1kt.js +1 -0
  127. package/dist/lib/broker.js +2 -2
  128. package/dist/{list-DuPqU3fk.js → list-4Uo-0v9s.js} +1 -1
  129. package/dist/{list-COAo7eZd.js → list-B0ujEZhd.js} +3 -3
  130. package/dist/{list-5Ljf9TxF.js → list-B5oa1Bhy.js} +2 -2
  131. package/dist/{list-vOvIpbOH.js → list-BjE_l6la.js} +1 -1
  132. package/dist/{list-J8d_zh-o.js → list-Ck9ibCs1.js} +1 -1
  133. package/dist/{list-vpyS-hv8.js → list-DhgK4Zc4.js} +1 -1
  134. package/dist/{list-way5oLO0.js → list-KvL7AUhD.js} +2 -2
  135. package/dist/{list-DzGuMkQy.js → list-byYLBl1U.js} +1 -1
  136. package/dist/{load-BpEsAn51.js → load-SnZd7xG1.js} +1 -1
  137. package/dist/{local-H3uvqEbq.js → local-BRy1EUq2.js} +1 -1
  138. package/dist/log-view-DeJstSkw.js +3 -0
  139. package/dist/{login-BBw95-S3.js → login-C-ahtDKV.js} +1 -1
  140. package/dist/{login-CNmeRAL7.js → login-zpwke8g1.js} +1 -1
  141. package/dist/{logout-j0dTo_Ib.js → logout-CI6Kf-T6.js} +1 -1
  142. package/dist/{maintenance-DkLVtqM7.js → maintenance-BAzr9Jlr.js} +1 -1
  143. package/dist/{match-CXAjDhg7.js → match-DxV1d49D.js} +1 -1
  144. package/dist/{mcp-BgKb2Cdk.js → mcp-CmcL1MCG.js} +1 -1
  145. package/dist/{mcp-CsmBtlW9.js → mcp-mhXwtGQT.js} +1 -1
  146. package/dist/{migrate-N-85_N7J.js → migrate-Czh3TEK5.js} +1 -1
  147. package/dist/{migrate-D4nzYhk8.js → migrate-w7KfzUAR.js} +1 -1
  148. package/dist/{model-B79MFtRV.js → model-JRoTH9QK.js} +1 -1
  149. package/dist/models-C-S7HqSb.js +1 -0
  150. package/dist/{prompt-CEuBMNhk.js → prompt-CMXmt2l9.js} +4 -4
  151. package/dist/{push-DbdnbZYt.js → push-B8BhTyZs.js} +1 -1
  152. package/dist/queue-CirjEskI.js +117 -0
  153. package/dist/refresh-Bmy2r1Ee.js +1 -0
  154. package/dist/{remote-miQNTVRa.js → remote-CxFnEjZl.js} +1 -1
  155. package/dist/{remove-BNzbUhaK.js → remove-C15WLaXT.js} +1 -1
  156. package/dist/{remove-D-QeeZQL.js → remove-CTZYjjSr.js} +1 -1
  157. package/dist/{remove-CLpL12Ya.js → remove-CTl-H0f0.js} +1 -1
  158. package/dist/{remove-CaYH9Cna.js → remove-DX2FVo5b.js} +1 -1
  159. package/dist/rename-D1g4TnHQ.js +1 -0
  160. package/dist/{result-BfTfJayl.js → result-D49VN8PM.js} +3 -3
  161. package/dist/result-DGWyUHYU.js +18 -0
  162. package/dist/{resume-aZ8yWDBh.js → resume-ywzc7z6A.js} +2 -2
  163. package/dist/{review-BEhDcX4b.js → review-ZC0xG8XY.js} +2 -2
  164. package/dist/{rotate-key-BqnKhTK8.js → rotate-key-Bf8_99ck.js} +1 -1
  165. package/dist/{run-BWbabvub.js → run-D7SJ-ieT.js} +2 -2
  166. package/dist/run-DoRQSC_K.js +2 -0
  167. package/dist/{run-BdPjxaZU.js → run-ukCf2Mdy.js} +1 -1
  168. package/dist/runner-D-REfOUe.js +1 -0
  169. package/dist/{runner-sUpWJ_k0.js → runner-wDYhkVsM.js} +1 -1
  170. package/dist/schema-DoNO0dPh.js +1 -0
  171. package/dist/sdk.d.ts +4 -2
  172. package/dist/sdk.js +1 -1
  173. package/dist/serve-BJ_Mbm2m.js +8 -0
  174. package/dist/{serve-C0WC-QrV.js → serve-C1MMhM1F.js} +2 -2
  175. package/dist/{serve-CcObDKKQ.js → serve-DtrOHaoS.js} +2 -2
  176. package/dist/{serve-Ck95047c.js → serve-P9pFkEnE.js} +1 -1
  177. package/dist/{serve-BTeomYxW.js → serve-yjSw0B1a.js} +1 -1
  178. package/dist/{server-BxLFZL80.js → server-DDWTnmbx.js} +1 -1
  179. package/dist/{setup-host-DLd_j2Uw.js → setup-host-L6Rnn5Cz.js} +1 -1
  180. package/dist/{shared-BLkGRKty.js → shared-XsUX_ZZb.js} +1 -1
  181. package/dist/{show-DzoQIs75.js → show-CU-jqJ90.js} +1 -1
  182. package/dist/{show-FC3dJcD-.js → show-DVJmB2u-.js} +1 -1
  183. package/dist/{status-BU3DR1XU.js → status-CBydR7LE.js} +1 -1
  184. package/dist/{steer-P_38hRRD.js → steer-Cm_sHZqs.js} +2 -2
  185. package/dist/{stop-BJGDRPsp.js → stop-DJS7DAPJ.js} +1 -1
  186. package/dist/{stop-BWY6k6v5.js → stop-TrebIIuv.js} +2 -2
  187. package/dist/store-BrNMqJgk.js +42 -0
  188. package/dist/store-j8icrG0v.js +19 -0
  189. package/dist/task-C8lmcNsf.js +1 -0
  190. package/dist/{task-DeglY79z.js → task-CpUI19o2.js} +4 -4
  191. package/dist/task-CvSqiwxo.js +1 -0
  192. package/dist/{test-BrSrhop9.js → test-CDKz4jY_.js} +1 -1
  193. package/dist/{tools-CgswhJzh.js → tools-DBFeoosk.js} +1 -1
  194. package/dist/{types-I5Cwtl_K.d.ts → types-DMGBYB_K.d.ts} +3 -1
  195. package/dist/{unalias-mMHXqok7.js → unalias-BfQFBnuK.js} +1 -1
  196. package/dist/{update-DbOWToPy.js → update-C4FFOie8.js} +1 -1
  197. package/dist/{upgrade-D6oC9HQI.js → upgrade-DLJqMnUQ.js} +2 -2
  198. package/dist/{usage-Cb8Dtv9V.js → usage-CSh-xwQ2.js} +1 -1
  199. package/dist/{usage-DMs-IIJC.js → usage-D8mc4qXK.js} +1 -1
  200. package/dist/{watch-BcMQXGYO.js → watch-CQu-tJKZ.js} +2 -2
  201. package/dist/{watch-eE2XiwsC.js → watch-DmwaEvoi.js} +2 -2
  202. package/dist/{wire-BeT1Axeo.js → wire-DzGLZ3-O.js} +1 -1
  203. package/dist/worker-BLKTMLqa.js +1 -0
  204. package/dist/worker-nHemduM_.js +9 -0
  205. package/dist/{workflow-Cshghoas.js → workflow-IrouAus_.js} +1 -1
  206. package/docs/mcp.md +1 -1
  207. package/migrations/0000_initial.sql +8 -0
  208. package/migrations/meta/0000_snapshot.json +75 -1
  209. package/migrations/meta/_journal.json +1 -1
  210. package/package.json +1 -1
  211. package/plugins/agents/skills/coder/SKILL.md +1 -0
  212. package/plugins/claude/.claude-plugin/plugin.json +1 -1
  213. package/plugins/claude/skills/dispatch/SKILL.md +1 -1
  214. package/plugins/cursor/.cursor-plugin/plugin.json +1 -1
  215. package/plugins/cursor/skills/coder/SKILL.md +1 -0
  216. package/src/client/index.ts +10 -2
  217. package/src/client/types.ts +18 -0
  218. package/src/core/defaults.ts +11 -0
  219. package/src/core/task/log-view.ts +120 -6
  220. package/src/server/dash/app/dash/agents/(list)/agent-menu.tsx +4 -0
  221. package/src/server/dash/app/dash/agents/(list)/agents-grid.tsx +18 -35
  222. package/src/server/dash/app/dash/agents/(list)/loading.tsx +7 -1
  223. package/src/server/dash/app/dash/agents/[slug]/(tabs)/layout.tsx +2 -1
  224. package/src/server/dash/app/dash/layout.tsx +13 -3
  225. package/src/server/dash/app/dash/settings/[tab]/credentials-list.tsx +20 -13
  226. package/src/server/dash/app/dash/settings/[tab]/runners-list.tsx +13 -12
  227. package/src/server/dash/app/dash/tasks/[id]/activity.tsx +49 -4
  228. package/src/server/dash/app/dash/tasks/[id]/task-actions.tsx +43 -6
  229. package/src/server/dash/app/dash/tasks/[id]/task-view.css +52 -31
  230. package/src/server/dash/app/dash/tasks/[id]/task-view.tsx +143 -51
  231. package/src/server/dash/app/dash/tasks/composer.css +4 -0
  232. package/src/server/dash/app/dash/tasks/composer.tsx +6 -5
  233. package/src/server/dash/app/dash/tasks/list/task.ts +29 -1
  234. package/src/server/dash/app/dash/tasks/list/tasks-list.css +20 -7
  235. package/src/server/dash/app/dash/tasks/list/tasks-list.tsx +256 -109
  236. package/src/server/dash/app/dash/tasks/list/tasks-section.tsx +9 -13
  237. package/src/server/dash/app/dash/tasks/page.tsx +3 -35
  238. package/src/server/dash/comps/frame/loading-card.tsx +4 -3
  239. package/src/server/dash/comps/frame/page-head.css +10 -0
  240. package/src/server/dash/comps/frame/page-head.tsx +3 -2
  241. package/src/server/dash/comps/frame/task-toasts.tsx +196 -50
  242. package/src/server/dash/comps/nav/side-toggle.tsx +15 -4
  243. package/src/server/dash/comps/ui/card.css +1 -0
  244. package/src/server/dash/comps/ui/filter.css +64 -0
  245. package/src/server/dash/comps/ui/filter.tsx +336 -0
  246. package/src/server/dash/comps/ui/icons.ts +2 -0
  247. package/src/server/dash/comps/ui/menu.tsx +4 -0
  248. package/src/server/dash/comps/ui/select.tsx +2 -2
  249. package/src/server/dash/comps/ui/toolbar.css +14 -0
  250. package/src/server/dash/utils/client.ts +21 -0
  251. package/src/server/dash/utils/format.ts +12 -4
  252. package/src/server/dash/utils/paged.ts +14 -6
  253. package/dist/actions-Mk3FSlpJ.js +0 -20
  254. package/dist/archive-sweep-Cxbh8yAI.js +0 -1
  255. package/dist/auth-CBWTmAPA.js +0 -1
  256. package/dist/auth-Dmn2U7rr.js +0 -1
  257. package/dist/credentials-l6dsrZLL.js +0 -1
  258. package/dist/dash/public/assets/chunks/agents-grid-b906da80c31fc035.js +0 -1
  259. package/dist/dash/public/assets/chunks/composer-49f9e7c5c4dfda3b.js +0 -1
  260. package/dist/dash/public/assets/chunks/composer-f331d00837143aee.js +0 -1
  261. package/dist/dash/public/assets/chunks/credentials-list-e6177d0943517929.js +0 -2
  262. package/dist/dash/public/assets/chunks/format-eb03fc9d9744d960.js +0 -1
  263. package/dist/dash/public/assets/chunks/heads-1570a3a6db331979.js +0 -1
  264. package/dist/dash/public/assets/chunks/instructions-d0a4b0d95009c262.js +0 -1
  265. package/dist/dash/public/assets/chunks/paged-bc6fa0c2b9d52ed7.js +0 -1
  266. package/dist/dash/public/assets/chunks/runners-list-9fffa50432c470c9.js +0 -1
  267. package/dist/dash/public/assets/chunks/shared-init-20e199043ff5d00f.js +0 -2
  268. package/dist/dash/public/assets/chunks/shared-init-88cce66bb3cfe1e5.js +0 -5
  269. package/dist/dash/public/assets/chunks/task-actions-a9603d520434baab.js +0 -1
  270. package/dist/dash/public/assets/chunks/task-fa8b82e95e771c4a.js +0 -1
  271. package/dist/dash/public/assets/chunks/task-view-f7039cb330bcb0b5.js +0 -3
  272. package/dist/dash/public/assets/chunks/tasks-list-2a905b4a0c3a9042.js +0 -1
  273. package/dist/dash/public/assets/dash-agents-290a7b21c7dc0c92.css +0 -1
  274. package/dist/dash/public/assets/dash-agents-new-a7a07bf4ebda24c2.css +0 -1
  275. package/dist/dash/public/assets/dash-agents-param-slug-69a72fb0bbd14cc2.css +0 -1
  276. package/dist/dash/public/assets/dash-agents-param-slug-edit-397bdfb2f0ca328c.css +0 -1
  277. package/dist/dash/public/assets/dash-agents-param-slug-platforms-a7b3b7247c27f1d2.css +0 -1
  278. package/dist/dash/public/assets/dash-agents-param-slug-settings-8389b7d0555e8ccf.css +0 -1
  279. package/dist/dash/public/assets/dash-agents-param-slug-tasks-5987b8aea5e8f30d.css +0 -1
  280. package/dist/dash/public/assets/dash-agents-param-slug-usage-19abc69e1d4e6b0a.css +0 -1
  281. package/dist/dash/public/assets/dash-settings-param-tab-ac61fdfdd6fd533f.css +0 -1
  282. package/dist/dash/public/assets/dash-tasks-cc0b1d32874b731c.css +0 -1
  283. package/dist/dash/public/assets/dash-tasks-param-id-02b8c7bd99cc1090.css +0 -1
  284. package/dist/dash/public/assets/pnext-client-17ba55bb57a1f4da.js +0 -1
  285. package/dist/dash/public/assets/pnext-client-43f52a07f8067b1b.js +0 -1
  286. package/dist/dash/public/assets/pnext-client-4594b693fe612835.js +0 -1
  287. package/dist/dash/public/assets/pnext-client-73f73e24f8141fb6.js +0 -1
  288. package/dist/dash/public/assets/pnext-client-7574da4651b40eae.js +0 -1
  289. package/dist/dash/public/assets/pnext-client-7b3a2c1092cbbb02.js +0 -1
  290. package/dist/dash/public/assets/pnext-client-816fe5fc96d3f768.js +0 -1
  291. package/dist/dash/public/assets/pnext-client-86cb956b448b0887.js +0 -1
  292. package/dist/dash/public/assets/pnext-client-8b64e3c030164288.js +0 -1
  293. package/dist/dash/public/assets/pnext-client-8f6161084c595a22.js +0 -1
  294. package/dist/dash/public/assets/pnext-client-9203ec11926e5d04.js +0 -1
  295. package/dist/dash/public/assets/pnext-client-a38b446f941d44df.js +0 -1
  296. package/dist/dash/public/assets/pnext-client-bd8d51aaa095e8a4.js +0 -1
  297. package/dist/dash/public/assets/pnext-client-e9821d1f1bdb281d.js +0 -1
  298. package/dist/default-De8FXiWz.js +0 -1
  299. package/dist/dispatch-BKeAch9E.js +0 -14
  300. package/dist/exec-RZFLclKX.js +0 -11
  301. package/dist/executor-BvAA7Cgw.js +0 -10
  302. package/dist/http-Bkg_OQ6r.js +0 -1
  303. package/dist/integrations-BAgdVDhj.js +0 -5
  304. package/dist/integrations-D-L3uQRj.js +0 -1
  305. package/dist/log-view-dg0TlKLA.js +0 -1
  306. package/dist/models-_5LVGC3m.js +0 -1
  307. package/dist/queue-C9fSdE_X.js +0 -116
  308. package/dist/refresh-BDmap1RA.js +0 -1
  309. package/dist/rename-Bhcb4t9F.js +0 -1
  310. package/dist/result-D8DsvJDu.js +0 -15
  311. package/dist/run-Dqe38jX8.js +0 -2
  312. package/dist/runner-BPpiJvHx.js +0 -1
  313. package/dist/schema-CU2iFkp8.js +0 -1
  314. package/dist/serve-DA5I2qXj.js +0 -4
  315. package/dist/store-B3ZHoBJY.js +0 -8
  316. package/dist/store-BLi19UDE.js +0 -42
  317. package/dist/task-C6VAg5WU.js +0 -1
  318. package/dist/task-b2BK481M.js +0 -1
  319. package/dist/worker-CXndxmGF.js +0 -9
  320. package/dist/worker-DrucI22w.js +0 -1
@@ -12,7 +12,7 @@ import { formatDate, formatDuration, reasonText } from '@/utils/format';
12
12
  import { Link } from '@wular/pnext/link';
13
13
  import { useSearchParams } from '@wular/pnext/navigation/client';
14
14
  import type { TaskLog, TaskRow } from '@coder/client/types';
15
- import { iAgent, iCheck, iCopy, iDown } from '@/comps/ui/icons';
15
+ import { iAgent, iCheck, iClock, iDown, iFolder, iPlug, iTerminal } from '@/comps/ui/icons';
16
16
  import { Badge } from '@/comps/ui/badge';
17
17
  import { Card, Loading } from '@/comps/ui/card';
18
18
  import { Collapse } from '@/comps/ui/collapse';
@@ -25,7 +25,7 @@ import { Status } from '@/app/dash/tasks/list/status';
25
25
  import { folderName, sourceLabel, taskActive, taskTitle } from '@/app/dash/tasks/list/task';
26
26
  import { Approval, TaskActions, useAction } from './task-actions';
27
27
  import { Activity } from './activity';
28
- import { toastError, watchTask } from '@/comps/frame/task-toasts';
28
+ import { toastError, useTaskEvents, watchTask } from '@/comps/frame/task-toasts';
29
29
 
30
30
  const TABS = ['Conversation', 'Activity'];
31
31
 
@@ -104,30 +104,10 @@ function TaskBack() {
104
104
  );
105
105
  }
106
106
 
107
- function CopyId({ id }: { id: string }) {
108
- const [copied, setCopied] = useState(false);
109
- const label = copied ? 'Copied' : 'Copy task id';
110
- useEffect(() => {
111
- if (!copied) return;
112
- const timer = setTimeout(() => setCopied(false), 1500);
113
- return () => clearTimeout(timer);
114
- }, [copied]);
115
- return (
116
- <button
117
- type="button"
118
- class={copied ? 'copy copied' : 'copy'}
119
- aria-label={label}
120
- title={label}
121
- onClick={() => void navigator.clipboard.writeText(id).then(() => setCopied(true))}
122
- >
123
- <Icon d={copied ? iCheck : iCopy} />
124
- </button>
125
- );
126
- }
127
-
128
- /** The task's one-row head: back, title, status, source and agent, its actions, and a muted line with id, created time and duration. */
107
+ /** The task's one-row head: back, title, status, source and agent, its actions, and a muted line with created time, source, folder, and the agent with its model. */
129
108
  function TaskHead({ task, tz }: { task: TaskRow; tz: string }) {
130
109
  const live = taskActive(task);
110
+ const { engine, model, effort } = { ...task.task.definition, ...task.task.usage };
131
111
  const source = task.task.event?.integration ?? task.task.source;
132
112
  const kind = task.task.event?.type ?? (task.task.flow !== 'default' ? task.task.flow : undefined);
133
113
 
@@ -143,23 +123,39 @@ function TaskHead({ task, tz }: { task: TaskRow; tz: string }) {
143
123
  }
144
124
  lead={
145
125
  <>
146
- <span class="task-id">{task.task.id}</span>
147
- <CopyId id={task.task.id} />
148
- <span>{formatDate(task.createdAt, tz)}</span>
149
- {task.startedAt && task.finishedAt ? (
150
- <span>{formatDuration(task.finishedAt - task.startedAt)}</span>
126
+ <span class="fact" title={`Created ${formatDate(task.createdAt, tz)}`}>
127
+ <Icon d={iClock} />
128
+ {formatDate(task.createdAt, tz, true)}
129
+ {task.startedAt && task.finishedAt
130
+ ? `, ran ${formatDuration(task.finishedAt - task.startedAt)}`
131
+ : null}
132
+ </span>
133
+ <span class="fact" title="Source">
134
+ <Icon d={task.task.event ? iPlug : iTerminal} />
135
+ {kind ? `${sourceLabel(source)} ${kind}` : sourceLabel(source)}
136
+ </span>
137
+ {task.task.cwd ? (
138
+ <span class="fact" title={task.task.cwd}>
139
+ <Icon d={iFolder} />
140
+ {folderName(task.task.cwd)}
141
+ </span>
151
142
  ) : null}
152
- <span>{kind ? `${sourceLabel(source)} ${kind}` : sourceLabel(source)}</span>
153
- {task.task.cwd ? <span title={task.task.cwd}>{folderName(task.task.cwd)}</span> : null}
154
- <Link
155
- class="agent-link"
156
- href="/dash/agents/[slug]"
157
- params={{ slug: task.task.agent }}
158
- search={{ from: `/dash/tasks/${task.task.id}` }}
159
- >
160
- <Icon d={iAgent} />
161
- {task.task.agent}
162
- </Link>
143
+ <span class="fact">
144
+ <Link
145
+ class="agent-link"
146
+ href="/dash/agents/[slug]"
147
+ params={{ slug: task.task.agent }}
148
+ search={{ from: `/dash/tasks/${task.task.id}` }}
149
+ >
150
+ <Icon d={iAgent} />
151
+ {task.task.agent}
152
+ </Link>
153
+ {engine ? (
154
+ <span class="fact-dim" title="Engine, model and effort">
155
+ {[engine, model, effort].filter(Boolean).join('/')}
156
+ </span>
157
+ ) : null}
158
+ </span>
163
159
  </>
164
160
  }
165
161
  actions={<TaskActions task={task} live={live} />}
@@ -167,12 +163,16 @@ function TaskHead({ task, tz }: { task: TaskRow; tz: string }) {
167
163
  );
168
164
  }
169
165
 
170
- /** Display rows for the lines so far; new lines only extend them. */
166
+ /** Display rows for the lines so far; new lines extend them or complete an earlier call. */
171
167
  function useDisplayRows(lines: TaskLog[]) {
172
168
  const view = useRef<{ log: LogView; rows: TaskDisplayRow[]; seen: number }>();
173
169
  return useMemo(() => {
174
170
  const state = (view.current ??= { log: new LogView(), rows: [], seen: 0 });
175
- for (const line of lines.slice(state.seen)) state.rows.push(...state.log.reduce(line));
171
+ for (const line of lines.slice(state.seen))
172
+ for (const row of state.log.reduce(line)) {
173
+ if (row.seq > (state.rows.at(-1)?.seq ?? -1)) state.rows.push(row);
174
+ else state.rows[state.rows.findLastIndex(({ seq }) => seq === row.seq)] = row;
175
+ }
176
176
  state.seen = lines.length;
177
177
  return [...state.rows];
178
178
  }, [lines]);
@@ -214,17 +214,107 @@ export function TaskView({ initial, tz }: { initial: TaskRow; tz: string }) {
214
214
  if (action.error) toastError('Not sent', action.error);
215
215
  }, [action.error]);
216
216
 
217
+ const pending = useRef<TaskLog[]>([]);
217
218
  const append = (more: TaskLog[]) => {
218
219
  const fresh = more.filter(line => line.seq > after.current);
219
220
  if (!fresh.length) return;
220
221
  after.current = fresh.at(-1)!.seq;
221
- setLines(value => [...value, ...fresh]);
222
+ // Lines that land together render once.
223
+ if (pending.current.push(...fresh) === fresh.length)
224
+ setTimeout(() => {
225
+ const batch = pending.current.splice(0);
226
+ setLines(value => [...value, ...batch]);
227
+ });
222
228
  };
223
229
 
224
230
  useEffect(() => {
225
231
  if (live && replies) input.current?.focus();
226
232
  }, []);
227
233
 
234
+ const [visible, setVisible] = useState(true);
235
+ useEffect(() => {
236
+ const sync = () => setVisible(document.visibilityState === 'visible');
237
+ sync();
238
+ addEventListener('visibilitychange', sync);
239
+ return () => removeEventListener('visibilitychange', sync);
240
+ }, []);
241
+
242
+ // Logs stream from when the task runs until the stream ends them, which waits for logs still arriving.
243
+ const [streaming, setStreaming] = useState(live);
244
+ useEffect(() => {
245
+ if (live) setStreaming(true);
246
+ }, [live]);
247
+
248
+ // Each turn's reads apply to it alone: a continue, here or from elsewhere, starts the next.
249
+ const [round, setRound] = useState(0);
250
+ const roundNow = useRef(0);
251
+ roundNow.current = round;
252
+
253
+ const reload = () => {
254
+ const started = roundNow.current;
255
+ void client.tasks
256
+ .get(task.task.id)
257
+ .then(({ logs: _logs, ...full }) => {
258
+ if (roundNow.current === started) setTask(full);
259
+ })
260
+ .catch(reason => setStatus(reasonText(reason)));
261
+ };
262
+
263
+ // A running stream follows its own cursor; a stopped page fetches the lines it missed.
264
+ const catchUp = () => {
265
+ reload();
266
+ if (!streaming) setComplete(false);
267
+ };
268
+
269
+ // A new turn's prompt, from this page or elsewhere; its state comes from the events stream.
270
+ useEffect(() => {
271
+ if (!round) return;
272
+ void client.tasks
273
+ .get(task.task.id)
274
+ .then(({ turns }) => {
275
+ if (roundNow.current === round)
276
+ setTask(current => (taskActive(current) ? { ...current, turns } : current));
277
+ })
278
+ .catch(() => {});
279
+ }, [round]);
280
+
281
+ // The head follows the browser's events stream; a finish brings the full task.
282
+ useTaskEvents(
283
+ event => {
284
+ if (event.id !== task.task.id || event.deleted) return;
285
+ if (live && !taskActive(event)) reload();
286
+ // A new run, even one that finished and was continued between two events.
287
+ const rerun = live && task.startedAt !== undefined && event.startedAt !== task.startedAt;
288
+ if (taskActive(event) && (!live || rerun)) {
289
+ setRound(value => value + 1);
290
+ setStreaming(true);
291
+ }
292
+ // A turn continued and finished elsewhere while this page heard nothing of it.
293
+ if (!live && !taskActive(event) && event.finishedAt !== task.finishedAt) {
294
+ reload();
295
+ setComplete(false);
296
+ }
297
+ setTask(current => ({
298
+ ...current,
299
+ status: event.status,
300
+ approval: event.approval ?? undefined,
301
+ archivedAt: event.archivedAt,
302
+ startedAt: event.startedAt,
303
+ finishedAt: event.finishedAt,
304
+ ...(event.result === undefined
305
+ ? {}
306
+ : {
307
+ result: event.result ?? undefined,
308
+ error: event.error ?? undefined,
309
+ answer: event.answer ?? undefined,
310
+ }),
311
+ }));
312
+ },
313
+ // Missed events: refetch the task and catch up its logs from the cursor.
314
+ catchUp,
315
+ () => document.visibilityState === 'visible' && catchUp(),
316
+ );
317
+
228
318
  // Older lines a chunk at a time, then the stream follows the run.
229
319
  useEffect(() => {
230
320
  if (complete) return;
@@ -237,8 +327,9 @@ export function TaskView({ initial, tz }: { initial: TaskRow; tz: string }) {
237
327
  .catch(reason => setStatus(reasonText(reason)));
238
328
  }, [complete, lines.length]);
239
329
 
330
+ // A hidden tab holds no log stream and resumes from its cursor.
240
331
  useEffect(() => {
241
- if (!complete || !live) return;
332
+ if (!complete || !streaming || !visible) return;
242
333
  const abort = new AbortController();
243
334
  const follow = async () => {
244
335
  while (!abort.signal.aborted) {
@@ -250,10 +341,9 @@ export function TaskView({ initial, tz }: { initial: TaskRow; tz: string }) {
250
341
  }
251
342
  setStatus('');
252
343
  for await (const event of serverEvents(response.body)) {
344
+ if (abort.signal.aborted) return;
253
345
  if (event.event === 'log') append([JSON.parse(event.data)]);
254
- else if (event.event === 'status')
255
- setTask(current => ({ ...current, ...JSON.parse(event.data) }));
256
- else if (event.event === 'end') return;
346
+ else if (event.event === 'end') return setStreaming(false);
257
347
  }
258
348
  } catch {
259
349
  if (abort.signal.aborted) return;
@@ -264,7 +354,7 @@ export function TaskView({ initial, tz }: { initial: TaskRow; tz: string }) {
264
354
  };
265
355
  void follow();
266
356
  return () => abort.abort();
267
- }, [complete, live]);
357
+ }, [complete, streaming, visible, round]);
268
358
 
269
359
  const turns = task.turns ?? [
270
360
  {
@@ -295,12 +385,14 @@ export function TaskView({ initial, tz }: { initial: TaskRow; tz: string }) {
295
385
  const ok = await action.run(kind, { text }).finally(() => setSending(false));
296
386
  if (!ok) return;
297
387
  input.current!.value = '';
298
- if (kind === 'continue')
388
+ if (kind === 'continue') {
389
+ setRound(value => value + 1);
299
390
  setTask(current => ({
300
391
  ...current,
301
392
  status: 'queued',
302
393
  result: undefined,
303
394
  error: undefined,
395
+ startedAt: undefined,
304
396
  finishedAt: undefined,
305
397
  turns: [
306
398
  ...turns.map((turn, index) =>
@@ -311,7 +403,7 @@ export function TaskView({ initial, tz }: { initial: TaskRow; tz: string }) {
311
403
  { prompt: text },
312
404
  ],
313
405
  }));
314
- else {
406
+ } else {
315
407
  setSent(value => [...value, { kind, text, turn: turns.length - 1 }]);
316
408
  setTab('activity');
317
409
  }
@@ -332,6 +424,7 @@ export function TaskView({ initial, tz }: { initial: TaskRow; tz: string }) {
332
424
  {fallback.engine} was unavailable. {fallback.detail} This task is using {fallback.next}.
333
425
  </p>
334
426
  ))}
427
+ {task.approval ? <Approval task={task} /> : null}
335
428
  <nav class="tabs" role="tablist" aria-label="Task">
336
429
  {TABS.map(label => {
337
430
  const key = label.toLowerCase() as Tab;
@@ -366,7 +459,6 @@ export function TaskView({ initial, tz }: { initial: TaskRow; tz: string }) {
366
459
  <p class="who">Prompt</p>
367
460
  <Collapse class="prose">{turn.prompt}</Collapse>
368
461
  </div>
369
- {last && task.approval ? <Approval task={task} /> : null}
370
462
  {last
371
463
  ? (task.answer ?? []).slice(0, knownAnswers.current).map((answer, index) => (
372
464
  <div key={`a${index}`} class="turn answer">
@@ -216,6 +216,10 @@ dialog.compose-dialog::backdrop {
216
216
  height: 30px;
217
217
  margin-left: auto;
218
218
  }
219
+ /* the dialog's prompt grows to 20 lines, short of the dialog's own scroll */
220
+ .compose-dialog .composer textarea {
221
+ max-height: min(20lh, max(4lh, calc(86dvh - 180px)));
222
+ }
219
223
  .compose-dialog .composer,
220
224
  .compose-dialog > .loading,
221
225
  .compose-dialog > .flash,
@@ -823,8 +823,8 @@ export function LoadingComposer() {
823
823
  );
824
824
  }
825
825
 
826
- /** Opens the composer in a dialog with `agent` picked; starting a task opens it. */
827
- export function NewTaskButton({ agent }: { agent: string }) {
826
+ /** Opens the composer in a dialog, with `agent` picked when given; starting a task opens it. */
827
+ export function NewTaskButton({ agent }: { agent?: string }) {
828
828
  const dialog = useRef<HTMLDialogElement>(null);
829
829
  const [setup, setSetup] = useState<Awaited<ReturnType<typeof loadComposer>>>();
830
830
  const [error, setError] = useState('');
@@ -852,18 +852,19 @@ export function NewTaskButton({ agent }: { agent: string }) {
852
852
  onPointerEnter={prepare}
853
853
  onFocus={prepare}
854
854
  >
855
+ <Icon d={iPlus} />
855
856
  New task
856
857
  </button>
857
858
  <dialog
858
859
  ref={dialog}
859
860
  class="compose-dialog"
860
- aria-label={`New task for ${agent}`}
861
+ aria-label={agent ? `New task for ${agent}` : 'New task'}
861
862
  onClose={() => setShown(false)}
862
863
  onClick={event => event.target === event.currentTarget && dialog.current?.close()}
863
864
  >
864
865
  <header>
865
866
  <h2>New task</h2>
866
- <span class="sub">{agent}</span>
867
+ {agent ? <span class="sub">{agent}</span> : null}
867
868
  <button
868
869
  type="button"
869
870
  class="icon-btn"
@@ -876,7 +877,7 @@ export function NewTaskButton({ agent }: { agent: string }) {
876
877
  {!shown ? null : setup ? (
877
878
  <Composer
878
879
  {...setup}
879
- initial={{ ...savedChoice(document.cookie), agent }}
880
+ initial={{ ...savedChoice(document.cookie), ...(agent ? { agent } : {}) }}
880
881
  tz={Intl.DateTimeFormat().resolvedOptions().timeZone}
881
882
  />
882
883
  ) : error ? (
@@ -1,4 +1,5 @@
1
1
  import type { TaskRow } from '@coder/client/types';
2
+ import { byListKey, listRank } from '@coder/core/defaults';
2
3
 
3
4
  /** Task statuses a list filters by. */
4
5
  export const STATUSES: Array<[string, string]> = [
@@ -32,9 +33,36 @@ export const SOURCES: Array<[string, string]> = [
32
33
  export const sourceLabel = (value: string) =>
33
34
  (SOURCES.find(([key]) => key === value) ?? [value, value])[1];
34
35
 
35
- export const taskActive = (task: TaskRow) =>
36
+ export const taskActive = (task: Pick<TaskRow, 'status'>) =>
36
37
  task.status === 'queued' || task.status === 'running' || task.status === 'waiting';
37
38
 
39
+ const listKey = (row: TaskRow) => ({
40
+ rank: listRank(row.status),
41
+ createdAt: row.createdAt,
42
+ id: row.task.id,
43
+ });
44
+
45
+ /** The server's list order. */
46
+ export const listOrder = (a: TaskRow, b: TaskRow) => byListKey(listKey(a), listKey(b));
47
+
48
+ /** Rows refetched first pages added so far, the newest copy of each, in list order. */
49
+ export function addRows(previous: TaskRow[], page: TaskRow[]): TaskRow[] {
50
+ const fetched = new Set(page.map(row => row.task.id));
51
+ return [...page, ...previous.filter(row => !fetched.has(row.task.id))].sort(listOrder);
52
+ }
53
+
54
+ /** The loaded rows with the added ones they lack, each at its latest, in list order. */
55
+ export function withAdded(
56
+ rows: TaskRow[],
57
+ added: TaskRow[],
58
+ latest: Record<string, TaskRow> = {},
59
+ ): TaskRow[] {
60
+ const listed = new Set(rows.map(row => row.task.id));
61
+ return [...added.filter(row => !listed.has(row.task.id)), ...rows]
62
+ .map(row => latest[row.task.id] ?? row)
63
+ .sort(listOrder);
64
+ }
65
+
38
66
  export const taskTitle = (task: TaskRow) =>
39
67
  task.task.name?.trim() ||
40
68
  task.task.prompt?.trim() ||
@@ -6,13 +6,13 @@
6
6
  width: 160px;
7
7
  }
8
8
  .tasks th:nth-child(3) {
9
- width: 140px;
9
+ width: 130px;
10
10
  }
11
11
  .tasks th:nth-child(4) {
12
- width: 130px;
12
+ width: 100px;
13
13
  }
14
14
  .tasks th:nth-child(5) {
15
- width: 150px;
15
+ width: 204px;
16
16
  }
17
17
  .tasks td {
18
18
  padding-block: 9px;
@@ -33,12 +33,25 @@
33
33
  .tasks td:first-child .sub {
34
34
  margin-top: 1px;
35
35
  }
36
+ .tasks .sub .ic {
37
+ width: 12px;
38
+ height: 12px;
39
+ margin-right: 5px;
40
+ color: var(--dim);
41
+ vertical-align: -2px;
42
+ }
36
43
 
37
44
  @media (max-width: 760px) {
38
45
  .tasks {
39
46
  min-width: 0;
40
47
  }
41
- .tasks td:nth-child(3) {
48
+ .tasks td {
49
+ padding-block: 0;
50
+ }
51
+ .tasks td:is(.when, .num) {
52
+ order: 1;
53
+ }
54
+ .tasks td:last-child {
42
55
  display: flex;
43
56
  align-items: center;
44
57
  justify-self: end;
@@ -63,11 +76,11 @@
63
76
  }
64
77
 
65
78
  /* a row's menu waits at its right edge, above the cover link, and shows on hover, focus or while open */
66
- .tasks th.num,
67
- .tasks td.num {
79
+ .tasks th:last-child,
80
+ .tasks td:last-child {
68
81
  padding-right: 64px;
69
82
  }
70
- .tasks td.num {
83
+ .tasks td:last-child {
71
84
  position: relative;
72
85
  }
73
86
  .row-acts {