@taskforcehq/taskforce 0.3.307 → 0.3.309

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 (50) hide show
  1. package/dist/components/views/PlanComparisonPage.d.ts +20 -15
  2. package/dist/components/views/PlanComparisonPage.js +214 -83
  3. package/dist/components/views/PlanComparisonPage.test.js +249 -14
  4. package/dist/components/views/PlansPage.js +15 -9
  5. package/dist/components/views/PlansPage.test.js +4 -2
  6. package/dist/core/GlobalSettingsService.js +18 -0
  7. package/dist/core/GlobalSettingsService.test.d.ts +1 -0
  8. package/dist/core/GlobalSettingsService.test.js +45 -0
  9. package/dist/core/PlanEntitlementService.d.ts +20 -0
  10. package/dist/core/PlanEntitlementService.js +215 -19
  11. package/dist/core/PlanFeatureCatalog.test.js +55 -0
  12. package/dist/core/Taskforce.d.ts +14 -0
  13. package/dist/core/Taskforce.js +6 -0
  14. package/dist/core/types.d.ts +3 -0
  15. package/dist/migrations/taskSchemaMigrations.js +37 -15
  16. package/dist/server/routes/admin.js +146 -5
  17. package/dist/server/routes/authSupport.d.ts +1 -0
  18. package/dist/server/routes/authSupport.js +2 -1
  19. package/dist/server/routes/billing.d.ts +1 -0
  20. package/dist/server/routes/billing.js +105 -63
  21. package/dist/server/routes/billing.test.js +159 -11
  22. package/dist/server/routes.test.js +91 -10
  23. package/dist/ui/agent-logos/Gemini CLI.jpeg +0 -0
  24. package/dist/ui/agent-logos/antigravity.jpeg +0 -0
  25. package/dist/ui/agent-logos/chatgpt.png +0 -0
  26. package/dist/ui/agent-logos/claude-code.jpeg +0 -0
  27. package/dist/ui/agent-logos/codex.jpeg +0 -0
  28. package/dist/ui/agent-logos/cursor.png +0 -0
  29. package/dist/ui/agent-logos/openclaw.jpeg +0 -0
  30. package/dist/ui/agent-logos/windsurf.png +0 -0
  31. package/dist/ui/assets/{AgentsModule-2y82_3DO.js → AgentsModule-BS4Pi_nC.js} +1 -1
  32. package/dist/ui/assets/{AnnotatedAttachmentWorkspace-BTLZZCiQ.js → AnnotatedAttachmentWorkspace-CCckzWYZ.js} +1 -1
  33. package/dist/ui/assets/{ContextAttachmentManager-D2epuNnG.js → ContextAttachmentManager-CfG_ER7C.js} +1 -1
  34. package/dist/ui/assets/{DocumentWorkspace-sVa-3Do6.js → DocumentWorkspace-BVaWPA25.js} +1 -1
  35. package/dist/ui/assets/{EntityActivityTimeline-Zods27y_.js → EntityActivityTimeline-DSj0ThaK.js} +1 -1
  36. package/dist/ui/assets/{InitiativesModule-D4XseTwW.js → InitiativesModule-AxMkWtxH.js} +1 -1
  37. package/dist/ui/assets/PlansPage-B_z-D6Nh.css +1 -0
  38. package/dist/ui/assets/PlansPage-Ndt7mYfo.js +1 -0
  39. package/dist/ui/assets/{TaskContextUpload-uC5qx4Bv.js → TaskContextUpload-Dw4rTF4i.js} +1 -1
  40. package/dist/ui/assets/{TaskSettings-CqvPAsTv.js → TaskSettings-f2ga42_V.js} +1 -1
  41. package/dist/ui/assets/{WorkflowsModule-oOA9bcdK.js → WorkflowsModule-E4UL3mov.js} +1 -1
  42. package/dist/ui/assets/documentReferences-BOUcJm6-.js +1 -0
  43. package/dist/ui/assets/{index-CYyodXsg.css → index-BvAbqx5Q.css} +1 -1
  44. package/dist/ui/assets/{index-607WPo_X.js → index-MAHKvFqp.js} +4 -4
  45. package/dist/ui/index.html +2 -2
  46. package/dist/ui/og-image.png +0 -0
  47. package/package.json +1 -1
  48. package/dist/ui/assets/PlansPage-D5AcbO0L.js +0 -1
  49. package/dist/ui/assets/PlansPage-Dvqsz5zc.css +0 -1
  50. package/dist/ui/assets/documentReferences-DPZuTgHh.js +0 -1
