@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.
- package/dist/actions-FzDNxMFf.js +20 -0
- package/dist/{adapter-BKVzTDnn.js → adapter-7SEiVsmp.js} +1 -1
- package/dist/{adapter-B0oYCI0S.js → adapter-BLEfUqoQ.js} +1 -1
- package/dist/{adapter-DPInwbJG.js → adapter-H4GlcKQz.js} +1 -1
- package/dist/{add-DRsPpQFl.js → add-B50dIJGd.js} +1 -1
- package/dist/{add-DkpUwhtO.js → add-D7X3gxap.js} +1 -1
- package/dist/{add-C2y-mVzl.js → add-DOEUHIe7.js} +1 -1
- package/dist/{add-CLYTF_up.js → add-QExQhTzi.js} +1 -1
- package/dist/{add-json-5uPnWPoD.js → add-json-Ck4KIZrT.js} +1 -1
- package/dist/{agent-r5mMcehf.js → agent-BPtnEf1q.js} +1 -1
- package/dist/{agent-hw3zKw8y.js → agent-BlQ_dNNm.js} +2 -2
- package/dist/{alias-_0Rwf2cA.js → alias-BwQBovke.js} +1 -1
- package/dist/{app-oE8G1-bi.js → app-y6BYm2eH.js} +1 -1
- package/dist/{approvals-DbVrsxec.js → approvals-Cc9cq5T1.js} +2 -2
- package/dist/{approve-DeAhFL-m.js → approve-oO9k2fnK.js} +2 -2
- package/dist/{apps-eujHiNca.js → apps-CU2YalX8.js} +1 -1
- package/dist/{archive-BCUfymIB.js → archive-C5c_HQS1.js} +2 -2
- package/dist/{archive-DZ6vpMHb.js → archive-CemlWlVY.js} +2 -2
- package/dist/archive-sweep-ehg-fWIt.js +1 -0
- package/dist/{args-BOEEdpWk.js → args-DcBCtXhz.js} +1 -1
- package/dist/{ask-BU2WVxVM.js → ask-Chu7Twu_.js} +2 -2
- package/dist/auth-BOyXPOtu.js +1 -0
- package/dist/auth-XbqKSbcD.js +1 -0
- package/dist/{chat-bridge-BS9WtP3X.js → chat-bridge-DXgZItGP.js} +1 -1
- package/dist/{chat-B_yhNTo0.js → chat-cknlIhVh.js} +1 -1
- package/dist/{cli-DWCR7iqa.js → cli-B1ObVrL4.js} +5 -5
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +1 -1
- package/dist/{client-D9IoAuDD.js → client-31YzOj-i.js} +1 -1
- package/dist/{config-12pK4qW7.js → config-DAE_qHYA.js} +1 -1
- package/dist/{create-D3f6q0Yq.js → create-CM8B8JxD.js} +1 -1
- package/dist/credentials-BXD4Qptk.js +1 -0
- package/dist/dash/manifest.json +949 -915
- package/dist/dash/public/assets/chunks/{agent-pills-dd0b7643e125bbf1.js → agent-pills-b6a6da91c9559d9f.js} +1 -1
- package/dist/dash/public/assets/chunks/{agent-settings-form-45ae6aeaaed2b568.js → agent-settings-form-b615c677046cd6f2.js} +1 -1
- package/dist/dash/public/assets/chunks/agents-grid-f2e7b4ff9e11b6e3.js +1 -0
- package/dist/dash/public/assets/chunks/{badge-676b01e0c615bf7b.js → badge-215c7b2631dafc69.js} +1 -1
- package/dist/dash/public/assets/chunks/{card-e0901d68b79dfa93.js → card-e86dcc81326d2b14.js} +1 -1
- package/dist/dash/public/assets/chunks/{combo-952a457d52360d88.js → combo-09e246dc9a517fa8.js} +1 -1
- package/dist/dash/public/assets/chunks/composer-417166b029f48c47.js +1 -0
- package/dist/dash/public/assets/chunks/composer-645ae8fa97a35280.js +1 -0
- package/dist/dash/public/assets/chunks/{confirm-f2fe4ba9905a89c6.js → confirm-5ae484241ad888fd.js} +1 -1
- package/dist/dash/public/assets/chunks/{connect-apps-661f3b3a85f1776a.js → connect-apps-4147c45f45fde2b1.js} +1 -1
- package/dist/dash/public/assets/chunks/{connect-repositories-5389ec8701a3deac.js → connect-repositories-77591110836bdf03.js} +1 -1
- package/dist/dash/public/assets/chunks/credentials-list-e005a0783ec93465.js +2 -0
- package/dist/dash/public/assets/chunks/{custom-range-03ba6fb2ade7d282.js → custom-range-463e119af4681c61.js} +1 -1
- package/dist/dash/public/assets/chunks/{editor-34cb529d6d8a4b09.js → editor-804b84f4fe6539cd.js} +4 -4
- package/dist/dash/public/assets/chunks/{engines-list-2f1acee3ecc8461a.js → engines-list-ceab51f13c690e8c.js} +1 -1
- package/dist/dash/public/assets/chunks/{field-901f1f35c18c39c9.js → field-aa0a4b98a976781e.js} +1 -1
- package/dist/dash/public/assets/chunks/filter-91144ac2eec6297f.js +1 -0
- package/dist/dash/public/assets/chunks/format-105c706345987fb2.js +1 -0
- package/dist/dash/public/assets/chunks/heads-a42817b32d2d7f08.js +1 -0
- package/dist/dash/public/assets/chunks/{instructions-052fa45a9daf6db6.js → instructions-3a1dcaff2d868aa5.js} +1 -1
- package/dist/dash/public/assets/chunks/instructions-6c6f981fffaa31e4.js +1 -0
- package/dist/dash/public/assets/chunks/{list-87b359bebd26986a.js → list-7270361464fc3c04.js} +1 -1
- package/dist/dash/public/assets/chunks/{mcp-list-b42f0d2ee463b37d.js → mcp-list-2e715d48666b54ad.js} +1 -1
- package/dist/dash/public/assets/chunks/{models-list-0669d26fd662aec3.js → models-list-d3c40f94c761a6e5.js} +1 -1
- package/dist/dash/public/assets/chunks/paged-3ddb6077bef42752.js +1 -0
- package/dist/dash/public/assets/chunks/{platform-actions-c92ca3c6198a9387.js → platform-actions-271ec3b99a64280b.js} +1 -1
- package/dist/dash/public/assets/chunks/runners-list-767e49c7d0ec833a.js +1 -0
- package/dist/dash/public/assets/chunks/{segmented-358ff2b4992b8384.js → segmented-de4386ccaac7304d.js} +1 -1
- package/dist/dash/public/assets/chunks/{select-1013702bdfb1ade4.js → select-a90307706cffa6e0.js} +1 -1
- package/dist/dash/public/assets/chunks/{sentinel-c972a33dc69a5135.js → sentinel-b5e032b38604dfd3.js} +1 -1
- package/dist/dash/public/assets/chunks/shared-init-7f81ae7bc8c82438.js +2 -0
- package/dist/dash/public/assets/chunks/shared-init-933c7f9ee85be766.js +5 -0
- package/dist/dash/public/assets/chunks/{tail-7c27aab8ba268bd9.js → tail-4891e727ee526792.js} +1 -1
- package/dist/dash/public/assets/chunks/task-actions-ce854925a2dc78fd.js +1 -0
- package/dist/dash/public/assets/chunks/task-ddfddeaf07fb684c.js +1 -0
- package/dist/dash/public/assets/chunks/task-view-c37dcee08f21a279.js +5 -0
- package/dist/dash/public/assets/chunks/tasks-list-baef587999f322d8.js +1 -0
- package/dist/dash/public/assets/chunks/{toolbar-f964fa864699f095.js → toolbar-8d98313606ad8a2d.js} +1 -1
- package/dist/dash/public/assets/chunks/{versions-list-fc2e0d2a7382e049.js → versions-list-532690efd9f1b0ea.js} +1 -1
- package/dist/dash/public/assets/{dash-account-96fc41be318839fa.css → dash-account-edc56e85dbaaabe0.css} +1 -1
- package/dist/dash/public/assets/dash-agents-edba57b67e4005d0.css +1 -0
- package/dist/dash/public/assets/dash-agents-new-fe22253fbada2fbf.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-adf52e9dacb2d825.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-edit-a2937a347689ef29.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-platforms-265ba13db32a460d.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-settings-8afc52eb0372bc4b.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-tasks-6193e646be68dbd2.css +1 -0
- package/dist/dash/public/assets/dash-agents-param-slug-usage-ceadb3a1c911c402.css +1 -0
- package/dist/dash/public/assets/{dash-settings-53b8e6a8f656fa1a.css → dash-settings-cf1997cd7f72e518.css} +1 -1
- package/dist/dash/public/assets/dash-settings-param-tab-b44dac8e79a560e6.css +1 -0
- package/dist/dash/public/assets/dash-tasks-916c7100a8058aa3.css +1 -0
- package/dist/dash/public/assets/dash-tasks-param-id-194a6ffc20e872f2.css +1 -0
- package/dist/dash/public/assets/{dash-usage-884943221f76ad93.css → dash-usage-40940b289f85e0b6.css} +1 -1
- package/dist/dash/public/assets/pnext-client-13aee92bef5c9e3f.js +1 -0
- package/dist/dash/public/assets/pnext-client-1f2686b2044f0df6.js +1 -0
- package/dist/dash/public/assets/pnext-client-26130234ebad7067.js +1 -0
- package/dist/dash/public/assets/pnext-client-311e35b0076bf406.js +1 -0
- package/dist/dash/public/assets/pnext-client-4ade1bf75c9c3d87.js +1 -0
- package/dist/dash/public/assets/pnext-client-61cd31b687ede1da.js +1 -0
- package/dist/dash/public/assets/{pnext-client-2693db10b197ade1.js → pnext-client-61db65dc4223217a.js} +1 -1
- package/dist/dash/public/assets/pnext-client-6ea656e7705e3f2a.js +1 -0
- package/dist/dash/public/assets/pnext-client-7fd0f793f0322cb9.js +1 -0
- package/dist/dash/public/assets/pnext-client-88159c0840fcfa4a.js +1 -0
- package/dist/dash/public/assets/pnext-client-b03f0c47c066b4f3.js +1 -0
- package/dist/dash/public/assets/{pnext-client-1afa4148bea69ad2.js → pnext-client-d6478835f543f901.js} +1 -1
- package/dist/dash/public/assets/pnext-client-dadb8359021ed590.js +1 -0
- package/dist/dash/public/assets/pnext-client-de07532d6aaebf2c.js +1 -0
- package/dist/dash/public/assets/pnext-client-f87a31890c8ff224.js +1 -0
- package/dist/dash/public/assets/pnext-client-ffe1c123a8e2a350.js +1 -0
- package/dist/{default-CwQXCtoB.js → default-BMvUMTFp.js} +1 -1
- package/dist/default-B_nKaX0-.js +1 -0
- package/dist/{delete-cS01oOIb.js → delete-Bjteibld.js} +2 -2
- package/dist/{delete-BD6AnCLg.js → delete-riCIKZwj.js} +2 -2
- package/dist/{disable-BMWWeYFQ.js → disable-DQC56YFy.js} +1 -1
- package/dist/{discover-Dvr_3_Xr.js → discover-Qanr5TEO.js} +1 -1
- package/dist/{discover-Cfx5RPU7.js → discover-lgTYwoQp.js} +2 -2
- package/dist/dispatch-BsW_1m7e.js +14 -0
- package/dist/{docs-DWegDRiu.js → docs-DFs7lOJp.js} +1 -1
- package/dist/{docs-BX65z2Iu.js → docs-DKROso-4.js} +2 -2
- package/dist/{enable-Cfzeau2x.js → enable-D2DqZvcU.js} +1 -1
- package/dist/{env-CRf6wkM2.js → env-YRY3I60r.js} +1 -1
- package/dist/exec-DuUkLMqg.js +11 -0
- package/dist/executor-vMppVLB6.js +10 -0
- package/dist/flow/builtin/review.js +1 -1
- package/dist/flow/index.d.ts +1 -1
- package/dist/flow/index.js +1 -1
- package/dist/{flow-kAxxVOiR.js → flow-DmERAnR8.js} +1 -1
- package/dist/{github-actions-DwUzm4hC.js → github-actions-C_NkHVJq.js} +1 -1
- package/dist/http-D01Udu4u.js +1 -0
- package/dist/{index-CZjFX5zV.d.ts → index-B1L4zXZH.d.ts} +2 -1
- package/dist/{init-C4tDFH4G.js → init-Bd6JHzBc.js} +1 -1
- package/dist/integrations-B2CavXR1.js +5 -0
- package/dist/integrations-D1Dwy1kt.js +1 -0
- package/dist/lib/broker.js +2 -2
- package/dist/{list-DuPqU3fk.js → list-4Uo-0v9s.js} +1 -1
- package/dist/{list-COAo7eZd.js → list-B0ujEZhd.js} +3 -3
- package/dist/{list-5Ljf9TxF.js → list-B5oa1Bhy.js} +2 -2
- package/dist/{list-vOvIpbOH.js → list-BjE_l6la.js} +1 -1
- package/dist/{list-J8d_zh-o.js → list-Ck9ibCs1.js} +1 -1
- package/dist/{list-vpyS-hv8.js → list-DhgK4Zc4.js} +1 -1
- package/dist/{list-way5oLO0.js → list-KvL7AUhD.js} +2 -2
- package/dist/{list-DzGuMkQy.js → list-byYLBl1U.js} +1 -1
- package/dist/{load-BpEsAn51.js → load-SnZd7xG1.js} +1 -1
- package/dist/{local-H3uvqEbq.js → local-BRy1EUq2.js} +1 -1
- package/dist/log-view-DeJstSkw.js +3 -0
- package/dist/{login-BBw95-S3.js → login-C-ahtDKV.js} +1 -1
- package/dist/{login-CNmeRAL7.js → login-zpwke8g1.js} +1 -1
- package/dist/{logout-j0dTo_Ib.js → logout-CI6Kf-T6.js} +1 -1
- package/dist/{maintenance-DkLVtqM7.js → maintenance-BAzr9Jlr.js} +1 -1
- package/dist/{match-CXAjDhg7.js → match-DxV1d49D.js} +1 -1
- package/dist/{mcp-BgKb2Cdk.js → mcp-CmcL1MCG.js} +1 -1
- package/dist/{mcp-CsmBtlW9.js → mcp-mhXwtGQT.js} +1 -1
- package/dist/{migrate-N-85_N7J.js → migrate-Czh3TEK5.js} +1 -1
- package/dist/{migrate-D4nzYhk8.js → migrate-w7KfzUAR.js} +1 -1
- package/dist/{model-B79MFtRV.js → model-JRoTH9QK.js} +1 -1
- package/dist/models-C-S7HqSb.js +1 -0
- package/dist/{prompt-CEuBMNhk.js → prompt-CMXmt2l9.js} +4 -4
- package/dist/{push-DbdnbZYt.js → push-B8BhTyZs.js} +1 -1
- package/dist/queue-CirjEskI.js +117 -0
- package/dist/refresh-Bmy2r1Ee.js +1 -0
- package/dist/{remote-miQNTVRa.js → remote-CxFnEjZl.js} +1 -1
- package/dist/{remove-BNzbUhaK.js → remove-C15WLaXT.js} +1 -1
- package/dist/{remove-D-QeeZQL.js → remove-CTZYjjSr.js} +1 -1
- package/dist/{remove-CLpL12Ya.js → remove-CTl-H0f0.js} +1 -1
- package/dist/{remove-CaYH9Cna.js → remove-DX2FVo5b.js} +1 -1
- package/dist/rename-D1g4TnHQ.js +1 -0
- package/dist/{result-BfTfJayl.js → result-D49VN8PM.js} +3 -3
- package/dist/result-DGWyUHYU.js +18 -0
- package/dist/{resume-aZ8yWDBh.js → resume-ywzc7z6A.js} +2 -2
- package/dist/{review-BEhDcX4b.js → review-ZC0xG8XY.js} +2 -2
- package/dist/{rotate-key-BqnKhTK8.js → rotate-key-Bf8_99ck.js} +1 -1
- package/dist/{run-BWbabvub.js → run-D7SJ-ieT.js} +2 -2
- package/dist/run-DoRQSC_K.js +2 -0
- package/dist/{run-BdPjxaZU.js → run-ukCf2Mdy.js} +1 -1
- package/dist/runner-D-REfOUe.js +1 -0
- package/dist/{runner-sUpWJ_k0.js → runner-wDYhkVsM.js} +1 -1
- package/dist/schema-DoNO0dPh.js +1 -0
- package/dist/sdk.d.ts +4 -2
- package/dist/sdk.js +1 -1
- package/dist/serve-BJ_Mbm2m.js +8 -0
- package/dist/{serve-C0WC-QrV.js → serve-C1MMhM1F.js} +2 -2
- package/dist/{serve-CcObDKKQ.js → serve-DtrOHaoS.js} +2 -2
- package/dist/{serve-Ck95047c.js → serve-P9pFkEnE.js} +1 -1
- package/dist/{serve-BTeomYxW.js → serve-yjSw0B1a.js} +1 -1
- package/dist/{server-BxLFZL80.js → server-DDWTnmbx.js} +1 -1
- package/dist/{setup-host-DLd_j2Uw.js → setup-host-L6Rnn5Cz.js} +1 -1
- package/dist/{shared-BLkGRKty.js → shared-XsUX_ZZb.js} +1 -1
- package/dist/{show-DzoQIs75.js → show-CU-jqJ90.js} +1 -1
- package/dist/{show-FC3dJcD-.js → show-DVJmB2u-.js} +1 -1
- package/dist/{status-BU3DR1XU.js → status-CBydR7LE.js} +1 -1
- package/dist/{steer-P_38hRRD.js → steer-Cm_sHZqs.js} +2 -2
- package/dist/{stop-BJGDRPsp.js → stop-DJS7DAPJ.js} +1 -1
- package/dist/{stop-BWY6k6v5.js → stop-TrebIIuv.js} +2 -2
- package/dist/store-BrNMqJgk.js +42 -0
- package/dist/store-j8icrG0v.js +19 -0
- package/dist/task-C8lmcNsf.js +1 -0
- package/dist/{task-DeglY79z.js → task-CpUI19o2.js} +4 -4
- package/dist/task-CvSqiwxo.js +1 -0
- package/dist/{test-BrSrhop9.js → test-CDKz4jY_.js} +1 -1
- package/dist/{tools-CgswhJzh.js → tools-DBFeoosk.js} +1 -1
- package/dist/{types-I5Cwtl_K.d.ts → types-DMGBYB_K.d.ts} +3 -1
- package/dist/{unalias-mMHXqok7.js → unalias-BfQFBnuK.js} +1 -1
- package/dist/{update-DbOWToPy.js → update-C4FFOie8.js} +1 -1
- package/dist/{upgrade-D6oC9HQI.js → upgrade-DLJqMnUQ.js} +2 -2
- package/dist/{usage-Cb8Dtv9V.js → usage-CSh-xwQ2.js} +1 -1
- package/dist/{usage-DMs-IIJC.js → usage-D8mc4qXK.js} +1 -1
- package/dist/{watch-BcMQXGYO.js → watch-CQu-tJKZ.js} +2 -2
- package/dist/{watch-eE2XiwsC.js → watch-DmwaEvoi.js} +2 -2
- package/dist/{wire-BeT1Axeo.js → wire-DzGLZ3-O.js} +1 -1
- package/dist/worker-BLKTMLqa.js +1 -0
- package/dist/worker-nHemduM_.js +9 -0
- package/dist/{workflow-Cshghoas.js → workflow-IrouAus_.js} +1 -1
- package/docs/mcp.md +1 -1
- package/migrations/0000_initial.sql +8 -0
- package/migrations/meta/0000_snapshot.json +75 -1
- package/migrations/meta/_journal.json +1 -1
- package/package.json +1 -1
- package/plugins/agents/skills/coder/SKILL.md +1 -0
- package/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/plugins/claude/skills/dispatch/SKILL.md +1 -1
- package/plugins/cursor/.cursor-plugin/plugin.json +1 -1
- package/plugins/cursor/skills/coder/SKILL.md +1 -0
- package/src/client/index.ts +10 -2
- package/src/client/types.ts +18 -0
- package/src/core/defaults.ts +11 -0
- package/src/core/task/log-view.ts +120 -6
- package/src/server/dash/app/dash/agents/(list)/agent-menu.tsx +4 -0
- package/src/server/dash/app/dash/agents/(list)/agents-grid.tsx +18 -35
- package/src/server/dash/app/dash/agents/(list)/loading.tsx +7 -1
- package/src/server/dash/app/dash/agents/[slug]/(tabs)/layout.tsx +2 -1
- package/src/server/dash/app/dash/layout.tsx +13 -3
- package/src/server/dash/app/dash/settings/[tab]/credentials-list.tsx +20 -13
- package/src/server/dash/app/dash/settings/[tab]/runners-list.tsx +13 -12
- package/src/server/dash/app/dash/tasks/[id]/activity.tsx +49 -4
- package/src/server/dash/app/dash/tasks/[id]/task-actions.tsx +43 -6
- package/src/server/dash/app/dash/tasks/[id]/task-view.css +52 -31
- package/src/server/dash/app/dash/tasks/[id]/task-view.tsx +143 -51
- package/src/server/dash/app/dash/tasks/composer.css +4 -0
- package/src/server/dash/app/dash/tasks/composer.tsx +6 -5
- package/src/server/dash/app/dash/tasks/list/task.ts +29 -1
- package/src/server/dash/app/dash/tasks/list/tasks-list.css +20 -7
- package/src/server/dash/app/dash/tasks/list/tasks-list.tsx +256 -109
- package/src/server/dash/app/dash/tasks/list/tasks-section.tsx +9 -13
- package/src/server/dash/app/dash/tasks/page.tsx +3 -35
- package/src/server/dash/comps/frame/loading-card.tsx +4 -3
- package/src/server/dash/comps/frame/page-head.css +10 -0
- package/src/server/dash/comps/frame/page-head.tsx +3 -2
- package/src/server/dash/comps/frame/task-toasts.tsx +196 -50
- package/src/server/dash/comps/nav/side-toggle.tsx +15 -4
- package/src/server/dash/comps/ui/card.css +1 -0
- package/src/server/dash/comps/ui/filter.css +64 -0
- package/src/server/dash/comps/ui/filter.tsx +336 -0
- package/src/server/dash/comps/ui/icons.ts +2 -0
- package/src/server/dash/comps/ui/menu.tsx +4 -0
- package/src/server/dash/comps/ui/select.tsx +2 -2
- package/src/server/dash/comps/ui/toolbar.css +14 -0
- package/src/server/dash/utils/client.ts +21 -0
- package/src/server/dash/utils/format.ts +12 -4
- package/src/server/dash/utils/paged.ts +14 -6
- package/dist/actions-Mk3FSlpJ.js +0 -20
- package/dist/archive-sweep-Cxbh8yAI.js +0 -1
- package/dist/auth-CBWTmAPA.js +0 -1
- package/dist/auth-Dmn2U7rr.js +0 -1
- package/dist/credentials-l6dsrZLL.js +0 -1
- package/dist/dash/public/assets/chunks/agents-grid-b906da80c31fc035.js +0 -1
- package/dist/dash/public/assets/chunks/composer-49f9e7c5c4dfda3b.js +0 -1
- package/dist/dash/public/assets/chunks/composer-f331d00837143aee.js +0 -1
- package/dist/dash/public/assets/chunks/credentials-list-e6177d0943517929.js +0 -2
- package/dist/dash/public/assets/chunks/format-eb03fc9d9744d960.js +0 -1
- package/dist/dash/public/assets/chunks/heads-1570a3a6db331979.js +0 -1
- package/dist/dash/public/assets/chunks/instructions-d0a4b0d95009c262.js +0 -1
- package/dist/dash/public/assets/chunks/paged-bc6fa0c2b9d52ed7.js +0 -1
- package/dist/dash/public/assets/chunks/runners-list-9fffa50432c470c9.js +0 -1
- package/dist/dash/public/assets/chunks/shared-init-20e199043ff5d00f.js +0 -2
- package/dist/dash/public/assets/chunks/shared-init-88cce66bb3cfe1e5.js +0 -5
- package/dist/dash/public/assets/chunks/task-actions-a9603d520434baab.js +0 -1
- package/dist/dash/public/assets/chunks/task-fa8b82e95e771c4a.js +0 -1
- package/dist/dash/public/assets/chunks/task-view-f7039cb330bcb0b5.js +0 -3
- package/dist/dash/public/assets/chunks/tasks-list-2a905b4a0c3a9042.js +0 -1
- package/dist/dash/public/assets/dash-agents-290a7b21c7dc0c92.css +0 -1
- package/dist/dash/public/assets/dash-agents-new-a7a07bf4ebda24c2.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-69a72fb0bbd14cc2.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-edit-397bdfb2f0ca328c.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-platforms-a7b3b7247c27f1d2.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-settings-8389b7d0555e8ccf.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-tasks-5987b8aea5e8f30d.css +0 -1
- package/dist/dash/public/assets/dash-agents-param-slug-usage-19abc69e1d4e6b0a.css +0 -1
- package/dist/dash/public/assets/dash-settings-param-tab-ac61fdfdd6fd533f.css +0 -1
- package/dist/dash/public/assets/dash-tasks-cc0b1d32874b731c.css +0 -1
- package/dist/dash/public/assets/dash-tasks-param-id-02b8c7bd99cc1090.css +0 -1
- package/dist/dash/public/assets/pnext-client-17ba55bb57a1f4da.js +0 -1
- package/dist/dash/public/assets/pnext-client-43f52a07f8067b1b.js +0 -1
- package/dist/dash/public/assets/pnext-client-4594b693fe612835.js +0 -1
- package/dist/dash/public/assets/pnext-client-73f73e24f8141fb6.js +0 -1
- package/dist/dash/public/assets/pnext-client-7574da4651b40eae.js +0 -1
- package/dist/dash/public/assets/pnext-client-7b3a2c1092cbbb02.js +0 -1
- package/dist/dash/public/assets/pnext-client-816fe5fc96d3f768.js +0 -1
- package/dist/dash/public/assets/pnext-client-86cb956b448b0887.js +0 -1
- package/dist/dash/public/assets/pnext-client-8b64e3c030164288.js +0 -1
- package/dist/dash/public/assets/pnext-client-8f6161084c595a22.js +0 -1
- package/dist/dash/public/assets/pnext-client-9203ec11926e5d04.js +0 -1
- package/dist/dash/public/assets/pnext-client-a38b446f941d44df.js +0 -1
- package/dist/dash/public/assets/pnext-client-bd8d51aaa095e8a4.js +0 -1
- package/dist/dash/public/assets/pnext-client-e9821d1f1bdb281d.js +0 -1
- package/dist/default-De8FXiWz.js +0 -1
- package/dist/dispatch-BKeAch9E.js +0 -14
- package/dist/exec-RZFLclKX.js +0 -11
- package/dist/executor-BvAA7Cgw.js +0 -10
- package/dist/http-Bkg_OQ6r.js +0 -1
- package/dist/integrations-BAgdVDhj.js +0 -5
- package/dist/integrations-D-L3uQRj.js +0 -1
- package/dist/log-view-dg0TlKLA.js +0 -1
- package/dist/models-_5LVGC3m.js +0 -1
- package/dist/queue-C9fSdE_X.js +0 -116
- package/dist/refresh-BDmap1RA.js +0 -1
- package/dist/rename-Bhcb4t9F.js +0 -1
- package/dist/result-D8DsvJDu.js +0 -15
- package/dist/run-Dqe38jX8.js +0 -2
- package/dist/runner-BPpiJvHx.js +0 -1
- package/dist/schema-CU2iFkp8.js +0 -1
- package/dist/serve-DA5I2qXj.js +0 -4
- package/dist/store-B3ZHoBJY.js +0 -8
- package/dist/store-BLi19UDE.js +0 -42
- package/dist/task-C6VAg5WU.js +0 -1
- package/dist/task-b2BK481M.js +0 -1
- package/dist/worker-CXndxmGF.js +0 -9
- 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,
|
|
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
|
-
|
|
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="
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
|
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))
|
|
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
|
-
|
|
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 || !
|
|
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 === '
|
|
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,
|
|
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
|
|
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:
|
|
9
|
+
width: 130px;
|
|
10
10
|
}
|
|
11
11
|
.tasks th:nth-child(4) {
|
|
12
|
-
width:
|
|
12
|
+
width: 100px;
|
|
13
13
|
}
|
|
14
14
|
.tasks th:nth-child(5) {
|
|
15
|
-
width:
|
|
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
|
|
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
|
|
67
|
-
.tasks td
|
|
79
|
+
.tasks th:last-child,
|
|
80
|
+
.tasks td:last-child {
|
|
68
81
|
padding-right: 64px;
|
|
69
82
|
}
|
|
70
|
-
.tasks td
|
|
83
|
+
.tasks td:last-child {
|
|
71
84
|
position: relative;
|
|
72
85
|
}
|
|
73
86
|
.row-acts {
|