agent-relay-server 0.114.0 → 0.116.0

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 (159) hide show
  1. package/docs/openapi.json +39 -1
  2. package/package.json +3 -3
  3. package/public/assets/MessageBubble-BJllE_2c.js +4 -0
  4. package/public/assets/MessageBubble-BJllE_2c.js.map +1 -0
  5. package/public/assets/PlanGraphPanel-CoK024n9.js +2 -0
  6. package/public/assets/PlanGraphPanel-CoK024n9.js.map +1 -0
  7. package/public/assets/{activity-Dw15HMdi.js → activity-CBjg7NSP.js} +2 -2
  8. package/public/assets/{activity-Dw15HMdi.js.map → activity-CBjg7NSP.js.map} +1 -1
  9. package/public/assets/{agent-profiles-DNtXbS77.js → agent-profiles-DzkjQaCS.js} +2 -2
  10. package/public/assets/{agent-profiles-DNtXbS77.js.map → agent-profiles-DzkjQaCS.js.map} +1 -1
  11. package/public/assets/agents-Bu1i1jH-.js +2 -0
  12. package/public/assets/{agents-DOwnLE42.js.map → agents-Bu1i1jH-.js.map} +1 -1
  13. package/public/assets/{analytics-CRwxJWuV.js → analytics-Cc2GoEq_.js} +3 -3
  14. package/public/assets/{analytics-CRwxJWuV.js.map → analytics-Cc2GoEq_.js.map} +1 -1
  15. package/public/assets/{automation-BQk8XQEj.js → automation-CcMveyvi.js} +2 -2
  16. package/public/assets/{automation-BQk8XQEj.js.map → automation-CcMveyvi.js.map} +1 -1
  17. package/public/assets/{badge-oaCc6hVH.js → badge-BhUZ1cAb.js} +2 -2
  18. package/public/assets/{badge-oaCc6hVH.js.map → badge-BhUZ1cAb.js.map} +1 -1
  19. package/public/assets/branch-state-badge-CYWBVZDI.js +2 -0
  20. package/public/assets/{branch-state-badge-JDaHO2fG.js.map → branch-state-badge-CYWBVZDI.js.map} +1 -1
  21. package/public/assets/{button-Cx0NiToX.js → button-C-V4oij1.js} +2 -2
  22. package/public/assets/{button-Cx0NiToX.js.map → button-C-V4oij1.js.map} +1 -1
  23. package/public/assets/{card-DkHdS68K.js → card-DAkf5Kzw.js} +2 -2
  24. package/public/assets/{card-DkHdS68K.js.map → card-DAkf5Kzw.js.map} +1 -1
  25. package/public/assets/{channels-wQha9YA6.js → channels-IdC7jyLt.js} +2 -2
  26. package/public/assets/{channels-wQha9YA6.js.map → channels-IdC7jyLt.js.map} +1 -1
  27. package/public/assets/chat-CP4x6Gcr.js +2 -0
  28. package/public/assets/{chat-BTmgzO_g.js.map → chat-CP4x6Gcr.js.map} +1 -1
  29. package/public/assets/{connectors-BF-XDm0s.js → connectors-Dngl_FJz.js} +2 -2
  30. package/public/assets/{connectors-BF-XDm0s.js.map → connectors-Dngl_FJz.js.map} +1 -1
  31. package/public/assets/{copy-button-CsCBPQzj.js → copy-button-BStzXgtd.js} +2 -2
  32. package/public/assets/{copy-button-CsCBPQzj.js.map → copy-button-BStzXgtd.js.map} +1 -1
  33. package/public/assets/{dist-BJnh7VkB.js → dist-CBMWGhWc.js} +2 -2
  34. package/public/assets/{dist-BJnh7VkB.js.map → dist-CBMWGhWc.js.map} +1 -1
  35. package/public/assets/{dist-Pak9TL_I.js → dist-CDZZxxJq.js} +2 -2
  36. package/public/assets/{dist-Pak9TL_I.js.map → dist-CDZZxxJq.js.map} +1 -1
  37. package/public/assets/{dist-AbnkNPcD.js → dist-CQ0Z-TDi.js} +2 -2
  38. package/public/assets/{dist-AbnkNPcD.js.map → dist-CQ0Z-TDi.js.map} +1 -1
  39. package/public/assets/{dist-REUlCFee.js → dist-ChDX_t12.js} +2 -2
  40. package/public/assets/{dist-REUlCFee.js.map → dist-ChDX_t12.js.map} +1 -1
  41. package/public/assets/{dist-DLOrqIs-.js → dist-CmFeEXMe.js} +2 -2
  42. package/public/assets/{dist-DLOrqIs-.js.map → dist-CmFeEXMe.js.map} +1 -1
  43. package/public/assets/{dist-DBti5--U.js → dist-Cs8X0P1d.js} +2 -2
  44. package/public/assets/{dist-DBti5--U.js.map → dist-Cs8X0P1d.js.map} +1 -1
  45. package/public/assets/dist-D2jvo5oA.js +2 -0
  46. package/public/assets/{dist-QY_EIkcd.js.map → dist-D2jvo5oA.js.map} +1 -1
  47. package/public/assets/{dist-1g1lCjVb.js → dist-DV83j9tm.js} +2 -2
  48. package/public/assets/{dist-1g1lCjVb.js.map → dist-DV83j9tm.js.map} +1 -1
  49. package/public/assets/{dist-DJpDTmGg.js → dist-DyNJNwpi.js} +2 -2
  50. package/public/assets/{dist-DJpDTmGg.js.map → dist-DyNJNwpi.js.map} +1 -1
  51. package/public/assets/dist-mm7c7nBt.js +2 -0
  52. package/public/assets/{dist-DjJMNrsj.js.map → dist-mm7c7nBt.js.map} +1 -1
  53. package/public/assets/dist-y03IwOrd.js +2 -0
  54. package/public/assets/{dist-C7VlX6hz.js.map → dist-y03IwOrd.js.map} +1 -1
  55. package/public/assets/{es2015-GhJvD7eR.js → es2015-VnZ2kVIz.js} +2 -2
  56. package/public/assets/{es2015-GhJvD7eR.js.map → es2015-VnZ2kVIz.js.map} +1 -1
  57. package/public/assets/formatted-body-impl-CBHoD82a.js +3 -0
  58. package/public/assets/formatted-body-impl-CBHoD82a.js.map +1 -0
  59. package/public/assets/{index-DYwuv_Na.css → index-DcmG5gLR.css} +1 -1
  60. package/public/assets/index-DocqZ4Q0.js +23 -0
  61. package/public/assets/index-DocqZ4Q0.js.map +1 -0
  62. package/public/assets/{input-CPfrBmej.js → input-CtLT7WXi.js} +2 -2
  63. package/public/assets/{input-CPfrBmej.js.map → input-CtLT7WXi.js.map} +1 -1
  64. package/public/assets/{insights-DwS0svZy.js → insights-Du9X-nwA.js} +2 -2
  65. package/public/assets/{insights-DwS0svZy.js.map → insights-Du9X-nwA.js.map} +1 -1
  66. package/public/assets/{integrations-De1_UHQE.js → integrations-BlSadMFC.js} +2 -2
  67. package/public/assets/{integrations-De1_UHQE.js.map → integrations-BlSadMFC.js.map} +1 -1
  68. package/public/assets/{lib-Bi-xeh6t.js → lib-BLoevhQO.js} +3 -3
  69. package/public/assets/{lib-Bi-xeh6t.js.map → lib-BLoevhQO.js.map} +1 -1
  70. package/public/assets/lucide-react-Dc3ZwCBi.js +9 -0
  71. package/public/assets/{lucide-react-De5edQpl.js.map → lucide-react-Dc3ZwCBi.js.map} +1 -1
  72. package/public/assets/{maintenance-B5qrcsDt.js → maintenance-KeCPGZG4.js} +2 -2
  73. package/public/assets/{maintenance-B5qrcsDt.js.map → maintenance-KeCPGZG4.js.map} +1 -1
  74. package/public/assets/{managed-agents-BGMWAUfG.js → managed-agents-YKqARLQn.js} +4 -4
  75. package/public/assets/{managed-agents-BGMWAUfG.js.map → managed-agents-YKqARLQn.js.map} +1 -1
  76. package/public/assets/{markdown-preview-impl-DsZ4Ek80.js → markdown-preview-impl-Bo8ql-lO.js} +2 -2
  77. package/public/assets/{markdown-preview-impl-DsZ4Ek80.js.map → markdown-preview-impl-Bo8ql-lO.js.map} +1 -1
  78. package/public/assets/memory-BlftQACU.js +2 -0
  79. package/public/assets/{memory-CouN7Y4r.js.map → memory-BlftQACU.js.map} +1 -1
  80. package/public/assets/{messages-D9mYFxhU.js → messages-DQu0Np7r.js} +2 -2
  81. package/public/assets/{messages-D9mYFxhU.js.map → messages-DQu0Np7r.js.map} +1 -1
  82. package/public/assets/{orchestrators-B_SD_mhI.js → orchestrators-CW00iA0W.js} +2 -2
  83. package/public/assets/{orchestrators-B_SD_mhI.js.map → orchestrators-CW00iA0W.js.map} +1 -1
  84. package/public/assets/{overview-C8hVsCqz.js → overview-DyiH9eVP.js} +2 -2
  85. package/public/assets/{overview-C8hVsCqz.js.map → overview-DyiH9eVP.js.map} +1 -1
  86. package/public/assets/{pairs-B6vWKXnX.js → pairs-Ee8Npq67.js} +2 -2
  87. package/public/assets/{pairs-B6vWKXnX.js.map → pairs-Ee8Npq67.js.map} +1 -1
  88. package/public/assets/{projects-C2gHOdEY.js → projects-CqeJsfB6.js} +2 -2
  89. package/public/assets/{projects-C2gHOdEY.js.map → projects-CqeJsfB6.js.map} +1 -1
  90. package/public/assets/{prompt-settings-D4SXk0af.js → prompt-settings-0fHJtGD5.js} +2 -2
  91. package/public/assets/{prompt-settings-D4SXk0af.js.map → prompt-settings-0fHJtGD5.js.map} +1 -1
  92. package/public/assets/{react-dom-FNIdlE_z.js → react-dom-cLkVFBsS.js} +2 -2
  93. package/public/assets/{react-dom-FNIdlE_z.js.map → react-dom-cLkVFBsS.js.map} +1 -1
  94. package/public/assets/{registry-CMPhWcx3.js → registry-QTLN8Jy-.js} +2 -2
  95. package/public/assets/{registry-CMPhWcx3.js.map → registry-QTLN8Jy-.js.map} +1 -1
  96. package/public/assets/{security-C1fE4DVg.js → security-B0FTbGXU.js} +2 -2
  97. package/public/assets/{security-C1fE4DVg.js.map → security-B0FTbGXU.js.map} +1 -1
  98. package/public/assets/{select-D9j1MBVi.js → select-DhY0OvwP.js} +2 -2
  99. package/public/assets/{select-D9j1MBVi.js.map → select-DhY0OvwP.js.map} +1 -1
  100. package/public/assets/settings-B2UEpdBi.js +6 -0
  101. package/public/assets/{settings-CduSwUr9.js.map → settings-B2UEpdBi.js.map} +1 -1
  102. package/public/assets/store-DwgQJjEv.js +9 -0
  103. package/public/assets/store-DwgQJjEv.js.map +1 -0
  104. package/public/assets/tasks-BvDfBcxZ.js +2 -0
  105. package/public/assets/tasks-BvDfBcxZ.js.map +1 -0
  106. package/public/assets/{teams-ZEXvcAz_.js → teams-CIqsg55S.js} +2 -2
  107. package/public/assets/{teams-ZEXvcAz_.js.map → teams-CIqsg55S.js.map} +1 -1
  108. package/public/assets/{terminal-viewer-impl-tktfofs3.js → terminal-viewer-impl-Cig30gnt.js} +3 -3
  109. package/public/assets/{terminal-viewer-impl-tktfofs3.js.map → terminal-viewer-impl-Cig30gnt.js.map} +1 -1
  110. package/public/assets/types-DSwhOFcJ.js.map +1 -1
  111. package/public/assets/{use-keyboard-viewport-wzkGlTqU.js → use-keyboard-viewport-DucYmqmP.js} +2 -2
  112. package/public/assets/{use-keyboard-viewport-wzkGlTqU.js.map → use-keyboard-viewport-DucYmqmP.js.map} +1 -1
  113. package/public/assets/{user-avatar-_Dq16BWV.js → user-avatar-Ct6HEqZm.js} +2 -2
  114. package/public/assets/{user-avatar-_Dq16BWV.js.map → user-avatar-Ct6HEqZm.js.map} +1 -1
  115. package/public/assets/{work-queue-Bk8g7t9K.js → work-queue-XWcDwe8G.js} +2 -2
  116. package/public/assets/{work-queue-Bk8g7t9K.js.map → work-queue-XWcDwe8G.js.map} +1 -1
  117. package/public/assets/workspaces-EI4N2N7L.js +3 -0
  118. package/public/assets/{workspaces-D2bYW3zl.js.map → workspaces-EI4N2N7L.js.map} +1 -1
  119. package/public/index.html +21 -21
  120. package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
  121. package/scripts/orchestrator-spawn-smoke.ts +30 -13
  122. package/src/branch-landed.ts +14 -1
  123. package/src/config-store.ts +15 -3
  124. package/src/db/mappers.ts +3 -0
  125. package/src/db/migrations.ts +41 -2
  126. package/src/db/plans.ts +11 -0
  127. package/src/db/schema.ts +3 -1
  128. package/src/db/task-entity.ts +78 -3
  129. package/src/mcp/index.ts +1 -1
  130. package/src/mcp-plan-tools.ts +3 -0
  131. package/src/mcp-task-tools.ts +16 -7
  132. package/src/routes/index.ts +2 -1
  133. package/src/routes/plans.ts +12 -2
  134. package/src/routes/tasks.ts +13 -5
  135. package/src/services/plan-graph.ts +8 -1
  136. package/src/services/spawn-agent.ts +25 -22
  137. package/src/services/task-entity.ts +6 -1
  138. package/public/assets/MessageBubble-CxqPFLGP.js +0 -4
  139. package/public/assets/MessageBubble-CxqPFLGP.js.map +0 -1
  140. package/public/assets/PlanGraphPanel-gQ_lb6zP.js +0 -2
  141. package/public/assets/PlanGraphPanel-gQ_lb6zP.js.map +0 -1
  142. package/public/assets/agents-DOwnLE42.js +0 -2
  143. package/public/assets/branch-state-badge-JDaHO2fG.js +0 -2
  144. package/public/assets/chat-BTmgzO_g.js +0 -2
  145. package/public/assets/dist-C7VlX6hz.js +0 -2
  146. package/public/assets/dist-DjJMNrsj.js +0 -2
  147. package/public/assets/dist-QY_EIkcd.js +0 -2
  148. package/public/assets/formatted-body-impl-2ZWd80_S.js +0 -3
  149. package/public/assets/formatted-body-impl-2ZWd80_S.js.map +0 -1
  150. package/public/assets/index-D4mb_LKw.js +0 -23
  151. package/public/assets/index-D4mb_LKw.js.map +0 -1
  152. package/public/assets/lucide-react-De5edQpl.js +0 -9
  153. package/public/assets/memory-CouN7Y4r.js +0 -2
  154. package/public/assets/settings-CduSwUr9.js +0 -6
  155. package/public/assets/store-Bk6Lku_S.js +0 -9
  156. package/public/assets/store-Bk6Lku_S.js.map +0 -1
  157. package/public/assets/tasks-Bi456f7f.js +0 -2
  158. package/public/assets/tasks-Bi456f7f.js.map +0 -1
  159. package/public/assets/workspaces-D2bYW3zl.js +0 -3