@@ -1,3 +1,3 @@
1
- import{j as t,r as s,R as ta}from"./vendor-react-CKJs5o3c.js";import{R as An,f as ge,e as $t,g as Mn,t as Da,M as aa}from"./index-607WPo_X.js";import{a4 as za,w as En,v as Ln,p as Fn,P as Hn,c as na,T as Ua,r as On,h as Ga,ak as Dn,R as zn,al as Un,am as Gn,an as Yn,ao as oa,C as ia,ap as Wn,aq as Ja,ar as Za,as as Qa,at as en,g as Kn,f as Xn,b as la}from"./vendor-icons-B32hGuF2.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";function Vn({copied:r,disabled:l=!1,label:f,onClick:p,title:b="Copy image reference",ariaLabel:x,className:L=""}){return t.jsx(An,{copied:r,disabled:l,label:"",onClick:p,title:b,ariaLabel:x,className:L,children:f})}const qn="_shell_17mlo_1",Jn="_shellWithImageTray_17mlo_18",Zn="_shellImageTrayOpen_17mlo_22",Qn="_imageTrayPanel_17mlo_26",es="_imageTrayPanelOpen_17mlo_50",ts="_imageTrayHeader_17mlo_58",as="_imageTrayTitle_17mlo_73",ns="_imageTraySearch_17mlo_85",ss="_imageTraySearchIcon_17mlo_91",rs="_imageTraySearchInput_17mlo_100",os="_imageTrayList_17mlo_117",is="_imageTrayState_17mlo_129",ls="_imageTrayStateError_17mlo_130",cs="_imageTrayItem_17mlo_142",ds="_imageTrayItemActive_17mlo_164",us="_imageTrayThumb_17mlo_174",ms="_imageTrayItemBody_17mlo_191",fs="_imageTrayItemTitle_17mlo_199",hs="_imageTrayItemTask_17mlo_200",ps="_imageTrayItemMetaDetails_17mlo_201",gs="_imageTrayItemMeta_17mlo_201",ys="_imageTrayItemReference_17mlo_239",bs="_panel_17mlo_246",xs="_sessionPanel_17mlo_252",vs="_detailPanel_17mlo_253",_s="_sessionContextBar_17mlo_259",Is="_sessionContextLeft_17mlo_270",ks="_sessionContextRight_17mlo_271",ws="_sessionContextLabel_17mlo_286",Ss="_sessionContextSpacer_17mlo_292",Ns="_canvasPanel_17mlo_297",Cs="_canvasWorkspace_17mlo_304",js="_canvasMain_17mlo_311",Ts="_panelHeader_17mlo_318",$s="_panelHeaderText_17mlo_327",Rs="_panelTitle_17mlo_331",Ps="_canvasHeading_17mlo_335",Bs="_sessionActions_17mlo_339",As="_sessionList_17mlo_347",Ms="_annotationList_17mlo_348",Es="_markerHelpModalBody_17mlo_363",Ls="_openImageModalBody_17mlo_369",Fs="_openImageField_17mlo_375",Hs="_openImageActions_17mlo_379",Os="_markerHelpItem_17mlo_385",Ds="_markerHelpHeader_17mlo_393",zs="_markerHelpExample_17mlo_405",Us="_sessionCard_17mlo_409",Gs="_annotationCard_17mlo_410",Ys="_sessionEmptyState_17mlo_427",Ws="_sessionCardButton_17mlo_434",Ks="_annotationCardButton_17mlo_444",Xs="_sessionCardBody_17mlo_454",Vs="_sessionCardActive_17mlo_460",qs="_annotationCardActive_17mlo_461",Js="_annotationMeta_17mlo_471",Zs="_annotationInstructionPreview_17mlo_478",Qs="_annotationPreviewFooter_17mlo_486",er="_annotationInstructionEditor_17mlo_493",tr="_annotationTypeField_17mlo_499",ar="_annotationInstructionButton_17mlo_505",nr="_annotationInstructionField_17mlo_514",sr="_sessionMeta_17mlo_518",rr="_sessionTitle_17mlo_525",or="_annotationTitle_17mlo_526",ir="_sessionTimestamp_17mlo_532",lr="_annotationKind_17mlo_533",cr="_annotationInstructionTypeIcon_17mlo_537",dr="_sessionInstructionPreview_17mlo_543",ur="_sessionInstructionEditor_17mlo_551",mr="_sessionCardFooter_17mlo_557",fr="_toolRail_17mlo_564",hr="_canvasToolRail_17mlo_573",pr="_toolbarCluster_17mlo_594",gr="_toolbarViewportCluster_17mlo_601",yr="_toolbarSeparator_17mlo_605",br="_toolBtn_17mlo_611",xr="_toolRailButton_17mlo_615",vr="_toolbarButton_17mlo_625",_r="_toolBtnActive_17mlo_630",Ir="_toolbarActions_17mlo_637",kr="_toolbarSelectionActions_17mlo_646",wr="_toolbarColorPicker_17mlo_654",Sr="_colorPickerButton_17mlo_658",Nr="_colorPickerSwatch_17mlo_663",Cr="_colorPickerPopover_17mlo_671",jr="_colorOption_17mlo_686",Tr="_colorOptionActive_17mlo_696",$r="_toolbarUtilities_17mlo_703",Rr="_toolbarGeometryFields_17mlo_711",Pr="_toolbarGeometryField_17mlo_711",Br="_toolbarGeometryLabel_17mlo_724",Ar="_toolbarGeometryInput_17mlo_730",Mr="_iconButton_17mlo_735",Er="_ghostBtn_17mlo_740",Lr="_payloadBtn_17mlo_741",Fr="_backToTaskBtn_17mlo_742",Hr="_canvasScroller_17mlo_762",Or="_canvasFrame_17mlo_778",Dr="_canvasMedia_17mlo_785",zr="_canvasStatusOverlay_17mlo_793",Ur="_canvasStatusCard_17mlo_805",Gr="_canvasImage_17mlo_818",Yr="_overlay_17mlo_825",Wr="_overlaySelect_17mlo_831",Kr="_overlayPan_17mlo_835",Xr="_overlaySvg_17mlo_839",Vr="_overlayHitLayer_17mlo_848",qr="_arrowHitArea_17mlo_857",Jr="_canvasHandleHit_17mlo_864",Zr="_canvasResizeHandleHit_17mlo_871",Qr="_canvasHandleVisible_17mlo_875",eo="_pin_17mlo_892",to="_note_17mlo_893",ao="_annotationNumberBadge_17mlo_910",no="_box_17mlo_935",so="_boxNumberBadge_17mlo_944",ro="_arrowNumberBadge_17mlo_950",oo="_boxSurface_17mlo_954",io="_selected_17mlo_967",lo="_textInput_17mlo_984",co="_textArea_17mlo_985",uo="_select_17mlo_967",mo="_sessionTitleInput_17mlo_992",fo="_sessionInstructionField_17mlo_997",ho="_detailEmpty_17mlo_1006",po="_emptyState_17mlo_1007",go="_payloadModalBody_17mlo_1019",yo="_payloadModalToolbar_17mlo_1026",bo="_payloadViewToggle_17mlo_1033",xo="_payloadModalActions_17mlo_1034",vo="_payloadModalPreview_17mlo_1041",_o="_statusBar_17mlo_1056",Io="_annotationSummary_17mlo_1068",a={shell:qn,shellWithImageTray:Jn,shellImageTrayOpen:Zn,imageTrayPanel:Qn,imageTrayPanelOpen:es,imageTrayHeader:ts,imageTrayTitle:as,imageTraySearch:ns,imageTraySearchIcon:ss,imageTraySearchInput:rs,imageTrayList:os,imageTrayState:is,imageTrayStateError:ls,imageTrayItem:cs,imageTrayItemActive:ds,imageTrayThumb:us,imageTrayItemBody:ms,imageTrayItemTitle:fs,imageTrayItemTask:hs,imageTrayItemMetaDetails:ps,imageTrayItemMeta:gs,imageTrayItemReference:ys,panel:bs,sessionPanel:xs,detailPanel:vs,sessionContextBar:_s,sessionContextLeft:Is,sessionContextRight:ks,sessionContextLabel:ws,sessionContextSpacer:Ss,canvasPanel:Ns,canvasWorkspace:Cs,canvasMain:js,panelHeader:Ts,panelHeaderText:$s,panelTitle:Rs,canvasHeading:Ps,sessionActions:Bs,sessionList:As,annotationList:Ms,markerHelpModalBody:Es,openImageModalBody:Ls,openImageField:Fs,openImageActions:Hs,markerHelpItem:Os,markerHelpHeader:Ds,markerHelpExample:zs,sessionCard:Us,annotationCard:Gs,sessionEmptyState:Ys,sessionCardButton:Ws,annotationCardButton:Ks,sessionCardBody:Xs,sessionCardActive:Vs,annotationCardActive:qs,annotationMeta:Js,annotationInstructionPreview:Zs,annotationPreviewFooter:Qs,annotationInstructionEditor:er,annotationTypeField:tr,annotationInstructionButton:ar,annotationInstructionField:nr,sessionMeta:sr,sessionTitle:rr,annotationTitle:or,sessionTimestamp:ir,annotationKind:lr,annotationInstructionTypeIcon:cr,sessionInstructionPreview:dr,sessionInstructionEditor:ur,sessionCardFooter:mr,toolRail:fr,canvasToolRail:hr,toolbarCluster:pr,toolbarViewportCluster:gr,toolbarSeparator:yr,toolBtn:br,toolRailButton:xr,toolbarButton:vr,toolBtnActive:_r,toolbarActions:Ir,toolbarSelectionActions:kr,toolbarColorPicker:wr,colorPickerButton:Sr,colorPickerSwatch:Nr,colorPickerPopover:Cr,colorOption:jr,colorOptionActive:Tr,toolbarUtilities:$r,toolbarGeometryFields:Rr,toolbarGeometryField:Pr,toolbarGeometryLabel:Br,toolbarGeometryInput:Ar,iconButton:Mr,ghostBtn:Er,payloadBtn:Lr,backToTaskBtn:Fr,canvasScroller:Hr,canvasFrame:Or,canvasMedia:Dr,canvasStatusOverlay:zr,canvasStatusCard:Ur,canvasImage:Gr,overlay:Yr,overlaySelect:Wr,overlayPan:Kr,overlaySvg:Xr,overlayHitLayer:Vr,arrowHitArea:qr,canvasHandleHit:Jr,canvasResizeHandleHit:Zr,canvasHandleVisible:Qr,pin:eo,note:to,annotationNumberBadge:ao,box:no,boxNumberBadge:so,arrowNumberBadge:ro,boxSurface:oo,selected:io,textInput:lo,textArea:co,select:uo,sessionTitleInput:mo,sessionInstructionField:fo,detailEmpty:ho,emptyState:po,payloadModalBody:go,payloadModalToolbar:yo,payloadViewToggle:bo,payloadModalActions:xo,payloadModalPreview:vo,statusBar:_o,annotationSummary:Io},Ya=[{value:"review",label:"Review"},{value:"change",label:"Change"},{value:"question",label:"Question"}],Wa=[{value:"select",label:"Select",icon:Wn},{value:"pin",label:"Pin",icon:Ja},{value:"box",label:"Box",icon:Za},{value:"arrow",label:"Arrow",icon:Qa},{value:"text-note",label:"Note",icon:en}],ko={pin:Ja,box:Za,arrow:Qa,"text-note":en},wo={pin:"Pin",box:"Box",arrow:"Arrow","text-note":"Note"},So={review:oa,change:la,question:ia,issue:ia,idea:oa},Rt={select:{short:"Select and edit existing markers.",detail:"Use Select to click, drag, reorder, resize, and update markers that are already on the image.",example:"Example: move an existing marker after the screenshot changes."},pin:{short:"Mark a precise spot.",detail:"Use Pin when feedback points to one exact location instead of a broader area.",example:'Example: "This icon is misaligned by 2px."'},box:{short:"Mark an area or component.",detail:"Use Box when the feedback applies to a whole region, card, panel, or bounded UI block.",example:'Example: "This whole card needs tighter padding and a stronger border."'},arrow:{short:"Show direction or relationship.",detail:"Use Arrow when you need to show movement, attachment, flow, or source-to-target intent.",example:'Example: "This tooltip should anchor to this button, not the panel."'},"text-note":{short:"Add a comment-style point marker.",detail:"Use Note when you want a point marker that reads more like a comment or open question.",example:'Example: "Ask design whether this badge should stay."'}},lt={question:"#0f766e",change:"#2563eb",issue:"#dc2626",idea:"#d97706",review:"#7c3aed"},No=["#7c3aed","#2563eb","#0f766e","#dc2626","#d97706","#111827"],ce="review";function Ye(r){const l=String(r.displayName||"").trim();return l?`${l} review`:"Annotated session"}function tn(){return`annotation-${Math.random().toString(36).slice(2,10)}`}function I(r){return!Number.isFinite(r)||r<=0?0:r>=1?1:r}function Ne(r){return I(Math.max(.02,r))}function Ge(r){return r?[String(r.taskId||"").trim(),String(r.assetId||"").trim(),String(r.path||"").trim()].join("::"):""}function Co(r){if(!(r instanceof HTMLElement))return!1;const l=r.tagName.toLowerCase();return r.isContentEditable?!0:l==="input"||l==="textarea"||l==="select"}function Se(r){return r.map((l,f)=>({...l,order:f}))}function sa(r){if(!r)return"Unsaved";const l=new Date(r);return Number.isNaN(l.getTime())?"Unsaved":l.toLocaleString()}function jo(r){const l=typeof r=="number"&&Number.isFinite(r)?Math.max(0,r):0;return l<1024?`${l}B`:l<1024*1024?`${(l/1024).toFixed(1)}KB`:`${(l/(1024*1024)).toFixed(1)}MB`}function To(r){if(!r)return"";const l=new Date(r);if(Number.isNaN(l.getTime()))return"";const p=new Date().getTime()-l.getTime(),b=Math.floor(p/(1e3*60*60*24));return b<=0?"Today":b===1?"Yesterday":b<7?`${b}d ago`:b<30?`${Math.floor(b/7)}w ago`:l.toLocaleDateString()}function Pt(r){const l=String(r.createdByActor?.label||"").trim();return l||null}function $o(r){const l=String(r||"").trim().replace(/\s+/g," ");return l?l.length>110?`${l.slice(0,107)}...`:l:""}function Ka(r,l,f,p=lt[ce]){const b={id:tn(),order:0,instruction:"",markerType:ce,color:p};if(r==="pin")return{...b,kind:r,x:l.x,y:l.y};if(r==="text-note")return{...b,kind:r,x:l.x,y:l.y};if(r==="box"){const L=f||l;return{...b,kind:r,x:I(Math.min(l.x,L.x)),y:I(Math.min(l.y,L.y)),width:Ne(Math.abs(L.x-l.x)),height:Ne(Math.abs(L.y-l.y))}}const x=f||l;return{...b,kind:"arrow",x:l.x,y:l.y,x2:x.x,y2:x.y}}function ra(r){return r.color?r.color:lt[r.markerType||ce]}function Ro(r,l){const f=Math.max(l.width,1),p=Math.max(l.height,1),b=r.x*f,x=r.y*p,L=r.x2*f,ne=r.y2*p,se=L-b,ct=ne-x,Ce=Math.hypot(se,ct)||1,We=se/Ce,je=ct/Ce,G=Math.max(10,Math.min(16,Ce-2)),ye=G*.62,Te=L-We*G,$=ne-je*G,dt=-je,be=We;return{shaftX1:b,shaftY1:x,shaftX2:Te,shaftY2:$,headPoints:[`${L},${ne}`,`${Te+dt*ye},${$+be*ye}`,`${Te-dt*ye},${$-be*ye}`].join(" ")}}function Po(r,l){return{...r,markerType:l,color:r.color||lt[l]}}function Bo(r,l){return{...r,id:tn(),order:l}}function Ao(r,l){const f=String(r||"").trim()||(l?Ye(l):"Annotated session");return/\bcopy$/i.test(f)?`${f} 2`:`${f} copy`}function Mo(r,l,f){if(l===f||l<0||f<0||l>=r.length||f>=r.length)return r;const p=[...r],[b]=p.splice(l,1);return b?(p.splice(f,0,b),Se(p)):r}function ae(r){return String(Math.round(I(r)*1e3)/10)}function Eo(r){const l=Number.parseFloat(r);return Number.isFinite(l)?I(l/100):null}function Lo(r,l,f){return r.kind==="pin"||r.kind==="text-note"?l==="x"||l==="y"?{...r,[l]:I(f)}:r:r.kind==="box"?l==="x"||l==="y"?{...r,[l]:I(f)}:l==="width"||l==="height"?{...r,[l]:Ne(f)}:r:l==="x"||l==="y"||l==="x2"||l==="y2"?{...r,[l]:I(f)}:r}function Fo(r){return r.kind==="pin"||r.kind==="text-note"?[{key:"x",label:"X",value:ae(r.x)},{key:"y",label:"Y",value:ae(r.y)}]:r.kind==="box"?[{key:"x",label:"X",value:ae(r.x)},{key:"y",label:"Y",value:ae(r.y)},{key:"width",label:"Width",value:ae(r.width)},{key:"height",label:"Height",value:ae(r.height)}]:[{key:"x",label:"Start X",value:ae(r.x)},{key:"y",label:"Start Y",value:ae(r.y)},{key:"x2",label:"End X",value:ae(r.x2)},{key:"y2",label:"End Y",value:ae(r.y2)}]}function Ho(r){if(!r)return null;const l=Math.round(r.x*100),f=Math.round(r.y*100),p=Math.round(r.width*100),b=Math.round(r.height*100);return`crop ${l}%, ${f}% size ${p}% x ${b}%`}function Oo(r){return Number.isFinite(r)?Math.min(4,Math.max(.25,Number(r.toFixed(2)))):1}function Xa(r){const l=[`Annotated attachment: ${r.title||r.image.displayName}`,`Image: ${r.image.displayName}`,`Image Reference: ${r.image.referenceLabel||r.image.assetId}`,`Task ID: ${r.taskId}`,r.globalInstruction?`Global instruction: ${r.globalInstruction}`:"Global instruction: None provided.","Markers:"];return r.annotations.length===0?(l.push("0. No markers."),l.join(`
1
+ import{j as t,r as s,R as ta}from"./vendor-react-CKJs5o3c.js";import{R as An,f as ge,e as $t,g as Mn,t as Da,M as aa}from"./index-MAHKvFqp.js";import{a4 as za,w as En,v as Ln,p as Fn,P as Hn,c as na,T as Ua,r as On,h as Ga,ak as Dn,R as zn,al as Un,am as Gn,an as Yn,ao as oa,C as ia,ap as Wn,aq as Ja,ar as Za,as as Qa,at as en,g as Kn,f as Xn,b as la}from"./vendor-icons-B32hGuF2.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";function Vn({copied:r,disabled:l=!1,label:f,onClick:p,title:b="Copy image reference",ariaLabel:x,className:L=""}){return t.jsx(An,{copied:r,disabled:l,label:"",onClick:p,title:b,ariaLabel:x,className:L,children:f})}const qn="_shell_17mlo_1",Jn="_shellWithImageTray_17mlo_18",Zn="_shellImageTrayOpen_17mlo_22",Qn="_imageTrayPanel_17mlo_26",es="_imageTrayPanelOpen_17mlo_50",ts="_imageTrayHeader_17mlo_58",as="_imageTrayTitle_17mlo_73",ns="_imageTraySearch_17mlo_85",ss="_imageTraySearchIcon_17mlo_91",rs="_imageTraySearchInput_17mlo_100",os="_imageTrayList_17mlo_117",is="_imageTrayState_17mlo_129",ls="_imageTrayStateError_17mlo_130",cs="_imageTrayItem_17mlo_142",ds="_imageTrayItemActive_17mlo_164",us="_imageTrayThumb_17mlo_174",ms="_imageTrayItemBody_17mlo_191",fs="_imageTrayItemTitle_17mlo_199",hs="_imageTrayItemTask_17mlo_200",ps="_imageTrayItemMetaDetails_17mlo_201",gs="_imageTrayItemMeta_17mlo_201",ys="_imageTrayItemReference_17mlo_239",bs="_panel_17mlo_246",xs="_sessionPanel_17mlo_252",vs="_detailPanel_17mlo_253",_s="_sessionContextBar_17mlo_259",Is="_sessionContextLeft_17mlo_270",ks="_sessionContextRight_17mlo_271",ws="_sessionContextLabel_17mlo_286",Ss="_sessionContextSpacer_17mlo_292",Ns="_canvasPanel_17mlo_297",Cs="_canvasWorkspace_17mlo_304",js="_canvasMain_17mlo_311",Ts="_panelHeader_17mlo_318",$s="_panelHeaderText_17mlo_327",Rs="_panelTitle_17mlo_331",Ps="_canvasHeading_17mlo_335",Bs="_sessionActions_17mlo_339",As="_sessionList_17mlo_347",Ms="_annotationList_17mlo_348",Es="_markerHelpModalBody_17mlo_363",Ls="_openImageModalBody_17mlo_369",Fs="_openImageField_17mlo_375",Hs="_openImageActions_17mlo_379",Os="_markerHelpItem_17mlo_385",Ds="_markerHelpHeader_17mlo_393",zs="_markerHelpExample_17mlo_405",Us="_sessionCard_17mlo_409",Gs="_annotationCard_17mlo_410",Ys="_sessionEmptyState_17mlo_427",Ws="_sessionCardButton_17mlo_434",Ks="_annotationCardButton_17mlo_444",Xs="_sessionCardBody_17mlo_454",Vs="_sessionCardActive_17mlo_460",qs="_annotationCardActive_17mlo_461",Js="_annotationMeta_17mlo_471",Zs="_annotationInstructionPreview_17mlo_478",Qs="_annotationPreviewFooter_17mlo_486",er="_annotationInstructionEditor_17mlo_493",tr="_annotationTypeField_17mlo_499",ar="_annotationInstructionButton_17mlo_505",nr="_annotationInstructionField_17mlo_514",sr="_sessionMeta_17mlo_518",rr="_sessionTitle_17mlo_525",or="_annotationTitle_17mlo_526",ir="_sessionTimestamp_17mlo_532",lr="_annotationKind_17mlo_533",cr="_annotationInstructionTypeIcon_17mlo_537",dr="_sessionInstructionPreview_17mlo_543",ur="_sessionInstructionEditor_17mlo_551",mr="_sessionCardFooter_17mlo_557",fr="_toolRail_17mlo_564",hr="_canvasToolRail_17mlo_573",pr="_toolbarCluster_17mlo_594",gr="_toolbarViewportCluster_17mlo_601",yr="_toolbarSeparator_17mlo_605",br="_toolBtn_17mlo_611",xr="_toolRailButton_17mlo_615",vr="_toolbarButton_17mlo_625",_r="_toolBtnActive_17mlo_630",Ir="_toolbarActions_17mlo_637",kr="_toolbarSelectionActions_17mlo_646",wr="_toolbarColorPicker_17mlo_654",Sr="_colorPickerButton_17mlo_658",Nr="_colorPickerSwatch_17mlo_663",Cr="_colorPickerPopover_17mlo_671",jr="_colorOption_17mlo_686",Tr="_colorOptionActive_17mlo_696",$r="_toolbarUtilities_17mlo_703",Rr="_toolbarGeometryFields_17mlo_711",Pr="_toolbarGeometryField_17mlo_711",Br="_toolbarGeometryLabel_17mlo_724",Ar="_toolbarGeometryInput_17mlo_730",Mr="_iconButton_17mlo_735",Er="_ghostBtn_17mlo_740",Lr="_payloadBtn_17mlo_741",Fr="_backToTaskBtn_17mlo_742",Hr="_canvasScroller_17mlo_762",Or="_canvasFrame_17mlo_778",Dr="_canvasMedia_17mlo_785",zr="_canvasStatusOverlay_17mlo_793",Ur="_canvasStatusCard_17mlo_805",Gr="_canvasImage_17mlo_818",Yr="_overlay_17mlo_825",Wr="_overlaySelect_17mlo_831",Kr="_overlayPan_17mlo_835",Xr="_overlaySvg_17mlo_839",Vr="_overlayHitLayer_17mlo_848",qr="_arrowHitArea_17mlo_857",Jr="_canvasHandleHit_17mlo_864",Zr="_canvasResizeHandleHit_17mlo_871",Qr="_canvasHandleVisible_17mlo_875",eo="_pin_17mlo_892",to="_note_17mlo_893",ao="_annotationNumberBadge_17mlo_910",no="_box_17mlo_935",so="_boxNumberBadge_17mlo_944",ro="_arrowNumberBadge_17mlo_950",oo="_boxSurface_17mlo_954",io="_selected_17mlo_967",lo="_textInput_17mlo_984",co="_textArea_17mlo_985",uo="_select_17mlo_967",mo="_sessionTitleInput_17mlo_992",fo="_sessionInstructionField_17mlo_997",ho="_detailEmpty_17mlo_1006",po="_emptyState_17mlo_1007",go="_payloadModalBody_17mlo_1019",yo="_payloadModalToolbar_17mlo_1026",bo="_payloadViewToggle_17mlo_1033",xo="_payloadModalActions_17mlo_1034",vo="_payloadModalPreview_17mlo_1041",_o="_statusBar_17mlo_1056",Io="_annotationSummary_17mlo_1068",a={shell:qn,shellWithImageTray:Jn,shellImageTrayOpen:Zn,imageTrayPanel:Qn,imageTrayPanelOpen:es,imageTrayHeader:ts,imageTrayTitle:as,imageTraySearch:ns,imageTraySearchIcon:ss,imageTraySearchInput:rs,imageTrayList:os,imageTrayState:is,imageTrayStateError:ls,imageTrayItem:cs,imageTrayItemActive:ds,imageTrayThumb:us,imageTrayItemBody:ms,imageTrayItemTitle:fs,imageTrayItemTask:hs,imageTrayItemMetaDetails:ps,imageTrayItemMeta:gs,imageTrayItemReference:ys,panel:bs,sessionPanel:xs,detailPanel:vs,sessionContextBar:_s,sessionContextLeft:Is,sessionContextRight:ks,sessionContextLabel:ws,sessionContextSpacer:Ss,canvasPanel:Ns,canvasWorkspace:Cs,canvasMain:js,panelHeader:Ts,panelHeaderText:$s,panelTitle:Rs,canvasHeading:Ps,sessionActions:Bs,sessionList:As,annotationList:Ms,markerHelpModalBody:Es,openImageModalBody:Ls,openImageField:Fs,openImageActions:Hs,markerHelpItem:Os,markerHelpHeader:Ds,markerHelpExample:zs,sessionCard:Us,annotationCard:Gs,sessionEmptyState:Ys,sessionCardButton:Ws,annotationCardButton:Ks,sessionCardBody:Xs,sessionCardActive:Vs,annotationCardActive:qs,annotationMeta:Js,annotationInstructionPreview:Zs,annotationPreviewFooter:Qs,annotationInstructionEditor:er,annotationTypeField:tr,annotationInstructionButton:ar,annotationInstructionField:nr,sessionMeta:sr,sessionTitle:rr,annotationTitle:or,sessionTimestamp:ir,annotationKind:lr,annotationInstructionTypeIcon:cr,sessionInstructionPreview:dr,sessionInstructionEditor:ur,sessionCardFooter:mr,toolRail:fr,canvasToolRail:hr,toolbarCluster:pr,toolbarViewportCluster:gr,toolbarSeparator:yr,toolBtn:br,toolRailButton:xr,toolbarButton:vr,toolBtnActive:_r,toolbarActions:Ir,toolbarSelectionActions:kr,toolbarColorPicker:wr,colorPickerButton:Sr,colorPickerSwatch:Nr,colorPickerPopover:Cr,colorOption:jr,colorOptionActive:Tr,toolbarUtilities:$r,toolbarGeometryFields:Rr,toolbarGeometryField:Pr,toolbarGeometryLabel:Br,toolbarGeometryInput:Ar,iconButton:Mr,ghostBtn:Er,payloadBtn:Lr,backToTaskBtn:Fr,canvasScroller:Hr,canvasFrame:Or,canvasMedia:Dr,canvasStatusOverlay:zr,canvasStatusCard:Ur,canvasImage:Gr,overlay:Yr,overlaySelect:Wr,overlayPan:Kr,overlaySvg:Xr,overlayHitLayer:Vr,arrowHitArea:qr,canvasHandleHit:Jr,canvasResizeHandleHit:Zr,canvasHandleVisible:Qr,pin:eo,note:to,annotationNumberBadge:ao,box:no,boxNumberBadge:so,arrowNumberBadge:ro,boxSurface:oo,selected:io,textInput:lo,textArea:co,select:uo,sessionTitleInput:mo,sessionInstructionField:fo,detailEmpty:ho,emptyState:po,payloadModalBody:go,payloadModalToolbar:yo,payloadViewToggle:bo,payloadModalActions:xo,payloadModalPreview:vo,statusBar:_o,annotationSummary:Io},Ya=[{value:"review",label:"Review"},{value:"change",label:"Change"},{value:"question",label:"Question"}],Wa=[{value:"select",label:"Select",icon:Wn},{value:"pin",label:"Pin",icon:Ja},{value:"box",label:"Box",icon:Za},{value:"arrow",label:"Arrow",icon:Qa},{value:"text-note",label:"Note",icon:en}],ko={pin:Ja,box:Za,arrow:Qa,"text-note":en},wo={pin:"Pin",box:"Box",arrow:"Arrow","text-note":"Note"},So={review:oa,change:la,question:ia,issue:ia,idea:oa},Rt={select:{short:"Select and edit existing markers.",detail:"Use Select to click, drag, reorder, resize, and update markers that are already on the image.",example:"Example: move an existing marker after the screenshot changes."},pin:{short:"Mark a precise spot.",detail:"Use Pin when feedback points to one exact location instead of a broader area.",example:'Example: "This icon is misaligned by 2px."'},box:{short:"Mark an area or component.",detail:"Use Box when the feedback applies to a whole region, card, panel, or bounded UI block.",example:'Example: "This whole card needs tighter padding and a stronger border."'},arrow:{short:"Show direction or relationship.",detail:"Use Arrow when you need to show movement, attachment, flow, or source-to-target intent.",example:'Example: "This tooltip should anchor to this button, not the panel."'},"text-note":{short:"Add a comment-style point marker.",detail:"Use Note when you want a point marker that reads more like a comment or open question.",example:'Example: "Ask design whether this badge should stay."'}},lt={question:"#0f766e",change:"#2563eb",issue:"#dc2626",idea:"#d97706",review:"#7c3aed"},No=["#7c3aed","#2563eb","#0f766e","#dc2626","#d97706","#111827"],ce="review";function Ye(r){const l=String(r.displayName||"").trim();return l?`${l} review`:"Annotated session"}function tn(){return`annotation-${Math.random().toString(36).slice(2,10)}`}function I(r){return!Number.isFinite(r)||r<=0?0:r>=1?1:r}function Ne(r){return I(Math.max(.02,r))}function Ge(r){return r?[String(r.taskId||"").trim(),String(r.assetId||"").trim(),String(r.path||"").trim()].join("::"):""}function Co(r){if(!(r instanceof HTMLElement))return!1;const l=r.tagName.toLowerCase();return r.isContentEditable?!0:l==="input"||l==="textarea"||l==="select"}function Se(r){return r.map((l,f)=>({...l,order:f}))}function sa(r){if(!r)return"Unsaved";const l=new Date(r);return Number.isNaN(l.getTime())?"Unsaved":l.toLocaleString()}function jo(r){const l=typeof r=="number"&&Number.isFinite(r)?Math.max(0,r):0;return l<1024?`${l}B`:l<1024*1024?`${(l/1024).toFixed(1)}KB`:`${(l/(1024*1024)).toFixed(1)}MB`}function To(r){if(!r)return"";const l=new Date(r);if(Number.isNaN(l.getTime()))return"";const p=new Date().getTime()-l.getTime(),b=Math.floor(p/(1e3*60*60*24));return b<=0?"Today":b===1?"Yesterday":b<7?`${b}d ago`:b<30?`${Math.floor(b/7)}w ago`:l.toLocaleDateString()}function Pt(r){const l=String(r.createdByActor?.label||"").trim();return l||null}function $o(r){const l=String(r||"").trim().replace(/\s+/g," ");return l?l.length>110?`${l.slice(0,107)}...`:l:""}function Ka(r,l,f,p=lt[ce]){const b={id:tn(),order:0,instruction:"",markerType:ce,color:p};if(r==="pin")return{...b,kind:r,x:l.x,y:l.y};if(r==="text-note")return{...b,kind:r,x:l.x,y:l.y};if(r==="box"){const L=f||l;return{...b,kind:r,x:I(Math.min(l.x,L.x)),y:I(Math.min(l.y,L.y)),width:Ne(Math.abs(L.x-l.x)),height:Ne(Math.abs(L.y-l.y))}}const x=f||l;return{...b,kind:"arrow",x:l.x,y:l.y,x2:x.x,y2:x.y}}function ra(r){return r.color?r.color:lt[r.markerType||ce]}function Ro(r,l){const f=Math.max(l.width,1),p=Math.max(l.height,1),b=r.x*f,x=r.y*p,L=r.x2*f,ne=r.y2*p,se=L-b,ct=ne-x,Ce=Math.hypot(se,ct)||1,We=se/Ce,je=ct/Ce,G=Math.max(10,Math.min(16,Ce-2)),ye=G*.62,Te=L-We*G,$=ne-je*G,dt=-je,be=We;return{shaftX1:b,shaftY1:x,shaftX2:Te,shaftY2:$,headPoints:[`${L},${ne}`,`${Te+dt*ye},${$+be*ye}`,`${Te-dt*ye},${$-be*ye}`].join(" ")}}function Po(r,l){return{...r,markerType:l,color:r.color||lt[l]}}function Bo(r,l){return{...r,id:tn(),order:l}}function Ao(r,l){const f=String(r||"").trim()||(l?Ye(l):"Annotated session");return/\bcopy$/i.test(f)?`${f} 2`:`${f} copy`}function Mo(r,l,f){if(l===f||l<0||f<0||l>=r.length||f>=r.length)return r;const p=[...r],[b]=p.splice(l,1);return b?(p.splice(f,0,b),Se(p)):r}function ae(r){return String(Math.round(I(r)*1e3)/10)}function Eo(r){const l=Number.parseFloat(r);return Number.isFinite(l)?I(l/100):null}function Lo(r,l,f){return r.kind==="pin"||r.kind==="text-note"?l==="x"||l==="y"?{...r,[l]:I(f)}:r:r.kind==="box"?l==="x"||l==="y"?{...r,[l]:I(f)}:l==="width"||l==="height"?{...r,[l]:Ne(f)}:r:l==="x"||l==="y"||l==="x2"||l==="y2"?{...r,[l]:I(f)}:r}function Fo(r){return r.kind==="pin"||r.kind==="text-note"?[{key:"x",label:"X",value:ae(r.x)},{key:"y",label:"Y",value:ae(r.y)}]:r.kind==="box"?[{key:"x",label:"X",value:ae(r.x)},{key:"y",label:"Y",value:ae(r.y)},{key:"width",label:"Width",value:ae(r.width)},{key:"height",label:"Height",value:ae(r.height)}]:[{key:"x",label:"Start X",value:ae(r.x)},{key:"y",label:"Start Y",value:ae(r.y)},{key:"x2",label:"End X",value:ae(r.x2)},{key:"y2",label:"End Y",value:ae(r.y2)}]}function Ho(r){if(!r)return null;const l=Math.round(r.x*100),f=Math.round(r.y*100),p=Math.round(r.width*100),b=Math.round(r.height*100);return`crop ${l}%, ${f}% size ${p}% x ${b}%`}function Oo(r){return Number.isFinite(r)?Math.min(4,Math.max(.25,Number(r.toFixed(2)))):1}function Xa(r){const l=[`Annotated attachment: ${r.title||r.image.displayName}`,`Image: ${r.image.displayName}`,`Image Reference: ${r.image.referenceLabel||r.image.assetId}`,`Task ID: ${r.taskId}`,r.globalInstruction?`Global instruction: ${r.globalInstruction}`:"Global instruction: None provided.","Markers:"];return r.annotations.length===0?(l.push("0. No markers."),l.join(`
2
2
  `)):(r.annotations.forEach((f,p)=>{const b=f.markerType||ce,x=Ho(f.cropHint);l.push(`${p+1}. ${f.kind} (${b})`),l.push(`Instruction: ${f.instruction||"No marker instruction."}`),x&&l.push(`Region: ${x}`)}),l.join(`
3
3
  `))}function Bt(r){return{title:r.title,globalInstruction:r.globalInstruction,annotations:Se(r.annotations)}}function Va(r){return JSON.stringify(Bt(r))}function qa(r){const l=JSON.parse(r);return Bt({title:String(l?.title||""),globalInstruction:String(l?.globalInstruction||""),annotations:Array.isArray(l?.annotations)?l.annotations:[]})}function Do(r,l){return Bt({title:r?.title||l,globalInstruction:r?.globalInstruction||"",annotations:r?.annotations||[]})}function Vo({runtimeMode:r="local",apiBaseUrl:l="",cloudAuthBaseUrl:f="",workspaceId:p="default",sessionLoadReady:b=!0,requestedTarget:x=null,requestedSessionId:L=null,requestedOpenVersion:ne=0,imageTrayOpen:se,onCloseImageTray:ct,resolveTaskReferenceLabel:Ce,resolveImageReferenceLabel:We,onRequestedTargetHandled:je,onOpenTarget:G,onContextChange:ye,onBackToTask:Te}){const $=r==="cloud"&&(f||l)||"",[dt,be]=s.useState(x),[ut,$e]=s.useState([]),[v,Re]=s.useState(null),[At,Ke]=s.useState(!1),[Pe,Xe]=s.useState(""),[Be,Ve]=s.useState(""),[j,re]=s.useState([]),[S,F]=s.useState(null),[mt,ca]=s.useState(lt[ce]),[ft,ht]=s.useState(!1),[T,Ae]=s.useState("select"),[an,xe]=s.useState(!1),[pt,da]=s.useState(!1),[V,q]=s.useState(!1),[ua,g]=s.useState(null),[Y,R]=s.useState("saved"),[zo,D]=s.useState(null),[gt,ma]=s.useState(!1),[oe,Mt]=s.useState(null),[de,Et]=s.useState(!1),[nn,Lt]=s.useState(!1),[Ft,fa]=s.useState("json"),[yt,Ht]=s.useState(!1),[bt,Ot]=s.useState(!1),[sn,ha]=s.useState(!1),[rn,xt]=s.useState(!1),[Dt,vt]=s.useState(""),[qe,pa]=s.useState(!1),[zt,on]=s.useState([]),[_t,ln]=s.useState(""),[cn,ga]=s.useState(!1),[ya,ba]=s.useState(null),[ue,Je]=s.useState(!1),[Ut,Ze]=s.useState(!1),[P,Gt]=s.useState(1),[W,Qe]=s.useState(!1),[It,xa]=s.useState(!1),[kt,et]=s.useState({width:0,height:0}),va=s.useRef(null),Me=s.useRef(null),Yt=s.useRef(null),_a=s.useRef(null),me=s.useRef(L),ie=s.useRef(""),wt=s.useRef(0),Wt=s.useRef(""),ve=s.useRef(0),St=s.useRef(null),Ia=s.useRef(0),fe=s.useRef(!1),tt=s.useRef(null),Kt=s.useRef(null),_e=s.useRef(null),H=s.useRef(""),M=s.useRef(""),Nt=s.useRef(null),J=s.useRef(null),Ee=s.useRef(!1),Ct=s.useRef(null),at=s.useRef(null),nt=s.useRef(null),Ie=s.useRef(null),Le=s.useRef(null),Fe=s.useRef(null),He=s.useRef(null),he=s.useRef(null),Z=s.useRef(null),ka=s.useRef(null),wa=s.useRef(null),B=s.useMemo(()=>ut.find(e=>e.id===v)||null,[v,ut]),Q=s.useMemo(()=>`workspaceId=${encodeURIComponent(String(p||"default").trim()||"default")}`,[p]),A=s.useMemo(()=>({"x-taskforce-workspace-id":String(p||"default").trim()||"default"}),[p]),z=s.useMemo(()=>j.find(e=>e.id===S)||null,[j,S]),ee=s.useMemo(()=>Ge(x),[x]),le=typeof G=="function",d=le?x:dt,jt=s.useMemo(()=>{const e=String(d?.taskId||"").trim();if(!e)return"";const n=Ce?.(e).trim()||"";if(n)return n;const o=String(d?.taskReferenceLabel||"").trim();return o&&o!==e?o:n||e},[d?.taskId,d?.taskReferenceLabel,Ce]),st=s.useMemo(()=>{const e=String(d?.assetId||"").trim();if(!e)return"";const n=We?.(e).trim()||"";return n||String(d?.imageReferenceLabel||"").trim()},[d?.assetId,d?.imageReferenceLabel,We]),Xt=s.useMemo(()=>j.findIndex(e=>e.id===S),[j,S]),Vt=z?.color||mt,Sa=s.useMemo(()=>Bt({title:Pe,globalInstruction:Be,annotations:j}),[j,Be,Pe]),Oe=s.useMemo(()=>Va(Sa),[Sa]),Na=Oe!==M.current,y=s.useMemo(()=>({width:Math.max(kt.width*P,0),height:Math.max(kt.height*P,0)}),[kt.height,kt.width,P]),De=s.useMemo(()=>({visibleRadius:7,hitRadius:11}),[]),qt=s.useMemo(()=>`0 0 ${Math.max(y.width,1)} ${Math.max(y.height,1)}`,[y.height,y.width]),rt=typeof se=="boolean",Ca=s.useMemo(()=>{const e=_t.trim().toLowerCase();return e?zt.filter(n=>[n.displayName,n.originalFilename,n.imageReferenceLabel,n.taskReferenceLabel,n.assetId].filter(Boolean).join(" ").toLowerCase().includes(e)):zt},[zt,_t]),ke=s.useMemo(()=>{const e=Me.current;return e?P>1||y.width>e.clientWidth+1||y.height>e.clientHeight+1:P>1},[y.height,y.width,P]),Jt=`${Math.round(P*100)}%`,Zt=s.useMemo(()=>{const e=new Map;return j.forEach((n,o)=>{e.set(n.id,o+1)}),e},[j]);s.useEffect(()=>{me.current=L},[L]),s.useEffect(()=>{const e=_a.current;if(!e||!S)return;e.focus();const n=e.value.length;e.setSelectionRange(n,n)},[S]),s.useEffect(()=>{_e.current=v},[v]),s.useEffect(()=>{Ke(!1)},[v]),s.useEffect(()=>{if(!z){ht(!1);return}ca(z.color||lt[z.markerType||ce])},[z]);const Tt=s.useCallback(async e=>{const n=typeof performance<"u"?performance.now():Date.now(),o=await ge(`/api/taskforce/annotated-attachments/sessions?${Q}`,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",...A},body:JSON.stringify({taskId:e.taskId,baseImageAssetId:e.assetId,title:Ye(e),globalInstruction:"",annotations:[]})},$),i=await o.json().catch(()=>({}));if(!o.ok)throw new Error(String(i?.error||"Failed to create session."));const c=i?.session;if(!c?.id)throw new Error("Failed to create session.");return $t("annotated_session_create_completed",{assetId:e.assetId,taskId:e.taskId||null,sessionId:c.id,durationMs:Math.round((typeof performance<"u"?performance.now():Date.now())-n),debugTimings:i?.debugTimings||null,serverTiming:typeof o.headers?.get=="function"&&o.headers.get("server-timing")||null}),c},[A,$,Q]),ja=s.useCallback(e=>new Promise((n,o)=>{const i=new FileReader;i.onload=()=>n(typeof i.result=="string"?i.result:""),i.onerror=()=>o(i.error||new Error("Failed to read clipboard image.")),i.readAsDataURL(e)}),[]),N=s.useCallback(()=>{tt.current!==null&&(window.clearTimeout(tt.current),tt.current=null),nt.current!==null&&(window.clearTimeout(nt.current),nt.current=null)},[]),ze=s.useCallback(e=>{Xe(e.title),Ve(e.globalInstruction),re(e.annotations),F(n=>n&&e.annotations.some(o=>o.id===n)?n:e.annotations[0]?.id||null)},[]),pe=s.useCallback((e,n)=>{const o=Ye(n||d||{assetId:e.baseImageAssetId,displayName:"Annotated session"}),i=Do(e,o),c=Va(i);fe.current=!0,N(),ze(i),M.current=c,H.current=c,Nt.current=null,Ee.current=!1,Ct.current=null,at.current=null,D(null),R("saved"),q(!1)},[d,ze,N]),ot=s.useCallback(e=>{fe.current=!0,N(),$e([]),Re(null),xe(!1),Ke(!1),Xe(Ye(e)),Ve(""),re([]),F(null),M.current="",H.current="",Nt.current=null,Ee.current=!1,Ct.current=null,at.current=null,Mt(null),Lt(!1),D(null),R("saved"),q(!1)},[N]),we=s.useCallback(async(e,n,o)=>{const i=_e.current;if(!i)return!0;if(e===M.current)return J.current||(D(null),R("saved")),!0;if(J.current){if(Ee.current=!0,!o?.waitForInFlight||!await J.current)return!1;const m=H.current;return m===M.current?!0:we(m,n,o)}N();const c=qa(e);Ct.current=i,Nt.current=e,q(!0),g(null),D(null),R("saving");const h=(async()=>{try{const u=await ge(`/api/taskforce/annotated-attachments/sessions/${encodeURIComponent(i)}?${Q}`,{method:"PATCH",credentials:"include",headers:{"Content-Type":"application/json",...A},body:JSON.stringify(c)},$),m=await u.json().catch(()=>({}));if(!u.ok)throw new Error(String(m?.error||"Failed to save session."));const _=m?.session;if(!_?.id)throw new Error("Failed to save session.");$e(ea=>{const Ha=ea.findIndex(Bn=>Bn.id===_.id);if(Ha===-1)return[_,...ea];const Oa=[...ea];return Oa[Ha]=_,Oa}),M.current=e,at.current=null,D(null);const w=_e.current===_.id,C=H.current,X=C!==e,it=Ee.current||X;return Ee.current=!1,w&&!it?(fe.current=!0,ze(c),R("saved")):!it&&C===M.current?R("saved"):R("pending"),!0}catch(u){const m=u instanceof Error?u.message:"Failed to save session.";return g(m),D(m),R("error"),at.current!==e&&_e.current===i&&H.current===e&&(at.current=e,nt.current=window.setTimeout(()=>{nt.current=null,!(_e.current!==i||H.current!==e)&&we(e,n,{waitForInFlight:!0})},1500)),!1}finally{Nt.current=null,J.current=null,Ct.current=null,q(!1)}})();J.current=h;const k=await h;if(k){const u=H.current;if(u!==M.current)return we(u,n,o)}return k},[ze,N,A,$,Q]),Ta=s.useCallback(e=>{if(_e.current){if(H.current===M.current){D(null),J.current||R("saved");return}Y!=="saving"&&R("pending"),N(),tt.current=window.setTimeout(()=>{tt.current=null,we(H.current,"structure")},e)}},[N,we,Y]),K=s.useCallback(e=>{Kt.current=e},[]),E=s.useCallback(async e=>{N();const n=H.current;return!_e.current||n===M.current?(D(null),J.current||R("saved"),!0):we(n,e,{waitForInFlight:!0})},[N,we]),dn=s.useCallback(()=>{const e=M.current;e&&(N(),fe.current=!0,ze(qa(e)),D(null),R("saved"),g(null))},[ze,N]),U=s.useCallback(async(e,n)=>{const o=typeof performance<"u"?performance.now():Date.now(),i=JSON.stringify({targetKey:Ge(e),requestedSessionId:n?.requestedSessionId??null,autoCreateIfEmpty:n?.autoCreateIfEmpty===!0});if(St.current===i)return;const c=ve.current+1;ve.current=c,St.current=i,da(!0),g(null);try{const h=new URLSearchParams;p&&h.set("workspaceId",p),e.taskId&&h.set("taskId",e.taskId),h.set("imageAssetId",e.assetId);const k=await ge(`/api/taskforce/annotated-attachments/sessions?${h.toString()}`,{credentials:"include",headers:A,cache:"no-store"},$),u=await k.json().catch(()=>({}));if(!k.ok)throw new Error(String(u?.error||"Failed to load annotated attachment sessions."));const m=Array.isArray(u?.sessions)?u.sessions:[];if($t("annotated_sessions_loaded",{assetId:e.assetId,taskId:e.taskId||null,requestedSessionId:n?.requestedSessionId??null,autoCreateIfEmpty:n?.autoCreateIfEmpty===!0,sessionCount:m.length,durationMs:Math.round((typeof performance<"u"?performance.now():Date.now())-o),serverTiming:typeof k.headers?.get=="function"&&k.headers.get("server-timing")||null}),m.length===0&&n?.autoCreateIfEmpty&&String(e.assetId||"").trim()){const C=n?.requestedSessionId??me.current;if(me.current=null,C&&g("The previously selected annotation session could not be restored."),ve.current!==c)return;const X=await Tt(e);if($t("annotated_sessions_auto_created_after_empty_load",{assetId:e.assetId,taskId:e.taskId||null,sessionId:X.id,totalDurationMs:Math.round((typeof performance<"u"?performance.now():Date.now())-o)}),ve.current!==c)return;$e([X]),Re(X.id),xe(!1),pe(X,e);return}if(ve.current!==c)return;$e(m),xe(m.length===0);const _=n?.requestedSessionId??me.current;me.current=null;const w=m.find(C=>C.id===_)||m[0]||null;_&&!w&&g("The previously selected annotation session could not be restored."),Re(w?.id||null),w?pe(w,e):(fe.current=!0,N(),Xe(Ye(e)),Ve(""),re([]),F(null),M.current="",H.current="",D(null),R("saved"))}catch(h){if(ve.current!==c)return;g(h instanceof Error?h.message:"Failed to load sessions.")}finally{St.current===i&&(St.current=null),ve.current===c&&da(!1)}},[N,Tt,A,$,pe,p]),$a=s.useCallback(async()=>{ga(!0),ba(null);try{const e=new URLSearchParams;e.set("workspaceId",String(p||"default").trim()||"default");const n=await ge(`/api/taskforce/annotated-attachments/images?${e.toString()}`,{credentials:"include",headers:A,cache:"no-store"},$),o=await n.json().catch(()=>({}));if(!n.ok)throw new Error(String(o?.error||"Failed to load images."));on(Array.isArray(o?.images)?o.images:[])}catch(e){ba(e instanceof Error?e.message:"Failed to load images.")}finally{ga(!1)}},[A,$,p]),un=s.useCallback(async()=>{if(typeof navigator>"u"||!navigator.clipboard||typeof navigator.clipboard.read!="function"){g("Clipboard image paste is not supported in this environment.");return}xa(!0),g(null),Ia.current=Date.now()+2e3;try{const n=(await navigator.clipboard.read()).find(_=>_.types.some(w=>w.startsWith("image/"))),o=n?.types.find(_=>_.startsWith("image/"))||"";if(!n||!o)throw new Error("No image found on the clipboard.");const i=await n.getType(o),c=await ja(i);if(!c)throw new Error("Failed to read clipboard image.");const h=o==="image/jpeg"?"jpg":o==="image/webp"?"webp":o==="image/gif"?"gif":"png",k=await fetch("/api/taskforce/context-upload",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",...A},body:JSON.stringify({file:c,originalName:`pasted-image.${h}`,workspaceId:String(p||"default").trim()||"default"})}),u=await k.json().catch(()=>({}));if(!k.ok||!u?.success||typeof u?.assetId!="string"||typeof u?.path!="string")throw new Error(String(u?.error||"Failed to paste image into Image Notes."));const m={assetId:u.assetId,imageReferenceLabel:typeof u?.referenceLabel=="string"?u.referenceLabel:void 0,path:u.path,displayName:typeof u?.displayName=="string"&&u.displayName.trim().length>0?u.displayName.trim():"Pasted image"};me.current=null,le?(ie.current="",G?.(m,{sessionId:null})):(be(m),ie.current=Ge(m),U(m,{autoCreateIfEmpty:!0}))}catch(e){g(e instanceof Error?e.message:"Failed to paste image.")}finally{xa(!1)}},[le,U,G,ja,A,p]),mn=s.useCallback(async()=>{const e=Dt.trim();if(!e){g("Enter an image reference to open.");return}pa(!0),g(null);try{const n=new URLSearchParams({workspaceId:String(p||"default").trim()||"default"}),o=await ge(`/api/taskforce/annotated-attachments/images/${encodeURIComponent(e)}?${n.toString()}`,{method:"GET",credentials:"include",headers:A}),i=await o.json().catch(()=>({}));if(!o.ok||!i?.target||typeof i.target.assetId!="string"||typeof i.target.path!="string")throw new Error(String(i?.error||"Failed to open image reference."));const c={assetId:i.target.assetId,path:i.target.path,displayName:typeof i.target.displayName=="string"&&i.target.displayName.trim().length>0?i.target.displayName.trim():"Image attachment",taskId:typeof i.target.taskId=="string"&&i.target.taskId.trim().length>0?i.target.taskId.trim():void 0,taskReferenceLabel:typeof i.target.taskReferenceLabel=="string"&&i.target.taskReferenceLabel.trim().length>0?i.target.taskReferenceLabel.trim():void 0,imageReferenceLabel:typeof i.target.imageReferenceLabel=="string"&&i.target.imageReferenceLabel.trim().length>0?i.target.imageReferenceLabel.trim():void 0};me.current=null,xt(!1),vt(""),le?(ie.current="",G?.(c,{sessionId:null})):(be(c),ie.current=Ge(c),U(c,{autoCreateIfEmpty:!0}))}catch(n){g(n instanceof Error?n.message:"Failed to open image reference.")}finally{pa(!1)}},[le,U,G,Dt,A,p]),fn=s.useCallback(async e=>{if(!e.assetId||!e.path||!await E("session-switch"))return;const o={assetId:e.assetId,path:e.path,displayName:String(e.displayName||e.originalFilename||"Image attachment").trim()||"Image attachment",...e.taskId?{taskId:e.taskId}:{},...e.taskReferenceLabel?{taskReferenceLabel:e.taskReferenceLabel}:{},...e.imageReferenceLabel?{imageReferenceLabel:e.imageReferenceLabel}:{}};me.current=null,g(null),le?(ie.current="",G?.(o,{sessionId:null})):(be(o),ie.current=Ge(o),ot(o),U(o,{autoCreateIfEmpty:!0}))},[E,le,U,G,ot]),Ra=s.useCallback(e=>{$e(n=>{const o=n.findIndex(c=>c.id===e.id);if(o===-1)return[e,...n];const i=[...n];return i[o]=e,i}),Re(e.id),pe(e,d)},[d,pe]),Pa=s.useCallback(e=>{$e(n=>{const o=n.filter(c=>c.id!==e),i=o[0]||null;return Re(i?.id||null),i?pe(i,d):(fe.current=!0,N(),Xe(Ye(d||{displayName:"Annotated session"})),Ve(""),re([]),F(null),M.current="",H.current="",D(null),R("saved")),o})},[d,N,pe]);s.useEffect(()=>{if(!x)return;if(le||be(n=>n&&Ge(n)===ee&&n.taskReferenceLabel===x.taskReferenceLabel&&n.imageReferenceLabel===x.imageReferenceLabel&&n.displayName===x.displayName?n:x),!b){ee&&(ee!==ie.current||ne!==wt.current)&&ee!==Wt.current&&(ot(x),Wt.current=ee,wt.current=ne,$t("annotated_sessions_load_deferred",{assetId:x.assetId,taskId:x.taskId||null,requestedTargetKey:ee})),je?.();return}ee&&(ee!==ie.current||ne!==wt.current)&&(ot(x),ie.current=ee,wt.current=ne,Wt.current="",U(x,{autoCreateIfEmpty:!0})),je?.()},[le,U,je,ne,x,ee,ot,L,b]),s.useEffect(()=>{d&&ye?.({target:d,sessionId:v})},[d,ye,v]),s.useEffect(()=>{if(!d||typeof document>"u"||!b)return;const e=()=>{Date.now()<Ia.current||H.current!==M.current||V||pt||U(d,{requestedSessionId:v})},n=()=>{document.visibilityState==="visible"&&e()};return document.addEventListener("visibilitychange",n),()=>{document.removeEventListener("visibilitychange",n)}},[d,U,pt,V,v,b]),s.useEffect(()=>{if(!d?.path){Je(!1),Ze(!1),et({width:0,height:0});return}Je(!0),Ze(!1),et({width:0,height:0}),Gt(1),Qe(!1)},[d?.path]),s.useEffect(()=>{if(!ue)return;const e=Yt.current;!e||!e.complete||e.naturalWidth<=0||e.naturalHeight<=0||(et({width:e.naturalWidth,height:e.naturalHeight}),Je(!1),Ze(!1))},[d?.path,ue]),s.useEffect(()=>{ke||Qe(!1)},[ke]),s.useEffect(()=>{Mt(null)},[v]),s.useEffect(()=>{if(H.current=Oe,fe.current){fe.current=!1;return}if(!v){N(),D(null),R("saved");return}if(Oe===M.current){N(),J.current||(D(null),R("saved"));return}const e=Kt.current;if(Kt.current=null,Y==="error"&&e===null)return;const n=e??600;if(J.current){Ee.current=!0,R("pending");return}Ta(n)},[N,Oe,Y,Ta,v]),s.useEffect(()=>{v&&(J.current||Oe===M.current&&Y!=="error"&&Y!=="saved"&&(D(null),R("saved")))},[Oe,Y,v]),s.useEffect(()=>{!rt||!se||$a()},[$a,se,rt]),s.useEffect(()=>{if(typeof window>"u")return;const e=n=>{H.current!==M.current&&(n.preventDefault(),n.returnValue="")};return window.addEventListener("beforeunload",e),()=>window.removeEventListener("beforeunload",e)},[]),s.useEffect(()=>{if(typeof document>"u")return;const e=()=>{document.visibilityState==="hidden"&&E("visibility-hidden")};return document.addEventListener("visibilitychange",e),()=>document.removeEventListener("visibilitychange",e)},[E]),s.useEffect(()=>{if(!ft||typeof document>"u")return;const e=n=>{const o=n.target;o instanceof Node&&(ka.current?.contains(o)||ht(!1))};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[ft]),s.useEffect(()=>{if(!At||typeof document>"u")return;const e=n=>{const o=n.target;o instanceof Node&&(wa.current?.contains(o)||Ke(!1))};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[At]),s.useEffect(()=>()=>{N()},[N]),s.useEffect(()=>{if(!de)return;const e=window.setTimeout(()=>Et(!1),2e3);return()=>window.clearTimeout(e)},[de]),s.useEffect(()=>{if(!yt)return;const e=window.setTimeout(()=>Ht(!1),2e3);return()=>window.clearTimeout(e)},[yt]),s.useEffect(()=>{if(!bt)return;const e=window.setTimeout(()=>Ot(!1),2e3);return()=>window.clearTimeout(e)},[bt]);const te=s.useCallback((e,n,o=300)=>{re(i=>Se(i.map(c=>c.id===e?n(c):c))),K(o)},[K]),hn=s.useCallback(e=>{z&&(te(z.id,n=>({...n,color:e})),ca(e),ht(!1))},[z,te]),Ba=s.useCallback(async()=>{if(!(!d||!await E("session-switch"))){q(!0),g(null);try{const n=await Tt(d);xe(!1),await U(d,{requestedSessionId:n.id,autoCreateIfEmpty:!1}),Ae("select")}catch(n){g(n instanceof Error?n.message:"Failed to create session."),xe(!0)}finally{q(!1)}}},[d,Tt,E,U]),pn=s.useCallback(e=>{if(e!=="select"&&!B){Qe(!1),g("No session exists for this image yet."),xe(!0);return}g(null),xe(!1),Qe(!1),Ae(e)},[B]),gn=s.useCallback(async()=>{if(!(!d||!B||!await E("duplicate"))){q(!0),g(null);try{const n=Se(j.map((h,k)=>Bo(h,k))),o=await ge(`/api/taskforce/annotated-attachments/sessions?${Q}`,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",...A},body:JSON.stringify({taskId:d.taskId,baseImageAssetId:d.assetId,title:Ao(Pe||B.title,d),globalInstruction:Be,annotations:n})},$),i=await o.json().catch(()=>({}));if(!o.ok)throw new Error(String(i?.error||"Failed to duplicate session."));const c=i?.session;if(!c?.id)throw new Error("Failed to duplicate session.");Ra(c),Ae("select")}catch(n){g(n instanceof Error?n.message:"Failed to duplicate session.")}finally{q(!1)}}},[d,j,Be,Pe,Ra,E,A,$,B,Q]),yn=s.useCallback(async()=>E("manual"),[E]),Aa=s.useCallback(async()=>{if(v){ma(!0),g(null);try{const e=await ge(`/api/taskforce/annotated-attachments/sessions/${encodeURIComponent(v)}/payload?${Q}`,{credentials:"include",headers:A},$),n=await e.json().catch(()=>({}));if(!e.ok)throw new Error(String(n?.error||"Failed to load payload preview."));Mt(n?.payload||null)}catch(e){g(e instanceof Error?e.message:"Failed to load payload preview.")}finally{ma(!1)}}},[A,$,v,Q]),bn=s.useCallback(()=>{v&&E("payload-preview").then(e=>{e&&(Lt(!0),Aa())})},[E,Aa,v]),Ma=s.useCallback(async e=>{if(!oe||!navigator.clipboard||typeof navigator.clipboard.writeText!="function"){g("Clipboard copy is not available in this browser.");return}try{const n=e==="json"?JSON.stringify(oe,null,2):Xa(oe);await navigator.clipboard.writeText(n),Et(e)}catch(n){g(n instanceof Error?n.message:"Failed to copy payload content."),Et(!1)}},[oe]),xn=s.useCallback(async()=>{if(!jt||!navigator.clipboard||typeof navigator.clipboard.writeText!="function"){g("Clipboard copy is not available in this browser.");return}try{await navigator.clipboard.writeText(jt),Ht(!0)}catch(e){g(e instanceof Error?e.message:"Failed to copy task id."),Ht(!1)}},[jt]),vn=s.useCallback(async()=>{if(!st||!navigator.clipboard||typeof navigator.clipboard.writeText!="function"){g("Clipboard copy is not available in this browser.");return}try{await navigator.clipboard.writeText(st),Ot(!0)}catch(e){g(e instanceof Error?e.message:"Failed to copy image reference."),Ot(!1)}},[st]),_n=s.useCallback(async()=>{if(!v||!await E("delete-session"))return;const n=(B?.title||"Untitled session").trim()||"Untitled session";if(window.confirm(`Delete the annotated attachment session "${n}"?`)){q(!0),g(null);try{const o=await ge(`/api/taskforce/annotated-attachments/sessions/${encodeURIComponent(v)}?${Q}`,{method:"DELETE",credentials:"include",headers:A},$),i=await o.json().catch(()=>({}));if(!o.ok)throw new Error(String(i?.error||"Failed to delete session."));Pa(v),Ae("select")}catch(o){g(o instanceof Error?o.message:"Failed to delete session.")}finally{q(!1)}}},[E,Pa,A,$,B,v,Q]),Qt=s.useCallback(()=>{S&&(re(e=>Se(e.filter(n=>n.id!==S))),F(null),K(300))},[K,S]),Ue=s.useCallback(e=>{const n=Oo(e),o=Me.current;if(!o||n===P){Gt(n);return}const i=(o.scrollLeft+o.clientWidth/2)*(n/P)-o.clientWidth/2,c=(o.scrollTop+o.clientHeight/2)*(n/P)-o.clientHeight/2;Gt(n),window.requestAnimationFrame(()=>{o.scrollLeft=Math.max(0,i),o.scrollTop=Math.max(0,c)})},[P]),In=s.useCallback(()=>{Ue(P+.25)},[Ue,P]),kn=s.useCallback(()=>{Ue(P-.25)},[Ue,P]),wn=s.useCallback(()=>{Ue(1);const e=Me.current;e&&window.requestAnimationFrame(()=>{e.scrollLeft=0,e.scrollTop=0})},[Ue]),Ea=s.useCallback(e=>{S&&re(n=>{const o=n.findIndex(c=>c.id===S);if(o===-1)return n;const i=e==="up"?o-1:o+1;return i<0||i>=n.length?n:(K(300),Mo(n,o,i))})},[K,S]);s.useEffect(()=>{if(!S)return;const e=n=>{n.key==="Delete"&&(Co(n.target)||(n.preventDefault(),Qt()))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[Qt,S]);const O=s.useCallback(e=>{const n=va.current?.getBoundingClientRect();return!n||n.width<=0||n.height<=0?null:{x:I((e.clientX-n.left)/n.width),y:I((e.clientY-n.top)/n.height)}},[]),Sn=s.useCallback(e=>{if(W&&ke){const i=Me.current;if(!i)return;Z.current={pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,scrollLeft:i.scrollLeft,scrollTop:i.scrollTop},e.currentTarget.setPointerCapture(e.pointerId),e.preventDefault();return}if(!v)return;if(T==="select"){F(null);return}const n=O(e);if(!n)return;if(T==="pin"||T==="text-note"){const i=Ka(T,n,n,mt);re(c=>Se([...c,i])),F(i.id),K(300),Ae("select");return}Ie.current=n;const o=Ka(T,n,n,mt);he.current={annotationId:o.id,kind:T},e.currentTarget.setPointerCapture?.(e.pointerId),re(i=>Se([...i,o])),F(o.id),K(300)},[ke,mt,K,W,O,v,T]),Nn=s.useCallback(e=>{if(Z.current?.pointerId===e.pointerId){e.currentTarget.releasePointerCapture?.(e.pointerId);return}if(!Ie.current||!he.current||T!=="box"&&T!=="arrow")return;const n=O(e);Ie.current=null,he.current=null,e.currentTarget.releasePointerCapture?.(e.pointerId),n&&Ae("select")},[O,T]),La=s.useCallback((e,n)=>{if(T!=="select"||W)return;const o=O(e);o&&(Le.current={annotationId:n.id,originPointer:o,originAnnotation:n},F(n.id),e.stopPropagation())},[W,O,T]),Cn=s.useCallback(e=>{if(Z.current?.pointerId===e.pointerId){const u=Me.current;if(!u)return;const m=e.clientX-Z.current.startX,_=e.clientY-Z.current.startY;u.scrollLeft=Z.current.scrollLeft-m,u.scrollTop=Z.current.scrollTop-_;return}if(he.current&&Ie.current){const u=O(e);if(!u)return;const{annotationId:m,kind:_}=he.current,w=Ie.current;te(m,C=>_==="box"&&C.kind==="box"?{...C,x:I(Math.min(w.x,u.x)),y:I(Math.min(w.y,u.y)),width:Ne(Math.abs(u.x-w.x)),height:Ne(Math.abs(u.y-w.y))}:_==="arrow"&&C.kind==="arrow"?{...C,x:w.x,y:w.y,x2:u.x,y2:u.y}:C);return}if(Fe.current){const u=O(e);if(!u)return;const{annotationId:m,originPointer:_,originAnnotation:w}=Fe.current,C=u.x-_.x,X=u.y-_.y;te(m,()=>({...w,width:Ne(w.width+C),height:Ne(w.height+X)}));return}if(He.current){const u=O(e);if(!u)return;const{annotationId:m,endpoint:_,originPointer:w,originAnnotation:C}=He.current,X=u.x-w.x,it=u.y-w.y;te(m,()=>_==="tail"?{...C,x:I(C.x+X),y:I(C.y+it)}:{...C,x2:I(C.x2+X),y2:I(C.y2+it)});return}if(!Le.current)return;const n=O(e);if(!n)return;const{annotationId:o,originPointer:i,originAnnotation:c}=Le.current,h=n.x-i.x,k=n.y-i.y;te(o,()=>c.kind==="pin"||c.kind==="text-note"?{...c,x:I(c.x+h),y:I(c.y+k)}:c.kind==="box"?{...c,x:I(c.x+h),y:I(c.y+k)}:{...c,x:I(c.x+h),y:I(c.y+k),x2:I(c.x2+h),y2:I(c.y2+k)})},[O,te]),jn=s.useCallback(()=>{Ie.current=null,Le.current=null,Fe.current=null,He.current=null,he.current=null,Z.current=null},[]),Tn=s.useCallback(()=>{Ie.current=null,Le.current=null,Fe.current=null,He.current=null,he.current=null,Z.current=null},[]),$n=s.useCallback(()=>{Le.current=null,Fe.current=null,He.current=null,he.current=null,Z.current=null},[]),Rn=s.useCallback((e,n)=>{if(T!=="select"||W)return;const o=O(e);o&&(Fe.current={annotationId:n.id,originPointer:o,originAnnotation:n},F(n.id),e.stopPropagation())},[W,O,T]),Fa=s.useCallback((e,n,o)=>{if(T!=="select"||W)return;const i=O(e);i&&(He.current={annotationId:n.id,originPointer:i,originAnnotation:n,endpoint:o},F(n.id),e.stopPropagation())},[W,O,T]),Pn=B?.updatedAt?sa(B.updatedAt):"Not saved yet";return t.jsxs("div",{className:`${a.shell} ${rt?a.shellWithImageTray:""} ${rt&&se?a.shellImageTrayOpen:""}`.trim(),children:[rt?t.jsxs("aside",{className:`${a.imageTrayPanel} ${se?a.imageTrayPanelOpen:""}`.trim(),"aria-label":"Image tray","aria-hidden":!se,children:[t.jsxs("div",{className:a.imageTrayHeader,children:[t.jsxs("span",{className:a.imageTrayTitle,children:[t.jsx(za,{size:14}),"Images"]}),t.jsx("button",{type:"button",className:"tf-control-icon",onClick:ct,title:"Collapse image tray","aria-label":"Collapse image tray",children:t.jsx(En,{size:16})})]}),t.jsxs("div",{className:a.imageTraySearch,children:[t.jsx(Ln,{size:12,className:a.imageTraySearchIcon}),t.jsx("input",{type:"text",placeholder:"Search images...",value:_t,onChange:e=>ln(e.target.value),className:a.imageTraySearchInput})]}),t.jsx("div",{className:`tf-scrollbar ${a.imageTrayList}`,children:cn?t.jsx("div",{className:a.imageTrayState,children:"Loading images..."}):ya?t.jsx("div",{className:a.imageTrayStateError,children:ya}):Ca.length===0?t.jsx("div",{className:a.imageTrayState,children:_t.trim()?"No images match your search.":"No images found."}):Ca.map(e=>{const n=d?.assetId===e.assetId,o=typeof e.attachmentCount=="number"&&Number.isFinite(e.attachmentCount)?Math.max(0,e.attachmentCount):0,i=typeof e.sessionCount=="number"&&Number.isFinite(e.sessionCount)?Math.max(0,e.sessionCount):0,c=o>1?`${o} tasks linked`:o===1?e.taskReferenceLabel||"1 task linked":"Unattached",h=String(e.displayName||e.originalFilename||"Image attachment").trim()||"Image attachment";return t.jsxs("button",{type:"button",className:`${a.imageTrayItem} ${n?a.imageTrayItemActive:""}`.trim(),onClick:()=>{fn(e)},title:h,children:[t.jsx("span",{className:a.imageTrayThumb,children:t.jsx("img",{src:e.path,alt:"",loading:"lazy"})}),t.jsxs("span",{className:a.imageTrayItemBody,children:[t.jsx("span",{className:a.imageTrayItemTitle,children:h}),t.jsx("span",{className:a.imageTrayItemTask,children:c}),t.jsxs("span",{className:a.imageTrayItemMeta,children:[t.jsxs("span",{className:a.imageTrayItemMetaDetails,children:[jo(e.sizeBytes),e.updatedAt?t.jsxs(t.Fragment,{children:[" · ",To(e.updatedAt)]}):null,i>0?t.jsxs(t.Fragment,{children:[" · ",i," session",i===1?"":"s"]}):null]}),e.imageReferenceLabel?t.jsx("span",{className:a.imageTrayItemReference,children:e.imageReferenceLabel}):null]})]})]},e.assetId)})})]}):null,t.jsxs("section",{className:`tf-surface-panel ${a.panel} ${a.sessionPanel}`,children:[t.jsx("div",{className:a.sessionContextBar,children:d?.taskId?t.jsxs(t.Fragment,{children:[t.jsx("div",{className:a.sessionContextLeft,children:Te?t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${a.ghostBtn} ${a.backToTaskBtn}`,onClick:()=>{E("back-to-task").then(e=>{e&&d.taskId&&Te(d.taskId)})},"aria-label":"Back to task",title:"Back to task",children:t.jsx(Fn,{size:16})}):t.jsx("div",{className:a.sessionContextSpacer,"aria-hidden":"true"})}),t.jsx("div",{className:a.sessionContextRight,children:t.jsx(Mn,{copied:yt,onClick:()=>{xn()},title:"Copy task id",ariaLabel:yt?"Copied task id":"Copy task id",label:jt})})]}):t.jsxs(t.Fragment,{children:[t.jsx("div",{className:a.sessionContextLeft,children:t.jsx("span",{className:`tf-label-micro ${a.sessionContextLabel}`,children:"Unattached Image"})}),t.jsx("div",{className:a.sessionContextRight,children:t.jsx("div",{className:a.sessionContextSpacer,"aria-hidden":"true"})})]})}),t.jsxs("div",{className:a.panelHeader,children:[t.jsxs("div",{className:a.panelHeaderText,children:[t.jsx("div",{className:`tf-heading-card ${a.panelTitle}`,children:"Sessions"}),d?null:t.jsx("div",{className:"tf-text-secondary",children:"Open an image attachment to begin"})]}),t.jsx("div",{className:a.sessionActions,children:t.jsx("button",{type:"button",className:`tf-control-icon ${a.iconButton}`,onClick:()=>{Ba()},disabled:!d||V,"aria-label":"Create session",title:"Create session",children:t.jsx(Hn,{size:16})})})]}),d?pt?t.jsx("div",{className:a.emptyState,children:t.jsx("p",{className:"tf-empty-copy",children:"Loading sessions…"})}):t.jsx("div",{className:`tf-scrollbar ${a.sessionList}`,children:ut.length===0?t.jsxs("div",{className:a.sessionEmptyState,children:[t.jsx("div",{className:`tf-heading-card ${a.sessionTitle}`,children:"No sessions yet"}),t.jsx("div",{className:`tf-text-secondary ${a.annotationSummary}`,children:"Create the first annotation session for this image."})]}):ut.map(e=>{const n=v===e.id,o=n&&At,i=$o(n?Be:e.globalInstruction),c=(n?Pe:e.title)||"Untitled session";return t.jsxs("div",{className:`tf-surface-elevated ${a.sessionCard} ${n?a.sessionCardActive:""}`,ref:n?wa:void 0,onBlur:o?h=>{const k=h.relatedTarget;k instanceof Node&&h.currentTarget.contains(k)||Ke(!1)}:void 0,children:[o?t.jsxs("div",{className:a.sessionCardBody,children:[t.jsxs("div",{className:a.sessionMeta,children:[t.jsx("label",{className:"tf-field-label",htmlFor:"annotated-session-title",children:"Session title"}),t.jsx("input",{id:"annotated-session-title",className:`tf-field-shell ${a.textInput} ${a.sessionTitleInput}`,value:Pe,onChange:h=>{Xe(h.target.value),K(600)},placeholder:"Session title"}),t.jsx("span",{className:`tf-text-meta ${a.sessionTimestamp}`,children:sa(e.updatedAt)})]}),Pt(e)?t.jsxs("div",{className:`tf-text-secondary ${a.sessionCreator}`,children:["Created by ",Pt(e)]}):null,t.jsxs("div",{className:a.sessionInstructionEditor,children:[t.jsx("label",{className:"tf-field-label",htmlFor:"annotated-session-instruction",children:"Session instruction"}),t.jsx("textarea",{id:"annotated-session-instruction",className:`tf-field-shell ${a.textArea} ${a.sessionInstructionField}`,value:Be,onChange:h=>{Ve(h.target.value),K(600)},placeholder:"Add overall instructions, context, or framing for this session."})]}),t.jsxs("div",{className:`tf-text-secondary ${a.annotationSummary}`,children:[e.annotations.length," annotation",e.annotations.length===1?"":"s"]})]}):t.jsxs("button",{type:"button",className:a.sessionCardButton,onClick:()=>{if(n){Ke(!0);return}E("session-switch").then(h=>{h&&(Re(e.id),pe(e,d))})},"aria-pressed":n,children:[t.jsxs("div",{className:a.sessionMeta,children:[t.jsx("span",{className:`tf-heading-card ${a.sessionTitle}`,children:c}),t.jsx("span",{className:`tf-text-meta ${a.sessionTimestamp}`,children:sa(e.updatedAt)})]}),Pt(e)?t.jsxs("div",{className:`tf-text-secondary ${a.sessionCreator}`,children:["Created by ",Pt(e)]}):null,i?t.jsx("div",{className:`tf-text-secondary ${a.sessionInstructionPreview}`,children:i}):null,t.jsxs("div",{className:`tf-text-secondary ${a.annotationSummary}`,children:[e.annotations.length," annotation",e.annotations.length===1?"":"s"]})]}),n?t.jsx("div",{className:a.sessionCardFooter,children:t.jsxs(t.Fragment,{children:[t.jsx("button",{type:"button",className:`tf-button-ghost ${a.toolRailButton} ${a.iconButton}`,onClick:()=>{gn()},disabled:V,"aria-label":"Duplicate session",title:`Duplicate session "${c}"`,children:t.jsx(na,{size:16})}),t.jsx("button",{type:"button",className:`tf-button-ghost ${a.toolRailButton} ${a.iconButton}`,onClick:()=>{_n()},disabled:V,"aria-label":"Delete session",title:`Delete session "${c}"`,children:t.jsx(Ua,{size:16})})]})}):null]},e.id)})}):t.jsxs("div",{className:a.emptyState,children:[t.jsx("strong",{className:"tf-empty-title",children:"No image selected"}),t.jsx("p",{className:"tf-empty-copy",children:"Open an image attachment from a task to start an annotated session."})]})]}),t.jsxs("section",{className:`tf-surface-panel ${a.panel} ${a.canvasPanel}`,children:[t.jsxs("div",{className:a.panelHeader,children:[t.jsxs("div",{className:a.canvasHeading,children:[t.jsx("div",{className:"tf-heading-card",children:d?.displayName||"Annotated attachment"}),t.jsx("div",{className:"tf-text-secondary",children:B?`${j.length} markers · ${Pn}`:"Pick or create a session"})]}),st?t.jsx(Vn,{copied:bt,onClick:()=>{vn()},title:"Copy image reference",ariaLabel:bt?"Copied image reference":"Copy image reference",label:st}):null]}),t.jsxs("div",{className:a.toolRail,children:[t.jsxs("div",{className:`${a.toolbarCluster} ${a.toolbarViewportCluster}`,children:[t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${a.ghostBtn} ${a.toolbarButton}`,onClick:()=>{yn()},disabled:!B||V||!Na&&Y!=="error","aria-label":V?"Saving session":"Save session",title:V?"Saving session":"Save session",children:t.jsx(On,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${a.ghostBtn} ${a.toolbarButton}`,onClick:()=>xt(!0),disabled:qe,"aria-label":"Open image",title:"Open image",children:t.jsx(za,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${a.ghostBtn} ${a.toolbarButton}`,onClick:()=>{un()},disabled:It,"aria-label":It?"Pasting image":"Paste image",title:It?"Pasting image":"Paste image",children:It?t.jsx(Ga,{size:18,className:Da.spin}):t.jsx(Dn,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${a.ghostBtn} ${a.toolbarButton}`,onClick:()=>{B&&dn()},disabled:!B||!Na,"aria-label":"Reset unsaved changes",title:"Reset unsaved changes",children:t.jsx(zn,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost ${a.toolRailButton} ${a.iconButton}`,onClick:kn,disabled:!d||ue||P<=.25,"aria-label":"Zoom out",children:t.jsx(Un,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${a.ghostBtn} ${a.toolbarButton}`,onClick:wn,disabled:!d||ue||P===1,"aria-label":`Reset zoom to 100 percent (currently ${Jt})`,title:`Reset zoom to 100% (currently ${Jt})`,children:t.jsx("span",{children:Jt})}),t.jsx("button",{type:"button",className:`tf-button-ghost ${a.toolRailButton} ${a.iconButton}`,onClick:In,disabled:!d||ue||P>=4,"aria-label":"Zoom in",children:t.jsx(Gn,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${a.toolBtn} ${a.toolbarButton} ${W?a.toolBtnActive:""}`,onClick:()=>Qe(e=>!e),disabled:!d||ue||!ke,"aria-label":"Pan canvas",title:"Pan canvas",children:t.jsx(Yn,{size:18})})]}),t.jsx("span",{className:a.toolbarSeparator,"aria-hidden":"true"}),t.jsxs("div",{className:a.toolbarActions,children:[t.jsx("div",{className:a.toolbarSelectionActions,children:z?t.jsxs(t.Fragment,{children:[t.jsxs("div",{ref:ka,className:a.toolbarColorPicker,children:[t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${a.ghostBtn} ${a.toolbarButton} ${a.colorPickerButton}`,onClick:()=>ht(e=>!e),"aria-label":"Marker color","aria-expanded":ft,title:"Marker color",children:t.jsx("span",{className:a.colorPickerSwatch,style:{backgroundColor:Vt},"aria-hidden":"true"})}),ft?t.jsx("div",{className:a.colorPickerPopover,role:"menu","aria-label":"Marker color options",children:No.map(e=>t.jsx("button",{type:"button",className:`${a.colorOption} ${Vt===e?a.colorOptionActive:""}`,style:{backgroundColor:e},onClick:()=>hn(e),"aria-label":`Use marker color ${e}`,"aria-pressed":Vt===e},e))}):null]}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${a.ghostBtn} ${a.toolbarButton}`,onClick:Qt,"aria-label":"Delete marker",title:"Delete selected marker",children:t.jsx(Ua,{size:18})}),t.jsx("div",{className:a.toolbarGeometryFields,"aria-label":"Marker geometry percent controls",children:Fo(z).map(e=>t.jsxs("label",{className:a.toolbarGeometryField,children:[t.jsx("span",{className:`tf-text-meta ${a.toolbarGeometryLabel}`,children:e.label}),t.jsx("input",{className:`tf-field-shell ${a.toolbarGeometryInput}`,type:"number",min:0,max:100,step:.1,value:e.value,onChange:n=>{const o=Eo(n.target.value);o!==null&&te(z.id,i=>Lo(i,e.key,o))},"aria-label":`${e.label} percent`})]},e.key))})]}):null}),t.jsxs("div",{className:a.toolbarUtilities,children:[t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${a.ghostBtn} ${a.payloadBtn} ${a.toolbarButton}`,onClick:bn,disabled:!B||gt,"aria-label":gt?"Loading payload preview":"Preview payload",title:gt?"Loading payload preview":"Preview payload",children:t.jsx(oa,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${a.ghostBtn} ${a.toolbarButton}`,onClick:()=>ha(!0),"aria-label":"How to use marker tools",title:"How to use marker tools",children:t.jsx(ia,{size:18})})]})]})]}),t.jsxs("div",{className:a.canvasWorkspace,children:[t.jsx("div",{className:a.canvasToolRail,"aria-label":"Annotation tools",children:Wa.map(e=>{const n=e.icon;return t.jsx("button",{type:"button",className:`tf-button-ghost ${a.toolRailButton} ${T===e.value?a.toolBtnActive:""}`,onClick:()=>pn(e.value),disabled:!d,title:e.label,"aria-label":`${e.label} tool. ${Rt[e.value].short}`,children:t.jsx(n,{size:18})},e.value)})}),t.jsx("div",{className:a.canvasMain,children:t.jsx("div",{ref:Me,className:`tf-scrollbar ${a.canvasScroller}`,children:d?t.jsxs(t.Fragment,{children:[ue&&!Ut?t.jsx("div",{className:a.canvasStatusOverlay,"aria-live":"polite",children:t.jsxs("div",{className:a.canvasStatusCard,children:[t.jsx(Ga,{size:20,className:Da.spinner}),t.jsx("span",{children:"Loading image…"})]})}):null,Ut?t.jsx("div",{className:a.canvasStatusOverlay,"aria-live":"polite",children:t.jsx("div",{className:a.canvasStatusCard,children:t.jsx("span",{children:"Image failed to load."})})}):null,t.jsx("div",{className:a.canvasFrame,children:t.jsxs("div",{className:a.canvasMedia,style:{width:y.width?`${y.width}px`:void 0,height:y.height?`${y.height}px`:void 0},children:[t.jsx("img",{ref:Yt,src:d.path,alt:d.displayName,className:a.canvasImage,onLoad:()=>{const e=Yt.current;et({width:e?.naturalWidth||0,height:e?.naturalHeight||0}),Je(!1),Ze(!1)},onError:()=>{et({width:0,height:0}),Je(!1),Ze(!0)}}),!ue&&!Ut&&B?t.jsxs("div",{ref:va,className:`${a.overlay} ${T==="select"?a.overlaySelect:""} ${W&&ke?a.overlayPan:""}`,onPointerDown:Sn,onPointerMove:Cn,onPointerUp:e=>{Nn(e),$n()},"data-testid":"annotated-attachment-overlay",onPointerLeave:jn,onPointerCancel:Tn,children:[t.jsx("svg",{className:a.overlaySvg,viewBox:qt,preserveAspectRatio:"none","aria-hidden":"true",children:j.filter(e=>e.kind==="arrow").map(e=>{const n=Ro(e,y),o=ra(e),i=S===e.id;return t.jsxs(ta.Fragment,{children:[i?t.jsxs(t.Fragment,{children:[t.jsx("line",{x1:n.shaftX1,y1:n.shaftY1,x2:n.shaftX2,y2:n.shaftY2,stroke:"color-mix(in srgb, var(--surface-elevated) 92%, transparent)",strokeWidth:14,strokeLinecap:"round"}),t.jsx("polygon",{points:n.headPoints,fill:o,stroke:"color-mix(in srgb, var(--surface-elevated) 92%, transparent)",strokeWidth:4,strokeLinejoin:"round"})]}):null,t.jsx("line",{x1:n.shaftX1,y1:n.shaftY1,x2:n.shaftX2,y2:n.shaftY2,stroke:o,strokeWidth:i?10:6,strokeLinecap:"round"}),t.jsx("polygon",{points:n.headPoints,fill:o})]},e.id)})}),t.jsx("svg",{className:a.overlayHitLayer,viewBox:qt,preserveAspectRatio:"none",children:j.filter(e=>e.kind==="arrow").map(e=>t.jsxs(ta.Fragment,{children:[t.jsx("line",{x1:e.x*y.width,y1:e.y*y.height,x2:e.x2*y.width,y2:e.y2*y.height,className:a.arrowHitArea,"data-testid":`annotated-arrow-hit-${e.id}`,"aria-label":`Arrow marker ${Zt.get(e.id)||0}`,onPointerDown:n=>La(n,e),onClick:n=>{n.stopPropagation(),F(e.id)}}),S===e.id?t.jsxs(t.Fragment,{children:[t.jsx("circle",{cx:e.x*y.width,cy:e.y*y.height,r:De.hitRadius,className:a.canvasHandleHit,role:"button",tabIndex:0,"aria-label":"Move arrow tail",onPointerDown:n=>Fa(n,e,"tail")}),t.jsx("circle",{cx:e.x*y.width,cy:e.y*y.height,r:De.visibleRadius,className:a.canvasHandleVisible,"aria-hidden":"true"}),t.jsx("circle",{cx:e.x2*y.width,cy:e.y2*y.height,r:De.hitRadius,className:a.canvasHandleHit,role:"button",tabIndex:0,"aria-label":"Move arrow tip",onPointerDown:n=>Fa(n,e,"tip")}),t.jsx("circle",{cx:e.x2*y.width,cy:e.y2*y.height,r:De.visibleRadius,className:a.canvasHandleVisible,"aria-hidden":"true"})]}):null]},`hit-${e.id}`))}),j.filter(e=>e.kind==="arrow").map(e=>t.jsx("div",{className:`${a.annotationNumberBadge} ${a.arrowNumberBadge}`,style:{left:`${(e.x+e.x2)/2*100}%`,top:`${(e.y+e.y2)/2*100}%`,backgroundColor:ra(e)},"aria-hidden":"true",children:Zt.get(e.id)||0},`arrow-number-${e.id}`)),j.filter(e=>e.kind!=="arrow").map(e=>{const n=ra(e),o=Zt.get(e.id)||0,i={onPointerDown:c=>La(c,e),onClick:c=>{c.stopPropagation(),F(e.id)}};return e.kind==="pin"?t.jsx("button",{type:"button",...i,className:`${a.pin} ${S===e.id?a.selected:""}`,style:{left:`${e.x*100}%`,top:`${e.y*100}%`,backgroundColor:n},children:o},e.id):e.kind==="text-note"?t.jsx("button",{type:"button",...i,className:`${a.note} ${S===e.id?a.selected:""}`,style:{left:`${e.x*100}%`,top:`${e.y*100}%`,backgroundColor:n},children:o},e.id):t.jsxs("div",{className:`${a.box} ${S===e.id?a.selected:""}`,style:{left:`${e.x*100}%`,top:`${e.y*100}%`,width:`${e.width*100}%`,height:`${e.height*100}%`,borderColor:n},children:[t.jsx("span",{className:`${a.annotationNumberBadge} ${a.boxNumberBadge}`,style:{backgroundColor:n},"aria-hidden":"true",children:o}),t.jsx("button",{type:"button",...i,className:a.boxSurface,"aria-label":`Box marker ${o}`})]},e.id)}),t.jsx("svg",{className:a.overlaySvg,viewBox:qt,preserveAspectRatio:"none",children:j.filter(e=>e.kind==="box"&&S===e.id).map(e=>t.jsxs(ta.Fragment,{children:[t.jsx("circle",{cx:(e.x+e.width)*y.width,cy:(e.y+e.height)*y.height,r:De.hitRadius,className:`${a.canvasHandleHit} ${a.canvasResizeHandleHit}`,role:"button",tabIndex:0,"aria-label":"Resize box marker",onPointerDown:n=>Rn(n,e)}),t.jsx("circle",{cx:(e.x+e.width)*y.width,cy:(e.y+e.height)*y.height,r:De.visibleRadius,className:a.canvasHandleVisible,"aria-hidden":"true"})]},`box-handle-${e.id}`))})]}):null]})})]}):t.jsx("div",{className:a.emptyState,children:t.jsx("p",{className:"tf-empty-copy",children:"Select an image attachment to annotate."})})})})]}),t.jsxs("div",{className:a.statusBar,children:[t.jsx("span",{children:Y==="error"?"Save failed. Retry now.":Y==="saving"||Y==="pending"?"Saving…":"Saved"}),ua?t.jsx("span",{children:ua}):t.jsx("span",{children:B?W&&ke?"Drag on the image to pan.":T==="select"?"Select a marker to edit it.":`Click on the image to place a ${T}.`:"Create a session to begin placing markers on this image."}),d&&!B&&an?t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${a.ghostBtn} ${a.toolbarButton}`,onClick:()=>{Ba()},disabled:V||pt,children:V?"Creating…":"Create one now"}):null]})]}),t.jsx("section",{className:`tf-surface-panel ${a.panel} ${a.detailPanel}`,children:B?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:a.panelHeader,children:[t.jsxs("div",{className:a.panelHeaderText,children:[t.jsx("div",{className:`tf-heading-card ${a.panelTitle}`,children:"Markers"}),t.jsxs("div",{className:"tf-text-secondary",children:[j.length," in this session"]})]}),t.jsxs("div",{className:a.sessionActions,children:[t.jsx("button",{type:"button",className:`tf-control-icon ${a.iconButton}`,onClick:()=>Ea("up"),disabled:!z||Xt<=0,"aria-label":"Move marker up",children:t.jsx(Kn,{size:16})}),t.jsx("button",{type:"button",className:`tf-control-icon ${a.iconButton}`,onClick:()=>Ea("down"),disabled:!z||Xt===-1||Xt>=j.length-1,"aria-label":"Move marker down",children:t.jsx(Xn,{size:16})})]})]}),t.jsx("div",{className:`tf-scrollbar ${a.annotationList}`,children:j.length===0?t.jsx("div",{className:a.detailEmpty,children:t.jsx("p",{className:"tf-empty-copy",children:"Add a marker on the image to begin."})}):j.map((e,n)=>{const o=ko[e.kind],i=wo[e.kind],c=`${i} ${n+1}`,h=So[e.markerType||ce],k=Ya.find(m=>m.value===(e.markerType||ce))?.label||"Review",u=S===e.id;return t.jsxs("div",{className:`tf-surface-elevated ${a.annotationCard} ${u?a.annotationCardActive:""}`,children:[t.jsx("button",{type:"button",className:a.annotationCardButton,onClick:()=>F(e.id),"aria-label":i,children:t.jsxs("div",{className:a.annotationMeta,children:[t.jsx("span",{className:`tf-heading-card ${a.annotationTitle}`,children:c}),t.jsx("span",{className:`tf-text-meta ${a.annotationKind}`,"aria-hidden":"true",children:t.jsx(o,{size:16})})]})}),u?t.jsxs("div",{className:a.annotationInstructionEditor,children:[t.jsx("label",{className:"tf-field-label",htmlFor:"annotated-marker-instruction",children:"Marker instruction"}),t.jsx("textarea",{id:"annotated-marker-instruction",ref:u?_a:null,className:`tf-field-shell ${a.textArea} ${a.annotationInstructionField}`,value:e.instruction,onChange:m=>{te(e.id,_=>({..._,instruction:m.target.value}),600)},onBlur:()=>{E("text")},placeholder:"What should the AI focus on for this marker?"}),t.jsxs("div",{className:a.annotationTypeField,children:[t.jsx("label",{className:"tf-field-label",htmlFor:"annotated-marker-type",children:"Instruction type"}),t.jsx("select",{id:"annotated-marker-type",className:`tf-field-shell ${a.select}`,value:e.markerType||ce,onChange:m=>{te(e.id,_=>Po(_,m.target.value))},children:Ya.map(m=>t.jsx("option",{value:m.value,children:m.label},m.value))})]})]}):t.jsx("button",{type:"button",className:a.annotationInstructionButton,onClick:()=>F(e.id),"aria-label":`Edit ${i} instruction`,children:t.jsxs("div",{className:a.annotationInstructionEditor,children:[t.jsx("div",{className:`tf-text-secondary ${a.annotationInstructionPreview}`,children:e.instruction.trim()||"No marker instruction yet."}),t.jsx("div",{className:a.annotationPreviewFooter,children:t.jsx("span",{className:`tf-text-meta ${a.annotationInstructionTypeIcon}`,"aria-label":`Instruction type: ${k}`,title:k,children:t.jsx(h,{size:16})})})]})})]},e.id)})})]}):t.jsxs("div",{className:a.emptyState,children:[t.jsx("strong",{className:"tf-empty-title",children:"No active session"}),t.jsx("p",{className:"tf-empty-copy",children:"Create or select a session to edit annotations."})]})}),t.jsx(aa,{isOpen:rn,onClose:()=>{qe||(xt(!1),vt(""))},title:"Open Image",size:"sm",children:t.jsxs("form",{className:a.openImageModalBody,onSubmit:e=>{e.preventDefault(),mn()},children:[t.jsx("label",{className:"tf-field-label",htmlFor:"annotated-open-image-reference",children:"Image reference number"}),t.jsx("input",{id:"annotated-open-image-reference",className:`tf-field-shell ${a.textInput} ${a.openImageField}`,value:Dt,onChange:e=>vt(e.target.value),placeholder:"I-24",autoFocus:!0}),t.jsxs("div",{className:a.openImageActions,children:[t.jsx("button",{type:"button",className:"tf-button-ghost tf-button-compact",onClick:()=>{xt(!1),vt("")},disabled:qe,children:"Cancel"}),t.jsx("button",{type:"submit",className:"tf-button-primary tf-button-compact",disabled:qe,children:qe?"Opening…":"Open"})]})]})}),t.jsx(aa,{isOpen:sn,onClose:()=>ha(!1),title:"How To Use Markers",size:"md",children:t.jsx("div",{className:a.markerHelpModalBody,children:Wa.filter(e=>e.value!=="select").map(e=>t.jsxs("div",{className:`tf-surface-inset ${a.markerHelpItem}`,children:[t.jsxs("div",{className:a.markerHelpHeader,children:[t.jsx("strong",{className:"tf-heading-card",children:e.label}),t.jsx("span",{className:"tf-text-meta",children:Rt[e.value].short})]}),t.jsx("p",{className:"tf-text-secondary",children:Rt[e.value].detail}),t.jsx("p",{className:`tf-text-body ${a.markerHelpExample}`,children:Rt[e.value].example})]},e.value))})}),t.jsx(aa,{isOpen:nn,onClose:()=>Lt(!1),title:"AI Payload",size:"lg",children:t.jsxs("div",{className:a.payloadModalBody,children:[t.jsxs("div",{className:a.payloadModalToolbar,children:[t.jsxs("div",{className:a.payloadViewToggle,children:[t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${a.toolBtn} ${Ft==="json"?a.toolBtnActive:""}`,onClick:()=>fa("json"),children:"JSON"}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${a.toolBtn} ${Ft==="brief"?a.toolBtnActive:""}`,onClick:()=>fa("brief"),children:"AI Brief"})]}),t.jsxs("div",{className:a.payloadModalActions,children:[t.jsxs("button",{type:"button",className:`tf-button-ghost tf-button-compact ${a.ghostBtn}`,onClick:()=>{Ma("json")},disabled:!oe,"aria-label":de==="json"?"Copied JSON":"Copy JSON",title:de==="json"?"Copied JSON":"Copy JSON",children:[de==="json"?t.jsx(la,{size:16}):t.jsx(na,{size:16}),t.jsx("span",{children:"JSON"})]}),t.jsxs("button",{type:"button",className:`tf-button-ghost tf-button-compact ${a.ghostBtn}`,onClick:()=>{Ma("brief")},disabled:!oe,"aria-label":de==="brief"?"Copied AI Brief":"Copy AI Brief",title:de==="brief"?"Copied AI Brief":"Copy AI Brief",children:[de==="brief"?t.jsx(la,{size:16}):t.jsx(na,{size:16}),t.jsx("span",{children:"AI Brief"})]})]})]}),gt?t.jsx("div",{className:a.detailEmpty,children:t.jsx("p",{className:"tf-empty-copy",children:"Loading payload…"})}):oe?t.jsx("pre",{className:`tf-surface-inset tf-scrollbar ${a.payloadModalPreview}`,children:Ft==="json"?JSON.stringify(oe,null,2):Xa(oe)}):t.jsx("div",{className:a.detailEmpty,children:t.jsx("p",{className:"tf-empty-copy",children:"Load a payload preview to inspect the current session contract."})})]})})]})}export{Vo as AnnotatedAttachmentWorkspaceShell};
