@taskforcehq/taskforce 0.3.320 → 0.3.321
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/TaskforceCore.js +8 -3
- package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +29 -5
- package/dist/mcp/runtime.js +72 -10
- package/dist/mcp/taskPlanningRegistrar.js +1 -0
- package/dist/ui/assets/{AgentsModule-BZG0WHDN.js → AgentsModule-7jpDeuVR.js} +1 -1
- package/dist/ui/assets/{AnnotatedAttachmentWorkspace-EQEzsETm.js → AnnotatedAttachmentWorkspace-BJLe8DFj.js} +1 -1
- package/dist/ui/assets/{ContextAttachmentManager-B3hESx6y.js → ContextAttachmentManager-AmEny3eI.js} +1 -1
- package/dist/ui/assets/{DocumentWorkspace-Z7bykYtA.js → DocumentWorkspace-Cqdq31Ha.js} +1 -1
- package/dist/ui/assets/{EntityActivityTimeline-B2aXkxiE.js → EntityActivityTimeline-BlS7DhA4.js} +1 -1
- package/dist/ui/assets/{InitiativesModule-CSzXelzW.js → InitiativesModule-C1qfO1uZ.js} +1 -1
- package/dist/ui/assets/{PlansPage-2vebpTBs.js → PlansPage-DFt5w-0Y.js} +1 -1
- package/dist/ui/assets/{TaskContextUpload-Bz06La5A.js → TaskContextUpload-zuro5gDT.js} +1 -1
- package/dist/ui/assets/{TaskSettings-4PbrcOqD.js → TaskSettings-CJPC2Bft.js} +1 -1
- package/dist/ui/assets/{WorkflowsModule-AyOzrP3y.js → WorkflowsModule-CEEGuxsf.js} +1 -1
- package/dist/ui/assets/documentReferences-Ca2P--i5.js +1 -0
- package/dist/ui/assets/index-CGDQY0nN.js +5 -0
- package/dist/ui/index.html +1 -1
- package/package.json +1 -1
- package/dist/ui/assets/documentReferences-CKk8ylqA.js +0 -1
- package/dist/ui/assets/index-rB9GGUCz.js +0 -5
package/dist/ui/assets/{ContextAttachmentManager-B3hESx6y.js → ContextAttachmentManager-AmEny3eI.js}
RENAMED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{r as y,j as e}from"./vendor-react-CKJs5o3c.js";import{t as s,Z as Et,_ as St,$ as pt,a0 as dt,a1 as Lt}from"./index-
|
|
1
|
+
import{r as y,j as e}from"./vendor-react-CKJs5o3c.js";import{t as s,Z as Et,_ as St,$ as pt,a0 as dt,a1 as Lt}from"./index-CGDQY0nN.js";import{g as Dt}from"./documentReferences-Ca2P--i5.js";import{h as Pt,aM as K,c as X,m as Ut,aN as $t,aI as ut,T as ht,ax as Ft}from"./vendor-icons-CLnehDTw.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";const gt=[".png",".jpg",".jpeg",".webp",".gif",".pdf",".txt",".md",".csv",".json",".doc",".docx",".html",".js",".ts",".tsx",".css",".py",".java",".go",".rs",".sh"].join(","),Rt=new Set(["image/png","image/jpeg","image/webp"]),zt=new Set(gt.split(",").map(o=>o.trim().toLowerCase())),Ot=10*1024*1024,_t=3500;function xt(o){const c=o.trim().toLowerCase(),m=c.lastIndexOf(".");return m===-1?"":c.slice(m)}function J(o){if(o.length===0)return"";const c=o.slice(0,3).join(", "),m=o.length-3;return m>0?`${c}, +${m} more`:c}function Bt(o){return`${o.name.trim().toLowerCase()}::${o.size}::${o.lastModified}`}function Mt(o){return new Promise((c,m)=>{const g=new FileReader;g.onload=()=>c(String(g.result||"")),g.onerror=()=>m(g.error||new Error("Failed to read file")),g.readAsDataURL(o)})}function L(o){return/\.(png|jpe?g|webp|gif)(\?|#|$)/i.test(o)}function Ht(o){const c=o.types;if(!c)return null;for(const m of Array.from(c)){const g=String(m||"").trim().toLowerCase();if(Rt.has(g))return g}return null}function ft(o,c){const m=o.includes("?")?"&":"?";return`${o}${m}download=1&filename=${encodeURIComponent(c)}`}function mt(o){return typeof o=="string"?o.split("/").pop()||"Context file":o.displayName||o.originalFilename||o.caption||o.fsPath||o.path.split("/").pop()||"Context file"}function Kt(o){const c=typeof o=="string"?[o]:[o.originalFilename,o.displayName,o.caption,o.fsPath,o.path];for(const g of c){if(!g)continue;const D=xt(g);if(D)return D.replace(".","").slice(0,5).toUpperCase()}const m=typeof o=="string"?o:o.path;return/^https?:\/\//i.test(m)?"LINK":"FILE"}function Qt(o){const{ownerType:c="task",ownerId:m,ownerReferenceLabel:g,workspaceId:D,attachments:N,onAddAttachment:Y,onRemoveAttachment:G,onUpdateAttachmentCaption:W}=o,v=y.useRef(null),[P,Z]=y.useState(!1),[V,C]=y.useState(null),[$,q]=y.useState(""),[F,A]=y.useState(null),[T,b]=y.useState(null),[R,yt]=y.useState(!1),[wt,z]=y.useState(!1),[Xt,O]=y.useState(0),I=y.useRef(new Set),Q=y.useRef(new Set),tt=t=>(t||"").trim(),U=(t,n)=>{const a=[],r=tt(t),p=tt(n);return r&&a.push(`path:${r}`),p&&a.push(`fs:${p}`),a},et=y.useMemo(()=>{const t=new Set;return N.forEach(n=>{if(typeof n=="string"){U(n).forEach(a=>t.add(a));return}U(n.path,n.fsPath).forEach(a=>t.add(a))}),t},[N]);y.useEffect(()=>{I.current=new Set(et)},[et]);const nt=(t,n)=>n.some(a=>t.has(a)),at=(t,n)=>n.forEach(a=>t.add(a)),E=String(D||"").trim(),j=String(m||"").trim(),st=c==="initiative"?"initiative":c==="workstream"?"workstream":"task",_={ownerType:c,ownerId:j||null,taskId:c==="task"&&j||null},B=(t="application/json")=>{const n={"Content-Type":t};return E&&(n["x-taskforce-workspace-id"]=E),n},ot=(t,n=!0,a=I.current)=>{const r=t.trim();if(!r||!/^https?:\/\//i.test(r))return"invalid";const i=r,f=U(i);if(nt(a,f))return"duplicate";const u=r.split(/[\\/]/).pop()||r;return Y({path:i,caption:u,timestamp:new Date().toISOString()}),at(a,f),n&&q(""),A(null),"added"};y.useEffect(()=>{if(!T)return;const t=window.setTimeout(()=>{b(null)},_t);return()=>window.clearTimeout(t)},[T]);const rt=async t=>{if(t.length===0)return;C(null),b(null);const n=t,a=[],r=[],p=[],i=[],f=new Set(Q.current);n.forEach(x=>{const h=xt(x.name);if(!zt.has(h)){a.push(x.name);return}if(x.size>Ot){r.push(x.name);return}const S=Bt(x);if(f.has(S)){p.push(x.name);return}f.add(S),i.push({file:x,fingerprint:S})});const u=[];if(a.length>0&&u.push(`${a.length} unsupported file${a.length===1?"":"s"} skipped: ${J(a)}.`),r.length>0&&u.push(`${r.length} file${r.length===1?"":"s"} over 10 MB skipped: ${J(r)}.`),p.length>0&&u.push(`${p.length} local duplicate file${p.length===1?"":"s"} skipped before upload: ${J(p)}.`),i.length===0){u.length>0&&b(u.join(" ")),v.current&&(v.current.value="");return}Z(!0);const k=new Set(I.current);let d=0;try{for(const{file:h,fingerprint:S}of i){let l=null;const lt=await fetch("/api/taskforce/context-upload/init",{method:"POST",headers:B(),body:JSON.stringify({originalName:h.name,mimeType:h.type||"application/octet-stream",size:h.size,..._,workspaceId:E||null})});if(lt.ok){const w=await lt.json();if(w?.success&&typeof w?.uploadUrl=="string"&&typeof w?.path=="string"){if(!(await fetch(w.uploadUrl,{method:String(w.method||"PUT"),headers:w.headers||{"Content-Type":h.type||"application/octet-stream"},body:h})).ok)throw new Error(`Upload failed for ${h.name}`);const H=await fetch("/api/taskforce/context-upload/finalize",{method:"POST",headers:B(),body:JSON.stringify({relativePath:w.relativePath,mimeType:h.type||"application/octet-stream",originalName:h.name,size:h.size,..._,workspaceId:E||null})});if(!H.ok){const It=await H.json().catch(()=>({}));throw new Error(It?.error||`Upload failed for ${h.name}`)}l=await H.json().catch(()=>null)}else w?.success&&typeof w?.path=="string"&&(l=w)}if(!l){const w=await Mt(h),M=await fetch("/api/taskforce/context-upload",{method:"POST",headers:B(),body:JSON.stringify({file:w,originalName:h.name,..._,workspaceId:E||null})});if(!M.ok)throw new Error(`Upload failed for ${h.name}`);l=await M.json()}if(!l?.success||!l?.path)throw new Error(`Upload failed for ${h.name}`);const ct=U(l.path,l.fsPath);if(nt(k,ct)){d+=1;continue}Y({path:l.path,fsPath:l.fsPath,caption:typeof l.caption=="string"&&l.caption.trim().length>0?l.caption:h.name,displayName:typeof l.displayName=="string"?l.displayName:void 0,originalFilename:typeof l.originalFilename=="string"?l.originalFilename:h.name,assetId:typeof l.assetId=="string"?l.assetId:void 0,referenceNumber:typeof l.referenceNumber=="number"?l.referenceNumber:null,referenceLabel:typeof l.referenceLabel=="string"?l.referenceLabel:void 0,taskId:c==="task"&&typeof l.taskId=="string"?l.taskId:null,timestamp:typeof l.timestamp=="string"&&l.timestamp.trim().length>0?l.timestamp:new Date().toISOString()}),Lt({workspaceId:E||"default",ownerType:c,ownerId:j||null,taskId:c==="task"&&j||null,reason:"upload"}),at(k,ct),Q.current.add(S)}const x=[...u];d>0&&x.push(`${d} duplicate file${d===1?"":"s"} skipped.`),b(x.length>0?x.join(" "):null),I.current=k}catch(x){C(x instanceof Error?x.message:"Failed to upload context file")}finally{Z(!1),v.current&&(v.current.value="")}},it=async t=>{!t||t.length===0||await rt(Array.from(t))},kt=async()=>{if(C(null),b(null),!navigator.clipboard||typeof navigator.clipboard.read!="function"){C("Clipboard image paste is not available in this browser.");return}try{const t=await navigator.clipboard.read(),n=[];for(const a of t){const r=Ht(a);if(!r)continue;const p=await a.getType(r),i=r.toLowerCase()==="image/png"?"png":r.toLowerCase()==="image/webp"?"webp":"jpg";n.push(new globalThis.File([p],`pasted-image-${Date.now()}.${i}`,{type:r}))}if(n.length===0){C("Clipboard does not currently contain a supported image.");return}await rt(n)}catch(t){C(t?.message||"Failed to read an image from the clipboard.")}},bt=t=>{const n=new Set,a=t.dataTransfer.getData("text/uri-list")||"",r=t.dataTransfer.getData("text/plain")||"",p=`${a}
|
|
2
2
|
${r}`.split(`
|
|
3
3
|
`).map(i=>i.trim()).filter(i=>!!i&&!i.startsWith("#"));for(const i of p){if(/^file:\/\//i.test(i)){try{const f=new URL(i),u=decodeURIComponent(f.pathname||"").trim();u&&n.add(u)}catch{}continue}n.add(i)}return Array.from(n)},jt=t=>{if(t.preventDefault(),t.stopPropagation(),z(!1),O(0),C(null),A(null),b(null),t.dataTransfer.files&&t.dataTransfer.files.length>0){it(t.dataTransfer.files);return}const n=bt(t);if(n.length===0){A("Drop a file or URL.");return}const a=new Set(I.current);let r=0,p=0,i=0;n.forEach(u=>{const k=ot(u,!1,a);k==="duplicate"&&(r+=1),k==="added"&&(p+=1),k==="invalid"&&(i+=1)});const f=[];r>0&&f.push(`${r} duplicate link${r===1?"":"s"} skipped.`),i>0&&f.push(`${i} local path${i===1?"":"s"} skipped. Upload files to attach them, or drop an http(s) URL to link.`),b(f.length>0?f.join(" "):p>0?null:T),I.current=a},Nt=t=>{t.preventDefault(),t.stopPropagation(),O(n=>n+1),z(!0)},Ct=t=>{t.preventDefault(),t.stopPropagation(),O(n=>{const a=Math.max(0,n-1);return a===0&&z(!1),a})},vt=t=>{t.preventDefault(),t.stopPropagation(),t.dataTransfer.dropEffect="copy"},At=N.filter(t=>{const n=typeof t=="string"?t:t.path;return L(n)}),Tt=N.filter(t=>{const n=typeof t=="string"?t:t.path;return!L(n)});return e.jsxs("div",{className:s.specialistSection,children:[e.jsx(Et,{label:"Context Documents",count:N.length,expanded:R,expandedTitle:"Hide context documents",collapsedTitle:"Show context documents",onToggle:()=>yt(!R)}),R&&e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:s.settingsHint,children:["Upload files into ",st," context storage, or add an external http(s) URL."]}),e.jsxs("div",{className:s.contextUploadPanel,children:[e.jsxs("div",{className:s.contextUploadActions,children:[e.jsxs("button",{type:"button",className:s.secondaryHeaderBtn,onClick:()=>v.current?.click(),disabled:P,children:[P?e.jsx(Pt,{size:12,className:s.spinner}):e.jsx(K,{size:12}),P?"Uploading...":"Upload File"]}),e.jsxs("button",{type:"button",className:s.secondaryHeaderBtn,onClick:()=>{kt()},disabled:P,children:[e.jsx(X,{size:12}),"Paste Image from Clipboard"]})]}),e.jsx("input",{ref:v,type:"file",accept:gt,multiple:!0,className:s.hiddenInput,onChange:t=>{it(t.target.files)}}),V&&e.jsx("div",{className:s.error,children:V}),e.jsxs("div",{className:s.contextLinkRow,children:[e.jsx("input",{type:"text",className:s.input,placeholder:"Add external URL (https://...)",value:$,onChange:t=>{q(t.target.value),F&&A(null),T&&b(null)}}),e.jsx("button",{type:"button",className:s.secondaryHeaderBtn,onClick:()=>{if(!$.trim()){A("Enter an http(s) URL to link.");return}const t=ot($,!0);if(t==="invalid"){A("Only external http(s) URLs can be linked here. Upload files to attach them.");return}t==="duplicate"?b(`Link already exists in ${st} context.`):t==="added"&&b(null)},children:"Add URL"})]}),e.jsxs("div",{className:`${s.contextDropzone} ${wt?s.contextDropzoneActive:""}`,onDragEnter:Nt,onDragLeave:Ct,onDragOver:vt,onDrop:jt,children:[e.jsx(K,{size:14}),e.jsx("span",{children:"Drop files or URLs here"})]})]}),T&&e.jsx("div",{className:s.contextNotice,children:T}),F&&e.jsx("div",{className:s.error,children:F}),At.length>0&&e.jsx("div",{className:s.attachmentGrid,children:N.map((t,n)=>{const a=typeof t=="string"?t:t.path;if(!L(a))return null;const r=typeof t=="string"?void 0:t.fsPath,p=typeof t=="string"?"":t.caption||"",i=mt(t),f=L(a),u=/^https?:\/\//i.test(a),k=c==="task"&&St(t);return e.jsxs("div",{className:s.attachmentCard,children:[e.jsxs("div",{className:s.attachmentPreviewContainer,children:[f?e.jsx("img",{src:a,alt:p||`Context file ${n}`,onClick:()=>{c==="task"&&pt(t,{taskId:j,taskReferenceLabel:g})||window.open(a,"_blank")},onError:d=>{d.target.style.display="none",d.target.parentElement.classList.add(s.brokenImage)}}):e.jsxs("button",{type:"button",className:s.contextFileLink,onClick:()=>{const d=c==="task"?typeof t=="string"?{path:t,taskId:j}:{...t,taskId:j}:t;dt(d,r)||window.open(a,"_blank")},title:"Open file",children:[e.jsx(K,{size:16}),e.jsx("span",{children:p||r||a.split("/").pop()||"Context file"})]}),e.jsxs("div",{className:s.brokenImagePlaceholder,children:[e.jsx(Ut,{size:16}),e.jsx("span",{children:"Preview unavailable"})]}),e.jsxs("div",{className:s.attachmentActions,children:[k&&e.jsx("button",{type:"button",className:s.attachmentActionBtn,onClick:d=>{d.stopPropagation(),pt(t,{taskId:j,taskReferenceLabel:g})},title:"Annotate",children:e.jsx($t,{size:12})}),r&&e.jsx("button",{type:"button",className:s.attachmentActionBtn,onClick:d=>{d.stopPropagation(),navigator.clipboard.writeText(r)},title:`Copy path: ${r}`,children:e.jsx(X,{size:12})}),!u&&e.jsx("button",{type:"button",className:s.attachmentActionBtn,onClick:d=>{d.stopPropagation(),window.open(ft(a,p||i),"_blank")},title:"Download",children:e.jsx(ut,{size:12})}),e.jsx("button",{type:"button",className:s.attachmentActionBtn,onClick:d=>{d.stopPropagation(),G(n)},title:"Delete",children:e.jsx(ht,{size:12})})]})]}),e.jsx("input",{type:"text",className:s.attachmentCaptionInput,placeholder:"Add a label...",value:p,onChange:d=>W(n,d.target.value)})]},n)})}),Tt.length>0&&e.jsx("div",{className:s.documentAttachmentList,children:N.map((t,n)=>{const a=typeof t=="string"?t:t.path;if(L(a))return null;const r=typeof t=="string"?void 0:t.fsPath,p=typeof t=="string"?"":t.caption||"",i=mt(t),f=Kt(t),u=typeof t=="string"?"":Dt(t),k=/^https?:\/\//i.test(a);return e.jsxs("div",{className:s.documentAttachmentItem,children:[e.jsxs("div",{className:s.documentAttachmentRow,children:[e.jsxs("button",{type:"button",className:s.documentAttachmentLink,onClick:()=>{const d=c==="task"?typeof t=="string"?{path:t,taskId:j}:{...t,taskId:j}:t;dt(d,r)||window.open(a,"_blank")},title:i,children:[e.jsxs("span",{className:s.documentAttachmentMain,children:[e.jsx("span",{className:s.documentAttachmentIcon,"aria-hidden":"true",children:e.jsx(Ft,{size:13})}),e.jsxs("span",{className:s.documentAttachmentText,children:[e.jsx("span",{className:s.documentAttachmentName,children:i}),u&&e.jsx("span",{className:s.taskIdBadge,children:u})]})]}),e.jsx("span",{className:s.documentAttachmentType,children:f})]}),e.jsxs("div",{className:s.documentAttachmentActions,children:[r&&e.jsx("button",{type:"button",className:s.documentAttachmentActionBtn,onClick:()=>{navigator.clipboard.writeText(r)},title:`Copy path: ${r}`,children:e.jsx(X,{size:12})}),!k&&e.jsx("button",{type:"button",className:s.documentAttachmentActionBtn,onClick:()=>{window.open(ft(a,p||i),"_blank")},title:"Download",children:e.jsx(ut,{size:12})}),e.jsx("button",{type:"button",className:s.documentAttachmentActionBtn,onClick:()=>G(n),title:"Delete",children:e.jsx(ht,{size:12})})]})]}),e.jsx("input",{type:"text",className:s.documentAttachmentCaptionInput,placeholder:"Add a label...",value:p,onChange:d=>W(n,d.target.value)})]},n)})})]})]})}export{Qt as ContextAttachmentManager};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{j as e,r as i,s as an,R as ve}from"./vendor-react-CKJs5o3c.js";import{h as $e,f as P,t as L,i as yt,j as gt,k as sn,R as rn,m as M,M as on,n as xt,o as cn,q as ln}from"./index-rB9GGUCz.js";import{q as dn,x as un,w as mn,ax as hn,ay as pn,y as qe,i as fn,Z as Qe,X as Rt,az as _t,e as Ye,aA as At,aB as vn,aC as wn,a as kn,j as yn,aD as gn,aE as xn,aF as _n,t as Ee,aG as bn,r as Sn,p as jn,aH as bt,aw as Ve,aI as Cn,aJ as Nn,T as Tn,R as En,aK as Rn,B as An,U as In,S as $n}from"./vendor-icons-CLnehDTw.js";import{g as Ln}from"./documentReferences-CKk8ylqA.js";import{s as Dn,M as Re,r as Ae}from"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";const Bn="_index_1sp0v_1",Mn="_header_1sp0v_8",Pn="_title_1sp0v_23",zn="_search_1sp0v_35",Fn="_searchIcon_1sp0v_41",On="_searchInput_1sp0v_50",Hn="_list_1sp0v_67",Wn="_state_1sp0v_79",Gn="_stateError_1sp0v_87",Kn="_item_1sp0v_94",Un="_itemActive_1sp0v_116",Jn="_itemIcon_1sp0v_126",Vn="_itemBody_1sp0v_136",qn="_itemTitle_1sp0v_144",Qn="_itemTask_1sp0v_156",Yn="_itemBadge_1sp0v_167",Xn="_itemMeta_1sp0v_180",Zn="_itemMetaDetails_1sp0v_191",ea="_itemMetaReference_1sp0v_198",A={index:Bn,header:Mn,title:Pn,search:zn,searchIcon:Fn,searchInput:On,list:Hn,state:Wn,stateError:Gn,item:Kn,itemActive:Un,itemIcon:Jn,itemBody:Vn,itemTitle:qn,itemTask:Qn,itemBadge:Yn,itemMeta:Xn,itemMetaDetails:Zn,itemMetaReference:ea};function Xe(t){let l=t;try{l=decodeURIComponent(t)}catch{l=t}return l.trim().replace(/\\/g,"/").replace(/^\/+/,"").replace(/^\.\//,"").replace(/^\.taskforce\//,"")}function ta(t,l){return!!(t===l||t.endsWith(`/${l}`)||l.endsWith(`/${t}`))}function St(t){const l=Xe(String(t||""));if(!l)return null;const m=l.match(/(^|\/)(asset-[a-f0-9]{32})(?=[^/]*$)/i);return m?.[2]?m[2].toLowerCase():null}function et(t){return t.attachmentState==="attached"||t.attachmentState==="unattached"?t.attachmentState:(typeof t.attachmentCount=="number"&&Number.isFinite(t.attachmentCount)?t.attachmentCount:0)>0||t.taskId?"attached":"unattached"}function na(t,l,m,s){const c=l.trim().toLowerCase();return t.filter(u=>{const y=`${$e(u)} ${u.originalFilename||""}`.toLowerCase(),v=c.length===0||y.includes(c),b=m.length===0||m.includes(u.docType),h=et(u),g=s.length===0||s.includes(h);return v&&b&&g})}function aa({docType:t}){switch(t){case"implementation-plan":return e.jsx(fn,{size:13});case"review":return e.jsx(qe,{size:13});case"walkthrough":return e.jsx(pn,{size:13});default:return e.jsx(hn,{size:13})}}function sa(t){return t<1024?`${t}B`:t<1024*1024?`${(t/1024).toFixed(1)}KB`:`${(t/(1024*1024)).toFixed(1)}MB`}function ra(t){if(!t)return"";const l=new Date(t),s=new Date().getTime()-l.getTime(),c=Math.floor(s/(1e3*60*60*24));return c===0?"Today":c===1?"Yesterday":c<7?`${c}d ago`:c<30?`${Math.floor(c/7)}w ago`:l.toLocaleDateString()}function ia(t,l){t.key!=="Enter"&&t.key!==" "||(t.preventDefault(),l())}function oa({documents:t,selectedDocId:l,loading:m,error:s,searchQuery:c,taskById:u,onSearchChange:w,onSelect:y,onCloseTray:v,hasActiveFilters:b}){return e.jsxs("div",{className:A.index,children:[e.jsxs("div",{className:A.header,children:[e.jsxs("span",{className:A.title,children:[e.jsx(dn,{size:14}),"Documents"]}),v?e.jsx("button",{type:"button",className:"tf-control-icon",onClick:v,title:"Collapse document tray","aria-label":"Collapse document tray",children:e.jsx(un,{size:16})}):null]}),e.jsxs("div",{className:A.search,children:[e.jsx(mn,{size:12,className:A.searchIcon}),e.jsx("input",{type:"text",placeholder:"Search documents…",value:c,onChange:h=>w(h.target.value),className:A.searchInput})]}),e.jsxs("div",{className:`${A.list} tf-scrollbar`,children:[m&&e.jsx("div",{className:A.state,children:"Loading documents…"}),!m&&s&&e.jsx("div",{className:A.stateError,children:s}),!m&&!s&&t.length===0&&e.jsx("div",{className:A.state,children:b?"No documents match your filters.":"No documents found. Documents added as task attachments will appear here."}),!m&&t.map(h=>{const g=h.taskId?u.get(h.taskId):null,O=h.id===l,T=$e(h),C=et(h),D=typeof h.attachmentCount=="number"&&Number.isFinite(h.attachmentCount)?h.attachmentCount:h.taskId?1:0,E=D>1?`${D} tasks linked`:D===1?g?.title||"1 task linked":null;return e.jsxs("div",{role:"button",tabIndex:0,className:`${A.item} ${O?A.itemActive:""}`,onClick:()=>y(h),onKeyDown:I=>ia(I,()=>y(h)),children:[e.jsx("div",{className:A.itemIcon,children:e.jsx(aa,{docType:h.docType})}),e.jsxs("div",{className:A.itemBody,children:[e.jsx("span",{className:A.itemTitle,title:T,children:T}),C==="unattached"&&e.jsx("span",{className:A.itemBadge,children:"Unattached"}),E&&e.jsx("span",{className:A.itemTask,title:E,children:E}),e.jsxs("span",{className:A.itemMeta,children:[e.jsxs("span",{className:A.itemMetaDetails,children:[sa(h.sizeBytes),h.updatedAt&&e.jsxs(e.Fragment,{children:[" · ",ra(h.updatedAt)]})]}),h.referenceLabel&&e.jsx("span",{className:A.itemMetaReference,children:h.referenceLabel})]})]})]},h.id)})]})]})}function Ie(t){return function(l){return Dn(l,t)}}const ca="_viewer_v1pk0_1",la="_viewerMonochrome_v1pk0_10",da="_metaDocumentName_v1pk0_10",ua="_viewerEditMode_v1pk0_14",ma="_meta_v1pk0_10",ha="_metaLeft_v1pk0_30",pa="_metaRenameRow_v1pk0_49",fa="_typeBadge_v1pk0_56",va="_typeBadgeImplementationPlan_v1pk0_71",wa="_typeBadgeReview_v1pk0_77",ka="_typeBadgeWalkthrough_v1pk0_83",ya="_metaTaskName_v1pk0_89",ga="_statusBadge_v1pk0_98",xa="_metaDate_v1pk0_113",_a="_metaSize_v1pk0_114",ba="_actions_v1pk0_122",Sa="_actionBtn_v1pk0_129",ja="_dangerBtn_v1pk0_156",Ca="_generateBtn_v1pk0_167",Na="_editBtn_v1pk0_178",Ta="_saveBtn_v1pk0_189",Ea="_layoutToggle_v1pk0_205",Ra="_layoutBtn_v1pk0_213",Aa="_layoutBtnActive_v1pk0_229",Ia="_saveStatus_v1pk0_234",$a="_saveStatusSaved_v1pk0_241",La="_saveStatusError_v1pk0_245",Da="_unsaved_v1pk0_250",Ba="_viewerContent_v1pk0_256",Ma="_viewerBody_v1pk0_265",Pa="_viewerBodyFullWidth_v1pk0_273",za="_viewerMain_v1pk0_277",Fa="_reviewRail_v1pk0_285",Oa="_printHint_v1pk0_291",Ha="_reviewSection_v1pk0_298",Wa="_reviewHeader_v1pk0_307",Ga="_reviewTitle_v1pk0_315",Ka="_reviewSubtitle_v1pk0_324",Ua="_reviewControls_v1pk0_331",Ja="_reviewSelect_v1pk0_338",Va="_reviewSessionMeta_v1pk0_342",qa="_reviewStatusResolved_v1pk0_350",Qa="_reviewSessionLabel_v1pk0_356",Ya="_reviewTitleEditRow_v1pk0_361",Xa="_reviewSessionTimestamp_v1pk0_368",Za="_reviewAnchorLabel_v1pk0_372",es="_reviewComposer_v1pk0_378",ts="_reviewAnchorChip_v1pk0_385",ns="_reviewAnchorSnippet_v1pk0_398",as="_reviewAnchorClear_v1pk0_403",ss="_reviewCommentActions_v1pk0_416",rs="_reviewCommentAction_v1pk0_416",is="_reviewCommentEditor_v1pk0_437",os="_viewerState_v1pk0_443",cs="_viewerStateError_v1pk0_450",ls="_editorArea_v1pk0_457",ds="_editorPane_v1pk0_464",us="_editorLayoutSplit_v1pk0_472",ms="_previewPane_v1pk0_473",hs="_editorLayoutEditor_v1pk0_477",ps="_editorLayoutPreview_v1pk0_478",fs="_editorPaneLabel_v1pk0_482",vs="_editorTextarea_v1pk0_494",ws="_markdownSurface_v1pk0_536",ks="_attachModalBody_v1pk0_745",ys="_attachModalCopy_v1pk0_752",gs="_attachModalError_v1pk0_759",xs="_attachTaskList_v1pk0_772",_s="_attachTaskRow_v1pk0_781",bs="_attachTaskTitle_v1pk0_808",Ss="_attachTaskInfo_v1pk0_814",js="_attachTaskReference_v1pk0_822",Cs="_attachTaskMeta_v1pk0_829",Ns="_attachEmptyState_v1pk0_836",r={viewer:ca,viewerMonochrome:la,metaDocumentName:da,viewerEditMode:ua,meta:ma,metaLeft:ha,metaRenameRow:pa,typeBadge:fa,typeBadgeImplementationPlan:va,typeBadgeReview:wa,typeBadgeWalkthrough:ka,metaTaskName:ya,statusBadge:ga,metaDate:xa,metaSize:_a,actions:ba,actionBtn:Sa,dangerBtn:ja,generateBtn:Ca,editBtn:Na,saveBtn:Ta,layoutToggle:Ea,layoutBtn:Ra,layoutBtnActive:Aa,saveStatus:Ia,saveStatusSaved:$a,saveStatusError:La,unsaved:Da,viewerContent:Ba,viewerBody:Ma,viewerBodyFullWidth:Pa,viewerMain:za,reviewRail:Fa,printHint:Oa,reviewSection:Ha,reviewHeader:Wa,reviewTitle:Ga,reviewSubtitle:Ka,reviewControls:Ua,reviewSelect:Ja,reviewSessionMeta:Va,reviewStatusResolved:qa,reviewSessionLabel:Qa,reviewTitleEditRow:Ya,reviewSessionTimestamp:Xa,reviewAnchorLabel:Za,reviewComposer:es,reviewAnchorChip:ts,reviewAnchorSnippet:ns,reviewAnchorClear:as,reviewCommentActions:ss,reviewCommentAction:rs,reviewCommentEditor:is,viewerState:os,viewerStateError:cs,editorArea:ls,editorPane:ds,editorLayoutSplit:us,previewPane:ms,editorLayoutEditor:hs,editorLayoutPreview:ps,editorPaneLabel:fs,editorTextarea:vs,markdownSurface:ws,attachModalBody:ks,attachModalCopy:ys,attachModalError:gs,attachTaskList:xs,attachTaskRow:_s,attachTaskTitle:bs,attachTaskInfo:Ss,attachTaskReference:js,attachTaskMeta:Cs,attachEmptyState:Ns},Ts="_overlay_1unik_1",Es="_modal_1unik_12",Rs="_header_1unik_16",As="_title_1unik_20",Is="_docName_1unik_24",$s="_body_1unik_34",Ls="_state_1unik_41",Ds="_stateError_1unik_52",Bs="_stateDone_1unik_63",Ms="_toolbar_1unik_84",Ps="_toolbarCount_1unik_95",zs="_toolbarActions_1unik_100",Fs="_tree_1unik_105",Os="_taskRow_1unik_113",Hs="_taskRowDimmed_1unik_126",Ws="_taskCheck_1unik_130",Gs="_taskExpandBtn_1unik_139",Ks="_taskExpandSpacer_1unik_155",Us="_taskTitle_1unik_160",Js="_taskBadge_1unik_169",Vs="_footer_1unik_179",S={overlay:Ts,modal:Es,header:Rs,title:As,docName:Is,body:$s,state:Ls,stateError:Ds,stateDone:Bs,toolbar:Ms,toolbarCount:Ps,toolbarActions:zs,tree:Fs,taskRow:Os,taskRowDimmed:Hs,taskCheck:Ws,taskExpandBtn:Gs,taskExpandSpacer:Ks,taskTitle:Us,taskBadge:Js,footer:Vs},qs={1:"Low",2:"Medium",3:"High"};function we(t,l){return t.map(m=>({...m,selected:l,children:we(m.children,l)}))}function It(t,l,m){return t.map(s=>s.idempotencyKey===l?{...s,selected:m,children:we(s.children,m)}:{...s,children:It(s.children,l,m)})}function Ze(t){let l=0;for(const m of t)m.selected&&l++,l+=Ze(m.children);return l}function $t({node:t,depth:l,onToggle:m}){const[s,c]=i.useState(!0),u=t.children.length>0,w=l*20;return e.jsxs("div",{children:[e.jsxs("div",{className:`${S.taskRow} ${t.selected?"":S.taskRowDimmed}`,style:{paddingLeft:`${12+w}px`},children:[e.jsx("button",{className:S.taskCheck,onClick:()=>m(t.idempotencyKey,!t.selected),title:t.selected?"Deselect":"Select",children:t.selected?e.jsx(vn,{size:14,style:{color:"var(--brand-primary-strong)"}}):e.jsx(wn,{size:14,style:{color:"var(--text-muted)"}})}),u?e.jsx("button",{className:S.taskExpandBtn,onClick:()=>c(y=>!y),children:s?e.jsx(kn,{size:12}):e.jsx(yn,{size:12})}):e.jsx("span",{className:S.taskExpandSpacer}),e.jsx("span",{className:S.taskTitle,title:t.description||void 0,children:t.title}),e.jsx("span",{className:S.taskBadge,style:{color:yt(t.type),borderColor:yt(t.type)},children:t.type}),e.jsx("span",{className:S.taskBadge,style:{color:gt(t.priority),borderColor:gt(t.priority)},children:qs[t.priority]})]}),u&&s&&e.jsx("div",{children:t.children.map(y=>e.jsx($t,{node:y,depth:l+1,onToggle:m},y.idempotencyKey))})]})}function Qs({content:t,docTitle:l,apiBaseUrl:m="",onClose:s,onGenerated:c}){const[u,w]=i.useState("preview"),[y,v]=i.useState(null),[b,h]=i.useState([]),[g,O]=i.useState(!0),[T,C]=i.useState(0),[D,E]=i.useState(null);i.useEffect(()=>{let x=!1;return O(!0),v(null),P("/api/taskforce/documents/generate-tasks/preview",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:t})},m).then(j=>j.json()).then(j=>{if(!x){if(j.error)throw new Error(j.error);h(j.tasks||[]),w("preview")}}).catch(j=>{x||(v(j?.message||"Failed to parse plan"),w("error"))}).finally(()=>{x||O(!1)}),()=>{x=!0}},[t,m]);const I=i.useCallback((x,j)=>{h(F=>It(F,x,j))},[]),z=()=>h(x=>we(x,!0)),H=()=>h(x=>we(x,!1)),q=Ze(b),Q=async()=>{w("generating"),E(null);try{const x=await P("/api/taskforce/documents/generate-tasks/commit",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({tasks:b})},m),j=await x.json().catch(()=>({}));if(!x.ok)throw new Error(j.error||`Generation failed (${x.status})`);C(j.created??0),w("done"),c(j.created??0)}catch(x){E(x?.message||"Generation failed"),w("error")}};return e.jsx("div",{className:S.overlay,onClick:x=>{x.target===x.currentTarget&&s()},children:e.jsxs("div",{className:`tf-surface-modal tf-modal-shell ${S.modal}`,children:[e.jsxs("div",{className:`tf-modal-header ${S.header}`,children:[e.jsxs("div",{className:`tf-modal-title ${S.title}`,children:[e.jsx(Qe,{size:16,style:{color:"var(--brand-primary-strong)"}}),"Generate Tasks from Plan"]}),e.jsx("span",{className:S.docName,children:l}),e.jsx("button",{className:"tf-control-icon",onClick:s,title:"Close",children:e.jsx(Rt,{size:16})})]}),e.jsxs("div",{className:S.body,children:[g&&e.jsxs("div",{className:S.state,children:[e.jsx(_t,{size:20,className:L.docSpinning}),"Parsing plan…"]}),!g&&u==="error"&&e.jsxs("div",{className:S.stateError,children:[e.jsx(Ye,{size:16}),y||D||"An error occurred"]}),!g&&u==="done"&&e.jsxs("div",{className:S.stateDone,children:[e.jsx(At,{size:24,style:{color:"var(--status-success)"}}),e.jsxs("strong",{children:[T," task",T!==1?"s":""," created"]}),e.jsx("p",{children:"Tasks are now in your board. Switch to the Kanban or Hierarchy view to see them."})]}),!g&&(u==="preview"||u==="confirm"||u==="generating")&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:S.toolbar,children:[e.jsxs("span",{className:S.toolbarCount,children:[q," of ",Ze(we(b,!0))," tasks selected"]}),e.jsxs("div",{className:S.toolbarActions,children:[e.jsx("button",{className:"tf-control-icon",onClick:z,children:"Select all"}),e.jsx("button",{className:"tf-control-icon",onClick:H,children:"Deselect all"})]})]}),b.length===0?e.jsx("div",{className:S.state,children:"No tasks could be parsed from this document. Make sure the document uses ## H2 headings for phases and bullet points for tasks."}):e.jsx("div",{className:`${S.tree} tf-scrollbar`,children:b.map(x=>e.jsx($t,{node:x,depth:0,onToggle:I},x.idempotencyKey))})]})]}),!g&&u!=="done"&&u!=="error"&&e.jsxs("div",{className:S.footer,children:[e.jsx("button",{className:"tf-button-secondary",onClick:s,children:"Cancel"}),e.jsx("button",{className:"tf-button-primary",onClick:Q,disabled:q===0||u==="generating",children:u==="generating"?e.jsxs(e.Fragment,{children:[e.jsx(_t,{size:13,className:L.docSpinning})," Generating…"]}):e.jsxs(e.Fragment,{children:[e.jsx(Qe,{size:13})," Generate ",q," task",q!==1?"s":""]})})]}),!g&&u==="done"&&e.jsx("div",{className:S.footer,children:e.jsx("button",{className:"tf-button-primary",onClick:s,children:"Done"})})]})})}const Ys={"implementation-plan":"Implementation Plan",review:"Review",walkthrough:"Walkthrough",planning:"Planning",other:"Document"},Xs={"implementation-plan":r.typeBadgeImplementationPlan,review:r.typeBadgeReview,walkthrough:r.typeBadgeWalkthrough,planning:void 0,other:void 0},Zs={editor:r.editorLayoutEditor,split:r.editorLayoutSplit,preview:r.editorLayoutPreview},er=1500,tr=`
|
|
1
|
+
import{j as e,r as i,s as an,R as ve}from"./vendor-react-CKJs5o3c.js";import{h as $e,f as P,t as L,i as yt,j as gt,k as sn,R as rn,m as M,M as on,n as xt,o as cn,q as ln}from"./index-CGDQY0nN.js";import{q as dn,x as un,w as mn,ax as hn,ay as pn,y as qe,i as fn,Z as Qe,X as Rt,az as _t,e as Ye,aA as At,aB as vn,aC as wn,a as kn,j as yn,aD as gn,aE as xn,aF as _n,t as Ee,aG as bn,r as Sn,p as jn,aH as bt,aw as Ve,aI as Cn,aJ as Nn,T as Tn,R as En,aK as Rn,B as An,U as In,S as $n}from"./vendor-icons-CLnehDTw.js";import{g as Ln}from"./documentReferences-Ca2P--i5.js";import{s as Dn,M as Re,r as Ae}from"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";const Bn="_index_1sp0v_1",Mn="_header_1sp0v_8",Pn="_title_1sp0v_23",zn="_search_1sp0v_35",Fn="_searchIcon_1sp0v_41",On="_searchInput_1sp0v_50",Hn="_list_1sp0v_67",Wn="_state_1sp0v_79",Gn="_stateError_1sp0v_87",Kn="_item_1sp0v_94",Un="_itemActive_1sp0v_116",Jn="_itemIcon_1sp0v_126",Vn="_itemBody_1sp0v_136",qn="_itemTitle_1sp0v_144",Qn="_itemTask_1sp0v_156",Yn="_itemBadge_1sp0v_167",Xn="_itemMeta_1sp0v_180",Zn="_itemMetaDetails_1sp0v_191",ea="_itemMetaReference_1sp0v_198",A={index:Bn,header:Mn,title:Pn,search:zn,searchIcon:Fn,searchInput:On,list:Hn,state:Wn,stateError:Gn,item:Kn,itemActive:Un,itemIcon:Jn,itemBody:Vn,itemTitle:qn,itemTask:Qn,itemBadge:Yn,itemMeta:Xn,itemMetaDetails:Zn,itemMetaReference:ea};function Xe(t){let l=t;try{l=decodeURIComponent(t)}catch{l=t}return l.trim().replace(/\\/g,"/").replace(/^\/+/,"").replace(/^\.\//,"").replace(/^\.taskforce\//,"")}function ta(t,l){return!!(t===l||t.endsWith(`/${l}`)||l.endsWith(`/${t}`))}function St(t){const l=Xe(String(t||""));if(!l)return null;const m=l.match(/(^|\/)(asset-[a-f0-9]{32})(?=[^/]*$)/i);return m?.[2]?m[2].toLowerCase():null}function et(t){return t.attachmentState==="attached"||t.attachmentState==="unattached"?t.attachmentState:(typeof t.attachmentCount=="number"&&Number.isFinite(t.attachmentCount)?t.attachmentCount:0)>0||t.taskId?"attached":"unattached"}function na(t,l,m,s){const c=l.trim().toLowerCase();return t.filter(u=>{const y=`${$e(u)} ${u.originalFilename||""}`.toLowerCase(),v=c.length===0||y.includes(c),b=m.length===0||m.includes(u.docType),h=et(u),g=s.length===0||s.includes(h);return v&&b&&g})}function aa({docType:t}){switch(t){case"implementation-plan":return e.jsx(fn,{size:13});case"review":return e.jsx(qe,{size:13});case"walkthrough":return e.jsx(pn,{size:13});default:return e.jsx(hn,{size:13})}}function sa(t){return t<1024?`${t}B`:t<1024*1024?`${(t/1024).toFixed(1)}KB`:`${(t/(1024*1024)).toFixed(1)}MB`}function ra(t){if(!t)return"";const l=new Date(t),s=new Date().getTime()-l.getTime(),c=Math.floor(s/(1e3*60*60*24));return c===0?"Today":c===1?"Yesterday":c<7?`${c}d ago`:c<30?`${Math.floor(c/7)}w ago`:l.toLocaleDateString()}function ia(t,l){t.key!=="Enter"&&t.key!==" "||(t.preventDefault(),l())}function oa({documents:t,selectedDocId:l,loading:m,error:s,searchQuery:c,taskById:u,onSearchChange:w,onSelect:y,onCloseTray:v,hasActiveFilters:b}){return e.jsxs("div",{className:A.index,children:[e.jsxs("div",{className:A.header,children:[e.jsxs("span",{className:A.title,children:[e.jsx(dn,{size:14}),"Documents"]}),v?e.jsx("button",{type:"button",className:"tf-control-icon",onClick:v,title:"Collapse document tray","aria-label":"Collapse document tray",children:e.jsx(un,{size:16})}):null]}),e.jsxs("div",{className:A.search,children:[e.jsx(mn,{size:12,className:A.searchIcon}),e.jsx("input",{type:"text",placeholder:"Search documents…",value:c,onChange:h=>w(h.target.value),className:A.searchInput})]}),e.jsxs("div",{className:`${A.list} tf-scrollbar`,children:[m&&e.jsx("div",{className:A.state,children:"Loading documents…"}),!m&&s&&e.jsx("div",{className:A.stateError,children:s}),!m&&!s&&t.length===0&&e.jsx("div",{className:A.state,children:b?"No documents match your filters.":"No documents found. Documents added as task attachments will appear here."}),!m&&t.map(h=>{const g=h.taskId?u.get(h.taskId):null,O=h.id===l,T=$e(h),C=et(h),D=typeof h.attachmentCount=="number"&&Number.isFinite(h.attachmentCount)?h.attachmentCount:h.taskId?1:0,E=D>1?`${D} tasks linked`:D===1?g?.title||"1 task linked":null;return e.jsxs("div",{role:"button",tabIndex:0,className:`${A.item} ${O?A.itemActive:""}`,onClick:()=>y(h),onKeyDown:I=>ia(I,()=>y(h)),children:[e.jsx("div",{className:A.itemIcon,children:e.jsx(aa,{docType:h.docType})}),e.jsxs("div",{className:A.itemBody,children:[e.jsx("span",{className:A.itemTitle,title:T,children:T}),C==="unattached"&&e.jsx("span",{className:A.itemBadge,children:"Unattached"}),E&&e.jsx("span",{className:A.itemTask,title:E,children:E}),e.jsxs("span",{className:A.itemMeta,children:[e.jsxs("span",{className:A.itemMetaDetails,children:[sa(h.sizeBytes),h.updatedAt&&e.jsxs(e.Fragment,{children:[" · ",ra(h.updatedAt)]})]}),h.referenceLabel&&e.jsx("span",{className:A.itemMetaReference,children:h.referenceLabel})]})]})]},h.id)})]})]})}function Ie(t){return function(l){return Dn(l,t)}}const ca="_viewer_v1pk0_1",la="_viewerMonochrome_v1pk0_10",da="_metaDocumentName_v1pk0_10",ua="_viewerEditMode_v1pk0_14",ma="_meta_v1pk0_10",ha="_metaLeft_v1pk0_30",pa="_metaRenameRow_v1pk0_49",fa="_typeBadge_v1pk0_56",va="_typeBadgeImplementationPlan_v1pk0_71",wa="_typeBadgeReview_v1pk0_77",ka="_typeBadgeWalkthrough_v1pk0_83",ya="_metaTaskName_v1pk0_89",ga="_statusBadge_v1pk0_98",xa="_metaDate_v1pk0_113",_a="_metaSize_v1pk0_114",ba="_actions_v1pk0_122",Sa="_actionBtn_v1pk0_129",ja="_dangerBtn_v1pk0_156",Ca="_generateBtn_v1pk0_167",Na="_editBtn_v1pk0_178",Ta="_saveBtn_v1pk0_189",Ea="_layoutToggle_v1pk0_205",Ra="_layoutBtn_v1pk0_213",Aa="_layoutBtnActive_v1pk0_229",Ia="_saveStatus_v1pk0_234",$a="_saveStatusSaved_v1pk0_241",La="_saveStatusError_v1pk0_245",Da="_unsaved_v1pk0_250",Ba="_viewerContent_v1pk0_256",Ma="_viewerBody_v1pk0_265",Pa="_viewerBodyFullWidth_v1pk0_273",za="_viewerMain_v1pk0_277",Fa="_reviewRail_v1pk0_285",Oa="_printHint_v1pk0_291",Ha="_reviewSection_v1pk0_298",Wa="_reviewHeader_v1pk0_307",Ga="_reviewTitle_v1pk0_315",Ka="_reviewSubtitle_v1pk0_324",Ua="_reviewControls_v1pk0_331",Ja="_reviewSelect_v1pk0_338",Va="_reviewSessionMeta_v1pk0_342",qa="_reviewStatusResolved_v1pk0_350",Qa="_reviewSessionLabel_v1pk0_356",Ya="_reviewTitleEditRow_v1pk0_361",Xa="_reviewSessionTimestamp_v1pk0_368",Za="_reviewAnchorLabel_v1pk0_372",es="_reviewComposer_v1pk0_378",ts="_reviewAnchorChip_v1pk0_385",ns="_reviewAnchorSnippet_v1pk0_398",as="_reviewAnchorClear_v1pk0_403",ss="_reviewCommentActions_v1pk0_416",rs="_reviewCommentAction_v1pk0_416",is="_reviewCommentEditor_v1pk0_437",os="_viewerState_v1pk0_443",cs="_viewerStateError_v1pk0_450",ls="_editorArea_v1pk0_457",ds="_editorPane_v1pk0_464",us="_editorLayoutSplit_v1pk0_472",ms="_previewPane_v1pk0_473",hs="_editorLayoutEditor_v1pk0_477",ps="_editorLayoutPreview_v1pk0_478",fs="_editorPaneLabel_v1pk0_482",vs="_editorTextarea_v1pk0_494",ws="_markdownSurface_v1pk0_536",ks="_attachModalBody_v1pk0_745",ys="_attachModalCopy_v1pk0_752",gs="_attachModalError_v1pk0_759",xs="_attachTaskList_v1pk0_772",_s="_attachTaskRow_v1pk0_781",bs="_attachTaskTitle_v1pk0_808",Ss="_attachTaskInfo_v1pk0_814",js="_attachTaskReference_v1pk0_822",Cs="_attachTaskMeta_v1pk0_829",Ns="_attachEmptyState_v1pk0_836",r={viewer:ca,viewerMonochrome:la,metaDocumentName:da,viewerEditMode:ua,meta:ma,metaLeft:ha,metaRenameRow:pa,typeBadge:fa,typeBadgeImplementationPlan:va,typeBadgeReview:wa,typeBadgeWalkthrough:ka,metaTaskName:ya,statusBadge:ga,metaDate:xa,metaSize:_a,actions:ba,actionBtn:Sa,dangerBtn:ja,generateBtn:Ca,editBtn:Na,saveBtn:Ta,layoutToggle:Ea,layoutBtn:Ra,layoutBtnActive:Aa,saveStatus:Ia,saveStatusSaved:$a,saveStatusError:La,unsaved:Da,viewerContent:Ba,viewerBody:Ma,viewerBodyFullWidth:Pa,viewerMain:za,reviewRail:Fa,printHint:Oa,reviewSection:Ha,reviewHeader:Wa,reviewTitle:Ga,reviewSubtitle:Ka,reviewControls:Ua,reviewSelect:Ja,reviewSessionMeta:Va,reviewStatusResolved:qa,reviewSessionLabel:Qa,reviewTitleEditRow:Ya,reviewSessionTimestamp:Xa,reviewAnchorLabel:Za,reviewComposer:es,reviewAnchorChip:ts,reviewAnchorSnippet:ns,reviewAnchorClear:as,reviewCommentActions:ss,reviewCommentAction:rs,reviewCommentEditor:is,viewerState:os,viewerStateError:cs,editorArea:ls,editorPane:ds,editorLayoutSplit:us,previewPane:ms,editorLayoutEditor:hs,editorLayoutPreview:ps,editorPaneLabel:fs,editorTextarea:vs,markdownSurface:ws,attachModalBody:ks,attachModalCopy:ys,attachModalError:gs,attachTaskList:xs,attachTaskRow:_s,attachTaskTitle:bs,attachTaskInfo:Ss,attachTaskReference:js,attachTaskMeta:Cs,attachEmptyState:Ns},Ts="_overlay_1unik_1",Es="_modal_1unik_12",Rs="_header_1unik_16",As="_title_1unik_20",Is="_docName_1unik_24",$s="_body_1unik_34",Ls="_state_1unik_41",Ds="_stateError_1unik_52",Bs="_stateDone_1unik_63",Ms="_toolbar_1unik_84",Ps="_toolbarCount_1unik_95",zs="_toolbarActions_1unik_100",Fs="_tree_1unik_105",Os="_taskRow_1unik_113",Hs="_taskRowDimmed_1unik_126",Ws="_taskCheck_1unik_130",Gs="_taskExpandBtn_1unik_139",Ks="_taskExpandSpacer_1unik_155",Us="_taskTitle_1unik_160",Js="_taskBadge_1unik_169",Vs="_footer_1unik_179",S={overlay:Ts,modal:Es,header:Rs,title:As,docName:Is,body:$s,state:Ls,stateError:Ds,stateDone:Bs,toolbar:Ms,toolbarCount:Ps,toolbarActions:zs,tree:Fs,taskRow:Os,taskRowDimmed:Hs,taskCheck:Ws,taskExpandBtn:Gs,taskExpandSpacer:Ks,taskTitle:Us,taskBadge:Js,footer:Vs},qs={1:"Low",2:"Medium",3:"High"};function we(t,l){return t.map(m=>({...m,selected:l,children:we(m.children,l)}))}function It(t,l,m){return t.map(s=>s.idempotencyKey===l?{...s,selected:m,children:we(s.children,m)}:{...s,children:It(s.children,l,m)})}function Ze(t){let l=0;for(const m of t)m.selected&&l++,l+=Ze(m.children);return l}function $t({node:t,depth:l,onToggle:m}){const[s,c]=i.useState(!0),u=t.children.length>0,w=l*20;return e.jsxs("div",{children:[e.jsxs("div",{className:`${S.taskRow} ${t.selected?"":S.taskRowDimmed}`,style:{paddingLeft:`${12+w}px`},children:[e.jsx("button",{className:S.taskCheck,onClick:()=>m(t.idempotencyKey,!t.selected),title:t.selected?"Deselect":"Select",children:t.selected?e.jsx(vn,{size:14,style:{color:"var(--brand-primary-strong)"}}):e.jsx(wn,{size:14,style:{color:"var(--text-muted)"}})}),u?e.jsx("button",{className:S.taskExpandBtn,onClick:()=>c(y=>!y),children:s?e.jsx(kn,{size:12}):e.jsx(yn,{size:12})}):e.jsx("span",{className:S.taskExpandSpacer}),e.jsx("span",{className:S.taskTitle,title:t.description||void 0,children:t.title}),e.jsx("span",{className:S.taskBadge,style:{color:yt(t.type),borderColor:yt(t.type)},children:t.type}),e.jsx("span",{className:S.taskBadge,style:{color:gt(t.priority),borderColor:gt(t.priority)},children:qs[t.priority]})]}),u&&s&&e.jsx("div",{children:t.children.map(y=>e.jsx($t,{node:y,depth:l+1,onToggle:m},y.idempotencyKey))})]})}function Qs({content:t,docTitle:l,apiBaseUrl:m="",onClose:s,onGenerated:c}){const[u,w]=i.useState("preview"),[y,v]=i.useState(null),[b,h]=i.useState([]),[g,O]=i.useState(!0),[T,C]=i.useState(0),[D,E]=i.useState(null);i.useEffect(()=>{let x=!1;return O(!0),v(null),P("/api/taskforce/documents/generate-tasks/preview",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:t})},m).then(j=>j.json()).then(j=>{if(!x){if(j.error)throw new Error(j.error);h(j.tasks||[]),w("preview")}}).catch(j=>{x||(v(j?.message||"Failed to parse plan"),w("error"))}).finally(()=>{x||O(!1)}),()=>{x=!0}},[t,m]);const I=i.useCallback((x,j)=>{h(F=>It(F,x,j))},[]),z=()=>h(x=>we(x,!0)),H=()=>h(x=>we(x,!1)),q=Ze(b),Q=async()=>{w("generating"),E(null);try{const x=await P("/api/taskforce/documents/generate-tasks/commit",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({tasks:b})},m),j=await x.json().catch(()=>({}));if(!x.ok)throw new Error(j.error||`Generation failed (${x.status})`);C(j.created??0),w("done"),c(j.created??0)}catch(x){E(x?.message||"Generation failed"),w("error")}};return e.jsx("div",{className:S.overlay,onClick:x=>{x.target===x.currentTarget&&s()},children:e.jsxs("div",{className:`tf-surface-modal tf-modal-shell ${S.modal}`,children:[e.jsxs("div",{className:`tf-modal-header ${S.header}`,children:[e.jsxs("div",{className:`tf-modal-title ${S.title}`,children:[e.jsx(Qe,{size:16,style:{color:"var(--brand-primary-strong)"}}),"Generate Tasks from Plan"]}),e.jsx("span",{className:S.docName,children:l}),e.jsx("button",{className:"tf-control-icon",onClick:s,title:"Close",children:e.jsx(Rt,{size:16})})]}),e.jsxs("div",{className:S.body,children:[g&&e.jsxs("div",{className:S.state,children:[e.jsx(_t,{size:20,className:L.docSpinning}),"Parsing plan…"]}),!g&&u==="error"&&e.jsxs("div",{className:S.stateError,children:[e.jsx(Ye,{size:16}),y||D||"An error occurred"]}),!g&&u==="done"&&e.jsxs("div",{className:S.stateDone,children:[e.jsx(At,{size:24,style:{color:"var(--status-success)"}}),e.jsxs("strong",{children:[T," task",T!==1?"s":""," created"]}),e.jsx("p",{children:"Tasks are now in your board. Switch to the Kanban or Hierarchy view to see them."})]}),!g&&(u==="preview"||u==="confirm"||u==="generating")&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:S.toolbar,children:[e.jsxs("span",{className:S.toolbarCount,children:[q," of ",Ze(we(b,!0))," tasks selected"]}),e.jsxs("div",{className:S.toolbarActions,children:[e.jsx("button",{className:"tf-control-icon",onClick:z,children:"Select all"}),e.jsx("button",{className:"tf-control-icon",onClick:H,children:"Deselect all"})]})]}),b.length===0?e.jsx("div",{className:S.state,children:"No tasks could be parsed from this document. Make sure the document uses ## H2 headings for phases and bullet points for tasks."}):e.jsx("div",{className:`${S.tree} tf-scrollbar`,children:b.map(x=>e.jsx($t,{node:x,depth:0,onToggle:I},x.idempotencyKey))})]})]}),!g&&u!=="done"&&u!=="error"&&e.jsxs("div",{className:S.footer,children:[e.jsx("button",{className:"tf-button-secondary",onClick:s,children:"Cancel"}),e.jsx("button",{className:"tf-button-primary",onClick:Q,disabled:q===0||u==="generating",children:u==="generating"?e.jsxs(e.Fragment,{children:[e.jsx(_t,{size:13,className:L.docSpinning})," Generating…"]}):e.jsxs(e.Fragment,{children:[e.jsx(Qe,{size:13})," Generate ",q," task",q!==1?"s":""]})})]}),!g&&u==="done"&&e.jsx("div",{className:S.footer,children:e.jsx("button",{className:"tf-button-primary",onClick:s,children:"Done"})})]})})}const Ys={"implementation-plan":"Implementation Plan",review:"Review",walkthrough:"Walkthrough",planning:"Planning",other:"Document"},Xs={"implementation-plan":r.typeBadgeImplementationPlan,review:r.typeBadgeReview,walkthrough:r.typeBadgeWalkthrough,planning:void 0,other:void 0},Zs={editor:r.editorLayoutEditor,split:r.editorLayoutSplit,preview:r.editorLayoutPreview},er=1500,tr=`
|
|
2
2
|
@page {
|
|
3
3
|
margin: 0.94in 1.02in 1in;
|
|
4
4
|
}
|
package/dist/ui/assets/{EntityActivityTimeline-B2aXkxiE.js → EntityActivityTimeline-BlS7DhA4.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{R as k,j as t}from"./vendor-react-CKJs5o3c.js";import{S as A,U as N,V as E,W as I,X as S,Y as M}from"./index-
|
|
1
|
+
import{R as k,j as t}from"./vendor-react-CKJs5o3c.js";import{S as A,U as N,V as E,W as I,X as S,Y as M}from"./index-CGDQY0nN.js";import"./vendor-icons-CLnehDTw.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";const $="_thread_1mrb3_1",z="_empty_1mrb3_7",P="_item_1mrb3_17",H="_comment_1mrb3_24",R="_commentAgent_1mrb3_28",B="_commentMember_1mrb3_32",W="_event_1mrb3_36",K="_eventSystem_1mrb3_43",w="_header_1mrb3_47",D="_eventHeader_1mrb3_64",F="_author_1mrb3_71",O="_time_1mrb3_79",U="_commentText_1mrb3_83",X="_eventText_1mrb3_123",Y="_eventChanges_1mrb3_129",q="_eventChange_1mrb3_129",e={thread:$,empty:z,item:P,comment:H,commentAgent:R,commentMember:B,event:W,eventSystem:K,header:w,eventHeader:D,author:F,time:O,commentText:U,eventText:X,eventChanges:Y,eventChange:q};function v(c,m){const r=c.replace("#","").trim();if(r.length!==3&&r.length!==6)return"";const i=r.length===3?r.split("").map(l=>l+l).join(""):r,a=Number.parseInt(i,16);if(Number.isNaN(a))return"";const _=a>>16&255,g=a>>8&255,u=a&255;return`rgba(${_}, ${g}, ${u}, ${m})`}function ee({activity:c,comments:m,formatFieldValue:r,resolveActorPresentation:i,onOpenTaskById:a,emptyMessage:_="No activity yet.",listClassName:g,emptyClassName:u,endRef:l}){const b=k.useMemo(()=>A({activity:c,comments:m}),[c,m]);return t.jsxs("div",{className:[e.thread,g].filter(Boolean).join(" "),children:[b.length===0?t.jsx("div",{className:[e.empty,u].filter(Boolean).join(" "),children:_}):null,b.map(n=>{if(n.type==="comment"){const o=i({actorId:n.comment.author,actorType:n.comment.actor?.kind==="ai"?"ai":n.comment.actor?.kind==="human"?"human":null,actorProfile:n.comment.actor||null}),x=o.kind==="agent"?"agent":"member",{ActorIcon:f}=o,s=o.color,T=s&&v(s,.35)?{background:`linear-gradient(135deg, ${v(s,.18)} 0%, ${v(s,.1)} 100%)`,borderColor:v(s,.35)}:void 0;return t.jsxs("div",{className:[e.item,e.comment,x==="agent"?e.commentAgent:e.commentMember].join(" "),children:[t.jsxs("div",{className:e.header,children:[t.jsxs("span",{className:e.author,style:s?{color:s}:void 0,children:[t.jsx(f,{size:12,strokeWidth:1.5}),o.label]}),t.jsx("span",{className:e.time,children:N(n.comment.timestamp,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})})]}),t.jsx("div",{className:e.commentText,style:T,children:t.jsx(E,{onTaskIdClick:a,children:n.comment.text})})]},n.id)}const d=i({actorId:n.event.actor,actorType:n.event.actorType,actorProfile:n.event.actorProfile||null,fallbackKind:"system"}),{ActorIcon:C}=d,y=d.color,h=Object.entries(n.event.details?.changes||{}),p=I(n.event),j=h.length>1&&p?h.filter(([o])=>o!==p):h.length>1?h:[];return t.jsxs("div",{className:[e.item,e.event,d.kind==="system"?e.eventSystem:""].filter(Boolean).join(" "),children:[t.jsxs("div",{className:[e.header,e.eventHeader].join(" "),children:[t.jsxs("span",{className:e.author,style:y?{color:y}:void 0,children:[t.jsx(C,{size:12,strokeWidth:1.5}),d.label]}),t.jsx("span",{className:e.time,children:N(n.event.createdAt,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})})]}),t.jsxs("div",{className:e.eventText,children:[t.jsx("div",{children:S(n.event,r)}),j.length>0?t.jsx("div",{className:e.eventChanges,children:j.map(([o,x])=>t.jsx("div",{className:e.eventChange,children:M(o,x,r)},o))}):null]})]},n.id)}),t.jsx("div",{ref:l})]})}export{ee as EntityActivityTimeline};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as i,j as s}from"./vendor-react-CKJs5o3c.js";import{t as e}from"./index-
|
|
1
|
+
import{r as i,j as s}from"./vendor-react-CKJs5o3c.js";import{t as e}from"./index-CGDQY0nN.js";import{h as g,Z as j,b as v,m as f}from"./vendor-icons-CLnehDTw.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";function T({initiativeTemplates:n,onRefreshInitiativeTemplates:u,onCreateInitiativeFromTemplate:r}){const[a,o]=i.useState(""),[c,x]=i.useState(""),[d,m]=i.useState(!1),[l,p]=i.useState(null);return i.useEffect(()=>{if(!a&&n.length>0){const t=n[0];o(t.id)}},[n,a]),s.jsx("div",{className:`${e.standalonePage} ${e.standaloneContent}`,style:{overflow:"auto"},children:s.jsx("div",{className:e.settingsContent,style:{maxWidth:900,margin:"0 auto",width:"100%"},children:s.jsxs("div",{className:e.settingGroup,children:[s.jsxs("div",{className:e.settingTitleRow,children:[s.jsx("h2",{className:e.settingTitle,children:"Initiatives"}),s.jsx("button",{className:e.copyBtn,onClick:()=>{u?.()},children:"Refresh"})]}),s.jsx("p",{className:`${e.settingsHint} ${e.marginBottom12}`,children:"Create initiative-ready planning structures from reusable templates."}),s.jsxs("div",{className:e.exportItem,children:[s.jsx("label",{className:e.label,children:"Template"}),s.jsx("select",{className:e.input,value:a,onChange:t=>{const h=t.target.value;o(h)},children:n.map(t=>s.jsx("option",{value:t.id,children:t.name},t.id))})]}),s.jsxs("div",{className:`${e.exportItem} ${e.marginTop12}`,children:[s.jsx("label",{className:e.label,children:"Initiative Title"}),s.jsx("input",{className:e.input,placeholder:"e.g. Taskforce Public Beta Launch",value:c,onChange:t=>x(t.target.value)})]}),s.jsxs("button",{className:`${e.secondaryHeaderBtn} ${e.marginTop12}`,disabled:d||!a||!c.trim()||!r,onClick:async()=>{if(!r)return;m(!0);const t=await r({templateId:a,title:c.trim()});m(!1),p({type:t.success?"success":"error",message:t.success?"Initiative created from template.":t.error||"Failed to create initiative."})},children:[d?s.jsx(g,{size:14,className:e.spinner}):s.jsx(j,{size:14}),"Create Initiative"]}),l&&s.jsxs("div",{className:`${l.type==="success"?e.successMessage:e.errorMessage} ${e.marginTop12}`,children:[l.type==="success"?s.jsx(v,{size:14}):s.jsx(f,{size:14}),l.message]})]})})})}export{T as InitiativesModule};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as s,j as e}from"./vendor-react-CKJs5o3c.js";import{H as he,t as Oe,J as Ve,K as Pe,L as fe,N as be,O as Ke,Q as He}from"./index-rB9GGUCz.js";import{aL as qe,h as ze,U as Ye}from"./vendor-icons-CLnehDTw.js";import{u as We,a as Ge}from"./vendor-router-BbWMxlnO.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";const Qe="_plansWrapper_nb8ab_1",Je="_contentFrame_nb8ab_24",Xe="_shellOwnsScroll_nb8ab_32",Ze="_withChrome_nb8ab_38",en="_siteVariant_nb8ab_42",nn="_title_nb8ab_56",tn="_subtitle_nb8ab_70",rn="_header_nb8ab_77",an="_planCard_nb8ab_92",sn="_grid_nb8ab_105",cn="_pricingNotes_nb8ab_113",on="_planName_nb8ab_122",ln="_featureText_nb8ab_129",un="_currentBadge_nb8ab_133",dn="_navAction_nb8ab_137",mn="_backBtn_nb8ab_138",pn="_priceRows_nb8ab_149",gn="_foundingBeta_nb8ab_153",fn="_cloudCapacityNote_nb8ab_172",bn="_headerBar_nb8ab_239",hn="_headerActions_nb8ab_248",yn="_debugMeta_nb8ab_299",_n="_planNoticeCard_nb8ab_362",Cn="_planDescription_nb8ab_373",Sn="_teamComingSoonCard_nb8ab_378",wn="_clickablePlanCard_nb8ab_397",vn="_activePlanCard_nb8ab_412",xn="_callToAction_nb8ab_476",Nn="_primaryCta_nb8ab_488",kn="_secondaryCta_nb8ab_499",Pn="_currentCta_nb8ab_511",In="_featuresList_nb8ab_525",An="_priceRow_nb8ab_149",jn="_regularPriceLine_nb8ab_549",Tn="_campaignPriceLine_nb8ab_550",Ln="_priceRowWithCampaign_nb8ab_557",Rn="_priceRowAmount_nb8ab_561",En="_regularPriceDiscounted_nb8ab_567",Bn="_priceRowInterval_nb8ab_573",$n="_campaignPriceLabel_nb8ab_582",Mn="_campaignPriceAmount_nb8ab_587",Un="_campaignPriceInterval_nb8ab_593",Dn="_ctaRow_nb8ab_598",Fn="_featureItem_nb8ab_604",On="_featureIcon_nb8ab_610",Vn="_featureLimitAccent_nb8ab_624",Kn="_featureLimitUnit_nb8ab_635",Hn="_featureTextBlock_nb8ab_641",qn="_featureDescription_nb8ab_647",zn="_emptyState_nb8ab_653",Yn="_marketingEmptyState_nb8ab_662",Wn="_emptyBadge_nb8ab_690",Gn="_emptyHighlights_nb8ab_705",Qn="_loader_nb8ab_727",Jn="_spinner_nb8ab_737",Xn="_statusBanner_nb8ab_790",Zn="_successBanner_nb8ab_798",et="_infoBanner_nb8ab_804",nt="_errorBanner_nb8ab_810",r={plansWrapper:Qe,contentFrame:Je,shellOwnsScroll:Xe,withChrome:Ze,siteVariant:en,title:nn,subtitle:tn,header:rn,planCard:an,grid:sn,pricingNotes:cn,planName:on,featureText:ln,currentBadge:un,navAction:dn,backBtn:mn,priceRows:pn,foundingBeta:gn,cloudCapacityNote:fn,headerBar:bn,headerActions:hn,debugMeta:yn,planNoticeCard:_n,planDescription:Cn,teamComingSoonCard:Sn,clickablePlanCard:wn,activePlanCard:vn,callToAction:xn,primaryCta:Nn,secondaryCta:kn,currentCta:Pn,featuresList:In,priceRow:An,regularPriceLine:jn,campaignPriceLine:Tn,priceRowWithCampaign:Ln,priceRowAmount:Rn,regularPriceDiscounted:En,priceRowInterval:Bn,campaignPriceLabel:$n,campaignPriceAmount:Mn,campaignPriceInterval:Un,ctaRow:Dn,featureItem:Fn,featureIcon:On,featureLimitAccent:Vn,featureLimitUnit:Kn,featureTextBlock:Hn,featureDescription:qn,emptyState:zn,marketingEmptyState:Yn,emptyBadge:Wn,emptyHighlights:Gn,loader:Qn,spinner:Jn,statusBanner:Xn,successBanner:Zn,infoBanner:et,errorBanner:nt};function tt(){const n=globalThis.__DEBUG_MODE__;return typeof n=="boolean"?n:!1}function rt(n){const a=String(n?.environment||"").trim(),o=String(n?.runtimeMode||"").trim();return!a&&!o?null:a&&o?`${a} (${o})`:a||o||null}const at=new Set(["a","b","br","em","i","li","ol","p","strong","u","ul"]);function it(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function st(n){const a=String(n||"").trim();if(!a)return"";if(typeof document>"u")return it(a);const o=document.createElement("template");o.innerHTML=a;const p=document.createElement("div"),l=_=>{if(_.nodeType===Node.TEXT_NODE)return document.createTextNode(_.textContent||"");if(_.nodeType!==Node.ELEMENT_NODE)return null;const E=_,I=E.tagName.toLowerCase();if(I==="script"||I==="style")return null;const $=Array.from(E.childNodes).map(l).filter(b=>!!b);if(!at.has(I)){const b=document.createDocumentFragment();for(const W of $)b.appendChild(W);return b}const x=document.createElement(I);if(I==="a"){const b=String(E.getAttribute("href")||"").trim();/^(https?:|mailto:|\/|#)/i.test(b)&&(x.setAttribute("href",b),x.setAttribute("rel","noopener noreferrer"))}for(const b of $)x.appendChild(b);return x};for(const _ of Array.from(o.content.childNodes)){const E=l(_);E&&p.appendChild(E)}return p.innerHTML}function ct(n,a){if(n==null||!a)return"Contact Sales";try{return new Intl.NumberFormat("en-US",{style:"currency",currency:a.toUpperCase(),minimumFractionDigits:0}).format(n/100)}catch{return`${a.toUpperCase()} ${n/100}`}}function ot(){return"$0"}function V(n){return n?n.pricingType==="free"?!0:n.unitAmount!=null&&n.currency!=null:!1}function Te(n){return n?n.pricingType==="free"?ot():ct(n.unitAmount,n.currency):"Unavailable"}function Le(n,a){return V(a)?{price:a,pricingAudience:"campaign"}:{price:n,pricingAudience:"public"}}function lt(n,a,o,p){const l=V(n)||V(o),_=V(a)||V(p);if(!l&&!_)return null;const E=(I,$,x)=>{if(!V(I)&&!V($))return null;const b=V($),W=x==="year"?"year":"month";return e.jsxs("div",{className:`${r.priceRow} ${b?r.priceRowWithCampaign:""}`,children:[V(I)?e.jsxs("div",{className:r.regularPriceLine,children:[e.jsx("span",{className:`${r.priceRowAmount} ${b?r.regularPriceDiscounted:""}`,children:Te(I)}),e.jsxs("span",{className:r.priceRowInterval,children:["/ ",W]})]}):null,b?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]},x)};return e.jsxs("div",{className:r.priceRows,children:[E(n,o,"month"),E(a,p,"year")]})}function Re(n){const a=[n.pricing.month,n.pricing.year].filter(Boolean);if(a.some(p=>p.pricingType==="free"))return 0;const o=a.map(p=>p.pricingType==="stripe"&&typeof p.unitAmount=="number"?p.unitAmount:null).filter(p=>p!=null);return o.length>0?Math.min(...o):Number.POSITIVE_INFINITY}function ut(n){return String(n||"").replace(/[_\-.]+/g," ").replace(/\b\w/g,a=>a.toUpperCase())}function Ie(n,a){const o=n?.[a],p=Number(o);return Number.isFinite(p)?Math.max(1,Math.floor(p)):null}function ve(n,a){return a!==1?n:n.replace(/\b([A-Za-z]+)ies\b$/,"$1y").replace(/\b([A-Za-z]+[^s\s])s\b$/,"$1")}function dt(n){return n<=1e3?{value:String(n),unit:"MB"}:{value:String(Math.round(n/1e3)),unit:"GB"}}function mt(n,a){const o=String(n.publicLabel||n.label||"").trim()||ut(n.featureKey),p=n.config&&typeof n.config=="object"?n.config:{};if(n.featureKey==="context.uploads"){const l=Ie(p,"storageLimitMb");if(l!==null){const _=dt(l);return{limitValue:_.value,limitUnit:_.unit,baseLabel:ve(o,l)}}}if(n.featureKey==="workspace.workspaces"){const l=Ie(p,"maxWorkspaces");if(l!==null)return{limitValue:String(l),limitUnit:null,baseLabel:ve(o,l)}}if(n.featureKey==="collaboration.ai_profiles"){const l=Ie(p,"maxAiProfiles");if(l!==null)return{limitValue:String(l),limitUnit:null,baseLabel:ve(o,l)}}if(n.featureKey==="collaboration.team_management"){const l=Number(a);if(Number.isFinite(l)&&l>0){const _=Math.floor(l);return{limitValue:String(_),limitUnit:null,baseLabel:ve(o,_)}}}return{limitValue:null,limitUnit:null,baseLabel:o}}function pt({heading:n,subtitle:a,variant:o="app",theme:p="dark",chrome:l,footer:_,isAuthenticated:E,authSessionResolved:I=!0,currentPlanId:$,currentPlanVersionId:x,currentEntitlementState:b,markCurrentPlan:W,canManageCurrentPlan:G=!0,pricingEndpoint:A,statusBanner:H,onBack:j,backLabel:T,backDisabled:M=!1,topActions:se,shellOwnsScroll:ye=!1,showPageBackButton:X=!0,showHeaderBarWithChrome:re=!1,preferPricingPageTitle:_e=!0,currentPlanCardActionMode:Ce="manage",fallbackPricingSource:f=null,onSelectPlan:q}){const[Z,Q]=s.useState([]),[ce,F]=s.useState(null),[N,L]=s.useState({pageTitle:null,pageDescription:null}),[oe,z]=s.useState(!0),[le,ue]=s.useState(null),[Se,ee]=s.useState(0);s.useEffect(()=>{let i=!0;return(async()=>{const D=String(A||"/api/taskforce/public/pricing").trim()||"/api/taskforce/public/pricing";i&&(z(!0),ue(null));try{const v=await fetch(D,{method:"GET",credentials:"include"}),u=await v.json().catch(()=>({}));if(v.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 (${v.status})`))}catch(v){if(i){const u=v instanceof Error?v.message:"Failed to load pricing";ue(u||"Failed to load pricing"),F(null),L({pageTitle:null,pageDescription:null})}}finally{i&&z(!1)}})(),()=>{i=!1}},[A,Se]);const J=s.useMemo(()=>[...Z].sort((i,U)=>{const D=Re(i),v=Re(U);if(D!==v)return D-v;const u=i.defaultVersion?.versionNumber||0,O=U.defaultVersion?.versionNumber||0;return u!==O?u-O:String(i.displayName||i.planId).localeCompare(String(U.displayName||U.planId))}),[Z]),de=s.useMemo(()=>rt(ce||f),[f,ce]),xe=String((_e?N.pageTitle:null)||n).trim()||n,me=String(N.pageDescription||a||"").trim(),w=s.useMemo(()=>st(me),[me]),ne=I,pe=`${r.plansWrapper} ${ye?r.shellOwnsScroll:"tf-scrollbar"} ${o==="site"?r.siteVariant:""} ${l?r.withChrome:""}`.trim(),B=i=>ye?e.jsxs(e.Fragment,{children:[l,i,_]}):e.jsxs("div",{className:Oe.standaloneWrapper,"data-theme":p,children:[l,i,_]});return B(oe?e.jsx(e.Fragment,{children:e.jsx("div",{className:pe,children:e.jsx("div",{className:r.contentFrame,children:e.jsxs("div",{className:r.loader,children:[e.jsx(ze,{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:j,disabled:M,children:T}):null}),e.jsx("div",{className:r.headerActions,children:se})]}),e.jsx("h1",{className:r.title,children:xe}),w&&e.jsx("div",{className:r.subtitle,dangerouslySetInnerHTML:{__html:w}}),tt()&&de?e.jsxs("p",{className:r.debugMeta,children:["Pricing source: ",de]}):null,H&&e.jsx("div",{className:`${r.statusBanner} ${H.type==="success"?r.successBanner:H.type==="info"?r.infoBanner:r.errorBanner}`,children:H.message})]}),e.jsxs("section",{className:r.foundingBeta,"aria-labelledby":"founding-beta-heading",children:[e.jsx("h2",{id:"founding-beta-heading",children:"Founding beta"}),e.jsx("p",{children:"Taskforce is in founding beta. You may run into rough edges while we improve cloud workspaces and agent workflows. Early members get access while the product is still forming, plus a direct role in shaping what comes next."})]}),J.length===0?e.jsxs("div",{className:`${r.emptyState} ${r.marketingEmptyState}`,children:[e.jsx("span",{className:r.emptyBadge,children:"Coming Soon"}),e.jsx("h2",{children:"Paid plans are getting their final polish."}),e.jsx("p",{children:"Taskforce pricing is on the way with flexible options for solo operators, teams, and larger rollouts. Check back soon for launch tiers, feature bundles, and early access details."}),e.jsxs("div",{className:r.emptyHighlights,"aria-label":"Upcoming pricing highlights",children:[e.jsx("span",{children:"Launch-ready tiers"}),e.jsx("span",{children:"Team billing controls"}),e.jsx("span",{children:"Feature-based packaging"})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:r.grid,children:J.map(i=>{const U=i.pricing.month,D=i.pricing.year,v=i.campaignPricing?.month||null,u=i.campaignPricing?.year||null,O=Le(U,v),K=Le(D,u),Y=V(O.price),ae=V(K.price),ie=Y&&ae,k=String(i.defaultVersion?.planVersionId||"").trim(),Ne=he(b),ge=W??Ne,ke=!!(k&&x&&x===k)||!!(!x&&($&&$===i.planId)),te=ge&&ke&&b!=="canceled",t=Y?"month":ae?"year":null,c=t==="year"?K:O,y=Ce==="manage",g=Ce==="indicator",h=ne&&!!k&&(te?y&&G:!!t),m=()=>{if(k){if(te){if(!y||!G)return;q({planId:i.planId,planVersionId:k,interval:t||"month",pricingType:c.price?.pricingType||"stripe",pricingAudience:c.pricingAudience,isCurrentPlan:!0});return}t&&q({planId:i.planId,planVersionId:k,interval:t,pricingType:c.price?.pricingType||"stripe",pricingAudience:c.pricingAudience,isCurrentPlan:!1})}};return e.jsxs("div",{className:`${r.planCard} ${te?r.activePlanCard:""} ${h?r.clickablePlanCard:""}`,"data-testid":`plan-card-${i.planId}`,role:h?"button":void 0,tabIndex:h?0:void 0,onClick:h?m:void 0,onKeyDown:h?d=>{(d.key==="Enter"||d.key===" ")&&(d.preventDefault(),m())}:void 0,children:[te&&e.jsx("span",{className:r.currentBadge,children:"Current Plan"}),e.jsx("h3",{className:r.planName,children:i.displayName}),lt(U,D,v,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(qe,{className:r.featureIcon}),e.jsxs("div",{className:r.featureTextBlock,children:[(()=>{const{limitValue:P,limitUnit:C,baseLabel:R}=mt(d,i.defaultVersion?.seatLimit);return e.jsxs("span",{className:r.featureText,children:[P&&e.jsxs("span",{className:r.featureLimitAccent,children:[e.jsx("span",{children:P}),C?e.jsx("span",{className:r.featureLimitUnit,children:C}):null]}),e.jsx("span",{children:P?` ${R}`:R})]})})(),d.publicDescriptionVisible!==!1&&String(d.publicDescription||d.description||"").trim()&&e.jsx("span",{className:r.featureDescription,children:String(d.publicDescription||d.description||"").trim()})]})]},`${d.featureKey}-${S}`)):e.jsx("span",{className:r.featureText,children:"No additional features included"})}),te?y?e.jsx("button",{className:`${r.callToAction} ${r.currentCta}`,"data-testid":`plan-manage-${i.planId}`,onClick:d=>{d.stopPropagation(),G&&q({planId:i.planId,planVersionId:k,interval:t||"month",pricingType:c.price?.pricingType||"stripe",pricingAudience:c.pricingAudience,isCurrentPlan:!0})},disabled:!k||!G||!ne,children:E&&G?"Manage Plan":"Current Plan"}):g?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:k,interval:"month",pricingType:O.price?.pricingType||"stripe",pricingAudience:O.pricingAudience,isCurrentPlan:!1})},disabled:!k||!ne,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:k,interval:"year",pricingType:K.price?.pricingType||"stripe",pricingAudience:K.pricingAudience,isCurrentPlan:!1})},disabled:!k||!ne,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 gt=1600,Ee=[0,500,1e3,2e3],ft=5e3,bt=45e3,ht="Choose a plan to continue.";function yt(n,a){if(n===401)return!0;const o=String(a||"").trim().toUpperCase();return o==="CHECKOUT_SESSION_INCOMPLETE"||o==="CHECKOUT_PLAN_VERSION_UNRESOLVED"}function _t(n){return n==="year"?"year":"month"}function Ct(n){return n==="campaign"?"campaign":"public"}function Ae(n){const a=String(n||"").trim().toLowerCase();return a==="year"?"year":a==="month"?"month":null}function Be(n){const a=String(n||"").trim();return a?a.replace(/\/+$/,""):""}function je(n={}){const a=new URLSearchParams;a.set("screen","plans");for(const[o,p]of Object.entries(n)){const l=String(p||"").trim();l&&a.set(o,l)}return`/?${a.toString()}`}function jt({isAuthenticated:n,authUserId:a,runtimeMode:o,authSessionResolved:p,currentTheme:l="dark",projectName:_,currentWorkspaceId:E,apiBaseUrl:I,connectedEnvironmentSource:$,resolveCloudAuthUrl:x,embedded:b=!1,shellOwnsScroll:W=!1,onAccountProfileSummaryChange:G,onContinueToTaskforce:A,continueBusy:H=!1}){const j=We(),T=Ge(),[M,se]=s.useState(null),[ye,X]=s.useState(!1),[re,_e]=s.useState(!1),[Ce,f]=s.useState(null),q=s.useRef(!1),Z=s.useRef(null),Q=s.useRef(null),ce=s.useRef(A),F=s.useMemo(()=>new URLSearchParams(T.search),[T.search]),N=String(F.get("checkout")||"").trim().toLowerCase(),L=String(F.get("gate")||"").trim().toLowerCase(),oe=String(F.get("planId")||"").trim(),z=String(F.get("planVersionId")||"").trim(),le=_t(F.get("interval")),ue=Ct(F.get("pricingAudience")),Se=Ae(F.get("interval")),ee=String(F.get("session_id")||"").trim(),J=s.useMemo(()=>Be(I),[I]),de=s.useMemo(()=>Be($),[$]),xe=s.useMemo(()=>({environment:Ve(de||J),runtimeMode:o==="cloud"?"cloud":"local"}),[J,de,o]),me=s.useCallback(t=>{const c=String(t||"").trim();return J?`${J}${c.startsWith("/")?c:`/${c}`}`:c},[J]),w=s.useCallback(t=>x?x(t):me(t),[me,x]),ne=s.useCallback(()=>{const t=new URLSearchParams(T.search);t.delete("screen"),t.delete("gate"),t.delete("checkout"),t.delete("planId"),t.delete("planVersionId"),t.delete("interval"),t.delete("pricingAudience");const c=t.toString();j(`/${c?`?${c}`:""}${T.hash||""}`)},[T.hash,T.search,j]),pe=s.useMemo(()=>w("/api/taskforce/public/pricing"),[w]),B=s.useMemo(()=>Pe(M,L),[M,L]),i=s.useMemo(()=>B.allowReturnToApp,[B.allowReturnToApp]),U=s.useMemo(()=>{const t=String(B.message||"").trim();return!t||t===ht?null:t},[B.message]),D=s.useCallback(()=>{const t=new URLSearchParams(T.search);t.delete("checkout"),t.delete("session_id"),t.delete("gate"),t.delete("planId"),t.delete("planVersionId"),t.delete("interval");const c=t.toString();j(`${T.pathname}${c?`?${c}`:""}${T.hash||""}`,{replace:!0})},[T.hash,T.pathname,T.search,j]),v=s.useCallback(()=>{Q.current!=null&&window.clearTimeout(Q.current),Q.current=window.setTimeout(()=>{D(),Q.current=null},gt)},[D]);s.useEffect(()=>{ce.current=A},[A]);const u=s.useCallback(async t=>{const c=w(fe);if(!n)return se(null),be(c,{identityKey:a}),null;try{const y=await Ke(c,{identityKey:a,force:t?.force===!0});return se(y),G?.(y),y}catch{return null}},[a,w,n,G]),O=s.useCallback((t,c,y)=>{const g=String(c||"").trim();if(y?.preferFallback&&g)return g;const h=Pe(t,L).message;return h||g||"Unable to confirm checkout completion."},[L]),K=s.useCallback((t,c)=>!Pe(t,c).allowReturnToApp,[]),Y=s.useCallback(async(t,c,y="public",g)=>{if(!t){f({type:"error",message:"Selected plan is missing a default plan version."});return}X(!0),f(null);try{const h=await fetch(w("/api/taskforce/billing/checkout-session"),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({planVersionId:t,interval:c,pricingAudience:y})}),m=await h.json().catch(()=>({}));if(!h.ok){f({type:"error",message:String(m?.error||"Unable to start checkout for selected plan.")});return}const d=String(m?.checkoutState||"").trim().toLowerCase();if(d==="free"){f({type:"success",message:"Plan selected. Your access is ready."}),be(w(fe),{identityKey:a});const C=await u({force:!0}),R=String(C?.entitlementState||"").trim().toLowerCase();g?.autoContinueOnActivation===!0&&he(R)&&await A?.();return}if(d==="updated"){f({type:"success",message:String(m?.message||"Your subscription was updated successfully.")}),be(w(fe),{identityKey:a});const C=await u({force:!0}),R=String(C?.entitlementState||"").trim().toLowerCase();g?.autoContinueOnActivation===!0&&he(R)&&await A?.();return}if(d==="already_current_plan"){f({type:"success",message:String(m?.message||"You are already on this plan.")}),be(w(fe),{identityKey:a}),await u();return}const S=String(m?.returnBaseUrl||"").trim();if(o==="local"&&S)try{const C=window.location.origin,R=new URL(S,C).origin;if(R!==C){f({type:"error",message:`Checkout return is misconfigured for this runtime. Expected ${C} but got ${R}.`});return}}catch{f({type:"error",message:"Checkout return URL is invalid for this runtime."});return}const P=String(m?.url||"").trim();if(!P){f({type:"error",message:"Checkout did not return a redirect URL."});return}window.location.assign(P)}catch{f({type:"error",message:"Unable to start checkout for selected plan."})}finally{X(!1)}},[a,w,u,A,o]),ae=s.useCallback(async(t,c)=>{if(!t)return{confirmed:!1,errorMessage:"Checkout session is missing.",retryable:!1};const y=async()=>{be(w(fe),{identityKey:a});const g=await u({force:!0}),h=String(g?.entitlementState||"").trim().toLowerCase();if(!he(h))return!1;const m=oe,d=z,S=Se,P=String(g?.planId||"").trim(),C=String(g?.planVersionId||"").trim(),R=Ae(g?.billingInterval??null),we=c?.preConfirmationSummary??null,$e=String(we?.entitlementState||"").trim().toLowerCase(),Me=he($e),Ue=String(we?.planId||"").trim(),De=String(we?.planVersionId||"").trim(),Fe=Ae(we?.billingInterval??null);return m&&P&&P!==m||d&&C&&C!==d||S&&R&&R!==S||Me&&!(!!m&&P===m&&Ue!==P)&&!(!!d&&C===d&&De!==C)&&!(!!S&&R===S&&Fe!==R)?!1:(c?.autoContinueOnActivation===!0&&await ce.current?.(),!0)};try{const g=await fetch(w("/api/taskforce/billing/checkout-session/confirm"),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:t})}),h=await g.json().catch(()=>({}));if(!g.ok){const m=String(h?.code||"").trim(),d=yt(g.status,m);return d&&await y()?{confirmed:!0}:{confirmed:!1,errorMessage:String(h?.error||"Unable to confirm checkout completion."),retryable:d}}return await y()?{confirmed:!0}:{confirmed:!0}}catch{return{confirmed:!1,errorMessage:"Unable to confirm checkout completion.",retryable:!0}}},[a,w,u,Se,oe,z]),ie=s.useCallback(async()=>{if(!n){j(`/login?mode=login&next=${encodeURIComponent(je())}`);return}X(!0),f({type:"info",message:"Opening billing portal..."});try{const t=await fetch(w("/api/taskforce/billing/portal-session"),{method:"POST",credentials:"include"}),c=await t.json().catch(()=>({}));if(!t.ok){f({type:"error",message:String(c?.error||"Failed to open billing portal.")});return}const y=String(c?.url||"").trim();if(!y){f({type:"error",message:"Portal session did not return a redirect URL."});return}window.location.assign(y)}catch{f({type:"error",message:"Failed to open billing portal."})}finally{X(!1)}},[w,n,j]),k=s.useCallback(async()=>{if(!(!A||re||H)){_e(!0);try{await A()}finally{_e(!1)}}},[re,H,A]);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(()=>{N!=="success"&&(Z.current=null)},[N]),s.useEffect(()=>{let t=!1;const c=new Set,y=async g=>{g<=0||await new Promise(h=>{const m=window.setTimeout(()=>{c.delete(m),h()},g);c.add(m)})};if(N==="success"){if(q.current=!0,f({type:"success",message:"Checkout completed successfully. Finalizing your plan..."}),!n&&!p)return()=>{t=!0,c.forEach(m=>window.clearTimeout(m)),c.clear()};if(!n)return f({type:"error",message:"Sign in to finish activating your plan."}),()=>{t=!0,c.forEach(m=>window.clearTimeout(m)),c.clear()};const h=ee||"__missing_session__";return Z.current===h?()=>{t=!0,c.forEach(m=>window.clearTimeout(m)),c.clear()}:((async()=>{const m=Date.now(),d=await u({force:!0});if(t)return;let S=ee?{confirmed:!1,errorMessage:"Unable to confirm checkout completion.",retryable:!0}:{confirmed:!1,errorMessage:"Checkout session is missing.",retryable:!1},P=0;for(;;){const C=P<Ee.length?Ee[P]:ft;if(P+=1,await y(C),t||(S=ee?await ae(ee,{autoContinueOnActivation:K(d,L),preConfirmationSummary:d}):{confirmed:!1,errorMessage:"Checkout session is missing.",retryable:!1},t))return;if(S.confirmed){Z.current=h,f({type:"success",message:"Checkout completed successfully."}),v();return}if(!S.retryable||Date.now()-m>=bt)break}if(!t&&!S.confirmed){const C=await u({force:!0});if(t)return;S.retryable||(Z.current=h),f({type:"error",message:O(C,S.errorMessage,{preferFallback:!S.retryable})}),S.retryable||v();return}})(),()=>{t=!0,c.forEach(m=>window.clearTimeout(m)),c.clear()})}if(N==="cancel"){(async()=>{const g=await u({force:!0});f({type:"error",message:O(g,"Checkout was canceled. No charge was made.")}),v()})();return}if((N==="start"||N==="free")&&n&&z&&!q.current){q.current=!0,(async()=>{const g=await u({force:!0});await Y(z,le,ue,{autoContinueOnActivation:K(g,L)})})();return}},[p,N,ae,L,n,u,le,z,ue,ee,O,v,K,Y]),s.useEffect(()=>{if(!(N==="success"||N==="cancel"||N==="start"||N==="free")){if(U){f({type:B.statusTone,message:U});return}f(t=>!t||t.type!=="error"?t:t.message===B.message?null:t)}},[N,U,B.message,B.statusTone]);const Ne=s.useCallback(async t=>{if(!n){const y=t.pricingType==="free"?"free":"start",g=je({checkout:y,planId:t.planId,planVersionId:t.planVersionId,interval:t.interval,pricingAudience:t.pricingAudience});j(`/login?mode=register&planId=${encodeURIComponent(t.planId)}&planVersionId=${encodeURIComponent(t.planVersionId)}&interval=${encodeURIComponent(t.interval)}&pricingAudience=${encodeURIComponent(t.pricingAudience)}&next=${encodeURIComponent(g)}`);return}if(t.isCurrentPlan){if(!M?.stripeCustomerId){f({type:"success",message:"Your current plan does not use Stripe billing."});return}await ie();return}const c=K(M,L);if(t.pricingType==="free"){await Y(t.planVersionId,t.interval,t.pricingAudience,{autoContinueOnActivation:c});return}await Y(t.planVersionId,t.interval,t.pricingAudience,{autoContinueOnActivation:c})},[M,L,n,j,ie,K,Y]),ge=s.useCallback(()=>{if(i&&A){k();return}if(b){ne();return}if(window.history.length>1){j(-1);return}j("/")},[ne,b,k,i,j,A]),ke=b?null:e.jsxs(e.Fragment,{children:[e.jsx("button",{className:r.navAction,onClick:ge,disabled:H||re||n&&!i,children:i?"Take Me to Taskforce":"Back"}),n&&M?.stripeCustomerId&&e.jsx("button",{className:r.navAction,onClick:()=>{ie()},disabled:ye,children:"Manage billing"}),!n&&e.jsxs("button",{className:r.navAction,onClick:()=>j(`/login?mode=login&next=${encodeURIComponent(je())}`),children:[e.jsx(Ye,{size:16,style:{marginRight:"8px",verticalAlign:"text-bottom"}}),"Sign In"]})]}),te=b?null:e.jsx(He,{projectName:_,currentWorkspaceId:E,runtimeMode:o==="cloud"?"cloud":"local",theme:l,onBrandClick:ge,actions:ke});return e.jsx(pt,{chrome:te,heading:"Subscription Plans",subtitle:"Manage your subscription and explore available features. Your current plan is highlighted below.",variant:"site",theme:l,isAuthenticated:n,authSessionResolved:p,currentPlanId:String(M?.planId||oe||"").trim()||null,currentPlanVersionId:String(M?.planVersionId||z||"").trim()||null,currentEntitlementState:String(M?.entitlementState||"").trim()||null,markCurrentPlan:B.markCurrentPlan,canManageCurrentPlan:!!M?.stripeCustomerId,pricingEndpoint:pe,statusBanner:Ce,onBack:ge,backLabel:i?"Take Me to Taskforce":b?"Back to Board":"Back to App",backDisabled:H||re||n&&!i,topActions:null,shellOwnsScroll:W,showPageBackButton:!1,showHeaderBarWithChrome:!1,currentPlanCardActionMode:"manage",fallbackPricingSource:xe,onSelectPlan:Ne})}export{jt as PlansPage};
|
|
1
|
+
import{r as s,j as e}from"./vendor-react-CKJs5o3c.js";import{H as he,t as Oe,J as Ve,K as Pe,L as fe,N as be,O as Ke,Q as He}from"./index-CGDQY0nN.js";import{aL as qe,h as ze,U as Ye}from"./vendor-icons-CLnehDTw.js";import{u as We,a as Ge}from"./vendor-router-BbWMxlnO.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";const Qe="_plansWrapper_nb8ab_1",Je="_contentFrame_nb8ab_24",Xe="_shellOwnsScroll_nb8ab_32",Ze="_withChrome_nb8ab_38",en="_siteVariant_nb8ab_42",nn="_title_nb8ab_56",tn="_subtitle_nb8ab_70",rn="_header_nb8ab_77",an="_planCard_nb8ab_92",sn="_grid_nb8ab_105",cn="_pricingNotes_nb8ab_113",on="_planName_nb8ab_122",ln="_featureText_nb8ab_129",un="_currentBadge_nb8ab_133",dn="_navAction_nb8ab_137",mn="_backBtn_nb8ab_138",pn="_priceRows_nb8ab_149",gn="_foundingBeta_nb8ab_153",fn="_cloudCapacityNote_nb8ab_172",bn="_headerBar_nb8ab_239",hn="_headerActions_nb8ab_248",yn="_debugMeta_nb8ab_299",_n="_planNoticeCard_nb8ab_362",Cn="_planDescription_nb8ab_373",Sn="_teamComingSoonCard_nb8ab_378",wn="_clickablePlanCard_nb8ab_397",vn="_activePlanCard_nb8ab_412",xn="_callToAction_nb8ab_476",Nn="_primaryCta_nb8ab_488",kn="_secondaryCta_nb8ab_499",Pn="_currentCta_nb8ab_511",In="_featuresList_nb8ab_525",An="_priceRow_nb8ab_149",jn="_regularPriceLine_nb8ab_549",Tn="_campaignPriceLine_nb8ab_550",Ln="_priceRowWithCampaign_nb8ab_557",Rn="_priceRowAmount_nb8ab_561",En="_regularPriceDiscounted_nb8ab_567",Bn="_priceRowInterval_nb8ab_573",$n="_campaignPriceLabel_nb8ab_582",Mn="_campaignPriceAmount_nb8ab_587",Un="_campaignPriceInterval_nb8ab_593",Dn="_ctaRow_nb8ab_598",Fn="_featureItem_nb8ab_604",On="_featureIcon_nb8ab_610",Vn="_featureLimitAccent_nb8ab_624",Kn="_featureLimitUnit_nb8ab_635",Hn="_featureTextBlock_nb8ab_641",qn="_featureDescription_nb8ab_647",zn="_emptyState_nb8ab_653",Yn="_marketingEmptyState_nb8ab_662",Wn="_emptyBadge_nb8ab_690",Gn="_emptyHighlights_nb8ab_705",Qn="_loader_nb8ab_727",Jn="_spinner_nb8ab_737",Xn="_statusBanner_nb8ab_790",Zn="_successBanner_nb8ab_798",et="_infoBanner_nb8ab_804",nt="_errorBanner_nb8ab_810",r={plansWrapper:Qe,contentFrame:Je,shellOwnsScroll:Xe,withChrome:Ze,siteVariant:en,title:nn,subtitle:tn,header:rn,planCard:an,grid:sn,pricingNotes:cn,planName:on,featureText:ln,currentBadge:un,navAction:dn,backBtn:mn,priceRows:pn,foundingBeta:gn,cloudCapacityNote:fn,headerBar:bn,headerActions:hn,debugMeta:yn,planNoticeCard:_n,planDescription:Cn,teamComingSoonCard:Sn,clickablePlanCard:wn,activePlanCard:vn,callToAction:xn,primaryCta:Nn,secondaryCta:kn,currentCta:Pn,featuresList:In,priceRow:An,regularPriceLine:jn,campaignPriceLine:Tn,priceRowWithCampaign:Ln,priceRowAmount:Rn,regularPriceDiscounted:En,priceRowInterval:Bn,campaignPriceLabel:$n,campaignPriceAmount:Mn,campaignPriceInterval:Un,ctaRow:Dn,featureItem:Fn,featureIcon:On,featureLimitAccent:Vn,featureLimitUnit:Kn,featureTextBlock:Hn,featureDescription:qn,emptyState:zn,marketingEmptyState:Yn,emptyBadge:Wn,emptyHighlights:Gn,loader:Qn,spinner:Jn,statusBanner:Xn,successBanner:Zn,infoBanner:et,errorBanner:nt};function tt(){const n=globalThis.__DEBUG_MODE__;return typeof n=="boolean"?n:!1}function rt(n){const a=String(n?.environment||"").trim(),o=String(n?.runtimeMode||"").trim();return!a&&!o?null:a&&o?`${a} (${o})`:a||o||null}const at=new Set(["a","b","br","em","i","li","ol","p","strong","u","ul"]);function it(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function st(n){const a=String(n||"").trim();if(!a)return"";if(typeof document>"u")return it(a);const o=document.createElement("template");o.innerHTML=a;const p=document.createElement("div"),l=_=>{if(_.nodeType===Node.TEXT_NODE)return document.createTextNode(_.textContent||"");if(_.nodeType!==Node.ELEMENT_NODE)return null;const E=_,I=E.tagName.toLowerCase();if(I==="script"||I==="style")return null;const $=Array.from(E.childNodes).map(l).filter(b=>!!b);if(!at.has(I)){const b=document.createDocumentFragment();for(const W of $)b.appendChild(W);return b}const x=document.createElement(I);if(I==="a"){const b=String(E.getAttribute("href")||"").trim();/^(https?:|mailto:|\/|#)/i.test(b)&&(x.setAttribute("href",b),x.setAttribute("rel","noopener noreferrer"))}for(const b of $)x.appendChild(b);return x};for(const _ of Array.from(o.content.childNodes)){const E=l(_);E&&p.appendChild(E)}return p.innerHTML}function ct(n,a){if(n==null||!a)return"Contact Sales";try{return new Intl.NumberFormat("en-US",{style:"currency",currency:a.toUpperCase(),minimumFractionDigits:0}).format(n/100)}catch{return`${a.toUpperCase()} ${n/100}`}}function ot(){return"$0"}function V(n){return n?n.pricingType==="free"?!0:n.unitAmount!=null&&n.currency!=null:!1}function Te(n){return n?n.pricingType==="free"?ot():ct(n.unitAmount,n.currency):"Unavailable"}function Le(n,a){return V(a)?{price:a,pricingAudience:"campaign"}:{price:n,pricingAudience:"public"}}function lt(n,a,o,p){const l=V(n)||V(o),_=V(a)||V(p);if(!l&&!_)return null;const E=(I,$,x)=>{if(!V(I)&&!V($))return null;const b=V($),W=x==="year"?"year":"month";return e.jsxs("div",{className:`${r.priceRow} ${b?r.priceRowWithCampaign:""}`,children:[V(I)?e.jsxs("div",{className:r.regularPriceLine,children:[e.jsx("span",{className:`${r.priceRowAmount} ${b?r.regularPriceDiscounted:""}`,children:Te(I)}),e.jsxs("span",{className:r.priceRowInterval,children:["/ ",W]})]}):null,b?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]},x)};return e.jsxs("div",{className:r.priceRows,children:[E(n,o,"month"),E(a,p,"year")]})}function Re(n){const a=[n.pricing.month,n.pricing.year].filter(Boolean);if(a.some(p=>p.pricingType==="free"))return 0;const o=a.map(p=>p.pricingType==="stripe"&&typeof p.unitAmount=="number"?p.unitAmount:null).filter(p=>p!=null);return o.length>0?Math.min(...o):Number.POSITIVE_INFINITY}function ut(n){return String(n||"").replace(/[_\-.]+/g," ").replace(/\b\w/g,a=>a.toUpperCase())}function Ie(n,a){const o=n?.[a],p=Number(o);return Number.isFinite(p)?Math.max(1,Math.floor(p)):null}function ve(n,a){return a!==1?n:n.replace(/\b([A-Za-z]+)ies\b$/,"$1y").replace(/\b([A-Za-z]+[^s\s])s\b$/,"$1")}function dt(n){return n<=1e3?{value:String(n),unit:"MB"}:{value:String(Math.round(n/1e3)),unit:"GB"}}function mt(n,a){const o=String(n.publicLabel||n.label||"").trim()||ut(n.featureKey),p=n.config&&typeof n.config=="object"?n.config:{};if(n.featureKey==="context.uploads"){const l=Ie(p,"storageLimitMb");if(l!==null){const _=dt(l);return{limitValue:_.value,limitUnit:_.unit,baseLabel:ve(o,l)}}}if(n.featureKey==="workspace.workspaces"){const l=Ie(p,"maxWorkspaces");if(l!==null)return{limitValue:String(l),limitUnit:null,baseLabel:ve(o,l)}}if(n.featureKey==="collaboration.ai_profiles"){const l=Ie(p,"maxAiProfiles");if(l!==null)return{limitValue:String(l),limitUnit:null,baseLabel:ve(o,l)}}if(n.featureKey==="collaboration.team_management"){const l=Number(a);if(Number.isFinite(l)&&l>0){const _=Math.floor(l);return{limitValue:String(_),limitUnit:null,baseLabel:ve(o,_)}}}return{limitValue:null,limitUnit:null,baseLabel:o}}function pt({heading:n,subtitle:a,variant:o="app",theme:p="dark",chrome:l,footer:_,isAuthenticated:E,authSessionResolved:I=!0,currentPlanId:$,currentPlanVersionId:x,currentEntitlementState:b,markCurrentPlan:W,canManageCurrentPlan:G=!0,pricingEndpoint:A,statusBanner:H,onBack:j,backLabel:T,backDisabled:M=!1,topActions:se,shellOwnsScroll:ye=!1,showPageBackButton:X=!0,showHeaderBarWithChrome:re=!1,preferPricingPageTitle:_e=!0,currentPlanCardActionMode:Ce="manage",fallbackPricingSource:f=null,onSelectPlan:q}){const[Z,Q]=s.useState([]),[ce,F]=s.useState(null),[N,L]=s.useState({pageTitle:null,pageDescription:null}),[oe,z]=s.useState(!0),[le,ue]=s.useState(null),[Se,ee]=s.useState(0);s.useEffect(()=>{let i=!0;return(async()=>{const D=String(A||"/api/taskforce/public/pricing").trim()||"/api/taskforce/public/pricing";i&&(z(!0),ue(null));try{const v=await fetch(D,{method:"GET",credentials:"include"}),u=await v.json().catch(()=>({}));if(v.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 (${v.status})`))}catch(v){if(i){const u=v instanceof Error?v.message:"Failed to load pricing";ue(u||"Failed to load pricing"),F(null),L({pageTitle:null,pageDescription:null})}}finally{i&&z(!1)}})(),()=>{i=!1}},[A,Se]);const J=s.useMemo(()=>[...Z].sort((i,U)=>{const D=Re(i),v=Re(U);if(D!==v)return D-v;const u=i.defaultVersion?.versionNumber||0,O=U.defaultVersion?.versionNumber||0;return u!==O?u-O:String(i.displayName||i.planId).localeCompare(String(U.displayName||U.planId))}),[Z]),de=s.useMemo(()=>rt(ce||f),[f,ce]),xe=String((_e?N.pageTitle:null)||n).trim()||n,me=String(N.pageDescription||a||"").trim(),w=s.useMemo(()=>st(me),[me]),ne=I,pe=`${r.plansWrapper} ${ye?r.shellOwnsScroll:"tf-scrollbar"} ${o==="site"?r.siteVariant:""} ${l?r.withChrome:""}`.trim(),B=i=>ye?e.jsxs(e.Fragment,{children:[l,i,_]}):e.jsxs("div",{className:Oe.standaloneWrapper,"data-theme":p,children:[l,i,_]});return B(oe?e.jsx(e.Fragment,{children:e.jsx("div",{className:pe,children:e.jsx("div",{className:r.contentFrame,children:e.jsxs("div",{className:r.loader,children:[e.jsx(ze,{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:j,disabled:M,children:T}):null}),e.jsx("div",{className:r.headerActions,children:se})]}),e.jsx("h1",{className:r.title,children:xe}),w&&e.jsx("div",{className:r.subtitle,dangerouslySetInnerHTML:{__html:w}}),tt()&&de?e.jsxs("p",{className:r.debugMeta,children:["Pricing source: ",de]}):null,H&&e.jsx("div",{className:`${r.statusBanner} ${H.type==="success"?r.successBanner:H.type==="info"?r.infoBanner:r.errorBanner}`,children:H.message})]}),e.jsxs("section",{className:r.foundingBeta,"aria-labelledby":"founding-beta-heading",children:[e.jsx("h2",{id:"founding-beta-heading",children:"Founding beta"}),e.jsx("p",{children:"Taskforce is in founding beta. You may run into rough edges while we improve cloud workspaces and agent workflows. Early members get access while the product is still forming, plus a direct role in shaping what comes next."})]}),J.length===0?e.jsxs("div",{className:`${r.emptyState} ${r.marketingEmptyState}`,children:[e.jsx("span",{className:r.emptyBadge,children:"Coming Soon"}),e.jsx("h2",{children:"Paid plans are getting their final polish."}),e.jsx("p",{children:"Taskforce pricing is on the way with flexible options for solo operators, teams, and larger rollouts. Check back soon for launch tiers, feature bundles, and early access details."}),e.jsxs("div",{className:r.emptyHighlights,"aria-label":"Upcoming pricing highlights",children:[e.jsx("span",{children:"Launch-ready tiers"}),e.jsx("span",{children:"Team billing controls"}),e.jsx("span",{children:"Feature-based packaging"})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:r.grid,children:J.map(i=>{const U=i.pricing.month,D=i.pricing.year,v=i.campaignPricing?.month||null,u=i.campaignPricing?.year||null,O=Le(U,v),K=Le(D,u),Y=V(O.price),ae=V(K.price),ie=Y&&ae,k=String(i.defaultVersion?.planVersionId||"").trim(),Ne=he(b),ge=W??Ne,ke=!!(k&&x&&x===k)||!!(!x&&($&&$===i.planId)),te=ge&&ke&&b!=="canceled",t=Y?"month":ae?"year":null,c=t==="year"?K:O,y=Ce==="manage",g=Ce==="indicator",h=ne&&!!k&&(te?y&&G:!!t),m=()=>{if(k){if(te){if(!y||!G)return;q({planId:i.planId,planVersionId:k,interval:t||"month",pricingType:c.price?.pricingType||"stripe",pricingAudience:c.pricingAudience,isCurrentPlan:!0});return}t&&q({planId:i.planId,planVersionId:k,interval:t,pricingType:c.price?.pricingType||"stripe",pricingAudience:c.pricingAudience,isCurrentPlan:!1})}};return e.jsxs("div",{className:`${r.planCard} ${te?r.activePlanCard:""} ${h?r.clickablePlanCard:""}`,"data-testid":`plan-card-${i.planId}`,role:h?"button":void 0,tabIndex:h?0:void 0,onClick:h?m:void 0,onKeyDown:h?d=>{(d.key==="Enter"||d.key===" ")&&(d.preventDefault(),m())}:void 0,children:[te&&e.jsx("span",{className:r.currentBadge,children:"Current Plan"}),e.jsx("h3",{className:r.planName,children:i.displayName}),lt(U,D,v,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(qe,{className:r.featureIcon}),e.jsxs("div",{className:r.featureTextBlock,children:[(()=>{const{limitValue:P,limitUnit:C,baseLabel:R}=mt(d,i.defaultVersion?.seatLimit);return e.jsxs("span",{className:r.featureText,children:[P&&e.jsxs("span",{className:r.featureLimitAccent,children:[e.jsx("span",{children:P}),C?e.jsx("span",{className:r.featureLimitUnit,children:C}):null]}),e.jsx("span",{children:P?` ${R}`:R})]})})(),d.publicDescriptionVisible!==!1&&String(d.publicDescription||d.description||"").trim()&&e.jsx("span",{className:r.featureDescription,children:String(d.publicDescription||d.description||"").trim()})]})]},`${d.featureKey}-${S}`)):e.jsx("span",{className:r.featureText,children:"No additional features included"})}),te?y?e.jsx("button",{className:`${r.callToAction} ${r.currentCta}`,"data-testid":`plan-manage-${i.planId}`,onClick:d=>{d.stopPropagation(),G&&q({planId:i.planId,planVersionId:k,interval:t||"month",pricingType:c.price?.pricingType||"stripe",pricingAudience:c.pricingAudience,isCurrentPlan:!0})},disabled:!k||!G||!ne,children:E&&G?"Manage Plan":"Current Plan"}):g?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:k,interval:"month",pricingType:O.price?.pricingType||"stripe",pricingAudience:O.pricingAudience,isCurrentPlan:!1})},disabled:!k||!ne,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:k,interval:"year",pricingType:K.price?.pricingType||"stripe",pricingAudience:K.pricingAudience,isCurrentPlan:!1})},disabled:!k||!ne,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 gt=1600,Ee=[0,500,1e3,2e3],ft=5e3,bt=45e3,ht="Choose a plan to continue.";function yt(n,a){if(n===401)return!0;const o=String(a||"").trim().toUpperCase();return o==="CHECKOUT_SESSION_INCOMPLETE"||o==="CHECKOUT_PLAN_VERSION_UNRESOLVED"}function _t(n){return n==="year"?"year":"month"}function Ct(n){return n==="campaign"?"campaign":"public"}function Ae(n){const a=String(n||"").trim().toLowerCase();return a==="year"?"year":a==="month"?"month":null}function Be(n){const a=String(n||"").trim();return a?a.replace(/\/+$/,""):""}function je(n={}){const a=new URLSearchParams;a.set("screen","plans");for(const[o,p]of Object.entries(n)){const l=String(p||"").trim();l&&a.set(o,l)}return`/?${a.toString()}`}function jt({isAuthenticated:n,authUserId:a,runtimeMode:o,authSessionResolved:p,currentTheme:l="dark",projectName:_,currentWorkspaceId:E,apiBaseUrl:I,connectedEnvironmentSource:$,resolveCloudAuthUrl:x,embedded:b=!1,shellOwnsScroll:W=!1,onAccountProfileSummaryChange:G,onContinueToTaskforce:A,continueBusy:H=!1}){const j=We(),T=Ge(),[M,se]=s.useState(null),[ye,X]=s.useState(!1),[re,_e]=s.useState(!1),[Ce,f]=s.useState(null),q=s.useRef(!1),Z=s.useRef(null),Q=s.useRef(null),ce=s.useRef(A),F=s.useMemo(()=>new URLSearchParams(T.search),[T.search]),N=String(F.get("checkout")||"").trim().toLowerCase(),L=String(F.get("gate")||"").trim().toLowerCase(),oe=String(F.get("planId")||"").trim(),z=String(F.get("planVersionId")||"").trim(),le=_t(F.get("interval")),ue=Ct(F.get("pricingAudience")),Se=Ae(F.get("interval")),ee=String(F.get("session_id")||"").trim(),J=s.useMemo(()=>Be(I),[I]),de=s.useMemo(()=>Be($),[$]),xe=s.useMemo(()=>({environment:Ve(de||J),runtimeMode:o==="cloud"?"cloud":"local"}),[J,de,o]),me=s.useCallback(t=>{const c=String(t||"").trim();return J?`${J}${c.startsWith("/")?c:`/${c}`}`:c},[J]),w=s.useCallback(t=>x?x(t):me(t),[me,x]),ne=s.useCallback(()=>{const t=new URLSearchParams(T.search);t.delete("screen"),t.delete("gate"),t.delete("checkout"),t.delete("planId"),t.delete("planVersionId"),t.delete("interval"),t.delete("pricingAudience");const c=t.toString();j(`/${c?`?${c}`:""}${T.hash||""}`)},[T.hash,T.search,j]),pe=s.useMemo(()=>w("/api/taskforce/public/pricing"),[w]),B=s.useMemo(()=>Pe(M,L),[M,L]),i=s.useMemo(()=>B.allowReturnToApp,[B.allowReturnToApp]),U=s.useMemo(()=>{const t=String(B.message||"").trim();return!t||t===ht?null:t},[B.message]),D=s.useCallback(()=>{const t=new URLSearchParams(T.search);t.delete("checkout"),t.delete("session_id"),t.delete("gate"),t.delete("planId"),t.delete("planVersionId"),t.delete("interval");const c=t.toString();j(`${T.pathname}${c?`?${c}`:""}${T.hash||""}`,{replace:!0})},[T.hash,T.pathname,T.search,j]),v=s.useCallback(()=>{Q.current!=null&&window.clearTimeout(Q.current),Q.current=window.setTimeout(()=>{D(),Q.current=null},gt)},[D]);s.useEffect(()=>{ce.current=A},[A]);const u=s.useCallback(async t=>{const c=w(fe);if(!n)return se(null),be(c,{identityKey:a}),null;try{const y=await Ke(c,{identityKey:a,force:t?.force===!0});return se(y),G?.(y),y}catch{return null}},[a,w,n,G]),O=s.useCallback((t,c,y)=>{const g=String(c||"").trim();if(y?.preferFallback&&g)return g;const h=Pe(t,L).message;return h||g||"Unable to confirm checkout completion."},[L]),K=s.useCallback((t,c)=>!Pe(t,c).allowReturnToApp,[]),Y=s.useCallback(async(t,c,y="public",g)=>{if(!t){f({type:"error",message:"Selected plan is missing a default plan version."});return}X(!0),f(null);try{const h=await fetch(w("/api/taskforce/billing/checkout-session"),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({planVersionId:t,interval:c,pricingAudience:y})}),m=await h.json().catch(()=>({}));if(!h.ok){f({type:"error",message:String(m?.error||"Unable to start checkout for selected plan.")});return}const d=String(m?.checkoutState||"").trim().toLowerCase();if(d==="free"){f({type:"success",message:"Plan selected. Your access is ready."}),be(w(fe),{identityKey:a});const C=await u({force:!0}),R=String(C?.entitlementState||"").trim().toLowerCase();g?.autoContinueOnActivation===!0&&he(R)&&await A?.();return}if(d==="updated"){f({type:"success",message:String(m?.message||"Your subscription was updated successfully.")}),be(w(fe),{identityKey:a});const C=await u({force:!0}),R=String(C?.entitlementState||"").trim().toLowerCase();g?.autoContinueOnActivation===!0&&he(R)&&await A?.();return}if(d==="already_current_plan"){f({type:"success",message:String(m?.message||"You are already on this plan.")}),be(w(fe),{identityKey:a}),await u();return}const S=String(m?.returnBaseUrl||"").trim();if(o==="local"&&S)try{const C=window.location.origin,R=new URL(S,C).origin;if(R!==C){f({type:"error",message:`Checkout return is misconfigured for this runtime. Expected ${C} but got ${R}.`});return}}catch{f({type:"error",message:"Checkout return URL is invalid for this runtime."});return}const P=String(m?.url||"").trim();if(!P){f({type:"error",message:"Checkout did not return a redirect URL."});return}window.location.assign(P)}catch{f({type:"error",message:"Unable to start checkout for selected plan."})}finally{X(!1)}},[a,w,u,A,o]),ae=s.useCallback(async(t,c)=>{if(!t)return{confirmed:!1,errorMessage:"Checkout session is missing.",retryable:!1};const y=async()=>{be(w(fe),{identityKey:a});const g=await u({force:!0}),h=String(g?.entitlementState||"").trim().toLowerCase();if(!he(h))return!1;const m=oe,d=z,S=Se,P=String(g?.planId||"").trim(),C=String(g?.planVersionId||"").trim(),R=Ae(g?.billingInterval??null),we=c?.preConfirmationSummary??null,$e=String(we?.entitlementState||"").trim().toLowerCase(),Me=he($e),Ue=String(we?.planId||"").trim(),De=String(we?.planVersionId||"").trim(),Fe=Ae(we?.billingInterval??null);return m&&P&&P!==m||d&&C&&C!==d||S&&R&&R!==S||Me&&!(!!m&&P===m&&Ue!==P)&&!(!!d&&C===d&&De!==C)&&!(!!S&&R===S&&Fe!==R)?!1:(c?.autoContinueOnActivation===!0&&await ce.current?.(),!0)};try{const g=await fetch(w("/api/taskforce/billing/checkout-session/confirm"),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:t})}),h=await g.json().catch(()=>({}));if(!g.ok){const m=String(h?.code||"").trim(),d=yt(g.status,m);return d&&await y()?{confirmed:!0}:{confirmed:!1,errorMessage:String(h?.error||"Unable to confirm checkout completion."),retryable:d}}return await y()?{confirmed:!0}:{confirmed:!0}}catch{return{confirmed:!1,errorMessage:"Unable to confirm checkout completion.",retryable:!0}}},[a,w,u,Se,oe,z]),ie=s.useCallback(async()=>{if(!n){j(`/login?mode=login&next=${encodeURIComponent(je())}`);return}X(!0),f({type:"info",message:"Opening billing portal..."});try{const t=await fetch(w("/api/taskforce/billing/portal-session"),{method:"POST",credentials:"include"}),c=await t.json().catch(()=>({}));if(!t.ok){f({type:"error",message:String(c?.error||"Failed to open billing portal.")});return}const y=String(c?.url||"").trim();if(!y){f({type:"error",message:"Portal session did not return a redirect URL."});return}window.location.assign(y)}catch{f({type:"error",message:"Failed to open billing portal."})}finally{X(!1)}},[w,n,j]),k=s.useCallback(async()=>{if(!(!A||re||H)){_e(!0);try{await A()}finally{_e(!1)}}},[re,H,A]);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(()=>{N!=="success"&&(Z.current=null)},[N]),s.useEffect(()=>{let t=!1;const c=new Set,y=async g=>{g<=0||await new Promise(h=>{const m=window.setTimeout(()=>{c.delete(m),h()},g);c.add(m)})};if(N==="success"){if(q.current=!0,f({type:"success",message:"Checkout completed successfully. Finalizing your plan..."}),!n&&!p)return()=>{t=!0,c.forEach(m=>window.clearTimeout(m)),c.clear()};if(!n)return f({type:"error",message:"Sign in to finish activating your plan."}),()=>{t=!0,c.forEach(m=>window.clearTimeout(m)),c.clear()};const h=ee||"__missing_session__";return Z.current===h?()=>{t=!0,c.forEach(m=>window.clearTimeout(m)),c.clear()}:((async()=>{const m=Date.now(),d=await u({force:!0});if(t)return;let S=ee?{confirmed:!1,errorMessage:"Unable to confirm checkout completion.",retryable:!0}:{confirmed:!1,errorMessage:"Checkout session is missing.",retryable:!1},P=0;for(;;){const C=P<Ee.length?Ee[P]:ft;if(P+=1,await y(C),t||(S=ee?await ae(ee,{autoContinueOnActivation:K(d,L),preConfirmationSummary:d}):{confirmed:!1,errorMessage:"Checkout session is missing.",retryable:!1},t))return;if(S.confirmed){Z.current=h,f({type:"success",message:"Checkout completed successfully."}),v();return}if(!S.retryable||Date.now()-m>=bt)break}if(!t&&!S.confirmed){const C=await u({force:!0});if(t)return;S.retryable||(Z.current=h),f({type:"error",message:O(C,S.errorMessage,{preferFallback:!S.retryable})}),S.retryable||v();return}})(),()=>{t=!0,c.forEach(m=>window.clearTimeout(m)),c.clear()})}if(N==="cancel"){(async()=>{const g=await u({force:!0});f({type:"error",message:O(g,"Checkout was canceled. No charge was made.")}),v()})();return}if((N==="start"||N==="free")&&n&&z&&!q.current){q.current=!0,(async()=>{const g=await u({force:!0});await Y(z,le,ue,{autoContinueOnActivation:K(g,L)})})();return}},[p,N,ae,L,n,u,le,z,ue,ee,O,v,K,Y]),s.useEffect(()=>{if(!(N==="success"||N==="cancel"||N==="start"||N==="free")){if(U){f({type:B.statusTone,message:U});return}f(t=>!t||t.type!=="error"?t:t.message===B.message?null:t)}},[N,U,B.message,B.statusTone]);const Ne=s.useCallback(async t=>{if(!n){const y=t.pricingType==="free"?"free":"start",g=je({checkout:y,planId:t.planId,planVersionId:t.planVersionId,interval:t.interval,pricingAudience:t.pricingAudience});j(`/login?mode=register&planId=${encodeURIComponent(t.planId)}&planVersionId=${encodeURIComponent(t.planVersionId)}&interval=${encodeURIComponent(t.interval)}&pricingAudience=${encodeURIComponent(t.pricingAudience)}&next=${encodeURIComponent(g)}`);return}if(t.isCurrentPlan){if(!M?.stripeCustomerId){f({type:"success",message:"Your current plan does not use Stripe billing."});return}await ie();return}const c=K(M,L);if(t.pricingType==="free"){await Y(t.planVersionId,t.interval,t.pricingAudience,{autoContinueOnActivation:c});return}await Y(t.planVersionId,t.interval,t.pricingAudience,{autoContinueOnActivation:c})},[M,L,n,j,ie,K,Y]),ge=s.useCallback(()=>{if(i&&A){k();return}if(b){ne();return}if(window.history.length>1){j(-1);return}j("/")},[ne,b,k,i,j,A]),ke=b?null:e.jsxs(e.Fragment,{children:[e.jsx("button",{className:r.navAction,onClick:ge,disabled:H||re||n&&!i,children:i?"Take Me to Taskforce":"Back"}),n&&M?.stripeCustomerId&&e.jsx("button",{className:r.navAction,onClick:()=>{ie()},disabled:ye,children:"Manage billing"}),!n&&e.jsxs("button",{className:r.navAction,onClick:()=>j(`/login?mode=login&next=${encodeURIComponent(je())}`),children:[e.jsx(Ye,{size:16,style:{marginRight:"8px",verticalAlign:"text-bottom"}}),"Sign In"]})]}),te=b?null:e.jsx(He,{projectName:_,currentWorkspaceId:E,runtimeMode:o==="cloud"?"cloud":"local",theme:l,onBrandClick:ge,actions:ke});return e.jsx(pt,{chrome:te,heading:"Subscription Plans",subtitle:"Manage your subscription and explore available features. Your current plan is highlighted below.",variant:"site",theme:l,isAuthenticated:n,authSessionResolved:p,currentPlanId:String(M?.planId||oe||"").trim()||null,currentPlanVersionId:String(M?.planVersionId||z||"").trim()||null,currentEntitlementState:String(M?.entitlementState||"").trim()||null,markCurrentPlan:B.markCurrentPlan,canManageCurrentPlan:!!M?.stripeCustomerId,pricingEndpoint:pe,statusBanner:Ce,onBack:ge,backLabel:i?"Take Me to Taskforce":b?"Back to Board":"Back to App",backDisabled:H||re||n&&!i,topActions:null,shellOwnsScroll:W,showPageBackButton:!1,showHeaderBarWithChrome:!1,currentPlanCardActionMode:"manage",fallbackPricingSource:xe,onSelectPlan:Ne})}export{jt as PlansPage};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as s}from"./vendor-react-CKJs5o3c.js";import{ContextAttachmentManager as c}from"./ContextAttachmentManager-
|
|
1
|
+
import{j as s}from"./vendor-react-CKJs5o3c.js";import{ContextAttachmentManager as c}from"./ContextAttachmentManager-AmEny3eI.js";import"./index-CGDQY0nN.js";import"./vendor-icons-CLnehDTw.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";import"./documentReferences-Ca2P--i5.js";function R(t){const{taskId:e,taskReferenceLabel:o,workspaceId:n,apiBaseUrl:a,contextFiles:r,onAddContextFile:m,onRemoveContextFile:p,onUpdateContextCaption:i}=t;return s.jsx(c,{ownerType:"task",ownerId:e,ownerReferenceLabel:o,workspaceId:n,apiBaseUrl:a,attachments:r,onAddAttachment:m,onRemoveAttachment:p,onUpdateAttachmentCaption:i})}export{R as TaskContextUpload};
|