@tom2012/cc-web 2026.4.19-e → 2026.4.19-g

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 (42) hide show
  1. package/README.md +1 -1
  2. package/backend/dist/adapters/claude-adapter.d.ts.map +1 -1
  3. package/backend/dist/adapters/claude-adapter.js +8 -1
  4. package/backend/dist/adapters/claude-adapter.js.map +1 -1
  5. package/backend/dist/approval-manager.d.ts +56 -0
  6. package/backend/dist/approval-manager.d.ts.map +1 -0
  7. package/backend/dist/approval-manager.js +164 -0
  8. package/backend/dist/approval-manager.js.map +1 -0
  9. package/backend/dist/hooks-manager.d.ts.map +1 -1
  10. package/backend/dist/hooks-manager.js +5 -1
  11. package/backend/dist/hooks-manager.js.map +1 -1
  12. package/backend/dist/index.d.ts.map +1 -1
  13. package/backend/dist/index.js +48 -1
  14. package/backend/dist/index.js.map +1 -1
  15. package/backend/dist/routes/approval.d.ts +3 -0
  16. package/backend/dist/routes/approval.d.ts.map +1 -0
  17. package/backend/dist/routes/approval.js +110 -0
  18. package/backend/dist/routes/approval.js.map +1 -0
  19. package/bin/ccweb-approval-hook.js +164 -0
  20. package/frontend/dist/assets/{GraphPreview-CgbKuYId.js → GraphPreview-CDHoM7vI.js} +1 -1
  21. package/frontend/dist/assets/{MobilePage-DB1T18RD.js → MobilePage-CqVBavnC.js} +3 -3
  22. package/frontend/dist/assets/{OfficePreview-8M2OleSY.js → OfficePreview-DfJy16NX.js} +2 -2
  23. package/frontend/dist/assets/{PlanPanel-DbOKMsR8.js → PlanPanel-DZsQxsdW.js} +2 -2
  24. package/frontend/dist/assets/{ProjectPage-BVhFZMDi.js → ProjectPage-BhY0UuiP.js} +5 -5
  25. package/frontend/dist/assets/{SettingsPage-Bx7llLhW.js → SettingsPage-DV5sKegv.js} +1 -1
  26. package/frontend/dist/assets/{ShareViewPage-UykL1neX.js → ShareViewPage-DBe_gyzy.js} +1 -1
  27. package/frontend/dist/assets/{SkillHubPage-D2S-aO3j.js → SkillHubPage-BbkYk7tM.js} +1 -1
  28. package/frontend/dist/assets/{bot-mb2XSuWA.js → bot-BGbyV12Y.js} +1 -1
  29. package/frontend/dist/assets/{chevron-down-wfOXaRaa.js → chevron-down-DthMyLdr.js} +1 -1
  30. package/frontend/dist/assets/{chevron-up-CwtRQk-w.js → chevron-up-jEPj81xw.js} +1 -1
  31. package/frontend/dist/assets/{index-CeIo8jzU.js → index-5p-dxvl8.js} +8 -8
  32. package/frontend/dist/assets/{index-Cr-aW4iI.js → index-CAk8oYc_.js} +1 -1
  33. package/frontend/dist/assets/{index-DmPZY6Ja.css → index-Ccjr2Crc.css} +1 -1
  34. package/frontend/dist/assets/{index-Beev1a0a.js → index-DaoiGW92.js} +1 -1
  35. package/frontend/dist/assets/{jszip.min-DFNYC8ee.js → jszip.min-CGFTV627.js} +1 -1
  36. package/frontend/dist/assets/{matter-TZvDV9Rh.js → matter-6ee-mAgn.js} +1 -1
  37. package/frontend/dist/assets/{maximize-2-C33nlgA2.js → maximize-2-ErX1aSSF.js} +1 -1
  38. package/frontend/dist/assets/{one-light-B0A_xzYF.js → one-light-BhN-Pjnq.js} +1 -1
  39. package/frontend/dist/assets/{search-DboZ70b5.js → search-DWKPAzHf.js} +1 -1
  40. package/frontend/dist/assets/{user-D94-hxj0.js → user-DIvmAwnK.js} +1 -1
  41. package/frontend/dist/index.html +2 -2
  42. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import{c as e,r as s,j as t,bq as a,br as n,bs as r,t as l,bt as i,bu as c,bv as o,bw as d,bx as u,B as h,ap as x}from"./index-CeIo8jzU.js";import{Z as m,a as f,P as y}from"./ProjectPage-BVhFZMDi.js";import{M as g}from"./maximize-2-C33nlgA2.js";import"./purify.es-CgRAQgUo.js";import"./one-light-B0A_xzYF.js";import"./index-Beev1a0a.js";import"./chevron-down-wfOXaRaa.js";import"./bot-mb2XSuWA.js";import"./user-D94-hxj0.js";import"./search-DboZ70b5.js";import"./chevron-up-CwtRQk-w.js";