@@ -1,3 +1,3 @@
1
- import{r as y,j as e}from"./vendor-react-CKJs5o3c.js";import{t as s,Z as Et,_ as pt,$ as dt,a0 as Lt}from"./index-607WPo_X.js";import{g as St}from"./documentReferences-DPZuTgHh.js";import{a as Dt,j as Pt,h as Ut,aJ as K,c as X,m as $t,aK as Ft,aF as ut,T as ht,au as Rt}from"./vendor-icons-B32hGuF2.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";const gt=[".png",".jpg",".jpeg",".webp",".gif",".pdf",".txt",".md",".csv",".json",".doc",".docx",".html",".js",".ts",".tsx",".css",".py",".java",".go",".rs",".sh"].join(","),zt=new Set(["image/png","image/jpeg","image/webp"]),Ot=new Set(gt.split(",").map(o=>o.trim().toLowerCase())),_t=10*1024*1024,Bt=3500;function xt(o){const c=o.trim().toLowerCase(),m=c.lastIndexOf(".");return m===-1?"":c.slice(m)}function J(o){if(o.length===0)return"";const c=o.slice(0,3).join(", "),m=o.length-3;return m>0?`${c}, +${m} more`:c}function Mt(o){return`${o.name.trim().toLowerCase()}::${o.size}::${o.lastModified}`}function Ht(o){return new Promise((c,m)=>{const g=new FileReader;g.onload=()=>c(String(g.result||"")),g.onerror=()=>m(g.error||new Error("Failed to read file")),g.readAsDataURL(o)})}function S(o){return/\.(png|jpe?g|webp|gif)(\?|#|$)/i.test(o)}function Kt(o){const c=o.types;if(!c)return null;for(const m of Array.from(c)){const g=String(m||"").trim().toLowerCase();if(zt.has(g))return g}return null}function ft(o,c){const m=o.includes("?")?"&":"?";return`${o}${m}download=1&filename=${encodeURIComponent(c)}`}function mt(o){return typeof o=="string"?o.split("/").pop()||"Context file":o.displayName||o.originalFilename||o.caption||o.fsPath||o.path.split("/").pop()||"Context file"}function Xt(o){const c=typeof o=="string"?[o]:[o.originalFilename,o.displayName,o.caption,o.fsPath,o.path];for(const g of c){if(!g)continue;const D=xt(g);if(D)return D.replace(".","").slice(0,5).toUpperCase()}const m=typeof o=="string"?o:o.path;return/^https?:\/\//i.test(m)?"LINK":"FILE"}function te(o){const{ownerType:c="task",ownerId:m,ownerReferenceLabel:g,workspaceId:D,attachments:N,onAddAttachment:Y,onRemoveAttachment:G,onUpdateAttachmentCaption:W}=o,v=y.useRef(null),[P,Z]=y.useState(!1),[V,C]=y.useState(null),[F,q]=y.useState(""),[R,A]=y.useState(null),[I,j]=y.useState(null),[U,yt]=y.useState(!1),[wt,z]=y.useState(!1),[Jt,O]=y.useState(0),T=y.useRef(new Set),Q=y.useRef(new Set),tt=t=>(t||"").trim(),$=(t,n)=>{const a=[],r=tt(t),p=tt(n);return r&&a.push(`path:${r}`),p&&a.push(`fs:${p}`),a},et=y.useMemo(()=>{const t=new Set;return N.forEach(n=>{if(typeof n=="string"){$(n).forEach(a=>t.add(a));return}$(n.path,n.fsPath).forEach(a=>t.add(a))}),t},[N]);y.useEffect(()=>{T.current=new Set(et)},[et]);const nt=(t,n)=>n.some(a=>t.has(a)),at=(t,n)=>n.forEach(a=>t.add(a)),E=String(D||"").trim(),b=String(m||"").trim(),st=c==="initiative"?"initiative":c==="workstream"?"workstream":"task",_={ownerType:c,ownerId:b||null,taskId:c==="task"&&b||null},B=(t="application/json")=>{const n={"Content-Type":t};return E&&(n["x-taskforce-workspace-id"]=E),n},ot=(t,n=!0,a=T.current)=>{const r=t.trim();if(!r||!/^https?:\/\//i.test(r))return"invalid";const i=r,f=$(i);if(nt(a,f))return"duplicate";const u=r.split(/[\\/]/).pop()||r;return Y({path:i,caption:u,timestamp:new Date().toISOString()}),at(a,f),n&&q(""),A(null),"added"};y.useEffect(()=>{if(!I)return;const t=window.setTimeout(()=>{j(null)},Bt);return()=>window.clearTimeout(t)},[I]);const rt=async t=>{if(t.length===0)return;C(null),j(null);const n=t,a=[],r=[],p=[],i=[],f=new Set(Q.current);n.forEach(x=>{const h=xt(x.name);if(!Ot.has(h)){a.push(x.name);return}if(x.size>_t){r.push(x.name);return}const L=Mt(x);if(f.has(L)){p.push(x.name);return}f.add(L),i.push({file:x,fingerprint:L})});const u=[];if(a.length>0&&u.push(`${a.length} unsupported file${a.length===1?"":"s"} skipped: ${J(a)}.`),r.length>0&&u.push(`${r.length} file${r.length===1?"":"s"} over 10 MB skipped: ${J(r)}.`),p.length>0&&u.push(`${p.length} local duplicate file${p.length===1?"":"s"} skipped before upload: ${J(p)}.`),i.length===0){u.length>0&&j(u.join(" ")),v.current&&(v.current.value="");return}Z(!0);const k=new Set(T.current);let d=0;try{for(const{file:h,fingerprint:L}of i){let l=null;const lt=await fetch("/api/taskforce/context-upload/init",{method:"POST",headers:B(),body:JSON.stringify({originalName:h.name,mimeType:h.type||"application/octet-stream",size:h.size,..._,workspaceId:E||null})});if(lt.ok){const w=await lt.json();if(w?.success&&typeof w?.uploadUrl=="string"&&typeof w?.path=="string"){if(!(await fetch(w.uploadUrl,{method:String(w.method||"PUT"),headers:w.headers||{"Content-Type":h.type||"application/octet-stream"},body:h})).ok)throw new Error(`Upload failed for ${h.name}`);const H=await fetch("/api/taskforce/context-upload/finalize",{method:"POST",headers:B(),body:JSON.stringify({relativePath:w.relativePath,mimeType:h.type||"application/octet-stream",originalName:h.name,size:h.size,..._,workspaceId:E||null})});if(!H.ok){const Tt=await H.json().catch(()=>({}));throw new Error(Tt?.error||`Upload failed for ${h.name}`)}l=await H.json().catch(()=>null)}else w?.success&&typeof w?.path=="string"&&(l=w)}if(!l){const w=await Ht(h),M=await fetch("/api/taskforce/context-upload",{method:"POST",headers:B(),body:JSON.stringify({file:w,originalName:h.name,..._,workspaceId:E||null})});if(!M.ok)throw new Error(`Upload failed for ${h.name}`);l=await M.json()}if(!l?.success||!l?.path)throw new Error(`Upload failed for ${h.name}`);const ct=$(l.path,l.fsPath);if(nt(k,ct)){d+=1;continue}Y({path:l.path,fsPath:l.fsPath,caption:typeof l.caption=="string"&&l.caption.trim().length>0?l.caption:h.name,displayName:typeof l.displayName=="string"?l.displayName:void 0,originalFilename:typeof l.originalFilename=="string"?l.originalFilename:h.name,assetId:typeof l.assetId=="string"?l.assetId:void 0,referenceNumber:typeof l.referenceNumber=="number"?l.referenceNumber:null,referenceLabel:typeof l.referenceLabel=="string"?l.referenceLabel:void 0,taskId:c==="task"&&typeof l.taskId=="string"?l.taskId:null,timestamp:typeof l.timestamp=="string"&&l.timestamp.trim().length>0?l.timestamp:new Date().toISOString()}),Lt({workspaceId:E||"default",ownerType:c,ownerId:b||null,taskId:c==="task"&&b||null,reason:"upload"}),at(k,ct),Q.current.add(L)}const x=[...u];d>0&&x.push(`${d} duplicate file${d===1?"":"s"} skipped.`),j(x.length>0?x.join(" "):null),T.current=k}catch(x){C(x instanceof Error?x.message:"Failed to upload context file")}finally{Z(!1),v.current&&(v.current.value="")}},it=async t=>{!t||t.length===0||await rt(Array.from(t))},kt=async()=>{if(C(null),j(null),!navigator.clipboard||typeof navigator.clipboard.read!="function"){C("Clipboard image paste is not available in this browser.");return}try{const t=await navigator.clipboard.read(),n=[];for(const a of t){const r=Kt(a);if(!r)continue;const p=await a.getType(r),i=r.toLowerCase()==="image/png"?"png":r.toLowerCase()==="image/webp"?"webp":"jpg";n.push(new globalThis.File([p],`pasted-image-${Date.now()}.${i}`,{type:r}))}if(n.length===0){C("Clipboard does not currently contain a supported image.");return}await rt(n)}catch(t){C(t?.message||"Failed to read an image from the clipboard.")}},jt=t=>{const n=new Set,a=t.dataTransfer.getData("text/uri-list")||"",r=t.dataTransfer.getData("text/plain")||"",p=`${a}
1
+ import{r as y,j as e}from"./vendor-react-CKJs5o3c.js";import{t as s,Z as Et,_ as pt,$ as dt,a0 as Lt}from"./index-MAHKvFqp.js";import{g as St}from"./documentReferences-BOUcJm6-.js";import{a as Dt,j as Pt,h as Ut,aJ as K,c as X,m as $t,aK as Ft,aF as ut,T as ht,au as Rt}from"./vendor-icons-B32hGuF2.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";const gt=[".png",".jpg",".jpeg",".webp",".gif",".pdf",".txt",".md",".csv",".json",".doc",".docx",".html",".js",".ts",".tsx",".css",".py",".java",".go",".rs",".sh"].join(","),zt=new Set(["image/png","image/jpeg","image/webp"]),Ot=new Set(gt.split(",").map(o=>o.trim().toLowerCase())),_t=10*1024*1024,Bt=3500;function xt(o){const c=o.trim().toLowerCase(),m=c.lastIndexOf(".");return m===-1?"":c.slice(m)}function J(o){if(o.length===0)return"";const c=o.slice(0,3).join(", "),m=o.length-3;return m>0?`${c}, +${m} more`:c}function Mt(o){return`${o.name.trim().toLowerCase()}::${o.size}::${o.lastModified}`}function Ht(o){return new Promise((c,m)=>{const g=new FileReader;g.onload=()=>c(String(g.result||"")),g.onerror=()=>m(g.error||new Error("Failed to read file")),g.readAsDataURL(o)})}function S(o){return/\.(png|jpe?g|webp|gif)(\?|#|$)/i.test(o)}function Kt(o){const c=o.types;if(!c)return null;for(const m of Array.from(c)){const g=String(m||"").trim().toLowerCase();if(zt.has(g))return g}return null}function ft(o,c){const m=o.includes("?")?"&":"?";return`${o}${m}download=1&filename=${encodeURIComponent(c)}`}function mt(o){return typeof o=="string"?o.split("/").pop()||"Context file":o.displayName||o.originalFilename||o.caption||o.fsPath||o.path.split("/").pop()||"Context file"}function Xt(o){const c=typeof o=="string"?[o]:[o.originalFilename,o.displayName,o.caption,o.fsPath,o.path];for(const g of c){if(!g)continue;const D=xt(g);if(D)return D.replace(".","").slice(0,5).toUpperCase()}const m=typeof o=="string"?o:o.path;return/^https?:\/\//i.test(m)?"LINK":"FILE"}function te(o){const{ownerType:c="task",ownerId:m,ownerReferenceLabel:g,workspaceId:D,attachments:N,onAddAttachment:Y,onRemoveAttachment:G,onUpdateAttachmentCaption:W}=o,v=y.useRef(null),[P,Z]=y.useState(!1),[V,C]=y.useState(null),[F,q]=y.useState(""),[R,A]=y.useState(null),[I,j]=y.useState(null),[U,yt]=y.useState(!1),[wt,z]=y.useState(!1),[Jt,O]=y.useState(0),T=y.useRef(new Set),Q=y.useRef(new Set),tt=t=>(t||"").trim(),$=(t,n)=>{const a=[],r=tt(t),p=tt(n);return r&&a.push(`path:${r}`),p&&a.push(`fs:${p}`),a},et=y.useMemo(()=>{const t=new Set;return N.forEach(n=>{if(typeof n=="string"){$(n).forEach(a=>t.add(a));return}$(n.path,n.fsPath).forEach(a=>t.add(a))}),t},[N]);y.useEffect(()=>{T.current=new Set(et)},[et]);const nt=(t,n)=>n.some(a=>t.has(a)),at=(t,n)=>n.forEach(a=>t.add(a)),E=String(D||"").trim(),b=String(m||"").trim(),st=c==="initiative"?"initiative":c==="workstream"?"workstream":"task",_={ownerType:c,ownerId:b||null,taskId:c==="task"&&b||null},B=(t="application/json")=>{const n={"Content-Type":t};return E&&(n["x-taskforce-workspace-id"]=E),n},ot=(t,n=!0,a=T.current)=>{const r=t.trim();if(!r||!/^https?:\/\//i.test(r))return"invalid";const i=r,f=$(i);if(nt(a,f))return"duplicate";const u=r.split(/[\\/]/).pop()||r;return Y({path:i,caption:u,timestamp:new Date().toISOString()}),at(a,f),n&&q(""),A(null),"added"};y.useEffect(()=>{if(!I)return;const t=window.setTimeout(()=>{j(null)},Bt);return()=>window.clearTimeout(t)},[I]);const rt=async t=>{if(t.length===0)return;C(null),j(null);const n=t,a=[],r=[],p=[],i=[],f=new Set(Q.current);n.forEach(x=>{const h=xt(x.name);if(!Ot.has(h)){a.push(x.name);return}if(x.size>_t){r.push(x.name);return}const L=Mt(x);if(f.has(L)){p.push(x.name);return}f.add(L),i.push({file:x,fingerprint:L})});const u=[];if(a.length>0&&u.push(`${a.length} unsupported file${a.length===1?"":"s"} skipped: ${J(a)}.`),r.length>0&&u.push(`${r.length} file${r.length===1?"":"s"} over 10 MB skipped: ${J(r)}.`),p.length>0&&u.push(`${p.length} local duplicate file${p.length===1?"":"s"} skipped before upload: ${J(p)}.`),i.length===0){u.length>0&&j(u.join(" ")),v.current&&(v.current.value="");return}Z(!0);const k=new Set(T.current);let d=0;try{for(const{file:h,fingerprint:L}of i){let l=null;const lt=await fetch("/api/taskforce/context-upload/init",{method:"POST",headers:B(),body:JSON.stringify({originalName:h.name,mimeType:h.type||"application/octet-stream",size:h.size,..._,workspaceId:E||null})});if(lt.ok){const w=await lt.json();if(w?.success&&typeof w?.uploadUrl=="string"&&typeof w?.path=="string"){if(!(await fetch(w.uploadUrl,{method:String(w.method||"PUT"),headers:w.headers||{"Content-Type":h.type||"application/octet-stream"},body:h})).ok)throw new Error(`Upload failed for ${h.name}`);const H=await fetch("/api/taskforce/context-upload/finalize",{method:"POST",headers:B(),body:JSON.stringify({relativePath:w.relativePath,mimeType:h.type||"application/octet-stream",originalName:h.name,size:h.size,..._,workspaceId:E||null})});if(!H.ok){const Tt=await H.json().catch(()=>({}));throw new Error(Tt?.error||`Upload failed for ${h.name}`)}l=await H.json().catch(()=>null)}else w?.success&&typeof w?.path=="string"&&(l=w)}if(!l){const w=await Ht(h),M=await fetch("/api/taskforce/context-upload",{method:"POST",headers:B(),body:JSON.stringify({file:w,originalName:h.name,..._,workspaceId:E||null})});if(!M.ok)throw new Error(`Upload failed for ${h.name}`);l=await M.json()}if(!l?.success||!l?.path)throw new Error(`Upload failed for ${h.name}`);const ct=$(l.path,l.fsPath);if(nt(k,ct)){d+=1;continue}Y({path:l.path,fsPath:l.fsPath,caption:typeof l.caption=="string"&&l.caption.trim().length>0?l.caption:h.name,displayName:typeof l.displayName=="string"?l.displayName:void 0,originalFilename:typeof l.originalFilename=="string"?l.originalFilename:h.name,assetId:typeof l.assetId=="string"?l.assetId:void 0,referenceNumber:typeof l.referenceNumber=="number"?l.referenceNumber:null,referenceLabel:typeof l.referenceLabel=="string"?l.referenceLabel:void 0,taskId:c==="task"&&typeof l.taskId=="string"?l.taskId:null,timestamp:typeof l.timestamp=="string"&&l.timestamp.trim().length>0?l.timestamp:new Date().toISOString()}),Lt({workspaceId:E||"default",ownerType:c,ownerId:b||null,taskId:c==="task"&&b||null,reason:"upload"}),at(k,ct),Q.current.add(L)}const x=[...u];d>0&&x.push(`${d} duplicate file${d===1?"":"s"} skipped.`),j(x.length>0?x.join(" "):null),T.current=k}catch(x){C(x instanceof Error?x.message:"Failed to upload context file")}finally{Z(!1),v.current&&(v.current.value="")}},it=async t=>{!t||t.length===0||await rt(Array.from(t))},kt=async()=>{if(C(null),j(null),!navigator.clipboard||typeof navigator.clipboard.read!="function"){C("Clipboard image paste is not available in this browser.");return}try{const t=await navigator.clipboard.read(),n=[];for(const a of t){const r=Kt(a);if(!r)continue;const p=await a.getType(r),i=r.toLowerCase()==="image/png"?"png":r.toLowerCase()==="image/webp"?"webp":"jpg";n.push(new globalThis.File([p],`pasted-image-${Date.now()}.${i}`,{type:r}))}if(n.length===0){C("Clipboard does not currently contain a supported image.");return}await rt(n)}catch(t){C(t?.message||"Failed to read an image from the clipboard.")}},jt=t=>{const n=new Set,a=t.dataTransfer.getData("text/uri-list")||"",r=t.dataTransfer.getData("text/plain")||"",p=`${a}
2
2
  ${r}`.split(`
3
3
  `).map(i=>i.trim()).filter(i=>!!i&&!i.startsWith("#"));for(const i of p){if(/^file:\/\//i.test(i)){try{const f=new URL(i),u=decodeURIComponent(f.pathname||"").trim();u&&n.add(u)}catch{}continue}n.add(i)}return Array.from(n)},bt=t=>{if(t.preventDefault(),t.stopPropagation(),z(!1),O(0),C(null),A(null),j(null),t.dataTransfer.files&&t.dataTransfer.files.length>0){it(t.dataTransfer.files);return}const n=jt(t);if(n.length===0){A("Drop a file or URL.");return}const a=new Set(T.current);let r=0,p=0,i=0;n.forEach(u=>{const k=ot(u,!1,a);k==="duplicate"&&(r+=1),k==="added"&&(p+=1),k==="invalid"&&(i+=1)});const f=[];r>0&&f.push(`${r} duplicate link${r===1?"":"s"} skipped.`),i>0&&f.push(`${i} local path${i===1?"":"s"} skipped. Upload files to attach them, or drop an http(s) URL to link.`),j(f.length>0?f.join(" "):p>0?null:I),T.current=a},Nt=t=>{t.preventDefault(),t.stopPropagation(),O(n=>n+1),z(!0)},Ct=t=>{t.preventDefault(),t.stopPropagation(),O(n=>{const a=Math.max(0,n-1);return a===0&&z(!1),a})},vt=t=>{t.preventDefault(),t.stopPropagation(),t.dataTransfer.dropEffect="copy"},At=N.filter(t=>{const n=typeof t=="string"?t:t.path;return S(n)}),It=N.filter(t=>{const n=typeof t=="string"?t:t.path;return!S(n)});return e.jsxs("div",{className:s.specialistSection,children:[e.jsxs("div",{className:s.toggleHeading,onClick:()=>yt(!U),title:U?"Hide context documents":"Show context documents",children:[e.jsxs("label",{className:s.label,children:["Context Documents ",N.length>0&&`(${N.length})`]}),U?e.jsx(Dt,{size:14}):e.jsx(Pt,{size:14})]}),U&&e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:s.settingsHint,children:["Upload files into ",st," context storage, or add an external http(s) URL."]}),e.jsxs("div",{className:s.contextUploadPanel,children:[e.jsxs("div",{className:s.contextUploadActions,children:[e.jsxs("button",{type:"button",className:s.secondaryHeaderBtn,onClick:()=>v.current?.click(),disabled:P,children:[P?e.jsx(Ut,{size:12,className:s.spinner}):e.jsx(K,{size:12}),P?"Uploading...":"Upload File"]}),e.jsxs("button",{type:"button",className:s.secondaryHeaderBtn,onClick:()=>{kt()},disabled:P,children:[e.jsx(X,{size:12}),"Paste Image from Clipboard"]})]}),e.jsx("input",{ref:v,type:"file",accept:gt,multiple:!0,className:s.hiddenInput,onChange:t=>{it(t.target.files)}}),V&&e.jsx("div",{className:s.error,children:V}),e.jsxs("div",{className:s.contextLinkRow,children:[e.jsx("input",{type:"text",className:s.input,placeholder:"Add external URL (https://...)",value:F,onChange:t=>{q(t.target.value),R&&A(null),I&&j(null)}}),e.jsx("button",{type:"button",className:s.secondaryHeaderBtn,onClick:()=>{if(!F.trim()){A("Enter an http(s) URL to link.");return}const t=ot(F,!0);if(t==="invalid"){A("Only external http(s) URLs can be linked here. Upload files to attach them.");return}t==="duplicate"?j(`Link already exists in ${st} context.`):t==="added"&&j(null)},children:"Add URL"})]}),e.jsxs("div",{className:`${s.contextDropzone} ${wt?s.contextDropzoneActive:""}`,onDragEnter:Nt,onDragLeave:Ct,onDragOver:vt,onDrop:bt,children:[e.jsx(K,{size:14}),e.jsx("span",{children:"Drop files or URLs here"})]})]}),I&&e.jsx("div",{className:s.contextNotice,children:I}),R&&e.jsx("div",{className:s.error,children:R}),At.length>0&&e.jsx("div",{className:s.attachmentGrid,children:N.map((t,n)=>{const a=typeof t=="string"?t:t.path;if(!S(a))return null;const r=typeof t=="string"?void 0:t.fsPath,p=typeof t=="string"?"":t.caption||"",i=mt(t),f=S(a),u=/^https?:\/\//i.test(a),k=c==="task"&&Et(t);return e.jsxs("div",{className:s.attachmentCard,children:[e.jsxs("div",{className:s.attachmentPreviewContainer,children:[f?e.jsx("img",{src:a,alt:p||`Context file ${n}`,onClick:()=>{c==="task"&&pt(t,{taskId:b,taskReferenceLabel:g})||window.open(a,"_blank")},onError:d=>{d.target.style.display="none",d.target.parentElement.classList.add(s.brokenImage)}}):e.jsxs("button",{type:"button",className:s.contextFileLink,onClick:()=>{const d=c==="task"?typeof t=="string"?{path:t,taskId:b}:{...t,taskId:b}:t;dt(d,r)||window.open(a,"_blank")},title:"Open file",children:[e.jsx(K,{size:16}),e.jsx("span",{children:p||r||a.split("/").pop()||"Context file"})]}),e.jsxs("div",{className:s.brokenImagePlaceholder,children:[e.jsx($t,{size:16}),e.jsx("span",{children:"Preview unavailable"})]}),e.jsxs("div",{className:s.attachmentActions,children:[k&&e.jsx("button",{type:"button",className:s.attachmentActionBtn,onClick:d=>{d.stopPropagation(),pt(t,{taskId:b,taskReferenceLabel:g})},title:"Annotate",children:e.jsx(Ft,{size:12})}),r&&e.jsx("button",{type:"button",className:s.attachmentActionBtn,onClick:d=>{d.stopPropagation(),navigator.clipboard.writeText(r)},title:`Copy path: ${r}`,children:e.jsx(X,{size:12})}),!u&&e.jsx("button",{type:"button",className:s.attachmentActionBtn,onClick:d=>{d.stopPropagation(),window.open(ft(a,p||i),"_blank")},title:"Download",children:e.jsx(ut,{size:12})}),e.jsx("button",{type:"button",className:s.attachmentActionBtn,onClick:d=>{d.stopPropagation(),G(n)},title:"Delete",children:e.jsx(ht,{size:12})})]})]}),e.jsx("input",{type:"text",className:s.attachmentCaptionInput,placeholder:"Add a label...",value:p,onChange:d=>W(n,d.target.value)})]},n)})}),It.length>0&&e.jsx("div",{className:s.documentAttachmentList,children:N.map((t,n)=>{const a=typeof t=="string"?t:t.path;if(S(a))return null;const r=typeof t=="string"?void 0:t.fsPath,p=typeof t=="string"?"":t.caption||"",i=mt(t),f=Xt(t),u=typeof t=="string"?"":St(t),k=/^https?:\/\//i.test(a);return e.jsxs("div",{className:s.documentAttachmentItem,children:[e.jsxs("div",{className:s.documentAttachmentRow,children:[e.jsxs("button",{type:"button",className:s.documentAttachmentLink,onClick:()=>{const d=c==="task"?typeof t=="string"?{path:t,taskId:b}:{...t,taskId:b}:t;dt(d,r)||window.open(a,"_blank")},title:i,children:[e.jsxs("span",{className:s.documentAttachmentMain,children:[e.jsx("span",{className:s.documentAttachmentIcon,"aria-hidden":"true",children:e.jsx(Rt,{size:13})}),e.jsxs("span",{className:s.documentAttachmentText,children:[e.jsx("span",{className:s.documentAttachmentName,children:i}),u&&e.jsx("span",{className:s.taskIdBadge,children:u})]})]}),e.jsx("span",{className:s.documentAttachmentType,children:f})]}),e.jsxs("div",{className:s.documentAttachmentActions,children:[r&&e.jsx("button",{type:"button",className:s.documentAttachmentActionBtn,onClick:()=>{navigator.clipboard.writeText(r)},title:`Copy path: ${r}`,children:e.jsx(X,{size:12})}),!k&&e.jsx("button",{type:"button",className:s.documentAttachmentActionBtn,onClick:()=>{window.open(ft(a,p||i),"_blank")},title:"Download",children:e.jsx(ut,{size:12})}),e.jsx("button",{type:"button",className:s.documentAttachmentActionBtn,onClick:()=>G(n),title:"Delete",children:e.jsx(ht,{size:12})})]})]}),e.jsx("input",{type:"text",className:s.documentAttachmentCaptionInput,placeholder:"Add a label...",value:p,onChange:d=>W(n,d.target.value)})]},n)})})]})]})}export{te as ContextAttachmentManager};
@@ -1,4 +1,4 @@
1
- import{j as e,r as i,s as an,R as ve}from"./vendor-react-CKJs5o3c.js";import{h as $e,f as P,t as L,i as yt,j as gt,k as sn,R as rn,m as M,M as on,n as xt,o as cn,q as ln}from"./index-607WPo_X.js";import{q as dn,w as un,v as mn,au as hn,av as pn,x as qe,i as fn,Z as Qe,X as Rt,aw as _t,e as Ye,ax as At,ay as vn,az as wn,a as kn,j as yn,aA as gn,aB as xn,aC as _n,t as Ee,aD as bn,r as Sn,p as jn,aE as bt,at as Ve,aF as Cn,aG as Nn,T as Tn,R as En,aH as Rn,B as An,U as In,S as $n}from"./vendor-icons-B32hGuF2.js";import{g as Ln}from"./documentReferences-DPZuTgHh.js";import{s as Dn,M as Re,r as Ae}from"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";const Bn="_index_1sp0v_1",Mn="_header_1sp0v_8",Pn="_title_1sp0v_23",zn="_search_1sp0v_35",Fn="_searchIcon_1sp0v_41",On="_searchInput_1sp0v_50",Hn="_list_1sp0v_67",Wn="_state_1sp0v_79",Gn="_stateError_1sp0v_87",Kn="_item_1sp0v_94",Un="_itemActive_1sp0v_116",Jn="_itemIcon_1sp0v_126",Vn="_itemBody_1sp0v_136",qn="_itemTitle_1sp0v_144",Qn="_itemTask_1sp0v_156",Yn="_itemBadge_1sp0v_167",Xn="_itemMeta_1sp0v_180",Zn="_itemMetaDetails_1sp0v_191",ea="_itemMetaReference_1sp0v_198",A={index:Bn,header:Mn,title:Pn,search:zn,searchIcon:Fn,searchInput:On,list:Hn,state:Wn,stateError:Gn,item:Kn,itemActive:Un,itemIcon:Jn,itemBody:Vn,itemTitle:qn,itemTask:Qn,itemBadge:Yn,itemMeta:Xn,itemMetaDetails:Zn,itemMetaReference:ea};function Xe(t){let l=t;try{l=decodeURIComponent(t)}catch{l=t}return l.trim().replace(/\\/g,"/").replace(/^\/+/,"").replace(/^\.\//,"").replace(/^\.taskforce\//,"")}function ta(t,l){return!!(t===l||t.endsWith(`/${l}`)||l.endsWith(`/${t}`))}function St(t){const l=Xe(String(t||""));if(!l)return null;const m=l.match(/(^|\/)(asset-[a-f0-9]{32})(?=[^/]*$)/i);return m?.[2]?m[2].toLowerCase():null}function et(t){return t.attachmentState==="attached"||t.attachmentState==="unattached"?t.attachmentState:(typeof t.attachmentCount=="number"&&Number.isFinite(t.attachmentCount)?t.attachmentCount:0)>0||t.taskId?"attached":"unattached"}function na(t,l,m,s){const c=l.trim().toLowerCase();return t.filter(u=>{const y=`${$e(u)} ${u.originalFilename||""}`.toLowerCase(),v=c.length===0||y.includes(c),b=m.length===0||m.includes(u.docType),h=et(u),g=s.length===0||s.includes(h);return v&&b&&g})}function aa({docType:t}){switch(t){case"implementation-plan":return e.jsx(fn,{size:13});case"review":return e.jsx(qe,{size:13});case"walkthrough":return e.jsx(pn,{size:13});default:return e.jsx(hn,{size:13})}}function sa(t){return t<1024?`${t}B`:t<1024*1024?`${(t/1024).toFixed(1)}KB`:`${(t/(1024*1024)).toFixed(1)}MB`}function ra(t){if(!t)return"";const l=new Date(t),s=new Date().getTime()-l.getTime(),c=Math.floor(s/(1e3*60*60*24));return c===0?"Today":c===1?"Yesterday":c<7?`${c}d ago`:c<30?`${Math.floor(c/7)}w ago`:l.toLocaleDateString()}function ia(t,l){t.key!=="Enter"&&t.key!==" "||(t.preventDefault(),l())}function oa({documents:t,selectedDocId:l,loading:m,error:s,searchQuery:c,taskById:u,onSearchChange:w,onSelect:y,onCloseTray:v,hasActiveFilters:b}){return e.jsxs("div",{className:A.index,children:[e.jsxs("div",{className:A.header,children:[e.jsxs("span",{className:A.title,children:[e.jsx(dn,{size:14}),"Documents"]}),v?e.jsx("button",{type:"button",className:"tf-control-icon",onClick:v,title:"Collapse document tray","aria-label":"Collapse document tray",children:e.jsx(un,{size:16})}):null]}),e.jsxs("div",{className:A.search,children:[e.jsx(mn,{size:12,className:A.searchIcon}),e.jsx("input",{type:"text",placeholder:"Search documents…",value:c,onChange:h=>w(h.target.value),className:A.searchInput})]}),e.jsxs("div",{className:`${A.list} tf-scrollbar`,children:[m&&e.jsx("div",{className:A.state,children:"Loading documents…"}),!m&&s&&e.jsx("div",{className:A.stateError,children:s}),!m&&!s&&t.length===0&&e.jsx("div",{className:A.state,children:b?"No documents match your filters.":"No documents found. Documents added as task attachments will appear here."}),!m&&t.map(h=>{const g=h.taskId?u.get(h.taskId):null,O=h.id===l,T=$e(h),C=et(h),D=typeof h.attachmentCount=="number"&&Number.isFinite(h.attachmentCount)?h.attachmentCount:h.taskId?1:0,E=D>1?`${D} tasks linked`:D===1?g?.title||"1 task linked":null;return e.jsxs("div",{role:"button",tabIndex:0,className:`${A.item} ${O?A.itemActive:""}`,onClick:()=>y(h),onKeyDown:I=>ia(I,()=>y(h)),children:[e.jsx("div",{className:A.itemIcon,children:e.jsx(aa,{docType:h.docType})}),e.jsxs("div",{className:A.itemBody,children:[e.jsx("span",{className:A.itemTitle,title:T,children:T}),C==="unattached"&&e.jsx("span",{className:A.itemBadge,children:"Unattached"}),E&&e.jsx("span",{className:A.itemTask,title:E,children:E}),e.jsxs("span",{className:A.itemMeta,children:[e.jsxs("span",{className:A.itemMetaDetails,children:[sa(h.sizeBytes),h.updatedAt&&e.jsxs(e.Fragment,{children:[" · ",ra(h.updatedAt)]})]}),h.referenceLabel&&e.jsx("span",{className:A.itemMetaReference,children:h.referenceLabel})]})]})]},h.id)})]})]})}function Ie(t){return function(l){return Dn(l,t)}}const ca="_viewer_v1pk0_1",la="_viewerMonochrome_v1pk0_10",da="_metaDocumentName_v1pk0_10",ua="_viewerEditMode_v1pk0_14",ma="_meta_v1pk0_10",ha="_metaLeft_v1pk0_30",pa="_metaRenameRow_v1pk0_49",fa="_typeBadge_v1pk0_56",va="_typeBadgeImplementationPlan_v1pk0_71",wa="_typeBadgeReview_v1pk0_77",ka="_typeBadgeWalkthrough_v1pk0_83",ya="_metaTaskName_v1pk0_89",ga="_statusBadge_v1pk0_98",xa="_metaDate_v1pk0_113",_a="_metaSize_v1pk0_114",ba="_actions_v1pk0_122",Sa="_actionBtn_v1pk0_129",ja="_dangerBtn_v1pk0_156",Ca="_generateBtn_v1pk0_167",Na="_editBtn_v1pk0_178",Ta="_saveBtn_v1pk0_189",Ea="_layoutToggle_v1pk0_205",Ra="_layoutBtn_v1pk0_213",Aa="_layoutBtnActive_v1pk0_229",Ia="_saveStatus_v1pk0_234",$a="_saveStatusSaved_v1pk0_241",La="_saveStatusError_v1pk0_245",Da="_unsaved_v1pk0_250",Ba="_viewerContent_v1pk0_256",Ma="_viewerBody_v1pk0_265",Pa="_viewerBodyFullWidth_v1pk0_273",za="_viewerMain_v1pk0_277",Fa="_reviewRail_v1pk0_285",Oa="_printHint_v1pk0_291",Ha="_reviewSection_v1pk0_298",Wa="_reviewHeader_v1pk0_307",Ga="_reviewTitle_v1pk0_315",Ka="_reviewSubtitle_v1pk0_324",Ua="_reviewControls_v1pk0_331",Ja="_reviewSelect_v1pk0_338",Va="_reviewSessionMeta_v1pk0_342",qa="_reviewStatusResolved_v1pk0_350",Qa="_reviewSessionLabel_v1pk0_356",Ya="_reviewTitleEditRow_v1pk0_361",Xa="_reviewSessionTimestamp_v1pk0_368",Za="_reviewAnchorLabel_v1pk0_372",es="_reviewComposer_v1pk0_378",ts="_reviewAnchorChip_v1pk0_385",ns="_reviewAnchorSnippet_v1pk0_398",as="_reviewAnchorClear_v1pk0_403",ss="_reviewCommentActions_v1pk0_416",rs="_reviewCommentAction_v1pk0_416",is="_reviewCommentEditor_v1pk0_437",os="_viewerState_v1pk0_443",cs="_viewerStateError_v1pk0_450",ls="_editorArea_v1pk0_457",ds="_editorPane_v1pk0_464",us="_editorLayoutSplit_v1pk0_472",ms="_previewPane_v1pk0_473",hs="_editorLayoutEditor_v1pk0_477",ps="_editorLayoutPreview_v1pk0_478",fs="_editorPaneLabel_v1pk0_482",vs="_editorTextarea_v1pk0_494",ws="_markdownSurface_v1pk0_536",ks="_attachModalBody_v1pk0_745",ys="_attachModalCopy_v1pk0_752",gs="_attachModalError_v1pk0_759",xs="_attachTaskList_v1pk0_772",_s="_attachTaskRow_v1pk0_781",bs="_attachTaskTitle_v1pk0_808",Ss="_attachTaskInfo_v1pk0_814",js="_attachTaskReference_v1pk0_822",Cs="_attachTaskMeta_v1pk0_829",Ns="_attachEmptyState_v1pk0_836",r={viewer:ca,viewerMonochrome:la,metaDocumentName:da,viewerEditMode:ua,meta:ma,metaLeft:ha,metaRenameRow:pa,typeBadge:fa,typeBadgeImplementationPlan:va,typeBadgeReview:wa,typeBadgeWalkthrough:ka,metaTaskName:ya,statusBadge:ga,metaDate:xa,metaSize:_a,actions:ba,actionBtn:Sa,dangerBtn:ja,generateBtn:Ca,editBtn:Na,saveBtn:Ta,layoutToggle:Ea,layoutBtn:Ra,layoutBtnActive:Aa,saveStatus:Ia,saveStatusSaved:$a,saveStatusError:La,unsaved:Da,viewerContent:Ba,viewerBody:Ma,viewerBodyFullWidth:Pa,viewerMain:za,reviewRail:Fa,printHint:Oa,reviewSection:Ha,reviewHeader:Wa,reviewTitle:Ga,reviewSubtitle:Ka,reviewControls:Ua,reviewSelect:Ja,reviewSessionMeta:Va,reviewStatusResolved:qa,reviewSessionLabel:Qa,reviewTitleEditRow:Ya,reviewSessionTimestamp:Xa,reviewAnchorLabel:Za,reviewComposer:es,reviewAnchorChip:ts,reviewAnchorSnippet:ns,reviewAnchorClear:as,reviewCommentActions:ss,reviewCommentAction:rs,reviewCommentEditor:is,viewerState:os,viewerStateError:cs,editorArea:ls,editorPane:ds,editorLayoutSplit:us,previewPane:ms,editorLayoutEditor:hs,editorLayoutPreview:ps,editorPaneLabel:fs,editorTextarea:vs,markdownSurface:ws,attachModalBody:ks,attachModalCopy:ys,attachModalError:gs,attachTaskList:xs,attachTaskRow:_s,attachTaskTitle:bs,attachTaskInfo:Ss,attachTaskReference:js,attachTaskMeta:Cs,attachEmptyState:Ns},Ts="_overlay_1unik_1",Es="_modal_1unik_12",Rs="_header_1unik_16",As="_title_1unik_20",Is="_docName_1unik_24",$s="_body_1unik_34",Ls="_state_1unik_41",Ds="_stateError_1unik_52",Bs="_stateDone_1unik_63",Ms="_toolbar_1unik_84",Ps="_toolbarCount_1unik_95",zs="_toolbarActions_1unik_100",Fs="_tree_1unik_105",Os="_taskRow_1unik_113",Hs="_taskRowDimmed_1unik_126",Ws="_taskCheck_1unik_130",Gs="_taskExpandBtn_1unik_139",Ks="_taskExpandSpacer_1unik_155",Us="_taskTitle_1unik_160",Js="_taskBadge_1unik_169",Vs="_footer_1unik_179",S={overlay:Ts,modal:Es,header:Rs,title:As,docName:Is,body:$s,state:Ls,stateError:Ds,stateDone:Bs,toolbar:Ms,toolbarCount:Ps,toolbarActions:zs,tree:Fs,taskRow:Os,taskRowDimmed:Hs,taskCheck:Ws,taskExpandBtn:Gs,taskExpandSpacer:Ks,taskTitle:Us,taskBadge:Js,footer:Vs},qs={1:"Low",2:"Medium",3:"High"};function we(t,l){return t.map(m=>({...m,selected:l,children:we(m.children,l)}))}function It(t,l,m){return t.map(s=>s.idempotencyKey===l?{...s,selected:m,children:we(s.children,m)}:{...s,children:It(s.children,l,m)})}function Ze(t){let l=0;for(const m of t)m.selected&&l++,l+=Ze(m.children);return l}function $t({node:t,depth:l,onToggle:m}){const[s,c]=i.useState(!0),u=t.children.length>0,w=l*20;return e.jsxs("div",{children:[e.jsxs("div",{className:`${S.taskRow} ${t.selected?"":S.taskRowDimmed}`,style:{paddingLeft:`${12+w}px`},children:[e.jsx("button",{className:S.taskCheck,onClick:()=>m(t.idempotencyKey,!t.selected),title:t.selected?"Deselect":"Select",children:t.selected?e.jsx(vn,{size:14,style:{color:"var(--brand-primary-strong)"}}):e.jsx(wn,{size:14,style:{color:"var(--text-muted)"}})}),u?e.jsx("button",{className:S.taskExpandBtn,onClick:()=>c(y=>!y),children:s?e.jsx(kn,{size:12}):e.jsx(yn,{size:12})}):e.jsx("span",{className:S.taskExpandSpacer}),e.jsx("span",{className:S.taskTitle,title:t.description||void 0,children:t.title}),e.jsx("span",{className:S.taskBadge,style:{color:yt(t.type),borderColor:yt(t.type)},children:t.type}),e.jsx("span",{className:S.taskBadge,style:{color:gt(t.priority),borderColor:gt(t.priority)},children:qs[t.priority]})]}),u&&s&&e.jsx("div",{children:t.children.map(y=>e.jsx($t,{node:y,depth:l+1,onToggle:m},y.idempotencyKey))})]})}function Qs({content:t,docTitle:l,apiBaseUrl:m="",onClose:s,onGenerated:c}){const[u,w]=i.useState("preview"),[y,v]=i.useState(null),[b,h]=i.useState([]),[g,O]=i.useState(!0),[T,C]=i.useState(0),[D,E]=i.useState(null);i.useEffect(()=>{let x=!1;return O(!0),v(null),P("/api/taskforce/documents/generate-tasks/preview",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:t})},m).then(j=>j.json()).then(j=>{if(!x){if(j.error)throw new Error(j.error);h(j.tasks||[]),w("preview")}}).catch(j=>{x||(v(j?.message||"Failed to parse plan"),w("error"))}).finally(()=>{x||O(!1)}),()=>{x=!0}},[t,m]);const I=i.useCallback((x,j)=>{h(F=>It(F,x,j))},[]),z=()=>h(x=>we(x,!0)),H=()=>h(x=>we(x,!1)),q=Ze(b),Q=async()=>{w("generating"),E(null);try{const x=await P("/api/taskforce/documents/generate-tasks/commit",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({tasks:b})},m),j=await x.json().catch(()=>({}));if(!x.ok)throw new Error(j.error||`Generation failed (${x.status})`);C(j.created??0),w("done"),c(j.created??0)}catch(x){E(x?.message||"Generation failed"),w("error")}};return e.jsx("div",{className:S.overlay,onClick:x=>{x.target===x.currentTarget&&s()},children:e.jsxs("div",{className:`tf-surface-modal tf-modal-shell ${S.modal}`,children:[e.jsxs("div",{className:`tf-modal-header ${S.header}`,children:[e.jsxs("div",{className:`tf-modal-title ${S.title}`,children:[e.jsx(Qe,{size:16,style:{color:"var(--brand-primary-strong)"}}),"Generate Tasks from Plan"]}),e.jsx("span",{className:S.docName,children:l}),e.jsx("button",{className:"tf-control-icon",onClick:s,title:"Close",children:e.jsx(Rt,{size:16})})]}),e.jsxs("div",{className:S.body,children:[g&&e.jsxs("div",{className:S.state,children:[e.jsx(_t,{size:20,className:L.docSpinning}),"Parsing plan…"]}),!g&&u==="error"&&e.jsxs("div",{className:S.stateError,children:[e.jsx(Ye,{size:16}),y||D||"An error occurred"]}),!g&&u==="done"&&e.jsxs("div",{className:S.stateDone,children:[e.jsx(At,{size:24,style:{color:"var(--status-success)"}}),e.jsxs("strong",{children:[T," task",T!==1?"s":""," created"]}),e.jsx("p",{children:"Tasks are now in your board. Switch to the Kanban or Hierarchy view to see them."})]}),!g&&(u==="preview"||u==="confirm"||u==="generating")&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:S.toolbar,children:[e.jsxs("span",{className:S.toolbarCount,children:[q," of ",Ze(we(b,!0))," tasks selected"]}),e.jsxs("div",{className:S.toolbarActions,children:[e.jsx("button",{className:"tf-control-icon",onClick:z,children:"Select all"}),e.jsx("button",{className:"tf-control-icon",onClick:H,children:"Deselect all"})]})]}),b.length===0?e.jsx("div",{className:S.state,children:"No tasks could be parsed from this document. Make sure the document uses ## H2 headings for phases and bullet points for tasks."}):e.jsx("div",{className:`${S.tree} tf-scrollbar`,children:b.map(x=>e.jsx($t,{node:x,depth:0,onToggle:I},x.idempotencyKey))})]})]}),!g&&u!=="done"&&u!=="error"&&e.jsxs("div",{className:S.footer,children:[e.jsx("button",{className:"tf-button-secondary",onClick:s,children:"Cancel"}),e.jsx("button",{className:"tf-button-primary",onClick:Q,disabled:q===0||u==="generating",children:u==="generating"?e.jsxs(e.Fragment,{children:[e.jsx(_t,{size:13,className:L.docSpinning})," Generating…"]}):e.jsxs(e.Fragment,{children:[e.jsx(Qe,{size:13})," Generate ",q," task",q!==1?"s":""]})})]}),!g&&u==="done"&&e.jsx("div",{className:S.footer,children:e.jsx("button",{className:"tf-button-primary",onClick:s,children:"Done"})})]})})}const Ys={"implementation-plan":"Implementation Plan",review:"Review",walkthrough:"Walkthrough",planning:"Planning",other:"Document"},Xs={"implementation-plan":r.typeBadgeImplementationPlan,review:r.typeBadgeReview,walkthrough:r.typeBadgeWalkthrough,planning:void 0,other:void 0},Zs={editor:r.editorLayoutEditor,split:r.editorLayoutSplit,preview:r.editorLayoutPreview},er=1500,tr=`
1
+ import{j as e,r as i,s as an,R as ve}from"./vendor-react-CKJs5o3c.js";import{h as $e,f as P,t as L,i as yt,j as gt,k as sn,R as rn,m as M,M as on,n as xt,o as cn,q as ln}from"./index-MAHKvFqp.js";import{q as dn,w as un,v as mn,au as hn,av as pn,x as qe,i as fn,Z as Qe,X as Rt,aw as _t,e as Ye,ax as At,ay as vn,az as wn,a as kn,j as yn,aA as gn,aB as xn,aC as _n,t as Ee,aD as bn,r as Sn,p as jn,aE as bt,at as Ve,aF as Cn,aG as Nn,T as Tn,R as En,aH as Rn,B as An,U as In,S as $n}from"./vendor-icons-B32hGuF2.js";import{g as Ln}from"./documentReferences-BOUcJm6-.js";import{s as Dn,M as Re,r as Ae}from"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";const Bn="_index_1sp0v_1",Mn="_header_1sp0v_8",Pn="_title_1sp0v_23",zn="_search_1sp0v_35",Fn="_searchIcon_1sp0v_41",On="_searchInput_1sp0v_50",Hn="_list_1sp0v_67",Wn="_state_1sp0v_79",Gn="_stateError_1sp0v_87",Kn="_item_1sp0v_94",Un="_itemActive_1sp0v_116",Jn="_itemIcon_1sp0v_126",Vn="_itemBody_1sp0v_136",qn="_itemTitle_1sp0v_144",Qn="_itemTask_1sp0v_156",Yn="_itemBadge_1sp0v_167",Xn="_itemMeta_1sp0v_180",Zn="_itemMetaDetails_1sp0v_191",ea="_itemMetaReference_1sp0v_198",A={index:Bn,header:Mn,title:Pn,search:zn,searchIcon:Fn,searchInput:On,list:Hn,state:Wn,stateError:Gn,item:Kn,itemActive:Un,itemIcon:Jn,itemBody:Vn,itemTitle:qn,itemTask:Qn,itemBadge:Yn,itemMeta:Xn,itemMetaDetails:Zn,itemMetaReference:ea};function Xe(t){let l=t;try{l=decodeURIComponent(t)}catch{l=t}return l.trim().replace(/\\/g,"/").replace(/^\/+/,"").replace(/^\.\//,"").replace(/^\.taskforce\//,"")}function ta(t,l){return!!(t===l||t.endsWith(`/${l}`)||l.endsWith(`/${t}`))}function St(t){const l=Xe(String(t||""));if(!l)return null;const m=l.match(/(^|\/)(asset-[a-f0-9]{32})(?=[^/]*$)/i);return m?.[2]?m[2].toLowerCase():null}function et(t){return t.attachmentState==="attached"||t.attachmentState==="unattached"?t.attachmentState:(typeof t.attachmentCount=="number"&&Number.isFinite(t.attachmentCount)?t.attachmentCount:0)>0||t.taskId?"attached":"unattached"}function na(t,l,m,s){const c=l.trim().toLowerCase();return t.filter(u=>{const y=`${$e(u)} ${u.originalFilename||""}`.toLowerCase(),v=c.length===0||y.includes(c),b=m.length===0||m.includes(u.docType),h=et(u),g=s.length===0||s.includes(h);return v&&b&&g})}function aa({docType:t}){switch(t){case"implementation-plan":return e.jsx(fn,{size:13});case"review":return e.jsx(qe,{size:13});case"walkthrough":return e.jsx(pn,{size:13});default:return e.jsx(hn,{size:13})}}function sa(t){return t<1024?`${t}B`:t<1024*1024?`${(t/1024).toFixed(1)}KB`:`${(t/(1024*1024)).toFixed(1)}MB`}function ra(t){if(!t)return"";const l=new Date(t),s=new Date().getTime()-l.getTime(),c=Math.floor(s/(1e3*60*60*24));return c===0?"Today":c===1?"Yesterday":c<7?`${c}d ago`:c<30?`${Math.floor(c/7)}w ago`:l.toLocaleDateString()}function ia(t,l){t.key!=="Enter"&&t.key!==" "||(t.preventDefault(),l())}function oa({documents:t,selectedDocId:l,loading:m,error:s,searchQuery:c,taskById:u,onSearchChange:w,onSelect:y,onCloseTray:v,hasActiveFilters:b}){return e.jsxs("div",{className:A.index,children:[e.jsxs("div",{className:A.header,children:[e.jsxs("span",{className:A.title,children:[e.jsx(dn,{size:14}),"Documents"]}),v?e.jsx("button",{type:"button",className:"tf-control-icon",onClick:v,title:"Collapse document tray","aria-label":"Collapse document tray",children:e.jsx(un,{size:16})}):null]}),e.jsxs("div",{className:A.search,children:[e.jsx(mn,{size:12,className:A.searchIcon}),e.jsx("input",{type:"text",placeholder:"Search documents…",value:c,onChange:h=>w(h.target.value),className:A.searchInput})]}),e.jsxs("div",{className:`${A.list} tf-scrollbar`,children:[m&&e.jsx("div",{className:A.state,children:"Loading documents…"}),!m&&s&&e.jsx("div",{className:A.stateError,children:s}),!m&&!s&&t.length===0&&e.jsx("div",{className:A.state,children:b?"No documents match your filters.":"No documents found. Documents added as task attachments will appear here."}),!m&&t.map(h=>{const g=h.taskId?u.get(h.taskId):null,O=h.id===l,T=$e(h),C=et(h),D=typeof h.attachmentCount=="number"&&Number.isFinite(h.attachmentCount)?h.attachmentCount:h.taskId?1:0,E=D>1?`${D} tasks linked`:D===1?g?.title||"1 task linked":null;return e.jsxs("div",{role:"button",tabIndex:0,className:`${A.item} ${O?A.itemActive:""}`,onClick:()=>y(h),onKeyDown:I=>ia(I,()=>y(h)),children:[e.jsx("div",{className:A.itemIcon,children:e.jsx(aa,{docType:h.docType})}),e.jsxs("div",{className:A.itemBody,children:[e.jsx("span",{className:A.itemTitle,title:T,children:T}),C==="unattached"&&e.jsx("span",{className:A.itemBadge,children:"Unattached"}),E&&e.jsx("span",{className:A.itemTask,title:E,children:E}),e.jsxs("span",{className:A.itemMeta,children:[e.jsxs("span",{className:A.itemMetaDetails,children:[sa(h.sizeBytes),h.updatedAt&&e.jsxs(e.Fragment,{children:[" · ",ra(h.updatedAt)]})]}),h.referenceLabel&&e.jsx("span",{className:A.itemMetaReference,children:h.referenceLabel})]})]})]},h.id)})]})]})}function Ie(t){return function(l){return Dn(l,t)}}const ca="_viewer_v1pk0_1",la="_viewerMonochrome_v1pk0_10",da="_metaDocumentName_v1pk0_10",ua="_viewerEditMode_v1pk0_14",ma="_meta_v1pk0_10",ha="_metaLeft_v1pk0_30",pa="_metaRenameRow_v1pk0_49",fa="_typeBadge_v1pk0_56",va="_typeBadgeImplementationPlan_v1pk0_71",wa="_typeBadgeReview_v1pk0_77",ka="_typeBadgeWalkthrough_v1pk0_83",ya="_metaTaskName_v1pk0_89",ga="_statusBadge_v1pk0_98",xa="_metaDate_v1pk0_113",_a="_metaSize_v1pk0_114",ba="_actions_v1pk0_122",Sa="_actionBtn_v1pk0_129",ja="_dangerBtn_v1pk0_156",Ca="_generateBtn_v1pk0_167",Na="_editBtn_v1pk0_178",Ta="_saveBtn_v1pk0_189",Ea="_layoutToggle_v1pk0_205",Ra="_layoutBtn_v1pk0_213",Aa="_layoutBtnActive_v1pk0_229",Ia="_saveStatus_v1pk0_234",$a="_saveStatusSaved_v1pk0_241",La="_saveStatusError_v1pk0_245",Da="_unsaved_v1pk0_250",Ba="_viewerContent_v1pk0_256",Ma="_viewerBody_v1pk0_265",Pa="_viewerBodyFullWidth_v1pk0_273",za="_viewerMain_v1pk0_277",Fa="_reviewRail_v1pk0_285",Oa="_printHint_v1pk0_291",Ha="_reviewSection_v1pk0_298",Wa="_reviewHeader_v1pk0_307",Ga="_reviewTitle_v1pk0_315",Ka="_reviewSubtitle_v1pk0_324",Ua="_reviewControls_v1pk0_331",Ja="_reviewSelect_v1pk0_338",Va="_reviewSessionMeta_v1pk0_342",qa="_reviewStatusResolved_v1pk0_350",Qa="_reviewSessionLabel_v1pk0_356",Ya="_reviewTitleEditRow_v1pk0_361",Xa="_reviewSessionTimestamp_v1pk0_368",Za="_reviewAnchorLabel_v1pk0_372",es="_reviewComposer_v1pk0_378",ts="_reviewAnchorChip_v1pk0_385",ns="_reviewAnchorSnippet_v1pk0_398",as="_reviewAnchorClear_v1pk0_403",ss="_reviewCommentActions_v1pk0_416",rs="_reviewCommentAction_v1pk0_416",is="_reviewCommentEditor_v1pk0_437",os="_viewerState_v1pk0_443",cs="_viewerStateError_v1pk0_450",ls="_editorArea_v1pk0_457",ds="_editorPane_v1pk0_464",us="_editorLayoutSplit_v1pk0_472",ms="_previewPane_v1pk0_473",hs="_editorLayoutEditor_v1pk0_477",ps="_editorLayoutPreview_v1pk0_478",fs="_editorPaneLabel_v1pk0_482",vs="_editorTextarea_v1pk0_494",ws="_markdownSurface_v1pk0_536",ks="_attachModalBody_v1pk0_745",ys="_attachModalCopy_v1pk0_752",gs="_attachModalError_v1pk0_759",xs="_attachTaskList_v1pk0_772",_s="_attachTaskRow_v1pk0_781",bs="_attachTaskTitle_v1pk0_808",Ss="_attachTaskInfo_v1pk0_814",js="_attachTaskReference_v1pk0_822",Cs="_attachTaskMeta_v1pk0_829",Ns="_attachEmptyState_v1pk0_836",r={viewer:ca,viewerMonochrome:la,metaDocumentName:da,viewerEditMode:ua,meta:ma,metaLeft:ha,metaRenameRow:pa,typeBadge:fa,typeBadgeImplementationPlan:va,typeBadgeReview:wa,typeBadgeWalkthrough:ka,metaTaskName:ya,statusBadge:ga,metaDate:xa,metaSize:_a,actions:ba,actionBtn:Sa,dangerBtn:ja,generateBtn:Ca,editBtn:Na,saveBtn:Ta,layoutToggle:Ea,layoutBtn:Ra,layoutBtnActive:Aa,saveStatus:Ia,saveStatusSaved:$a,saveStatusError:La,unsaved:Da,viewerContent:Ba,viewerBody:Ma,viewerBodyFullWidth:Pa,viewerMain:za,reviewRail:Fa,printHint:Oa,reviewSection:Ha,reviewHeader:Wa,reviewTitle:Ga,reviewSubtitle:Ka,reviewControls:Ua,reviewSelect:Ja,reviewSessionMeta:Va,reviewStatusResolved:qa,reviewSessionLabel:Qa,reviewTitleEditRow:Ya,reviewSessionTimestamp:Xa,reviewAnchorLabel:Za,reviewComposer:es,reviewAnchorChip:ts,reviewAnchorSnippet:ns,reviewAnchorClear:as,reviewCommentActions:ss,reviewCommentAction:rs,reviewCommentEditor:is,viewerState:os,viewerStateError:cs,editorArea:ls,editorPane:ds,editorLayoutSplit:us,previewPane:ms,editorLayoutEditor:hs,editorLayoutPreview:ps,editorPaneLabel:fs,editorTextarea:vs,markdownSurface:ws,attachModalBody:ks,attachModalCopy:ys,attachModalError:gs,attachTaskList:xs,attachTaskRow:_s,attachTaskTitle:bs,attachTaskInfo:Ss,attachTaskReference:js,attachTaskMeta:Cs,attachEmptyState:Ns},Ts="_overlay_1unik_1",Es="_modal_1unik_12",Rs="_header_1unik_16",As="_title_1unik_20",Is="_docName_1unik_24",$s="_body_1unik_34",Ls="_state_1unik_41",Ds="_stateError_1unik_52",Bs="_stateDone_1unik_63",Ms="_toolbar_1unik_84",Ps="_toolbarCount_1unik_95",zs="_toolbarActions_1unik_100",Fs="_tree_1unik_105",Os="_taskRow_1unik_113",Hs="_taskRowDimmed_1unik_126",Ws="_taskCheck_1unik_130",Gs="_taskExpandBtn_1unik_139",Ks="_taskExpandSpacer_1unik_155",Us="_taskTitle_1unik_160",Js="_taskBadge_1unik_169",Vs="_footer_1unik_179",S={overlay:Ts,modal:Es,header:Rs,title:As,docName:Is,body:$s,state:Ls,stateError:Ds,stateDone:Bs,toolbar:Ms,toolbarCount:Ps,toolbarActions:zs,tree:Fs,taskRow:Os,taskRowDimmed:Hs,taskCheck:Ws,taskExpandBtn:Gs,taskExpandSpacer:Ks,taskTitle:Us,taskBadge:Js,footer:Vs},qs={1:"Low",2:"Medium",3:"High"};function we(t,l){return t.map(m=>({...m,selected:l,children:we(m.children,l)}))}function It(t,l,m){return t.map(s=>s.idempotencyKey===l?{...s,selected:m,children:we(s.children,m)}:{...s,children:It(s.children,l,m)})}function Ze(t){let l=0;for(const m of t)m.selected&&l++,l+=Ze(m.children);return l}function $t({node:t,depth:l,onToggle:m}){const[s,c]=i.useState(!0),u=t.children.length>0,w=l*20;return e.jsxs("div",{children:[e.jsxs("div",{className:`${S.taskRow} ${t.selected?"":S.taskRowDimmed}`,style:{paddingLeft:`${12+w}px`},children:[e.jsx("button",{className:S.taskCheck,onClick:()=>m(t.idempotencyKey,!t.selected),title:t.selected?"Deselect":"Select",children:t.selected?e.jsx(vn,{size:14,style:{color:"var(--brand-primary-strong)"}}):e.jsx(wn,{size:14,style:{color:"var(--text-muted)"}})}),u?e.jsx("button",{className:S.taskExpandBtn,onClick:()=>c(y=>!y),children:s?e.jsx(kn,{size:12}):e.jsx(yn,{size:12})}):e.jsx("span",{className:S.taskExpandSpacer}),e.jsx("span",{className:S.taskTitle,title:t.description||void 0,children:t.title}),e.jsx("span",{className:S.taskBadge,style:{color:yt(t.type),borderColor:yt(t.type)},children:t.type}),e.jsx("span",{className:S.taskBadge,style:{color:gt(t.priority),borderColor:gt(t.priority)},children:qs[t.priority]})]}),u&&s&&e.jsx("div",{children:t.children.map(y=>e.jsx($t,{node:y,depth:l+1,onToggle:m},y.idempotencyKey))})]})}function Qs({content:t,docTitle:l,apiBaseUrl:m="",onClose:s,onGenerated:c}){const[u,w]=i.useState("preview"),[y,v]=i.useState(null),[b,h]=i.useState([]),[g,O]=i.useState(!0),[T,C]=i.useState(0),[D,E]=i.useState(null);i.useEffect(()=>{let x=!1;return O(!0),v(null),P("/api/taskforce/documents/generate-tasks/preview",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:t})},m).then(j=>j.json()).then(j=>{if(!x){if(j.error)throw new Error(j.error);h(j.tasks||[]),w("preview")}}).catch(j=>{x||(v(j?.message||"Failed to parse plan"),w("error"))}).finally(()=>{x||O(!1)}),()=>{x=!0}},[t,m]);const I=i.useCallback((x,j)=>{h(F=>It(F,x,j))},[]),z=()=>h(x=>we(x,!0)),H=()=>h(x=>we(x,!1)),q=Ze(b),Q=async()=>{w("generating"),E(null);try{const x=await P("/api/taskforce/documents/generate-tasks/commit",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({tasks:b})},m),j=await x.json().catch(()=>({}));if(!x.ok)throw new Error(j.error||`Generation failed (${x.status})`);C(j.created??0),w("done"),c(j.created??0)}catch(x){E(x?.message||"Generation failed"),w("error")}};return e.jsx("div",{className:S.overlay,onClick:x=>{x.target===x.currentTarget&&s()},children:e.jsxs("div",{className:`tf-surface-modal tf-modal-shell ${S.modal}`,children:[e.jsxs("div",{className:`tf-modal-header ${S.header}`,children:[e.jsxs("div",{className:`tf-modal-title ${S.title}`,children:[e.jsx(Qe,{size:16,style:{color:"var(--brand-primary-strong)"}}),"Generate Tasks from Plan"]}),e.jsx("span",{className:S.docName,children:l}),e.jsx("button",{className:"tf-control-icon",onClick:s,title:"Close",children:e.jsx(Rt,{size:16})})]}),e.jsxs("div",{className:S.body,children:[g&&e.jsxs("div",{className:S.state,children:[e.jsx(_t,{size:20,className:L.docSpinning}),"Parsing plan…"]}),!g&&u==="error"&&e.jsxs("div",{className:S.stateError,children:[e.jsx(Ye,{size:16}),y||D||"An error occurred"]}),!g&&u==="done"&&e.jsxs("div",{className:S.stateDone,children:[e.jsx(At,{size:24,style:{color:"var(--status-success)"}}),e.jsxs("strong",{children:[T," task",T!==1?"s":""," created"]}),e.jsx("p",{children:"Tasks are now in your board. Switch to the Kanban or Hierarchy view to see them."})]}),!g&&(u==="preview"||u==="confirm"||u==="generating")&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:S.toolbar,children:[e.jsxs("span",{className:S.toolbarCount,children:[q," of ",Ze(we(b,!0))," tasks selected"]}),e.jsxs("div",{className:S.toolbarActions,children:[e.jsx("button",{className:"tf-control-icon",onClick:z,children:"Select all"}),e.jsx("button",{className:"tf-control-icon",onClick:H,children:"Deselect all"})]})]}),b.length===0?e.jsx("div",{className:S.state,children:"No tasks could be parsed from this document. Make sure the document uses ## H2 headings for phases and bullet points for tasks."}):e.jsx("div",{className:`${S.tree} tf-scrollbar`,children:b.map(x=>e.jsx($t,{node:x,depth:0,onToggle:I},x.idempotencyKey))})]})]}),!g&&u!=="done"&&u!=="error"&&e.jsxs("div",{className:S.footer,children:[e.jsx("button",{className:"tf-button-secondary",onClick:s,children:"Cancel"}),e.jsx("button",{className:"tf-button-primary",onClick:Q,disabled:q===0||u==="generating",children:u==="generating"?e.jsxs(e.Fragment,{children:[e.jsx(_t,{size:13,className:L.docSpinning})," Generating…"]}):e.jsxs(e.Fragment,{children:[e.jsx(Qe,{size:13})," Generate ",q," task",q!==1?"s":""]})})]}),!g&&u==="done"&&e.jsx("div",{className:S.footer,children:e.jsx("button",{className:"tf-button-primary",onClick:s,children:"Done"})})]})})}const Ys={"implementation-plan":"Implementation Plan",review:"Review",walkthrough:"Walkthrough",planning:"Planning",other:"Document"},Xs={"implementation-plan":r.typeBadgeImplementationPlan,review:r.typeBadgeReview,walkthrough:r.typeBadgeWalkthrough,planning:void 0,other:void 0},Zs={editor:r.editorLayoutEditor,split:r.editorLayoutSplit,preview:r.editorLayoutPreview},er=1500,tr=`
2
2
  @page {
3
3
  margin: 0.94in 1.02in 1in;
4
4
  }
@@ -1 +1 @@
1
- import{R as k,j as t}from"./vendor-react-CKJs5o3c.js";import{S as A,U as N,V as E,W as I,X as S,Y as M}from"./index-607WPo_X.js";import"./vendor-icons-B32hGuF2.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";const $="_thread_1mrb3_1",z="_empty_1mrb3_7",P="_item_1mrb3_17",H="_comment_1mrb3_24",R="_commentAgent_1mrb3_28",B="_commentMember_1mrb3_32",W="_event_1mrb3_36",K="_eventSystem_1mrb3_43",w="_header_1mrb3_47",D="_eventHeader_1mrb3_64",F="_author_1mrb3_71",O="_time_1mrb3_79",U="_commentText_1mrb3_83",X="_eventText_1mrb3_123",Y="_eventChanges_1mrb3_129",q="_eventChange_1mrb3_129",e={thread:$,empty:z,item:P,comment:H,commentAgent:R,commentMember:B,event:W,eventSystem:K,header:w,eventHeader:D,author:F,time:O,commentText:U,eventText:X,eventChanges:Y,eventChange:q};function v(c,m){const r=c.replace("#","").trim();if(r.length!==3&&r.length!==6)return"";const i=r.length===3?r.split("").map(l=>l+l).join(""):r,a=Number.parseInt(i,16);if(Number.isNaN(a))return"";const _=a>>16&255,g=a>>8&255,u=a&255;return`rgba(${_}, ${g}, ${u}, ${m})`}function ee({activity:c,comments:m,formatFieldValue:r,resolveActorPresentation:i,onOpenTaskById:a,emptyMessage:_="No activity yet.",listClassName:g,emptyClassName:u,endRef:l}){const b=k.useMemo(()=>A({activity:c,comments:m}),[c,m]);return t.jsxs("div",{className:[e.thread,g].filter(Boolean).join(" "),children:[b.length===0?t.jsx("div",{className:[e.empty,u].filter(Boolean).join(" "),children:_}):null,b.map(n=>{if(n.type==="comment"){const o=i({actorId:n.comment.author,actorType:n.comment.actor?.kind==="ai"?"ai":n.comment.actor?.kind==="human"?"human":null,actorProfile:n.comment.actor||null}),x=o.kind==="agent"?"agent":"member",{ActorIcon:f}=o,s=o.color,T=s&&v(s,.35)?{background:`linear-gradient(135deg, ${v(s,.18)} 0%, ${v(s,.1)} 100%)`,borderColor:v(s,.35)}:void 0;return t.jsxs("div",{className:[e.item,e.comment,x==="agent"?e.commentAgent:e.commentMember].join(" "),children:[t.jsxs("div",{className:e.header,children:[t.jsxs("span",{className:e.author,style:s?{color:s}:void 0,children:[t.jsx(f,{size:12,strokeWidth:1.5}),o.label]}),t.jsx("span",{className:e.time,children:N(n.comment.timestamp,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})})]}),t.jsx("div",{className:e.commentText,style:T,children:t.jsx(E,{onTaskIdClick:a,children:n.comment.text})})]},n.id)}const d=i({actorId:n.event.actor,actorType:n.event.actorType,actorProfile:n.event.actorProfile||null,fallbackKind:"system"}),{ActorIcon:C}=d,y=d.color,h=Object.entries(n.event.details?.changes||{}),p=I(n.event),j=h.length>1&&p?h.filter(([o])=>o!==p):h.length>1?h:[];return t.jsxs("div",{className:[e.item,e.event,d.kind==="system"?e.eventSystem:""].filter(Boolean).join(" "),children:[t.jsxs("div",{className:[e.header,e.eventHeader].join(" "),children:[t.jsxs("span",{className:e.author,style:y?{color:y}:void 0,children:[t.jsx(C,{size:12,strokeWidth:1.5}),d.label]}),t.jsx("span",{className:e.time,children:N(n.event.createdAt,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})})]}),t.jsxs("div",{className:e.eventText,children:[t.jsx("div",{children:S(n.event,r)}),j.length>0?t.jsx("div",{className:e.eventChanges,children:j.map(([o,x])=>t.jsx("div",{className:e.eventChange,children:M(o,x,r)},o))}):null]})]},n.id)}),t.jsx("div",{ref:l})]})}export{ee as EntityActivityTimeline};
1
+ import{R as k,j as t}from"./vendor-react-CKJs5o3c.js";import{S as A,U as N,V as E,W as I,X as S,Y as M}from"./index-MAHKvFqp.js";import"./vendor-icons-B32hGuF2.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";const $="_thread_1mrb3_1",z="_empty_1mrb3_7",P="_item_1mrb3_17",H="_comment_1mrb3_24",R="_commentAgent_1mrb3_28",B="_commentMember_1mrb3_32",W="_event_1mrb3_36",K="_eventSystem_1mrb3_43",w="_header_1mrb3_47",D="_eventHeader_1mrb3_64",F="_author_1mrb3_71",O="_time_1mrb3_79",U="_commentText_1mrb3_83",X="_eventText_1mrb3_123",Y="_eventChanges_1mrb3_129",q="_eventChange_1mrb3_129",e={thread:$,empty:z,item:P,comment:H,commentAgent:R,commentMember:B,event:W,eventSystem:K,header:w,eventHeader:D,author:F,time:O,commentText:U,eventText:X,eventChanges:Y,eventChange:q};function v(c,m){const r=c.replace("#","").trim();if(r.length!==3&&r.length!==6)return"";const i=r.length===3?r.split("").map(l=>l+l).join(""):r,a=Number.parseInt(i,16);if(Number.isNaN(a))return"";const _=a>>16&255,g=a>>8&255,u=a&255;return`rgba(${_}, ${g}, ${u}, ${m})`}function ee({activity:c,comments:m,formatFieldValue:r,resolveActorPresentation:i,onOpenTaskById:a,emptyMessage:_="No activity yet.",listClassName:g,emptyClassName:u,endRef:l}){const b=k.useMemo(()=>A({activity:c,comments:m}),[c,m]);return t.jsxs("div",{className:[e.thread,g].filter(Boolean).join(" "),children:[b.length===0?t.jsx("div",{className:[e.empty,u].filter(Boolean).join(" "),children:_}):null,b.map(n=>{if(n.type==="comment"){const o=i({actorId:n.comment.author,actorType:n.comment.actor?.kind==="ai"?"ai":n.comment.actor?.kind==="human"?"human":null,actorProfile:n.comment.actor||null}),x=o.kind==="agent"?"agent":"member",{ActorIcon:f}=o,s=o.color,T=s&&v(s,.35)?{background:`linear-gradient(135deg, ${v(s,.18)} 0%, ${v(s,.1)} 100%)`,borderColor:v(s,.35)}:void 0;return t.jsxs("div",{className:[e.item,e.comment,x==="agent"?e.commentAgent:e.commentMember].join(" "),children:[t.jsxs("div",{className:e.header,children:[t.jsxs("span",{className:e.author,style:s?{color:s}:void 0,children:[t.jsx(f,{size:12,strokeWidth:1.5}),o.label]}),t.jsx("span",{className:e.time,children:N(n.comment.timestamp,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})})]}),t.jsx("div",{className:e.commentText,style:T,children:t.jsx(E,{onTaskIdClick:a,children:n.comment.text})})]},n.id)}const d=i({actorId:n.event.actor,actorType:n.event.actorType,actorProfile:n.event.actorProfile||null,fallbackKind:"system"}),{ActorIcon:C}=d,y=d.color,h=Object.entries(n.event.details?.changes||{}),p=I(n.event),j=h.length>1&&p?h.filter(([o])=>o!==p):h.length>1?h:[];return t.jsxs("div",{className:[e.item,e.event,d.kind==="system"?e.eventSystem:""].filter(Boolean).join(" "),children:[t.jsxs("div",{className:[e.header,e.eventHeader].join(" "),children:[t.jsxs("span",{className:e.author,style:y?{color:y}:void 0,children:[t.jsx(C,{size:12,strokeWidth:1.5}),d.label]}),t.jsx("span",{className:e.time,children:N(n.event.createdAt,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})})]}),t.jsxs("div",{className:e.eventText,children:[t.jsx("div",{children:S(n.event,r)}),j.length>0?t.jsx("div",{className:e.eventChanges,children:j.map(([o,x])=>t.jsx("div",{className:e.eventChange,children:M(o,x,r)},o))}):null]})]},n.id)}),t.jsx("div",{ref:l})]})}export{ee as EntityActivityTimeline};
@@ -1 +1 @@
1
- import{r as i,j as s}from"./vendor-react-CKJs5o3c.js";import{t as e}from"./index-607WPo_X.js";import{h as g,Z as v,b as j,m as f}from"./vendor-icons-B32hGuF2.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";function T({initiativeTemplates:n,onRefreshInitiativeTemplates:u,onCreateInitiativeFromTemplate:l}){const[a,o]=i.useState(""),[c,x]=i.useState(""),[d,m]=i.useState(!1),[r,p]=i.useState(null);return i.useEffect(()=>{if(!a&&n.length>0){const t=n[0];o(t.id)}},[n,a]),s.jsx("div",{className:`${e.standalonePage} ${e.standaloneContent}`,style:{overflow:"auto"},children:s.jsx("div",{className:e.settingsContent,style:{maxWidth:900,margin:"0 auto",width:"100%"},children:s.jsxs("div",{className:e.settingGroup,children:[s.jsxs("div",{className:e.settingTitleRow,children:[s.jsx("h2",{className:e.settingTitle,children:"Initiatives"}),s.jsx("button",{className:e.copyBtn,onClick:()=>{u?.()},children:"Refresh"})]}),s.jsx("p",{className:`${e.settingsHint} ${e.marginBottom12}`,children:"Create initiative-ready planning structures from reusable templates."}),s.jsxs("div",{className:e.exportItem,children:[s.jsx("label",{className:e.label,children:"Template"}),s.jsx("select",{className:e.input,value:a,onChange:t=>{const h=t.target.value;o(h)},children:n.map(t=>s.jsx("option",{value:t.id,children:t.name},t.id))})]}),s.jsxs("div",{className:`${e.exportItem} ${e.marginTop12}`,children:[s.jsx("label",{className:e.label,children:"Initiative Title"}),s.jsx("input",{className:e.input,placeholder:"e.g. Taskforce Private Beta Launch",value:c,onChange:t=>x(t.target.value)})]}),s.jsxs("button",{className:`${e.secondaryHeaderBtn} ${e.marginTop12}`,disabled:d||!a||!c.trim()||!l,onClick:async()=>{if(!l)return;m(!0);const t=await l({templateId:a,title:c.trim()});m(!1),p({type:t.success?"success":"error",message:t.success?"Initiative created from template.":t.error||"Failed to create initiative."})},children:[d?s.jsx(g,{size:14,className:e.spinner}):s.jsx(v,{size:14}),"Create Initiative"]}),r&&s.jsxs("div",{className:`${r.type==="success"?e.successMessage:e.errorMessage} ${e.marginTop12}`,children:[r.type==="success"?s.jsx(j,{size:14}):s.jsx(f,{size:14}),r.message]})]})})})}export{T as InitiativesModule};
1
+ import{r as i,j as s}from"./vendor-react-CKJs5o3c.js";import{t as e}from"./index-MAHKvFqp.js";import{h as g,Z as v,b as j,m as f}from"./vendor-icons-B32hGuF2.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";function T({initiativeTemplates:n,onRefreshInitiativeTemplates:u,onCreateInitiativeFromTemplate:l}){const[a,o]=i.useState(""),[c,x]=i.useState(""),[d,m]=i.useState(!1),[r,p]=i.useState(null);return i.useEffect(()=>{if(!a&&n.length>0){const t=n[0];o(t.id)}},[n,a]),s.jsx("div",{className:`${e.standalonePage} ${e.standaloneContent}`,style:{overflow:"auto"},children:s.jsx("div",{className:e.settingsContent,style:{maxWidth:900,margin:"0 auto",width:"100%"},children:s.jsxs("div",{className:e.settingGroup,children:[s.jsxs("div",{className:e.settingTitleRow,children:[s.jsx("h2",{className:e.settingTitle,children:"Initiatives"}),s.jsx("button",{className:e.copyBtn,onClick:()=>{u?.()},children:"Refresh"})]}),s.jsx("p",{className:`${e.settingsHint} ${e.marginBottom12}`,children:"Create initiative-ready planning structures from reusable templates."}),s.jsxs("div",{className:e.exportItem,children:[s.jsx("label",{className:e.label,children:"Template"}),s.jsx("select",{className:e.input,value:a,onChange:t=>{const h=t.target.value;o(h)},children:n.map(t=>s.jsx("option",{value:t.id,children:t.name},t.id))})]}),s.jsxs("div",{className:`${e.exportItem} ${e.marginTop12}`,children:[s.jsx("label",{className:e.label,children:"Initiative Title"}),s.jsx("input",{className:e.input,placeholder:"e.g. Taskforce Private Beta Launch",value:c,onChange:t=>x(t.target.value)})]}),s.jsxs("button",{className:`${e.secondaryHeaderBtn} ${e.marginTop12}`,disabled:d||!a||!c.trim()||!l,onClick:async()=>{if(!l)return;m(!0);const t=await l({templateId:a,title:c.trim()});m(!1),p({type:t.success?"success":"error",message:t.success?"Initiative created from template.":t.error||"Failed to create initiative."})},children:[d?s.jsx(g,{size:14,className:e.spinner}):s.jsx(v,{size:14}),"Create Initiative"]}),r&&s.jsxs("div",{className:`${r.type==="success"?e.successMessage:e.errorMessage} ${e.marginTop12}`,children:[r.type==="success"?s.jsx(j,{size:14}):s.jsx(f,{size:14}),r.message]})]})})})}export{T as InitiativesModule};
@@ -0,0 +1 @@
1
+ ._plansWrapper_1sfin_1{--plans-accent: var(--brand-primary, #6366f1);--plans-accent-strong: var(--brand-primary-strong, #7c3aed);--plans-accent-soft: var(--brand-primary-soft, rgba(99, 102, 241, .1));--plans-accent-border: var(--brand-primary-border, rgba(99, 102, 241, .24));--plans-surface: color-mix(in srgb, var(--surface-panel) 84%, var(--surface-page));--plans-surface-elevated: color-mix(in srgb, var(--surface-elevated) 88%, var(--surface-panel));--plans-surface-strong: color-mix(in srgb, var(--surface-page) 70%, var(--surface-panel));--plans-shadow: 0 22px 44px rgba(0, 0, 0, .18);overflow-y:auto;display:flex;flex-direction:column;align-items:stretch;align-self:stretch;width:100%;flex:1;min-height:100%;min-width:0;padding:64px 24px;box-sizing:border-box;scrollbar-gutter:stable}._contentFrame_1sfin_24{width:min(1100px,100%);max-width:1100px;margin:0 auto;display:flex;flex-direction:column}._shellOwnsScroll_1sfin_32{overflow:visible;min-height:100%;scrollbar-gutter:auto}._withChrome_1sfin_38{padding-top:32px}._siteVariant_1sfin_42{padding:56px 24px 80px;overflow:visible;scrollbar-gutter:auto}._siteVariant_1sfin_42._withChrome_1sfin_38{padding-top:14px}._siteVariant_1sfin_42 ._contentFrame_1sfin_24{max-width:1040px}._siteVariant_1sfin_42 ._title_1sfin_56{background:none;-webkit-text-fill-color:var(--text-0, var(--text-primary));color:var(--text-0, var(--text-primary));font-size:clamp(34px,6vw,58px);line-height:1.02;max-width:18ch;font-family:var(--font-brand);font-style:italic;text-transform:uppercase;letter-spacing:0;margin:0 auto}._siteVariant_1sfin_42 ._subtitle_1sfin_70{color:var(--text-1, #a6b3d9);font-size:clamp(16px,2.2vw,21px);max-width:60ch;margin:30px auto 0}._siteVariant_1sfin_42 ._header_1sfin_77{width:100%;max-width:1040px;border:0;border-radius:0;padding:62px 0 32px;background:transparent;box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none;text-align:center;margin-right:auto;margin-bottom:0;margin-left:auto}._siteVariant_1sfin_42 ._planCard_1sfin_92{background:#090e20b3;border-color:#cbd5ff33;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);border-radius:16px;padding:22px 20px}._siteVariant_1sfin_42 ._planCard_1sfin_92:hover{transform:translateY(-3px);box-shadow:none}._siteVariant_1sfin_42 ._grid_1sfin_105{max-width:1040px;margin-right:auto;margin-left:auto;gap:12px;grid-template-columns:repeat(3,minmax(0,1fr))}._siteVariant_1sfin_42 ._pricingNotes_1sfin_113{max-width:var(--section-text-width, 54rem);margin-top:18px}._siteVariant_1sfin_42 ._pricingNotes_1sfin_113 p{color:var(--text-1, #a6b3d9)}._siteVariant_1sfin_42 ._planName_1sfin_122{font-size:22px;font-family:var(--font-brand);font-style:italic;text-transform:uppercase}._siteVariant_1sfin_42 ._featureText_1sfin_129{color:#a6b3d9}._siteVariant_1sfin_42 ._currentBadge_1sfin_133{font-size:11px}._siteVariant_1sfin_42 ._navAction_1sfin_137,._siteVariant_1sfin_42 ._backBtn_1sfin_138{border:1px solid rgba(203,213,255,.2);background:#141d3c99;color:#f6f8ff}._siteVariant_1sfin_42 ._backBtn_1sfin_138:hover,._siteVariant_1sfin_42 ._navAction_1sfin_137:hover{background:#141d3cd9}._siteVariant_1sfin_42 ._priceRows_1sfin_149{border-top-color:#cbd5ff33}._siteVariant_1sfin_42 ._foundingBeta_1sfin_153{max-width:var(--section-text-width, 54rem);margin:0 auto 22px;padding:0 0 34px}._siteVariant_1sfin_42 ._foundingBeta_1sfin_153 h2{max-width:var(--section-text-width, 54rem);margin:0 auto;font-size:28px}._siteVariant_1sfin_42 ._foundingBeta_1sfin_153 p{max-width:var(--section-text-width, 54rem);margin:var(--section-copy-gap, 16px) auto 0;color:var(--text-1, #a6b3d9);line-height:1.5}._siteVariant_1sfin_42 ._cloudCapacityNote_1sfin_172{margin:8px auto 12px;padding:0}._siteVariant_1sfin_42 ._cloudCapacityNote_1sfin_172 p{margin-top:12px}[data-theme=light] ._siteVariant_1sfin_42 ._subtitle_1sfin_70{color:var(--text-1, var(--text-secondary))}[data-theme=light] ._siteVariant_1sfin_42 ._featureText_1sfin_129{color:var(--text-secondary)}[data-theme=light] ._siteVariant_1sfin_42 ._header_1sfin_77{background:transparent}[data-theme=light] ._siteVariant_1sfin_42 ._foundingBeta_1sfin_153 p{color:var(--text-1, var(--text-secondary))}[data-theme=light] ._siteVariant_1sfin_42 ._planCard_1sfin_92{background:#ffffffe0;border-color:#1c2a482e}[data-theme=light] ._siteVariant_1sfin_42 ._planCard_1sfin_92:hover{box-shadow:0 18px 38px #0f172a1a}[data-theme=light] ._siteVariant_1sfin_42 ._navAction_1sfin_137,[data-theme=light] ._siteVariant_1sfin_42 ._backBtn_1sfin_138{border-color:#1c2a482e;background:#ffffffb8;color:var(--text-primary)}[data-theme=light] ._siteVariant_1sfin_42 ._backBtn_1sfin_138:hover,[data-theme=light] ._siteVariant_1sfin_42 ._navAction_1sfin_137:hover{background:#fffffff0}[data-theme=light] ._siteVariant_1sfin_42 ._priceRows_1sfin_149{border-top-color:#1c2a482e}._header_1sfin_77{width:100%;text-align:left;margin-bottom:32px;padding:32px;border-radius:28px;border:1px solid var(--border-default);background:linear-gradient(180deg,color-mix(in srgb,var(--plans-surface-elevated) 92%,transparent),color-mix(in srgb,var(--plans-surface) 96%,transparent)),var(--plans-surface);box-shadow:var(--plans-shadow)}._headerBar_1sfin_235{width:100%;display:flex;justify-content:space-between;align-items:center;gap:16px;margin-bottom:24px}._headerActions_1sfin_244{display:flex;align-items:center;justify-content:flex-end;gap:12px;flex-wrap:wrap}._title_1sfin_56{font-size:clamp(38px,5vw,54px);font-weight:800;font-family:var(--font-brand);font-style:italic;text-transform:uppercase;margin-bottom:16px;background:linear-gradient(135deg,var(--text-primary),color-mix(in srgb,var(--plans-accent) 72%,var(--text-primary)));background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;letter-spacing:-.04em;line-height:.98}._subtitle_1sfin_70{font-size:18px;color:var(--text-secondary);line-height:1.7}._subtitle_1sfin_70 p{margin:0 0 12px}._subtitle_1sfin_70 p:last-child{margin-bottom:0}._subtitle_1sfin_70 a{color:var(--plans-accent);text-decoration:underline;text-underline-offset:3px}._subtitle_1sfin_70 ul,._subtitle_1sfin_70 ol{display:inline-block;margin:8px auto 0;padding-left:22px;text-align:left}._debugMeta_1sfin_295{margin-top:16px;font-size:13px;color:var(--text-secondary);opacity:.8}._foundingBeta_1sfin_153{width:100%;max-width:920px;margin:0 auto 28px;text-align:center}._foundingBeta_1sfin_153 h2{margin:0 0 10px;color:var(--text-primary);font-size:22px;font-weight:800}._foundingBeta_1sfin_153 p{margin:0;color:var(--text-secondary);font-size:16px;line-height:1.7}._cloudCapacityNote_1sfin_172{margin:8px auto 12px}._grid_1sfin_105{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:20px;width:100%}._pricingNotes_1sfin_113{width:100%;max-width:920px;margin:18px auto 0;text-align:center}._pricingNotes_1sfin_113 p{margin:4px 0 0;color:var(--text-secondary);font-size:14px;line-height:1.55}._planNoticeCard_1sfin_348{width:100%;margin-top:20px;text-align:center}._planNoticeCard_1sfin_348 ._planName_1sfin_122{margin-top:0;margin-bottom:8px}._planNoticeCard_1sfin_348 ._planDescription_1sfin_359{margin:0;max-width:none}._teamComingSoonCard_1sfin_364{margin-bottom:24px}._planCard_1sfin_92{background:linear-gradient(180deg,color-mix(in srgb,var(--plans-surface-elevated) 90%,transparent),color-mix(in srgb,var(--plans-surface) 96%,transparent)),var(--plans-surface);border:1px solid var(--border-default);border-radius:22px;padding:28px;display:flex;flex-direction:column;position:relative;overflow:hidden;box-shadow:0 12px 28px #0000001f;transition:transform .24s ease,box-shadow .24s ease,border-color .24s ease,background .24s ease}._clickablePlanCard_1sfin_383{cursor:pointer}._clickablePlanCard_1sfin_383:focus-visible{outline:2px solid var(--plans-accent);outline-offset:4px}._planCard_1sfin_92:hover{transform:translateY(-4px);border-color:var(--plans-accent-border);box-shadow:0 20px 36px #0000002e}._activePlanCard_1sfin_398{border:1px solid color-mix(in srgb,var(--plans-accent) 38%,var(--border-default));background:linear-gradient(180deg,color-mix(in srgb,var(--plans-accent) 10%,var(--plans-surface-elevated)),color-mix(in srgb,var(--plans-accent) 4%,var(--plans-surface))),var(--plans-surface);box-shadow:0 18px 34px #0000002e,inset 0 0 0 1px color-mix(in srgb,var(--plans-accent) 16%,transparent)}._currentBadge_1sfin_133{position:absolute;top:20px;right:20px;background:color-mix(in srgb,var(--plans-accent) 16%,var(--surface-page));color:var(--plans-accent-strong);font-size:12px;font-weight:700;padding:6px 12px;border-radius:999px;border:1px solid color-mix(in srgb,var(--plans-accent) 26%,transparent);text-transform:uppercase;letter-spacing:.08em}._planName_1sfin_122{font-size:28px;font-weight:700;font-family:var(--font-brand);font-style:italic;text-transform:uppercase;color:var(--text-primary);margin-bottom:12px}._planDescription_1sfin_359{margin:0 0 18px;color:var(--text-secondary);font-size:15px;line-height:1.45;max-width:34ch}._priceDisplay_1sfin_441{margin-bottom:32px;display:flex;align-items:baseline;gap:8px}._priceAmount_1sfin_448{font-size:56px;font-weight:800;color:var(--text-primary);letter-spacing:-2px;line-height:1}._priceInterval_1sfin_456{font-size:16px;color:var(--text-secondary);font-weight:500}._callToAction_1sfin_462{width:100%;padding:14px 18px;border-radius:12px;font-size:15px;font-weight:600;border:1px solid transparent;cursor:pointer;transition:all .2s ease;margin-bottom:0}._primaryCta_1sfin_474{background:var(--button-primary-bg);border-color:var(--button-primary-border);color:var(--button-primary-text, white)}._primaryCta_1sfin_474:hover{transform:translateY(-1px);box-shadow:0 10px 22px var(--brand-primary-glow)}._secondaryCta_1sfin_485{background:var(--button-secondary-bg);color:var(--button-secondary-text);border-color:var(--button-secondary-border)}._secondaryCta_1sfin_485:hover{background:var(--button-secondary-hover-bg);border-color:var(--button-secondary-hover-border);color:var(--button-secondary-hover-text)}._currentCta_1sfin_497{background:color-mix(in srgb,var(--plans-accent) 9%,var(--plans-surface-strong));color:var(--text-primary);border-color:color-mix(in srgb,var(--plans-accent) 24%,var(--border-default));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--plans-accent) 10%,transparent);cursor:pointer}._currentCta_1sfin_497:hover{background:color-mix(in srgb,var(--plans-accent) 14%,var(--plans-surface-strong));border-color:color-mix(in srgb,var(--plans-accent) 32%,var(--border-default));transform:translateY(-1px)}._featuresList_1sfin_511{flex:1;display:flex;flex-direction:column;gap:20px;margin-bottom:28px}._priceRows_1sfin_149{display:flex;flex-direction:column;gap:8px;margin:0 0 16px}._priceRow_1sfin_149{display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-start;gap:10px;text-align:left}._regularPriceLine_1sfin_535,._campaignPriceLine_1sfin_536{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}._priceRowWithCampaign_1sfin_543{gap:4px}._priceRowAmount_1sfin_547{font-size:22px;font-weight:700;color:var(--text-primary)}._regularPriceDiscounted_1sfin_553{color:var(--text-secondary);text-decoration:line-through;text-decoration-thickness:2px}._priceRowInterval_1sfin_559{color:var(--text-secondary);font-weight:600}._campaignPriceLine_1sfin_536{color:var(--plans-accent-strong)}._campaignPriceLabel_1sfin_568{font-size:14px;font-weight:800}._campaignPriceAmount_1sfin_573{color:var(--text-primary);font-size:24px;font-weight:800}._campaignPriceInterval_1sfin_579{color:var(--text-secondary);font-weight:700}._ctaRow_1sfin_584{display:grid;grid-template-columns:1fr;gap:10px}._featureItem_1sfin_590{display:flex;align-items:flex-start;gap:16px}._featureIcon_1sfin_596{color:var(--plans-accent);flex-shrink:0;width:20px;height:20px;margin-top:2px}._featureText_1sfin_129{font-size:16px;line-height:1.5;color:var(--text-primary)}._featureLimitAccent_1sfin_610{font-family:var(--font-brand);font-style:italic;color:var(--brand-cloud-accent, #ff8a00);letter-spacing:.01em;font-size:28px;line-height:.92;display:inline-block;margin-right:6px}._featureLimitUnit_1sfin_621{font-size:.74em;line-height:1;vertical-align:baseline}._featureTextBlock_1sfin_627{display:flex;flex-direction:column;gap:4px}._featureDescription_1sfin_633{font-size:13px;line-height:1.45;color:var(--text-secondary)}._emptyState_1sfin_639{text-align:center;padding:64px;background:var(--bg-secondary);border-radius:24px;border:1px dashed var(--border-color, var(--border-primary, rgba(255, 255, 255, .14)));width:100%}._marketingEmptyState_1sfin_648{max-width:920px;border-style:solid;border-radius:28px;padding:72px 48px;background:radial-gradient(560px 260px at 15% 10%,rgba(34,197,94,.15),transparent 60%),radial-gradient(620px 320px at 85% 0%,rgba(251,191,36,.16),transparent 62%),linear-gradient(145deg,#0f172af5,#111827eb);box-shadow:0 28px 90px #00000047}._marketingEmptyState_1sfin_648 h2{margin:18px 0 14px;font-size:clamp(32px,4vw,52px);line-height:1.02;letter-spacing:-.04em;color:#f8fafc}._marketingEmptyState_1sfin_648 p{margin:0 auto;max-width:680px;font-size:18px;line-height:1.7;color:#cbd5e1}._emptyBadge_1sfin_676{display:inline-flex;align-items:center;justify-content:center;padding:8px 16px;border-radius:999px;background:#f8fafc14;border:1px solid rgba(248,250,252,.18);color:#f8fafc;font-size:12px;font-weight:800;letter-spacing:.14em;text-transform:uppercase}._emptyHighlights_1sfin_691{display:flex;flex-wrap:wrap;justify-content:center;gap:12px;margin-top:28px}._emptyHighlights_1sfin_691 span{display:inline-flex;align-items:center;gap:8px;padding:10px 14px;border-radius:999px;background:#94a3b81f;border:1px solid rgba(148,163,184,.18);color:#e2e8f0;font-size:13px;font-weight:700;letter-spacing:.02em}._loader_1sfin_713{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:50vh;gap:24px;color:var(--text-secondary)}._spinner_1sfin_723{animation:_spin_1sfin_723 1s linear infinite;color:var(--accent-primary, #6366f1)}@keyframes _spin_1sfin_723{0%{transform:rotate(0)}to{transform:rotate(360deg)}}._backBtn_1sfin_138{background:var(--button-secondary-bg);border:1px solid var(--button-secondary-border);color:var(--button-secondary-text);display:flex;align-items:center;gap:8px;font-size:14px;font-weight:600;cursor:pointer;padding:10px 16px;border-radius:12px;transition:all .2s ease}._backBtn_1sfin_138:hover{background:var(--button-secondary-hover-bg);border-color:var(--button-secondary-hover-border);color:var(--button-secondary-hover-text)}._navAction_1sfin_137{background:var(--button-secondary-bg);border:1px solid var(--button-secondary-border);color:var(--button-secondary-text);padding:10px 20px;border-radius:12px;font-weight:600;cursor:pointer;transition:all .2s ease}._navAction_1sfin_137:hover{background:var(--button-secondary-hover-bg);border-color:var(--button-secondary-hover-border);color:var(--button-secondary-hover-text)}._statusBanner_1sfin_776{margin-top:24px;padding:12px 24px;border-radius:12px;font-weight:500;font-size:14px}._successBanner_1sfin_784{background:color-mix(in srgb,var(--status-success) 12%,var(--plans-surface-elevated));color:var(--status-success);border:1px solid color-mix(in srgb,var(--status-success) 24%,transparent)}._infoBanner_1sfin_790{background:color-mix(in srgb,var(--button-primary-bg) 10%,var(--plans-surface-elevated));color:var(--text-secondary);border:1px solid color-mix(in srgb,var(--button-primary-bg) 18%,transparent)}._errorBanner_1sfin_796{background:color-mix(in srgb,var(--status-error) 12%,var(--plans-surface-elevated));color:var(--status-error);border:1px solid color-mix(in srgb,var(--status-error) 24%,transparent)}@media(max-width:768px){._plansWrapper_1sfin_1{padding:28px 14px}._withChrome_1sfin_38{padding-top:24px}._header_1sfin_77{margin-bottom:24px;padding:22px 18px}._headerBar_1sfin_235{gap:10px;flex-wrap:wrap;margin-bottom:18px}._title_1sfin_56{font-size:34px;margin-bottom:12px}._grid_1sfin_105{grid-template-columns:1fr;gap:18px}._siteVariant_1sfin_42 ._grid_1sfin_105{grid-template-columns:1fr}._siteVariant_1sfin_42{padding:56px 24px 80px}._siteVariant_1sfin_42._withChrome_1sfin_38{padding-top:14px}._siteVariant_1sfin_42 ._header_1sfin_77{padding:62px 0 32px}._planCard_1sfin_92{padding:22px}._planNoticeCard_1sfin_348{margin-top:18px}._teamComingSoonCard_1sfin_364{margin-bottom:18px}._marketingEmptyState_1sfin_648{padding:56px 24px}._marketingEmptyState_1sfin_648 h2{font-size:34px}._marketingEmptyState_1sfin_648 p{font-size:16px}._headerActions_1sfin_244{width:100%;justify-content:flex-start}}
@@ -0,0 +1 @@
1
+ import{r as s,j as e}from"./vendor-react-CKJs5o3c.js";import{H as ye,t as Oe,J as Ve,K as Pe,L as ge,N as he,O as Ke,Q as He}from"./index-MAHKvFqp.js";import{aI as ze,h as Ye,U as We}from"./vendor-icons-B32hGuF2.js";import{u as qe,a as Ge}from"./vendor-router-BbWMxlnO.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";const Qe="_plansWrapper_1sfin_1",Je="_contentFrame_1sfin_24",Xe="_shellOwnsScroll_1sfin_32",Ze="_withChrome_1sfin_38",en="_siteVariant_1sfin_42",nn="_title_1sfin_56",tn="_subtitle_1sfin_70",rn="_header_1sfin_77",an="_planCard_1sfin_92",sn="_grid_1sfin_105",cn="_pricingNotes_1sfin_113",on="_planName_1sfin_122",ln="_featureText_1sfin_129",un="_currentBadge_1sfin_133",dn="_navAction_1sfin_137",mn="_backBtn_1sfin_138",pn="_priceRows_1sfin_149",fn="_foundingBeta_1sfin_153",gn="_cloudCapacityNote_1sfin_172",hn="_headerBar_1sfin_235",yn="_headerActions_1sfin_244",_n="_debugMeta_1sfin_295",Cn="_planNoticeCard_1sfin_348",bn="_planDescription_1sfin_359",Sn="_teamComingSoonCard_1sfin_364",wn="_clickablePlanCard_1sfin_383",vn="_activePlanCard_1sfin_398",xn="_callToAction_1sfin_462",Nn="_primaryCta_1sfin_474",kn="_secondaryCta_1sfin_485",Pn="_currentCta_1sfin_497",In="_featuresList_1sfin_511",An="_priceRow_1sfin_149",jn="_regularPriceLine_1sfin_535",Tn="_campaignPriceLine_1sfin_536",Ln="_priceRowWithCampaign_1sfin_543",Rn="_priceRowAmount_1sfin_547",En="_regularPriceDiscounted_1sfin_553",Bn="_priceRowInterval_1sfin_559",$n="_campaignPriceLabel_1sfin_568",Mn="_campaignPriceAmount_1sfin_573",Un="_campaignPriceInterval_1sfin_579",Dn="_ctaRow_1sfin_584",Fn="_featureItem_1sfin_590",On="_featureIcon_1sfin_596",Vn="_featureLimitAccent_1sfin_610",Kn="_featureLimitUnit_1sfin_621",Hn="_featureTextBlock_1sfin_627",zn="_featureDescription_1sfin_633",Yn="_emptyState_1sfin_639",Wn="_marketingEmptyState_1sfin_648",qn="_emptyBadge_1sfin_676",Gn="_emptyHighlights_1sfin_691",Qn="_loader_1sfin_713",Jn="_spinner_1sfin_723",Xn="_statusBanner_1sfin_776",Zn="_successBanner_1sfin_784",et="_infoBanner_1sfin_790",nt="_errorBanner_1sfin_796",r={plansWrapper:Qe,contentFrame:Je,shellOwnsScroll:Xe,withChrome:Ze,siteVariant:en,title:nn,subtitle:tn,header:rn,planCard:an,grid:sn,pricingNotes:cn,planName:on,featureText:ln,currentBadge:un,navAction:dn,backBtn:mn,priceRows:pn,foundingBeta:fn,cloudCapacityNote:gn,headerBar:hn,headerActions:yn,debugMeta:_n,planNoticeCard:Cn,planDescription:bn,teamComingSoonCard:Sn,clickablePlanCard:wn,activePlanCard:vn,callToAction:xn,primaryCta:Nn,secondaryCta:kn,currentCta:Pn,featuresList:In,priceRow:An,regularPriceLine:jn,campaignPriceLine:Tn,priceRowWithCampaign:Ln,priceRowAmount:Rn,regularPriceDiscounted:En,priceRowInterval:Bn,campaignPriceLabel:$n,campaignPriceAmount:Mn,campaignPriceInterval:Un,ctaRow:Dn,featureItem:Fn,featureIcon:On,featureLimitAccent:Vn,featureLimitUnit:Kn,featureTextBlock:Hn,featureDescription:zn,emptyState:Yn,marketingEmptyState:Wn,emptyBadge:qn,emptyHighlights:Gn,loader:Qn,spinner:Jn,statusBanner:Xn,successBanner:Zn,infoBanner:et,errorBanner:nt};function tt(){const n=globalThis.__DEBUG_MODE__;return typeof n=="boolean"?n:!1}function rt(n){const i=String(n?.environment||"").trim(),o=String(n?.runtimeMode||"").trim();return!i&&!o?null:i&&o?`${i} (${o})`:i||o||null}const it=new Set(["a","b","br","em","i","li","ol","p","strong","u","ul"]);function at(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function st(n){const i=String(n||"").trim();if(!i)return"";if(typeof document>"u")return at(i);const o=document.createElement("template");o.innerHTML=i;const p=document.createElement("div"),l=C=>{if(C.nodeType===Node.TEXT_NODE)return document.createTextNode(C.textContent||"");if(C.nodeType!==Node.ELEMENT_NODE)return null;const E=C,I=E.tagName.toLowerCase();if(I==="script"||I==="style")return null;const $=Array.from(E.childNodes).map(l).filter(h=>!!h);if(!it.has(I)){const h=document.createDocumentFragment();for(const q of $)h.appendChild(q);return h}const x=document.createElement(I);if(I==="a"){const h=String(E.getAttribute("href")||"").trim();/^(https?:|mailto:|\/|#)/i.test(h)&&(x.setAttribute("href",h),x.setAttribute("rel","noopener noreferrer"))}for(const h of $)x.appendChild(h);return x};for(const C of Array.from(o.content.childNodes)){const E=l(C);E&&p.appendChild(E)}return p.innerHTML}function ct(n,i){if(n==null||!i)return"Contact Sales";try{return new Intl.NumberFormat("en-US",{style:"currency",currency:i.toUpperCase(),minimumFractionDigits:0}).format(n/100)}catch{return`${i.toUpperCase()} ${n/100}`}}function ot(){return"$0"}function V(n){return n?n.pricingType==="free"?!0:n.unitAmount!=null&&n.currency!=null:!1}function Te(n){return n?n.pricingType==="free"?ot():ct(n.unitAmount,n.currency):"Unavailable"}function Le(n,i){return V(i)?{price:i,pricingAudience:"campaign"}:{price:n,pricingAudience:"public"}}function lt(n,i,o,p){const l=V(n)||V(o),C=V(i)||V(p);if(!l&&!C)return null;const E=(I,$,x)=>{if(!V(I)&&!V($))return null;const h=V($),q=x==="year"?"year":"month";return e.jsxs("div",{className:`${r.priceRow} ${h?r.priceRowWithCampaign:""}`,children:[V(I)?e.jsxs("div",{className:r.regularPriceLine,children:[e.jsx("span",{className:`${r.priceRowAmount} ${h?r.regularPriceDiscounted:""}`,children:Te(I)}),e.jsxs("span",{className:r.priceRowInterval,children:["/ ",q]})]}):null,h?e.jsxs("div",{className:r.campaignPriceLine,children:[e.jsx("span",{className:r.campaignPriceLabel,children:"Founding Offer:"}),e.jsx("span",{className:r.campaignPriceAmount,children:Te($)}),e.jsxs("span",{className:r.campaignPriceInterval,children:["/ ",q]})]}):null]},x)};return e.jsxs("div",{className:r.priceRows,children:[E(n,o,"month"),E(i,p,"year")]})}function Re(n){const i=[n.pricing.month,n.pricing.year].filter(Boolean);if(i.some(p=>p.pricingType==="free"))return 0;const o=i.map(p=>p.pricingType==="stripe"&&typeof p.unitAmount=="number"?p.unitAmount:null).filter(p=>p!=null);return o.length>0?Math.min(...o):Number.POSITIVE_INFINITY}function ut(n){return String(n||"").replace(/[_\-.]+/g," ").replace(/\b\w/g,i=>i.toUpperCase())}function Ie(n,i){const o=n?.[i],p=Number(o);return Number.isFinite(p)?Math.max(1,Math.floor(p)):null}function ve(n,i){return i!==1?n:n.replace(/\b([A-Za-z]+)ies\b$/,"$1y").replace(/\b([A-Za-z]+[^s\s])s\b$/,"$1")}function dt(n){return n<=1e3?{value:String(n),unit:"MB"}:{value:String(Math.round(n/1e3)),unit:"GB"}}function mt(n,i){const o=String(n.publicLabel||n.label||"").trim()||ut(n.featureKey),p=n.config&&typeof n.config=="object"?n.config:{};if(n.featureKey==="context.uploads"){const l=Ie(p,"storageLimitMb");if(l!==null){const C=dt(l);return{limitValue:C.value,limitUnit:C.unit,baseLabel:ve(o,l)}}}if(n.featureKey==="workspace.workspaces"){const l=Ie(p,"maxWorkspaces");if(l!==null)return{limitValue:String(l),limitUnit:null,baseLabel:ve(o,l)}}if(n.featureKey==="collaboration.ai_profiles"){const l=Ie(p,"maxAiProfiles");if(l!==null)return{limitValue:String(l),limitUnit:null,baseLabel:ve(o,l)}}if(n.featureKey==="collaboration.team_management"){const l=Number(i);if(Number.isFinite(l)&&l>0){const C=Math.floor(l);return{limitValue:String(C),limitUnit:null,baseLabel:ve(o,C)}}}return{limitValue:null,limitUnit:null,baseLabel:o}}function pt({heading:n,subtitle:i,variant:o="app",theme:p="dark",chrome:l,footer:C,isAuthenticated:E,authSessionResolved:I=!0,currentPlanId:$,currentPlanVersionId:x,currentEntitlementState:h,markCurrentPlan:q,canManageCurrentPlan:G=!0,pricingEndpoint:A,statusBanner:H,onBack:j,backLabel:T,backDisabled:M=!1,topActions:se,shellOwnsScroll:_e=!1,showPageBackButton:X=!0,showHeaderBarWithChrome:re=!1,preferPricingPageTitle:Ce=!0,currentPlanCardActionMode:be="manage",fallbackPricingSource:g=null,onSelectPlan:z}){const[Z,Q]=s.useState([]),[ce,F]=s.useState(null),[N,L]=s.useState({pageTitle:null,pageDescription:null}),[oe,Y]=s.useState(!0),[le,ue]=s.useState(null),[Se,ee]=s.useState(0);s.useEffect(()=>{let a=!0;return(async()=>{const D=String(A||"/api/taskforce/public/pricing").trim()||"/api/taskforce/public/pricing";a&&(Y(!0),ue(null));try{const v=await fetch(D,{method:"GET",credentials:"include"}),u=await v.json().catch(()=>({}));if(v.ok){a&&(Q(Array.isArray(u?.plans)?u.plans:[]),F(u?.pricingSource&&typeof u.pricingSource=="object"?u.pricingSource:null),L({pageTitle:typeof u?.pageTitle=="string"&&u.pageTitle.trim()||null,pageDescription:typeof u?.pageDescription=="string"&&u.pageDescription.trim()||null}));return}throw new Error(String(u?.error||`Failed to load pricing (${v.status})`))}catch(v){if(a){const u=v instanceof Error?v.message:"Failed to load pricing";ue(u||"Failed to load pricing"),F(null),L({pageTitle:null,pageDescription:null})}}finally{a&&Y(!1)}})(),()=>{a=!1}},[A,Se]);const J=s.useMemo(()=>[...Z].sort((a,U)=>{const D=Re(a),v=Re(U);if(D!==v)return D-v;const u=a.defaultVersion?.versionNumber||0,O=U.defaultVersion?.versionNumber||0;return u!==O?u-O:String(a.displayName||a.planId).localeCompare(String(U.displayName||U.planId))}),[Z]),de=s.useMemo(()=>rt(ce||g),[g,ce]),xe=String((Ce?N.pageTitle:null)||n).trim()||n,me=String(N.pageDescription||i||"").trim(),w=s.useMemo(()=>st(me),[me]),ne=I,pe=`${r.plansWrapper} ${_e?r.shellOwnsScroll:"tf-scrollbar"} ${o==="site"?r.siteVariant:""} ${l?r.withChrome:""}`.trim(),B=a=>_e?e.jsxs(e.Fragment,{children:[l,a,C]}):e.jsxs("div",{className:Oe.standaloneWrapper,"data-theme":p,children:[l,a,C]});return B(oe?e.jsx(e.Fragment,{children:e.jsx("div",{className:pe,children:e.jsx("div",{className:r.contentFrame,children:e.jsxs("div",{className:r.loader,children:[e.jsx(Ye,{size:48,className:r.spinner}),e.jsx("p",{children:"Loading plans..."})]})})})}):le?e.jsx(e.Fragment,{children:e.jsx("div",{className:pe,children:e.jsx("div",{className:r.contentFrame,children:e.jsxs("div",{className:r.emptyState,children:[e.jsx("h2",{children:"Connecting to plan pricing..."}),e.jsx("p",{children:le}),e.jsx("button",{className:r.backBtn,onClick:()=>ee(a=>a+1),children:"Retry"})]})})})}):e.jsx(e.Fragment,{children:e.jsx("div",{className:pe,children:e.jsxs("div",{className:r.contentFrame,children:[e.jsxs("div",{className:r.header,children:[(!l||re)&&(X||se)&&e.jsxs("div",{className:r.headerBar,children:[e.jsx("div",{children:X?e.jsx("button",{className:r.backBtn,onClick:j,disabled:M,children:T}):null}),e.jsx("div",{className:r.headerActions,children:se})]}),e.jsx("h1",{className:r.title,children:xe}),w&&e.jsx("div",{className:r.subtitle,dangerouslySetInnerHTML:{__html:w}}),tt()&&de?e.jsxs("p",{className:r.debugMeta,children:["Pricing source: ",de]}):null,H&&e.jsx("div",{className:`${r.statusBanner} ${H.type==="success"?r.successBanner:H.type==="info"?r.infoBanner:r.errorBanner}`,children:H.message})]}),e.jsxs("section",{className:r.foundingBeta,"aria-labelledby":"founding-beta-heading",children:[e.jsx("h2",{id:"founding-beta-heading",children:"Founding beta"}),e.jsx("p",{children:"Taskforce is in founding beta. You may run into rough edges while we improve cloud workspaces and agent workflows. Early members get access while the product is still forming, plus a direct role in shaping what comes next."})]}),J.length===0?e.jsxs("div",{className:`${r.emptyState} ${r.marketingEmptyState}`,children:[e.jsx("span",{className:r.emptyBadge,children:"Coming Soon"}),e.jsx("h2",{children:"Paid plans are getting their final polish."}),e.jsx("p",{children:"Taskforce pricing is on the way with flexible options for solo operators, teams, and larger rollouts. Check back soon for launch tiers, feature bundles, and early access details."}),e.jsxs("div",{className:r.emptyHighlights,"aria-label":"Upcoming pricing highlights",children:[e.jsx("span",{children:"Launch-ready tiers"}),e.jsx("span",{children:"Team billing controls"}),e.jsx("span",{children:"Feature-based packaging"})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:r.grid,children:J.map(a=>{const U=a.pricing.month,D=a.pricing.year,v=a.campaignPricing?.month||null,u=a.campaignPricing?.year||null,O=Le(U,v),K=Le(D,u),W=V(O.price),ie=V(K.price),ae=W&&ie,k=String(a.defaultVersion?.planVersionId||"").trim(),Ne=ye(h),fe=q??Ne,ke=!!(k&&x&&x===k)||!!(!x&&($&&$===a.planId)),te=fe&&ke&&h!=="canceled",t=W?"month":ie?"year":null,c=t==="year"?K:O,_=be==="manage",f=be==="indicator",y=ne&&!!k&&(te?_&&G:!!t),m=()=>{if(k){if(te){if(!_||!G)return;z({planId:a.planId,planVersionId:k,interval:t||"month",pricingType:c.price?.pricingType||"stripe",pricingAudience:c.pricingAudience,isCurrentPlan:!0});return}t&&z({planId:a.planId,planVersionId:k,interval:t,pricingType:c.price?.pricingType||"stripe",pricingAudience:c.pricingAudience,isCurrentPlan:!1})}};return e.jsxs("div",{className:`${r.planCard} ${te?r.activePlanCard:""} ${y?r.clickablePlanCard:""}`,"data-testid":`plan-card-${a.planId}`,role:y?"button":void 0,tabIndex:y?0:void 0,onClick:y?m:void 0,onKeyDown:y?d=>{(d.key==="Enter"||d.key===" ")&&(d.preventDefault(),m())}:void 0,children:[te&&e.jsx("span",{className:r.currentBadge,children:"Current Plan"}),e.jsx("h3",{className:r.planName,children:a.displayName}),lt(U,D,v,u),String(a.description||"").trim()&&e.jsx("p",{className:r.planDescription,children:String(a.description||"").trim()}),e.jsx("div",{className:r.featuresList,children:Array.isArray(a.features)&&a.features.length>0?a.features.map((d,S)=>e.jsxs("div",{className:r.featureItem,children:[e.jsx(ze,{className:r.featureIcon}),e.jsxs("div",{className:r.featureTextBlock,children:[(()=>{const{limitValue:P,limitUnit:b,baseLabel:R}=mt(d,a.defaultVersion?.seatLimit);return e.jsxs("span",{className:r.featureText,children:[P&&e.jsxs("span",{className:r.featureLimitAccent,children:[e.jsx("span",{children:P}),b?e.jsx("span",{className:r.featureLimitUnit,children:b}):null]}),e.jsx("span",{children:P?` ${R}`:R})]})})(),d.publicDescriptionVisible!==!1&&String(d.publicDescription||d.description||"").trim()&&e.jsx("span",{className:r.featureDescription,children:String(d.publicDescription||d.description||"").trim()})]})]},`${d.featureKey}-${S}`)):e.jsx("span",{className:r.featureText,children:"No additional features included"})}),te?_?e.jsx("button",{className:`${r.callToAction} ${r.currentCta}`,"data-testid":`plan-manage-${a.planId}`,onClick:d=>{d.stopPropagation(),G&&z({planId:a.planId,planVersionId:k,interval:t||"month",pricingType:c.price?.pricingType||"stripe",pricingAudience:c.pricingAudience,isCurrentPlan:!0})},disabled:!k||!G||!ne,children:E&&G?"Manage Plan":"Current Plan"}):f?e.jsx("button",{className:`${r.callToAction} ${r.currentCta}`,"data-testid":`plan-current-${a.planId}`,disabled:!0,children:"Current Plan"}):null:e.jsxs("div",{className:r.ctaRow,children:[W?e.jsx("button",{className:`${r.callToAction} ${r.secondaryCta}`,"data-testid":`plan-select-${a.planId}-month`,onClick:d=>{d.stopPropagation(),z({planId:a.planId,planVersionId:k,interval:"month",pricingType:O.price?.pricingType||"stripe",pricingAudience:O.pricingAudience,isCurrentPlan:!1})},disabled:!k||!ne,children:ae?"Start Monthly":"Get Started"}):null,ie?e.jsx("button",{className:`${r.callToAction} ${r.primaryCta}`,"data-testid":`plan-select-${a.planId}-year`,onClick:d=>{d.stopPropagation(),z({planId:a.planId,planVersionId:k,interval:"year",pricingType:K.price?.pricingType||"stripe",pricingAudience:K.pricingAudience,isCurrentPlan:!1})},disabled:!k||!ne,children:ae?"Start Yearly":"Get Started"}):null]})]},a.planId)})}),e.jsxs("div",{className:r.pricingNotes,children:[e.jsx("p",{children:"Prices are listed in USD. Taxes may apply."}),e.jsx("p",{children:"Local install is free on every plan. Cloud limits apply only to hosted workspaces."})]}),e.jsxs("section",{className:`${r.foundingBeta} ${r.cloudCapacityNote}`,"aria-labelledby":"cloud-capacity-heading",children:[e.jsx("h2",{id:"cloud-capacity-heading",children:"Need more cloud capacity?"}),e.jsx("p",{children:"Pro users can request expanded limits for cloud workspaces, AI agents, and storage."})]}),e.jsxs("div",{className:`${r.planCard} ${r.planNoticeCard} ${r.teamComingSoonCard}`,children:[e.jsx("h2",{className:r.planName,children:"Team workspaces are coming soon."}),e.jsx("p",{className:r.planDescription,children:"Shared workspaces, collaborators, team agent rosters, admin controls, and larger cloud limits are in development."})]})]})]})})}))}const ft=1600,Ee=[0,500,1e3,2e3],gt=5e3,ht=45e3,yt="Choose a plan to continue.";function _t(n,i){if(n===401)return!0;const o=String(i||"").trim().toUpperCase();return o==="CHECKOUT_SESSION_INCOMPLETE"||o==="CHECKOUT_PLAN_VERSION_UNRESOLVED"}function Ct(n){return n==="year"?"year":"month"}function bt(n){return n==="campaign"?"campaign":"public"}function Ae(n){const i=String(n||"").trim().toLowerCase();return i==="year"?"year":i==="month"?"month":null}function Be(n){const i=String(n||"").trim();return i?i.replace(/\/+$/,""):""}function je(n={}){const i=new URLSearchParams;i.set("screen","plans");for(const[o,p]of Object.entries(n)){const l=String(p||"").trim();l&&i.set(o,l)}return`/?${i.toString()}`}function jt({isAuthenticated:n,authUserId:i,runtimeMode:o,authSessionResolved:p,currentTheme:l="dark",projectName:C,currentWorkspaceId:E,apiBaseUrl:I,connectedEnvironmentSource:$,resolveCloudAuthUrl:x,embedded:h=!1,shellOwnsScroll:q=!1,onAccountProfileSummaryChange:G,onContinueToTaskforce:A,continueBusy:H=!1}){const j=qe(),T=Ge(),[M,se]=s.useState(null),[_e,X]=s.useState(!1),[re,Ce]=s.useState(!1),[be,g]=s.useState(null),z=s.useRef(!1),Z=s.useRef(null),Q=s.useRef(null),ce=s.useRef(A),F=s.useMemo(()=>new URLSearchParams(T.search),[T.search]),N=String(F.get("checkout")||"").trim().toLowerCase(),L=String(F.get("gate")||"").trim().toLowerCase(),oe=String(F.get("planId")||"").trim(),Y=String(F.get("planVersionId")||"").trim(),le=Ct(F.get("interval")),ue=bt(F.get("pricingAudience")),Se=Ae(F.get("interval")),ee=String(F.get("session_id")||"").trim(),J=s.useMemo(()=>Be(I),[I]),de=s.useMemo(()=>Be($),[$]),xe=s.useMemo(()=>({environment:Ve(de||J),runtimeMode:o==="cloud"?"cloud":"local"}),[J,de,o]),me=s.useCallback(t=>{const c=String(t||"").trim();return J?`${J}${c.startsWith("/")?c:`/${c}`}`:c},[J]),w=s.useCallback(t=>x?x(t):me(t),[me,x]),ne=s.useCallback(()=>{const t=new URLSearchParams(T.search);t.delete("screen"),t.delete("gate"),t.delete("checkout"),t.delete("planId"),t.delete("planVersionId"),t.delete("interval"),t.delete("pricingAudience");const c=t.toString();j(`/${c?`?${c}`:""}${T.hash||""}`)},[T.hash,T.search,j]),pe=s.useMemo(()=>w("/api/taskforce/public/pricing"),[w]),B=s.useMemo(()=>Pe(M,L),[M,L]),a=s.useMemo(()=>B.allowReturnToApp,[B.allowReturnToApp]),U=s.useMemo(()=>{const t=String(B.message||"").trim();return!t||t===yt?null:t},[B.message]),D=s.useCallback(()=>{const t=new URLSearchParams(T.search);t.delete("checkout"),t.delete("session_id"),t.delete("gate"),t.delete("planId"),t.delete("planVersionId"),t.delete("interval");const c=t.toString();j(`${T.pathname}${c?`?${c}`:""}${T.hash||""}`,{replace:!0})},[T.hash,T.pathname,T.search,j]),v=s.useCallback(()=>{Q.current!=null&&window.clearTimeout(Q.current),Q.current=window.setTimeout(()=>{D(),Q.current=null},ft)},[D]);s.useEffect(()=>{ce.current=A},[A]);const u=s.useCallback(async t=>{const c=w(ge);if(!n)return se(null),he(c,{identityKey:i}),null;try{const _=await Ke(c,{identityKey:i,force:t?.force===!0});return se(_),G?.(_),_}catch{return null}},[i,w,n,G]),O=s.useCallback((t,c,_)=>{const f=String(c||"").trim();if(_?.preferFallback&&f)return f;const y=Pe(t,L).message;return y||f||"Unable to confirm checkout completion."},[L]),K=s.useCallback((t,c)=>!Pe(t,c).allowReturnToApp,[]),W=s.useCallback(async(t,c,_="public",f)=>{if(!t){g({type:"error",message:"Selected plan is missing a default plan version."});return}X(!0),g(null);try{const y=await fetch(w("/api/taskforce/billing/checkout-session"),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({planVersionId:t,interval:c,pricingAudience:_})}),m=await y.json().catch(()=>({}));if(!y.ok){g({type:"error",message:String(m?.error||"Unable to start checkout for selected plan.")});return}const d=String(m?.checkoutState||"").trim().toLowerCase();if(d==="free"){g({type:"success",message:"Plan selected. Your access is ready."}),he(w(ge),{identityKey:i});const b=await u({force:!0}),R=String(b?.entitlementState||"").trim().toLowerCase();f?.autoContinueOnActivation===!0&&ye(R)&&await A?.();return}if(d==="updated"){g({type:"success",message:String(m?.message||"Your subscription was updated successfully.")}),he(w(ge),{identityKey:i});const b=await u({force:!0}),R=String(b?.entitlementState||"").trim().toLowerCase();f?.autoContinueOnActivation===!0&&ye(R)&&await A?.();return}if(d==="already_current_plan"){g({type:"success",message:String(m?.message||"You are already on this plan.")}),he(w(ge),{identityKey:i}),await u();return}const S=String(m?.returnBaseUrl||"").trim();if(o==="local"&&S)try{const b=window.location.origin,R=new URL(S,b).origin;if(R!==b){g({type:"error",message:`Checkout return is misconfigured for this runtime. Expected ${b} but got ${R}.`});return}}catch{g({type:"error",message:"Checkout return URL is invalid for this runtime."});return}const P=String(m?.url||"").trim();if(!P){g({type:"error",message:"Checkout did not return a redirect URL."});return}window.location.assign(P)}catch{g({type:"error",message:"Unable to start checkout for selected plan."})}finally{X(!1)}},[i,w,u,A,o]),ie=s.useCallback(async(t,c)=>{if(!t)return{confirmed:!1,errorMessage:"Checkout session is missing.",retryable:!1};const _=async()=>{he(w(ge),{identityKey:i});const f=await u({force:!0}),y=String(f?.entitlementState||"").trim().toLowerCase();if(!ye(y))return!1;const m=oe,d=Y,S=Se,P=String(f?.planId||"").trim(),b=String(f?.planVersionId||"").trim(),R=Ae(f?.billingInterval??null),we=c?.preConfirmationSummary??null,$e=String(we?.entitlementState||"").trim().toLowerCase(),Me=ye($e),Ue=String(we?.planId||"").trim(),De=String(we?.planVersionId||"").trim(),Fe=Ae(we?.billingInterval??null);return m&&P&&P!==m||d&&b&&b!==d||S&&R&&R!==S||Me&&!(!!m&&P===m&&Ue!==P)&&!(!!d&&b===d&&De!==b)&&!(!!S&&R===S&&Fe!==R)?!1:(c?.autoContinueOnActivation===!0&&await ce.current?.(),!0)};try{const f=await fetch(w("/api/taskforce/billing/checkout-session/confirm"),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:t})}),y=await f.json().catch(()=>({}));if(!f.ok){const m=String(y?.code||"").trim(),d=_t(f.status,m);return d&&await _()?{confirmed:!0}:{confirmed:!1,errorMessage:String(y?.error||"Unable to confirm checkout completion."),retryable:d}}return await _()?{confirmed:!0}:{confirmed:!0}}catch{return{confirmed:!1,errorMessage:"Unable to confirm checkout completion.",retryable:!0}}},[i,w,u,Se,oe,Y]),ae=s.useCallback(async()=>{if(!n){j(`/login?mode=login&next=${encodeURIComponent(je())}`);return}X(!0),g({type:"info",message:"Opening billing portal..."});try{const t=await fetch(w("/api/taskforce/billing/portal-session"),{method:"POST",credentials:"include"}),c=await t.json().catch(()=>({}));if(!t.ok){g({type:"error",message:String(c?.error||"Failed to open billing portal.")});return}const _=String(c?.url||"").trim();if(!_){g({type:"error",message:"Portal session did not return a redirect URL."});return}window.location.assign(_)}catch{g({type:"error",message:"Failed to open billing portal."})}finally{X(!1)}},[w,n,j]),k=s.useCallback(async()=>{if(!(!A||re||H)){Ce(!0);try{await A()}finally{Ce(!1)}}},[re,H,A]);s.useEffect(()=>{u()},[u]),s.useEffect(()=>{a&&L==="missing_entitlement"&&D()},[D,L,a]),s.useEffect(()=>()=>{Q.current!=null&&window.clearTimeout(Q.current)},[]),s.useEffect(()=>{N!=="success"&&(Z.current=null)},[N]),s.useEffect(()=>{let t=!1;const c=new Set,_=async f=>{f<=0||await new Promise(y=>{const m=window.setTimeout(()=>{c.delete(m),y()},f);c.add(m)})};if(N==="success"){if(z.current=!0,g({type:"success",message:"Checkout completed successfully. Finalizing your plan..."}),!n&&!p)return()=>{t=!0,c.forEach(m=>window.clearTimeout(m)),c.clear()};if(!n)return g({type:"error",message:"Sign in to finish activating your plan."}),()=>{t=!0,c.forEach(m=>window.clearTimeout(m)),c.clear()};const y=ee||"__missing_session__";return Z.current===y?()=>{t=!0,c.forEach(m=>window.clearTimeout(m)),c.clear()}:((async()=>{const m=Date.now(),d=await u({force:!0});if(t)return;let S=ee?{confirmed:!1,errorMessage:"Unable to confirm checkout completion.",retryable:!0}:{confirmed:!1,errorMessage:"Checkout session is missing.",retryable:!1},P=0;for(;;){const b=P<Ee.length?Ee[P]:gt;if(P+=1,await _(b),t||(S=ee?await ie(ee,{autoContinueOnActivation:K(d,L),preConfirmationSummary:d}):{confirmed:!1,errorMessage:"Checkout session is missing.",retryable:!1},t))return;if(S.confirmed){Z.current=y,g({type:"success",message:"Checkout completed successfully."}),v();return}if(!S.retryable||Date.now()-m>=ht)break}if(!t&&!S.confirmed){const b=await u({force:!0});if(t)return;S.retryable||(Z.current=y),g({type:"error",message:O(b,S.errorMessage,{preferFallback:!S.retryable})}),S.retryable||v();return}})(),()=>{t=!0,c.forEach(m=>window.clearTimeout(m)),c.clear()})}if(N==="cancel"){(async()=>{const f=await u({force:!0});g({type:"error",message:O(f,"Checkout was canceled. No charge was made.")}),v()})();return}if((N==="start"||N==="free")&&n&&Y&&!z.current){z.current=!0,(async()=>{const f=await u({force:!0});await W(Y,le,ue,{autoContinueOnActivation:K(f,L)})})();return}},[p,N,ie,L,n,u,le,Y,ue,ee,O,v,K,W]),s.useEffect(()=>{if(!(N==="success"||N==="cancel"||N==="start"||N==="free")){if(U){g({type:B.statusTone,message:U});return}g(t=>!t||t.type!=="error"?t:t.message===B.message?null:t)}},[N,U,B.message,B.statusTone]);const Ne=s.useCallback(async t=>{if(!n){const _=t.pricingType==="free"?"free":"start",f=je({checkout:_,planId:t.planId,planVersionId:t.planVersionId,interval:t.interval,pricingAudience:t.pricingAudience});j(`/login?mode=register&planId=${encodeURIComponent(t.planId)}&planVersionId=${encodeURIComponent(t.planVersionId)}&interval=${encodeURIComponent(t.interval)}&pricingAudience=${encodeURIComponent(t.pricingAudience)}&next=${encodeURIComponent(f)}`);return}if(t.isCurrentPlan){if(!M?.stripeCustomerId){g({type:"success",message:"Your current plan does not use Stripe billing."});return}await ae();return}const c=K(M,L);if(t.pricingType==="free"){await W(t.planVersionId,t.interval,t.pricingAudience,{autoContinueOnActivation:c});return}await W(t.planVersionId,t.interval,t.pricingAudience,{autoContinueOnActivation:c})},[M,L,n,j,ae,K,W]),fe=s.useCallback(()=>{if(a&&A){k();return}if(h){ne();return}if(window.history.length>1){j(-1);return}j("/")},[ne,h,k,a,j,A]),ke=h?null:e.jsxs(e.Fragment,{children:[e.jsx("button",{className:r.navAction,onClick:fe,disabled:H||re||n&&!a,children:a?"Take Me to Taskforce":"Back"}),n&&M?.stripeCustomerId&&e.jsx("button",{className:r.navAction,onClick:()=>{ae()},disabled:_e,children:"Manage billing"}),!n&&e.jsxs("button",{className:r.navAction,onClick:()=>j(`/login?mode=login&next=${encodeURIComponent(je())}`),children:[e.jsx(We,{size:16,style:{marginRight:"8px",verticalAlign:"text-bottom"}}),"Sign In"]})]}),te=h?null:e.jsx(He,{projectName:C,currentWorkspaceId:E,runtimeMode:o==="cloud"?"cloud":"local",theme:l,onBrandClick:fe,actions:ke});return e.jsx(pt,{chrome:te,heading:"Subscription Plans",subtitle:"Manage your subscription and explore available features. Your current plan is highlighted below.",variant:"site",theme:l,isAuthenticated:n,authSessionResolved:p,currentPlanId:String(M?.planId||oe||"").trim()||null,currentPlanVersionId:String(M?.planVersionId||Y||"").trim()||null,currentEntitlementState:String(M?.entitlementState||"").trim()||null,markCurrentPlan:B.markCurrentPlan,canManageCurrentPlan:!!M?.stripeCustomerId,pricingEndpoint:pe,statusBanner:be,onBack:fe,backLabel:a?"Take Me to Taskforce":h?"Back to Board":"Back to App",backDisabled:H||re||n&&!a,topActions:null,shellOwnsScroll:q,showPageBackButton:!1,showHeaderBarWithChrome:!1,currentPlanCardActionMode:"manage",fallbackPricingSource:xe,onSelectPlan:Ne})}export{jt as PlansPage};
@@ -1 +1 @@
1
- import{j as s}from"./vendor-react-CKJs5o3c.js";import{ContextAttachmentManager as c}from"./ContextAttachmentManager-D2epuNnG.js";import"./index-607WPo_X.js";import"./vendor-icons-B32hGuF2.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";import"./documentReferences-DPZuTgHh.js";function R(t){const{taskId:e,taskReferenceLabel:o,workspaceId:n,apiBaseUrl:a,contextFiles:r,onAddContextFile:m,onRemoveContextFile:p,onUpdateContextCaption:i}=t;return s.jsx(c,{ownerType:"task",ownerId:e,ownerReferenceLabel:o,workspaceId:n,apiBaseUrl:a,attachments:r,onAddAttachment:m,onRemoveAttachment:p,onUpdateAttachmentCaption:i})}export{R as TaskContextUpload};
1
+ import{j as s}from"./vendor-react-CKJs5o3c.js";import{ContextAttachmentManager as c}from"./ContextAttachmentManager-CfG_ER7C.js";import"./index-MAHKvFqp.js";import"./vendor-icons-B32hGuF2.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";import"./documentReferences-BOUcJm6-.js";function R(t){const{taskId:e,taskReferenceLabel:o,workspaceId:n,apiBaseUrl:a,contextFiles:r,onAddContextFile:m,onRemoveContextFile:p,onUpdateContextCaption:i}=t;return s.jsx(c,{ownerType:"task",ownerId:e,ownerReferenceLabel:o,workspaceId:n,apiBaseUrl:a,attachments:r,onAddAttachment:m,onRemoveAttachment:p,onUpdateAttachmentCaption:i})}export{R as TaskContextUpload};