@@ -1,2 +0,0 @@
1
- import{Mt as e,V as t,Xt as n,er as r,un as i}from"./lucide-react-De5edQpl.js";import{f as a,t as o}from"./store-Bk6Lku_S.js";import{t as s}from"./types-DSwhOFcJ.js";import{K as c,d as l,h as u}from"./display-_5kFrHJh.js";import{t as d}from"./badge-oaCc6hVH.js";import{t as f}from"./button-Cx0NiToX.js";import{u as p}from"./index-D4mb_LKw.js";import{o as m,r as h,t as g}from"./card-DkHdS68K.js";var _=r(),v={open:`bg-blue-500/10 text-blue-400 border-blue-500/20`,in_progress:`bg-purple-500/10 text-purple-400 border-purple-500/20`,blocked:`bg-yellow-500/10 text-yellow-400 border-yellow-500/20`,done:`bg-emerald-500/10 text-emerald-400 border-emerald-500/20`,failed:`bg-red-500/10 text-red-400 border-red-500/20`,canceled:`bg-zinc-500/10 text-zinc-400 border-zinc-500/20`,claimed:`bg-emerald-500/10 text-emerald-400 border-emerald-500/20`},y={none:`bg-zinc-500/10 text-zinc-400`,uncommitted:`bg-yellow-500/10 text-yellow-400`,"committed-on-branch":`bg-blue-500/10 text-blue-400`,"landed-on-main":`bg-emerald-500/10 text-emerald-400`,deploying:`bg-purple-500/10 text-purple-400`,deployed:`bg-teal-500/10 text-teal-400`},b={none:`None`,uncommitted:`Uncommitted`,"committed-on-branch":`On Branch`,"landed-on-main":`Landed`,deploying:`Deploying`,deployed:`Deployed`},x=[`open`,`in_progress`,`blocked`,`done`,`failed`,`canceled`];function S(){let e=a(),n=o(e=>e.deliverableTasks),r=o(e=>e.deliverableStatusFilter),c=o(e=>e.deliverableStageFilter),u=o(e=>e.agentsById),m=o(e=>e.set),h=o(e=>e.fetchDeliverableTasks),g=o(e=>e.openTaskDetail),v=o(e=>e.openTaskCreate);function y(e){m({deliverableStatusFilter:e}),h()}function S(e){m({deliverableStageFilter:e}),h()}function w(e){return e?u[e]?l(u[e]):e.slice(-10):null}return(0,_.jsxs)(`div`,{className:`space-y-4`,children:[(0,_.jsxs)(`div`,{className:`flex items-center justify-between flex-wrap gap-2`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,_.jsx)(i,{className:`w-5 h-5 text-muted-foreground`}),(0,_.jsx)(`h2`,{className:`text-lg font-semibold`,children:`Tasks`}),(0,_.jsx)(d,{variant:`secondary`,children:n.length})]}),(0,_.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,_.jsxs)(f,{size:`sm`,className:`h-8 gap-1.5`,onClick:v,children:[(0,_.jsx)(t,{className:`w-3.5 h-3.5`}),`New Task`]}),(0,_.jsxs)(`select`,{className:`rounded-md border border-input bg-background px-3 py-1.5 text-sm`,value:r,onChange:e=>y(e.target.value),children:[(0,_.jsx)(`option`,{value:``,children:`All statuses`}),x.map(e=>(0,_.jsx)(`option`,{value:e,children:e},e))]}),(0,_.jsxs)(`select`,{className:`rounded-md border border-input bg-background px-3 py-1.5 text-sm`,value:c,onChange:e=>S(e.target.value),children:[(0,_.jsx)(`option`,{value:``,children:`All stages`}),s.map(e=>(0,_.jsx)(`option`,{value:e,children:b[e]??e},e))]})]})]}),(0,_.jsx)(p,{className:`h-[calc(100dvh-11rem)]`,children:(0,_.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2 lg:grid-cols-3 pr-2`,children:[n.length===0&&(0,_.jsx)(`div`,{className:`col-span-full text-center text-muted-foreground py-16 text-sm`,children:`No deliverable tasks`}),n.map(t=>(0,_.jsx)(C,{task:t,now:e,agentLabel:w,onOpen:()=>g(t)},t.id))]})})]})}function C({task:t,now:r,agentLabel:i,onOpen:a}){let o=v[t.status]??`bg-zinc-500/10 text-zinc-400 border-zinc-500/20`,s=t.deliverableStage?y[t.deliverableStage]??`bg-zinc-500/10 text-zinc-400`:``,l=i(t.ownerAgentId);return(0,_.jsxs)(g,{className:`flex flex-col cursor-pointer hover:border-zinc-600 transition-colors min-w-0`,onClick:a,children:[(0,_.jsxs)(m,{className:`py-3 px-4 pb-0 space-y-0`,children:[(0,_.jsxs)(`div`,{className:`flex items-start gap-2 justify-between`,children:[(0,_.jsxs)(`div`,{className:`flex gap-1.5 flex-wrap`,children:[(0,_.jsx)(d,{variant:`outline`,className:`text-xs px-1.5 py-0 border ${o}`,children:t.status}),t.deliverableStage&&t.deliverableStage!==`none`&&(0,_.jsx)(d,{variant:`secondary`,className:`text-xs px-1.5 py-0 ${s}`,children:b[t.deliverableStage]??t.deliverableStage})]}),(0,_.jsxs)(`span`,{className:`text-xs text-muted-foreground shrink-0`,children:[`T`,t.id]})]}),(0,_.jsx)(`p`,{className:`font-medium text-sm mt-2 line-clamp-2`,children:t.title})]}),(0,_.jsxs)(h,{className:`px-4 py-3 flex-1 flex flex-col justify-between gap-2`,children:[(0,_.jsxs)(`div`,{className:`space-y-0.5 text-xs text-muted-foreground`,children:[l&&(0,_.jsxs)(`div`,{className:`flex items-center gap-1 min-w-0`,children:[(0,_.jsx)(`span`,{className:`text-muted-foreground/60 shrink-0`,children:`owner`}),(0,_.jsx)(`span`,{className:`truncate min-w-0`,children:l})]}),t.branch&&(0,_.jsxs)(`div`,{className:`flex items-center gap-1 min-w-0`,children:[(0,_.jsx)(e,{className:`w-3 h-3 shrink-0`}),(0,_.jsx)(`span`,{className:`font-mono truncate min-w-0`,children:t.branch})]}),(0,_.jsxs)(`div`,{className:`flex items-center gap-1`,title:u(t.updatedAt),children:[(0,_.jsx)(`span`,{className:`text-muted-foreground/60`,children:`updated`}),(0,_.jsx)(`span`,{children:c(r,t.updatedAt)})]})]}),(0,_.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,_.jsx)(f,{size:`sm`,variant:`outline`,className:`h-7 text-xs`,onClick:e=>{e.stopPropagation(),a()},children:`Details`}),t.externalUrl&&(0,_.jsx)(`a`,{href:t.externalUrl,target:`_blank`,rel:`noopener noreferrer`,className:`ml-auto`,onClick:e=>e.stopPropagation(),children:(0,_.jsx)(f,{size:`sm`,variant:`ghost`,className:`h-7 px-2`,children:(0,_.jsx)(n,{className:`w-3.5 h-3.5`})})})]})]})]})}export{S as TasksView};
2
- //# sourceMappingURL=tasks-Bi456f7f.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks-Bi456f7f.js","names":[],"sources":["../../dashboard/src/components/views/tasks.tsx"],"sourcesContent":["import { useRelayStore, useNow } from '@/store'\nimport { Card, CardContent, CardHeader } from '@/components/ui/card'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { ScrollArea } from '@/components/ui/scroll-area'\nimport { Separator } from '@/components/ui/separator'\nimport { ClipboardList, ExternalLink, GitBranch, Plus } from 'lucide-react'\nimport { displayName, timeAgo, fmtTime } from '@/lib/display'\nimport { TASK_DELIVERABLE_STAGES } from 'agent-relay-sdk/types'\nimport type { Task } from '@/types'\n\nconst STATUS_COLORS: Record<string, string> = {\n open: 'bg-blue-500/10 text-blue-400 border-blue-500/20',\n in_progress: 'bg-purple-500/10 text-purple-400 border-purple-500/20',\n blocked: 'bg-yellow-500/10 text-yellow-400 border-yellow-500/20',\n done: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20',\n failed: 'bg-red-500/10 text-red-400 border-red-500/20',\n canceled: 'bg-zinc-500/10 text-zinc-400 border-zinc-500/20',\n claimed: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20',\n}\n\nconst STAGE_COLORS: Record<string, string> = {\n none: 'bg-zinc-500/10 text-zinc-400',\n uncommitted: 'bg-yellow-500/10 text-yellow-400',\n 'committed-on-branch': 'bg-blue-500/10 text-blue-400',\n 'landed-on-main': 'bg-emerald-500/10 text-emerald-400',\n deploying: 'bg-purple-500/10 text-purple-400',\n deployed: 'bg-teal-500/10 text-teal-400',\n}\n\nconst STAGE_LABELS: Record<string, string> = {\n none: 'None',\n uncommitted: 'Uncommitted',\n 'committed-on-branch': 'On Branch',\n 'landed-on-main': 'Landed',\n deploying: 'Deploying',\n deployed: 'Deployed',\n}\n\nconst DELIVERABLE_STATUS_OPTIONS = ['open', 'in_progress', 'blocked', 'done', 'failed', 'canceled']\n\nexport function TasksView() {\n const now = useNow()\n const deliverableTasks = useRelayStore((s) => s.deliverableTasks)\n const deliverableStatusFilter = useRelayStore((s) => s.deliverableStatusFilter)\n const deliverableStageFilter = useRelayStore((s) => s.deliverableStageFilter)\n const agentsById = useRelayStore((s) => s.agentsById)\n const set = useRelayStore((s) => s.set)\n const fetchDeliverableTasks = useRelayStore((s) => s.fetchDeliverableTasks)\n const openTaskDetail = useRelayStore((s) => s.openTaskDetail)\n const openTaskCreate = useRelayStore((s) => s.openTaskCreate)\n\n function handleStatusFilter(value: string) {\n set({ deliverableStatusFilter: value })\n void fetchDeliverableTasks()\n }\n\n function handleStageFilter(value: string) {\n set({ deliverableStageFilter: value })\n void fetchDeliverableTasks()\n }\n\n function agentLabel(id: string | undefined) {\n if (!id) return null\n return agentsById[id] ? displayName(agentsById[id]) : id.slice(-10)\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-2\">\n <ClipboardList className=\"w-5 h-5 text-muted-foreground\" />\n <h2 className=\"text-lg font-semibold\">Tasks</h2>\n <Badge variant=\"secondary\">{deliverableTasks.length}</Badge>\n </div>\n <div className=\"flex items-center gap-2 flex-wrap\">\n <Button size=\"sm\" className=\"h-8 gap-1.5\" onClick={openTaskCreate}>\n <Plus className=\"w-3.5 h-3.5\" />\n New Task\n </Button>\n <select\n className=\"rounded-md border border-input bg-background px-3 py-1.5 text-sm\"\n value={deliverableStatusFilter}\n onChange={(e) => handleStatusFilter(e.target.value)}\n >\n <option value=\"\">All statuses</option>\n {DELIVERABLE_STATUS_OPTIONS.map((s) => <option key={s} value={s}>{s}</option>)}\n </select>\n <select\n className=\"rounded-md border border-input bg-background px-3 py-1.5 text-sm\"\n value={deliverableStageFilter}\n onChange={(e) => handleStageFilter(e.target.value)}\n >\n <option value=\"\">All stages</option>\n {TASK_DELIVERABLE_STAGES.map((s) => <option key={s} value={s}>{STAGE_LABELS[s] ?? s}</option>)}\n </select>\n </div>\n </div>\n\n <ScrollArea className=\"h-[calc(100dvh-11rem)]\">\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-3 pr-2\">\n {deliverableTasks.length === 0 && (\n <div className=\"col-span-full text-center text-muted-foreground py-16 text-sm\">No deliverable tasks</div>\n )}\n {deliverableTasks.map((task) => (\n <DeliverableTaskCard\n key={task.id}\n task={task}\n now={now}\n agentLabel={agentLabel}\n onOpen={() => openTaskDetail(task)}\n />\n ))}\n </div>\n </ScrollArea>\n </div>\n )\n}\n\nfunction DeliverableTaskCard({\n task, now, agentLabel, onOpen,\n}: {\n task: Task\n now: number\n agentLabel: (id: string | undefined) => string | null\n onOpen: () => void\n}) {\n const statusClass = STATUS_COLORS[task.status] ?? 'bg-zinc-500/10 text-zinc-400 border-zinc-500/20'\n const stageClass = task.deliverableStage ? (STAGE_COLORS[task.deliverableStage] ?? 'bg-zinc-500/10 text-zinc-400') : ''\n const owner = agentLabel(task.ownerAgentId)\n\n return (\n <Card\n className=\"flex flex-col cursor-pointer hover:border-zinc-600 transition-colors min-w-0\"\n onClick={onOpen}\n >\n <CardHeader className=\"py-3 px-4 pb-0 space-y-0\">\n <div className=\"flex items-start gap-2 justify-between\">\n <div className=\"flex gap-1.5 flex-wrap\">\n <Badge variant=\"outline\" className={`text-xs px-1.5 py-0 border ${statusClass}`}>{task.status}</Badge>\n {task.deliverableStage && task.deliverableStage !== 'none' && (\n <Badge variant=\"secondary\" className={`text-xs px-1.5 py-0 ${stageClass}`}>\n {STAGE_LABELS[task.deliverableStage] ?? task.deliverableStage}\n </Badge>\n )}\n </div>\n <span className=\"text-xs text-muted-foreground shrink-0\">T{task.id}</span>\n </div>\n <p className=\"font-medium text-sm mt-2 line-clamp-2\">{task.title}</p>\n </CardHeader>\n <CardContent className=\"px-4 py-3 flex-1 flex flex-col justify-between gap-2\">\n <div className=\"space-y-0.5 text-xs text-muted-foreground\">\n {owner && (\n <div className=\"flex items-center gap-1 min-w-0\">\n <span className=\"text-muted-foreground/60 shrink-0\">owner</span>\n <span className=\"truncate min-w-0\">{owner}</span>\n </div>\n )}\n {task.branch && (\n <div className=\"flex items-center gap-1 min-w-0\">\n <GitBranch className=\"w-3 h-3 shrink-0\" />\n <span className=\"font-mono truncate min-w-0\">{task.branch}</span>\n </div>\n )}\n <div className=\"flex items-center gap-1\" title={fmtTime(task.updatedAt)}>\n <span className=\"text-muted-foreground/60\">updated</span>\n <span>{timeAgo(now, task.updatedAt)}</span>\n </div>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Button size=\"sm\" variant=\"outline\" className=\"h-7 text-xs\" onClick={(e) => { e.stopPropagation(); onOpen() }}>\n Details\n </Button>\n {task.externalUrl && (\n <a href={task.externalUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"ml-auto\" onClick={(e) => e.stopPropagation()}>\n <Button size=\"sm\" variant=\"ghost\" className=\"h-7 px-2\">\n <ExternalLink className=\"w-3.5 h-3.5\" />\n </Button>\n </a>\n )}\n </div>\n </CardContent>\n </Card>\n )\n}\n"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{Jn as t,Jt as n,Kt as r,L as i,Mt as a,Rt as o,Sn as s,Tn as c,Un as l,Vt as u,Wt as d,Z as f,a as p,cn as m,er as h,g,h as _,jt as v,kt as y,pr as b,tr as x,wn as ee}from"./lucide-react-De5edQpl.js";import{f as S,t as C}from"./store-Bk6Lku_S.js";import{l as w}from"./types-DSwhOFcJ.js";import{K as T,d as te}from"./display-_5kFrHJh.js";import{t as E}from"./badge-oaCc6hVH.js";import{t as D}from"./button-Cx0NiToX.js";import{t as O}from"./copy-button-CsCBPQzj.js";import{d as k}from"./index-D4mb_LKw.js";import{o as A,r as j,s as M,t as N}from"./card-DkHdS68K.js";var P=e(b(),1),F=h(),I=new Set([`active`,`ready`,`conflict`,`review_requested`,`merge_planned`,`cleanup_requested`]),L=new Set(w),R=`__all__`,z=`__unassigned__`;function B(e,t){let n=new Map;for(let t of e){let e=t.repoRoot||t.sourceCwd||`unknown repo`;n.set(e,[...n.get(e)||[],t])}return[...n.entries()].map(([e,n])=>({repoRoot:e,workspaces:n.sort(t)})).sort((e,t)=>e.repoRoot.localeCompare(t.repoRoot))}function V(e,t){let n=new Map;for(let t of e){let e=t.projectSlug||t.repoRoot||t.sourceCwd||`unassigned`;n.set(e,[...n.get(e)||[],t])}return[...n.entries()].map(([e,n])=>{let r=n[0],i=!r.projectId;return{key:e,title:i?r.repoRoot||r.sourceCwd||`unknown repo`:r.projectTitle||r.projectSlug||r.repoRoot,...r.projectId?{projectId:r.projectId}:{},...r.projectSlug?{projectSlug:r.projectSlug}:{},unassigned:i,repoGroups:B(n,t)}}).sort((e,t)=>{let n=e.repoGroups.some(e=>e.workspaces.some(e=>I.has(e.status)));return n===t.repoGroups.some(e=>e.workspaces.some(e=>I.has(e.status)))?e.title.localeCompare(t.title):n?-1:1})}function H(e,t,n){let r=t===`all`?e:t===`cleaned`?e.filter(e=>L.has(e.status)):e.filter(e=>!L.has(e.status));return n===`__all__`?r:n===`__unassigned__`?r.filter(e=>!e.projectId):r.filter(e=>e.projectId===n)}function U({group:e,renderWorkspaceRow:t}){let n=e.repoGroups.flatMap(e=>e.workspaces),r=n.filter(e=>I.has(e.status)).length,i=n.filter(e=>e.status===`ready`||e.status===`review_requested`||e.status===`merge_planned`).length,a=n.filter(e=>e.status===`conflict`).length,s=e.repoGroups.length>1;return(0,F.jsxs)(N,{children:[(0,F.jsx)(A,{className:`px-4 py-3`,children:(0,F.jsx)(`div`,{className:`flex min-w-0 items-start gap-3`,children:(0,F.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,F.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,F.jsx)(M,{className:`truncate text-sm font-medium`,title:e.title,children:e.title}),e.unassigned&&(0,F.jsx)(E,{variant:`outline`,className:`text-[10px]`,children:`Unassigned`})]}),(0,F.jsxs)(`div`,{className:`mt-1 flex flex-wrap gap-1.5`,children:[(0,F.jsxs)(E,{variant:`outline`,className:`text-[10px]`,children:[n.length,` total`]}),(0,F.jsxs)(E,{variant:`outline`,className:`text-[10px]`,children:[r,` live`]}),i>0&&(0,F.jsxs)(E,{variant:`outline`,className:`border-emerald-500/20 text-emerald-400 text-[10px]`,children:[i,` merge signal`]}),a>0&&(0,F.jsxs)(E,{variant:`outline`,className:`border-red-500/20 text-red-400 text-[10px]`,children:[a,` conflict`]})]})]})})}),(0,F.jsx)(j,{className:`p-0`,children:e.repoGroups.map(e=>(0,F.jsxs)(`div`,{className:`border-t border-border first:border-t-0`,children:[s&&(0,F.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-dashed border-border/80 px-3 py-2`,children:[(0,F.jsx)(o,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`}),(0,F.jsx)(`span`,{className:`truncate font-mono text-[11px] text-muted-foreground`,title:e.repoRoot,children:e.repoRoot})]}),e.workspaces.map(e=>t(e))]},e.repoRoot))})]})}function W(e){let t=e.split(`/`).filter(Boolean);return t.length<=3?e||`-`:`/${t.slice(-3).join(`/`)}`}function G(){let e=C(e=>e.workspaceOrphans),t=C(e=>e.fetchWorkspaceOrphans),n=C(e=>e.reclaimWorkspaceOrphan);return(0,P.useEffect)(()=>{t()},[t]),e.length?(0,F.jsxs)(N,{className:`border-amber-500/30`,children:[(0,F.jsxs)(A,{className:`px-4 py-3`,children:[(0,F.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,F.jsx)(f,{className:`h-4 w-4 text-amber-400`}),(0,F.jsx)(M,{className:`text-sm font-medium`,children:`Orphaned worktrees`}),(0,F.jsx)(E,{variant:`outline`,className:`border-amber-500/30 text-amber-400 text-[10px]`,children:e.length}),(0,F.jsx)(D,{size:`icon-sm`,variant:`ghost`,className:`ml-auto h-6 w-6`,title:`Rescan`,onClick:()=>void t(),children:(0,F.jsx)(i,{className:`h-3.5 w-3.5`})})]}),(0,F.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Agent worktrees on disk with no live workspace. Reclaim removes them from the host.`})]}),(0,F.jsx)(j,{className:`p-0`,children:e.map(e=>(0,F.jsxs)(`div`,{className:`flex items-center gap-3 border-t border-border px-4 py-2 text-xs`,children:[(0,F.jsx)(o,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`}),(0,F.jsx)(`span`,{className:`truncate font-medium`,title:e.branch,children:e.branch||`(detached)`}),(0,F.jsx)(`span`,{className:`truncate font-mono text-muted-foreground`,title:e.worktreePath,children:W(e.worktreePath)}),e.hadTerminalRow&&(0,F.jsx)(E,{variant:`outline`,className:`text-[10px]`,children:`cleanup failed`}),(0,F.jsxs)(D,{size:`sm`,variant:`outline`,className:`ml-auto h-7 text-xs`,onClick:()=>void n(e),children:[(0,F.jsx)(f,{className:`mr-1 h-3.5 w-3.5`}),`Reclaim`]})]},e.worktreePath))})]}):null}function K(e,t,n){if(n){let t=e.find(e=>e.branch&&e.branch===n);if(t)return t}if(!t)return null;let r=e.filter(e=>e.ownerAgentId===t);return r.length===0?null:r.length===1?r[0]:null}var q=new Set([`active`,`ready`,`conflict`,`review_requested`,`merge_planned`]),J=new Set([`active`,`ready`,`review_requested`,`merge_planned`,`conflict`]),Y={active:`bg-blue-500/10 text-blue-400 border-blue-500/20`,ready:`bg-emerald-500/10 text-emerald-400 border-emerald-500/20`,conflict:`bg-red-500/10 text-red-400 border-red-500/20`,review_requested:`bg-yellow-500/10 text-yellow-400 border-yellow-500/20`,merge_planned:`bg-indigo-500/10 text-indigo-400 border-indigo-500/20`,merged:`bg-violet-500/10 text-violet-400 border-violet-500/20`,abandoned:`bg-zinc-500/10 text-zinc-400 border-zinc-500/20`,cleanup_requested:`bg-orange-500/10 text-orange-400 border-orange-500/20`,cleaned:`bg-zinc-500/10 text-zinc-400 border-zinc-500/20`},X={active:`active`,ready:`ready`,conflict:`conflict`,review_requested:`review`,merge_planned:`merge planned`,merged:`merged`,abandoned:`abandoned`,cleanup_requested:`cleanup`,cleaned:`cleaned`},Z={conflict:0,ready:1,review_requested:2,merge_planned:3,active:4,cleanup_requested:5,merged:6,abandoned:7,cleaned:8};function Q(e,t){return e?te(e):t||`-`}function ne(e){let t=e.split(`/`).filter(Boolean);return t.length<=3?e||`-`:`/${t.slice(-3).join(`/`)}`}function re(e){return Y[e]||`bg-zinc-500/10 text-zinc-400 border-zinc-500/20`}function ie(e,t){let n=(Z[e.status]??99)-(Z[t.status]??99);return n===0?Number(t.updatedAt||0)-Number(e.updatedAt||0):n}function ae({workspace:e,expanded:t,onToggleDetails:r}){let i=C(e=>e.workspaceAction),a=C(e=>e.purgeWorkspace),l=C(e=>e.fetchWorkspaceMergePreview),d=C(e=>e.openFilesAt),f=e.status===`cleaned`||e.status===`merged`||e.status===`abandoned`,m=f||e.status===`cleanup_requested`,h=e.worktreePath||e.sourceCwd||e.repoRoot,_=C(t=>t.workspaceGitState[e.id]),v=!!_&&_.available!==!1&&_.landed===!0,b=e.mode===`isolated`&&!!e.worktreePath&&J.has(e.status)&&!v;async function x(){await l(e.id),await i(e.id,`merge`)}return(0,F.jsxs)(`div`,{className:`flex flex-wrap justify-end gap-1.5`,children:[(0,F.jsx)(D,{size:`icon-sm`,variant:`ghost`,title:t?`Hide details`:`Show diff & timeline`,onClick:r,children:t?(0,F.jsx)(ee,{className:`h-3.5 w-3.5`}):(0,F.jsx)(s,{className:`h-3.5 w-3.5`})}),(0,F.jsx)(D,{size:`icon-sm`,variant:`ghost`,title:`Open workspace`,disabled:!h||e.status===`cleaned`,onClick:()=>void d({path:h}),children:(0,F.jsx)(o,{className:`h-3.5 w-3.5`})}),(0,F.jsx)(O,{value:h,label:`Copy path`,copiedLabel:`Copied path`,size:`icon-sm`,variant:`ghost`,disabled:!h}),(0,F.jsx)(D,{size:`icon-sm`,variant:`outline`,title:`Mark ready`,disabled:m||e.status===`ready`,onClick:()=>void i(e.id,`ready`),children:(0,F.jsx)(c,{className:`h-3.5 w-3.5`})}),(0,F.jsx)(D,{size:`icon-sm`,variant:`outline`,title:`Request review`,disabled:m||e.status===`review_requested`,onClick:()=>void i(e.id,`request-review`),children:(0,F.jsx)(n,{className:`h-3.5 w-3.5`})}),(0,F.jsx)(D,{size:`icon-sm`,variant:`outline`,title:`Mark merge planned`,disabled:m||e.status===`merge_planned`,onClick:()=>void i(e.id,`merge-plan`),children:(0,F.jsx)(u,{className:`h-3.5 w-3.5`})}),(0,F.jsx)(D,{size:`icon-sm`,variant:`default`,title:v?`Already merged into base — nothing to land`:`Merge & land work`,disabled:!b,onClick:()=>void x(),children:(0,F.jsx)(y,{className:`h-3.5 w-3.5`})}),(0,F.jsx)(D,{size:`icon-sm`,variant:`outline`,title:`Request cleanup (removes the worktree on the host)`,disabled:e.status===`cleaned`||e.status===`cleanup_requested`,onClick:()=>void i(e.id,`cleanup`),children:(0,F.jsx)(g,{className:`h-3.5 w-3.5`})}),f&&(0,F.jsx)(D,{size:`icon-sm`,variant:`ghost`,title:`Purge record (clears the row, does not touch disk)`,onClick:()=>void a(e.id),children:(0,F.jsx)(p,{className:`h-3.5 w-3.5`})})]})}function oe({workspace:e,unmerged:t}){let n=C(t=>t.workspaceMergePreview[e.id]),r=C(e=>e.fetchWorkspaceMergePreview),i=t>0&&J.has(e.status);return(0,P.useEffect)(()=>{i&&n===void 0&&r(e.id)},[i,n,e.id,r]),!i||n===void 0||n.available===!1?null:n.conflict?(0,F.jsxs)(`span`,{className:`flex items-center gap-0.5 text-amber-400`,title:`Merging into ${n.baseRef||`base`} would conflict — resolve before merging`,children:[(0,F.jsx)(_,{className:`h-3 w-3`}),`conflict`]}):n.conflict===!1?(0,F.jsxs)(`span`,{className:`flex items-center gap-0.5 text-emerald-400`,title:`Clean to merge via ${n.strategy===`pr`?`PR`:`rebase + fast-forward`} into ${n.baseRef||`base`}`,children:[(0,F.jsx)(c,{className:`h-3 w-3`}),n.strategy===`pr`?`PR ready`:`clean`]}):null}function se({workspace:e}){let n=S(),r=C(t=>t.workspaceGitState[e.id]),a=C(e=>e.fetchWorkspaceGitState),o=e.mode===`isolated`&&!!e.worktreePath&&q.has(e.status);if((0,P.useEffect)(()=>{o&&r===void 0&&a(e.id)},[o,r,e.id,a]),!o)return null;let s=(0,F.jsx)(D,{size:`icon-sm`,variant:`ghost`,className:`h-5 w-5`,title:`Refresh git state`,onClick:()=>void a(e.id),children:(0,F.jsx)(i,{className:`h-3 w-3`})});if(r===void 0)return(0,F.jsx)(`div`,{className:`flex items-center gap-1 text-[11px] text-muted-foreground`,children:`Loading git state…`});if(r.available===!1)return(0,F.jsxs)(`div`,{className:`flex items-center gap-1 text-[11px] text-muted-foreground`,title:r.reason,children:[(0,F.jsx)(`span`,{children:`git state unavailable`}),s]});if(r.missing)return(0,F.jsxs)(`div`,{className:`flex items-center gap-1 text-[11px] text-muted-foreground`,children:[`worktree gone `,s]});if(r.error)return(0,F.jsxs)(`div`,{className:`flex items-center gap-1 text-[11px] text-red-400`,title:r.error,children:[(0,F.jsx)(`span`,{children:`git error`}),s]});let u=r.ahead??0,f=r.landed===!0,p=f?0:r.unmergedAhead??u,m=r.behind??0,h=r.dirtyCount??0,g=p===0&&h===0&&!f,_=r.lastCommit;return(0,F.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,F.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-2 gap-y-0.5 text-[11px]`,children:[g?(0,F.jsx)(`span`,{className:`text-muted-foreground`,children:`no unmerged work`}):(0,F.jsxs)(F.Fragment,{children:[f?(0,F.jsxs)(`span`,{className:`flex items-center gap-0.5 text-emerald-400`,title:`Work already landed in ${r.baseRef||`base`} via squash/cherry-pick — safe to clean up`,children:[(0,F.jsx)(c,{className:`h-3 w-3`}),`landed`]}):(0,F.jsxs)(`span`,{className:p>0?`flex items-center text-emerald-400`:`flex items-center text-muted-foreground`,title:u===p?`${p} commit(s) ahead of base`:`${p} unmerged commit(s) (${u} ahead of base)`,children:[(0,F.jsx)(l,{className:`h-3 w-3`}),p]}),(0,F.jsxs)(`span`,{className:m>0?`flex items-center text-amber-400`:`flex items-center text-muted-foreground`,title:`${m} commit(s) behind base`,children:[(0,F.jsx)(t,{className:`h-3 w-3`}),m]}),h>0&&(0,F.jsxs)(`span`,{className:`flex items-center text-orange-400`,title:`${h} uncommitted change(s)`,children:[(0,F.jsx)(d,{className:`h-3 w-3`}),h]}),!f&&(0,F.jsx)(oe,{workspace:e,unmerged:p})]}),s]}),_&&(0,F.jsxs)(`div`,{className:`flex min-w-0 items-center gap-1 text-[11px] text-muted-foreground`,title:`${_.sha.slice(0,8)} — ${_.message}`,children:[(0,F.jsx)(v,{className:`h-3 w-3 shrink-0`}),(0,F.jsx)(`span`,{className:`truncate`,children:_.message||_.sha.slice(0,8)}),_.at?(0,F.jsxs)(`span`,{className:`shrink-0 opacity-70`,children:[`· `,T(n,_.at)]}):null]})]})}function ce({workspace:e}){let t=S(),n=typeof e.metadata?.mergedAt==`number`?e.metadata.mergedAt:void 0,r=[{label:`created`,at:e.createdAt},{label:`ready`,at:e.readyAt},{label:`merged`,at:n},{label:`cleaned`,at:e.cleanedAt}].filter(e=>typeof e.at==`number`&&e.at>0);return(0,F.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px] text-muted-foreground`,children:[(0,F.jsxs)(`span`,{className:`flex items-center gap-1 font-medium text-foreground`,children:[(0,F.jsx)(m,{className:`h-3 w-3`}),`Timeline`]}),r.map((e,n)=>(0,F.jsxs)(`span`,{className:`flex items-center gap-1`,children:[n>0&&(0,F.jsx)(`span`,{className:`opacity-40`,children:`→`}),(0,F.jsx)(`span`,{className:`text-foreground`,children:e.label}),(0,F.jsx)(`span`,{title:new Date(e.at).toLocaleString(),children:T(t,e.at)})]},e.label))]})}function le(e){return e.startsWith(`+`)&&!e.startsWith(`+++`)?`text-emerald-400`:e.startsWith(`-`)&&!e.startsWith(`---`)?`text-red-400`:e.startsWith(`@@`)?`text-cyan-400`:e.startsWith(`diff `)||e.startsWith(`index `)||e.startsWith(`+++`)||e.startsWith(`---`)?`text-muted-foreground`:``}function ue({workspace:e}){let t=C(t=>t.workspaceDiff[e.id]),n=C(e=>e.fetchWorkspaceDiff),a=e.mode===`isolated`&&!!e.worktreePath;if((0,P.useEffect)(()=>{a&&t===void 0&&n(e.id)},[a,t,e.id,n]),!a)return null;if(t===void 0)return(0,F.jsx)(`div`,{className:`text-[11px] text-muted-foreground`,children:`Loading diff…`});if(t.available===!1)return(0,F.jsxs)(`div`,{className:`text-[11px] text-muted-foreground`,children:[`Diff unavailable`,t.reason?`: ${t.reason}`:``]});if(t.missing)return(0,F.jsx)(`div`,{className:`text-[11px] text-muted-foreground`,children:`Worktree no longer on disk`});if(t.error)return(0,F.jsxs)(`div`,{className:`text-[11px] text-red-400`,children:[`Diff error: `,t.error]});if(!t.files.length)return(0,F.jsxs)(`div`,{className:`text-[11px] text-muted-foreground`,children:[`No committed changes against `,t.baseRef||`base`]});let o=(0,F.jsx)(D,{size:`icon-sm`,variant:`ghost`,className:`h-5 w-5`,title:`Refresh diff`,onClick:()=>void n(e.id),children:(0,F.jsx)(i,{className:`h-3 w-3`})});return(0,F.jsxs)(`div`,{className:`space-y-1`,children:[(0,F.jsxs)(`div`,{className:`flex items-center gap-2 text-[11px] font-medium`,children:[(0,F.jsx)(r,{className:`h-3 w-3`}),(0,F.jsxs)(`span`,{children:[t.files.length,` file`,t.files.length===1?``:`s`,` vs `,t.baseRef||`base`]}),o]}),(0,F.jsx)(`ul`,{className:`space-y-0.5 text-[11px]`,children:t.files.map(e=>(0,F.jsxs)(`li`,{className:`flex items-center gap-2 font-mono`,children:[(0,F.jsx)(`span`,{className:`truncate`,title:e.path,children:e.path}),e.binary?(0,F.jsx)(`span`,{className:`shrink-0 text-muted-foreground`,children:`binary`}):(0,F.jsxs)(`span`,{className:`shrink-0`,children:[(0,F.jsxs)(`span`,{className:`text-emerald-400`,children:[`+`,e.additions??0]}),` `,(0,F.jsxs)(`span`,{className:`text-red-400`,children:[`−`,e.deletions??0]})]})]},e.path))}),t.patch&&(0,F.jsxs)(`pre`,{className:`max-h-80 overflow-auto rounded border border-border bg-muted/30 p-2 text-[10.5px] leading-relaxed`,children:[t.patch.split(`
2
- `).map((e,t)=>(0,F.jsx)(`div`,{className:le(e),children:e||` `},t)),t.truncated&&(0,F.jsx)(`div`,{className:`mt-1 text-muted-foreground`,children:`… patch truncated`})]})]})}function $({workspace:e}){return(0,F.jsxs)(`div`,{className:`space-y-3 border-t border-dashed border-border bg-muted/20 px-3 py-3`,children:[(0,F.jsx)(ce,{workspace:e}),(0,F.jsx)(ue,{workspace:e})]})}function de(e){let t=e.match(/\/pull\/(\d+)/);return t?`PR #${t[1]}`:`View PR`}function fe({workspace:e}){let t=e.metadata?.mergeResult,n=t?.prUrl,r=t?.error||e.metadata?.mergeError;return!n&&!r?null:(0,F.jsxs)(F.Fragment,{children:[n&&(0,F.jsxs)(`a`,{href:n,target:`_blank`,rel:`noreferrer`,title:n,className:`inline-flex items-center gap-0.5 rounded border border-violet-500/30 px-1.5 py-0 text-[10px] text-violet-400 hover:text-violet-300`,children:[(0,F.jsx)(y,{className:`h-2.5 w-2.5`}),de(n)]}),r&&(0,F.jsxs)(E,{variant:`outline`,className:`max-w-[16rem] border-amber-500/30 text-amber-400 text-[10px]`,title:r,children:[(0,F.jsx)(_,{className:`mr-0.5 h-2.5 w-2.5 shrink-0`}),(0,F.jsxs)(`span`,{className:`truncate`,children:[`merge: `,r]})]})]})}function pe({workspace:e}){let t=S(),[n,r]=(0,P.useState)(!1),i=C(e=>e.agentsById),o=C(t=>t.workspaceFocusId===e.id),s=C(e=>e.deliverableTasks),c=C(e=>e.openTaskDetail),l=e.ownerAgentId?i[e.ownerAgentId]:void 0,u=K(s,e.ownerAgentId,e.branch),d=C(t=>t.workspaceGitState[e.id]),f=!!d&&d.available!==!1&&d.landed===!0,p=u!=null&&(e.status===`merged`||e.status===`cleaned`||e.status===`abandoned`||f),m=e.stewardAgentId?i[e.stewardAgentId]:void 0,h=e.worktreePath||e.sourceCwd||e.repoRoot,g=(0,P.useRef)(null);return(0,P.useEffect)(()=>{o&&g.current?.scrollIntoView({behavior:`smooth`,block:`center`})},[o]),(0,F.jsxs)(`div`,{ref:g,className:`border-t border-border ${o?`bg-primary/5 ring-1 ring-inset ring-primary/40`:``}`,children:[(0,F.jsxs)(`div`,{className:`grid gap-3 px-3 py-3 text-sm lg:grid-cols-[minmax(180px,1.2fr)_minmax(220px,1.5fr)_minmax(160px,1fr)_minmax(170px,auto)]`,children:[(0,F.jsxs)(`div`,{className:`min-w-0 space-y-1`,children:[(0,F.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,F.jsx)(a,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`}),(0,F.jsx)(`span`,{className:`truncate font-medium`,title:e.branch||e.id,children:e.branch||e.id})]}),(0,F.jsxs)(`div`,{className:`flex flex-wrap gap-1`,children:[(0,F.jsx)(E,{variant:`outline`,className:`text-[10px] ${e.mode===`isolated`?`border-sky-500/30 text-sky-400`:`border-zinc-500/30 text-zinc-400`}`,children:e.mode}),e.requestedMode&&e.requestedMode!==e.mode&&(0,F.jsxs)(E,{variant:`outline`,className:`text-[10px]`,children:[`requested `,e.requestedMode]}),(0,F.jsx)(E,{variant:`outline`,className:`text-[10px] ${re(e.status)}`,children:X[e.status]||e.status}),(0,F.jsx)(fe,{workspace:e}),p&&u&&(0,F.jsx)(k,{id:u.id,title:u.title,status:u.status,onClick:()=>c(u)})]})]}),(0,F.jsxs)(`div`,{className:`min-w-0 space-y-1`,children:[(0,F.jsx)(`div`,{className:`truncate font-mono text-xs`,title:h,children:ne(h)}),(0,F.jsx)(`div`,{className:`truncate text-xs text-muted-foreground`,title:e.sourceCwd,children:e.sourceCwd}),(0,F.jsx)(se,{workspace:e})]}),(0,F.jsxs)(`div`,{className:`grid grid-cols-[4.5rem_minmax(0,1fr)] gap-x-2 gap-y-1 text-xs`,children:[(0,F.jsx)(`span`,{className:`text-muted-foreground`,children:`Owner`}),(0,F.jsx)(`span`,{className:`truncate`,title:e.ownerAgentId,children:Q(l,e.ownerPolicyName||e.ownerAgentId)}),(0,F.jsx)(`span`,{className:`text-muted-foreground`,children:`Steward`}),(0,F.jsx)(`span`,{className:`truncate`,title:e.stewardAgentId,children:Q(m,e.stewardAgentId)}),(0,F.jsx)(`span`,{className:`text-muted-foreground`,children:`Updated`}),(0,F.jsx)(`span`,{children:T(t,e.updatedAt)}),e.baseRef&&(0,F.jsxs)(F.Fragment,{children:[(0,F.jsx)(`span`,{className:`text-muted-foreground`,children:`Base`}),(0,F.jsx)(`span`,{className:`truncate`,title:e.baseSha,children:e.baseRef})]})]}),(0,F.jsx)(ae,{workspace:e,expanded:n,onToggleDetails:()=>r(e=>!e)})]}),n&&(0,F.jsx)($,{workspace:e})]})}function me(){let[e,t]=(0,P.useState)(`active`),[n,r]=(0,P.useState)(R),[i,a]=(0,P.useState)([]),o=C(e=>e.workspaces),s=C(e=>e.set),c=C(e=>e.workspaceFocusId);(0,P.useEffect)(()=>{c&&(t(`all`),r(R))},[c]),(0,P.useEffect)(()=>()=>{s({workspaceFocusId:null})},[s]),(0,P.useEffect)(()=>{let e=!1;return x(`GET`,`/projects`).then(t=>{e||a(t.projects??[])}).catch(()=>{e||a([])}),()=>{e=!0}},[]);let l=(0,P.useMemo)(()=>H(o,e,n),[o,e,n]),u=(0,P.useMemo)(()=>V(l,ie),[l]),d=o.filter(e=>I.has(e.status)).length,f=o.filter(e=>e.mode===`isolated`).length,p=o.filter(e=>e.status===`ready`||e.status===`review_requested`||e.status===`merge_planned`).length,m=o.filter(e=>e.status===`conflict`).length,h=o.filter(e=>e.status===`merged`||e.status===`abandoned`||e.status===`cleaned`).length,g=[{key:`active`,label:`Active`,count:o.length-h},{key:`cleaned`,label:`Done`,count:h},{key:`all`,label:`All`,count:o.length}],_=(0,P.useMemo)(()=>{let e=[{value:R,label:`All Projects`}];for(let t of i)e.push({value:t.id,label:t.title||t.slug});return e.push({value:z,label:`Unassigned`}),e},[i]);return(0,F.jsxs)(`div`,{className:`space-y-4`,children:[(0,F.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`h1`,{className:`text-2xl font-semibold`,children:`Workspaces`}),(0,F.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Agent worktrees, ownership, and merge readiness.`})]}),(0,F.jsxs)(`div`,{className:`ml-auto flex flex-wrap gap-1.5`,children:[(0,F.jsxs)(E,{variant:`outline`,children:[f,` isolated`]}),(0,F.jsxs)(E,{variant:`outline`,children:[d,` live`]}),(0,F.jsxs)(E,{variant:`outline`,children:[p,` ready`]}),m>0&&(0,F.jsxs)(E,{variant:`outline`,className:`border-red-500/20 text-red-400`,children:[m,` conflict`]})]})]}),(0,F.jsx)(G,{}),(0,F.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,F.jsx)(`div`,{className:`flex rounded-md border border-border bg-card p-1`,children:g.map(n=>(0,F.jsxs)(D,{size:`sm`,variant:e===n.key?`secondary`:`ghost`,className:`h-7 text-xs`,onClick:()=>t(n.key),children:[n.label,(0,F.jsx)(`span`,{className:`ml-1 text-muted-foreground`,children:n.count})]},n.key))}),(0,F.jsx)(`select`,{className:`h-8 min-w-[12rem] rounded-md border border-border bg-card px-2.5 text-sm text-foreground`,value:n,onChange:e=>r(e.target.value),children:_.map(e=>(0,F.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),u.length===0?(0,F.jsxs)(`div`,{className:`rounded-md border border-border px-3 py-12 text-center text-sm text-muted-foreground`,children:[`No `,e===`all`?``:e,` workspaces`,n===`__all__`?``:` in this project filter`]}):(0,F.jsx)(`div`,{className:`space-y-3`,children:u.map(e=>(0,F.jsx)(U,{group:e,renderWorkspaceRow:e=>(0,F.jsx)(pe,{workspace:e},e.id)},e.key))})]})}export{me as WorkspacesView};
3
- //# sourceMappingURL=workspaces-D2bYW3zl.js.map