@tt-a1i/hive 1.2.0 → 1.3.4

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 (75) hide show
  1. package/CHANGELOG.md +119 -14
  2. package/README.en.md +63 -8
  3. package/README.md +37 -6
  4. package/assets/hive-team-view.png +0 -0
  5. package/dist/src/cli/hive-update.d.ts +15 -0
  6. package/dist/src/cli/hive-update.js +81 -0
  7. package/dist/src/cli/hive.js +21 -5
  8. package/dist/src/cli/team.d.ts +6 -0
  9. package/dist/src/cli/team.js +48 -0
  10. package/dist/src/server/agent-launch-cache.js +25 -6
  11. package/dist/src/server/agent-manager.d.ts +2 -2
  12. package/dist/src/server/agent-run-store.d.ts +1 -1
  13. package/dist/src/server/agent-runtime-contract.d.ts +3 -0
  14. package/dist/src/server/agent-runtime.js +3 -0
  15. package/dist/src/server/agent-startup-instructions.js +1 -1
  16. package/dist/src/server/agent-stdin-dispatcher.d.ts +4 -0
  17. package/dist/src/server/agent-stdin-dispatcher.js +12 -0
  18. package/dist/src/server/app.js +12 -1
  19. package/dist/src/server/dispatch-ledger-store.d.ts +22 -1
  20. package/dist/src/server/dispatch-ledger-store.js +34 -3
  21. package/dist/src/server/hive-team-guidance.js +3 -1
  22. package/dist/src/server/open-target-commands.js +0 -17
  23. package/dist/src/server/package-version.d.ts +15 -0
  24. package/dist/src/server/package-version.js +15 -0
  25. package/dist/src/server/route-types.d.ts +7 -0
  26. package/dist/src/server/routes-dispatches.js +4 -2
  27. package/dist/src/server/routes-runtime.js +1 -0
  28. package/dist/src/server/routes-team.js +22 -0
  29. package/dist/src/server/runtime-store-helpers.d.ts +2 -1
  30. package/dist/src/server/runtime-store-helpers.js +14 -4
  31. package/dist/src/server/runtime-store.d.ts +5 -8
  32. package/dist/src/server/runtime-store.js +1 -0
  33. package/dist/src/server/tasks-websocket-server.d.ts +2 -1
  34. package/dist/src/server/tasks-websocket-server.js +18 -2
  35. package/dist/src/server/team-authz.d.ts +1 -1
  36. package/dist/src/server/team-authz.js +1 -1
  37. package/dist/src/server/team-operations.d.ts +16 -1
  38. package/dist/src/server/team-operations.js +28 -1
  39. package/dist/src/server/terminal-input-profile.d.ts +10 -0
  40. package/dist/src/server/terminal-input-profile.js +15 -0
  41. package/dist/src/server/terminal-stream-hub.js +10 -2
  42. package/dist/src/server/terminal-ws-server.d.ts +2 -1
  43. package/dist/src/server/terminal-ws-server.js +2 -2
  44. package/dist/src/server/version-service.js +4 -1
  45. package/dist/src/server/workspace-shell-runtime.d.ts +2 -1
  46. package/dist/src/server/workspace-shell-runtime.js +37 -10
  47. package/dist/src/server/workspace-store-contract.d.ts +1 -0
  48. package/dist/src/server/workspace-store-mutations.d.ts +1 -0
  49. package/dist/src/server/workspace-store-mutations.js +1 -0
  50. package/dist/src/server/workspace-store.js +2 -1
  51. package/dist/src/shared/open-targets.d.ts +1 -1
  52. package/dist/src/shared/open-targets.js +9 -16
  53. package/package.json +2 -2
  54. package/web/dist/assets/AddWorkerDialog-D6-K1wJm.js +1 -0
  55. package/web/dist/assets/AddWorkspaceDialog-Du0lndJ0.js +1 -0
  56. package/web/dist/assets/FirstRunWizard-B8k7S5De.js +1 -0
  57. package/web/dist/assets/WorkerModal-B3XhIvAX.js +1 -0
  58. package/web/dist/assets/WorkspaceTaskDrawer-CjEoLJvS.js +1 -0
  59. package/web/dist/assets/chevron-right-BvbSCniy.js +1 -0
  60. package/web/dist/assets/finder-C4Jmsb0B.png +0 -0
  61. package/web/dist/assets/ghostty-D-Js4rdm.png +0 -0
  62. package/web/dist/assets/index-DB5fHAMI.js +81 -0
  63. package/web/dist/assets/index-Sbdu6Se0.css +1 -0
  64. package/web/dist/assets/zed-C5BQT8X3.png +0 -0
  65. package/web/dist/icons/apple-touch-icon-180.png +0 -0
  66. package/web/dist/icons/icon-192.png +0 -0
  67. package/web/dist/icons/icon-32.png +0 -0
  68. package/web/dist/icons/icon-512-maskable.png +0 -0
  69. package/web/dist/icons/icon-512.png +0 -0
  70. package/web/dist/index.html +11 -3
  71. package/web/dist/manifest.webmanifest +60 -0
  72. package/web/dist/screenshots/wide-overview.png +0 -0
  73. package/web/dist/sw.js +99 -0
  74. package/web/dist/assets/index-BgXxFsKj.css +0 -1
  75. package/web/dist/assets/index-VeKhgpe_.js +0 -66