1
+ import{c as e,r as s,j as t,bs as a,bt as n,bu as r,t as l,bv as i,bw as c,bx as o,by as d,bz as u,B as h,ap as x}from"./index-5p-dxvl8.js";import{Z as m,a as f,P as y}from"./ProjectPage-BhY0UuiP.js";import{M as g}from"./maximize-2-ErX1aSSF.js";import"./purify.es-CgRAQgUo.js";import"./one-light-BhN-Pjnq.js";import"./index-DaoiGW92.js";import"./chevron-down-DthMyLdr.js";import"./bot-BGbyV12Y.js";import"./user-DIvmAwnK.js";import"./search-DWKPAzHf.js";import"./chevron-up-jEPj81xw.js";
2
2
  /**
3
3
  * @license lucide-react v0.309.0 - ISC
4
4
  *
@@ -10,4 +10,4 @@ import{c as e,r as s,j as t,bq as a,br as n,bs as r,t as l,bt as i,bu as c,bv as
10
10
  *
11
11
  * This source code is licensed under the ISC license.
12
12
  * See the LICENSE file in the root directory of this source tree.
13
- */function _({tree:e,currentLine:a}){const n=s.useRef(null),[r,l]=s.useState(1),[i,c]=s.useState({x:0,y:0}),o=s.useRef(!1),d=s.useRef({x:0,y:0}),[,u]=s.useState(0),[h,x]=s.useState(null),{layoutNodes:y,edges:p,bounds:j}=s.useMemo(()=>{const s=[],t=[];const a=function e(a,n,r,l){const i=[];let c=r;for(const o of a){const a=40+160*l,n={id:o.id,x:a,y:c,w:w,h:N,type:o.type,label:o.label,status:o.status,node_id:o.node_id,line:o.line,children:[]};if(o.children.length>0){const s=e(o.children,a,c+N+16,l+1);n.children=s.nodes,c=Math.max(c+N+16,c+N+16+s.height);for(const e of s.nodes)t.push({x1:n.x+70,y1:n.y+N,x2:e.x+70,y2:e.y,dashed:"call"===o.type})}else c+=52;i.push(n),s.push(n)}return{nodes:i,height:c-r}}(e,0,20,0);for(let e=1;e<a.nodes.length;e++){const s=a.nodes[e-1],n=a.nodes[e];if(s.x===n.x){const e=z(s);t.push({x1:s.x+70,y1:e,x2:n.x+70,y2:n.y})}}let n=1/0,r=1/0,l=-1/0,i=-1/0;for(const e of s)n=Math.min(n,e.x),r=Math.min(r,e.y),l=Math.max(l,e.x+e.w),i=Math.max(i,e.y+e.h);return{layoutNodes:s,edges:t,bounds:{minX:n,minY:r,maxX:l+40,maxY:i+20}}},[e]),b=s.useCallback(()=>{if(!n.current||0===y.length)return;const e=n.current.getBoundingClientRect(),s=j.maxX-j.minX,t=j.maxY-j.minY;if(0===s||0===t)return;const a=.9*Math.min(e.width/s,e.height/t,2);l(a),c({x:(e.width-s*a)/2-j.minX*a,y:(e.height-t*a)/2-j.minY*a})},[y,j]);s.useEffect(()=>{b()},[e,b]),s.useEffect(()=>{if(null===a)return;const e=y.find(e=>e.line===a);if(!e||!n.current)return;const s=n.current.getBoundingClientRect(),t=e.x+70,l=e.y+18;c({x:s.width/2-t*r,y:s.height/2-l*r})},[a,y,r]);const k=s.useCallback(e=>{e.preventDefault(),l(s=>Math.max(.2,Math.min(3,s+(e.deltaY>0?-.1:.1))))},[]),v=s.useCallback(e=>{0===e.button&&(o.current=!0,u(e=>e+1),c(s=>(d.current={x:e.clientX-s.x,y:e.clientY-s.y},s)))},[]),_=s.useCallback(e=>{o.current&&c({x:e.clientX-d.current.x,y:e.clientY-d.current.y})},[]),S=s.useCallback(()=>{o.current=!1,u(e=>e+1)},[]);return t.jsxs("div",{className:"relative w-full h-full",children:[t.jsxs("div",{className:"absolute top-1 right-1 z-10 flex gap-0.5",children:[t.jsx("button",{className:"p-1 rounded bg-muted/50 hover:bg-muted",onClick:()=>l(e=>Math.min(3,e+.2)),children:t.jsx(m,{className:"h-3 w-3"})}),t.jsx("button",{className:"p-1 rounded bg-muted/50 hover:bg-muted",onClick:()=>l(e=>Math.max(.2,e-.2)),children:t.jsx(f,{className:"h-3 w-3"})}),t.jsx("button",{className:"p-1 rounded bg-muted/50 hover:bg-muted",onClick:b,children:t.jsx(g,{className:"h-3 w-3"})})]}),t.jsxs("svg",{ref:n,className:"w-full h-full",onWheel:k,onMouseDown:v,onMouseMove:_,onMouseUp:S,onMouseLeave:S,style:{cursor:o.current?"grabbing":"grab"},children:[t.jsx("defs",{children:t.jsx("marker",{id:"arrow",viewBox:"0 0 10 10",refX:"10",refY:"5",markerWidth:"6",markerHeight:"6",orient:"auto-start-reverse",children:t.jsx("path",{d:"M 0 0 L 10 5 L 0 10 z",className:"fill-muted-foreground"})})}),t.jsxs("g",{transform:`translate(${i.x},${i.y}) scale(${r})`,children:[p.map((e,s)=>t.jsx("line",{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,className:"stroke-muted-foreground",strokeWidth:1,strokeDasharray:e.dashed?"4,2":void 0,markerEnd:"url(#arrow)"},`e${s}`)),y.map(e=>{const s=C[e.status??""]??M,n=a===e.line;return t.jsxs("g",{onClick:()=>x(e),style:{cursor:"pointer"},children:[t.jsx("rect",{x:e.x,y:e.y,width:e.w,height:e.h,rx:6,fill:s.fill,stroke:n?"#60a5fa":s.stroke,strokeWidth:n?2:1,strokeDasharray:"skipped"===e.status?"4,2":void 0}),"running"===e.status&&t.jsx("rect",{x:e.x,y:e.y,width:e.w,height:e.h,rx:6,fill:"none",stroke:"#3b82f6",strokeWidth:2,opacity:.5,children:t.jsx("animate",{attributeName:"opacity",values:"0.5;0;0.5",dur:"2s",repeatCount:"indefinite"})}),t.jsx("text",{x:e.x+6,y:e.y+13,fontSize:9,className:"fill-muted-foreground",fontFamily:"monospace",children:e.type}),t.jsx("text",{x:e.x+6,y:e.y+26,fontSize:10,className:"fill-foreground",clipPath:"inset(0 0 0 0)",children:e.label.length>16?e.label.slice(0,16)+"…":e.label}),e.node_id&&t.jsxs("text",{x:e.x+e.w-4,y:e.y+10,fontSize:7,className:"fill-muted-foreground",textAnchor:"end",children:["#",e.node_id]})]},e.id)})]})]}),h&&t.jsxs("div",{className:"absolute bottom-2 left-2 right-2 bg-background/95 border border-border rounded-lg p-3 text-xs shadow-lg z-20",onClick:e=>e.stopPropagation(),children:[t.jsxs("div",{className:"flex justify-between items-start mb-1",children:[t.jsxs("span",{className:"font-mono text-muted-foreground",children:[h.type," L",h.line]}),t.jsx("button",{className:"text-muted-foreground hover:text-foreground",onClick:()=>x(null),children:"✕"})]}),t.jsx("div",{className:"text-foreground mb-1",children:h.label}),h.status&&t.jsxs("div",{className:"text-muted-foreground",children:["状态: ",h.status]}),h.node_id&&t.jsxs("div",{className:"text-muted-foreground",children:["节点 ID: #",h.node_id]})]})]})}function z(e){return 0===e.children.length?e.y+e.h:Math.max(e.y+e.h,...e.children.map(z))}function S({projectId:e,planStatus:m,planNodeUpdate:f,planReplan:g}){const[w,N]=s.useState(null),[C,M]=s.useState(null),[z,S]=s.useState(null),[Y,L]=s.useState(!1);s.useEffect(()=>{let s=!1;return(async()=>{try{const t=await a(e);if(s||N(t),t.hasMainPc){const t=await n(e);s||S(t.tree)}}catch{}})(),()=>{s=!0}},[e]),s.useEffect(()=>{f&&S(e=>e?P(e,f.node_id,f.status):e)},[f]),s.useEffect(()=>{m&&N(e=>e?{...e,state:e.state?{...e.state,...m}:{status:m.status,current_line:m.current_line,executed_tasks:m.executed_tasks,estimated_tasks:m.estimated_tasks}}:e)},[m]),s.useEffect(()=>{0!==g&&n(e).then(e=>S(e.tree)).catch(()=>{})},[g,e]);const X=s.useCallback(async()=>{L(!0);try{await r(e);const s=await a(e);N(s),l.success("Plan Control 已初始化")}catch(s){l.error(s.message)}finally{L(!1)}},[e]),E=s.useCallback(async()=>{L(!0);try{const s=await i(e);if(M(s),s.valid){l.success("语法检查通过");const s=await n(e);S(s.tree)}else l.error(`${s.errors.length} 个语法错误`)}catch(s){l.error(s.message)}finally{L(!1)}},[e]),R=s.useCallback(async()=>{try{await c(e);const s=await a(e);N(s)}catch(s){l.error(s.message)}},[e]),q=s.useCallback(async()=>{try{await o(e)}catch(s){l.error(s.message)}},[e]),D=s.useCallback(async()=>{try{await d(e);const s=await a(e);N(s)}catch(s){l.error(s.message)}},[e]),W=s.useCallback(async()=>{try{await u(e)}catch(s){l.error(s.message)}},[e]),$=null==w?void 0:w.state,B=(null==$?void 0:$.status)??((null==w?void 0:w.hasMainPc)?"ready":(null==w?void 0:w.initialized)?"editing":"none");return t.jsxs("div",{className:"h-full flex flex-col",children:[t.jsxs("div",{className:"flex-none h-8 flex items-center gap-1 px-2 border-b border-border text-xs",children:["none"===B&&t.jsxs(h,{size:"sm",variant:"ghost",className:"h-6 text-xs",onClick:X,disabled:Y,children:[Y?t.jsx(x,{className:"h-3 w-3 animate-spin mr-1"}):null,"初始化"]}),("editing"===B||"ready"===B)&&t.jsxs(t.Fragment,{children:[t.jsxs(h,{size:"sm",variant:"ghost",className:"h-6 text-xs",onClick:E,disabled:Y,children:[Y?t.jsx(x,{className:"h-3 w-3 animate-spin mr-1"}):t.jsx(j,{className:"h-3 w-3 mr-1"}),"检查"]}),(null==C?void 0:C.valid)&&t.jsxs(h,{size:"sm",variant:"ghost",className:"h-6 text-xs",onClick:R,children:[t.jsx(y,{className:"h-3 w-3 mr-1"}),"启动"]})]}),("running"===B||"waiting"===B)&&t.jsxs(t.Fragment,{children:[t.jsxs("span",{className:"text-muted-foreground",children:["已完成 ",(null==$?void 0:$.executed_tasks)??0,"(≥",(null==$?void 0:$.estimated_tasks)??0,")"]}),t.jsx("div",{className:"flex-1"}),t.jsx(h,{size:"sm",variant:"ghost",className:"h-6 text-xs",onClick:q,children:t.jsx(b,{className:"h-3 w-3"})}),t.jsx(h,{size:"sm",variant:"ghost",className:"h-6 text-xs",onClick:W,children:t.jsx(v,{className:"h-3 w-3"})})]}),("paused"===B||"stopped"===B)&&t.jsxs(h,{size:"sm",variant:"ghost",className:"h-6 text-xs",onClick:D,children:[t.jsx(k,{className:"h-3 w-3 mr-1"}),"继续"]}),"completed"===B&&t.jsxs("span",{className:"text-green-500 flex items-center gap-1",children:[t.jsx(j,{className:"h-3 w-3"})," 已完成"]})]}),C&&!C.valid&&t.jsx("div",{className:"flex-none max-h-24 overflow-y-auto px-2 py-1 border-b border-border bg-red-500/5",children:C.errors.map((e,s)=>t.jsxs("div",{className:"text-[10px] text-red-400 flex gap-1",children:[t.jsx(p,{className:"h-3 w-3 flex-shrink-0 mt-0.5"}),t.jsxs("span",{children:["第",e.line,"行: ",e.message]})]},s))}),t.jsx("div",{className:"flex-1 min-h-0 overflow-hidden",children:z?t.jsx(_,{tree:z,currentLine:(null==$?void 0:$.current_line)??null}):t.jsx("div",{className:"flex items-center justify-center h-full text-xs text-muted-foreground",children:(null==w?void 0:w.initialized)?(null==w?void 0:w.hasMainPc)?'点击"检查"查看任务树':"等待 AI 编写计划...":'点击"初始化"开始'})})]})}function P(e,s,t){return e.map(e=>e.node_id===s?{...e,status:t}:e.children.length>0?{...e,children:P(e.children,s,t)}:e)}export{S as PlanPanel};
13
+ */function z({tree:e,currentLine:a}){const n=s.useRef(null),[r,l]=s.useState(1),[i,c]=s.useState({x:0,y:0}),o=s.useRef(!1),d=s.useRef({x:0,y:0}),[,u]=s.useState(0),[h,x]=s.useState(null),{layoutNodes:y,edges:p,bounds:j}=s.useMemo(()=>{const s=[],t=[];const a=function e(a,n,r,l){const i=[];let c=r;for(const o of a){const a=40+160*l,n={id:o.id,x:a,y:c,w:w,h:N,type:o.type,label:o.label,status:o.status,node_id:o.node_id,line:o.line,children:[]};if(o.children.length>0){const s=e(o.children,a,c+N+16,l+1);n.children=s.nodes,c=Math.max(c+N+16,c+N+16+s.height);for(const e of s.nodes)t.push({x1:n.x+70,y1:n.y+N,x2:e.x+70,y2:e.y,dashed:"call"===o.type})}else c+=52;i.push(n),s.push(n)}return{nodes:i,height:c-r}}(e,0,20,0);for(let e=1;e<a.nodes.length;e++){const s=a.nodes[e-1],n=a.nodes[e];if(s.x===n.x){const e=_(s);t.push({x1:s.x+70,y1:e,x2:n.x+70,y2:n.y})}}let n=1/0,r=1/0,l=-1/0,i=-1/0;for(const e of s)n=Math.min(n,e.x),r=Math.min(r,e.y),l=Math.max(l,e.x+e.w),i=Math.max(i,e.y+e.h);return{layoutNodes:s,edges:t,bounds:{minX:n,minY:r,maxX:l+40,maxY:i+20}}},[e]),b=s.useCallback(()=>{if(!n.current||0===y.length)return;const e=n.current.getBoundingClientRect(),s=j.maxX-j.minX,t=j.maxY-j.minY;if(0===s||0===t)return;const a=.9*Math.min(e.width/s,e.height/t,2);l(a),c({x:(e.width-s*a)/2-j.minX*a,y:(e.height-t*a)/2-j.minY*a})},[y,j]);s.useEffect(()=>{b()},[e,b]),s.useEffect(()=>{if(null===a)return;const e=y.find(e=>e.line===a);if(!e||!n.current)return;const s=n.current.getBoundingClientRect(),t=e.x+70,l=e.y+18;c({x:s.width/2-t*r,y:s.height/2-l*r})},[a,y,r]);const k=s.useCallback(e=>{e.preventDefault(),l(s=>Math.max(.2,Math.min(3,s+(e.deltaY>0?-.1:.1))))},[]),v=s.useCallback(e=>{0===e.button&&(o.current=!0,u(e=>e+1),c(s=>(d.current={x:e.clientX-s.x,y:e.clientY-s.y},s)))},[]),z=s.useCallback(e=>{o.current&&c({x:e.clientX-d.current.x,y:e.clientY-d.current.y})},[]),S=s.useCallback(()=>{o.current=!1,u(e=>e+1)},[]);return t.jsxs("div",{className:"relative w-full h-full",children:[t.jsxs("div",{className:"absolute top-1 right-1 z-10 flex gap-0.5",children:[t.jsx("button",{className:"p-1 rounded bg-muted/50 hover:bg-muted",onClick:()=>l(e=>Math.min(3,e+.2)),children:t.jsx(m,{className:"h-3 w-3"})}),t.jsx("button",{className:"p-1 rounded bg-muted/50 hover:bg-muted",onClick:()=>l(e=>Math.max(.2,e-.2)),children:t.jsx(f,{className:"h-3 w-3"})}),t.jsx("button",{className:"p-1 rounded bg-muted/50 hover:bg-muted",onClick:b,children:t.jsx(g,{className:"h-3 w-3"})})]}),t.jsxs("svg",{ref:n,className:"w-full h-full",onWheel:k,onMouseDown:v,onMouseMove:z,onMouseUp:S,onMouseLeave:S,style:{cursor:o.current?"grabbing":"grab"},children:[t.jsx("defs",{children:t.jsx("marker",{id:"arrow",viewBox:"0 0 10 10",refX:"10",refY:"5",markerWidth:"6",markerHeight:"6",orient:"auto-start-reverse",children:t.jsx("path",{d:"M 0 0 L 10 5 L 0 10 z",className:"fill-muted-foreground"})})}),t.jsxs("g",{transform:`translate(${i.x},${i.y}) scale(${r})`,children:[p.map((e,s)=>t.jsx("line",{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,className:"stroke-muted-foreground",strokeWidth:1,strokeDasharray:e.dashed?"4,2":void 0,markerEnd:"url(#arrow)"},`e${s}`)),y.map(e=>{const s=C[e.status??""]??M,n=a===e.line;return t.jsxs("g",{onClick:()=>x(e),style:{cursor:"pointer"},children:[t.jsx("rect",{x:e.x,y:e.y,width:e.w,height:e.h,rx:6,fill:s.fill,stroke:n?"#60a5fa":s.stroke,strokeWidth:n?2:1,strokeDasharray:"skipped"===e.status?"4,2":void 0}),"running"===e.status&&t.jsx("rect",{x:e.x,y:e.y,width:e.w,height:e.h,rx:6,fill:"none",stroke:"#3b82f6",strokeWidth:2,opacity:.5,children:t.jsx("animate",{attributeName:"opacity",values:"0.5;0;0.5",dur:"2s",repeatCount:"indefinite"})}),t.jsx("text",{x:e.x+6,y:e.y+13,fontSize:9,className:"fill-muted-foreground",fontFamily:"monospace",children:e.type}),t.jsx("text",{x:e.x+6,y:e.y+26,fontSize:10,className:"fill-foreground",clipPath:"inset(0 0 0 0)",children:e.label.length>16?e.label.slice(0,16)+"…":e.label}),e.node_id&&t.jsxs("text",{x:e.x+e.w-4,y:e.y+10,fontSize:7,className:"fill-muted-foreground",textAnchor:"end",children:["#",e.node_id]})]},e.id)})]})]}),h&&t.jsxs("div",{className:"absolute bottom-2 left-2 right-2 bg-background/95 border border-border rounded-lg p-3 text-xs shadow-lg z-20",onClick:e=>e.stopPropagation(),children:[t.jsxs("div",{className:"flex justify-between items-start mb-1",children:[t.jsxs("span",{className:"font-mono text-muted-foreground",children:[h.type," L",h.line]}),t.jsx("button",{className:"text-muted-foreground hover:text-foreground",onClick:()=>x(null),children:"✕"})]}),t.jsx("div",{className:"text-foreground mb-1",children:h.label}),h.status&&t.jsxs("div",{className:"text-muted-foreground",children:["状态: ",h.status]}),h.node_id&&t.jsxs("div",{className:"text-muted-foreground",children:["节点 ID: #",h.node_id]})]})]})}function _(e){return 0===e.children.length?e.y+e.h:Math.max(e.y+e.h,...e.children.map(_))}function S({projectId:e,planStatus:m,planNodeUpdate:f,planReplan:g}){const[w,N]=s.useState(null),[C,M]=s.useState(null),[_,S]=s.useState(null),[Y,L]=s.useState(!1);s.useEffect(()=>{let s=!1;return(async()=>{try{const t=await a(e);if(s||N(t),t.hasMainPc){const t=await n(e);s||S(t.tree)}}catch{}})(),()=>{s=!0}},[e]),s.useEffect(()=>{f&&S(e=>e?P(e,f.node_id,f.status):e)},[f]),s.useEffect(()=>{m&&N(e=>e?{...e,state:e.state?{...e.state,...m}:{status:m.status,current_line:m.current_line,executed_tasks:m.executed_tasks,estimated_tasks:m.estimated_tasks}}:e)},[m]),s.useEffect(()=>{0!==g&&n(e).then(e=>S(e.tree)).catch(()=>{})},[g,e]);const X=s.useCallback(async()=>{L(!0);try{await r(e);const s=await a(e);N(s),l.success("Plan Control 已初始化")}catch(s){l.error(s.message)}finally{L(!1)}},[e]),E=s.useCallback(async()=>{L(!0);try{const s=await i(e);if(M(s),s.valid){l.success("语法检查通过");const s=await n(e);S(s.tree)}else l.error(`${s.errors.length} 个语法错误`)}catch(s){l.error(s.message)}finally{L(!1)}},[e]),R=s.useCallback(async()=>{try{await c(e);const s=await a(e);N(s)}catch(s){l.error(s.message)}},[e]),D=s.useCallback(async()=>{try{await o(e)}catch(s){l.error(s.message)}},[e]),W=s.useCallback(async()=>{try{await d(e);const s=await a(e);N(s)}catch(s){l.error(s.message)}},[e]),$=s.useCallback(async()=>{try{await u(e)}catch(s){l.error(s.message)}},[e]),q=null==w?void 0:w.state,B=(null==q?void 0:q.status)??((null==w?void 0:w.hasMainPc)?"ready":(null==w?void 0:w.initialized)?"editing":"none");return t.jsxs("div",{className:"h-full flex flex-col",children:[t.jsxs("div",{className:"flex-none h-8 flex items-center gap-1 px-2 border-b border-border text-xs",children:["none"===B&&t.jsxs(h,{size:"sm",variant:"ghost",className:"h-6 text-xs",onClick:X,disabled:Y,children:[Y?t.jsx(x,{className:"h-3 w-3 animate-spin mr-1"}):null,"初始化"]}),("editing"===B||"ready"===B)&&t.jsxs(t.Fragment,{children:[t.jsxs(h,{size:"sm",variant:"ghost",className:"h-6 text-xs",onClick:E,disabled:Y,children:[Y?t.jsx(x,{className:"h-3 w-3 animate-spin mr-1"}):t.jsx(j,{className:"h-3 w-3 mr-1"}),"检查"]}),(null==C?void 0:C.valid)&&t.jsxs(h,{size:"sm",variant:"ghost",className:"h-6 text-xs",onClick:R,children:[t.jsx(y,{className:"h-3 w-3 mr-1"}),"启动"]})]}),("running"===B||"waiting"===B)&&t.jsxs(t.Fragment,{children:[t.jsxs("span",{className:"text-muted-foreground",children:["已完成 ",(null==q?void 0:q.executed_tasks)??0,"(≥",(null==q?void 0:q.estimated_tasks)??0,")"]}),t.jsx("div",{className:"flex-1"}),t.jsx(h,{size:"sm",variant:"ghost",className:"h-6 text-xs",onClick:D,children:t.jsx(b,{className:"h-3 w-3"})}),t.jsx(h,{size:"sm",variant:"ghost",className:"h-6 text-xs",onClick:$,children:t.jsx(v,{className:"h-3 w-3"})})]}),("paused"===B||"stopped"===B)&&t.jsxs(h,{size:"sm",variant:"ghost",className:"h-6 text-xs",onClick:W,children:[t.jsx(k,{className:"h-3 w-3 mr-1"}),"继续"]}),"completed"===B&&t.jsxs("span",{className:"text-green-500 flex items-center gap-1",children:[t.jsx(j,{className:"h-3 w-3"})," 已完成"]})]}),C&&!C.valid&&t.jsx("div",{className:"flex-none max-h-24 overflow-y-auto px-2 py-1 border-b border-border bg-red-500/5",children:C.errors.map((e,s)=>t.jsxs("div",{className:"text-[10px] text-red-400 flex gap-1",children:[t.jsx(p,{className:"h-3 w-3 flex-shrink-0 mt-0.5"}),t.jsxs("span",{children:["第",e.line,"行: ",e.message]})]},s))}),t.jsx("div",{className:"flex-1 min-h-0 overflow-hidden",children:_?t.jsx(z,{tree:_,currentLine:(null==q?void 0:q.current_line)??null}):t.jsx("div",{className:"flex items-center justify-center h-full text-xs text-muted-foreground",children:(null==w?void 0:w.initialized)?(null==w?void 0:w.hasMainPc)?'点击"检查"查看任务树':"等待 AI 编写计划...":'点击"初始化"开始'})})]})}function P(e,s,t){return e.map(e=>e.node_id===s?{...e,status:t}:e.children.length>0?{...e,children:P(e.children,s,t)}:e)}export{S as PlanPanel};