@taskforcehq/taskforce 0.3.332 → 0.3.333
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server/routes/localService.js +1 -0
- package/dist/server/routes/syncPushRoutes.d.ts +3 -0
- package/dist/server/routes/syncPushRoutes.js +8 -2
- package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +1 -0
- package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +7 -6
- package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.js +2 -2
- package/dist/sync/engine/workspaceSyncEngineLocalApply.d.ts +1 -0
- package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +6 -0
- package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +34 -1
- package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.js +2 -2
- package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +4 -1
- package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +1 -0
- package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +53 -10
- package/dist/sync/syncService.d.ts +1 -0
- package/dist/sync/syncService.js +5 -2
- package/dist/ui/assets/{AiIdentityRosterCard-CDMPtnbC.js → AiIdentityRosterCard-Cfvb9Nuv.js} +1 -1
- package/dist/ui/assets/{AiProfilesModule-Cww85C4E.js → AiProfilesModule-0oR70eFG.js} +1 -1
- package/dist/ui/assets/{AnnotatedAttachmentWorkspace-Dt9TKYSH.js → AnnotatedAttachmentWorkspace-C33iH_r_.js} +1 -1
- package/dist/ui/assets/{AssetTraySortControl-CKgapnxu.js → AssetTraySortControl-BAqxUtke.js} +1 -1
- package/dist/ui/assets/{ContextAttachmentManager-T-cEVcOZ.js → ContextAttachmentManager-BudIbOR9.js} +1 -1
- package/dist/ui/assets/{DocumentWorkspace-HD4MUjAZ.js → DocumentWorkspace-A8dFQyId.js} +1 -1
- package/dist/ui/assets/{EntityActivityTimeline-_V0zfMuh.js → EntityActivityTimeline-g7vtdsx1.js} +1 -1
- package/dist/ui/assets/{PlanningModule-mTkBygsB.js → PlanningModule-D-DeQs4F.js} +1 -1
- package/dist/ui/assets/{PlansPage-Btiq06VO.js → PlansPage-BWmfGi0Z.js} +1 -1
- package/dist/ui/assets/{TaskContextUpload-C00NVUpn.js → TaskContextUpload-BA_lQmS9.js} +1 -1
- package/dist/ui/assets/{TaskSettings-Cp-L-4xh.js → TaskSettings-DAlH4YIP.js} +1 -1
- package/dist/ui/assets/{TaskforceAgentsModule-Coq9-PUp.js → TaskforceAgentsModule-DmeCf6pJ.js} +1 -1
- package/dist/ui/assets/{WorkflowManagerModule-CuqRzMmM.js → WorkflowManagerModule-p08eDOaa.js} +1 -1
- package/dist/ui/assets/index-GHJgcW3j.js +7 -0
- package/dist/ui/index.html +1 -1
- package/package.json +1 -1
- package/dist/ui/assets/index-DSQINwt9.js +0 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
import{R as s,j as t}from"./vendor-react-CKJs5o3c.js";import{an as ze,ao as $e,ap as Le,aq as We,ar as ye,as as le,T as Pe,at as ge,au as ne,av as ie,aw as G,ax as J,ay as De,az as Fe,aA as He,aB as Be,aC as Me,aD as Ue,aE as Ge,aF as be,aG as _e,aH as ce,aI as je,aJ as Ve,aK as Ke,aL as qe,aM as Qe,aN as Je}from"./index-DSQINwt9.js";import{w as re,Z as ke,R as oe,a8 as Xe,a9 as Ye,S as Ze,X as et,al as tt,aj as nt,t as se,ak as me,V as ae,Y as it,a7 as st}from"./vendor-icons-Bsq-mcEn.js";import"./vendor-markdown-_lhNCyq-.js";import"./vendor-dnd-CJ-AjP-Y.js";import"./vendor-router-AqJMU8Lz.js";const at="_module_3zich_1",rt="_columns_3zich_15",ot="_column_3zich_15",lt="_columnHeader_3zich_36",ct="_columnHeadingGroup_3zich_49",dt="_paneHeading_3zich_56",ut="_responsiveBack_3zich_60",ht="_sectionLabel_3zich_64",vt="_sectionHeadingRow_3zich_68",pt="_headerActions_3zich_81",ft="_portfolioControls_3zich_87",yt="_searchRow_3zich_95",gt="_searchShell_3zich_101",kt="_clearSearch_3zich_139",mt="_controlActive_3zich_160",wt="_filterPanel_3zich_166",xt="_filterField_3zich_177",bt="_filterLabel_3zich_184",_t="_filterDropdown_3zich_190",jt="_sortTrigger_3zich_204",Ct="_scrollRegion_3zich_217",Et="_selectedEntityContext_3zich_227",St="_selectedEntityContextArchived_3zich_237",It="_selectedEntityReferenceRow_3zich_242",Nt="_selectedEntityReferenceIdentity_3zich_257",At="_selectedEntityReferenceActions_3zich_264",Rt="_workspaceEditor_3zich_278",Ot="_workspaceEditorField_3zich_294",Tt="_workspaceEditorActions_3zich_337",zt="_selectedEntityDescription_3zich_348",$t="_selectedEntityDescriptionMarkdown_3zich_355",Lt="_selectedEntityOwnerField_3zich_361",Wt="_selectedEntityOwnerDropdown_3zich_373",Pt="_selectedEntityDetailsSection_3zich_377",Dt="_activityTimelineList_3zich_382",Ft="_activityTimelineEmpty_3zich_389",Ht="_visuallyHidden_3zich_393",Bt="_entityCard_3zich_405",Mt="_entityCardTopRow_3zich_426",Ut="_entityCardBody_3zich_433",Gt="_entityCardContentButton_3zich_437",Vt="_entityCardSelected_3zich_447",Kt="_entityCardArchived_3zich_455",qt="_relationshipRecovery_3zich_466",Qt="_empty_3zich_488",Jt="_centerState_3zich_495",Xt="_inlineError_3zich_509",Yt="_spinner_3zich_524",Zt="_columnPortfolio_3zich_543",en="_columnActive_3zich_544",tn="_columnWorkstreams_3zich_545",nn="_columnTasks_3zich_550",sn="_workspaceEditorIdentity_3zich_592",i={module:at,columns:rt,column:ot,columnHeader:lt,columnHeadingGroup:ct,paneHeading:dt,responsiveBack:ut,sectionLabel:ht,sectionHeadingRow:vt,headerActions:pt,portfolioControls:ft,searchRow:yt,searchShell:gt,clearSearch:kt,controlActive:mt,filterPanel:wt,filterField:xt,filterLabel:bt,filterDropdown:_t,sortTrigger:jt,scrollRegion:Ct,selectedEntityContext:Et,selectedEntityContextArchived:St,selectedEntityReferenceRow:It,selectedEntityReferenceIdentity:Nt,selectedEntityReferenceActions:At,workspaceEditor:Rt,workspaceEditorField:Ot,workspaceEditorActions:Tt,selectedEntityDescription:zt,selectedEntityDescriptionMarkdown:$t,selectedEntityOwnerField:Lt,selectedEntityOwnerDropdown:Wt,selectedEntityDetailsSection:Pt,activityTimelineList:Dt,activityTimelineEmpty:Ft,visuallyHidden:Ht,entityCard:Bt,entityCardTopRow:Mt,entityCardBody:Ut,entityCardContentButton:Gt,entityCardSelected:Vt,entityCardArchived:Kt,relationshipRecovery:qt,empty:Qt,centerState:Jt,inlineError:Xt,spinner:Yt,columnPortfolio:Zt,columnActive:en,columnWorkstreams:tn,columnTasks:nn,workspaceEditorIdentity:sn};function ee({entityType:e,mode:l,initialTitle:m="",initialDescription:p="",ownerOptions:f,fixedInitiativeId:y,formId:j,showActions:C=!0,onSavingChange:b,onDirtyChange:N,onCancel:A,onSave:z}){const E=e==="initiative"?"Initiative":"Workstream",W=s.useId(),P=s.useId(),k=s.useId(),V=s.useRef(null),[D,S]=s.useState(m),[u,_]=s.useState(p),[I,R]=s.useState(""),[O,h]=s.useState(null),[g,$]=s.useState(null),[T,F]=s.useState(null),[H,L]=s.useState(null),[w,U]=s.useState(!1),x=l==="create"||Ge({title:m,description:p},{title:D,description:u});s.useEffect(()=>{N?.(x)},[x,N]),s.useEffect(()=>{V.current?.focus()},[]);const B=async c=>{if(c.preventDefault(),w)return;const a=D.trim();if(!a){F(`${E} title is required.`),V.current?.focus();return}if(x){F(null),L(null),U(!0),b?.(!0);try{await z({title:a,description:u.trim()||null,...l==="create"?{ownerId:I.trim()||null}:{},...e==="workstream"&&l==="create"?{initiativeId:y||null}:{},...l==="create"&&(O||g)?{icon:O,color:g}:{}})}catch(M){L(M instanceof Error?M.message:`Failed to save ${E.toLowerCase()}.`)}finally{U(!1),b?.(!1)}}};return t.jsxs("form",{id:j,className:i.workspaceEditor,onSubmit:c=>{B(c)},onKeyDown:c=>{c.key!=="Escape"||w||(c.preventDefault(),A())},noValidate:!0,children:[l==="create"?t.jsxs("div",{className:i.workspaceEditorIdentity,children:[t.jsx(be,{entityType:e,entityId:"create-preview",icon:O,color:g||"blue",size:"detail",onChange:c=>{Object.prototype.hasOwnProperty.call(c,"icon")&&h(c.icon??null),Object.prototype.hasOwnProperty.call(c,"color")&&$(c.color??null)}}),t.jsx("span",{children:"Choose an icon and color"})]}):null,t.jsxs("div",{className:i.workspaceEditorField,children:[t.jsxs("label",{htmlFor:W,children:[E," title"]}),t.jsx("input",{ref:V,id:W,value:D,disabled:w,required:!0,"aria-invalid":T?"true":void 0,"aria-describedby":T?P:void 0,onChange:c=>{S(c.target.value),T&&F(null)},placeholder:e==="initiative"?"Enter initiative title":"Enter workstream title"}),T?t.jsx("p",{id:P,className:"tf-text-error",children:T}):null]}),t.jsxs("div",{className:i.workspaceEditorField,children:[t.jsxs("label",{htmlFor:k,children:[E," description"]}),t.jsx("textarea",{id:k,value:u,disabled:w,rows:5,onChange:c=>_(c.target.value),placeholder:e==="initiative"?"Describe the broader outcome this initiative is meant to achieve.":"Describe the lane of work this workstream will coordinate."})]}),l==="create"&&f?t.jsxs("div",{className:i.workspaceEditorField,children:[t.jsxs("span",{children:[E," owner"]}),t.jsx(le,{value:I,options:f,onChange:R,disabled:w,ariaLabel:`${E} owner`,className:`${_e.control} ${i.selectedEntityOwnerDropdown}`})]}):null,H?t.jsx("p",{className:"tf-text-error",role:"alert",children:H}):null,C?t.jsxs("div",{className:i.workspaceEditorActions,children:[t.jsx("button",{type:"button",className:"tf-button-secondary tf-button-compact",onClick:A,disabled:w,children:"Cancel"}),t.jsxs("button",{type:"submit",className:"tf-button-primary tf-button-compact",disabled:w||!x,children:[w?t.jsx(re,{size:14,className:i.spinner,"aria-hidden":"true"}):null,l==="create"?`Create ${E}`:"Save"]})]}):null]})}function an({initiative:e,ownerOption:l,ownerOptions:m,workstreamCount:p,selected:f,onSelect:y,onChangeOwner:j,onChangeIdentity:C}){return t.jsxs("div",{className:`${i.entityCard} ${e.isArchived?i.entityCardArchived:""} ${f?i.entityCardSelected:""}`.trim(),children:[t.jsx(ce,{label:J(e),entityType:"initiative",entityName:e.title,interactive:!1}),t.jsx("div",{className:i.entityCardBody,children:t.jsx("div",{role:"button",tabIndex:0,className:i.entityCardContentButton,onClick:y,onKeyDown:b=>{b.key!=="Enter"&&b.key!==" "||(b.preventDefault(),y())},"aria-pressed":f,children:t.jsx(je,{item:e,entityType:"initiative",workstreamCount:p,ownerOption:l,ownerOptions:m,onChangeOwner:j,onChangeIdentity:C})})})]})}function we({workstream:e,ownerOption:l,ownerOptions:m,selected:p,onSelect:f,onChangeOwner:y,onChangeIdentity:j,referenceAction:C,feedback:b}){const N=G(e);return t.jsxs("div",{className:`${i.entityCard} ${e.isArchived?i.entityCardArchived:""} ${p?i.entityCardSelected:""}`.trim(),children:[t.jsxs("div",{className:i.entityCardTopRow,children:[C,t.jsx(ce,{label:N||"Reference pending",entityType:"workstream",entityName:e.title,interactive:!1,pending:!N})]}),b,t.jsx("div",{className:i.entityCardBody,children:t.jsx("div",{role:"button",tabIndex:0,className:i.entityCardContentButton,onClick:f,onKeyDown:A=>{A.key!=="Enter"&&A.key!==" "||(A.preventDefault(),f())},"aria-pressed":p,children:t.jsx(je,{item:e,entityType:"workstream",ownerOption:l,ownerOptions:m,onChangeOwner:y,onChangeIdentity:j})})})]})}function xe({item:e,entityType:l,ownerOptions:m,onChangeOwner:p,onChangeIdentity:f,workspaceId:y,currentActorId:j,taskReferences:C,hydrationState:b,onRetryHydration:N,onAddContextFile:A,onRemoveContextFile:z,onUpdateContextCaption:E,onUpdate:W,onArchive:P,onUnarchive:k,referenceAction:V,relationshipActions:D,relationshipContent:S}){const u=l==="initiative"?"Initiative":"Workstream",_=l==="initiative"?J(e):G(e),[I,R]=s.useState(String(e.ownerId||"")),[O,h]=s.useState(!1),[g,$]=s.useState(!1),[T,F]=s.useState(!1),[H,L]=s.useState(!1),[w,U]=s.useState(!1),[x,B]=s.useState(!1),c=s.useId(),a=Ve({entityType:l,isArchived:e.isArchived,taskCount:e.taskCount,completedTaskCount:e.completedTaskCount,archiveReady:e.archiveReady,activeWorkstreamCount:e.archiveActiveWorkstreamCount}),M=a.mode==="archived"?`Unarchive ${u.toLowerCase()}`:a.mode==="blocked"?`Archive unavailable — active ${a.remainingKind==="task"?"tasks":"workstreams"} remain`:a.mode==="checking"?"Archive availability is still loading":`Archive ${u.toLowerCase()}`;s.useEffect(()=>{R(String(e.ownerId||"")),h(!1)},[e.id,e.ownerId]),s.useEffect(()=>{$(!1),F(!1),L(!1),U(!1),B(!1)},[e.id]);const r=async d=>{if(!p||e.isArchived||O||d===I)return;const K=I;R(d),h(!0);try{await p(d)}catch{R(K)}finally{h(!1)}},X=async()=>{if(x)return;if(a.mode==="ready"){U(!0);return}const d=a.mode==="archived"?k:P;if(!(!d||a.mode==="blocked"||a.mode==="checking")){B(!0);try{await d()}finally{B(!1)}}},Y=async()=>{if(!(!P||x)){B(!0);try{await P()!==!1&&U(!1)}finally{B(!1)}}};return t.jsxs("section",{className:`${i.selectedEntityContext} ${e.isArchived?i.selectedEntityContextArchived:""}`.trim(),"aria-label":`Selected ${u.toLowerCase()}`,"aria-busy":b?.status==="loading",children:[t.jsxs("div",{className:i.selectedEntityReferenceRow,children:[t.jsxs("div",{className:i.selectedEntityReferenceIdentity,children:[t.jsx(be,{entityType:l,entityId:e.id,icon:e.icon,color:e.color,size:"detail",disabled:!!e.isArchived,onChange:f?d=>f(l,e.id,d):void 0}),V,t.jsx(ce,{label:_||"Reference pending",entityType:l,entityName:e.title,interactive:!1,pending:!_})]}),t.jsxs("div",{className:i.selectedEntityReferenceActions,children:[t.jsx("span",{children:u}),D,!g&&(P||k)?t.jsx("button",{type:"button",className:"tf-control-icon",disabled:x||a.mode==="blocked"||a.mode==="checking"||(a.mode==="archived"?!k:!P),onClick:()=>{X()},"aria-label":M,title:M,"aria-expanded":a.mode==="ready"?w:void 0,children:a.mode==="archived"?t.jsx(oe,{size:14,"aria-hidden":"true"}):t.jsx(it,{size:14,"aria-hidden":"true"})}):null,!g&&!e.isArchived&&W?t.jsx("button",{type:"button",className:"tf-control-icon",onClick:()=>{L(!1),$(!0)},"aria-label":`Edit ${u.toLowerCase()}`,title:`Edit ${u.toLowerCase()}`,children:t.jsx(st,{size:14,"aria-hidden":"true"})}):null,g?t.jsxs(t.Fragment,{children:[t.jsx("button",{type:"button",className:"tf-button-secondary tf-button-compact",onClick:()=>$(!1),disabled:T,children:"Cancel"}),t.jsx("button",{type:"submit",form:c,className:"tf-button-primary tf-button-compact",disabled:T||!H,children:"Save"})]}):null]})]}),w&&a.mode==="ready"?t.jsx(Ke,{entityType:l,title:e.title,activeTaskCount:e.archiveActiveTaskCount,activeWorkstreamCount:e.archiveActiveWorkstreamCount,busy:x,onCancel:()=>U(!1),onConfirm:()=>{Y()}}):null,S,g&&W?t.jsx(ee,{entityType:l,mode:"edit",formId:c,showActions:!1,onSavingChange:F,onDirtyChange:L,initialTitle:e.title,initialDescription:e.description||"",onCancel:()=>$(!1),onSave:async d=>{await W(d),$(!1)}},`${l}:${e.id}`):t.jsxs(t.Fragment,{children:[t.jsx("h3",{className:"tf-heading-card",children:e.title}),t.jsx(qe,{description:e.description,label:u,taskReferences:C,className:`${i.selectedEntityDescription} tf-scrollbar`.trim(),markdownClassName:i.selectedEntityDescriptionMarkdown})]}),t.jsxs("div",{className:i.selectedEntityOwnerField,children:[t.jsx("span",{children:"Owner"}),t.jsx(le,{value:I,options:m,onChange:d=>{r(d)},disabled:!p||!!e.isArchived||O,ariaLabel:`${u} owner`,className:`${_e.control} ${i.selectedEntityOwnerDropdown}`})]}),t.jsx("div",{className:i.selectedEntityDetailsSection,children:t.jsx(Qe,{entityType:l,entityId:e.id,referenceLabel:l==="initiative"?J(e):G(e),workspaceId:y,attachments:e.attachments,readOnly:!!e.isArchived,defaultExpanded:!1,onAddAttachment:!e.isArchived&&A?d=>A(l,e.id,d):void 0,onRemoveAttachment:!e.isArchived&&z?d=>z(l,e.id,d):void 0,onUpdateAttachmentCaption:!e.isArchived&&E?(d,K)=>E(l,e.id,d,K):void 0})}),t.jsx("div",{className:i.selectedEntityDetailsSection,children:t.jsx(Je,{entityType:l,item:e,assigneeOptions:m,currentActorId:j,taskReferences:C,defaultExpanded:!1,listClassName:i.activityTimelineList,emptyClassName:i.activityTimelineEmpty,hydrationState:b,onRetryHydration:N})})]})}function hn({model:e}){const[l,m]=s.useState(null),[p,f]=s.useState(null),[y,j]=s.useState("portfolio"),[C,b]=s.useState(""),[N,A]=s.useState("all"),[z,E]=s.useState("default"),[W,P]=s.useState(!1),[k,V]=s.useState(!1),D=e.taskArrangeMode||"execution",[S,u]=s.useState(null),[_,I]=s.useState(null),[R,O]=s.useState(null),[h,g]=s.useState(!1),$=s.useRef(null),T=s.useRef(null),F=s.useRef(null),H=s.useRef(null),L=s.useRef(null),w=s.useMemo(()=>new Map(e.assigneeOptions.filter(n=>!String(n.archivedAt||"").trim()).map(n=>[String(n.value),n])),[e.assigneeOptions]),U=s.useMemo(()=>{const n=String(e.currentOwnerId||"").trim(),o=n?ze(e.assigneeOptions,n).find(v=>v.value===n):void 0;return[{value:"all",label:"All owners",icon:"Users",color:"var(--text-secondary)",kind:"unassigned"},...n?[{...o,value:"mine",label:"Owned by me",icon:o?.icon||"User",color:o?.color||"var(--text-secondary)",kind:o?.kind||"member"}]:[],{value:"unassigned",label:"Unassigned",icon:Le,color:$e,kind:"unassigned"}]},[e.assigneeOptions,e.currentOwnerId]),x=s.useMemo(()=>We({initiatives:e.initiatives,standaloneWorkstreams:e.standaloneWorkstreams,showArchivedPlanning:k,searchQuery:C,ownerFilter:N,currentOwnerId:String(e.currentOwnerId||""),sort:z}),[e.currentOwnerId,e.initiatives,e.standaloneWorkstreams,N,C,k,z]),B=s.useMemo(()=>x.initiatives.map(({initiative:n})=>n),[x.initiatives]),c=x.standaloneWorkstreams,a=s.useMemo(()=>e.initiatives.find(n=>n.id===l)??null,[e.initiatives,l]),M=s.useMemo(()=>[...e.initiatives.flatMap(n=>n.allWorkstreams??n.workstreams),...e.standaloneWorkstreams],[e.initiatives,e.standaloneWorkstreams]),r=s.useMemo(()=>M.find(n=>n.id===p)??null,[M,p]),X=a?(a.allWorkstreams??a.workstreams).filter(n=>k||!n.isArchived):r&&!r.initiativeId?[r]:[],Y=s.useMemo(()=>ye((r?.tasks??[]).filter(n=>k||!n.isArchived),D),[r?.tasks,k,D]),d=s.useMemo(()=>new Set((a?.allWorkstreams??a?.workstreams??[]).map(n=>n.id)),[a]),K=s.useMemo(()=>new Set((r?.tasks??[]).map(n=>n.id)),[r]),Ce=s.useMemo(()=>e.linkOptions.workstreams.filter(n=>!d.has(n.id)),[d,e.linkOptions.workstreams]),Ee=s.useMemo(()=>e.linkOptions.tasks.filter(n=>!K.has(n.id)),[K,e.linkOptions.tasks]),q=r?"workstream":a?"initiative":null,Q=r?.id||a?.id||null,de=q&&Q?e.hydrationStateByEntity?.[`${q}:${Q}`]:void 0,ue=s.useMemo(()=>e.initiatives.some(o=>o.isArchived)?!0:[...e.initiatives.flatMap(o=>o.allWorkstreams??o.workstreams),...e.standaloneWorkstreams].some(o=>o.isArchived||(o.tasks??[]).some(v=>v.isArchived)),[e.initiatives,e.standaloneWorkstreams]);s.useEffect(()=>{const n=L.current;if(n){if(n.entityType==="initiative"){if(!e.initiatives.some(o=>o.id===n.entityId))return;L.current=null,m(n.entityId),f(null),H.current="workstreams",j("workstreams");return}M.some(o=>o.id===n.entityId)&&(L.current=null,m(n.initiativeId||null),f(n.entityId),H.current="tasks",j("tasks"))}},[M,e.initiatives]),s.useEffect(()=>{l&&!a&&(m(null),f(null),j("portfolio"))},[a,l]),s.useEffect(()=>{p&&!r&&(f(null),j(a?"workstreams":"portfolio"))},[a,r,p]),s.useEffect(()=>{!e.hydrateEntity||!q||!Q||e.hydrateEntity(q,Q)},[e.hydrateEntity,Q,q]),s.useEffect(()=>{I(null),O(null),g(!1)},[Q,q]),s.useLayoutEffect(()=>{if(H.current!==y)return;(y==="portfolio"?$.current:y==="workstreams"?T.current:F.current)?.focus({preventScroll:!0}),H.current=null},[y]);const Z=n=>{if(n===y){(n==="portfolio"?$.current:n==="workstreams"?T.current:F.current)?.focus({preventScroll:!0});return}H.current=n,j(n)},Se=n=>{m(n),f(null),Z("workstreams")},he=n=>{n.initiativeId||m(null),f(n.id),Z("tasks")},Ie=()=>{Z(a?"workstreams":"portfolio")},Ne=x.hasCriteria||z!=="default",Ae=()=>{b(""),A("all"),E("default")},te=async n=>{if(!S||!e.createEntity)return;const o=await e.createEntity(S.entityType,n);L.current={entityType:S.entityType,entityId:o.id,initiativeId:S.initiativeId},u(null)},ve=async(n,o)=>{if(h)return;const v=n==="workstream"?e.attachWorkstreamToInitiative:e.attachTaskToWorkstream,fe=n==="workstream"?a?.id:r?.id;if(!(!v||!fe)){g(!0);try{await v(fe,o.referenceLabel)}finally{g(!1)}}},Re=async n=>{if(!(!r||!e.assignWorkstreamToInitiative||h)){g(!0);try{await e.assignWorkstreamToInitiative(r.id,n.referenceLabel)!==!1&&m(n.id)}finally{g(!1)}}},Oe=async()=>{if(!(!_||h)){g(!0);try{if(_.entityType==="workstream"){if(!e.assignWorkstreamToInitiative)return;const n=a?J(a):null;if(await e.assignWorkstreamToInitiative(_.id,null)===!1)return;O({pane:_.id===r?.id?"tasks":"workstreams",message:`${_.referenceLabel} removed from its initiative.`,onUndo:async()=>{if(!n)return;await e.assignWorkstreamToInitiative?.(_.id,n)!==!1&&O(null)}})}else{if(!e.assignTaskToWorkstream||!r)return;const n=r.id;if(await e.assignTaskToWorkstream(_.id,null)===!1)return;O({pane:"tasks",message:`${_.referenceLabel} removed from this workstream.`,onUndo:async()=>{await e.assignTaskToWorkstream?.(_.id,n)!==!1&&O(null)}})}I(null)}finally{g(!1)}}},Te=async()=>{if(!(!R||h)){g(!0);try{await R.onUndo()}finally{g(!1)}}},pe=R?t.jsxs("div",{className:i.relationshipRecovery,role:"status",children:[t.jsx("span",{children:R.message}),t.jsx("button",{type:"button",className:"tf-button-ghost tf-button-compact",disabled:h,onClick:()=>{Te()},children:h?"Restoring…":"Undo"})]}):null;return e.loadState.status==="loading"&&e.initiatives.length===0&&e.standaloneWorkstreams.length===0?t.jsxs("main",{className:i.centerState,"aria-busy":"true","aria-label":"Loading planning workspace",children:[t.jsx(re,{size:22,className:i.spinner}),t.jsx("span",{children:"Loading planning…"})]}):e.loadState.status==="error"&&e.initiatives.length===0&&e.standaloneWorkstreams.length===0?t.jsxs("main",{className:i.centerState,role:"alert",children:[t.jsx(ke,{size:22}),t.jsx("strong",{children:"Planning could not be loaded."}),t.jsx("span",{children:e.loadState.error}),t.jsxs("button",{type:"button",className:"tf-button-secondary tf-button-compact",onClick:e.retry,disabled:e.loadState.isRefreshing,children:[e.loadState.isRefreshing?t.jsx(re,{size:15,className:i.spinner}):t.jsx(oe,{size:15}),"Retry"]})]}):t.jsxs("main",{className:i.module,"aria-label":"Planning workspace","aria-busy":e.loadState.isRefreshing,children:[e.loadState.isRefreshing?t.jsx("span",{className:i.visuallyHidden,role:"status","aria-live":"polite",children:"Refreshing planning"}):null,(e.loadState.status==="partial"||e.loadState.status==="error")&&t.jsxs("div",{className:i.inlineError,role:"alert",children:[t.jsx(ke,{size:16}),t.jsx("span",{children:e.loadState.error||"Some planning information could not be loaded."}),t.jsx("button",{type:"button",className:"tf-button-secondary tf-button-compact",onClick:e.retry,children:"Retry"})]}),t.jsxs("div",{className:i.columns,"data-active-pane":y,children:[t.jsxs("section",{className:`${i.column} ${i.columnPortfolio} ${y==="portfolio"?i.columnActive:""}`.trim(),"aria-labelledby":"planning-portfolio-heading",children:[t.jsxs("div",{className:i.columnHeader,children:[t.jsx("h2",{ref:$,id:"planning-portfolio-heading",className:`tf-heading-section ${i.paneHeading}`,tabIndex:-1,children:"Portfolio"}),t.jsxs("div",{className:i.headerActions,children:[t.jsx("span",{children:B.length+c.length}),t.jsx("button",{type:"button",className:`tf-control-icon ${k?i.controlActive:""}`.trim(),onClick:()=>V(n=>!n),disabled:!ue,"aria-label":k?"Hide archived planning items":"Show archived planning items","aria-pressed":k,title:ue?k?"Hide archived planning items":"Show archived planning items":"No archived planning items",children:k?t.jsx(Xe,{size:15,"aria-hidden":"true"}):t.jsx(Ye,{size:15,"aria-hidden":"true"})})]})]}),t.jsxs("div",{className:i.portfolioControls,children:[t.jsxs("div",{className:i.searchRow,children:[t.jsxs("div",{className:i.searchShell,children:[t.jsx(Ze,{size:14,"aria-hidden":"true"}),t.jsx("input",{type:"search",value:C,onChange:n=>b(n.target.value),placeholder:"Search initiatives and workstreams","aria-label":"Search planning"}),C?t.jsx("button",{type:"button",className:i.clearSearch,onClick:()=>b(""),"aria-label":"Clear planning search",title:"Clear search",children:t.jsx(et,{size:13,"aria-hidden":"true"})}):null]}),t.jsx("button",{type:"button",className:`tf-control-icon ${W||N!=="all"||z!=="default"?i.controlActive:""}`.trim(),"aria-label":"Filter and sort planning",title:"Filter and sort planning","aria-expanded":W,"aria-controls":"planning-workspace-navigator-options",onClick:()=>P(n=>!n),children:t.jsx(tt,{size:15,"aria-hidden":"true"})})]}),W?t.jsxs("div",{id:"planning-workspace-navigator-options",className:i.filterPanel,children:[t.jsxs("div",{className:i.filterField,children:[t.jsx("span",{className:i.filterLabel,children:"Owner"}),t.jsx(le,{value:N,options:e.assigneeOptions,leadingOptions:U,includeUnassigned:!1,onChange:A,disabled:!1,ariaLabel:"Filter planning by owner",className:i.filterDropdown})]}),t.jsxs("div",{className:i.filterField,children:[t.jsx("span",{className:i.filterLabel,children:"Sort"}),t.jsx(Pe,{value:z,options:ge,onChange:n=>E(String(n)),ariaLabel:"Sort planning",className:i.filterDropdown,portalPanel:!0,panelAlign:"start",triggerContent:t.jsxs("span",{className:i.sortTrigger,children:[t.jsx(nt,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:ge.find(n=>n.value===z)?.label})]}),renderOptionContent:n=>n.label})]}),t.jsx("button",{type:"button",className:"tf-control-icon",onClick:Ae,disabled:!Ne,"aria-label":"Reset planning filters and sort",title:"Reset planning filters and sort",children:t.jsx(oe,{size:14,"aria-hidden":"true"})})]}):null]}),t.jsxs("div",{className:i.scrollRegion,children:[t.jsxs("div",{className:i.sectionHeadingRow,children:[t.jsx("h3",{className:`tf-heading-section ${i.sectionLabel}`,children:"Initiatives"}),e.createEntity?t.jsx("button",{type:"button",className:"tf-control-icon",onClick:()=>u({entityType:"initiative"}),"aria-label":"Create initiative",title:"Create initiative",children:t.jsx(se,{size:15,"aria-hidden":"true"})}):null]}),S?.entityType==="initiative"?t.jsx(ee,{entityType:"initiative",mode:"create",ownerOptions:e.assigneeOptions,onCancel:()=>u(null),onSave:te}):null,x.initiatives.map(({initiative:n,workstreams:o})=>t.jsx(an,{initiative:n,workstreamCount:o.length,ownerOption:n.ownerId?w.get(n.ownerId):void 0,ownerOptions:e.assigneeOptions,selected:l===n.id,onSelect:()=>Se(n.id),onChangeOwner:e.changeOwner?v=>e.changeOwner?.("initiative",n.id,v==="unassigned"?"":v):void 0,onChangeIdentity:e.changeIdentity?v=>e.changeIdentity?.("initiative",n.id,v):void 0},n.id)),t.jsxs("div",{className:i.sectionHeadingRow,children:[t.jsx("h3",{className:`tf-heading-section ${i.sectionLabel}`,children:"Standalone workstreams"}),e.createEntity?t.jsx("button",{type:"button",className:"tf-control-icon",onClick:()=>u({entityType:"workstream",initiativeId:null}),"aria-label":"Create standalone workstream",title:"Create standalone workstream",children:t.jsx(se,{size:15,"aria-hidden":"true"})}):null]}),S?.entityType==="workstream"&&!S.initiativeId?t.jsx(ee,{entityType:"workstream",mode:"create",ownerOptions:e.assigneeOptions,fixedInitiativeId:null,onCancel:()=>u(null),onSave:te}):null,c.map(n=>t.jsx(we,{workstream:n,ownerOption:n.ownerId?w.get(n.ownerId):void 0,ownerOptions:e.assigneeOptions,selected:p===n.id,onSelect:()=>he(n),onChangeOwner:e.changeOwner?o=>e.changeOwner?.("workstream",n.id,o==="unassigned"?"":o):void 0,onChangeIdentity:e.changeIdentity?o=>e.changeIdentity?.("workstream",n.id,o):void 0},n.id)),B.length===0&&c.length===0&&t.jsx("p",{className:`tf-text-helper ${i.empty}`,children:x.hasCriteria?"No planning matches.":"No planning items yet."})]})]}),t.jsxs("section",{className:`${i.column} ${i.columnWorkstreams} ${y==="workstreams"?i.columnActive:""}`.trim(),"aria-labelledby":"planning-workstreams-heading",children:[t.jsxs("div",{className:i.columnHeader,children:[t.jsxs("div",{className:i.columnHeadingGroup,children:[t.jsx("button",{type:"button",className:`tf-control-icon ${i.responsiveBack}`.trim(),onClick:()=>Z("portfolio"),"aria-label":"Back to Portfolio",title:"Back to Portfolio",children:t.jsx(me,{size:15,"aria-hidden":"true"})}),t.jsxs("h2",{ref:T,id:"planning-workstreams-heading",className:`tf-heading-section ${i.paneHeading}`,tabIndex:-1,children:["Workstreams (",X.length,")"]})]}),t.jsx("div",{className:i.headerActions,children:a&&e.createEntity?t.jsx("button",{type:"button",className:"tf-control-icon",onClick:()=>u({entityType:"workstream",initiativeId:a.id}),"aria-label":`Create workstream in ${a.title}`,title:"Create workstream",children:t.jsx(se,{size:15,"aria-hidden":"true"})}):null})]}),t.jsxs("div",{className:i.scrollRegion,children:[a?t.jsxs(t.Fragment,{children:[t.jsx(xe,{item:a,entityType:"initiative",ownerOptions:e.assigneeOptions,onChangeOwner:e.changeOwner?n=>e.changeOwner?.("initiative",a.id,n):void 0,onChangeIdentity:e.changeIdentity,workspaceId:e.currentWorkspaceId,currentActorId:e.currentOwnerId,taskReferences:e.taskReferences,hydrationState:r?void 0:de,onRetryHydration:e.hydrateEntity?()=>{e.hydrateEntity?.("initiative",a.id)}:void 0,onAddContextFile:e.addContextFile,onRemoveContextFile:e.removeContextFile,onUpdateContextCaption:e.updateContextCaption,onUpdate:e.updateEntity?n=>e.updateEntity("initiative",a.id,n):void 0,onArchive:e.archiveEntity?()=>e.archiveEntity("initiative",a.id):void 0,onUnarchive:e.unarchiveEntity?()=>e.unarchiveEntity("initiative",a.id):void 0}),t.jsx(ne,{options:Ce,entityLabel:"workstream",onSelect:n=>ve("workstream",n),disabled:!e.attachWorkstreamToInitiative||h})]}):null,S?.entityType==="workstream"&&S.initiativeId===a?.id?t.jsx(ee,{entityType:"workstream",mode:"create",ownerOptions:e.assigneeOptions,fixedInitiativeId:a.id,onCancel:()=>u(null),onSave:te}):null,X.map(n=>t.jsx(we,{workstream:n,ownerOption:n.ownerId?w.get(n.ownerId):void 0,ownerOptions:e.assigneeOptions,selected:p===n.id,onSelect:()=>he(n),onChangeOwner:e.changeOwner?o=>e.changeOwner?.("workstream",n.id,o==="unassigned"?"":o):void 0,onChangeIdentity:e.changeIdentity?o=>e.changeIdentity?.("workstream",n.id,o):void 0,referenceAction:a?t.jsx(ie,{disabled:!e.assignWorkstreamToInitiative||h,onClick:()=>I({entityType:"workstream",id:n.id,referenceLabel:G(n),title:n.title,parentLabel:a?`${J(a)} ${a.title}`.trim():"its initiative"}),title:`Unlink ${G(n)||n.title} from initiative`,ariaLabel:`Unlink ${G(n)||n.title} from initiative`,children:t.jsx(ae,{size:14,"aria-hidden":"true"})}):void 0},n.id)),a&&R?.pane==="workstreams"?pe:null,X.length===0&&t.jsx("p",{className:`tf-text-helper ${i.empty}`,children:"Select an initiative or standalone workstream."})]})]}),t.jsxs("section",{className:`${i.column} ${i.columnTasks} ${y==="tasks"?i.columnActive:""}`.trim(),"aria-labelledby":"planning-tasks-heading",children:[t.jsx("div",{className:i.columnHeader,children:t.jsxs("div",{className:i.columnHeadingGroup,children:[t.jsx("button",{type:"button",className:`tf-control-icon ${i.responsiveBack}`.trim(),onClick:Ie,"aria-label":a?"Back to Workstreams":"Back to Portfolio",title:a?"Back to Workstreams":"Back to Portfolio",children:t.jsx(me,{size:15,"aria-hidden":"true"})}),t.jsxs("h2",{ref:F,id:"planning-tasks-heading",className:`tf-heading-section ${i.paneHeading}`,tabIndex:-1,children:["Tasks (",Y.length,")"]})]})}),t.jsxs("div",{className:i.scrollRegion,children:[r?t.jsxs(t.Fragment,{children:[t.jsx(xe,{item:r,entityType:"workstream",ownerOptions:e.assigneeOptions,onChangeOwner:e.changeOwner?n=>e.changeOwner?.("workstream",r.id,n):void 0,workspaceId:e.currentWorkspaceId,currentActorId:e.currentOwnerId,taskReferences:e.taskReferences,hydrationState:de,onRetryHydration:e.hydrateEntity?()=>{e.hydrateEntity?.("workstream",r.id)}:void 0,onAddContextFile:e.addContextFile,onRemoveContextFile:e.removeContextFile,onUpdateContextCaption:e.updateContextCaption,onUpdate:e.updateEntity?n=>e.updateEntity("workstream",r.id,n):void 0,onArchive:e.archiveEntity?()=>e.archiveEntity("workstream",r.id):void 0,onUnarchive:e.unarchiveEntity?()=>e.unarchiveEntity("workstream",r.id):void 0,referenceAction:r.initiativeId?t.jsx(ie,{disabled:!e.assignWorkstreamToInitiative||h,onClick:()=>{I({entityType:"workstream",id:r.id,referenceLabel:G(r),title:r.title,parentLabel:a?`${J(a)} ${a.title}`.trim():"its initiative"})},title:"Unlink workstream from initiative",ariaLabel:"Unlink workstream from initiative",children:t.jsx(ae,{size:14,"aria-hidden":"true"})}):t.jsx(ne,{options:e.linkOptions.initiatives,entityLabel:"initiative",onSelect:Re,disabled:!e.assignWorkstreamToInitiative||h,iconTrigger:!0,triggerTitle:"Link initiative"})}),t.jsx(ne,{options:Ee,entityLabel:"task",onSelect:n=>ve("task",n),disabled:!e.attachTaskToWorkstream||h}),e.setTaskArrangeMode?t.jsx(De,{value:D,onChange:e.setTaskArrangeMode}):null]}):null,t.jsx(Fe,{tasks:Y,mode:D,onReorder:r&&e.reorderWorkstreamTasks?n=>e.reorderWorkstreamTasks?.(r.id,Me(ye(r.tasks??[],"execution"),n)):void 0,children:n=>{const o=He(n);return t.jsx(Be,{task:n,assigneeOption:n.assignee?w.get(n.assignee):void 0,assigneeOptions:e.assigneeOptions,showStatusLabel:e.showTaskCardStatusLabel,onOpen:()=>e.openTask(n.id),onAssigneeChange:e.setTaskAssignee?v=>e.setTaskAssignee?.(n.id,v):void 0,onStatusChange:e.setTaskStatus?v=>e.setTaskStatus?.(n.id,v):void 0,referenceInteractive:!1,referenceAction:t.jsx(ie,{disabled:!e.assignTaskToWorkstream||h,onClick:v=>{v.stopPropagation(),I({entityType:"task",id:n.id,referenceLabel:o||n.id,title:n.title,parentLabel:r?`${G(r)} ${r.title}`.trim():"its workstream"})},title:`Unlink ${o||n.title} from workstream`,ariaLabel:`Unlink ${o||n.title} from workstream`,children:t.jsx(ae,{size:14,"aria-hidden":"true"})})},n.id)}}),r&&R?.pane==="tasks"?pe:null,!r&&t.jsx("p",{className:`tf-text-helper ${i.empty}`,children:"Select a workstream."}),r&&Y.length===0&&t.jsx("p",{className:`tf-text-helper ${i.empty}`,children:"No tasks are linked to this workstream."})]})]})]}),t.jsx(Ue,{item:_,busy:h,theme:e.theme,onCancel:()=>I(null),onConfirm:()=>{Oe()}})]})}export{hn as PlanningModule};
|
|
1
|
+
import{R as s,j as t}from"./vendor-react-CKJs5o3c.js";import{an as ze,ao as $e,ap as Le,aq as We,ar as ye,as as le,T as Pe,at as ge,au as ne,av as ie,aw as G,ax as J,ay as De,az as Fe,aA as He,aB as Be,aC as Me,aD as Ue,aE as Ge,aF as be,aG as _e,aH as ce,aI as je,aJ as Ve,aK as Ke,aL as qe,aM as Qe,aN as Je}from"./index-GHJgcW3j.js";import{w as re,Z as ke,R as oe,a8 as Xe,a9 as Ye,S as Ze,X as et,al as tt,aj as nt,t as se,ak as me,V as ae,Y as it,a7 as st}from"./vendor-icons-Bsq-mcEn.js";import"./vendor-markdown-_lhNCyq-.js";import"./vendor-dnd-CJ-AjP-Y.js";import"./vendor-router-AqJMU8Lz.js";const at="_module_3zich_1",rt="_columns_3zich_15",ot="_column_3zich_15",lt="_columnHeader_3zich_36",ct="_columnHeadingGroup_3zich_49",dt="_paneHeading_3zich_56",ut="_responsiveBack_3zich_60",ht="_sectionLabel_3zich_64",vt="_sectionHeadingRow_3zich_68",pt="_headerActions_3zich_81",ft="_portfolioControls_3zich_87",yt="_searchRow_3zich_95",gt="_searchShell_3zich_101",kt="_clearSearch_3zich_139",mt="_controlActive_3zich_160",wt="_filterPanel_3zich_166",xt="_filterField_3zich_177",bt="_filterLabel_3zich_184",_t="_filterDropdown_3zich_190",jt="_sortTrigger_3zich_204",Ct="_scrollRegion_3zich_217",Et="_selectedEntityContext_3zich_227",St="_selectedEntityContextArchived_3zich_237",It="_selectedEntityReferenceRow_3zich_242",Nt="_selectedEntityReferenceIdentity_3zich_257",At="_selectedEntityReferenceActions_3zich_264",Rt="_workspaceEditor_3zich_278",Ot="_workspaceEditorField_3zich_294",Tt="_workspaceEditorActions_3zich_337",zt="_selectedEntityDescription_3zich_348",$t="_selectedEntityDescriptionMarkdown_3zich_355",Lt="_selectedEntityOwnerField_3zich_361",Wt="_selectedEntityOwnerDropdown_3zich_373",Pt="_selectedEntityDetailsSection_3zich_377",Dt="_activityTimelineList_3zich_382",Ft="_activityTimelineEmpty_3zich_389",Ht="_visuallyHidden_3zich_393",Bt="_entityCard_3zich_405",Mt="_entityCardTopRow_3zich_426",Ut="_entityCardBody_3zich_433",Gt="_entityCardContentButton_3zich_437",Vt="_entityCardSelected_3zich_447",Kt="_entityCardArchived_3zich_455",qt="_relationshipRecovery_3zich_466",Qt="_empty_3zich_488",Jt="_centerState_3zich_495",Xt="_inlineError_3zich_509",Yt="_spinner_3zich_524",Zt="_columnPortfolio_3zich_543",en="_columnActive_3zich_544",tn="_columnWorkstreams_3zich_545",nn="_columnTasks_3zich_550",sn="_workspaceEditorIdentity_3zich_592",i={module:at,columns:rt,column:ot,columnHeader:lt,columnHeadingGroup:ct,paneHeading:dt,responsiveBack:ut,sectionLabel:ht,sectionHeadingRow:vt,headerActions:pt,portfolioControls:ft,searchRow:yt,searchShell:gt,clearSearch:kt,controlActive:mt,filterPanel:wt,filterField:xt,filterLabel:bt,filterDropdown:_t,sortTrigger:jt,scrollRegion:Ct,selectedEntityContext:Et,selectedEntityContextArchived:St,selectedEntityReferenceRow:It,selectedEntityReferenceIdentity:Nt,selectedEntityReferenceActions:At,workspaceEditor:Rt,workspaceEditorField:Ot,workspaceEditorActions:Tt,selectedEntityDescription:zt,selectedEntityDescriptionMarkdown:$t,selectedEntityOwnerField:Lt,selectedEntityOwnerDropdown:Wt,selectedEntityDetailsSection:Pt,activityTimelineList:Dt,activityTimelineEmpty:Ft,visuallyHidden:Ht,entityCard:Bt,entityCardTopRow:Mt,entityCardBody:Ut,entityCardContentButton:Gt,entityCardSelected:Vt,entityCardArchived:Kt,relationshipRecovery:qt,empty:Qt,centerState:Jt,inlineError:Xt,spinner:Yt,columnPortfolio:Zt,columnActive:en,columnWorkstreams:tn,columnTasks:nn,workspaceEditorIdentity:sn};function ee({entityType:e,mode:l,initialTitle:m="",initialDescription:p="",ownerOptions:f,fixedInitiativeId:y,formId:j,showActions:C=!0,onSavingChange:b,onDirtyChange:N,onCancel:A,onSave:z}){const E=e==="initiative"?"Initiative":"Workstream",W=s.useId(),P=s.useId(),k=s.useId(),V=s.useRef(null),[D,S]=s.useState(m),[u,_]=s.useState(p),[I,R]=s.useState(""),[O,h]=s.useState(null),[g,$]=s.useState(null),[T,F]=s.useState(null),[H,L]=s.useState(null),[w,U]=s.useState(!1),x=l==="create"||Ge({title:m,description:p},{title:D,description:u});s.useEffect(()=>{N?.(x)},[x,N]),s.useEffect(()=>{V.current?.focus()},[]);const B=async c=>{if(c.preventDefault(),w)return;const a=D.trim();if(!a){F(`${E} title is required.`),V.current?.focus();return}if(x){F(null),L(null),U(!0),b?.(!0);try{await z({title:a,description:u.trim()||null,...l==="create"?{ownerId:I.trim()||null}:{},...e==="workstream"&&l==="create"?{initiativeId:y||null}:{},...l==="create"&&(O||g)?{icon:O,color:g}:{}})}catch(M){L(M instanceof Error?M.message:`Failed to save ${E.toLowerCase()}.`)}finally{U(!1),b?.(!1)}}};return t.jsxs("form",{id:j,className:i.workspaceEditor,onSubmit:c=>{B(c)},onKeyDown:c=>{c.key!=="Escape"||w||(c.preventDefault(),A())},noValidate:!0,children:[l==="create"?t.jsxs("div",{className:i.workspaceEditorIdentity,children:[t.jsx(be,{entityType:e,entityId:"create-preview",icon:O,color:g||"blue",size:"detail",onChange:c=>{Object.prototype.hasOwnProperty.call(c,"icon")&&h(c.icon??null),Object.prototype.hasOwnProperty.call(c,"color")&&$(c.color??null)}}),t.jsx("span",{children:"Choose an icon and color"})]}):null,t.jsxs("div",{className:i.workspaceEditorField,children:[t.jsxs("label",{htmlFor:W,children:[E," title"]}),t.jsx("input",{ref:V,id:W,value:D,disabled:w,required:!0,"aria-invalid":T?"true":void 0,"aria-describedby":T?P:void 0,onChange:c=>{S(c.target.value),T&&F(null)},placeholder:e==="initiative"?"Enter initiative title":"Enter workstream title"}),T?t.jsx("p",{id:P,className:"tf-text-error",children:T}):null]}),t.jsxs("div",{className:i.workspaceEditorField,children:[t.jsxs("label",{htmlFor:k,children:[E," description"]}),t.jsx("textarea",{id:k,value:u,disabled:w,rows:5,onChange:c=>_(c.target.value),placeholder:e==="initiative"?"Describe the broader outcome this initiative is meant to achieve.":"Describe the lane of work this workstream will coordinate."})]}),l==="create"&&f?t.jsxs("div",{className:i.workspaceEditorField,children:[t.jsxs("span",{children:[E," owner"]}),t.jsx(le,{value:I,options:f,onChange:R,disabled:w,ariaLabel:`${E} owner`,className:`${_e.control} ${i.selectedEntityOwnerDropdown}`})]}):null,H?t.jsx("p",{className:"tf-text-error",role:"alert",children:H}):null,C?t.jsxs("div",{className:i.workspaceEditorActions,children:[t.jsx("button",{type:"button",className:"tf-button-secondary tf-button-compact",onClick:A,disabled:w,children:"Cancel"}),t.jsxs("button",{type:"submit",className:"tf-button-primary tf-button-compact",disabled:w||!x,children:[w?t.jsx(re,{size:14,className:i.spinner,"aria-hidden":"true"}):null,l==="create"?`Create ${E}`:"Save"]})]}):null]})}function an({initiative:e,ownerOption:l,ownerOptions:m,workstreamCount:p,selected:f,onSelect:y,onChangeOwner:j,onChangeIdentity:C}){return t.jsxs("div",{className:`${i.entityCard} ${e.isArchived?i.entityCardArchived:""} ${f?i.entityCardSelected:""}`.trim(),children:[t.jsx(ce,{label:J(e),entityType:"initiative",entityName:e.title,interactive:!1}),t.jsx("div",{className:i.entityCardBody,children:t.jsx("div",{role:"button",tabIndex:0,className:i.entityCardContentButton,onClick:y,onKeyDown:b=>{b.key!=="Enter"&&b.key!==" "||(b.preventDefault(),y())},"aria-pressed":f,children:t.jsx(je,{item:e,entityType:"initiative",workstreamCount:p,ownerOption:l,ownerOptions:m,onChangeOwner:j,onChangeIdentity:C})})})]})}function we({workstream:e,ownerOption:l,ownerOptions:m,selected:p,onSelect:f,onChangeOwner:y,onChangeIdentity:j,referenceAction:C,feedback:b}){const N=G(e);return t.jsxs("div",{className:`${i.entityCard} ${e.isArchived?i.entityCardArchived:""} ${p?i.entityCardSelected:""}`.trim(),children:[t.jsxs("div",{className:i.entityCardTopRow,children:[C,t.jsx(ce,{label:N||"Reference pending",entityType:"workstream",entityName:e.title,interactive:!1,pending:!N})]}),b,t.jsx("div",{className:i.entityCardBody,children:t.jsx("div",{role:"button",tabIndex:0,className:i.entityCardContentButton,onClick:f,onKeyDown:A=>{A.key!=="Enter"&&A.key!==" "||(A.preventDefault(),f())},"aria-pressed":p,children:t.jsx(je,{item:e,entityType:"workstream",ownerOption:l,ownerOptions:m,onChangeOwner:y,onChangeIdentity:j})})})]})}function xe({item:e,entityType:l,ownerOptions:m,onChangeOwner:p,onChangeIdentity:f,workspaceId:y,currentActorId:j,taskReferences:C,hydrationState:b,onRetryHydration:N,onAddContextFile:A,onRemoveContextFile:z,onUpdateContextCaption:E,onUpdate:W,onArchive:P,onUnarchive:k,referenceAction:V,relationshipActions:D,relationshipContent:S}){const u=l==="initiative"?"Initiative":"Workstream",_=l==="initiative"?J(e):G(e),[I,R]=s.useState(String(e.ownerId||"")),[O,h]=s.useState(!1),[g,$]=s.useState(!1),[T,F]=s.useState(!1),[H,L]=s.useState(!1),[w,U]=s.useState(!1),[x,B]=s.useState(!1),c=s.useId(),a=Ve({entityType:l,isArchived:e.isArchived,taskCount:e.taskCount,completedTaskCount:e.completedTaskCount,archiveReady:e.archiveReady,activeWorkstreamCount:e.archiveActiveWorkstreamCount}),M=a.mode==="archived"?`Unarchive ${u.toLowerCase()}`:a.mode==="blocked"?`Archive unavailable — active ${a.remainingKind==="task"?"tasks":"workstreams"} remain`:a.mode==="checking"?"Archive availability is still loading":`Archive ${u.toLowerCase()}`;s.useEffect(()=>{R(String(e.ownerId||"")),h(!1)},[e.id,e.ownerId]),s.useEffect(()=>{$(!1),F(!1),L(!1),U(!1),B(!1)},[e.id]);const r=async d=>{if(!p||e.isArchived||O||d===I)return;const K=I;R(d),h(!0);try{await p(d)}catch{R(K)}finally{h(!1)}},X=async()=>{if(x)return;if(a.mode==="ready"){U(!0);return}const d=a.mode==="archived"?k:P;if(!(!d||a.mode==="blocked"||a.mode==="checking")){B(!0);try{await d()}finally{B(!1)}}},Y=async()=>{if(!(!P||x)){B(!0);try{await P()!==!1&&U(!1)}finally{B(!1)}}};return t.jsxs("section",{className:`${i.selectedEntityContext} ${e.isArchived?i.selectedEntityContextArchived:""}`.trim(),"aria-label":`Selected ${u.toLowerCase()}`,"aria-busy":b?.status==="loading",children:[t.jsxs("div",{className:i.selectedEntityReferenceRow,children:[t.jsxs("div",{className:i.selectedEntityReferenceIdentity,children:[t.jsx(be,{entityType:l,entityId:e.id,icon:e.icon,color:e.color,size:"detail",disabled:!!e.isArchived,onChange:f?d=>f(l,e.id,d):void 0}),V,t.jsx(ce,{label:_||"Reference pending",entityType:l,entityName:e.title,interactive:!1,pending:!_})]}),t.jsxs("div",{className:i.selectedEntityReferenceActions,children:[t.jsx("span",{children:u}),D,!g&&(P||k)?t.jsx("button",{type:"button",className:"tf-control-icon",disabled:x||a.mode==="blocked"||a.mode==="checking"||(a.mode==="archived"?!k:!P),onClick:()=>{X()},"aria-label":M,title:M,"aria-expanded":a.mode==="ready"?w:void 0,children:a.mode==="archived"?t.jsx(oe,{size:14,"aria-hidden":"true"}):t.jsx(it,{size:14,"aria-hidden":"true"})}):null,!g&&!e.isArchived&&W?t.jsx("button",{type:"button",className:"tf-control-icon",onClick:()=>{L(!1),$(!0)},"aria-label":`Edit ${u.toLowerCase()}`,title:`Edit ${u.toLowerCase()}`,children:t.jsx(st,{size:14,"aria-hidden":"true"})}):null,g?t.jsxs(t.Fragment,{children:[t.jsx("button",{type:"button",className:"tf-button-secondary tf-button-compact",onClick:()=>$(!1),disabled:T,children:"Cancel"}),t.jsx("button",{type:"submit",form:c,className:"tf-button-primary tf-button-compact",disabled:T||!H,children:"Save"})]}):null]})]}),w&&a.mode==="ready"?t.jsx(Ke,{entityType:l,title:e.title,activeTaskCount:e.archiveActiveTaskCount,activeWorkstreamCount:e.archiveActiveWorkstreamCount,busy:x,onCancel:()=>U(!1),onConfirm:()=>{Y()}}):null,S,g&&W?t.jsx(ee,{entityType:l,mode:"edit",formId:c,showActions:!1,onSavingChange:F,onDirtyChange:L,initialTitle:e.title,initialDescription:e.description||"",onCancel:()=>$(!1),onSave:async d=>{await W(d),$(!1)}},`${l}:${e.id}`):t.jsxs(t.Fragment,{children:[t.jsx("h3",{className:"tf-heading-card",children:e.title}),t.jsx(qe,{description:e.description,label:u,taskReferences:C,className:`${i.selectedEntityDescription} tf-scrollbar`.trim(),markdownClassName:i.selectedEntityDescriptionMarkdown})]}),t.jsxs("div",{className:i.selectedEntityOwnerField,children:[t.jsx("span",{children:"Owner"}),t.jsx(le,{value:I,options:m,onChange:d=>{r(d)},disabled:!p||!!e.isArchived||O,ariaLabel:`${u} owner`,className:`${_e.control} ${i.selectedEntityOwnerDropdown}`})]}),t.jsx("div",{className:i.selectedEntityDetailsSection,children:t.jsx(Qe,{entityType:l,entityId:e.id,referenceLabel:l==="initiative"?J(e):G(e),workspaceId:y,attachments:e.attachments,readOnly:!!e.isArchived,defaultExpanded:!1,onAddAttachment:!e.isArchived&&A?d=>A(l,e.id,d):void 0,onRemoveAttachment:!e.isArchived&&z?d=>z(l,e.id,d):void 0,onUpdateAttachmentCaption:!e.isArchived&&E?(d,K)=>E(l,e.id,d,K):void 0})}),t.jsx("div",{className:i.selectedEntityDetailsSection,children:t.jsx(Je,{entityType:l,item:e,assigneeOptions:m,currentActorId:j,taskReferences:C,defaultExpanded:!1,listClassName:i.activityTimelineList,emptyClassName:i.activityTimelineEmpty,hydrationState:b,onRetryHydration:N})})]})}function hn({model:e}){const[l,m]=s.useState(null),[p,f]=s.useState(null),[y,j]=s.useState("portfolio"),[C,b]=s.useState(""),[N,A]=s.useState("all"),[z,E]=s.useState("default"),[W,P]=s.useState(!1),[k,V]=s.useState(!1),D=e.taskArrangeMode||"execution",[S,u]=s.useState(null),[_,I]=s.useState(null),[R,O]=s.useState(null),[h,g]=s.useState(!1),$=s.useRef(null),T=s.useRef(null),F=s.useRef(null),H=s.useRef(null),L=s.useRef(null),w=s.useMemo(()=>new Map(e.assigneeOptions.filter(n=>!String(n.archivedAt||"").trim()).map(n=>[String(n.value),n])),[e.assigneeOptions]),U=s.useMemo(()=>{const n=String(e.currentOwnerId||"").trim(),o=n?ze(e.assigneeOptions,n).find(v=>v.value===n):void 0;return[{value:"all",label:"All owners",icon:"Users",color:"var(--text-secondary)",kind:"unassigned"},...n?[{...o,value:"mine",label:"Owned by me",icon:o?.icon||"User",color:o?.color||"var(--text-secondary)",kind:o?.kind||"member"}]:[],{value:"unassigned",label:"Unassigned",icon:Le,color:$e,kind:"unassigned"}]},[e.assigneeOptions,e.currentOwnerId]),x=s.useMemo(()=>We({initiatives:e.initiatives,standaloneWorkstreams:e.standaloneWorkstreams,showArchivedPlanning:k,searchQuery:C,ownerFilter:N,currentOwnerId:String(e.currentOwnerId||""),sort:z}),[e.currentOwnerId,e.initiatives,e.standaloneWorkstreams,N,C,k,z]),B=s.useMemo(()=>x.initiatives.map(({initiative:n})=>n),[x.initiatives]),c=x.standaloneWorkstreams,a=s.useMemo(()=>e.initiatives.find(n=>n.id===l)??null,[e.initiatives,l]),M=s.useMemo(()=>[...e.initiatives.flatMap(n=>n.allWorkstreams??n.workstreams),...e.standaloneWorkstreams],[e.initiatives,e.standaloneWorkstreams]),r=s.useMemo(()=>M.find(n=>n.id===p)??null,[M,p]),X=a?(a.allWorkstreams??a.workstreams).filter(n=>k||!n.isArchived):r&&!r.initiativeId?[r]:[],Y=s.useMemo(()=>ye((r?.tasks??[]).filter(n=>k||!n.isArchived),D),[r?.tasks,k,D]),d=s.useMemo(()=>new Set((a?.allWorkstreams??a?.workstreams??[]).map(n=>n.id)),[a]),K=s.useMemo(()=>new Set((r?.tasks??[]).map(n=>n.id)),[r]),Ce=s.useMemo(()=>e.linkOptions.workstreams.filter(n=>!d.has(n.id)),[d,e.linkOptions.workstreams]),Ee=s.useMemo(()=>e.linkOptions.tasks.filter(n=>!K.has(n.id)),[K,e.linkOptions.tasks]),q=r?"workstream":a?"initiative":null,Q=r?.id||a?.id||null,de=q&&Q?e.hydrationStateByEntity?.[`${q}:${Q}`]:void 0,ue=s.useMemo(()=>e.initiatives.some(o=>o.isArchived)?!0:[...e.initiatives.flatMap(o=>o.allWorkstreams??o.workstreams),...e.standaloneWorkstreams].some(o=>o.isArchived||(o.tasks??[]).some(v=>v.isArchived)),[e.initiatives,e.standaloneWorkstreams]);s.useEffect(()=>{const n=L.current;if(n){if(n.entityType==="initiative"){if(!e.initiatives.some(o=>o.id===n.entityId))return;L.current=null,m(n.entityId),f(null),H.current="workstreams",j("workstreams");return}M.some(o=>o.id===n.entityId)&&(L.current=null,m(n.initiativeId||null),f(n.entityId),H.current="tasks",j("tasks"))}},[M,e.initiatives]),s.useEffect(()=>{l&&!a&&(m(null),f(null),j("portfolio"))},[a,l]),s.useEffect(()=>{p&&!r&&(f(null),j(a?"workstreams":"portfolio"))},[a,r,p]),s.useEffect(()=>{!e.hydrateEntity||!q||!Q||e.hydrateEntity(q,Q)},[e.hydrateEntity,Q,q]),s.useEffect(()=>{I(null),O(null),g(!1)},[Q,q]),s.useLayoutEffect(()=>{if(H.current!==y)return;(y==="portfolio"?$.current:y==="workstreams"?T.current:F.current)?.focus({preventScroll:!0}),H.current=null},[y]);const Z=n=>{if(n===y){(n==="portfolio"?$.current:n==="workstreams"?T.current:F.current)?.focus({preventScroll:!0});return}H.current=n,j(n)},Se=n=>{m(n),f(null),Z("workstreams")},he=n=>{n.initiativeId||m(null),f(n.id),Z("tasks")},Ie=()=>{Z(a?"workstreams":"portfolio")},Ne=x.hasCriteria||z!=="default",Ae=()=>{b(""),A("all"),E("default")},te=async n=>{if(!S||!e.createEntity)return;const o=await e.createEntity(S.entityType,n);L.current={entityType:S.entityType,entityId:o.id,initiativeId:S.initiativeId},u(null)},ve=async(n,o)=>{if(h)return;const v=n==="workstream"?e.attachWorkstreamToInitiative:e.attachTaskToWorkstream,fe=n==="workstream"?a?.id:r?.id;if(!(!v||!fe)){g(!0);try{await v(fe,o.referenceLabel)}finally{g(!1)}}},Re=async n=>{if(!(!r||!e.assignWorkstreamToInitiative||h)){g(!0);try{await e.assignWorkstreamToInitiative(r.id,n.referenceLabel)!==!1&&m(n.id)}finally{g(!1)}}},Oe=async()=>{if(!(!_||h)){g(!0);try{if(_.entityType==="workstream"){if(!e.assignWorkstreamToInitiative)return;const n=a?J(a):null;if(await e.assignWorkstreamToInitiative(_.id,null)===!1)return;O({pane:_.id===r?.id?"tasks":"workstreams",message:`${_.referenceLabel} removed from its initiative.`,onUndo:async()=>{if(!n)return;await e.assignWorkstreamToInitiative?.(_.id,n)!==!1&&O(null)}})}else{if(!e.assignTaskToWorkstream||!r)return;const n=r.id;if(await e.assignTaskToWorkstream(_.id,null)===!1)return;O({pane:"tasks",message:`${_.referenceLabel} removed from this workstream.`,onUndo:async()=>{await e.assignTaskToWorkstream?.(_.id,n)!==!1&&O(null)}})}I(null)}finally{g(!1)}}},Te=async()=>{if(!(!R||h)){g(!0);try{await R.onUndo()}finally{g(!1)}}},pe=R?t.jsxs("div",{className:i.relationshipRecovery,role:"status",children:[t.jsx("span",{children:R.message}),t.jsx("button",{type:"button",className:"tf-button-ghost tf-button-compact",disabled:h,onClick:()=>{Te()},children:h?"Restoring…":"Undo"})]}):null;return e.loadState.status==="loading"&&e.initiatives.length===0&&e.standaloneWorkstreams.length===0?t.jsxs("main",{className:i.centerState,"aria-busy":"true","aria-label":"Loading planning workspace",children:[t.jsx(re,{size:22,className:i.spinner}),t.jsx("span",{children:"Loading planning…"})]}):e.loadState.status==="error"&&e.initiatives.length===0&&e.standaloneWorkstreams.length===0?t.jsxs("main",{className:i.centerState,role:"alert",children:[t.jsx(ke,{size:22}),t.jsx("strong",{children:"Planning could not be loaded."}),t.jsx("span",{children:e.loadState.error}),t.jsxs("button",{type:"button",className:"tf-button-secondary tf-button-compact",onClick:e.retry,disabled:e.loadState.isRefreshing,children:[e.loadState.isRefreshing?t.jsx(re,{size:15,className:i.spinner}):t.jsx(oe,{size:15}),"Retry"]})]}):t.jsxs("main",{className:i.module,"aria-label":"Planning workspace","aria-busy":e.loadState.isRefreshing,children:[e.loadState.isRefreshing?t.jsx("span",{className:i.visuallyHidden,role:"status","aria-live":"polite",children:"Refreshing planning"}):null,(e.loadState.status==="partial"||e.loadState.status==="error")&&t.jsxs("div",{className:i.inlineError,role:"alert",children:[t.jsx(ke,{size:16}),t.jsx("span",{children:e.loadState.error||"Some planning information could not be loaded."}),t.jsx("button",{type:"button",className:"tf-button-secondary tf-button-compact",onClick:e.retry,children:"Retry"})]}),t.jsxs("div",{className:i.columns,"data-active-pane":y,children:[t.jsxs("section",{className:`${i.column} ${i.columnPortfolio} ${y==="portfolio"?i.columnActive:""}`.trim(),"aria-labelledby":"planning-portfolio-heading",children:[t.jsxs("div",{className:i.columnHeader,children:[t.jsx("h2",{ref:$,id:"planning-portfolio-heading",className:`tf-heading-section ${i.paneHeading}`,tabIndex:-1,children:"Portfolio"}),t.jsxs("div",{className:i.headerActions,children:[t.jsx("span",{children:B.length+c.length}),t.jsx("button",{type:"button",className:`tf-control-icon ${k?i.controlActive:""}`.trim(),onClick:()=>V(n=>!n),disabled:!ue,"aria-label":k?"Hide archived planning items":"Show archived planning items","aria-pressed":k,title:ue?k?"Hide archived planning items":"Show archived planning items":"No archived planning items",children:k?t.jsx(Xe,{size:15,"aria-hidden":"true"}):t.jsx(Ye,{size:15,"aria-hidden":"true"})})]})]}),t.jsxs("div",{className:i.portfolioControls,children:[t.jsxs("div",{className:i.searchRow,children:[t.jsxs("div",{className:i.searchShell,children:[t.jsx(Ze,{size:14,"aria-hidden":"true"}),t.jsx("input",{type:"search",value:C,onChange:n=>b(n.target.value),placeholder:"Search initiatives and workstreams","aria-label":"Search planning"}),C?t.jsx("button",{type:"button",className:i.clearSearch,onClick:()=>b(""),"aria-label":"Clear planning search",title:"Clear search",children:t.jsx(et,{size:13,"aria-hidden":"true"})}):null]}),t.jsx("button",{type:"button",className:`tf-control-icon ${W||N!=="all"||z!=="default"?i.controlActive:""}`.trim(),"aria-label":"Filter and sort planning",title:"Filter and sort planning","aria-expanded":W,"aria-controls":"planning-workspace-navigator-options",onClick:()=>P(n=>!n),children:t.jsx(tt,{size:15,"aria-hidden":"true"})})]}),W?t.jsxs("div",{id:"planning-workspace-navigator-options",className:i.filterPanel,children:[t.jsxs("div",{className:i.filterField,children:[t.jsx("span",{className:i.filterLabel,children:"Owner"}),t.jsx(le,{value:N,options:e.assigneeOptions,leadingOptions:U,includeUnassigned:!1,onChange:A,disabled:!1,ariaLabel:"Filter planning by owner",className:i.filterDropdown})]}),t.jsxs("div",{className:i.filterField,children:[t.jsx("span",{className:i.filterLabel,children:"Sort"}),t.jsx(Pe,{value:z,options:ge,onChange:n=>E(String(n)),ariaLabel:"Sort planning",className:i.filterDropdown,portalPanel:!0,panelAlign:"start",triggerContent:t.jsxs("span",{className:i.sortTrigger,children:[t.jsx(nt,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:ge.find(n=>n.value===z)?.label})]}),renderOptionContent:n=>n.label})]}),t.jsx("button",{type:"button",className:"tf-control-icon",onClick:Ae,disabled:!Ne,"aria-label":"Reset planning filters and sort",title:"Reset planning filters and sort",children:t.jsx(oe,{size:14,"aria-hidden":"true"})})]}):null]}),t.jsxs("div",{className:i.scrollRegion,children:[t.jsxs("div",{className:i.sectionHeadingRow,children:[t.jsx("h3",{className:`tf-heading-section ${i.sectionLabel}`,children:"Initiatives"}),e.createEntity?t.jsx("button",{type:"button",className:"tf-control-icon",onClick:()=>u({entityType:"initiative"}),"aria-label":"Create initiative",title:"Create initiative",children:t.jsx(se,{size:15,"aria-hidden":"true"})}):null]}),S?.entityType==="initiative"?t.jsx(ee,{entityType:"initiative",mode:"create",ownerOptions:e.assigneeOptions,onCancel:()=>u(null),onSave:te}):null,x.initiatives.map(({initiative:n,workstreams:o})=>t.jsx(an,{initiative:n,workstreamCount:o.length,ownerOption:n.ownerId?w.get(n.ownerId):void 0,ownerOptions:e.assigneeOptions,selected:l===n.id,onSelect:()=>Se(n.id),onChangeOwner:e.changeOwner?v=>e.changeOwner?.("initiative",n.id,v==="unassigned"?"":v):void 0,onChangeIdentity:e.changeIdentity?v=>e.changeIdentity?.("initiative",n.id,v):void 0},n.id)),t.jsxs("div",{className:i.sectionHeadingRow,children:[t.jsx("h3",{className:`tf-heading-section ${i.sectionLabel}`,children:"Standalone workstreams"}),e.createEntity?t.jsx("button",{type:"button",className:"tf-control-icon",onClick:()=>u({entityType:"workstream",initiativeId:null}),"aria-label":"Create standalone workstream",title:"Create standalone workstream",children:t.jsx(se,{size:15,"aria-hidden":"true"})}):null]}),S?.entityType==="workstream"&&!S.initiativeId?t.jsx(ee,{entityType:"workstream",mode:"create",ownerOptions:e.assigneeOptions,fixedInitiativeId:null,onCancel:()=>u(null),onSave:te}):null,c.map(n=>t.jsx(we,{workstream:n,ownerOption:n.ownerId?w.get(n.ownerId):void 0,ownerOptions:e.assigneeOptions,selected:p===n.id,onSelect:()=>he(n),onChangeOwner:e.changeOwner?o=>e.changeOwner?.("workstream",n.id,o==="unassigned"?"":o):void 0,onChangeIdentity:e.changeIdentity?o=>e.changeIdentity?.("workstream",n.id,o):void 0},n.id)),B.length===0&&c.length===0&&t.jsx("p",{className:`tf-text-helper ${i.empty}`,children:x.hasCriteria?"No planning matches.":"No planning items yet."})]})]}),t.jsxs("section",{className:`${i.column} ${i.columnWorkstreams} ${y==="workstreams"?i.columnActive:""}`.trim(),"aria-labelledby":"planning-workstreams-heading",children:[t.jsxs("div",{className:i.columnHeader,children:[t.jsxs("div",{className:i.columnHeadingGroup,children:[t.jsx("button",{type:"button",className:`tf-control-icon ${i.responsiveBack}`.trim(),onClick:()=>Z("portfolio"),"aria-label":"Back to Portfolio",title:"Back to Portfolio",children:t.jsx(me,{size:15,"aria-hidden":"true"})}),t.jsxs("h2",{ref:T,id:"planning-workstreams-heading",className:`tf-heading-section ${i.paneHeading}`,tabIndex:-1,children:["Workstreams (",X.length,")"]})]}),t.jsx("div",{className:i.headerActions,children:a&&e.createEntity?t.jsx("button",{type:"button",className:"tf-control-icon",onClick:()=>u({entityType:"workstream",initiativeId:a.id}),"aria-label":`Create workstream in ${a.title}`,title:"Create workstream",children:t.jsx(se,{size:15,"aria-hidden":"true"})}):null})]}),t.jsxs("div",{className:i.scrollRegion,children:[a?t.jsxs(t.Fragment,{children:[t.jsx(xe,{item:a,entityType:"initiative",ownerOptions:e.assigneeOptions,onChangeOwner:e.changeOwner?n=>e.changeOwner?.("initiative",a.id,n):void 0,onChangeIdentity:e.changeIdentity,workspaceId:e.currentWorkspaceId,currentActorId:e.currentOwnerId,taskReferences:e.taskReferences,hydrationState:r?void 0:de,onRetryHydration:e.hydrateEntity?()=>{e.hydrateEntity?.("initiative",a.id)}:void 0,onAddContextFile:e.addContextFile,onRemoveContextFile:e.removeContextFile,onUpdateContextCaption:e.updateContextCaption,onUpdate:e.updateEntity?n=>e.updateEntity("initiative",a.id,n):void 0,onArchive:e.archiveEntity?()=>e.archiveEntity("initiative",a.id):void 0,onUnarchive:e.unarchiveEntity?()=>e.unarchiveEntity("initiative",a.id):void 0}),t.jsx(ne,{options:Ce,entityLabel:"workstream",onSelect:n=>ve("workstream",n),disabled:!e.attachWorkstreamToInitiative||h})]}):null,S?.entityType==="workstream"&&S.initiativeId===a?.id?t.jsx(ee,{entityType:"workstream",mode:"create",ownerOptions:e.assigneeOptions,fixedInitiativeId:a.id,onCancel:()=>u(null),onSave:te}):null,X.map(n=>t.jsx(we,{workstream:n,ownerOption:n.ownerId?w.get(n.ownerId):void 0,ownerOptions:e.assigneeOptions,selected:p===n.id,onSelect:()=>he(n),onChangeOwner:e.changeOwner?o=>e.changeOwner?.("workstream",n.id,o==="unassigned"?"":o):void 0,onChangeIdentity:e.changeIdentity?o=>e.changeIdentity?.("workstream",n.id,o):void 0,referenceAction:a?t.jsx(ie,{disabled:!e.assignWorkstreamToInitiative||h,onClick:()=>I({entityType:"workstream",id:n.id,referenceLabel:G(n),title:n.title,parentLabel:a?`${J(a)} ${a.title}`.trim():"its initiative"}),title:`Unlink ${G(n)||n.title} from initiative`,ariaLabel:`Unlink ${G(n)||n.title} from initiative`,children:t.jsx(ae,{size:14,"aria-hidden":"true"})}):void 0},n.id)),a&&R?.pane==="workstreams"?pe:null,X.length===0&&t.jsx("p",{className:`tf-text-helper ${i.empty}`,children:"Select an initiative or standalone workstream."})]})]}),t.jsxs("section",{className:`${i.column} ${i.columnTasks} ${y==="tasks"?i.columnActive:""}`.trim(),"aria-labelledby":"planning-tasks-heading",children:[t.jsx("div",{className:i.columnHeader,children:t.jsxs("div",{className:i.columnHeadingGroup,children:[t.jsx("button",{type:"button",className:`tf-control-icon ${i.responsiveBack}`.trim(),onClick:Ie,"aria-label":a?"Back to Workstreams":"Back to Portfolio",title:a?"Back to Workstreams":"Back to Portfolio",children:t.jsx(me,{size:15,"aria-hidden":"true"})}),t.jsxs("h2",{ref:F,id:"planning-tasks-heading",className:`tf-heading-section ${i.paneHeading}`,tabIndex:-1,children:["Tasks (",Y.length,")"]})]})}),t.jsxs("div",{className:i.scrollRegion,children:[r?t.jsxs(t.Fragment,{children:[t.jsx(xe,{item:r,entityType:"workstream",ownerOptions:e.assigneeOptions,onChangeOwner:e.changeOwner?n=>e.changeOwner?.("workstream",r.id,n):void 0,workspaceId:e.currentWorkspaceId,currentActorId:e.currentOwnerId,taskReferences:e.taskReferences,hydrationState:de,onRetryHydration:e.hydrateEntity?()=>{e.hydrateEntity?.("workstream",r.id)}:void 0,onAddContextFile:e.addContextFile,onRemoveContextFile:e.removeContextFile,onUpdateContextCaption:e.updateContextCaption,onUpdate:e.updateEntity?n=>e.updateEntity("workstream",r.id,n):void 0,onArchive:e.archiveEntity?()=>e.archiveEntity("workstream",r.id):void 0,onUnarchive:e.unarchiveEntity?()=>e.unarchiveEntity("workstream",r.id):void 0,referenceAction:r.initiativeId?t.jsx(ie,{disabled:!e.assignWorkstreamToInitiative||h,onClick:()=>{I({entityType:"workstream",id:r.id,referenceLabel:G(r),title:r.title,parentLabel:a?`${J(a)} ${a.title}`.trim():"its initiative"})},title:"Unlink workstream from initiative",ariaLabel:"Unlink workstream from initiative",children:t.jsx(ae,{size:14,"aria-hidden":"true"})}):t.jsx(ne,{options:e.linkOptions.initiatives,entityLabel:"initiative",onSelect:Re,disabled:!e.assignWorkstreamToInitiative||h,iconTrigger:!0,triggerTitle:"Link initiative"})}),t.jsx(ne,{options:Ee,entityLabel:"task",onSelect:n=>ve("task",n),disabled:!e.attachTaskToWorkstream||h}),e.setTaskArrangeMode?t.jsx(De,{value:D,onChange:e.setTaskArrangeMode}):null]}):null,t.jsx(Fe,{tasks:Y,mode:D,onReorder:r&&e.reorderWorkstreamTasks?n=>e.reorderWorkstreamTasks?.(r.id,Me(ye(r.tasks??[],"execution"),n)):void 0,children:n=>{const o=He(n);return t.jsx(Be,{task:n,assigneeOption:n.assignee?w.get(n.assignee):void 0,assigneeOptions:e.assigneeOptions,showStatusLabel:e.showTaskCardStatusLabel,onOpen:()=>e.openTask(n.id),onAssigneeChange:e.setTaskAssignee?v=>e.setTaskAssignee?.(n.id,v):void 0,onStatusChange:e.setTaskStatus?v=>e.setTaskStatus?.(n.id,v):void 0,referenceInteractive:!1,referenceAction:t.jsx(ie,{disabled:!e.assignTaskToWorkstream||h,onClick:v=>{v.stopPropagation(),I({entityType:"task",id:n.id,referenceLabel:o||n.id,title:n.title,parentLabel:r?`${G(r)} ${r.title}`.trim():"its workstream"})},title:`Unlink ${o||n.title} from workstream`,ariaLabel:`Unlink ${o||n.title} from workstream`,children:t.jsx(ae,{size:14,"aria-hidden":"true"})})},n.id)}}),r&&R?.pane==="tasks"?pe:null,!r&&t.jsx("p",{className:`tf-text-helper ${i.empty}`,children:"Select a workstream."}),r&&Y.length===0&&t.jsx("p",{className:`tf-text-helper ${i.empty}`,children:"No tasks are linked to this workstream."})]})]})]}),t.jsx(Ue,{item:_,busy:h,theme:e.theme,onCancel:()=>I(null),onConfirm:()=>{Oe()}})]})}export{hn as PlanningModule};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as s,j as e}from"./vendor-react-CKJs5o3c.js";import{aO as ye,t as Oe,aP as Ke,aQ as ke,aR as ge,aS as he,aT as He,aU as qe}from"./index-DSQINwt9.js";import{bn as ze,w as Ye,K as We}from"./vendor-icons-Bsq-mcEn.js";import{u as Ge,a as Qe}from"./vendor-router-AqJMU8Lz.js";import"./vendor-markdown-_lhNCyq-.js";import"./vendor-dnd-CJ-AjP-Y.js";const Je="_plansWrapper_ojftl_1",Xe="_contentFrame_ojftl_24",Ze="_shellOwnsScroll_ojftl_32",et="_withChrome_ojftl_38",tt="_siteVariant_ojftl_42",nt="_title_ojftl_56",rt="_subtitle_ojftl_71",at="_header_ojftl_78",it="_planCard_ojftl_93",st="_grid_ojftl_106",ot="_pricingNotes_ojftl_114",ct="_planName_ojftl_123",lt="_featureText_ojftl_130",ut="_currentBadge_ojftl_134",dt="_navAction_ojftl_138",mt="_backBtn_ojftl_139",pt="_priceRows_ojftl_150",ft="_foundingBeta_ojftl_154",gt="_cloudCapacityNote_ojftl_176",ht="_headerBar_ojftl_258",yt="_headerActions_ojftl_267",_t="_debugMeta_ojftl_318",Ct="_planNoticeCard_ojftl_381",bt="_planDescription_ojftl_392",St="_teamComingSoonCard_ojftl_397",jt="_clickablePlanCard_ojftl_416",wt="_activePlanCard_ojftl_431",vt="_callToAction_ojftl_495",xt="_primaryCta_ojftl_507",Nt="_secondaryCta_ojftl_518",kt="_currentCta_ojftl_530",Pt="_featuresList_ojftl_544",It="_priceRow_ojftl_150",At="_regularPriceLine_ojftl_568",Tt="_campaignPriceLine_ojftl_569",Lt="_priceRowWithCampaign_ojftl_576",Rt="_priceRowAmount_ojftl_580",Et="_regularPriceDiscounted_ojftl_586",Bt="_priceRowInterval_ojftl_592",$t="_campaignPriceLabel_ojftl_601",Mt="_campaignPriceAmount_ojftl_606",Ut="_campaignPriceInterval_ojftl_612",Dt="_ctaRow_ojftl_617",Ft="_featureItem_ojftl_623",Vt="_featureIcon_ojftl_629",Ot="_featureLimitAccent_ojftl_643",Kt="_featureLimitUnit_ojftl_654",Ht="_featureTextBlock_ojftl_660",qt="_featureDescription_ojftl_666",zt="_emptyState_ojftl_672",Yt="_marketingEmptyState_ojftl_681",Wt="_emptyBadge_ojftl_715",Gt="_emptyHighlights_ojftl_730",Qt="_loader_ojftl_752",Jt="_spinner_ojftl_762",Xt="_statusBanner_ojftl_815",Zt="_successBanner_ojftl_823",en="_infoBanner_ojftl_829",tn="_errorBanner_ojftl_835",r={plansWrapper:Je,contentFrame:Xe,shellOwnsScroll:Ze,withChrome:et,siteVariant:tt,title:nt,subtitle:rt,header:at,planCard:it,grid:st,pricingNotes:ot,planName:ct,featureText:lt,currentBadge:ut,navAction:dt,backBtn:mt,priceRows:pt,foundingBeta:ft,cloudCapacityNote:gt,headerBar:ht,headerActions:yt,debugMeta:_t,planNoticeCard:Ct,planDescription:bt,teamComingSoonCard:St,clickablePlanCard:jt,activePlanCard:wt,callToAction:vt,primaryCta:xt,secondaryCta:Nt,currentCta:kt,featuresList:Pt,priceRow:It,regularPriceLine:At,campaignPriceLine:Tt,priceRowWithCampaign:Lt,priceRowAmount:Rt,regularPriceDiscounted:Et,priceRowInterval:Bt,campaignPriceLabel:$t,campaignPriceAmount:Mt,campaignPriceInterval:Ut,ctaRow:Dt,featureItem:Ft,featureIcon:Vt,featureLimitAccent:Ot,featureLimitUnit:Kt,featureTextBlock:Ht,featureDescription:qt,emptyState:zt,marketingEmptyState:Yt,emptyBadge:Wt,emptyHighlights:Gt,loader:Qt,spinner:Jt,statusBanner:Xt,successBanner:Zt,infoBanner:en,errorBanner:tn};function nn(){const t=globalThis.__DEBUG_MODE__;return typeof t=="boolean"?t:!1}function rn(t){const a=String(t?.environment||"").trim(),c=String(t?.runtimeMode||"").trim();return!a&&!c?null:a&&c?`${a} (${c})`:a||c||null}const an=new Set(["a","b","br","em","i","li","ol","p","strong","u","ul"]);function sn(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function on(t){const a=String(t||"").trim();if(!a)return"";if(typeof document>"u")return sn(a);const c=document.createElement("template");c.innerHTML=a;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,P=E.tagName.toLowerCase();if(P==="script"||P==="style")return null;const $=Array.from(E.childNodes).map(l).filter(h=>!!h);if(!an.has(P)){const h=document.createDocumentFragment();for(const W of $)h.appendChild(W);return h}const v=document.createElement(P);if(P==="a"){const h=String(E.getAttribute("href")||"").trim();/^(https?:|mailto:|\/|#)/i.test(h)&&(v.setAttribute("href",h),v.setAttribute("rel","noopener noreferrer"))}for(const h of $)v.appendChild(h);return v};for(const C of Array.from(c.content.childNodes)){const E=l(C);E&&p.appendChild(E)}return p.innerHTML}function cn(t,a){if(t==null||!a)return"Contact Sales";try{return new Intl.NumberFormat("en-US",{style:"currency",currency:a.toUpperCase(),minimumFractionDigits:0}).format(t/100)}catch{return`${a.toUpperCase()} ${t/100}`}}function ln(){return"$0"}function O(t){return t?t.pricingType==="free"?!0:t.unitAmount!=null&&t.currency!=null:!1}function Te(t){return t?t.pricingType==="free"?ln():cn(t.unitAmount,t.currency):"Unavailable"}function Le(t,a){return O(a)?{price:a,pricingAudience:"campaign"}:{price:t,pricingAudience:"public"}}function un(t,a,c,p){const l=O(t)||O(c),C=O(a)||O(p);if(!l&&!C)return null;const E=(P,$,v)=>{if(!O(P)&&!O($))return null;const h=O($),W=v==="year"?"year":"month";return e.jsxs("div",{className:`${r.priceRow} ${h?r.priceRowWithCampaign:""}`,children:[O(P)?e.jsxs("div",{className:r.regularPriceLine,children:[e.jsx("span",{className:`${r.priceRowAmount} ${h?r.regularPriceDiscounted:""}`,children:Te(P)}),e.jsxs("span",{className:r.priceRowInterval,children:["/ ",W]})]}):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:["/ ",W]})]}):null]},v)};return e.jsxs("div",{className:r.priceRows,children:[E(t,c,"month"),E(a,p,"year")]})}function Re(t){const a=[t.pricing.month,t.pricing.year].filter(Boolean);if(a.some(p=>p.pricingType==="free"))return 0;const c=a.map(p=>p.pricingType==="stripe"&&typeof p.unitAmount=="number"?p.unitAmount:null).filter(p=>p!=null);return c.length>0?Math.min(...c):Number.POSITIVE_INFINITY}function dn(t){return String(t||"").replace(/[_\-.]+/g," ").replace(/\b\w/g,a=>a.toUpperCase())}function Pe(t,a){const c=t?.[a],p=Number(c);return Number.isFinite(p)?Math.max(1,Math.floor(p)):null}const Ee="Unlimited";function we(t,a){return a!==1?t:t.replace(/\b([A-Za-z]+)ies\b$/,"$1y").replace(/\b([A-Za-z]+[^s\s])s\b$/,"$1")}function mn(t){return t<=1e3?{value:String(t),unit:"MB"}:{value:String(Math.round(t/1e3)),unit:"GB"}}function pn(t,a){const c=String(t.publicLabel||t.label||"").trim()||dn(t.featureKey),p=t.config&&typeof t.config=="object"?t.config:{};if(t.featureKey==="context.uploads"){const l=Pe(p,"storageLimitMb");if(l!==null){const C=mn(l);return{limitValue:C.value,limitUnit:C.unit,baseLabel:we(c,l)}}}if(t.featureKey==="workspace.workspaces"){const l=Pe(p,"maxWorkspaces");if(l!==null)return{limitValue:String(l),limitUnit:null,baseLabel:we(c,l)};if(t.access!=="disabled")return{limitValue:Ee,limitUnit:null,baseLabel:c}}if(t.featureKey==="collaboration.ai_profiles"){const l=Pe(p,"maxAiProfiles");if(l!==null)return{limitValue:String(l),limitUnit:null,baseLabel:we(c,l)};if(t.access!=="disabled")return{limitValue:Ee,limitUnit:null,baseLabel:c}}if(t.featureKey==="collaboration.team_management"){const l=Number(a);if(Number.isFinite(l)&&l>0){const C=Math.floor(l);return{limitValue:String(C),limitUnit:null,baseLabel:we(c,C)}}}return{limitValue:null,limitUnit:null,baseLabel:c}}function fn({heading:t,subtitle:a,variant:c="app",theme:p="dark",chrome:l,footer:C,isAuthenticated:E,authSessionResolved:P=!0,currentPlanId:$,currentPlanVersionId:v,currentEntitlementState:h,markCurrentPlan:W,canManageCurrentPlan:G=!0,pricingEndpoint:I,statusBanner:H,onBack:A,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:q}){const[Z,Q]=s.useState([]),[oe,F]=s.useState(null),[x,L]=s.useState({pageTitle:null,pageDescription:null}),[ce,z]=s.useState(!0),[le,ue]=s.useState(null),[Se,ee]=s.useState(0);s.useEffect(()=>{let i=!0;return(async()=>{const D=String(I||"/api/taskforce/public/pricing").trim()||"/api/taskforce/public/pricing";i&&(z(!0),ue(null));try{const w=await fetch(D,{method:"GET",credentials:"include"}),u=await w.json().catch(()=>({}));if(w.ok){i&&(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 (${w.status})`))}catch(w){if(i){const u=w instanceof Error?w.message:"Failed to load pricing";ue(u||"Failed to load pricing"),F(null),L({pageTitle:null,pageDescription:null})}}finally{i&&z(!1)}})(),()=>{i=!1}},[I,Se]);const J=s.useMemo(()=>[...Z].sort((i,U)=>{const D=Re(i),w=Re(U);if(D!==w)return D-w;const u=i.defaultVersion?.versionNumber||0,V=U.defaultVersion?.versionNumber||0;return u!==V?u-V:String(i.displayName||i.planId).localeCompare(String(U.displayName||U.planId))}),[Z]),de=s.useMemo(()=>rn(oe||g),[g,oe]),ve=String((Ce?x.pageTitle:null)||t).trim()||t,me=String(x.pageDescription||a||"").trim(),j=s.useMemo(()=>on(me),[me]),te=P,pe=`${r.plansWrapper} ${_e?r.shellOwnsScroll:"tf-scrollbar"} ${c==="site"?r.siteVariant:""} ${l?r.withChrome:""}`.trim(),B=i=>_e?e.jsxs(e.Fragment,{children:[l,i,C]}):e.jsxs("div",{className:Oe.standaloneWrapper,"data-theme":p,children:[l,i,C]});return B(ce?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(i=>i+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:A,disabled:M,children:T}):null}),e.jsx("div",{className:r.headerActions,children:se})]}),e.jsx("h1",{className:r.title,children:ve}),j&&e.jsx("div",{className:r.subtitle,dangerouslySetInnerHTML:{__html:j}}),nn()&&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(i=>{const U=i.pricing.month,D=i.pricing.year,w=i.campaignPricing?.month||null,u=i.campaignPricing?.year||null,V=Le(U,w),K=Le(D,u),Y=O(V.price),ae=O(K.price),ie=Y&&ae,N=String(i.defaultVersion?.planVersionId||"").trim(),xe=ye(h),fe=W??xe,Ne=!!(N&&v&&v===N)||!!(!v&&($&&$===i.planId)),ne=fe&&Ne&&h!=="canceled",n=Y?"month":ae?"year":null,o=n==="year"?K:V,_=be==="manage",f=be==="indicator",y=te&&!!N&&(ne?_&&G:!!n),m=()=>{if(N){if(ne){if(!_||!G)return;q({planId:i.planId,planVersionId:N,interval:n||"month",pricingType:o.price?.pricingType||"stripe",pricingAudience:o.pricingAudience,isCurrentPlan:!0});return}n&&q({planId:i.planId,planVersionId:N,interval:n,pricingType:o.price?.pricingType||"stripe",pricingAudience:o.pricingAudience,isCurrentPlan:!1})}};return e.jsxs("div",{className:`${r.planCard} ${ne?r.activePlanCard:""} ${y?r.clickablePlanCard:""}`,"data-testid":`plan-card-${i.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:[ne&&e.jsx("span",{className:r.currentBadge,children:"Current Plan"}),e.jsx("h3",{className:r.planName,children:i.displayName}),un(U,D,w,u),String(i.description||"").trim()&&e.jsx("p",{className:r.planDescription,children:String(i.description||"").trim()}),e.jsx("div",{className:r.featuresList,children:Array.isArray(i.features)&&i.features.length>0?i.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:k,limitUnit:b,baseLabel:R}=pn(d,i.defaultVersion?.seatLimit);return e.jsxs("span",{className:r.featureText,children:[k&&e.jsxs("span",{className:r.featureLimitAccent,children:[e.jsx("span",{children:k}),b?e.jsx("span",{className:r.featureLimitUnit,children:b}):null]}),e.jsx("span",{children:k?` ${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"})}),ne?_?e.jsx("button",{className:`${r.callToAction} ${r.currentCta}`,"data-testid":`plan-manage-${i.planId}`,onClick:d=>{d.stopPropagation(),G&&q({planId:i.planId,planVersionId:N,interval:n||"month",pricingType:o.price?.pricingType||"stripe",pricingAudience:o.pricingAudience,isCurrentPlan:!0})},disabled:!N||!G||!te,children:E&&G?"Manage Plan":"Current Plan"}):f?e.jsx("button",{className:`${r.callToAction} ${r.currentCta}`,"data-testid":`plan-current-${i.planId}`,disabled:!0,children:"Current Plan"}):null:e.jsxs("div",{className:r.ctaRow,children:[Y?e.jsx("button",{className:`${r.callToAction} ${r.secondaryCta}`,"data-testid":`plan-select-${i.planId}-month`,onClick:d=>{d.stopPropagation(),q({planId:i.planId,planVersionId:N,interval:"month",pricingType:V.price?.pricingType||"stripe",pricingAudience:V.pricingAudience,isCurrentPlan:!1})},disabled:!N||!te,children:ie?"Start Monthly":"Get Started"}):null,ae?e.jsx("button",{className:`${r.callToAction} ${r.primaryCta}`,"data-testid":`plan-select-${i.planId}-year`,onClick:d=>{d.stopPropagation(),q({planId:i.planId,planVersionId:N,interval:"year",pricingType:K.price?.pricingType||"stripe",pricingAudience:K.pricingAudience,isCurrentPlan:!1})},disabled:!N||!te,children:ie?"Start Yearly":"Get Started"}):null]})]},i.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("p",{children:["Contact ",e.jsx("a",{href:"mailto:support@taskforcehq.ai",children:"support@taskforcehq.ai"})," to discuss capacity needs."]})]}),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 gn=1600,Be=[0,500,1e3,2e3],hn=5e3,yn=45e3,_n="Choose a plan to continue.";function Cn(t,a){if(t===401)return!0;const c=String(a||"").trim().toUpperCase();return c==="CHECKOUT_SESSION_INCOMPLETE"||c==="CHECKOUT_PLAN_VERSION_UNRESOLVED"}function bn(t){return t==="year"?"year":"month"}function Sn(t){return t==="campaign"?"campaign":"public"}function Ie(t){const a=String(t||"").trim().toLowerCase();return a==="year"?"year":a==="month"?"month":null}function $e(t){const a=String(t||"").trim();return a?a.replace(/\/+$/,""):""}function Ae(t={}){const a=new URLSearchParams;a.set("screen","plans");for(const[c,p]of Object.entries(t)){const l=String(p||"").trim();l&&a.set(c,l)}return`/?${a.toString()}`}function Tn({isAuthenticated:t,authUserId:a,runtimeMode:c,authSessionResolved:p,currentTheme:l="dark",projectName:C,currentWorkspaceId:E,apiBaseUrl:P,connectedEnvironmentSource:$,resolveCloudAuthUrl:v,embedded:h=!1,shellOwnsScroll:W=!1,onAccountProfileSummaryChange:G,onContinueToTaskforce:I,continueBusy:H=!1}){const A=Ge(),T=Qe(),[M,se]=s.useState(null),[_e,X]=s.useState(!1),[re,Ce]=s.useState(!1),[be,g]=s.useState(null),q=s.useRef(!1),Z=s.useRef(null),Q=s.useRef(null),oe=s.useRef(I),F=s.useMemo(()=>new URLSearchParams(T.search),[T.search]),x=String(F.get("checkout")||"").trim().toLowerCase(),L=String(F.get("gate")||"").trim().toLowerCase(),ce=String(F.get("planId")||"").trim(),z=String(F.get("planVersionId")||"").trim(),le=bn(F.get("interval")),ue=Sn(F.get("pricingAudience")),Se=Ie(F.get("interval")),ee=String(F.get("session_id")||"").trim(),J=s.useMemo(()=>$e(P),[P]),de=s.useMemo(()=>$e($),[$]),ve=s.useMemo(()=>({environment:Ke(de||J),runtimeMode:c==="cloud"?"cloud":"local"}),[J,de,c]),me=s.useCallback(n=>{const o=String(n||"").trim();return J?`${J}${o.startsWith("/")?o:`/${o}`}`:o},[J]),j=s.useCallback(n=>v?v(n):me(n),[me,v]),te=s.useCallback(()=>{const n=new URLSearchParams(T.search);n.delete("screen"),n.delete("gate"),n.delete("checkout"),n.delete("planId"),n.delete("planVersionId"),n.delete("interval"),n.delete("pricingAudience");const o=n.toString();A(`/${o?`?${o}`:""}${T.hash||""}`)},[T.hash,T.search,A]),pe=s.useMemo(()=>j("/api/taskforce/public/pricing"),[j]),B=s.useMemo(()=>ke(M,L),[M,L]),i=s.useMemo(()=>B.allowReturnToApp,[B.allowReturnToApp]),U=s.useMemo(()=>{const n=String(B.message||"").trim();return!n||n===_n?null:n},[B.message]),D=s.useCallback(()=>{const n=new URLSearchParams(T.search);n.delete("checkout"),n.delete("session_id"),n.delete("gate"),n.delete("planId"),n.delete("planVersionId"),n.delete("interval");const o=n.toString();A(`${T.pathname}${o?`?${o}`:""}${T.hash||""}`,{replace:!0})},[T.hash,T.pathname,T.search,A]),w=s.useCallback(()=>{Q.current!=null&&window.clearTimeout(Q.current),Q.current=window.setTimeout(()=>{D(),Q.current=null},gn)},[D]);s.useEffect(()=>{oe.current=I},[I]);const u=s.useCallback(async n=>{const o=j(ge);if(!t)return se(null),he(o,{identityKey:a}),null;try{const _=await He(o,{identityKey:a,force:n?.force===!0});return se(_),G?.(_),_}catch{return null}},[a,j,t,G]),V=s.useCallback((n,o,_)=>{const f=String(o||"").trim();if(_?.preferFallback&&f)return f;const y=ke(n,L).message;return y||f||"Unable to confirm checkout completion."},[L]),K=s.useCallback((n,o)=>!ke(n,o).allowReturnToApp,[]),Y=s.useCallback(async(n,o,_="public",f)=>{if(!n){g({type:"error",message:"Selected plan is missing a default plan version."});return}X(!0),g(null);try{const y=await fetch(j("/api/taskforce/billing/checkout-session"),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({planVersionId:n,interval:o,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(j(ge),{identityKey:a});const b=await u({force:!0}),R=String(b?.entitlementState||"").trim().toLowerCase();f?.autoContinueOnActivation===!0&&ye(R)&&await I?.();return}if(d==="updated"){g({type:"success",message:String(m?.message||"Your subscription was updated successfully.")}),he(j(ge),{identityKey:a});const b=await u({force:!0}),R=String(b?.entitlementState||"").trim().toLowerCase();f?.autoContinueOnActivation===!0&&ye(R)&&await I?.();return}if(d==="already_current_plan"){g({type:"success",message:String(m?.message||"You are already on this plan.")}),he(j(ge),{identityKey:a}),await u();return}const S=String(m?.returnBaseUrl||"").trim();if(c==="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 k=String(m?.url||"").trim();if(!k){g({type:"error",message:"Checkout did not return a redirect URL."});return}window.location.assign(k)}catch{g({type:"error",message:"Unable to start checkout for selected plan."})}finally{X(!1)}},[a,j,u,I,c]),ae=s.useCallback(async(n,o)=>{if(!n)return{confirmed:!1,errorMessage:"Checkout session is missing.",retryable:!1};const _=async()=>{he(j(ge),{identityKey:a});const f=await u({force:!0}),y=String(f?.entitlementState||"").trim().toLowerCase();if(!ye(y))return!1;const m=ce,d=z,S=Se,k=String(f?.planId||"").trim(),b=String(f?.planVersionId||"").trim(),R=Ie(f?.billingInterval??null),je=o?.preConfirmationSummary??null,Me=String(je?.entitlementState||"").trim().toLowerCase(),Ue=ye(Me),De=String(je?.planId||"").trim(),Fe=String(je?.planVersionId||"").trim(),Ve=Ie(je?.billingInterval??null);return m&&k&&k!==m||d&&b&&b!==d||S&&R&&R!==S||Ue&&!(!!m&&k===m&&De!==k)&&!(!!d&&b===d&&Fe!==b)&&!(!!S&&R===S&&Ve!==R)?!1:(o?.autoContinueOnActivation===!0&&await oe.current?.(),!0)};try{const f=await fetch(j("/api/taskforce/billing/checkout-session/confirm"),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:n})}),y=await f.json().catch(()=>({}));if(!f.ok){const m=String(y?.code||"").trim(),d=Cn(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}}},[a,j,u,Se,ce,z]),ie=s.useCallback(async()=>{if(!t){A(`/login?mode=login&next=${encodeURIComponent(Ae())}`);return}X(!0),g({type:"info",message:"Opening billing portal..."});try{const n=await fetch(j("/api/taskforce/billing/portal-session"),{method:"POST",credentials:"include"}),o=await n.json().catch(()=>({}));if(!n.ok){g({type:"error",message:String(o?.error||"Failed to open billing portal.")});return}const _=String(o?.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)}},[j,t,A]),N=s.useCallback(async()=>{if(!(!I||re||H)){Ce(!0);try{await I()}finally{Ce(!1)}}},[re,H,I]);s.useEffect(()=>{u()},[u]),s.useEffect(()=>{i&&L==="missing_entitlement"&&D()},[D,L,i]),s.useEffect(()=>()=>{Q.current!=null&&window.clearTimeout(Q.current)},[]),s.useEffect(()=>{x!=="success"&&(Z.current=null)},[x]),s.useEffect(()=>{let n=!1;const o=new Set,_=async f=>{f<=0||await new Promise(y=>{const m=window.setTimeout(()=>{o.delete(m),y()},f);o.add(m)})};if(x==="success"){if(q.current=!0,g({type:"success",message:"Checkout completed successfully. Finalizing your plan..."}),!t&&!p)return()=>{n=!0,o.forEach(m=>window.clearTimeout(m)),o.clear()};if(!t)return g({type:"error",message:"Sign in to finish activating your plan."}),()=>{n=!0,o.forEach(m=>window.clearTimeout(m)),o.clear()};const y=ee||"__missing_session__";return Z.current===y?()=>{n=!0,o.forEach(m=>window.clearTimeout(m)),o.clear()}:((async()=>{const m=Date.now(),d=await u({force:!0});if(n)return;let S=ee?{confirmed:!1,errorMessage:"Unable to confirm checkout completion.",retryable:!0}:{confirmed:!1,errorMessage:"Checkout session is missing.",retryable:!1},k=0;for(;;){const b=k<Be.length?Be[k]:hn;if(k+=1,await _(b),n||(S=ee?await ae(ee,{autoContinueOnActivation:K(d,L),preConfirmationSummary:d}):{confirmed:!1,errorMessage:"Checkout session is missing.",retryable:!1},n))return;if(S.confirmed){Z.current=y,g({type:"success",message:"Checkout completed successfully."}),w();return}if(!S.retryable||Date.now()-m>=yn)break}if(!n&&!S.confirmed){const b=await u({force:!0});if(n)return;S.retryable||(Z.current=y),g({type:"error",message:V(b,S.errorMessage,{preferFallback:!S.retryable})}),S.retryable||w();return}})(),()=>{n=!0,o.forEach(m=>window.clearTimeout(m)),o.clear()})}if(x==="cancel"){(async()=>{const f=await u({force:!0});g({type:"error",message:V(f,"Checkout was canceled. No charge was made.")}),w()})();return}if((x==="start"||x==="free")&&t&&z&&!q.current){q.current=!0,(async()=>{const f=await u({force:!0});await Y(z,le,ue,{autoContinueOnActivation:K(f,L)})})();return}},[p,x,ae,L,t,u,le,z,ue,ee,V,w,K,Y]),s.useEffect(()=>{if(!(x==="success"||x==="cancel"||x==="start"||x==="free")){if(U){g({type:B.statusTone,message:U});return}g(n=>!n||n.type!=="error"?n:n.message===B.message?null:n)}},[x,U,B.message,B.statusTone]);const xe=s.useCallback(async n=>{if(!t){const _=n.pricingType==="free"?"free":"start",f=Ae({checkout:_,planId:n.planId,planVersionId:n.planVersionId,interval:n.interval,pricingAudience:n.pricingAudience});A(`/login?mode=register&planId=${encodeURIComponent(n.planId)}&planVersionId=${encodeURIComponent(n.planVersionId)}&interval=${encodeURIComponent(n.interval)}&pricingAudience=${encodeURIComponent(n.pricingAudience)}&next=${encodeURIComponent(f)}`);return}if(n.isCurrentPlan){if(!M?.stripeCustomerId){g({type:"success",message:"Your current plan does not use Stripe billing."});return}await ie();return}const o=K(M,L);if(n.pricingType==="free"){await Y(n.planVersionId,n.interval,n.pricingAudience,{autoContinueOnActivation:o});return}await Y(n.planVersionId,n.interval,n.pricingAudience,{autoContinueOnActivation:o})},[M,L,t,A,ie,K,Y]),fe=s.useCallback(()=>{if(i&&I){N();return}if(h){te();return}if(window.history.length>1){A(-1);return}A("/")},[te,h,N,i,A,I]),Ne=h?null:e.jsxs(e.Fragment,{children:[e.jsx("button",{className:r.navAction,onClick:fe,disabled:H||re||t&&!i,children:i?"Take Me to Taskforce":"Back"}),t&&M?.stripeCustomerId&&e.jsx("button",{className:r.navAction,onClick:()=>{ie()},disabled:_e,children:"Manage billing"}),!t&&e.jsxs("button",{className:r.navAction,onClick:()=>A(`/login?mode=login&next=${encodeURIComponent(Ae())}`),children:[e.jsx(We,{size:16,style:{marginRight:"8px",verticalAlign:"text-bottom"}}),"Sign In"]})]}),ne=h?null:e.jsx(qe,{projectName:C,currentWorkspaceId:E,runtimeMode:c==="cloud"?"cloud":"local",theme:l,onBrandClick:fe,actions:Ne});return e.jsx(fn,{chrome:ne,heading:"Subscription Plans",subtitle:"Manage your subscription and explore available features. Your current plan is highlighted below.",variant:"site",theme:l,isAuthenticated:t,authSessionResolved:p,currentPlanId:String(M?.planId||ce||"").trim()||null,currentPlanVersionId:String(M?.planVersionId||z||"").trim()||null,currentEntitlementState:String(M?.entitlementState||"").trim()||null,markCurrentPlan:B.markCurrentPlan,canManageCurrentPlan:!!M?.stripeCustomerId,pricingEndpoint:pe,statusBanner:be,onBack:fe,backLabel:i?"Take Me to Taskforce":h?"Back to Board":"Back to App",backDisabled:H||re||t&&!i,topActions:null,shellOwnsScroll:W,showPageBackButton:!1,showHeaderBarWithChrome:!1,currentPlanCardActionMode:"manage",fallbackPricingSource:ve,onSelectPlan:xe})}export{Tn as PlansPage};
|
|
1
|
+
import{r as s,j as e}from"./vendor-react-CKJs5o3c.js";import{aO as ye,t as Oe,aP as Ke,aQ as ke,aR as ge,aS as he,aT as He,aU as qe}from"./index-GHJgcW3j.js";import{bn as ze,w as Ye,K as We}from"./vendor-icons-Bsq-mcEn.js";import{u as Ge,a as Qe}from"./vendor-router-AqJMU8Lz.js";import"./vendor-markdown-_lhNCyq-.js";import"./vendor-dnd-CJ-AjP-Y.js";const Je="_plansWrapper_ojftl_1",Xe="_contentFrame_ojftl_24",Ze="_shellOwnsScroll_ojftl_32",et="_withChrome_ojftl_38",tt="_siteVariant_ojftl_42",nt="_title_ojftl_56",rt="_subtitle_ojftl_71",at="_header_ojftl_78",it="_planCard_ojftl_93",st="_grid_ojftl_106",ot="_pricingNotes_ojftl_114",ct="_planName_ojftl_123",lt="_featureText_ojftl_130",ut="_currentBadge_ojftl_134",dt="_navAction_ojftl_138",mt="_backBtn_ojftl_139",pt="_priceRows_ojftl_150",ft="_foundingBeta_ojftl_154",gt="_cloudCapacityNote_ojftl_176",ht="_headerBar_ojftl_258",yt="_headerActions_ojftl_267",_t="_debugMeta_ojftl_318",Ct="_planNoticeCard_ojftl_381",bt="_planDescription_ojftl_392",St="_teamComingSoonCard_ojftl_397",jt="_clickablePlanCard_ojftl_416",wt="_activePlanCard_ojftl_431",vt="_callToAction_ojftl_495",xt="_primaryCta_ojftl_507",Nt="_secondaryCta_ojftl_518",kt="_currentCta_ojftl_530",Pt="_featuresList_ojftl_544",It="_priceRow_ojftl_150",At="_regularPriceLine_ojftl_568",Tt="_campaignPriceLine_ojftl_569",Lt="_priceRowWithCampaign_ojftl_576",Rt="_priceRowAmount_ojftl_580",Et="_regularPriceDiscounted_ojftl_586",Bt="_priceRowInterval_ojftl_592",$t="_campaignPriceLabel_ojftl_601",Mt="_campaignPriceAmount_ojftl_606",Ut="_campaignPriceInterval_ojftl_612",Dt="_ctaRow_ojftl_617",Ft="_featureItem_ojftl_623",Vt="_featureIcon_ojftl_629",Ot="_featureLimitAccent_ojftl_643",Kt="_featureLimitUnit_ojftl_654",Ht="_featureTextBlock_ojftl_660",qt="_featureDescription_ojftl_666",zt="_emptyState_ojftl_672",Yt="_marketingEmptyState_ojftl_681",Wt="_emptyBadge_ojftl_715",Gt="_emptyHighlights_ojftl_730",Qt="_loader_ojftl_752",Jt="_spinner_ojftl_762",Xt="_statusBanner_ojftl_815",Zt="_successBanner_ojftl_823",en="_infoBanner_ojftl_829",tn="_errorBanner_ojftl_835",r={plansWrapper:Je,contentFrame:Xe,shellOwnsScroll:Ze,withChrome:et,siteVariant:tt,title:nt,subtitle:rt,header:at,planCard:it,grid:st,pricingNotes:ot,planName:ct,featureText:lt,currentBadge:ut,navAction:dt,backBtn:mt,priceRows:pt,foundingBeta:ft,cloudCapacityNote:gt,headerBar:ht,headerActions:yt,debugMeta:_t,planNoticeCard:Ct,planDescription:bt,teamComingSoonCard:St,clickablePlanCard:jt,activePlanCard:wt,callToAction:vt,primaryCta:xt,secondaryCta:Nt,currentCta:kt,featuresList:Pt,priceRow:It,regularPriceLine:At,campaignPriceLine:Tt,priceRowWithCampaign:Lt,priceRowAmount:Rt,regularPriceDiscounted:Et,priceRowInterval:Bt,campaignPriceLabel:$t,campaignPriceAmount:Mt,campaignPriceInterval:Ut,ctaRow:Dt,featureItem:Ft,featureIcon:Vt,featureLimitAccent:Ot,featureLimitUnit:Kt,featureTextBlock:Ht,featureDescription:qt,emptyState:zt,marketingEmptyState:Yt,emptyBadge:Wt,emptyHighlights:Gt,loader:Qt,spinner:Jt,statusBanner:Xt,successBanner:Zt,infoBanner:en,errorBanner:tn};function nn(){const t=globalThis.__DEBUG_MODE__;return typeof t=="boolean"?t:!1}function rn(t){const a=String(t?.environment||"").trim(),c=String(t?.runtimeMode||"").trim();return!a&&!c?null:a&&c?`${a} (${c})`:a||c||null}const an=new Set(["a","b","br","em","i","li","ol","p","strong","u","ul"]);function sn(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function on(t){const a=String(t||"").trim();if(!a)return"";if(typeof document>"u")return sn(a);const c=document.createElement("template");c.innerHTML=a;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,P=E.tagName.toLowerCase();if(P==="script"||P==="style")return null;const $=Array.from(E.childNodes).map(l).filter(h=>!!h);if(!an.has(P)){const h=document.createDocumentFragment();for(const W of $)h.appendChild(W);return h}const v=document.createElement(P);if(P==="a"){const h=String(E.getAttribute("href")||"").trim();/^(https?:|mailto:|\/|#)/i.test(h)&&(v.setAttribute("href",h),v.setAttribute("rel","noopener noreferrer"))}for(const h of $)v.appendChild(h);return v};for(const C of Array.from(c.content.childNodes)){const E=l(C);E&&p.appendChild(E)}return p.innerHTML}function cn(t,a){if(t==null||!a)return"Contact Sales";try{return new Intl.NumberFormat("en-US",{style:"currency",currency:a.toUpperCase(),minimumFractionDigits:0}).format(t/100)}catch{return`${a.toUpperCase()} ${t/100}`}}function ln(){return"$0"}function O(t){return t?t.pricingType==="free"?!0:t.unitAmount!=null&&t.currency!=null:!1}function Te(t){return t?t.pricingType==="free"?ln():cn(t.unitAmount,t.currency):"Unavailable"}function Le(t,a){return O(a)?{price:a,pricingAudience:"campaign"}:{price:t,pricingAudience:"public"}}function un(t,a,c,p){const l=O(t)||O(c),C=O(a)||O(p);if(!l&&!C)return null;const E=(P,$,v)=>{if(!O(P)&&!O($))return null;const h=O($),W=v==="year"?"year":"month";return e.jsxs("div",{className:`${r.priceRow} ${h?r.priceRowWithCampaign:""}`,children:[O(P)?e.jsxs("div",{className:r.regularPriceLine,children:[e.jsx("span",{className:`${r.priceRowAmount} ${h?r.regularPriceDiscounted:""}`,children:Te(P)}),e.jsxs("span",{className:r.priceRowInterval,children:["/ ",W]})]}):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:["/ ",W]})]}):null]},v)};return e.jsxs("div",{className:r.priceRows,children:[E(t,c,"month"),E(a,p,"year")]})}function Re(t){const a=[t.pricing.month,t.pricing.year].filter(Boolean);if(a.some(p=>p.pricingType==="free"))return 0;const c=a.map(p=>p.pricingType==="stripe"&&typeof p.unitAmount=="number"?p.unitAmount:null).filter(p=>p!=null);return c.length>0?Math.min(...c):Number.POSITIVE_INFINITY}function dn(t){return String(t||"").replace(/[_\-.]+/g," ").replace(/\b\w/g,a=>a.toUpperCase())}function Pe(t,a){const c=t?.[a],p=Number(c);return Number.isFinite(p)?Math.max(1,Math.floor(p)):null}const Ee="Unlimited";function we(t,a){return a!==1?t:t.replace(/\b([A-Za-z]+)ies\b$/,"$1y").replace(/\b([A-Za-z]+[^s\s])s\b$/,"$1")}function mn(t){return t<=1e3?{value:String(t),unit:"MB"}:{value:String(Math.round(t/1e3)),unit:"GB"}}function pn(t,a){const c=String(t.publicLabel||t.label||"").trim()||dn(t.featureKey),p=t.config&&typeof t.config=="object"?t.config:{};if(t.featureKey==="context.uploads"){const l=Pe(p,"storageLimitMb");if(l!==null){const C=mn(l);return{limitValue:C.value,limitUnit:C.unit,baseLabel:we(c,l)}}}if(t.featureKey==="workspace.workspaces"){const l=Pe(p,"maxWorkspaces");if(l!==null)return{limitValue:String(l),limitUnit:null,baseLabel:we(c,l)};if(t.access!=="disabled")return{limitValue:Ee,limitUnit:null,baseLabel:c}}if(t.featureKey==="collaboration.ai_profiles"){const l=Pe(p,"maxAiProfiles");if(l!==null)return{limitValue:String(l),limitUnit:null,baseLabel:we(c,l)};if(t.access!=="disabled")return{limitValue:Ee,limitUnit:null,baseLabel:c}}if(t.featureKey==="collaboration.team_management"){const l=Number(a);if(Number.isFinite(l)&&l>0){const C=Math.floor(l);return{limitValue:String(C),limitUnit:null,baseLabel:we(c,C)}}}return{limitValue:null,limitUnit:null,baseLabel:c}}function fn({heading:t,subtitle:a,variant:c="app",theme:p="dark",chrome:l,footer:C,isAuthenticated:E,authSessionResolved:P=!0,currentPlanId:$,currentPlanVersionId:v,currentEntitlementState:h,markCurrentPlan:W,canManageCurrentPlan:G=!0,pricingEndpoint:I,statusBanner:H,onBack:A,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:q}){const[Z,Q]=s.useState([]),[oe,F]=s.useState(null),[x,L]=s.useState({pageTitle:null,pageDescription:null}),[ce,z]=s.useState(!0),[le,ue]=s.useState(null),[Se,ee]=s.useState(0);s.useEffect(()=>{let i=!0;return(async()=>{const D=String(I||"/api/taskforce/public/pricing").trim()||"/api/taskforce/public/pricing";i&&(z(!0),ue(null));try{const w=await fetch(D,{method:"GET",credentials:"include"}),u=await w.json().catch(()=>({}));if(w.ok){i&&(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 (${w.status})`))}catch(w){if(i){const u=w instanceof Error?w.message:"Failed to load pricing";ue(u||"Failed to load pricing"),F(null),L({pageTitle:null,pageDescription:null})}}finally{i&&z(!1)}})(),()=>{i=!1}},[I,Se]);const J=s.useMemo(()=>[...Z].sort((i,U)=>{const D=Re(i),w=Re(U);if(D!==w)return D-w;const u=i.defaultVersion?.versionNumber||0,V=U.defaultVersion?.versionNumber||0;return u!==V?u-V:String(i.displayName||i.planId).localeCompare(String(U.displayName||U.planId))}),[Z]),de=s.useMemo(()=>rn(oe||g),[g,oe]),ve=String((Ce?x.pageTitle:null)||t).trim()||t,me=String(x.pageDescription||a||"").trim(),j=s.useMemo(()=>on(me),[me]),te=P,pe=`${r.plansWrapper} ${_e?r.shellOwnsScroll:"tf-scrollbar"} ${c==="site"?r.siteVariant:""} ${l?r.withChrome:""}`.trim(),B=i=>_e?e.jsxs(e.Fragment,{children:[l,i,C]}):e.jsxs("div",{className:Oe.standaloneWrapper,"data-theme":p,children:[l,i,C]});return B(ce?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(i=>i+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:A,disabled:M,children:T}):null}),e.jsx("div",{className:r.headerActions,children:se})]}),e.jsx("h1",{className:r.title,children:ve}),j&&e.jsx("div",{className:r.subtitle,dangerouslySetInnerHTML:{__html:j}}),nn()&&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(i=>{const U=i.pricing.month,D=i.pricing.year,w=i.campaignPricing?.month||null,u=i.campaignPricing?.year||null,V=Le(U,w),K=Le(D,u),Y=O(V.price),ae=O(K.price),ie=Y&&ae,N=String(i.defaultVersion?.planVersionId||"").trim(),xe=ye(h),fe=W??xe,Ne=!!(N&&v&&v===N)||!!(!v&&($&&$===i.planId)),ne=fe&&Ne&&h!=="canceled",n=Y?"month":ae?"year":null,o=n==="year"?K:V,_=be==="manage",f=be==="indicator",y=te&&!!N&&(ne?_&&G:!!n),m=()=>{if(N){if(ne){if(!_||!G)return;q({planId:i.planId,planVersionId:N,interval:n||"month",pricingType:o.price?.pricingType||"stripe",pricingAudience:o.pricingAudience,isCurrentPlan:!0});return}n&&q({planId:i.planId,planVersionId:N,interval:n,pricingType:o.price?.pricingType||"stripe",pricingAudience:o.pricingAudience,isCurrentPlan:!1})}};return e.jsxs("div",{className:`${r.planCard} ${ne?r.activePlanCard:""} ${y?r.clickablePlanCard:""}`,"data-testid":`plan-card-${i.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:[ne&&e.jsx("span",{className:r.currentBadge,children:"Current Plan"}),e.jsx("h3",{className:r.planName,children:i.displayName}),un(U,D,w,u),String(i.description||"").trim()&&e.jsx("p",{className:r.planDescription,children:String(i.description||"").trim()}),e.jsx("div",{className:r.featuresList,children:Array.isArray(i.features)&&i.features.length>0?i.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:k,limitUnit:b,baseLabel:R}=pn(d,i.defaultVersion?.seatLimit);return e.jsxs("span",{className:r.featureText,children:[k&&e.jsxs("span",{className:r.featureLimitAccent,children:[e.jsx("span",{children:k}),b?e.jsx("span",{className:r.featureLimitUnit,children:b}):null]}),e.jsx("span",{children:k?` ${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"})}),ne?_?e.jsx("button",{className:`${r.callToAction} ${r.currentCta}`,"data-testid":`plan-manage-${i.planId}`,onClick:d=>{d.stopPropagation(),G&&q({planId:i.planId,planVersionId:N,interval:n||"month",pricingType:o.price?.pricingType||"stripe",pricingAudience:o.pricingAudience,isCurrentPlan:!0})},disabled:!N||!G||!te,children:E&&G?"Manage Plan":"Current Plan"}):f?e.jsx("button",{className:`${r.callToAction} ${r.currentCta}`,"data-testid":`plan-current-${i.planId}`,disabled:!0,children:"Current Plan"}):null:e.jsxs("div",{className:r.ctaRow,children:[Y?e.jsx("button",{className:`${r.callToAction} ${r.secondaryCta}`,"data-testid":`plan-select-${i.planId}-month`,onClick:d=>{d.stopPropagation(),q({planId:i.planId,planVersionId:N,interval:"month",pricingType:V.price?.pricingType||"stripe",pricingAudience:V.pricingAudience,isCurrentPlan:!1})},disabled:!N||!te,children:ie?"Start Monthly":"Get Started"}):null,ae?e.jsx("button",{className:`${r.callToAction} ${r.primaryCta}`,"data-testid":`plan-select-${i.planId}-year`,onClick:d=>{d.stopPropagation(),q({planId:i.planId,planVersionId:N,interval:"year",pricingType:K.price?.pricingType||"stripe",pricingAudience:K.pricingAudience,isCurrentPlan:!1})},disabled:!N||!te,children:ie?"Start Yearly":"Get Started"}):null]})]},i.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("p",{children:["Contact ",e.jsx("a",{href:"mailto:support@taskforcehq.ai",children:"support@taskforcehq.ai"})," to discuss capacity needs."]})]}),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 gn=1600,Be=[0,500,1e3,2e3],hn=5e3,yn=45e3,_n="Choose a plan to continue.";function Cn(t,a){if(t===401)return!0;const c=String(a||"").trim().toUpperCase();return c==="CHECKOUT_SESSION_INCOMPLETE"||c==="CHECKOUT_PLAN_VERSION_UNRESOLVED"}function bn(t){return t==="year"?"year":"month"}function Sn(t){return t==="campaign"?"campaign":"public"}function Ie(t){const a=String(t||"").trim().toLowerCase();return a==="year"?"year":a==="month"?"month":null}function $e(t){const a=String(t||"").trim();return a?a.replace(/\/+$/,""):""}function Ae(t={}){const a=new URLSearchParams;a.set("screen","plans");for(const[c,p]of Object.entries(t)){const l=String(p||"").trim();l&&a.set(c,l)}return`/?${a.toString()}`}function Tn({isAuthenticated:t,authUserId:a,runtimeMode:c,authSessionResolved:p,currentTheme:l="dark",projectName:C,currentWorkspaceId:E,apiBaseUrl:P,connectedEnvironmentSource:$,resolveCloudAuthUrl:v,embedded:h=!1,shellOwnsScroll:W=!1,onAccountProfileSummaryChange:G,onContinueToTaskforce:I,continueBusy:H=!1}){const A=Ge(),T=Qe(),[M,se]=s.useState(null),[_e,X]=s.useState(!1),[re,Ce]=s.useState(!1),[be,g]=s.useState(null),q=s.useRef(!1),Z=s.useRef(null),Q=s.useRef(null),oe=s.useRef(I),F=s.useMemo(()=>new URLSearchParams(T.search),[T.search]),x=String(F.get("checkout")||"").trim().toLowerCase(),L=String(F.get("gate")||"").trim().toLowerCase(),ce=String(F.get("planId")||"").trim(),z=String(F.get("planVersionId")||"").trim(),le=bn(F.get("interval")),ue=Sn(F.get("pricingAudience")),Se=Ie(F.get("interval")),ee=String(F.get("session_id")||"").trim(),J=s.useMemo(()=>$e(P),[P]),de=s.useMemo(()=>$e($),[$]),ve=s.useMemo(()=>({environment:Ke(de||J),runtimeMode:c==="cloud"?"cloud":"local"}),[J,de,c]),me=s.useCallback(n=>{const o=String(n||"").trim();return J?`${J}${o.startsWith("/")?o:`/${o}`}`:o},[J]),j=s.useCallback(n=>v?v(n):me(n),[me,v]),te=s.useCallback(()=>{const n=new URLSearchParams(T.search);n.delete("screen"),n.delete("gate"),n.delete("checkout"),n.delete("planId"),n.delete("planVersionId"),n.delete("interval"),n.delete("pricingAudience");const o=n.toString();A(`/${o?`?${o}`:""}${T.hash||""}`)},[T.hash,T.search,A]),pe=s.useMemo(()=>j("/api/taskforce/public/pricing"),[j]),B=s.useMemo(()=>ke(M,L),[M,L]),i=s.useMemo(()=>B.allowReturnToApp,[B.allowReturnToApp]),U=s.useMemo(()=>{const n=String(B.message||"").trim();return!n||n===_n?null:n},[B.message]),D=s.useCallback(()=>{const n=new URLSearchParams(T.search);n.delete("checkout"),n.delete("session_id"),n.delete("gate"),n.delete("planId"),n.delete("planVersionId"),n.delete("interval");const o=n.toString();A(`${T.pathname}${o?`?${o}`:""}${T.hash||""}`,{replace:!0})},[T.hash,T.pathname,T.search,A]),w=s.useCallback(()=>{Q.current!=null&&window.clearTimeout(Q.current),Q.current=window.setTimeout(()=>{D(),Q.current=null},gn)},[D]);s.useEffect(()=>{oe.current=I},[I]);const u=s.useCallback(async n=>{const o=j(ge);if(!t)return se(null),he(o,{identityKey:a}),null;try{const _=await He(o,{identityKey:a,force:n?.force===!0});return se(_),G?.(_),_}catch{return null}},[a,j,t,G]),V=s.useCallback((n,o,_)=>{const f=String(o||"").trim();if(_?.preferFallback&&f)return f;const y=ke(n,L).message;return y||f||"Unable to confirm checkout completion."},[L]),K=s.useCallback((n,o)=>!ke(n,o).allowReturnToApp,[]),Y=s.useCallback(async(n,o,_="public",f)=>{if(!n){g({type:"error",message:"Selected plan is missing a default plan version."});return}X(!0),g(null);try{const y=await fetch(j("/api/taskforce/billing/checkout-session"),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({planVersionId:n,interval:o,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(j(ge),{identityKey:a});const b=await u({force:!0}),R=String(b?.entitlementState||"").trim().toLowerCase();f?.autoContinueOnActivation===!0&&ye(R)&&await I?.();return}if(d==="updated"){g({type:"success",message:String(m?.message||"Your subscription was updated successfully.")}),he(j(ge),{identityKey:a});const b=await u({force:!0}),R=String(b?.entitlementState||"").trim().toLowerCase();f?.autoContinueOnActivation===!0&&ye(R)&&await I?.();return}if(d==="already_current_plan"){g({type:"success",message:String(m?.message||"You are already on this plan.")}),he(j(ge),{identityKey:a}),await u();return}const S=String(m?.returnBaseUrl||"").trim();if(c==="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 k=String(m?.url||"").trim();if(!k){g({type:"error",message:"Checkout did not return a redirect URL."});return}window.location.assign(k)}catch{g({type:"error",message:"Unable to start checkout for selected plan."})}finally{X(!1)}},[a,j,u,I,c]),ae=s.useCallback(async(n,o)=>{if(!n)return{confirmed:!1,errorMessage:"Checkout session is missing.",retryable:!1};const _=async()=>{he(j(ge),{identityKey:a});const f=await u({force:!0}),y=String(f?.entitlementState||"").trim().toLowerCase();if(!ye(y))return!1;const m=ce,d=z,S=Se,k=String(f?.planId||"").trim(),b=String(f?.planVersionId||"").trim(),R=Ie(f?.billingInterval??null),je=o?.preConfirmationSummary??null,Me=String(je?.entitlementState||"").trim().toLowerCase(),Ue=ye(Me),De=String(je?.planId||"").trim(),Fe=String(je?.planVersionId||"").trim(),Ve=Ie(je?.billingInterval??null);return m&&k&&k!==m||d&&b&&b!==d||S&&R&&R!==S||Ue&&!(!!m&&k===m&&De!==k)&&!(!!d&&b===d&&Fe!==b)&&!(!!S&&R===S&&Ve!==R)?!1:(o?.autoContinueOnActivation===!0&&await oe.current?.(),!0)};try{const f=await fetch(j("/api/taskforce/billing/checkout-session/confirm"),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:n})}),y=await f.json().catch(()=>({}));if(!f.ok){const m=String(y?.code||"").trim(),d=Cn(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}}},[a,j,u,Se,ce,z]),ie=s.useCallback(async()=>{if(!t){A(`/login?mode=login&next=${encodeURIComponent(Ae())}`);return}X(!0),g({type:"info",message:"Opening billing portal..."});try{const n=await fetch(j("/api/taskforce/billing/portal-session"),{method:"POST",credentials:"include"}),o=await n.json().catch(()=>({}));if(!n.ok){g({type:"error",message:String(o?.error||"Failed to open billing portal.")});return}const _=String(o?.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)}},[j,t,A]),N=s.useCallback(async()=>{if(!(!I||re||H)){Ce(!0);try{await I()}finally{Ce(!1)}}},[re,H,I]);s.useEffect(()=>{u()},[u]),s.useEffect(()=>{i&&L==="missing_entitlement"&&D()},[D,L,i]),s.useEffect(()=>()=>{Q.current!=null&&window.clearTimeout(Q.current)},[]),s.useEffect(()=>{x!=="success"&&(Z.current=null)},[x]),s.useEffect(()=>{let n=!1;const o=new Set,_=async f=>{f<=0||await new Promise(y=>{const m=window.setTimeout(()=>{o.delete(m),y()},f);o.add(m)})};if(x==="success"){if(q.current=!0,g({type:"success",message:"Checkout completed successfully. Finalizing your plan..."}),!t&&!p)return()=>{n=!0,o.forEach(m=>window.clearTimeout(m)),o.clear()};if(!t)return g({type:"error",message:"Sign in to finish activating your plan."}),()=>{n=!0,o.forEach(m=>window.clearTimeout(m)),o.clear()};const y=ee||"__missing_session__";return Z.current===y?()=>{n=!0,o.forEach(m=>window.clearTimeout(m)),o.clear()}:((async()=>{const m=Date.now(),d=await u({force:!0});if(n)return;let S=ee?{confirmed:!1,errorMessage:"Unable to confirm checkout completion.",retryable:!0}:{confirmed:!1,errorMessage:"Checkout session is missing.",retryable:!1},k=0;for(;;){const b=k<Be.length?Be[k]:hn;if(k+=1,await _(b),n||(S=ee?await ae(ee,{autoContinueOnActivation:K(d,L),preConfirmationSummary:d}):{confirmed:!1,errorMessage:"Checkout session is missing.",retryable:!1},n))return;if(S.confirmed){Z.current=y,g({type:"success",message:"Checkout completed successfully."}),w();return}if(!S.retryable||Date.now()-m>=yn)break}if(!n&&!S.confirmed){const b=await u({force:!0});if(n)return;S.retryable||(Z.current=y),g({type:"error",message:V(b,S.errorMessage,{preferFallback:!S.retryable})}),S.retryable||w();return}})(),()=>{n=!0,o.forEach(m=>window.clearTimeout(m)),o.clear()})}if(x==="cancel"){(async()=>{const f=await u({force:!0});g({type:"error",message:V(f,"Checkout was canceled. No charge was made.")}),w()})();return}if((x==="start"||x==="free")&&t&&z&&!q.current){q.current=!0,(async()=>{const f=await u({force:!0});await Y(z,le,ue,{autoContinueOnActivation:K(f,L)})})();return}},[p,x,ae,L,t,u,le,z,ue,ee,V,w,K,Y]),s.useEffect(()=>{if(!(x==="success"||x==="cancel"||x==="start"||x==="free")){if(U){g({type:B.statusTone,message:U});return}g(n=>!n||n.type!=="error"?n:n.message===B.message?null:n)}},[x,U,B.message,B.statusTone]);const xe=s.useCallback(async n=>{if(!t){const _=n.pricingType==="free"?"free":"start",f=Ae({checkout:_,planId:n.planId,planVersionId:n.planVersionId,interval:n.interval,pricingAudience:n.pricingAudience});A(`/login?mode=register&planId=${encodeURIComponent(n.planId)}&planVersionId=${encodeURIComponent(n.planVersionId)}&interval=${encodeURIComponent(n.interval)}&pricingAudience=${encodeURIComponent(n.pricingAudience)}&next=${encodeURIComponent(f)}`);return}if(n.isCurrentPlan){if(!M?.stripeCustomerId){g({type:"success",message:"Your current plan does not use Stripe billing."});return}await ie();return}const o=K(M,L);if(n.pricingType==="free"){await Y(n.planVersionId,n.interval,n.pricingAudience,{autoContinueOnActivation:o});return}await Y(n.planVersionId,n.interval,n.pricingAudience,{autoContinueOnActivation:o})},[M,L,t,A,ie,K,Y]),fe=s.useCallback(()=>{if(i&&I){N();return}if(h){te();return}if(window.history.length>1){A(-1);return}A("/")},[te,h,N,i,A,I]),Ne=h?null:e.jsxs(e.Fragment,{children:[e.jsx("button",{className:r.navAction,onClick:fe,disabled:H||re||t&&!i,children:i?"Take Me to Taskforce":"Back"}),t&&M?.stripeCustomerId&&e.jsx("button",{className:r.navAction,onClick:()=>{ie()},disabled:_e,children:"Manage billing"}),!t&&e.jsxs("button",{className:r.navAction,onClick:()=>A(`/login?mode=login&next=${encodeURIComponent(Ae())}`),children:[e.jsx(We,{size:16,style:{marginRight:"8px",verticalAlign:"text-bottom"}}),"Sign In"]})]}),ne=h?null:e.jsx(qe,{projectName:C,currentWorkspaceId:E,runtimeMode:c==="cloud"?"cloud":"local",theme:l,onBrandClick:fe,actions:Ne});return e.jsx(fn,{chrome:ne,heading:"Subscription Plans",subtitle:"Manage your subscription and explore available features. Your current plan is highlighted below.",variant:"site",theme:l,isAuthenticated:t,authSessionResolved:p,currentPlanId:String(M?.planId||ce||"").trim()||null,currentPlanVersionId:String(M?.planVersionId||z||"").trim()||null,currentEntitlementState:String(M?.entitlementState||"").trim()||null,markCurrentPlan:B.markCurrentPlan,canManageCurrentPlan:!!M?.stripeCustomerId,pricingEndpoint:pe,statusBanner:be,onBack:fe,backLabel:i?"Take Me to Taskforce":h?"Back to Board":"Back to App",backDisabled:H||re||t&&!i,topActions:null,shellOwnsScroll:W,showPageBackButton:!1,showHeaderBarWithChrome:!1,currentPlanCardActionMode:"manage",fallbackPricingSource:ve,onSelectPlan:xe})}export{Tn as PlansPage};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as h,j as e}from"./vendor-react-CKJs5o3c.js";import{ContextAttachmentManager as g}from"./ContextAttachmentManager-
|
|
1
|
+
import{r as h,j as e}from"./vendor-react-CKJs5o3c.js";import{ContextAttachmentManager as g}from"./ContextAttachmentManager-BudIbOR9.js";import{f as v,aW as x,a_ as _}from"./index-GHJgcW3j.js";import{w as y,$ as j,aZ as w}from"./vendor-icons-Bsq-mcEn.js";import"./vendor-markdown-_lhNCyq-.js";import"./vendor-dnd-CJ-AjP-Y.js";import"./vendor-router-AqJMU8Lz.js";const I="_group_1y2qv_1",N="_list_1y2qv_9",b="_review_1y2qv_15",C="_icon_1y2qv_43",k="_openIcon_1y2qv_43",A="_copy_1y2qv_44",L="_kindLabel_1y2qv_45",q="_title_1y2qv_53",R="_loading_1y2qv_54",n={group:I,list:N,review:b,icon:C,openIcon:k,copy:A,kindLabel:L,title:q,loading:R};function U(o){return String(o.title||"").trim()||o.image?.displayName||"Image review"}function S({taskId:o,taskReferenceLabel:l,workspaceId:c,apiBaseUrl:r}){const[i,d]=h.useState(null),[m,p]=h.useState(!1);return h.useEffect(()=>{let a=!0;d(null),p(!1);const t=new URLSearchParams({workspaceId:c,taskId:o});return v(`/api/taskforce/annotated-attachments/sessions?${t.toString()}`,{credentials:"include"},r).then(async s=>{if(!s.ok)throw new Error("Failed to load image reviews.");return s.json()}).then(s=>{a&&d(Array.isArray(s?.sessions)?s.sessions:[])}).catch(()=>{a&&(d([]),p(!0))}),()=>{a=!1}},[r,o,c]),i!==null&&i.length===0&&!m?null:e.jsx("section",{className:n.group,"aria-label":"Image reviews",children:i===null?e.jsxs("div",{className:n.loading,"aria-live":"polite",children:[e.jsx(y,{size:14})," Loading image reviews"]}):m?e.jsx("div",{className:n.loading,role:"status",children:"Unable to load image reviews."}):e.jsx("div",{className:n.list,children:i.map(a=>{const t=a.image,s=a.annotations.length,u=!!(t?.assetId&&t.apiUrl);return e.jsxs("button",{type:"button",className:n.review,disabled:!u,onClick:()=>{t&&_({assetId:t.assetId,path:t.apiUrl,displayName:t.displayName,referenceLabel:t.referenceLabel||void 0},{taskId:o,taskReferenceLabel:l,sessionId:a.id})},children:[e.jsx("span",{className:n.icon,children:e.jsx(j,{size:14})}),e.jsxs("span",{className:n.copy,children:[e.jsx("span",{className:n.kindLabel,children:"Image review session"}),e.jsx("span",{className:`${n.title} tf-heading-card`,children:U(a)}),e.jsxs("span",{className:"tf-text-meta",children:[[t?.referenceLabel,t?.displayName].filter(Boolean).join(" · ")||"Image",a.updatedAt?` · Updated ${x(a.updatedAt,{month:"short",day:"numeric",year:"numeric"})}`:""]}),e.jsxs("span",{className:"tf-text-meta",children:[s," ",s===1?"marker":"markers"]})]}),e.jsx(w,{className:n.openIcon,size:14,"aria-hidden":"true"})]},a.id)})})})}function M(o){const{taskId:l,taskReferenceLabel:c,workspaceId:r,apiBaseUrl:i,showImageReviews:d=!1,contextFiles:m,onAddContextFile:p,onRemoveContextFile:a,onUpdateContextCaption:t,cardCoverAssetId:s,onSetCardCover:u,cardCoverDisabled:f}=o;return e.jsx(g,{ownerType:"task",ownerId:l,ownerReferenceLabel:c,workspaceId:r,apiBaseUrl:i,attachments:m,onAddAttachment:p,onRemoveAttachment:a,onUpdateAttachmentCaption:t,cardCoverAssetId:s,onSetCardCover:u,cardCoverDisabled:f,supplementalContent:d&&l&&r?e.jsx(S,{taskId:l,taskReferenceLabel:c,workspaceId:r,apiBaseUrl:i}):null})}export{M as TaskContextUpload};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as o,j as e,R as Us}from"./vendor-react-CKJs5o3c.js";import{g as Hn,t as s,T as qs,P as is,A as Js,I as be,r as ae,D as Wn,a as za,b as Vn,l as Xa,c as Kn,d as qn,M as Jn,n as Yn,e as Ga}from"./index-
|
|
1
|
+
import{r as o,j as e,R as Us}from"./vendor-react-CKJs5o3c.js";import{g as Hn,t as s,T as qs,P as is,A as Js,I as be,r as ae,D as Wn,a as za,b as Vn,l as Xa,c as Kn,d as qn,M as Jn,n as Yn,e as Ga}from"./index-GHJgcW3j.js";import{r as os,t as Cs,X as Vs,v as en,A as sn,I as At,aD as Et,_ as Zn,w as Pe,a0 as Qn,aE as Oa,Z as Y,l as Xn,aF as Fa,aG as Ua,aH as Rt,k as tn,aI as ei,u as te,x as Ae,aJ as si,aK as ti,a5 as ai,d as an,a as Bt,ah as Fe,aL as ni,au as Dt,ad as ii,a4 as oi,ay as Ha,aM as li,aN as ri,aO as ci}from"./vendor-icons-Bsq-mcEn.js";import"./vendor-markdown-_lhNCyq-.js";import"./vendor-dnd-CJ-AjP-Y.js";import"./vendor-router-AqJMU8Lz.js";function di(i){return i==="general"?{}:{TASKFORCE_MCP_CLIENT_ID:i}}function pi(...i){const l=i.map(g=>String(g||"").trim().toLowerCase()).join("|");let p=2166136261,m=3339675911;for(let g=0;g<l.length;g+=1){const C=l.charCodeAt(g);p=Math.imul(p^C,16777619),m=Math.imul(m^C,2246822519)}return`mcp-${(p>>>0).toString(16).padStart(8,"0")}${(m>>>0).toString(16).padStart(8,"0")}`}const Hs=Hn();function zt(i,l){return String(i||"").toLowerCase().replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/-+/g,"-").replace(/^[-_]+|[-_]+$/g,"")||l.toLowerCase()}function ui(i,l){const m=zt(i||l||"workspace","workspace").slice(0,25)||"workspace";return zt(`taskforce-${m}`,"taskforce-workspace")}function mi(i){return{Authorization:`Bearer ${i.tokenValue}`,...i.clientId==="general"?{}:{"X-Taskforce-MCP-Client-ID":i.clientId}}}function ge(i,l){return`${i} Use the generated config exactly as shown. Resolve your AI profile before the first write; stateless clients should keep the returned profileToken only in private client state.`}function xe(i){return`${i} Use the generated config exactly as shown. No connection token is required for local stdio MCP. Resolve your AI profile before the first write; stateless clients should keep the returned profileToken only in private client state.`}function Ks(i){return JSON.stringify(i)}function Wa(i){return`[${i.map(l=>Ks(l)).join(", ")}]`}function Va(i){return!i||Object.keys(i).length===0?[]:[`env = { ${Object.entries(i).map(([l,p])=>`${l} = ${Ks(p)}`).join(", ")} }`]}function Ka(i){return/^[A-Za-z0-9_./:@%+=,-]+$/.test(i)?i:`'${i.replace(/'/g,`'"'"'`)}'`}function hi(i){const{clientId:l,endpoint:p,tokenValue:m,serverId:g}=i,C=mi(i);C.Authorization;const w=Object.entries(C).filter(([S])=>S!=="Authorization").map(([S,I])=>` --header "${S}: ${I}"`).join("");switch(l){case"general":return{clientId:l,kind:"json",rootKey:"mcpServers",serverConfig:{url:p,headers:C},instructionLabel:"General MCP Configuration Instructions",instructionText:ge("Add this server to your MCP client using its standard remote HTTP configuration format.")};case"cursor":return{clientId:l,kind:"json",rootKey:"mcpServers",serverConfig:{url:p,headers:C},instructionLabel:"Cursor Configuration Instructions",instructionText:ge("Open Cursor settings, find MCP servers, and paste this config.")};case"cline":return{clientId:l,kind:"json",rootKey:"mcpServers",serverConfig:{url:p,type:"streamableHttp",headers:C},instructionLabel:"Cline Configuration Instructions",instructionText:ge("Open Cline MCP Servers, add a remote server, or paste this into the Cline MCP config with Streamable HTTP selected.")};case"vscode":return{clientId:l,kind:"json",rootKey:"servers",serverConfig:{type:"http",url:p,headers:C},instructionLabel:"VS Code Configuration Instructions",instructionText:ge("Open .vscode/mcp.json or MCP: Open User Configuration and add this server under the servers object.")};case"kiro":return{clientId:l,kind:"json",rootKey:"mcpServers",serverConfig:{url:p,headers:C},instructionLabel:"Kiro Configuration Instructions",instructionText:ge("Open .kiro/settings/mcp.json in your workspace (or ~/.kiro/settings/mcp.json for user-level config) and add this server under mcpServers.")};case"windsurf":return{clientId:l,kind:"json",rootKey:"mcpServers",serverConfig:{serverUrl:p,headers:C},instructionLabel:"Windsurf Configuration Instructions",instructionText:ge("Open Windsurf MCP settings, add a server, and paste this config.")};case"antigravity":return{clientId:l,kind:"json",rootKey:"mcpServers",serverConfig:{serverUrl:p,headers:C},instructionLabel:"Antigravity Configuration Instructions",instructionText:ge("Open Antigravity MCP settings, view the raw config, and paste this Antigravity-specific configuration.")};case"openclaw":return{clientId:l,kind:"json",rootKey:"servers",wrapperKeys:["mcp"],serverConfig:{transport:"streamable-http",url:p,headers:C},instructionLabel:"OpenClaw Configuration Instructions",instructionText:ge("Open ~/.openclaw/openclaw.json and add this server under mcp.servers.")};case"codex":return{clientId:l,kind:"text",renderedText:[`[mcp_servers.${g}]`,`url = "${p}"`,`http_headers = { ${Object.entries(C).map(([S,I])=>`${S} = "${I}"`).join(", ")} }`].join(`
|
|
2
2
|
`),instructionLabel:"Codex Configuration Instructions",instructionText:ge("Open ~/.codex/config.toml and add this Codex MCP entry.")};case"grok":return{clientId:l,kind:"text",renderedText:[`[mcp_servers.${g}]`,`url = "${p}"`,`headers = { ${Object.entries(C).map(([S,I])=>`${S} = "${I}"`).join(", ")} }`].join(`
|
|
3
3
|
`),instructionLabel:"Grok CLI Configuration Instructions",instructionText:ge("Open ~/.grok/config.toml (or .grok/config.toml in your project for project-scoped config) and add this Grok CLI MCP entry.")};case"claude-code":return{clientId:l,kind:"text",renderedText:`claude mcp add --transport http ${g} ${p} --header "Authorization: Bearer ${m}"${w}`,instructionLabel:"Claude Code Configuration Instructions",instructionText:ge("Run this Claude Code command in your terminal to add the remote Taskforce MCP server.")};case"gemini-cli":return{clientId:l,kind:"text",renderedText:`gemini mcp add ${g} ${p} --transport http --header "Authorization: Bearer ${m}"${w}`,instructionLabel:"Gemini CLI Configuration Instructions",instructionText:ge("Run this Gemini CLI command in your terminal to add the remote Taskforce MCP server. Add --scope user if you want it available across all projects.")};case"claude-chat":return{clientId:l,kind:"text",renderedText:p,instructionLabel:"Claude Chat Configuration Instructions",instructionText:"Open Claude Settings > Connectors, paste this MCP server URL, and complete the Taskforce OAuth flow to authorize one workspace."};case"grok-chat":return{clientId:l,kind:"text",renderedText:p,instructionLabel:"Grok Configuration Instructions",instructionText:"Go to grok.com/connectors, create a custom connector with this MCP server URL, and complete the Taskforce OAuth flow to authorize one workspace."};case"gemini-chat":return{clientId:l,kind:"text",renderedText:p,instructionLabel:"Gemini Spark Configuration Instructions",instructionText:"Open Gemini Settings & help > Connected Apps, add a custom app for Spark with this MCP server URL, and complete the Taskforce OAuth flow to authorize one workspace."};case"mistral-chat":return{clientId:l,kind:"text",renderedText:p,instructionLabel:"Mistral Vibe Configuration Instructions",instructionText:"Open Mistral Vibe (formerly Le Chat) > Intelligence > Connectors, add a custom connector with this MCP server URL, and complete the Taskforce OAuth flow to authorize one workspace."};case"perplexity-chat":return{clientId:l,kind:"text",renderedText:p,instructionLabel:"Perplexity Configuration Instructions",instructionText:"Open Perplexity Settings > Connectors, add a custom remote connector with this MCP server URL, choose OAuth, and complete the Taskforce authorization flow for one workspace."};case"chatgpt-desktop":return{clientId:l,kind:"text",renderedText:p,instructionLabel:"ChatGPT Desktop Configuration Instructions",instructionText:"Open ChatGPT Apps & Connectors / developer mode, paste this MCP server URL, and complete the Taskforce OAuth authorize flow when ChatGPT opens it."};default:{const S=l;throw new Error(`Unsupported MCP client: ${S}`)}}}function gi(i){const{clientId:l,serverId:p,serverConfig:m}=i,g={command:m.command,args:m.args,...m.env&&Object.keys(m.env).length>0?{env:m.env}:{}},C=Object.entries(m.env||{}).map(([S,I])=>` --env ${Ka(`${S}=${I}`)}`).join(""),w=[m.command,...m.args].map(S=>Ka(S)).join(" ");switch(l){case"general":return{clientId:l,kind:"json",rootKey:"mcpServers",serverConfig:g,instructionLabel:"General MCP Configuration Instructions",instructionText:xe("Add this server to your MCP client using its standard local stdio configuration format.")};case"cursor":return{clientId:l,kind:"json",rootKey:"mcpServers",serverConfig:g,instructionLabel:"Cursor Configuration Instructions",instructionText:xe("Open Cursor settings, find MCP servers, and paste this local stdio config.")};case"cline":return{clientId:l,kind:"json",rootKey:"mcpServers",serverConfig:g,instructionLabel:"Cline Configuration Instructions",instructionText:xe("Open Cline MCP Servers and paste this local stdio server config.")};case"vscode":return{clientId:l,kind:"json",rootKey:"servers",serverConfig:{type:"stdio",...g},instructionLabel:"VS Code Configuration Instructions",instructionText:xe("Open .vscode/mcp.json or MCP: Open User Configuration and add this server under the servers object.")};case"kiro":return{clientId:l,kind:"json",rootKey:"mcpServers",serverConfig:g,instructionLabel:"Kiro Configuration Instructions",instructionText:xe("Open .kiro/settings/mcp.json in your workspace (or ~/.kiro/settings/mcp.json for user-level config) and add this server under mcpServers.")};case"windsurf":return{clientId:l,kind:"json",rootKey:"mcpServers",serverConfig:g,instructionLabel:"Windsurf Configuration Instructions",instructionText:xe("Open Windsurf MCP settings and paste this local stdio config.")};case"antigravity":return{clientId:l,kind:"json",rootKey:"mcpServers",serverConfig:g,instructionLabel:"Antigravity Configuration Instructions",instructionText:xe("Open Antigravity MCP settings, view the raw config, and paste this local stdio configuration.")};case"openclaw":return{clientId:l,kind:"json",rootKey:"servers",wrapperKeys:["mcp"],serverConfig:{transport:"stdio",...g},instructionLabel:"OpenClaw Configuration Instructions",instructionText:xe("Open ~/.openclaw/openclaw.json and add this local stdio server under mcp.servers.")};case"codex":return{clientId:l,kind:"text",renderedText:[`[mcp_servers.${p}]`,`command = ${Ks(m.command)}`,`args = ${Wa(m.args)}`,...Va(m.env)].join(`
|
|
4
4
|
`),instructionLabel:"Codex Configuration Instructions",instructionText:xe("Open ~/.codex/config.toml and add this local MCP entry.")};case"grok":return{clientId:l,kind:"text",renderedText:[`[mcp_servers.${p}]`,`command = ${Ks(m.command)}`,`args = ${Wa(m.args)}`,...Va(m.env)].join(`
|
package/dist/ui/assets/{TaskforceAgentsModule-Coq9-PUp.js → TaskforceAgentsModule-DmeCf6pJ.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{j as e,r as a,a as qa}from"./vendor-react-CKJs5o3c.js";import{f as gt,B as ss,C as ns,E as lt,t as r,F as si,w as Mn,G as ya,H as ni,J as ba,K as xa,L as ja,N as ka,O as Wt,Q as ai,S as qs,U as Sa,V as hs,W as ri,M as ii,X as oi,Y as Va,Z as li,_ as ci,$ as di,a0 as Vs,a1 as Ca}from"./index-
|
|
1
|
+
import{j as e,r as a,a as qa}from"./vendor-react-CKJs5o3c.js";import{f as gt,B as ss,C as ns,E as lt,t as r,F as si,w as Mn,G as ya,H as ni,J as ba,K as xa,L as ja,N as ka,O as Wt,Q as ai,S as qs,U as Sa,V as hs,W as ri,M as ii,X as oi,Y as Va,Z as li,_ as ci,$ as di,a0 as Vs,a1 as Ca}from"./index-GHJgcW3j.js";import{a as Jt,A as ui,b as fi,w as Na,r as Aa}from"./AiIdentityRosterCard-Cfvb9Nuv.js";import{ay as vt,ba as tn,y as Cs,ao as mi,a0 as Wa,$ as pi,aJ as hi,aa as Dn,bb as gi,bc as ts,d as Lt,W as vi,bd as yi,q as bi,g as xi,be as ji,S as Bn,bf as ki,t as Pt,w as je,R as nn,a6 as On,u as Zt,X as yt,Z as st,bg as Si,Y as Ci,v as Ja,A as Ya,bh as Ws,ad as wa,ah as Qa,a2 as Xa,a7 as Za,ap as Ni,r as Ai,J as Xt,ak as wi,O as _a,bi as _i}from"./vendor-icons-Bsq-mcEn.js";import"./vendor-markdown-_lhNCyq-.js";import"./vendor-dnd-CJ-AjP-Y.js";import"./vendor-router-AqJMU8Lz.js";const An=1,Pe={name:80,shortDescription:240,purpose:2e3,listItem:1e3,listItems:24,workingGuidance:6e3,reference:200,promptContent:12e3};function Ta(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function Ie(t,n,i,o){t.push({code:n,path:i,message:o})}function Ra(t,n,i,o){const f=new Set(n);Object.keys(t).forEach(w=>{f.has(w)||Ie(o,"unknown_field",i?`${i}.${w}`:w,"This field is not part of Agent Role v1.")})}function wn(t,n,i,o){if(typeof t!="string")return Ie(o,"required_string",n,"A string value is required."),"";const f=t.trim();return f?f.length>i&&Ie(o,"string_too_long",n,`Must be ${i} characters or less.`):Ie(o,"required_string",n,"A non-empty value is required."),f}function Ti(t,n,i,o){if(t==null||t==="")return;if(typeof t!="string"){Ie(o,"invalid_string",n,"Must be a string when provided.");return}const f=t.trim();if(f)return f.length>i&&Ie(o,"string_too_long",n,`Must be ${i} characters or less.`),f}function Js(t,n,i,o){if(!Array.isArray(t))return Ie(o,"invalid_list",n,"Must be an array of strings."),[];i.required&&t.length===0&&Ie(o,"required_list",n,"Provide at least one item."),i.maxItems&&t.length>i.maxItems&&Ie(o,"too_many_items",n,`Provide no more than ${i.maxItems} items.`);const f=new Set,w=[];return t.forEach((N,x)=>{if(typeof N!="string"){Ie(o,"invalid_string",`${n}[${x}]`,"Must be a string.");return}const k=N.trim();if(!k){Ie(o,"empty_list_item",`${n}[${x}]`,"List items cannot be blank.");return}k.length>i.maxItemLength&&Ie(o,"string_too_long",`${n}[${x}]`,`Must be ${i.maxItemLength} characters or less.`),!f.has(k)&&(f.add(k),w.push(k))}),w}function er(t){const n=[];if(!Ta(t))return{definition:null,issues:[{code:"invalid_definition",path:"",message:"Agent Role definition must be an object."}]};Ra(t,["schemaVersion","name","shortDescription","purpose","responsibilities","expectedOutputs","workingGuidance","recommendations"],"",n),t.schemaVersion!==An&&Ie(n,"unsupported_schema_version","schemaVersion",`Agent Role schemaVersion must be ${An}.`);const i=wn(t.name,"name",Pe.name,n),o=wn(t.shortDescription,"shortDescription",Pe.shortDescription,n),f=wn(t.purpose,"purpose",Pe.purpose,n),w=Js(t.responsibilities,"responsibilities",{required:!0,maxItems:Pe.listItems,maxItemLength:Pe.listItem},n),N=Js(t.expectedOutputs,"expectedOutputs",{required:!0,maxItems:Pe.listItems,maxItemLength:Pe.listItem},n),x=Ti(t.workingGuidance,"workingGuidance",Pe.workingGuidance,n),k=Ta(t.recommendations)?t.recommendations:null;k?Ra(k,["skillRefs","capabilityGroups"],"recommendations",n):Ie(n,"invalid_recommendations","recommendations","Recommendations must be an object.");const $=Js(k?.skillRefs??[],"recommendations.skillRefs",{maxItems:Pe.listItems,maxItemLength:Pe.reference},n),L=Js(k?.capabilityGroups??[],"recommendations.capabilityGroups",{maxItems:Pe.listItems,maxItemLength:Pe.reference},n),K={schemaVersion:An,name:i,shortDescription:o,purpose:f,responsibilities:w,expectedOutputs:N,...x?{workingGuidance:x}:{},recommendations:{skillRefs:$,capabilityGroups:L}};return n.length===0&&tr(K).length>Pe.promptContent&&Ie(n,"compiled_prompt_too_long","",`Compiled Role prompt content must be ${Pe.promptContent} characters or less.`),{definition:n.length===0?K:null,issues:n}}class Ri extends Error{constructor(n){super(n[0]?.message||"Agent Role definition is invalid."),this.issues=n,this.name="AgentRoleDefinitionValidationError"}code="AGENT_ROLE_DEFINITION_INVALID";statusCode=400}function Ei(t){const n=er(t);if(!n.definition)throw new Ri(n.issues);return n.definition}function Ea(t){return t.map(n=>`- ${n}`).join(`
|
|
2
2
|
`)}function tr(t){return[`Role: ${t.name}`,`Purpose and scope:
|
|
3
3
|
${t.purpose}`,`Responsibilities:
|
|
4
4
|
${Ea(t.responsibilities)}`,`Expected outputs:
|
package/dist/ui/assets/{WorkflowManagerModule-CuqRzMmM.js → WorkflowManagerModule-p08eDOaa.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as n,j as e}from"./vendor-react-CKJs5o3c.js";import{a2 as ze,a3 as Me,a4 as Oe,a5 as He,a6 as Le,a7 as Fe,M as Be,t as $,a8 as Ue,a9 as Ge,aa as Je,T as Ye,ab as _e,ac as Ze}from"./index-DSQINwt9.js";import{w as J,az as le,ak as Qe,t as pe,Z as je,bj as Xe,bk as et,a6 as tt,bl as st,bm as nt,a7 as rt,a as at,x as lt,v as it,A as ot,r as ct}from"./vendor-icons-Bsq-mcEn.js";import"./vendor-markdown-_lhNCyq-.js";import"./vendor-dnd-CJ-AjP-Y.js";import"./vendor-router-AqJMU8Lz.js";const dt="_root_1bn9e_1",ut="_main_1bn9e_13",ft="_trayOpen_1bn9e_21",mt="_libraryHeader_1bn9e_25",pt="_libraryTitle_1bn9e_34",bt="_libraryContent_1bn9e_41",ht="_libraryList_1bn9e_48",wt="_libraryItem_1bn9e_54",xt="_libraryItemSelected_1bn9e_75",yt="_libraryItemCopy_1bn9e_80",gt="_libraryItemName_1bn9e_84",_t="_libraryItemMeta_1bn9e_94",jt="_libraryBadges_1bn9e_101",Nt="_statusRow_1bn9e_102",vt="_content_1bn9e_109",kt="_visuallyHidden_1bn9e_115",St="_pageHeader_1bn9e_127",Ct="_pageHeading_1bn9e_136",Dt="_detailHeader_1bn9e_144",Et="_metadataEditor_1bn9e_148",Wt="_titleRow_1bn9e_154",It="_editor_1bn9e_169",Tt="_stickyToolbar_1bn9e_173",Kt="_toolbarGroup_1bn9e_188",Rt="_versionSelect_1bn9e_194",$t="_description_1bn9e_211",qt="_metrics_1bn9e_217",Vt="_metric_1bn9e_217",At="_section_1bn9e_249",Pt="_sectionHeader_1bn9e_253",zt="_stepToolbar_1bn9e_254",Mt="_stepActions_1bn9e_255",Ot="_stepList_1bn9e_266",Ht="_stepEditor_1bn9e_273",Lt="_stepToolbarExpanded_1bn9e_285",Ft="_stepExpandButton_1bn9e_289",Bt="_stepSummary_1bn9e_311",Ut="_stepFields_1bn9e_328",Gt="_fullField_1bn9e_335",Jt="_stepToggles_1bn9e_337",Yt="_requiredToggle_1bn9e_345",Zt="_stepsEmpty_1bn9e_356",Qt="_stepNumber_1bn9e_376",Xt="_emptyState_1bn9e_382",es="_loadingState_1bn9e_383",ts="_emptyStateInner_1bn9e_391",ss="_errorBanner_1bn9e_399",ns="_errorMessage_1bn9e_407",s={root:dt,main:ut,trayOpen:ft,libraryHeader:mt,libraryTitle:pt,libraryContent:bt,libraryList:ht,libraryItem:wt,libraryItemSelected:xt,libraryItemCopy:yt,libraryItemName:gt,libraryItemMeta:_t,libraryBadges:jt,statusRow:Nt,content:vt,visuallyHidden:kt,pageHeader:St,pageHeading:Ct,detailHeader:Dt,metadataEditor:Et,titleRow:Wt,editor:It,stickyToolbar:Tt,toolbarGroup:Kt,versionSelect:Rt,description:$t,metrics:qt,metric:Vt,section:At,sectionHeader:Pt,stepToolbar:zt,stepActions:Mt,stepList:Ot,stepEditor:Ht,stepToolbarExpanded:Lt,stepExpandButton:Ft,stepSummary:Bt,stepFields:Ut,fullField:Gt,stepToggles:Jt,requiredToggle:Yt,stepsEmpty:Zt,stepNumber:Qt,emptyState:Xt,loadingState:es,emptyStateInner:ts,errorBanner:ss,errorMessage:ns};function rs(c){const[_,k]=n.useState([]),[u,w]=n.useState(""),[E,g]=n.useState(null),[q,i]=n.useState(!0),[O,H]=n.useState(!1),[Y,L]=n.useState(!1),[Z,F]=n.useState(!1),[B,Q]=n.useState(!1),[ie,X]=n.useState(!1),[oe,ce]=n.useState(0),[de,x]=n.useState(null),m=n.useRef(0),p=n.useRef(c);p.current=c;const y=n.useCallback(async()=>{const r=++m.current;i(!0),x(null);try{const o=await ze();if(r!==m.current)return;k(o),w(f=>f&&o.some(({template:C})=>C.id===f)?f:o[0]?.template.id||"")}catch(o){if(r!==m.current)return;x(String(o?.message||o||"Unable to load workflows."))}finally{r===m.current&&i(!1)}},[c]);n.useEffect(()=>{k([]),w(""),g(null),y()},[y,c]),n.useEffect(()=>{let r=!1;if(!u){g(null),H(!1);return}return H(!0),x(null),Me(u).then(o=>{r||g(o)}).catch(o=>{r||(g(null),x(String(o?.message||o||"Unable to load workflow.")))}).finally(()=>{r||H(!1)}),()=>{r=!0}},[oe,u]);const S=n.useCallback(()=>{if(u&&!E){ce(r=>r+1);return}y()},[y,E,u]),j=n.useCallback(async r=>{const o=c;L(!0),x(null);try{const f=await Oe(r);return p.current!==o||(g(f),w(f.template.id),await y(),p.current===o&&w(f.template.id)),!0}catch(f){return p.current!==o||x(String(f?.message||f||"Unable to create workflow.")),!1}finally{L(!1)}},[y,c]),V=n.useCallback(async r=>{if(!u)return!1;const o=c,f=u;F(!0),x(null);try{const C=await He(f,{name:r.name,description:r.description,steps:r.steps});return p.current!==o||(g(C),await y(),p.current===o&&w(f)),!0}catch(C){return p.current!==o||x(String(C?.message||C||"Unable to save workflow draft.")),!1}finally{F(!1)}},[y,u,c]),T=n.useCallback(async()=>{if(!u)return!1;const r=c,o=u;Q(!0),x(null);try{const f=await Le(o);return p.current!==r||(g(f),await y(),p.current===r&&w(o)),!0}catch(f){return p.current!==r||x(String(f?.message||f||"Unable to publish workflow.")),!1}finally{Q(!1)}},[y,u,c]),A=n.useCallback(async()=>{if(!u)return!1;const r=c,o=u;X(!0),x(null);try{const f=await Fe(o);return p.current!==r||(g(f),await y(),p.current===r&&w(o)),!0}catch(f){return p.current!==r||x(String(f?.message||f||"Unable to create workflow draft.")),!1}finally{X(!1)}},[y,u,c]);return{workflows:_,selectedWorkflowId:u,selectedWorkflow:E,loadingLibrary:q,loadingDetails:O,creatingWorkflow:Y,savingWorkflow:Z,publishingWorkflow:B,creatingDraft:ie,error:de,setSelectedWorkflowId:w,refreshLibrary:y,retry:S,createWorkflow:j,saveDraft:V,publishDraft:T,createNextDraft:A,clearError:()=>x(null)}}const as="_title_lvjgs_1",ls="_message_lvjgs_7",is="_actions_lvjgs_13",be={title:as,message:ls,actions:is};function os({isOpen:c,workflowName:_,versionNumber:k,busy:u,onCancel:w,onPublish:E,theme:g}){return e.jsx(Be,{isOpen:c,onClose:w,title:e.jsxs("span",{className:be.title,children:[e.jsx(le,{size:18})," Publish Workflow"]}),size:"sm",closeOnOverlayClick:!1,closeDisabled:u,theme:g,footer:e.jsxs("div",{className:be.actions,children:[e.jsx("button",{type:"button",className:"tf-button-secondary",onClick:w,disabled:u,"data-modal-initial-focus":!0,children:"Cancel"}),e.jsxs("button",{type:"button",className:"tf-button-primary",onClick:E,disabled:u,children:[u?e.jsx(J,{size:15,className:$.spinner}):e.jsx(le,{size:15}),"Publish Version ",k]})]}),children:e.jsxs("p",{className:be.message,children:["Publish ",e.jsx("strong",{children:_})," as Version ",k,"? Published versions are immutable. Future changes require a new draft."]})})}const re="draft";function cs(c){return c.draftVersionId&&c.latestPublishedVersion?.versionNumber?`Version ${c.latestPublishedVersion.versionNumber} published`:c.draftVersionId?"Unpublished":c.latestPublishedVersion?.versionNumber?`Version ${c.latestPublishedVersion.versionNumber}`:"No version"}function ds(c){if(!c)return"Not published";const _=new Date(c);return Number.isNaN(_.getTime())?"Not published":_.toLocaleDateString()}function ae(c,_,k){return JSON.stringify({name:c,description:_,steps:k.map(({clientKey:u,...w})=>w)})}function ws({workspaceId:c,libraryTrayOpen:_=!0,onCloseLibraryTray:k,assigneeOptions:u=[],theme:w,onUnsavedChangesChange:E}){const{workflows:g,selectedWorkflowId:q,selectedWorkflow:i,loadingLibrary:O,loadingDetails:H,creatingWorkflow:Y,savingWorkflow:L,publishingWorkflow:Z,creatingDraft:F,error:B,setSelectedWorkflowId:Q,retry:ie,createWorkflow:X,saveDraft:oe,publishDraft:ce,createNextDraft:de,clearError:x}=rs(c),[m,p]=n.useState(!1),[y,S]=n.useState(!1),[j,V]=n.useState(""),[T,A]=n.useState(""),[r,o]=n.useState([]),[f,C]=n.useState(""),[P,ee]=n.useState(!1),[te,U]=n.useState(""),[ue,W]=n.useState(new Set),[he,fe]=n.useState(null),[Ne,z]=n.useState(!1),me=n.useRef(null),se=n.useRef(new Map),K=n.useRef(null),D=n.useMemo(()=>i?te===re&&i.draft?i.draft:i.publishedVersions.find(({version:a})=>a.id===te)||i.draft||i.publishedVersions[0]||null:null,[te,i]),we=D?.version.status==="draft"?re:D?.version.id||"",ve=n.useMemo(()=>ae(j,T,r),[T,j,r]),N=m||D?.version.status==="draft",I=N&&ve!==f,b=Y||L||Z||F,ke=(i?.publishedVersions[0]?.version.versionNumber||0)+1,xe=n.useMemo(()=>u.filter(({kind:t,archivedAt:a})=>t!=="unassigned"&&!a),[u]),Se=n.useMemo(()=>Ue(xe),[xe]);n.useEffect(()=>{p(!1),S(!1),U(""),W(new Set),z(!1),K.current=null},[c]),n.useEffect(()=>{if(!i||m||!D)return;const t=D.version.name||i.template.name,a=D.version.description??i.template.description??"",d=D.steps.map(h=>({...h,clientKey:h.id}));V(t),A(a),o(d),C(ae(t,a,d));const l=K.current;S(!1),l?(W(new Set(d.filter((h,v)=>l.has(v)).map(({clientKey:h})=>h))),K.current=null):W(new Set),ee(!1)},[m,D,i]),n.useEffect(()=>{if(!I)return;const t=a=>{a.preventDefault(),a.returnValue=""};return window.addEventListener("beforeunload",t),()=>window.removeEventListener("beforeunload",t)},[I]),n.useEffect(()=>(E?.(I),()=>E?.(!1)),[I,E]);const ne=t=>{if(!I){t();return}fe(()=>t)},Ce=()=>{const t=he;fe(null),t?.()},ye=()=>{ne(()=>{x();const t=[];p(!0),S(!0),V(""),A(""),o(t),C(ae("","",t)),W(new Set),ee(!1),window.setTimeout(()=>me.current?.focus(),0)})},De=()=>{ne(()=>{if(x(),p(!1),S(!1),i){const t=i.draft?.version.name||i.template.name,a=i.draft?.version.description??i.publishedVersions[0]?.version.description??i.template.description??"",d=(i.draft?.steps||i.publishedVersions[0]?.steps||[]).map(l=>({...l,clientKey:l.id}));V(t),A(a),o(d),C(ae(t,a,d))}})},Ee=()=>{const t=`new-step-${Date.now()}-${r.length}`;o(a=>[...a,{id:t,clientKey:t,workflowVersionId:i?.draft?.version.id||"",position:a.length,name:"",instructions:"",ownerType:null,ownerId:null,expectedArtifact:null,requiresCommentEvidence:!1,isRequired:!0}]),W(a=>new Set(a).add(t)),window.setTimeout(()=>se.current.get(t)?.focus(),0)},M=(t,a)=>{o(d=>d.map(l=>l.clientKey===t?{...l,...a}:l))},ge=(t,a)=>{const d=t+a;d<0||d>=r.length||o(l=>{const h=[...l];return[h[t],h[d]]=[h[d],h[t]],h.map((v,R)=>({...v,position:R}))})},We=()=>r.map(t=>{const{clientKey:a,id:d,workflowVersionId:l,position:h,...v}=t;return{...v,name:t.name.trim(),instructions:t.instructions,ownerType:t.ownerType??null,ownerId:t.ownerId??null,expectedArtifact:t.expectedArtifact??null,requiresCommentEvidence:t.requiresCommentEvidence===!0,isRequired:t.isRequired}}),Ie=async()=>{if(ee(!0),!j.trim()){S(!0),window.setTimeout(()=>me.current?.focus(),0);return}const t=r.find(l=>!l.name.trim());if(t){W(l=>new Set(l).add(t.clientKey)),window.setTimeout(()=>se.current.get(t.clientKey)?.focus(),0);return}const a={name:j.trim(),description:T.trim(),steps:We()};K.current=new Set(r.map((l,h)=>ue.has(l.clientKey)?h:-1).filter(l=>l>=0)),(m?await X(a):await oe(a))?(p(!1),ee(!1)):K.current=null},Te=t=>{W(a=>{const d=new Set(a);return d.has(t)?d.delete(t):d.add(t),d})},Ke=t=>{t!==we&&ne(()=>{S(!1),U(t)})},Re=async()=>{K.current=new Set(r.map((a,d)=>ue.has(a.clientKey)?d:-1).filter(a=>a>=0)),await ce()||(K.current=null),z(!1)},$e=async()=>{const t=te;U(re),await de()||U(t)},qe=t=>{t===q&&!m||ne(()=>{p(!1),S(!1),U(""),z(!1),Q(t)})},Ve=e.jsxs("aside",{className:`${$.docTrayPanel} ${_?$.docTrayPanelOpen:""}`.trim(),"aria-hidden":!_,children:[e.jsxs("div",{className:s.libraryHeader,children:[e.jsxs("span",{className:`${s.libraryTitle} tf-label-micro`,children:[e.jsx(le,{size:14})," Workflow Library"]}),O?e.jsx(J,{size:14,className:$.spinner}):null,k?e.jsx("button",{type:"button",className:"tf-control-icon",onClick:k,title:"Collapse workflow library","aria-label":"Collapse workflow library",children:e.jsx(Qe,{size:16})}):null]}),e.jsx("div",{className:`${s.libraryContent} tf-scrollbar tf-tray-scroll-viewport`,children:g.length>0?e.jsx("div",{className:s.libraryList,children:g.map(t=>e.jsxs("button",{type:"button",className:`${s.libraryItem} ${t.template.id===q&&!m?s.libraryItemSelected:""}`.trim(),disabled:b,onClick:()=>qe(t.template.id),"aria-pressed":t.template.id===q&&!m,children:[e.jsxs("span",{className:s.libraryItemCopy,children:[e.jsx("span",{className:s.libraryItemName,children:t.template.name}),e.jsx("span",{className:s.libraryItemMeta,children:cs(t)})]}),e.jsxs("span",{className:s.libraryBadges,children:[t.draftVersionId?e.jsx("span",{className:"tf-chip-warning",children:"Draft"}):null,t.latestPublishedVersion?e.jsx("span",{className:"tf-chip-success",children:"Published"}):null]})]},t.template.id))}):O?null:e.jsx("p",{className:"tf-text-helper",children:"No workflows configured yet."})})]}),Ae=m||!!i;return e.jsxs("div",{className:`${s.root} ${_?s.trayOpen:""}`.trim(),children:[Ve,e.jsx("main",{className:`${s.main} tf-scrollbar`,children:e.jsxs("div",{className:s.content,children:[e.jsxs("header",{className:s.pageHeader,children:[e.jsxs("div",{className:s.pageHeading,children:[e.jsx("h2",{className:"tf-heading-section",children:"Workflow Manager"}),e.jsx("p",{className:"tf-text-helper",children:"Design reusable workflows for Taskforce agents."})]}),e.jsxs("button",{type:"button",className:"tf-button-secondary tf-button-compact",onClick:ye,disabled:b,children:[e.jsx(pe,{size:15})," New Workflow"]})]}),B?e.jsxs("div",{className:`${s.errorBanner} tf-surface-inset tf-text-error`,role:"alert",children:[e.jsxs("span",{className:s.errorMessage,children:[e.jsx(je,{size:14})," ",B]}),e.jsx("button",{type:"button",className:"tf-button-ghost tf-button-compact",onClick:ie,children:"Retry"})]}):null,H||O&&!i&&!m?e.jsx("div",{className:s.loadingState,"aria-live":"polite",children:e.jsx(J,{size:20,className:$.spinner})}):B&&q&&!i&&!m?e.jsx("div",{className:s.emptyState,children:e.jsxs("div",{className:s.emptyStateInner,children:[e.jsx(je,{size:24}),e.jsx("h3",{className:"tf-heading-card",children:"Workflow details unavailable"}),e.jsx("p",{className:"tf-text-helper",children:"Retry the request to load this workflow."})]})}):Ae?e.jsxs("div",{className:s.editor,children:[e.jsxs("div",{className:s.stickyToolbar,role:"toolbar","aria-label":N?"Workflow draft actions":"Workflow version actions",children:[N?e.jsxs("div",{className:s.toolbarGroup,children:[e.jsxs("button",{type:"button",className:"tf-button-secondary tf-button-compact",onClick:Ee,disabled:b,children:[e.jsx(pe,{size:14})," Add Step"]}),e.jsx("button",{type:"button",className:"tf-control-icon",onClick:()=>W(new Set(r.map(({clientKey:t})=>t))),disabled:r.length===0,title:"Expand all steps","aria-label":"Expand all steps",children:e.jsx(Xe,{size:15})}),e.jsx("button",{type:"button",className:"tf-control-icon",onClick:()=>W(new Set),disabled:r.length===0,title:"Collapse all steps","aria-label":"Collapse all steps",children:e.jsx(et,{size:15})})]}):e.jsx("span",{}),e.jsxs("div",{className:s.toolbarGroup,children:[!m&&i?e.jsxs("select",{className:`${s.versionSelect} tf-field-shell`,"aria-label":"Workflow version",value:we,onChange:t=>Ke(t.target.value),disabled:b,children:[i.draft?e.jsx("option",{value:re,children:"Draft"}):null,i.publishedVersions.map(({version:t})=>e.jsxs("option",{value:t.id,children:["Version ",t.versionNumber]},t.id))]}):null,m?e.jsx("span",{className:"tf-chip-warning",children:"Draft"}):null,m?e.jsx("button",{type:"button",className:"tf-button-ghost tf-button-compact",onClick:De,disabled:b,children:"Cancel"}):null,N?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:s.visuallyHidden,role:"status","aria-live":"polite",children:I?"Workflow has unsaved changes.":"Workflow draft is saved."}),e.jsxs("button",{type:"button",className:"tf-button-primary tf-button-compact",onClick:()=>{Ie()},disabled:!I||b,children:[Y||L?e.jsx(J,{size:15,className:$.spinner}):e.jsx(tt,{size:15})," Save Draft"]}),m?null:e.jsxs("button",{type:"button",className:"tf-button-secondary tf-button-compact",onClick:()=>z(!0),disabled:I||r.length===0||b,title:I?"Save the draft before publishing.":r.length===0?"Add at least one step before publishing.":"Publish this workflow version",children:[e.jsx(st,{size:15})," Publish"]})]}):i?.draft?null:e.jsxs("button",{type:"button",className:"tf-button-primary tf-button-compact",onClick:()=>{$e()},disabled:b,children:[F?e.jsx(J,{size:15,className:$.spinner}):e.jsx(nt,{size:15})," Create New Draft"]})]})]}),e.jsx("div",{className:s.detailHeader,children:e.jsx("div",{className:s.metadataEditor,children:y?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"tf-field-stack",children:[e.jsx("label",{className:"tf-field-label",htmlFor:"workflow-draft-name",children:"Workflow name"}),e.jsx("input",{id:"workflow-draft-name",ref:me,className:"tf-field-shell",value:j,onChange:t=>V(t.target.value),"aria-invalid":P&&!j.trim(),"aria-describedby":P&&!j.trim()?"workflow-draft-name-error":void 0,readOnly:b}),P&&!j.trim()?e.jsx("span",{id:"workflow-draft-name-error",className:"tf-text-error",children:"Workflow name is required."}):null]}),e.jsxs("div",{className:"tf-field-stack",children:[e.jsx("label",{className:"tf-field-label",htmlFor:"workflow-draft-description",children:"Description"}),e.jsx("textarea",{id:"workflow-draft-description",className:"tf-field-shell",rows:3,value:T,onChange:t=>A(t.target.value),readOnly:b})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:s.titleRow,children:[e.jsx("h3",{className:"tf-heading-card",children:j||"Untitled workflow"}),e.jsx("div",{className:s.statusRow,children:N&&!m?e.jsx("button",{type:"button",className:"tf-control-icon",onClick:()=>S(!0),title:"Edit workflow details","aria-label":"Edit workflow details",children:e.jsx(rt,{size:14})}):null})]}),T?e.jsx("p",{className:`${s.description} tf-text-body`,children:T}):null]})})}),!m&&i?e.jsxs("div",{className:s.metrics,children:[e.jsxs("div",{className:s.metric,children:[e.jsx("span",{className:"tf-label-micro",children:"Current version"}),e.jsx("strong",{children:D?.version.status==="draft"?"Draft":`Version ${D?.version.versionNumber||1}`})]}),e.jsxs("div",{className:s.metric,children:[e.jsx("span",{className:"tf-label-micro",children:"Steps"}),e.jsx("strong",{children:r.length})]}),e.jsxs("div",{className:s.metric,children:[e.jsx("span",{className:"tf-label-micro",children:"Last published"}),e.jsx("strong",{children:ds(i.publishedVersions[0]?.version.publishedAt)})]})]}):null,e.jsxs("section",{className:s.section,children:[e.jsx("div",{className:s.sectionHeader,children:e.jsx("h4",{className:"tf-heading-card",children:"Workflow Steps"})}),r.length>0?e.jsx("div",{className:s.stepList,children:r.map((t,a)=>{const d=ue.has(t.clientKey);return e.jsxs("div",{className:s.stepEditor,children:[e.jsxs("div",{className:`${s.stepToolbar} ${d?s.stepToolbarExpanded:""}`.trim(),children:[e.jsxs("button",{type:"button",className:s.stepExpandButton,onClick:()=>Te(t.clientKey),"aria-expanded":d,"aria-controls":`workflow-step-fields-${t.clientKey}`,children:[d?e.jsx(at,{size:15}):e.jsx(lt,{size:15}),e.jsx("span",{className:s.stepNumber,children:a+1}),e.jsx("strong",{children:t.name.trim()||"Untitled step"})]}),e.jsxs("div",{className:s.stepSummary,children:[e.jsx("span",{children:Ge(t.ownerId,u)}),e.jsx("span",{className:t.isRequired?"tf-chip-neutral":"tf-chip-warning",children:t.isRequired?"Required":"Optional"})]}),N?e.jsxs("div",{className:s.stepActions,children:[e.jsx("button",{type:"button",className:"tf-control-icon",title:"Move step up","aria-label":`Move step ${a+1} up`,onClick:()=>ge(a,-1),disabled:b||a===0,children:e.jsx(it,{size:14})}),e.jsx("button",{type:"button",className:"tf-control-icon",title:"Move step down","aria-label":`Move step ${a+1} down`,onClick:()=>ge(a,1),disabled:b||a===r.length-1,children:e.jsx(ot,{size:14})}),e.jsx("button",{type:"button",className:"tf-control-icon",title:"Remove step","aria-label":`Remove step ${a+1}`,onClick:()=>o(l=>l.filter(({clientKey:h})=>h!==t.clientKey)),disabled:b,children:e.jsx(ct,{size:14})})]}):null]}),d?e.jsxs("div",{id:`workflow-step-fields-${t.clientKey}`,className:s.stepFields,children:[e.jsxs("div",{className:"tf-field-stack",children:[e.jsx("label",{className:"tf-field-label",htmlFor:`workflow-step-name-${t.clientKey}`,children:"Step name"}),e.jsx("input",{id:`workflow-step-name-${t.clientKey}`,ref:l=>{l?se.current.set(t.clientKey,l):se.current.delete(t.clientKey)},className:"tf-field-shell",value:t.name,onChange:l=>M(t.clientKey,{name:l.target.value}),"aria-invalid":P&&!t.name.trim(),"aria-describedby":P&&!t.name.trim()?`workflow-step-name-error-${t.clientKey}`:void 0,disabled:!N,readOnly:b}),P&&!t.name.trim()?e.jsx("span",{id:`workflow-step-name-error-${t.clientKey}`,className:"tf-text-error",children:"Step name is required."}):null]}),e.jsxs("div",{className:"tf-field-stack",children:[e.jsx("label",{className:"tf-field-label",id:`workflow-step-owner-label-${t.clientKey}`,children:"Owner"}),(()=>{const l=Je(Se,t.ownerId),h=l.find(({value:v})=>String(v)===String(t.ownerId||"unassigned"))||l[0];return e.jsx(Ye,{value:t.ownerId||"unassigned",options:l,disabled:!N||b,ariaLabelledBy:`workflow-step-owner-label-${t.clientKey}`,portalPanel:!0,panelMinWidth:280,panelAlign:"start",searchable:!0,searchPlaceholder:"Search owners...",noResultsText:"No owners found.",triggerContent:h?e.jsx(_e,{option:h}):void 0,renderOptionContent:v=>{const R=l.find(({value:G})=>String(G)===String(v.value));return R?e.jsx(_e,{option:R}):v.label},onChange:v=>{const R=String(v),G=l.find(({value:Pe})=>String(Pe)===R);M(t.clientKey,{ownerId:G?.kind==="unassigned"?null:R,ownerType:G?.kind==="agent"?"agent":G?.kind==="member"?"user":null})}})})()]}),e.jsxs("div",{className:`${s.fullField} tf-field-stack`,children:[e.jsx("label",{className:"tf-field-label",htmlFor:`workflow-step-instructions-${t.clientKey}`,children:"Instructions"}),e.jsx("textarea",{id:`workflow-step-instructions-${t.clientKey}`,className:"tf-field-shell",rows:4,value:t.instructions,onChange:l=>M(t.clientKey,{instructions:l.target.value}),placeholder:"Describe the work to complete in this step.",disabled:!N,readOnly:b})]}),e.jsxs("div",{className:"tf-field-stack",children:[e.jsx("label",{className:"tf-field-label",htmlFor:`workflow-step-artifact-${t.clientKey}`,children:"Output label"}),e.jsx("input",{id:`workflow-step-artifact-${t.clientKey}`,className:"tf-field-shell",value:t.expectedArtifact||"",onChange:l=>M(t.clientKey,{expectedArtifact:l.target.value||null}),placeholder:"Optional output description",disabled:!N,readOnly:b})]}),e.jsxs("div",{className:s.stepToggles,children:[e.jsxs("label",{className:s.requiredToggle,title:"Requires the step owner to add a task comment before completing this step.",children:[e.jsx("input",{type:"checkbox",checked:t.requiresCommentEvidence===!0,onChange:l=>M(t.clientKey,{requiresCommentEvidence:l.target.checked}),disabled:!N||b}),"Require task comment"]}),e.jsxs("label",{className:s.requiredToggle,title:"Marks this step as mandatory when execution policy is enforced.",children:[e.jsx("input",{type:"checkbox",checked:t.isRequired,onChange:l=>M(t.clientKey,{isRequired:l.target.checked}),disabled:!N||b}),"Required step"]})]})]}):null]},t.clientKey)})}):e.jsx("div",{className:s.stepsEmpty,children:e.jsx("p",{className:"tf-text-helper",children:"No steps have been added yet."})})]})]}):e.jsx("div",{className:s.emptyState,children:e.jsxs("div",{className:s.emptyStateInner,children:[e.jsx(le,{size:30}),e.jsx("h3",{className:"tf-heading-card",children:"No workflows yet"}),e.jsx("p",{className:"tf-text-helper",children:"Create a workflow to begin defining a reusable process."}),e.jsxs("button",{type:"button",className:"tf-button-primary",onClick:ye,children:[e.jsx(pe,{size:15})," New Workflow"]})]})})]})}),e.jsx(Ze,{isOpen:!!he,onKeepEditing:()=>fe(null),onDiscard:Ce,theme:w}),e.jsx(os,{isOpen:Ne,workflowName:j,versionNumber:ke,busy:Z,onCancel:()=>z(!1),onPublish:()=>{Re()},theme:w})]})}export{ws as WorkflowManagerModule};
|
|
1
|
+
import{r as n,j as e}from"./vendor-react-CKJs5o3c.js";import{a2 as ze,a3 as Me,a4 as Oe,a5 as He,a6 as Le,a7 as Fe,M as Be,t as $,a8 as Ue,a9 as Ge,aa as Je,T as Ye,ab as _e,ac as Ze}from"./index-GHJgcW3j.js";import{w as J,az as le,ak as Qe,t as pe,Z as je,bj as Xe,bk as et,a6 as tt,bl as st,bm as nt,a7 as rt,a as at,x as lt,v as it,A as ot,r as ct}from"./vendor-icons-Bsq-mcEn.js";import"./vendor-markdown-_lhNCyq-.js";import"./vendor-dnd-CJ-AjP-Y.js";import"./vendor-router-AqJMU8Lz.js";const dt="_root_1bn9e_1",ut="_main_1bn9e_13",ft="_trayOpen_1bn9e_21",mt="_libraryHeader_1bn9e_25",pt="_libraryTitle_1bn9e_34",bt="_libraryContent_1bn9e_41",ht="_libraryList_1bn9e_48",wt="_libraryItem_1bn9e_54",xt="_libraryItemSelected_1bn9e_75",yt="_libraryItemCopy_1bn9e_80",gt="_libraryItemName_1bn9e_84",_t="_libraryItemMeta_1bn9e_94",jt="_libraryBadges_1bn9e_101",Nt="_statusRow_1bn9e_102",vt="_content_1bn9e_109",kt="_visuallyHidden_1bn9e_115",St="_pageHeader_1bn9e_127",Ct="_pageHeading_1bn9e_136",Dt="_detailHeader_1bn9e_144",Et="_metadataEditor_1bn9e_148",Wt="_titleRow_1bn9e_154",It="_editor_1bn9e_169",Tt="_stickyToolbar_1bn9e_173",Kt="_toolbarGroup_1bn9e_188",Rt="_versionSelect_1bn9e_194",$t="_description_1bn9e_211",qt="_metrics_1bn9e_217",Vt="_metric_1bn9e_217",At="_section_1bn9e_249",Pt="_sectionHeader_1bn9e_253",zt="_stepToolbar_1bn9e_254",Mt="_stepActions_1bn9e_255",Ot="_stepList_1bn9e_266",Ht="_stepEditor_1bn9e_273",Lt="_stepToolbarExpanded_1bn9e_285",Ft="_stepExpandButton_1bn9e_289",Bt="_stepSummary_1bn9e_311",Ut="_stepFields_1bn9e_328",Gt="_fullField_1bn9e_335",Jt="_stepToggles_1bn9e_337",Yt="_requiredToggle_1bn9e_345",Zt="_stepsEmpty_1bn9e_356",Qt="_stepNumber_1bn9e_376",Xt="_emptyState_1bn9e_382",es="_loadingState_1bn9e_383",ts="_emptyStateInner_1bn9e_391",ss="_errorBanner_1bn9e_399",ns="_errorMessage_1bn9e_407",s={root:dt,main:ut,trayOpen:ft,libraryHeader:mt,libraryTitle:pt,libraryContent:bt,libraryList:ht,libraryItem:wt,libraryItemSelected:xt,libraryItemCopy:yt,libraryItemName:gt,libraryItemMeta:_t,libraryBadges:jt,statusRow:Nt,content:vt,visuallyHidden:kt,pageHeader:St,pageHeading:Ct,detailHeader:Dt,metadataEditor:Et,titleRow:Wt,editor:It,stickyToolbar:Tt,toolbarGroup:Kt,versionSelect:Rt,description:$t,metrics:qt,metric:Vt,section:At,sectionHeader:Pt,stepToolbar:zt,stepActions:Mt,stepList:Ot,stepEditor:Ht,stepToolbarExpanded:Lt,stepExpandButton:Ft,stepSummary:Bt,stepFields:Ut,fullField:Gt,stepToggles:Jt,requiredToggle:Yt,stepsEmpty:Zt,stepNumber:Qt,emptyState:Xt,loadingState:es,emptyStateInner:ts,errorBanner:ss,errorMessage:ns};function rs(c){const[_,k]=n.useState([]),[u,w]=n.useState(""),[E,g]=n.useState(null),[q,i]=n.useState(!0),[O,H]=n.useState(!1),[Y,L]=n.useState(!1),[Z,F]=n.useState(!1),[B,Q]=n.useState(!1),[ie,X]=n.useState(!1),[oe,ce]=n.useState(0),[de,x]=n.useState(null),m=n.useRef(0),p=n.useRef(c);p.current=c;const y=n.useCallback(async()=>{const r=++m.current;i(!0),x(null);try{const o=await ze();if(r!==m.current)return;k(o),w(f=>f&&o.some(({template:C})=>C.id===f)?f:o[0]?.template.id||"")}catch(o){if(r!==m.current)return;x(String(o?.message||o||"Unable to load workflows."))}finally{r===m.current&&i(!1)}},[c]);n.useEffect(()=>{k([]),w(""),g(null),y()},[y,c]),n.useEffect(()=>{let r=!1;if(!u){g(null),H(!1);return}return H(!0),x(null),Me(u).then(o=>{r||g(o)}).catch(o=>{r||(g(null),x(String(o?.message||o||"Unable to load workflow.")))}).finally(()=>{r||H(!1)}),()=>{r=!0}},[oe,u]);const S=n.useCallback(()=>{if(u&&!E){ce(r=>r+1);return}y()},[y,E,u]),j=n.useCallback(async r=>{const o=c;L(!0),x(null);try{const f=await Oe(r);return p.current!==o||(g(f),w(f.template.id),await y(),p.current===o&&w(f.template.id)),!0}catch(f){return p.current!==o||x(String(f?.message||f||"Unable to create workflow.")),!1}finally{L(!1)}},[y,c]),V=n.useCallback(async r=>{if(!u)return!1;const o=c,f=u;F(!0),x(null);try{const C=await He(f,{name:r.name,description:r.description,steps:r.steps});return p.current!==o||(g(C),await y(),p.current===o&&w(f)),!0}catch(C){return p.current!==o||x(String(C?.message||C||"Unable to save workflow draft.")),!1}finally{F(!1)}},[y,u,c]),T=n.useCallback(async()=>{if(!u)return!1;const r=c,o=u;Q(!0),x(null);try{const f=await Le(o);return p.current!==r||(g(f),await y(),p.current===r&&w(o)),!0}catch(f){return p.current!==r||x(String(f?.message||f||"Unable to publish workflow.")),!1}finally{Q(!1)}},[y,u,c]),A=n.useCallback(async()=>{if(!u)return!1;const r=c,o=u;X(!0),x(null);try{const f=await Fe(o);return p.current!==r||(g(f),await y(),p.current===r&&w(o)),!0}catch(f){return p.current!==r||x(String(f?.message||f||"Unable to create workflow draft.")),!1}finally{X(!1)}},[y,u,c]);return{workflows:_,selectedWorkflowId:u,selectedWorkflow:E,loadingLibrary:q,loadingDetails:O,creatingWorkflow:Y,savingWorkflow:Z,publishingWorkflow:B,creatingDraft:ie,error:de,setSelectedWorkflowId:w,refreshLibrary:y,retry:S,createWorkflow:j,saveDraft:V,publishDraft:T,createNextDraft:A,clearError:()=>x(null)}}const as="_title_lvjgs_1",ls="_message_lvjgs_7",is="_actions_lvjgs_13",be={title:as,message:ls,actions:is};function os({isOpen:c,workflowName:_,versionNumber:k,busy:u,onCancel:w,onPublish:E,theme:g}){return e.jsx(Be,{isOpen:c,onClose:w,title:e.jsxs("span",{className:be.title,children:[e.jsx(le,{size:18})," Publish Workflow"]}),size:"sm",closeOnOverlayClick:!1,closeDisabled:u,theme:g,footer:e.jsxs("div",{className:be.actions,children:[e.jsx("button",{type:"button",className:"tf-button-secondary",onClick:w,disabled:u,"data-modal-initial-focus":!0,children:"Cancel"}),e.jsxs("button",{type:"button",className:"tf-button-primary",onClick:E,disabled:u,children:[u?e.jsx(J,{size:15,className:$.spinner}):e.jsx(le,{size:15}),"Publish Version ",k]})]}),children:e.jsxs("p",{className:be.message,children:["Publish ",e.jsx("strong",{children:_})," as Version ",k,"? Published versions are immutable. Future changes require a new draft."]})})}const re="draft";function cs(c){return c.draftVersionId&&c.latestPublishedVersion?.versionNumber?`Version ${c.latestPublishedVersion.versionNumber} published`:c.draftVersionId?"Unpublished":c.latestPublishedVersion?.versionNumber?`Version ${c.latestPublishedVersion.versionNumber}`:"No version"}function ds(c){if(!c)return"Not published";const _=new Date(c);return Number.isNaN(_.getTime())?"Not published":_.toLocaleDateString()}function ae(c,_,k){return JSON.stringify({name:c,description:_,steps:k.map(({clientKey:u,...w})=>w)})}function ws({workspaceId:c,libraryTrayOpen:_=!0,onCloseLibraryTray:k,assigneeOptions:u=[],theme:w,onUnsavedChangesChange:E}){const{workflows:g,selectedWorkflowId:q,selectedWorkflow:i,loadingLibrary:O,loadingDetails:H,creatingWorkflow:Y,savingWorkflow:L,publishingWorkflow:Z,creatingDraft:F,error:B,setSelectedWorkflowId:Q,retry:ie,createWorkflow:X,saveDraft:oe,publishDraft:ce,createNextDraft:de,clearError:x}=rs(c),[m,p]=n.useState(!1),[y,S]=n.useState(!1),[j,V]=n.useState(""),[T,A]=n.useState(""),[r,o]=n.useState([]),[f,C]=n.useState(""),[P,ee]=n.useState(!1),[te,U]=n.useState(""),[ue,W]=n.useState(new Set),[he,fe]=n.useState(null),[Ne,z]=n.useState(!1),me=n.useRef(null),se=n.useRef(new Map),K=n.useRef(null),D=n.useMemo(()=>i?te===re&&i.draft?i.draft:i.publishedVersions.find(({version:a})=>a.id===te)||i.draft||i.publishedVersions[0]||null:null,[te,i]),we=D?.version.status==="draft"?re:D?.version.id||"",ve=n.useMemo(()=>ae(j,T,r),[T,j,r]),N=m||D?.version.status==="draft",I=N&&ve!==f,b=Y||L||Z||F,ke=(i?.publishedVersions[0]?.version.versionNumber||0)+1,xe=n.useMemo(()=>u.filter(({kind:t,archivedAt:a})=>t!=="unassigned"&&!a),[u]),Se=n.useMemo(()=>Ue(xe),[xe]);n.useEffect(()=>{p(!1),S(!1),U(""),W(new Set),z(!1),K.current=null},[c]),n.useEffect(()=>{if(!i||m||!D)return;const t=D.version.name||i.template.name,a=D.version.description??i.template.description??"",d=D.steps.map(h=>({...h,clientKey:h.id}));V(t),A(a),o(d),C(ae(t,a,d));const l=K.current;S(!1),l?(W(new Set(d.filter((h,v)=>l.has(v)).map(({clientKey:h})=>h))),K.current=null):W(new Set),ee(!1)},[m,D,i]),n.useEffect(()=>{if(!I)return;const t=a=>{a.preventDefault(),a.returnValue=""};return window.addEventListener("beforeunload",t),()=>window.removeEventListener("beforeunload",t)},[I]),n.useEffect(()=>(E?.(I),()=>E?.(!1)),[I,E]);const ne=t=>{if(!I){t();return}fe(()=>t)},Ce=()=>{const t=he;fe(null),t?.()},ye=()=>{ne(()=>{x();const t=[];p(!0),S(!0),V(""),A(""),o(t),C(ae("","",t)),W(new Set),ee(!1),window.setTimeout(()=>me.current?.focus(),0)})},De=()=>{ne(()=>{if(x(),p(!1),S(!1),i){const t=i.draft?.version.name||i.template.name,a=i.draft?.version.description??i.publishedVersions[0]?.version.description??i.template.description??"",d=(i.draft?.steps||i.publishedVersions[0]?.steps||[]).map(l=>({...l,clientKey:l.id}));V(t),A(a),o(d),C(ae(t,a,d))}})},Ee=()=>{const t=`new-step-${Date.now()}-${r.length}`;o(a=>[...a,{id:t,clientKey:t,workflowVersionId:i?.draft?.version.id||"",position:a.length,name:"",instructions:"",ownerType:null,ownerId:null,expectedArtifact:null,requiresCommentEvidence:!1,isRequired:!0}]),W(a=>new Set(a).add(t)),window.setTimeout(()=>se.current.get(t)?.focus(),0)},M=(t,a)=>{o(d=>d.map(l=>l.clientKey===t?{...l,...a}:l))},ge=(t,a)=>{const d=t+a;d<0||d>=r.length||o(l=>{const h=[...l];return[h[t],h[d]]=[h[d],h[t]],h.map((v,R)=>({...v,position:R}))})},We=()=>r.map(t=>{const{clientKey:a,id:d,workflowVersionId:l,position:h,...v}=t;return{...v,name:t.name.trim(),instructions:t.instructions,ownerType:t.ownerType??null,ownerId:t.ownerId??null,expectedArtifact:t.expectedArtifact??null,requiresCommentEvidence:t.requiresCommentEvidence===!0,isRequired:t.isRequired}}),Ie=async()=>{if(ee(!0),!j.trim()){S(!0),window.setTimeout(()=>me.current?.focus(),0);return}const t=r.find(l=>!l.name.trim());if(t){W(l=>new Set(l).add(t.clientKey)),window.setTimeout(()=>se.current.get(t.clientKey)?.focus(),0);return}const a={name:j.trim(),description:T.trim(),steps:We()};K.current=new Set(r.map((l,h)=>ue.has(l.clientKey)?h:-1).filter(l=>l>=0)),(m?await X(a):await oe(a))?(p(!1),ee(!1)):K.current=null},Te=t=>{W(a=>{const d=new Set(a);return d.has(t)?d.delete(t):d.add(t),d})},Ke=t=>{t!==we&&ne(()=>{S(!1),U(t)})},Re=async()=>{K.current=new Set(r.map((a,d)=>ue.has(a.clientKey)?d:-1).filter(a=>a>=0)),await ce()||(K.current=null),z(!1)},$e=async()=>{const t=te;U(re),await de()||U(t)},qe=t=>{t===q&&!m||ne(()=>{p(!1),S(!1),U(""),z(!1),Q(t)})},Ve=e.jsxs("aside",{className:`${$.docTrayPanel} ${_?$.docTrayPanelOpen:""}`.trim(),"aria-hidden":!_,children:[e.jsxs("div",{className:s.libraryHeader,children:[e.jsxs("span",{className:`${s.libraryTitle} tf-label-micro`,children:[e.jsx(le,{size:14})," Workflow Library"]}),O?e.jsx(J,{size:14,className:$.spinner}):null,k?e.jsx("button",{type:"button",className:"tf-control-icon",onClick:k,title:"Collapse workflow library","aria-label":"Collapse workflow library",children:e.jsx(Qe,{size:16})}):null]}),e.jsx("div",{className:`${s.libraryContent} tf-scrollbar tf-tray-scroll-viewport`,children:g.length>0?e.jsx("div",{className:s.libraryList,children:g.map(t=>e.jsxs("button",{type:"button",className:`${s.libraryItem} ${t.template.id===q&&!m?s.libraryItemSelected:""}`.trim(),disabled:b,onClick:()=>qe(t.template.id),"aria-pressed":t.template.id===q&&!m,children:[e.jsxs("span",{className:s.libraryItemCopy,children:[e.jsx("span",{className:s.libraryItemName,children:t.template.name}),e.jsx("span",{className:s.libraryItemMeta,children:cs(t)})]}),e.jsxs("span",{className:s.libraryBadges,children:[t.draftVersionId?e.jsx("span",{className:"tf-chip-warning",children:"Draft"}):null,t.latestPublishedVersion?e.jsx("span",{className:"tf-chip-success",children:"Published"}):null]})]},t.template.id))}):O?null:e.jsx("p",{className:"tf-text-helper",children:"No workflows configured yet."})})]}),Ae=m||!!i;return e.jsxs("div",{className:`${s.root} ${_?s.trayOpen:""}`.trim(),children:[Ve,e.jsx("main",{className:`${s.main} tf-scrollbar`,children:e.jsxs("div",{className:s.content,children:[e.jsxs("header",{className:s.pageHeader,children:[e.jsxs("div",{className:s.pageHeading,children:[e.jsx("h2",{className:"tf-heading-section",children:"Workflow Manager"}),e.jsx("p",{className:"tf-text-helper",children:"Design reusable workflows for Taskforce agents."})]}),e.jsxs("button",{type:"button",className:"tf-button-secondary tf-button-compact",onClick:ye,disabled:b,children:[e.jsx(pe,{size:15})," New Workflow"]})]}),B?e.jsxs("div",{className:`${s.errorBanner} tf-surface-inset tf-text-error`,role:"alert",children:[e.jsxs("span",{className:s.errorMessage,children:[e.jsx(je,{size:14})," ",B]}),e.jsx("button",{type:"button",className:"tf-button-ghost tf-button-compact",onClick:ie,children:"Retry"})]}):null,H||O&&!i&&!m?e.jsx("div",{className:s.loadingState,"aria-live":"polite",children:e.jsx(J,{size:20,className:$.spinner})}):B&&q&&!i&&!m?e.jsx("div",{className:s.emptyState,children:e.jsxs("div",{className:s.emptyStateInner,children:[e.jsx(je,{size:24}),e.jsx("h3",{className:"tf-heading-card",children:"Workflow details unavailable"}),e.jsx("p",{className:"tf-text-helper",children:"Retry the request to load this workflow."})]})}):Ae?e.jsxs("div",{className:s.editor,children:[e.jsxs("div",{className:s.stickyToolbar,role:"toolbar","aria-label":N?"Workflow draft actions":"Workflow version actions",children:[N?e.jsxs("div",{className:s.toolbarGroup,children:[e.jsxs("button",{type:"button",className:"tf-button-secondary tf-button-compact",onClick:Ee,disabled:b,children:[e.jsx(pe,{size:14})," Add Step"]}),e.jsx("button",{type:"button",className:"tf-control-icon",onClick:()=>W(new Set(r.map(({clientKey:t})=>t))),disabled:r.length===0,title:"Expand all steps","aria-label":"Expand all steps",children:e.jsx(Xe,{size:15})}),e.jsx("button",{type:"button",className:"tf-control-icon",onClick:()=>W(new Set),disabled:r.length===0,title:"Collapse all steps","aria-label":"Collapse all steps",children:e.jsx(et,{size:15})})]}):e.jsx("span",{}),e.jsxs("div",{className:s.toolbarGroup,children:[!m&&i?e.jsxs("select",{className:`${s.versionSelect} tf-field-shell`,"aria-label":"Workflow version",value:we,onChange:t=>Ke(t.target.value),disabled:b,children:[i.draft?e.jsx("option",{value:re,children:"Draft"}):null,i.publishedVersions.map(({version:t})=>e.jsxs("option",{value:t.id,children:["Version ",t.versionNumber]},t.id))]}):null,m?e.jsx("span",{className:"tf-chip-warning",children:"Draft"}):null,m?e.jsx("button",{type:"button",className:"tf-button-ghost tf-button-compact",onClick:De,disabled:b,children:"Cancel"}):null,N?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:s.visuallyHidden,role:"status","aria-live":"polite",children:I?"Workflow has unsaved changes.":"Workflow draft is saved."}),e.jsxs("button",{type:"button",className:"tf-button-primary tf-button-compact",onClick:()=>{Ie()},disabled:!I||b,children:[Y||L?e.jsx(J,{size:15,className:$.spinner}):e.jsx(tt,{size:15})," Save Draft"]}),m?null:e.jsxs("button",{type:"button",className:"tf-button-secondary tf-button-compact",onClick:()=>z(!0),disabled:I||r.length===0||b,title:I?"Save the draft before publishing.":r.length===0?"Add at least one step before publishing.":"Publish this workflow version",children:[e.jsx(st,{size:15})," Publish"]})]}):i?.draft?null:e.jsxs("button",{type:"button",className:"tf-button-primary tf-button-compact",onClick:()=>{$e()},disabled:b,children:[F?e.jsx(J,{size:15,className:$.spinner}):e.jsx(nt,{size:15})," Create New Draft"]})]})]}),e.jsx("div",{className:s.detailHeader,children:e.jsx("div",{className:s.metadataEditor,children:y?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"tf-field-stack",children:[e.jsx("label",{className:"tf-field-label",htmlFor:"workflow-draft-name",children:"Workflow name"}),e.jsx("input",{id:"workflow-draft-name",ref:me,className:"tf-field-shell",value:j,onChange:t=>V(t.target.value),"aria-invalid":P&&!j.trim(),"aria-describedby":P&&!j.trim()?"workflow-draft-name-error":void 0,readOnly:b}),P&&!j.trim()?e.jsx("span",{id:"workflow-draft-name-error",className:"tf-text-error",children:"Workflow name is required."}):null]}),e.jsxs("div",{className:"tf-field-stack",children:[e.jsx("label",{className:"tf-field-label",htmlFor:"workflow-draft-description",children:"Description"}),e.jsx("textarea",{id:"workflow-draft-description",className:"tf-field-shell",rows:3,value:T,onChange:t=>A(t.target.value),readOnly:b})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:s.titleRow,children:[e.jsx("h3",{className:"tf-heading-card",children:j||"Untitled workflow"}),e.jsx("div",{className:s.statusRow,children:N&&!m?e.jsx("button",{type:"button",className:"tf-control-icon",onClick:()=>S(!0),title:"Edit workflow details","aria-label":"Edit workflow details",children:e.jsx(rt,{size:14})}):null})]}),T?e.jsx("p",{className:`${s.description} tf-text-body`,children:T}):null]})})}),!m&&i?e.jsxs("div",{className:s.metrics,children:[e.jsxs("div",{className:s.metric,children:[e.jsx("span",{className:"tf-label-micro",children:"Current version"}),e.jsx("strong",{children:D?.version.status==="draft"?"Draft":`Version ${D?.version.versionNumber||1}`})]}),e.jsxs("div",{className:s.metric,children:[e.jsx("span",{className:"tf-label-micro",children:"Steps"}),e.jsx("strong",{children:r.length})]}),e.jsxs("div",{className:s.metric,children:[e.jsx("span",{className:"tf-label-micro",children:"Last published"}),e.jsx("strong",{children:ds(i.publishedVersions[0]?.version.publishedAt)})]})]}):null,e.jsxs("section",{className:s.section,children:[e.jsx("div",{className:s.sectionHeader,children:e.jsx("h4",{className:"tf-heading-card",children:"Workflow Steps"})}),r.length>0?e.jsx("div",{className:s.stepList,children:r.map((t,a)=>{const d=ue.has(t.clientKey);return e.jsxs("div",{className:s.stepEditor,children:[e.jsxs("div",{className:`${s.stepToolbar} ${d?s.stepToolbarExpanded:""}`.trim(),children:[e.jsxs("button",{type:"button",className:s.stepExpandButton,onClick:()=>Te(t.clientKey),"aria-expanded":d,"aria-controls":`workflow-step-fields-${t.clientKey}`,children:[d?e.jsx(at,{size:15}):e.jsx(lt,{size:15}),e.jsx("span",{className:s.stepNumber,children:a+1}),e.jsx("strong",{children:t.name.trim()||"Untitled step"})]}),e.jsxs("div",{className:s.stepSummary,children:[e.jsx("span",{children:Ge(t.ownerId,u)}),e.jsx("span",{className:t.isRequired?"tf-chip-neutral":"tf-chip-warning",children:t.isRequired?"Required":"Optional"})]}),N?e.jsxs("div",{className:s.stepActions,children:[e.jsx("button",{type:"button",className:"tf-control-icon",title:"Move step up","aria-label":`Move step ${a+1} up`,onClick:()=>ge(a,-1),disabled:b||a===0,children:e.jsx(it,{size:14})}),e.jsx("button",{type:"button",className:"tf-control-icon",title:"Move step down","aria-label":`Move step ${a+1} down`,onClick:()=>ge(a,1),disabled:b||a===r.length-1,children:e.jsx(ot,{size:14})}),e.jsx("button",{type:"button",className:"tf-control-icon",title:"Remove step","aria-label":`Remove step ${a+1}`,onClick:()=>o(l=>l.filter(({clientKey:h})=>h!==t.clientKey)),disabled:b,children:e.jsx(ct,{size:14})})]}):null]}),d?e.jsxs("div",{id:`workflow-step-fields-${t.clientKey}`,className:s.stepFields,children:[e.jsxs("div",{className:"tf-field-stack",children:[e.jsx("label",{className:"tf-field-label",htmlFor:`workflow-step-name-${t.clientKey}`,children:"Step name"}),e.jsx("input",{id:`workflow-step-name-${t.clientKey}`,ref:l=>{l?se.current.set(t.clientKey,l):se.current.delete(t.clientKey)},className:"tf-field-shell",value:t.name,onChange:l=>M(t.clientKey,{name:l.target.value}),"aria-invalid":P&&!t.name.trim(),"aria-describedby":P&&!t.name.trim()?`workflow-step-name-error-${t.clientKey}`:void 0,disabled:!N,readOnly:b}),P&&!t.name.trim()?e.jsx("span",{id:`workflow-step-name-error-${t.clientKey}`,className:"tf-text-error",children:"Step name is required."}):null]}),e.jsxs("div",{className:"tf-field-stack",children:[e.jsx("label",{className:"tf-field-label",id:`workflow-step-owner-label-${t.clientKey}`,children:"Owner"}),(()=>{const l=Je(Se,t.ownerId),h=l.find(({value:v})=>String(v)===String(t.ownerId||"unassigned"))||l[0];return e.jsx(Ye,{value:t.ownerId||"unassigned",options:l,disabled:!N||b,ariaLabelledBy:`workflow-step-owner-label-${t.clientKey}`,portalPanel:!0,panelMinWidth:280,panelAlign:"start",searchable:!0,searchPlaceholder:"Search owners...",noResultsText:"No owners found.",triggerContent:h?e.jsx(_e,{option:h}):void 0,renderOptionContent:v=>{const R=l.find(({value:G})=>String(G)===String(v.value));return R?e.jsx(_e,{option:R}):v.label},onChange:v=>{const R=String(v),G=l.find(({value:Pe})=>String(Pe)===R);M(t.clientKey,{ownerId:G?.kind==="unassigned"?null:R,ownerType:G?.kind==="agent"?"agent":G?.kind==="member"?"user":null})}})})()]}),e.jsxs("div",{className:`${s.fullField} tf-field-stack`,children:[e.jsx("label",{className:"tf-field-label",htmlFor:`workflow-step-instructions-${t.clientKey}`,children:"Instructions"}),e.jsx("textarea",{id:`workflow-step-instructions-${t.clientKey}`,className:"tf-field-shell",rows:4,value:t.instructions,onChange:l=>M(t.clientKey,{instructions:l.target.value}),placeholder:"Describe the work to complete in this step.",disabled:!N,readOnly:b})]}),e.jsxs("div",{className:"tf-field-stack",children:[e.jsx("label",{className:"tf-field-label",htmlFor:`workflow-step-artifact-${t.clientKey}`,children:"Output label"}),e.jsx("input",{id:`workflow-step-artifact-${t.clientKey}`,className:"tf-field-shell",value:t.expectedArtifact||"",onChange:l=>M(t.clientKey,{expectedArtifact:l.target.value||null}),placeholder:"Optional output description",disabled:!N,readOnly:b})]}),e.jsxs("div",{className:s.stepToggles,children:[e.jsxs("label",{className:s.requiredToggle,title:"Requires the step owner to add a task comment before completing this step.",children:[e.jsx("input",{type:"checkbox",checked:t.requiresCommentEvidence===!0,onChange:l=>M(t.clientKey,{requiresCommentEvidence:l.target.checked}),disabled:!N||b}),"Require task comment"]}),e.jsxs("label",{className:s.requiredToggle,title:"Marks this step as mandatory when execution policy is enforced.",children:[e.jsx("input",{type:"checkbox",checked:t.isRequired,onChange:l=>M(t.clientKey,{isRequired:l.target.checked}),disabled:!N||b}),"Required step"]})]})]}):null]},t.clientKey)})}):e.jsx("div",{className:s.stepsEmpty,children:e.jsx("p",{className:"tf-text-helper",children:"No steps have been added yet."})})]})]}):e.jsx("div",{className:s.emptyState,children:e.jsxs("div",{className:s.emptyStateInner,children:[e.jsx(le,{size:30}),e.jsx("h3",{className:"tf-heading-card",children:"No workflows yet"}),e.jsx("p",{className:"tf-text-helper",children:"Create a workflow to begin defining a reusable process."}),e.jsxs("button",{type:"button",className:"tf-button-primary",onClick:ye,children:[e.jsx(pe,{size:15})," New Workflow"]})]})})]})}),e.jsx(Ze,{isOpen:!!he,onKeepEditing:()=>fe(null),onDiscard:Ce,theme:w}),e.jsx(os,{isOpen:Ne,workflowName:j,versionNumber:ke,busy:Z,onCancel:()=>z(!1),onPublish:()=>{Re()},theme:w})]})}export{ws as WorkflowManagerModule};
|