@@ -0,0 +1 @@
1
+ import{c as C,j as e,u as K,T as ie,R as re,r as x,p as ce,a as _,E as de,C as te,P as Y,b as ue,d as he,e as pe,f as xe,g as ke,h as me,l as R}from"./index-DB5fHAMI.js";import{C as se}from"./chevron-right-BvbSCniy.js";const fe=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-4 8",key:"7n84p3"}]],P=C("at-sign",fe);const be=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]],ge=C("circle",be);const je=[["path",{d:"m15 10 5 5-5 5",key:"qqa56n"}],["path",{d:"M4 4v7a4 4 0 0 0 4 4h12",key:"z08zvw"}]],G=C("corner-down-right",je);const we=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10 12.5 8 15l2 2.5",key:"1tg20x"}],["path",{d:"m14 12.5 2 2.5-2 2.5",key:"yinavb"}]],ye=C("file-code",we);const ve=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]],ae=C("file-text",ve);const Ne=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M15 3v18",key:"14nvp0"}],["path",{d:"m8 9 3 3-3 3",key:"12hl5m"}]],Te=C("panel-right-close",Ne);const _e=[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]],Ce=C("save",_e),U=t=>{const n=[];let l="",a=0;const c=()=>{l&&(n.push(l),l="")};let o=0;for(;o<t.length;){const r=t.slice(o),u=r.match(/^\*\*([^*]+?)\*\*/);if(u?.[1]){c(),n.push(e.jsx("strong",{children:U(u[1])},a++)),o+=u[0].length;continue}const s=r.match(/^`([^`]+?)`/);if(s?.[1]){c(),n.push(e.jsx("code",{className:"mono",children:s[1]},a++)),o+=s[0].length;continue}const i=r.match(/^\*([^*]+?)\*/);if(i?.[1]){c(),n.push(e.jsx("em",{children:U(i[1])},a++)),o+=i[0].length;continue}l+=t[o],o+=1}return c(),n},$e=({content:t,hasConflict:n,onContentChange:l,onKeepLocal:a,onReload:c,onSave:o})=>{const{t:r}=K(),u=s=>{s.preventDefault(),o()};return e.jsxs("form",{onSubmit:u,className:"flex h-full flex-col gap-3",children:[e.jsxs("label",{className:"flex min-h-0 flex-1 flex-col gap-2 text-xs text-sec",children:[e.jsxs("span",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"font-medium text-sec",children:r("tasks.raw.label")}),e.jsx("span",{className:"mono text-xs text-ter",children:r("tasks.raw.lineCount",{count:t.split(/\r?\n/).length})})]}),e.jsx("textarea",{"aria-label":r("tasks.raw.label"),value:t,onChange:s=>l(s.target.value),className:"mono min-h-[360px] flex-1 resize-none rounded border p-3 text-sm text-pri outline-none focus:border-[var(--accent)]",style:{background:"var(--bg-0)",borderColor:"var(--border)"}})]}),n?e.jsxs("div",{className:"flex items-start gap-2 rounded border p-3 text-xs",style:{borderColor:"var(--status-orange)",color:"var(--status-orange)"},children:[e.jsx(ie,{className:"mt-0.5 shrink-0",size:16}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("p",{className:"font-medium",children:r("tasks.raw.conflictTitle")}),e.jsx("p",{className:"mt-1 text-ter",children:r("tasks.raw.conflictDescription")})]}),e.jsxs("div",{className:"flex shrink-0 gap-2",children:[e.jsxs("button",{type:"button",onClick:c,className:"icon-btn",children:[e.jsx(re,{size:14}),r("tasks.raw.reload")]}),e.jsx("button",{type:"button",onClick:a,className:"icon-btn",children:r("tasks.raw.keepLocal")})]})]}):null,e.jsx("div",{className:"flex justify-end border-t pt-3",style:{borderColor:"var(--border)"},children:e.jsxs("button",{type:"submit",className:"icon-btn icon-btn--primary",children:[e.jsx(Ce,{size:14}),r("tasks.raw.save")]})})]})},B=["#a78bfa","#60a5fa","#5eead4","#86efac","#fde047","#fb923c","#f9a8d4","#fca5a5"],ne=t=>{let n=0;for(let l=0;l<t.length;l+=1)n=n*31+t.charCodeAt(l)>>>0;return B[n%B.length]??B[0]},Se=[{pattern:/^(done|completed?|finished?|ok|success|完成|已完成|搞定)$/i,tone:"green"},{pattern:/^(working|running|in[-_ ]?progress|dispatching|dispatched|进行中|派单中?|执行中|处理中)$/i,tone:"orange"},{pattern:/^(blocked|failed|error|errored|阻塞|失败|出错)$/i,tone:"red"},{pattern:/^(queued|waiting|pending|todo|open|idle|待办|等待中?|队列中|未开始)$/i,tone:"neutral"}],X=new Set(["owner","assignee","负责","负责人","执行人"]),Z=new Set(["status","状态"]),J=new Set(["报告","report","文件","file","path","日志","log","产物"]),ze=/^(.*?)\s*\(([^()]+)\)\s*$/,Ee=/\s*[·,,;;]\s*/,Me=/^([^::]+)[::]\s*(.+)$/,Re=t=>{for(const{pattern:n,tone:l}of Se)if(n.test(t))return l;return"neutral"},Ae=t=>t.includes("/")?!0:/^[A-Za-z0-9._-]+\.[A-Za-z0-9]+$/.test(t),De=t=>{const n=t.match(ze);if(!n)return{title:t,meta:[]};const[,l="",a=""]=n;if(!a.trim())return{title:t,meta:[]};const c=a.split(Ee).filter(Boolean),o=[];for(const r of c){const u=r.match(Me);if(!u){o.push({kind:"note",value:r.trim()});continue}const s=(u[1]??"").trim(),i=(u[2]??"").trim(),m=s.toLowerCase();X.has(m)||X.has(s)?o.push({kind:"owner",value:i}):Z.has(m)||Z.has(s)?o.push({kind:"status",value:i,tone:Re(i)}):J.has(m)||J.has(s)||Ae(i)?o.push({kind:"path",label:s,value:i}):o.push({kind:"note",value:`${s}: ${i}`})}return{title:l.trim(),meta:o}},Q=3,Le=({item:t,handlers:n})=>{if(t.kind==="status")return e.jsx("span",{className:`pill pill--${t.tone}`,"data-testid":"task-meta-status",children:t.value});if(t.kind==="owner"){const a={"--owner-tone":ne(t.value)};return n.onSelectOwner?e.jsxs("button",{type:"button",className:"task-owner task-owner--clickable","data-testid":"task-meta-owner","data-owner":t.value,onClick:c=>{c.stopPropagation(),n.onSelectOwner?.(t.value)},style:a,children:[e.jsx(P,{size:10,"aria-hidden":!0}),t.value]}):e.jsxs("span",{className:"task-owner","data-testid":"task-meta-owner","data-owner":t.value,style:a,children:[e.jsx(P,{size:10,"aria-hidden":!0}),t.value]})}return t.kind==="path"?e.jsxs("span",{className:"pill pill--neutral mono inline-flex items-center gap-1","data-testid":"task-meta-path",title:`${t.label}: ${t.value}`,children:[e.jsx(ae,{size:10,"aria-hidden":!0}),t.value]}):e.jsx("span",{className:"text-xs text-ter","data-testid":"task-meta-note",children:t.value})},F=({initial:t,onSubmit:n,onCancel:l,placeholder:a})=>{const[c,o]=x.useState(t),r=()=>{const s=c.trim();if(!s){l();return}n(s)},u=s=>{s.key==="Enter"?(s.preventDefault(),r()):s.key==="Escape"&&(s.preventDefault(),l())};return e.jsx("input",{type:"text",autoFocus:!0,value:c,placeholder:a,onChange:s=>o(s.target.value),onKeyDown:u,onBlur:r,"data-testid":"task-inline-input",className:"task-row__input"})},W=({task:t,handlers:n,depth:l})=>{const{t:a}=K(),c=t.checked?ue:ge,{title:o,meta:r}=De(t.text),[u,s]=x.useState(!1),[i,m]=x.useState(!1),[j,E]=x.useState(!1),[$,S]=x.useState(!1),b=x.useRef(null);x.useEffect(()=>()=>{b.current&&clearTimeout(b.current)},[]);const{onToggle:f,onUpdateText:p,onDelete:y,onAppendSubtask:A,onCopyLine:I,onSelectOwner:v,writeDisabled:g=!1}=n,D=!!p&&!g,z=!!y&&!g,N=!!A&&!g,L=!!I,M=!u&&!i&&(D||z||N||L),w=t.children.length,T=he(t),H=l+1>=Q,O=w>0,V=j?a("tasks.aria.expandSubtasks",{count:w}):a("tasks.aria.collapseSubtasks",{count:w}),h=v?{onSelectOwner:v}:{};return e.jsxs("li",{className:"task-node","data-testid":`task-line-${t.line}`,children:[e.jsxs("div",{className:"task-row group",children:[l>=Q?e.jsx("span",{"aria-hidden":!0,className:"task-row__deep-marker",children:"▸"}):null,e.jsxs("label",{className:"task-row__checkbox-cell",children:[e.jsx("input",{type:"checkbox",checked:t.checked,disabled:g,onChange:()=>{g||f(t.line)},className:"sr-only","data-testid":`task-checkbox-${t.line}`,"aria-label":t.text||`task-line-${t.line}`}),e.jsx("span",{className:`task-row__indicator ${t.checked?"task-status-done":"task-status-open"}`,"aria-hidden":!0,children:e.jsx(c,{size:14})})]}),e.jsx("span",{className:"min-w-0 flex-1",children:u?e.jsx(F,{initial:t.text,placeholder:a("tasks.placeholder.editTask"),onSubmit:d=>{s(!1),p?.(t.line,d)},onCancel:()=>s(!1)}):e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"flex min-w-0 items-start gap-2",children:[e.jsx("span",{className:`task-row__title min-w-0 flex-1 ${t.checked?"text-ter line-through":"text-pri"}`,children:U(o)}),O?e.jsx("button",{type:"button",className:"task-row__collapse",onClick:d=>{d.stopPropagation(),E(k=>!k)},"data-testid":`task-collapse-${t.line}`,"aria-expanded":!j,"aria-label":V,children:j?e.jsx(se,{size:12,"aria-hidden":!0}):e.jsx(te,{size:12,"aria-hidden":!0})}):null,T?e.jsxs("span",{className:"task-child-count mono","data-testid":`task-progress-${t.line}`,title:a("tasks.progress.subtaskTitle",{done:T.done,total:T.total}),children:[T.done,"/",T.total]}):null]}),r.length>0||t.mentions.length>0?e.jsxs("span",{className:"mt-1.5 flex flex-wrap items-center gap-1.5",children:[r.map(d=>e.jsx(Le,{item:d,handlers:h},`${t.line}-meta-${d.kind}-${"label"in d?d.label:""}-${d.value}`)),t.mentions.map(d=>{const k=d.replace(/^@/,""),q={"--owner-tone":ne(k)};return v?e.jsxs("button",{type:"button",className:"task-owner task-owner--clickable","data-testid":`task-mention-${k}`,"data-owner":k,onClick:oe=>{oe.stopPropagation(),v(k)},style:q,children:[e.jsx(P,{size:10,"aria-hidden":!0}),k]},`${t.line}-mention-${d}`):e.jsxs("span",{className:"task-owner","data-testid":`task-mention-${k}`,"data-owner":k,style:q,children:[e.jsx(P,{size:10,"aria-hidden":!0}),k]},`${t.line}-mention-${d}`)})]}):null]})}),M?e.jsxs("div",{className:"task-row__actions",children:[L?e.jsx(_,{label:a($?"tasks.action.copied":"tasks.action.copyLine"),children:e.jsx("button",{type:"button",className:"task-row__action",onClick:()=>{I?.(t.line),S(!0),b.current&&clearTimeout(b.current),b.current=setTimeout(()=>{S(!1),b.current=null},1500)},"data-testid":`task-copy-${t.line}`,"aria-label":a($?"tasks.aria.copiedTaskLine":"tasks.aria.copyTaskLine"),children:$?e.jsx(pe,{size:12}):e.jsx(xe,{size:12})})}):null,D?e.jsx(_,{label:a("tasks.action.edit"),children:e.jsx("button",{type:"button",className:"task-row__action",onClick:()=>s(!0),"data-testid":`task-edit-${t.line}`,"aria-label":a("tasks.aria.editTask"),children:e.jsx(ke,{size:12})})}):null,N?e.jsx(_,{label:a("tasks.action.addSubtask"),children:e.jsx("button",{type:"button",className:"task-row__action",onClick:()=>{E(!1),m(!0)},"data-testid":`task-add-subtask-${t.line}`,"aria-label":a("tasks.aria.addSubtask"),children:e.jsx(G,{size:12})})}):null,z?e.jsx(_,{label:a("tasks.action.delete"),children:e.jsx("button",{type:"button",className:"task-row__action task-row__action--danger",onClick:()=>y?.(t.line),"data-testid":`task-delete-${t.line}`,"aria-label":a("tasks.aria.deleteTask"),children:e.jsx(me,{size:12})})}):null]}):null]}),w>0&&!j||i?e.jsxs("ul",{className:`task-children${H?" task-children--deep":""}`,"data-testid":`task-children-${t.line}`,children:[j?null:t.children.map(d=>e.jsx(W,{depth:l+1,handlers:n,task:d},d.line)),i?e.jsx("li",{className:"task-node",children:e.jsxs("div",{className:"task-row task-row--child-input",children:[e.jsx("span",{"aria-hidden":!0,className:"task-row__indicator task-status-open",children:e.jsx(G,{size:12})}),e.jsx(F,{initial:"",placeholder:a("tasks.placeholder.newSubtask"),onSubmit:d=>{m(!1),A?.(t.line,d)},onCancel:()=>m(!1)})]})}):null]}):null]})},ee=({onSubmit:t,disabled:n=!1})=>{const{t:l}=K(),[a,c]=x.useState(!1),[o,r]=x.useState(""),u=()=>{const i=o.trim();if(!i){c(!1);return}t(i),r("")},s=i=>{i.key==="Enter"?(i.preventDefault(),u()):i.key==="Escape"&&(i.preventDefault(),r(""),c(!1))};return a?e.jsxs("div",{className:"task-add-input",children:[e.jsx("span",{"aria-hidden":!0,className:"task-add-input__icon",children:e.jsx(Y,{size:12})}),e.jsx("input",{type:"text",autoFocus:!0,value:o,placeholder:l("tasks.placeholder.newTask"),onChange:i=>r(i.target.value),onKeyDown:s,onBlur:u,"data-testid":"task-add-input",className:"task-add-input__field"})]}):e.jsxs("button",{type:"button",onClick:()=>c(!0),disabled:n,"data-testid":"task-add-toggle",className:"task-add-toggle",children:[e.jsx("span",{"aria-hidden":!0,className:"task-add-toggle__icon",children:e.jsx(Y,{size:12})}),e.jsx("span",{children:l("tasks.button.addTask")})]})},le=t=>t.flatMap(n=>[n,...le(n.children)]),Pe=t=>{const n=le(t),l=n.length,a=n.filter(o=>o.checked).length,c=l===0?0:Math.round(a/l*100);return{completedTasks:a,completionPercent:c,doneRoots:t.filter(o=>o.checked),openRoots:t.filter(o=>!o.checked),totalTasks:l}},Ke=({content:t,hasConflict:n,onClose:l,onContentChange:a,onKeepLocal:c,onReload:o,onSave:r,onToggleTaskLine:u,onAppendTask:s,onAppendSubtask:i,onUpdateTaskText:m,onDeleteTask:j,open:E,workspacePath:$,knownWorkerNames:S,onSelectOwner:b,connectionStale:f=!1})=>{const{t:p}=K(),[y,A]=x.useState(!1),v={onToggle:u,onCopyLine:h=>{const d=t.split(/\r?\n/)[h];typeof d=="string"&&navigator.clipboard?.writeText(d).catch(k=>{console.error("[hive] swallowed:tasks.copyLine",k)})},...m&&!f?{onUpdateText:m}:{},...j&&!f?{onDelete:j}:{},...i&&!f?{onAppendSubtask:i}:{},...b?{onSelectOwner:b}:{},...f?{writeDisabled:!0}:{}},g=x.useMemo(()=>ce(t,S?{knownWorkerNames:S}:{}),[t,S]),{completedTasks:D,completionPercent:z,doneRoots:N,openRoots:L,totalTasks:M}=x.useMemo(()=>Pe(g),[g]),[w,T]=x.useState(N.length<=3),H=$?`${$}/.hive/tasks.md`:".hive/tasks.md",O=h=>{if(h.key!=="Escape")return;const d=h.target?.tagName;d==="INPUT"||d==="TEXTAREA"||(h.preventDefault(),l())},V=`drawer absolute right-0 top-0 bottom-0 z-20 flex flex-col border-l shadow-2xl${E?" open":""}${f?" drawer--stale":""}`;return e.jsxs("aside",{"aria-label":p("tasks.aria.drawer"),"data-testid":"task-graph-drawer","data-connection-stale":f||void 0,"aria-hidden":!E,onKeyDown:O,className:V,style:{background:"var(--bg-1)",borderColor:"var(--border)",maxWidth:"calc(100vw - 3.5rem)",minWidth:360,width:"40%"},children:[e.jsxs("header",{className:"task-drawer__header",children:[e.jsxs("div",{className:"flex min-w-0 flex-1 items-baseline gap-2",children:[e.jsx(_,{label:e.jsx("span",{className:"mono text-ter",children:H}),children:e.jsx("span",{className:"cursor-default font-semibold text-pri",children:p("tasks.title.todo")})}),M>0?e.jsxs("span",{className:"text-xs text-ter tabular-nums","data-testid":"task-graph-summary",children:[e.jsxs("span",{"data-testid":"task-progress-text",children:[D," / ",M]})," ","· ",z,"%"]}):null]}),e.jsx(_,{label:p(y?"tasks.action.backToList":"tasks.action.viewSource"),children:e.jsx("button",{type:"button",onClick:()=>A(h=>!h),"data-testid":"task-raw-toggle",className:"icon-btn","aria-label":p(y?"tasks.action.backToList":"tasks.action.viewSource"),children:e.jsx(ye,{size:14})})}),e.jsx(_,{label:p("tasks.action.closeTodo"),children:e.jsx("button",{type:"button",onClick:l,"aria-label":p("tasks.action.closeTodo"),className:"icon-btn",children:e.jsx(Te,{size:14})})})]}),!y&&M>0?e.jsx("div",{"aria-label":p("tasks.aria.progress"),"aria-valuemax":100,"aria-valuemin":0,"aria-valuenow":z,className:"task-progress-thin task-drawer__progress","data-testid":"task-progress-bar",role:"progressbar",children:e.jsx("span",{style:{width:`${z}%`}})}):null,e.jsx("div",{className:"flex-1 scroll-y px-3 py-3 text-sm",children:y?e.jsx($e,{content:t,hasConflict:n,onContentChange:a,onKeepLocal:c,onReload:o,onSave:r}):g.length===0?e.jsxs(e.Fragment,{children:[s?e.jsx("div",{className:"mb-1",children:e.jsx(ee,{disabled:f,onSubmit:s})}):null,e.jsx(de,{icon:e.jsx(ae,{size:20}),title:p("tasks.empty.title"),description:p("tasks.empty.description")})]}):e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("ul",{className:"task-list","data-testid":"task-graph-list",children:[L.map(h=>e.jsx(W,{depth:0,handlers:v,task:h},h.line)),s?e.jsx("li",{children:e.jsx(ee,{disabled:f,onSubmit:s})}):null]}),N.length>0?e.jsxs("div",{className:"mt-1",children:[e.jsxs("button",{type:"button",onClick:()=>T(h=>!h),"aria-expanded":w,"data-testid":"task-completed-toggle",className:"task-completed-toggle",children:[w?e.jsx(te,{size:12,"aria-hidden":!0}):e.jsx(se,{size:12,"aria-hidden":!0}),e.jsx("span",{children:p("tasks.completed.toggle",{count:N.length})})]}),w?e.jsx("ul",{className:"task-list","data-testid":"task-completed-list",children:N.map(h=>e.jsx(W,{depth:0,handlers:v,task:h},h.line))}):null]}):null]})})]})},Oe=({tasksFile:t,workspacePath:n,open:l,onClose:a,workers:c,onSelectOwner:o,connectionStale:r})=>{const u=x.useMemo(()=>c?.length?c.map(s=>s.name):void 0,[c]);return e.jsx(Ke,{content:t.content,hasConflict:t.hasConflict,onClose:a,onContentChange:t.onChange,onKeepLocal:t.onKeepLocal,onReload:t.onReload,onSave:t.onSave,onToggleTaskLine:s=>{t.toggleTaskAtLine(s).catch(R("tasks.toggleTaskAtLine"))},onAppendTask:s=>{t.appendTask(s).catch(R("tasks.appendTask"))},onAppendSubtask:(s,i)=>{t.appendSubtask(s,i).catch(R("tasks.appendSubtask"))},onUpdateTaskText:(s,i)=>{t.updateTaskText(s,i).catch(R("tasks.updateTaskText"))},onDeleteTask:s=>{t.deleteTask(s).catch(R("tasks.deleteTask"))},open:l,workspacePath:n,...u?{knownWorkerNames:u}:{},...o?{onSelectOwner:o}:{},...r!==void 0?{connectionStale:r}:{}})};export{Oe as WorkspaceTaskDrawer};
@@ -0,0 +1 @@
1
+ import{c as o}from"./index-DB5fHAMI.js";const t=[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]],e=o("chevron-right",t);export{e as C};