@taskforcehq/taskforce 0.3.306 → 0.3.307

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/README.md +0 -2
  2. package/dist/Taskforce.module.css +317 -27
  3. package/dist/TaskforceCore.js +1 -0
  4. package/dist/TaskforceCore.test.js +178 -0
  5. package/dist/components/activity/EntityActivityTimeline.d.ts +34 -0
  6. package/dist/components/activity/EntityActivityTimeline.js +81 -0
  7. package/dist/components/context/ContextAttachmentManager.js +15 -3
  8. package/dist/components/features/AgentsModule.d.ts +5 -1
  9. package/dist/components/features/AgentsModule.js +142 -39
  10. package/dist/components/features/AgentsModule.test.js +260 -11
  11. package/dist/components/features/AnnotatedAttachmentWorkspace.d.ts +3 -1
  12. package/dist/components/features/AnnotatedAttachmentWorkspace.js +118 -4
  13. package/dist/components/features/AnnotatedAttachmentWorkspace.test.js +52 -0
  14. package/dist/components/features/DocumentIndex.d.ts +2 -2
  15. package/dist/components/features/DocumentIndex.js +3 -4
  16. package/dist/components/features/DocumentViewer.d.ts +3 -1
  17. package/dist/components/features/DocumentViewer.js +6 -5
  18. package/dist/components/features/DocumentWorkspace.d.ts +10 -2
  19. package/dist/components/features/DocumentWorkspace.js +15 -4
  20. package/dist/components/features/DocumentWorkspace.test.js +20 -3
  21. package/dist/components/features/TaskSettings.d.ts +2 -0
  22. package/dist/components/features/TaskSettings.js +83 -78
  23. package/dist/components/features/TaskSettings.test.js +171 -82
  24. package/dist/components/task/TaskActionHeader.js +11 -5
  25. package/dist/components/task/TaskActionHeader.test.js +10 -0
  26. package/dist/components/task/TaskCard.js +6 -2
  27. package/dist/components/task/TaskContextUpload.test.js +3 -3
  28. package/dist/components/task/TaskForm.js +14 -64
  29. package/dist/components/task/TaskKanban.js +0 -8
  30. package/dist/components/task/TaskList.js +5 -1
  31. package/dist/components/task/TaskList.test.js +4 -0
  32. package/dist/components/ui/HierarchyActionBadge.d.ts +10 -0
  33. package/dist/components/ui/HierarchyActionBadge.js +5 -0
  34. package/dist/components/views/AppShellHeader.d.ts +3 -1
  35. package/dist/components/views/AppShellHeader.js +27 -11
  36. package/dist/components/views/AppShellHeader.test.js +18 -1
  37. package/dist/components/views/PlanComparisonPage.js +9 -1
  38. package/dist/components/views/PlanComparisonPage.test.js +19 -0
  39. package/dist/components/views/PlansPage.js +1 -1
  40. package/dist/components/views/StandaloneLayout.js +256 -69
  41. package/dist/components/views/WidgetView.js +10 -8
  42. package/dist/components/views/panels/PlanningDrawer.d.ts +19 -6
  43. package/dist/components/views/panels/PlanningDrawer.js +259 -51
  44. package/dist/components/views/panels/PlanningDrawer.test.js +392 -4
  45. package/dist/config/envSchema.js +1 -0
  46. package/dist/core/AiProfileService.d.ts +7 -0
  47. package/dist/core/AiProfileService.js +460 -35
  48. package/dist/core/AiProfiles.test.js +648 -2
  49. package/dist/core/AttachmentLinkService.d.ts +3 -0
  50. package/dist/core/AttachmentLinkService.js +58 -13
  51. package/dist/core/GlobalSettingsService.js +12 -0
  52. package/dist/core/McpTokenService.d.ts +12 -0
  53. package/dist/core/McpTokenService.js +44 -1
  54. package/dist/core/PlanningEntities.test.js +366 -4
  55. package/dist/core/TaskActivityService.d.ts +28 -1
  56. package/dist/core/TaskActivityService.js +227 -46
  57. package/dist/core/TaskActivitySync.test.d.ts +1 -0
  58. package/dist/core/TaskActivitySync.test.js +90 -0
  59. package/dist/core/TaskAuditTimeline.test.js +96 -0
  60. package/dist/core/Taskforce.d.ts +190 -26
  61. package/dist/core/Taskforce.ids.test.js +58 -0
  62. package/dist/core/Taskforce.js +775 -71
  63. package/dist/core/Taskforce.mcpAuth.test.js +109 -0
  64. package/dist/core/types.d.ts +7 -0
  65. package/dist/hooks/auth/useTaskforceAuthBootstrap.js +2 -1
  66. package/dist/hooks/bootstrapTimeouts.d.ts +4 -0
  67. package/dist/hooks/bootstrapTimeouts.js +8 -0
  68. package/dist/hooks/bootstrapTimeouts.test.d.ts +1 -0
  69. package/dist/hooks/bootstrapTimeouts.test.js +12 -0
  70. package/dist/hooks/sync/orchestratorShared.d.ts +3 -3
  71. package/dist/hooks/sync/orchestratorShared.js +61 -1
  72. package/dist/hooks/sync/recovery.js +8 -0
  73. package/dist/hooks/sync/recovery.test.js +5 -5
  74. package/dist/hooks/sync/transfers.d.ts +2 -1
  75. package/dist/hooks/sync/transfers.js +36 -9
  76. package/dist/hooks/sync/transfers.test.js +534 -2
  77. package/dist/hooks/useFilterSort.js +13 -13
  78. package/dist/hooks/useFilterSort.test.js +87 -1
  79. package/dist/hooks/useSyncOrchestrator.js +50 -5
  80. package/dist/hooks/useTaskforce.d.ts +85 -50
  81. package/dist/hooks/useTaskforce.js +44 -14
  82. package/dist/hooks/useTaskforce.runtime-routing.test.js +94 -0
  83. package/dist/hooks/useTaskforce.sync-behavior.test.js +99 -0
  84. package/dist/hooks/useWorkspaceSyncController.js +7 -1
  85. package/dist/hooks/useWorkspaceSyncController.test.js +48 -0
  86. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +14 -7
  87. package/dist/mcp/canonicalAssetHelpers.d.ts +16 -4
  88. package/dist/mcp/canonicalAssetHelpers.js +18 -10
  89. package/dist/mcp/canonicalAssetHelpers.test.d.ts +1 -0
  90. package/dist/mcp/canonicalAssetHelpers.test.js +67 -0
  91. package/dist/mcp/clientIntegrations.d.ts +1 -0
  92. package/dist/mcp/clientIntegrations.js +25 -0
  93. package/dist/mcp/clientIntegrations.test.js +14 -3
  94. package/dist/mcp/clientProfileDefaults.js +3 -3
  95. package/dist/mcp/collaborationRegistrar.js +7 -7
  96. package/dist/mcp/documentAssetRegistrar.js +113 -7
  97. package/dist/mcp/runtime.d.ts +1 -0
  98. package/dist/mcp/runtime.js +969 -122
  99. package/dist/mcp/runtime.test.js +1083 -11
  100. package/dist/mcp/taskAttachmentTypes.d.ts +1 -1
  101. package/dist/mcp/taskPlanningRegistrar.js +48 -0
  102. package/dist/mcp/toolRegistry.d.ts +56 -0
  103. package/dist/mcp/toolRegistry.js +8 -0
  104. package/dist/mcp/toolRegistry.test.js +4 -0
  105. package/dist/migrations/taskSchemaMigrations.js +21 -0
  106. package/dist/server/aiProfileAvatarAssets.d.ts +49 -0
  107. package/dist/server/aiProfileAvatarAssets.js +319 -0
  108. package/dist/server/aiProfileAvatarAssets.test.d.ts +1 -0
  109. package/dist/server/aiProfileAvatarAssets.test.js +213 -0
  110. package/dist/server/annotatedAttachmentsRoutes.test.js +66 -7
  111. package/dist/server/index.js +4 -0
  112. package/dist/server/index.test.js +6 -1
  113. package/dist/server/routes/admin.js +187 -9
  114. package/dist/server/routes/annotatedAttachments.js +51 -0
  115. package/dist/server/routes/auth.d.ts +11 -0
  116. package/dist/server/routes/auth.js +189 -27
  117. package/dist/server/routes/authSupport.d.ts +4 -0
  118. package/dist/server/routes/authSupport.js +12 -1
  119. package/dist/server/routes/billing.js +11 -0
  120. package/dist/server/routes/billing.test.js +3 -0
  121. package/dist/server/routes/documents.js +10 -0
  122. package/dist/server/routes/shared.js +0 -10
  123. package/dist/server/routes/sync.integration.test.js +221 -0
  124. package/dist/server/routes/sync.js +13 -3
  125. package/dist/server/routes/syncSnapshotRoutes.js +2 -0
  126. package/dist/server/routes/tasks.js +12 -9
  127. package/dist/server/routes.js +87 -8
  128. package/dist/server/routes.test.js +890 -22
  129. package/dist/shared/aiProfileSurfaceType.d.ts +1 -1
  130. package/dist/shared/aiProfileSurfaceType.js +10 -8
  131. package/dist/storage/objectStorage.d.ts +1 -0
  132. package/dist/storage/objectStorage.js +2 -1
  133. package/dist/storage/objectStorageClient.d.ts +1 -0
  134. package/dist/storage/objectStorageClient.js +41 -8
  135. package/dist/storage/objectStorageClient.test.js +26 -1
  136. package/dist/storage/objectStorageConfig.js +3 -1
  137. package/dist/storage/objectStorageConfig.test.js +13 -1
  138. package/dist/sync/collaborationSyncPayload.js +2 -0
  139. package/dist/sync/collaborationSyncPayload.test.js +1 -0
  140. package/dist/sync/collaborationSyncState.d.ts +3 -3
  141. package/dist/sync/collaborationSyncState.js +19 -12
  142. package/dist/sync/contentSyncPayload.d.ts +5 -1
  143. package/dist/sync/contentSyncPayload.js +9 -0
  144. package/dist/sync/contentSyncPayload.test.js +39 -0
  145. package/dist/sync/contentSyncState.d.ts +5 -1
  146. package/dist/sync/contentSyncState.js +231 -37
  147. package/dist/sync/planningSyncPayload.js +5 -0
  148. package/dist/sync/planningSyncPayload.test.js +24 -0
  149. package/dist/sync/syncApplyHandlers.d.ts +4 -4
  150. package/dist/sync/syncApplyHandlers.js +89 -31
  151. package/dist/sync/syncApplyHandlers.test.js +184 -4
  152. package/dist/sync/syncResourceAdapters.d.ts +2 -0
  153. package/dist/sync/syncResourceAdapters.js +2 -0
  154. package/dist/sync/syncService.d.ts +1 -0
  155. package/dist/sync/syncService.js +13 -1
  156. package/dist/sync/syncService.test.js +39 -0
  157. package/dist/sync/workspacePullFeed.d.ts +4 -0
  158. package/dist/sync/workspacePullFeed.js +129 -70
  159. package/dist/sync/workspacePullFeed.test.js +49 -0
  160. package/dist/sync/workspaceSyncModel.d.ts +28 -6
  161. package/dist/sync/workspaceSyncModel.js +159 -45
  162. package/dist/sync/workspaceSyncModel.test.js +269 -3
  163. package/dist/types.d.ts +33 -2
  164. package/dist/ui/assets/AgentsModule-2y82_3DO.js +1 -0
  165. package/dist/ui/assets/AnnotatedAttachmentWorkspace-BTLZZCiQ.js +3 -0
  166. package/dist/ui/assets/AnnotatedAttachmentWorkspace-BVKew-mH.css +1 -0
  167. package/dist/ui/assets/ContextAttachmentManager-D2epuNnG.js +3 -0
  168. package/dist/ui/assets/DocumentWorkspace-D4rJKXzd.css +1 -0
  169. package/dist/ui/assets/DocumentWorkspace-sVa-3Do6.js +252 -0
  170. package/dist/ui/assets/EntityActivityTimeline-DyqvvhuF.css +1 -0
  171. package/dist/ui/assets/EntityActivityTimeline-Zods27y_.js +1 -0
  172. package/dist/ui/assets/{InitiativesModule-9E6ParrY.js → InitiativesModule-D4XseTwW.js} +1 -1
  173. package/dist/ui/assets/PlansPage-D5AcbO0L.js +1 -0
  174. package/dist/ui/assets/PlansPage-Dvqsz5zc.css +1 -0
  175. package/dist/ui/assets/TaskContextUpload-uC5qx4Bv.js +1 -0
  176. package/dist/ui/assets/TaskSettings-CqvPAsTv.js +9 -0
  177. package/dist/ui/assets/{WorkflowsModule-BA7jcEpH.js → WorkflowsModule-oOA9bcdK.js} +4 -4
  178. package/dist/ui/assets/documentReferences-DPZuTgHh.js +1 -0
  179. package/dist/ui/assets/index-607WPo_X.js +4 -0
  180. package/dist/ui/assets/index-CYyodXsg.css +1 -0
  181. package/dist/ui/assets/{vendor-icons-DuEd_65c.js → vendor-icons-B32hGuF2.js} +1 -1
  182. package/dist/ui/index.html +3 -3
  183. package/dist/ui/product/agent manager.png +0 -0
  184. package/dist/ui/product/agent_manager_02.png +0 -0
  185. package/dist/utils/aiProfileEvents.d.ts +7 -0
  186. package/dist/utils/aiProfileEvents.js +6 -0
  187. package/dist/utils/assignees.d.ts +6 -0
  188. package/dist/utils/assignees.js +8 -1
  189. package/dist/utils/assignees.test.d.ts +1 -0
  190. package/dist/utils/assignees.test.js +25 -0
  191. package/dist/utils/avatarDisplay.d.ts +1 -0
  192. package/dist/utils/avatarDisplay.js +15 -0
  193. package/dist/utils/contextFiles.d.ts +3 -1
  194. package/dist/utils/contextFiles.js +2 -1
  195. package/dist/utils/taskActivity.d.ts +7 -1
  196. package/dist/utils/taskActivity.js +63 -1
  197. package/dist/utils/taskActivity.test.js +23 -1
  198. package/dist/utils/taskSearch.d.ts +22 -0
  199. package/dist/utils/taskSearch.js +87 -0
  200. package/dist/utils/taskSearch.test.d.ts +1 -0
  201. package/dist/utils/taskSearch.test.js +69 -0
  202. package/dist/utils/taskUtils.js +10 -3
  203. package/dist/utils/taskUtils.test.d.ts +1 -0
  204. package/dist/utils/taskUtils.test.js +19 -0
  205. package/package.json +1 -1
  206. package/dist/ui/assets/AgentsModule-DrLawwNl.js +0 -1
  207. package/dist/ui/assets/AnnotatedAttachmentWorkspace-BaS2VwIr.css +0 -1
  208. package/dist/ui/assets/AnnotatedAttachmentWorkspace-Z9_whf7F.js +0 -3
  209. package/dist/ui/assets/DocumentWorkspace-B03MaSkw.js +0 -252
  210. package/dist/ui/assets/DocumentWorkspace-Dhdso07p.css +0 -1
  211. package/dist/ui/assets/PlansPage-CvfnMiWq.css +0 -1
  212. package/dist/ui/assets/PlansPage-DRXscYxH.js +0 -1
  213. package/dist/ui/assets/TaskSettings-DZX4jk7e.js +0 -9
  214. package/dist/ui/assets/index-9eT8e0Lu.css +0 -1
  215. package/dist/ui/assets/index-C6k75jr8.js +0 -6
@@ -0,0 +1,252 @@
1
+ import{j as e,r as i,s as an,R as ve}from"./vendor-react-CKJs5o3c.js";import{h as $e,f as P,t as L,i as yt,j as gt,k as sn,R as rn,m as M,M as on,n as xt,o as cn,q as ln}from"./index-607WPo_X.js";import{q as dn,w as un,v as mn,au as hn,av as pn,x as qe,i as fn,Z as Qe,X as Rt,aw as _t,e as Ye,ax as At,ay as vn,az as wn,a as kn,j as yn,aA as gn,aB as xn,aC as _n,t as Ee,aD as bn,r as Sn,p as jn,aE as bt,at as Ve,aF as Cn,aG as Nn,T as Tn,R as En,aH as Rn,B as An,U as In,S as $n}from"./vendor-icons-B32hGuF2.js";import{g as Ln}from"./documentReferences-DPZuTgHh.js";import{s as Dn,M as Re,r as Ae}from"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";const Bn="_index_1sp0v_1",Mn="_header_1sp0v_8",Pn="_title_1sp0v_23",zn="_search_1sp0v_35",Fn="_searchIcon_1sp0v_41",On="_searchInput_1sp0v_50",Hn="_list_1sp0v_67",Wn="_state_1sp0v_79",Gn="_stateError_1sp0v_87",Kn="_item_1sp0v_94",Un="_itemActive_1sp0v_116",Jn="_itemIcon_1sp0v_126",Vn="_itemBody_1sp0v_136",qn="_itemTitle_1sp0v_144",Qn="_itemTask_1sp0v_156",Yn="_itemBadge_1sp0v_167",Xn="_itemMeta_1sp0v_180",Zn="_itemMetaDetails_1sp0v_191",ea="_itemMetaReference_1sp0v_198",A={index:Bn,header:Mn,title:Pn,search:zn,searchIcon:Fn,searchInput:On,list:Hn,state:Wn,stateError:Gn,item:Kn,itemActive:Un,itemIcon:Jn,itemBody:Vn,itemTitle:qn,itemTask:Qn,itemBadge:Yn,itemMeta:Xn,itemMetaDetails:Zn,itemMetaReference:ea};function Xe(t){let l=t;try{l=decodeURIComponent(t)}catch{l=t}return l.trim().replace(/\\/g,"/").replace(/^\/+/,"").replace(/^\.\//,"").replace(/^\.taskforce\//,"")}function ta(t,l){return!!(t===l||t.endsWith(`/${l}`)||l.endsWith(`/${t}`))}function St(t){const l=Xe(String(t||""));if(!l)return null;const m=l.match(/(^|\/)(asset-[a-f0-9]{32})(?=[^/]*$)/i);return m?.[2]?m[2].toLowerCase():null}function et(t){return t.attachmentState==="attached"||t.attachmentState==="unattached"?t.attachmentState:(typeof t.attachmentCount=="number"&&Number.isFinite(t.attachmentCount)?t.attachmentCount:0)>0||t.taskId?"attached":"unattached"}function na(t,l,m,s){const c=l.trim().toLowerCase();return t.filter(u=>{const y=`${$e(u)} ${u.originalFilename||""}`.toLowerCase(),v=c.length===0||y.includes(c),b=m.length===0||m.includes(u.docType),h=et(u),g=s.length===0||s.includes(h);return v&&b&&g})}function aa({docType:t}){switch(t){case"implementation-plan":return e.jsx(fn,{size:13});case"review":return e.jsx(qe,{size:13});case"walkthrough":return e.jsx(pn,{size:13});default:return e.jsx(hn,{size:13})}}function sa(t){return t<1024?`${t}B`:t<1024*1024?`${(t/1024).toFixed(1)}KB`:`${(t/(1024*1024)).toFixed(1)}MB`}function ra(t){if(!t)return"";const l=new Date(t),s=new Date().getTime()-l.getTime(),c=Math.floor(s/(1e3*60*60*24));return c===0?"Today":c===1?"Yesterday":c<7?`${c}d ago`:c<30?`${Math.floor(c/7)}w ago`:l.toLocaleDateString()}function ia(t,l){t.key!=="Enter"&&t.key!==" "||(t.preventDefault(),l())}function oa({documents:t,selectedDocId:l,loading:m,error:s,searchQuery:c,taskById:u,onSearchChange:w,onSelect:y,onCloseTray:v,hasActiveFilters:b}){return e.jsxs("div",{className:A.index,children:[e.jsxs("div",{className:A.header,children:[e.jsxs("span",{className:A.title,children:[e.jsx(dn,{size:14}),"Documents"]}),v?e.jsx("button",{type:"button",className:"tf-control-icon",onClick:v,title:"Collapse document tray","aria-label":"Collapse document tray",children:e.jsx(un,{size:16})}):null]}),e.jsxs("div",{className:A.search,children:[e.jsx(mn,{size:12,className:A.searchIcon}),e.jsx("input",{type:"text",placeholder:"Search documents…",value:c,onChange:h=>w(h.target.value),className:A.searchInput})]}),e.jsxs("div",{className:`${A.list} tf-scrollbar`,children:[m&&e.jsx("div",{className:A.state,children:"Loading documents…"}),!m&&s&&e.jsx("div",{className:A.stateError,children:s}),!m&&!s&&t.length===0&&e.jsx("div",{className:A.state,children:b?"No documents match your filters.":"No documents found. Documents added as task attachments will appear here."}),!m&&t.map(h=>{const g=h.taskId?u.get(h.taskId):null,O=h.id===l,T=$e(h),C=et(h),D=typeof h.attachmentCount=="number"&&Number.isFinite(h.attachmentCount)?h.attachmentCount:h.taskId?1:0,E=D>1?`${D} tasks linked`:D===1?g?.title||"1 task linked":null;return e.jsxs("div",{role:"button",tabIndex:0,className:`${A.item} ${O?A.itemActive:""}`,onClick:()=>y(h),onKeyDown:I=>ia(I,()=>y(h)),children:[e.jsx("div",{className:A.itemIcon,children:e.jsx(aa,{docType:h.docType})}),e.jsxs("div",{className:A.itemBody,children:[e.jsx("span",{className:A.itemTitle,title:T,children:T}),C==="unattached"&&e.jsx("span",{className:A.itemBadge,children:"Unattached"}),E&&e.jsx("span",{className:A.itemTask,title:E,children:E}),e.jsxs("span",{className:A.itemMeta,children:[e.jsxs("span",{className:A.itemMetaDetails,children:[sa(h.sizeBytes),h.updatedAt&&e.jsxs(e.Fragment,{children:[" · ",ra(h.updatedAt)]})]}),h.referenceLabel&&e.jsx("span",{className:A.itemMetaReference,children:h.referenceLabel})]})]})]},h.id)})]})]})}function Ie(t){return function(l){return Dn(l,t)}}const ca="_viewer_v1pk0_1",la="_viewerMonochrome_v1pk0_10",da="_metaDocumentName_v1pk0_10",ua="_viewerEditMode_v1pk0_14",ma="_meta_v1pk0_10",ha="_metaLeft_v1pk0_30",pa="_metaRenameRow_v1pk0_49",fa="_typeBadge_v1pk0_56",va="_typeBadgeImplementationPlan_v1pk0_71",wa="_typeBadgeReview_v1pk0_77",ka="_typeBadgeWalkthrough_v1pk0_83",ya="_metaTaskName_v1pk0_89",ga="_statusBadge_v1pk0_98",xa="_metaDate_v1pk0_113",_a="_metaSize_v1pk0_114",ba="_actions_v1pk0_122",Sa="_actionBtn_v1pk0_129",ja="_dangerBtn_v1pk0_156",Ca="_generateBtn_v1pk0_167",Na="_editBtn_v1pk0_178",Ta="_saveBtn_v1pk0_189",Ea="_layoutToggle_v1pk0_205",Ra="_layoutBtn_v1pk0_213",Aa="_layoutBtnActive_v1pk0_229",Ia="_saveStatus_v1pk0_234",$a="_saveStatusSaved_v1pk0_241",La="_saveStatusError_v1pk0_245",Da="_unsaved_v1pk0_250",Ba="_viewerContent_v1pk0_256",Ma="_viewerBody_v1pk0_265",Pa="_viewerBodyFullWidth_v1pk0_273",za="_viewerMain_v1pk0_277",Fa="_reviewRail_v1pk0_285",Oa="_printHint_v1pk0_291",Ha="_reviewSection_v1pk0_298",Wa="_reviewHeader_v1pk0_307",Ga="_reviewTitle_v1pk0_315",Ka="_reviewSubtitle_v1pk0_324",Ua="_reviewControls_v1pk0_331",Ja="_reviewSelect_v1pk0_338",Va="_reviewSessionMeta_v1pk0_342",qa="_reviewStatusResolved_v1pk0_350",Qa="_reviewSessionLabel_v1pk0_356",Ya="_reviewTitleEditRow_v1pk0_361",Xa="_reviewSessionTimestamp_v1pk0_368",Za="_reviewAnchorLabel_v1pk0_372",es="_reviewComposer_v1pk0_378",ts="_reviewAnchorChip_v1pk0_385",ns="_reviewAnchorSnippet_v1pk0_398",as="_reviewAnchorClear_v1pk0_403",ss="_reviewCommentActions_v1pk0_416",rs="_reviewCommentAction_v1pk0_416",is="_reviewCommentEditor_v1pk0_437",os="_viewerState_v1pk0_443",cs="_viewerStateError_v1pk0_450",ls="_editorArea_v1pk0_457",ds="_editorPane_v1pk0_464",us="_editorLayoutSplit_v1pk0_472",ms="_previewPane_v1pk0_473",hs="_editorLayoutEditor_v1pk0_477",ps="_editorLayoutPreview_v1pk0_478",fs="_editorPaneLabel_v1pk0_482",vs="_editorTextarea_v1pk0_494",ws="_markdownSurface_v1pk0_536",ks="_attachModalBody_v1pk0_745",ys="_attachModalCopy_v1pk0_752",gs="_attachModalError_v1pk0_759",xs="_attachTaskList_v1pk0_772",_s="_attachTaskRow_v1pk0_781",bs="_attachTaskTitle_v1pk0_808",Ss="_attachTaskInfo_v1pk0_814",js="_attachTaskReference_v1pk0_822",Cs="_attachTaskMeta_v1pk0_829",Ns="_attachEmptyState_v1pk0_836",r={viewer:ca,viewerMonochrome:la,metaDocumentName:da,viewerEditMode:ua,meta:ma,metaLeft:ha,metaRenameRow:pa,typeBadge:fa,typeBadgeImplementationPlan:va,typeBadgeReview:wa,typeBadgeWalkthrough:ka,metaTaskName:ya,statusBadge:ga,metaDate:xa,metaSize:_a,actions:ba,actionBtn:Sa,dangerBtn:ja,generateBtn:Ca,editBtn:Na,saveBtn:Ta,layoutToggle:Ea,layoutBtn:Ra,layoutBtnActive:Aa,saveStatus:Ia,saveStatusSaved:$a,saveStatusError:La,unsaved:Da,viewerContent:Ba,viewerBody:Ma,viewerBodyFullWidth:Pa,viewerMain:za,reviewRail:Fa,printHint:Oa,reviewSection:Ha,reviewHeader:Wa,reviewTitle:Ga,reviewSubtitle:Ka,reviewControls:Ua,reviewSelect:Ja,reviewSessionMeta:Va,reviewStatusResolved:qa,reviewSessionLabel:Qa,reviewTitleEditRow:Ya,reviewSessionTimestamp:Xa,reviewAnchorLabel:Za,reviewComposer:es,reviewAnchorChip:ts,reviewAnchorSnippet:ns,reviewAnchorClear:as,reviewCommentActions:ss,reviewCommentAction:rs,reviewCommentEditor:is,viewerState:os,viewerStateError:cs,editorArea:ls,editorPane:ds,editorLayoutSplit:us,previewPane:ms,editorLayoutEditor:hs,editorLayoutPreview:ps,editorPaneLabel:fs,editorTextarea:vs,markdownSurface:ws,attachModalBody:ks,attachModalCopy:ys,attachModalError:gs,attachTaskList:xs,attachTaskRow:_s,attachTaskTitle:bs,attachTaskInfo:Ss,attachTaskReference:js,attachTaskMeta:Cs,attachEmptyState:Ns},Ts="_overlay_1unik_1",Es="_modal_1unik_12",Rs="_header_1unik_16",As="_title_1unik_20",Is="_docName_1unik_24",$s="_body_1unik_34",Ls="_state_1unik_41",Ds="_stateError_1unik_52",Bs="_stateDone_1unik_63",Ms="_toolbar_1unik_84",Ps="_toolbarCount_1unik_95",zs="_toolbarActions_1unik_100",Fs="_tree_1unik_105",Os="_taskRow_1unik_113",Hs="_taskRowDimmed_1unik_126",Ws="_taskCheck_1unik_130",Gs="_taskExpandBtn_1unik_139",Ks="_taskExpandSpacer_1unik_155",Us="_taskTitle_1unik_160",Js="_taskBadge_1unik_169",Vs="_footer_1unik_179",S={overlay:Ts,modal:Es,header:Rs,title:As,docName:Is,body:$s,state:Ls,stateError:Ds,stateDone:Bs,toolbar:Ms,toolbarCount:Ps,toolbarActions:zs,tree:Fs,taskRow:Os,taskRowDimmed:Hs,taskCheck:Ws,taskExpandBtn:Gs,taskExpandSpacer:Ks,taskTitle:Us,taskBadge:Js,footer:Vs},qs={1:"Low",2:"Medium",3:"High"};function we(t,l){return t.map(m=>({...m,selected:l,children:we(m.children,l)}))}function It(t,l,m){return t.map(s=>s.idempotencyKey===l?{...s,selected:m,children:we(s.children,m)}:{...s,children:It(s.children,l,m)})}function Ze(t){let l=0;for(const m of t)m.selected&&l++,l+=Ze(m.children);return l}function $t({node:t,depth:l,onToggle:m}){const[s,c]=i.useState(!0),u=t.children.length>0,w=l*20;return e.jsxs("div",{children:[e.jsxs("div",{className:`${S.taskRow} ${t.selected?"":S.taskRowDimmed}`,style:{paddingLeft:`${12+w}px`},children:[e.jsx("button",{className:S.taskCheck,onClick:()=>m(t.idempotencyKey,!t.selected),title:t.selected?"Deselect":"Select",children:t.selected?e.jsx(vn,{size:14,style:{color:"var(--brand-primary-strong)"}}):e.jsx(wn,{size:14,style:{color:"var(--text-muted)"}})}),u?e.jsx("button",{className:S.taskExpandBtn,onClick:()=>c(y=>!y),children:s?e.jsx(kn,{size:12}):e.jsx(yn,{size:12})}):e.jsx("span",{className:S.taskExpandSpacer}),e.jsx("span",{className:S.taskTitle,title:t.description||void 0,children:t.title}),e.jsx("span",{className:S.taskBadge,style:{color:yt(t.type),borderColor:yt(t.type)},children:t.type}),e.jsx("span",{className:S.taskBadge,style:{color:gt(t.priority),borderColor:gt(t.priority)},children:qs[t.priority]})]}),u&&s&&e.jsx("div",{children:t.children.map(y=>e.jsx($t,{node:y,depth:l+1,onToggle:m},y.idempotencyKey))})]})}function Qs({content:t,docTitle:l,apiBaseUrl:m="",onClose:s,onGenerated:c}){const[u,w]=i.useState("preview"),[y,v]=i.useState(null),[b,h]=i.useState([]),[g,O]=i.useState(!0),[T,C]=i.useState(0),[D,E]=i.useState(null);i.useEffect(()=>{let x=!1;return O(!0),v(null),P("/api/taskforce/documents/generate-tasks/preview",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:t})},m).then(j=>j.json()).then(j=>{if(!x){if(j.error)throw new Error(j.error);h(j.tasks||[]),w("preview")}}).catch(j=>{x||(v(j?.message||"Failed to parse plan"),w("error"))}).finally(()=>{x||O(!1)}),()=>{x=!0}},[t,m]);const I=i.useCallback((x,j)=>{h(F=>It(F,x,j))},[]),z=()=>h(x=>we(x,!0)),H=()=>h(x=>we(x,!1)),q=Ze(b),Q=async()=>{w("generating"),E(null);try{const x=await P("/api/taskforce/documents/generate-tasks/commit",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({tasks:b})},m),j=await x.json().catch(()=>({}));if(!x.ok)throw new Error(j.error||`Generation failed (${x.status})`);C(j.created??0),w("done"),c(j.created??0)}catch(x){E(x?.message||"Generation failed"),w("error")}};return e.jsx("div",{className:S.overlay,onClick:x=>{x.target===x.currentTarget&&s()},children:e.jsxs("div",{className:`tf-surface-modal tf-modal-shell ${S.modal}`,children:[e.jsxs("div",{className:`tf-modal-header ${S.header}`,children:[e.jsxs("div",{className:`tf-modal-title ${S.title}`,children:[e.jsx(Qe,{size:16,style:{color:"var(--brand-primary-strong)"}}),"Generate Tasks from Plan"]}),e.jsx("span",{className:S.docName,children:l}),e.jsx("button",{className:"tf-control-icon",onClick:s,title:"Close",children:e.jsx(Rt,{size:16})})]}),e.jsxs("div",{className:S.body,children:[g&&e.jsxs("div",{className:S.state,children:[e.jsx(_t,{size:20,className:L.docSpinning}),"Parsing plan…"]}),!g&&u==="error"&&e.jsxs("div",{className:S.stateError,children:[e.jsx(Ye,{size:16}),y||D||"An error occurred"]}),!g&&u==="done"&&e.jsxs("div",{className:S.stateDone,children:[e.jsx(At,{size:24,style:{color:"var(--status-success)"}}),e.jsxs("strong",{children:[T," task",T!==1?"s":""," created"]}),e.jsx("p",{children:"Tasks are now in your board. Switch to the Kanban or Hierarchy view to see them."})]}),!g&&(u==="preview"||u==="confirm"||u==="generating")&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:S.toolbar,children:[e.jsxs("span",{className:S.toolbarCount,children:[q," of ",Ze(we(b,!0))," tasks selected"]}),e.jsxs("div",{className:S.toolbarActions,children:[e.jsx("button",{className:"tf-control-icon",onClick:z,children:"Select all"}),e.jsx("button",{className:"tf-control-icon",onClick:H,children:"Deselect all"})]})]}),b.length===0?e.jsx("div",{className:S.state,children:"No tasks could be parsed from this document. Make sure the document uses ## H2 headings for phases and bullet points for tasks."}):e.jsx("div",{className:`${S.tree} tf-scrollbar`,children:b.map(x=>e.jsx($t,{node:x,depth:0,onToggle:I},x.idempotencyKey))})]})]}),!g&&u!=="done"&&u!=="error"&&e.jsxs("div",{className:S.footer,children:[e.jsx("button",{className:"tf-button-secondary",onClick:s,children:"Cancel"}),e.jsx("button",{className:"tf-button-primary",onClick:Q,disabled:q===0||u==="generating",children:u==="generating"?e.jsxs(e.Fragment,{children:[e.jsx(_t,{size:13,className:L.docSpinning})," Generating…"]}):e.jsxs(e.Fragment,{children:[e.jsx(Qe,{size:13})," Generate ",q," task",q!==1?"s":""]})})]}),!g&&u==="done"&&e.jsx("div",{className:S.footer,children:e.jsx("button",{className:"tf-button-primary",onClick:s,children:"Done"})})]})})}const Ys={"implementation-plan":"Implementation Plan",review:"Review",walkthrough:"Walkthrough",planning:"Planning",other:"Document"},Xs={"implementation-plan":r.typeBadgeImplementationPlan,review:r.typeBadgeReview,walkthrough:r.typeBadgeWalkthrough,planning:void 0,other:void 0},Zs={editor:r.editorLayoutEditor,split:r.editorLayoutSplit,preview:r.editorLayoutPreview},er=1500,tr=`
2
+ @page {
3
+ margin: 0.94in 1.02in 1in;
4
+ }
5
+
6
+ html,
7
+ body {
8
+ margin: 0;
9
+ padding: 0;
10
+ background: #fff;
11
+ color: #111;
12
+ -webkit-print-color-adjust: exact;
13
+ print-color-adjust: exact;
14
+ }
15
+
16
+ body {
17
+ font: 12.15pt/1.66 Georgia, "Times New Roman", Times, serif;
18
+ letter-spacing: 0;
19
+ text-rendering: optimizeLegibility;
20
+ }
21
+
22
+ .tf-print-document {
23
+ max-width: 5.95in;
24
+ margin: 0 auto;
25
+ overflow: visible;
26
+ color: #171717;
27
+ }
28
+
29
+ .tf-print-document > :first-child {
30
+ margin-top: 0;
31
+ }
32
+
33
+ .tf-print-document > :last-child {
34
+ margin-bottom: 0;
35
+ }
36
+
37
+ .tf-print-document h1,
38
+ .tf-print-document h2,
39
+ .tf-print-document h3,
40
+ .tf-print-document h4 {
41
+ font-family: "Helvetica Neue", "Arial Nova", Arial, sans-serif;
42
+ color: #101010;
43
+ font-weight: 700;
44
+ line-height: 1.08;
45
+ letter-spacing: -0.03em;
46
+ break-after: avoid-page;
47
+ page-break-after: avoid;
48
+ }
49
+
50
+ .tf-print-document h1 {
51
+ font-size: 32pt;
52
+ font-weight: 800;
53
+ line-height: 0.98;
54
+ letter-spacing: -0.055em;
55
+ margin: 0 0 1.18em;
56
+ padding: 0 0 0.38em;
57
+ border-bottom: 2px solid #d8d8d8;
58
+ max-width: 84%;
59
+ }
60
+
61
+ .tf-print-document h1 + p,
62
+ .tf-print-document h1 + ul,
63
+ .tf-print-document h1 + ol {
64
+ margin-top: 0.4em;
65
+ }
66
+
67
+ .tf-print-document h2,
68
+ .tf-print-document h3,
69
+ .tf-print-document h4 {
70
+ margin-bottom: 0.28em;
71
+ }
72
+
73
+ .tf-print-document h2 {
74
+ font-size: 16.5pt;
75
+ font-weight: 750;
76
+ margin-top: 2.2em;
77
+ padding-bottom: 0.22em;
78
+ border-bottom: 1px solid #dfdfdf;
79
+ }
80
+
81
+ .tf-print-document h3 {
82
+ font-size: 13.3pt;
83
+ font-weight: 700;
84
+ margin-top: 1.48em;
85
+ }
86
+
87
+ .tf-print-document h4 {
88
+ font-size: 11.2pt;
89
+ font-weight: 700;
90
+ margin-top: 1.14em;
91
+ text-transform: uppercase;
92
+ letter-spacing: 0.08em;
93
+ }
94
+
95
+ .tf-print-document p,
96
+ .tf-print-document ul,
97
+ .tf-print-document ol,
98
+ .tf-print-document blockquote,
99
+ .tf-print-document table,
100
+ .tf-print-document pre,
101
+ .tf-print-document hr {
102
+ margin: 0.78em 0;
103
+ }
104
+
105
+ .tf-print-document ul,
106
+ .tf-print-document ol {
107
+ padding-left: 1.1em;
108
+ }
109
+
110
+ .tf-print-document li {
111
+ margin: 0.24em 0;
112
+ padding-left: 0.1em;
113
+ }
114
+
115
+ .tf-print-document li > ul,
116
+ .tf-print-document li > ol {
117
+ margin-top: 0.34em;
118
+ margin-bottom: 0.2em;
119
+ }
120
+
121
+ .tf-print-document a {
122
+ color: #121212;
123
+ text-decoration: underline;
124
+ text-underline-offset: 2px;
125
+ text-decoration-thickness: 0.65px;
126
+ }
127
+
128
+ .tf-print-document code {
129
+ font-family: "SFMono-Regular", "SF Mono", Consolas, "Liberation Mono", monospace;
130
+ font-size: 0.78em;
131
+ background: transparent;
132
+ color: #4a4a4a;
133
+ border: 0;
134
+ padding: 0;
135
+ border-radius: 0;
136
+ overflow-wrap: anywhere;
137
+ }
138
+
139
+ .tf-print-section-label {
140
+ font-family: "Helvetica Neue", "Arial Nova", Arial, sans-serif;
141
+ font-size: 10.7pt;
142
+ font-weight: 700;
143
+ line-height: 1.18;
144
+ letter-spacing: 0.12em;
145
+ text-transform: uppercase;
146
+ color: #191919;
147
+ margin-top: 2.2em;
148
+ margin-bottom: 0.58em;
149
+ padding-bottom: 0;
150
+ border-bottom: 0;
151
+ break-after: avoid-page;
152
+ page-break-after: avoid;
153
+ }
154
+
155
+ .tf-print-section-label strong {
156
+ font-weight: inherit;
157
+ }
158
+
159
+ .tf-print-document pre {
160
+ background: #fafafa;
161
+ border: 1px solid #e1e1e1;
162
+ border-radius: 6px;
163
+ padding: 10pt 11pt;
164
+ overflow: visible;
165
+ white-space: pre-wrap;
166
+ word-break: break-word;
167
+ break-inside: avoid-page;
168
+ page-break-inside: avoid;
169
+ }
170
+
171
+ .tf-print-document pre code {
172
+ background: transparent;
173
+ padding: 0;
174
+ border-radius: 0;
175
+ white-space: inherit;
176
+ word-break: inherit;
177
+ }
178
+
179
+ .tf-print-document blockquote {
180
+ border-left: 2px solid #9f9f9f;
181
+ color: #434343;
182
+ margin-left: 0;
183
+ padding-left: 9pt;
184
+ font-style: italic;
185
+ }
186
+
187
+ .tf-print-document table {
188
+ width: 100%;
189
+ border-collapse: collapse;
190
+ table-layout: fixed;
191
+ break-inside: auto;
192
+ page-break-inside: auto;
193
+ }
194
+
195
+ .tf-print-document thead {
196
+ display: table-header-group;
197
+ }
198
+
199
+ .tf-print-document tr {
200
+ break-inside: avoid-page;
201
+ page-break-inside: avoid;
202
+ }
203
+
204
+ .tf-print-document th,
205
+ .tf-print-document td {
206
+ border: 1px solid #dbdbdb;
207
+ padding: 6.5pt 7.5pt;
208
+ text-align: left;
209
+ vertical-align: top;
210
+ word-break: break-word;
211
+ background: #fff;
212
+ }
213
+
214
+ .tf-print-document th {
215
+ background: #f7f7f7;
216
+ color: #1e1e1e;
217
+ font-size: 9.4pt;
218
+ font-weight: 680;
219
+ letter-spacing: 0.018em;
220
+ text-transform: uppercase;
221
+ }
222
+
223
+ .tf-print-document hr {
224
+ border: 0;
225
+ border-top: 1px solid #e1e1e1;
226
+ }
227
+
228
+ .tf-print-document img {
229
+ max-width: 100%;
230
+ height: auto;
231
+ break-inside: avoid-page;
232
+ page-break-inside: avoid;
233
+ }
234
+
235
+ .tf-print-document input[type="checkbox"] {
236
+ accent-color: #111;
237
+ margin-right: 0.45em;
238
+ }
239
+ `;function nr(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function jt(t){return t?new Date(t).toLocaleString():"—"}function ar(){const t=s=>!s||!Array.isArray(s.children)?!1:s.children.some(c=>c?c.type==="element"&&c.tagName==="input"&&c.properties?.type==="checkbox"?!0:t(c):!1),l=s=>!s||!Array.isArray(s.children)?!1:s.children.some(c=>typeof c?.checked=="boolean"?!0:t(c)),m=s=>{const c=ve.Children.toArray(s).filter(v=>typeof v!="string"?!0:v.trim().length>0);if(c.length!==1)return null;const u=c[0];if(!ve.isValidElement(u)||u.type!=="strong")return null;const w=u.props,y=ve.Children.toArray(w.children).join("").trim();return y||null};return{input({type:s,checked:c,...u}){return s!=="checkbox"?e.jsx("input",{type:s,checked:c,...u}):e.jsx("input",{...u,type:"checkbox",checked:!!c,disabled:!0,readOnly:!0})},ul({children:s,node:c,...u}){const w=l(c);return e.jsx("ul",{...u,style:w?{paddingLeft:"1.2em"}:void 0,children:s})},ol({children:s,node:c,...u}){const w=l(c);return e.jsx("ol",{...u,style:w?{paddingLeft:"1.2em"}:void 0,children:s})},li({children:s,node:c,...u}){const w=typeof c?.checked=="boolean"||t(c);return e.jsx("li",{...u,style:w?{listStyleType:"none",listStyle:"none",marginLeft:0}:void 0,children:s})},p({children:s,...c}){const u=m(s);return u?e.jsx("p",{...c,className:"tf-print-section-label",children:u}):e.jsx("p",{...c,children:s})}}}function sr(t){const l=an.renderToStaticMarkup(e.jsx("div",{className:"tf-print-document",children:e.jsx(Re,{remarkPlugins:[Ae],rehypePlugins:[Ie],components:ar(),children:t})}));return`<!doctype html>
240
+ <html lang="en">
241
+ <head>
242
+ <meta charset="utf-8" />
243
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
244
+ <title>Taskforce print document</title>
245
+ <style>${tr}</style>
246
+ </head>
247
+ <body>${l}</body>
248
+ </html>`}async function rr(t,l){try{await l.fonts?.ready}catch{}await new Promise(m=>{const s=t.requestAnimationFrame?.bind(t)??(c=>window.setTimeout(()=>c(0),0));s(()=>s(()=>m()))})}function ir(t){return window.setTimeout(t,er)}function Ct(t){try{return new Date(t).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return t}}function Nt(t){return t?t.kind==="document"?"Entire document":t.kind==="quote"?t.quote?`Quote: "${t.quote}"`:"Quoted text":t.kind==="line-range"?t.startLine===t.endLine?`Line ${t.startLine}`:`Lines ${t.startLine}-${t.endLine}`:null:null}function or(t){return t.authorActor?.label?t.authorActor.label:t.authorActorId==="user"||t.authorActorId==="human"?"You":t.authorActorId?t.authorActorId:"Reviewer"}function Tt(t){return t.replace(/\s+/g," ").trim()}function cr(t,l){if(!l)return 0;let m=0,s=0;for(;s>=0&&(s=t.indexOf(l,s),!(s<0));)m+=1,s+=l.length;return m}function lr(t,l,m){const s=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);let c=s.nextNode(),u=0;for(;c;){const w=c.textContent||"";if(c===l)return u+Math.max(0,Math.min(m,w.length));u+=w.length,c=s.nextNode()}return null}function dr(t,l,m){const s=m.replace(/\s+/g," ").trim();if(!s)return null;const c=t.textContent||"",u=Tt(c),w=[];let y=u.indexOf(s);for(;y>=0;)w.push(y),y=u.indexOf(s,y+s.length);let v=null;const b=lr(t,l.startContainer,l.startOffset);if(b!==null){const C=Tt(c.slice(0,b));v=cr(C,s)}const h=v!==null&&v>=0&&v<w.length?v:w.length===1?0:null,g=h!==null?w[h]:w[0]??-1;if(g<0)return{kind:"quote",quote:s,occurrenceIndex:v};const O=u.slice(Math.max(0,g-40),g).trim()||null,T=u.slice(g+s.length,g+s.length+40).trim()||null;return{kind:"quote",quote:s,occurrenceIndex:h,prefix:O,suffix:T}}function ur(t,l,m){if(l<0)return t;const s=t.split(`
249
+ `);let c=-1;const u=/^(\s*(?:[-*+]|\d+\.)\s+)\[( |x|X)\](.*)$/,w=m?"x":" ";return s.map(v=>{const b=v.match(u);return!b||(c+=1,c!==l)?v:`${b[1]}[${w}]${b[3]}`}).join(`
250
+ `)}function mr({doc:t,taskTitle:l,tasks:m=[],apiBaseUrl:s="",onSaved:c,onDeleted:u,onBackToTask:w,enableTaskGeneration:y=!1}){const v=$e(t),[b,h]=i.useState(v),g=b,O=sn({...t,displayName:b}),T=Ln(t),[C,D]=i.useState(null),[E,I]=i.useState(!1),[z,H]=i.useState(null),[q,Q]=i.useState(!1),[x,j]=i.useState(!1),[F,B]=i.useState([]),[G,se]=i.useState(!1),[ke,R]=i.useState(null),[ee,K]=i.useState(null),[re,me]=i.useState(""),[p,$]=i.useState(!1),[W,Y]=i.useState(null),[he,ye]=i.useState(!1),[Le,De]=i.useState(""),[ie,pe]=i.useState(null),[ge,oe]=i.useState(""),[te,Lt]=i.useState(!0),[N,xe]=i.useState(!1),[U,ce]=i.useState(""),[J,Be]=i.useState("split"),[X,V]=i.useState({type:"idle"}),[Dt,Me]=i.useState(!1),[tt,Bt]=i.useState(!1),[_e,nt]=i.useState(!1),[be,ne]=i.useState(!1),[Mt,Se]=i.useState(!1),[at,st]=i.useState(""),[Pe,ze]=i.useState(null),[rt,je]=i.useState(null),[Fe,le]=i.useState(g),de=t.editable!==!1,fe=et(t),Pt=!!t.assetId,Oe=N&&U!==(C??""),He=i.useRef(null),We=i.useRef(null),it=i.useRef(null),ue=i.useRef(null),Ce=i.useRef(null),ot=i.useRef(null),ct=i.useRef(null),k=F.find(n=>n.id===ee)||F[0]||null,lt=m.filter(n=>{const a=at.trim().toLowerCase();return a?n.title.toLowerCase().includes(a)||String(n.referenceLabel||"").trim().toLowerCase().includes(a):!0}),dt=i.useCallback(async()=>{I(!0),H(null),D(null);try{const n=await P(t.apiUrl,{credentials:"same-origin"},s);if(!n.ok)throw new Error(`Failed to load document (${n.status})`);const a=await n.text();D(a),ce(a)}catch(n){H(n?.message||"Failed to load document")}finally{I(!1)}},[s,t.apiUrl]),Ne=i.useCallback(async n=>{if(!t.assetId){B([]),K(null),R(null);return}const a=n?.silent===!0;a||(se(!0),R(null));try{const o=await P(`/api/taskforce/document-reviews/sessions?assetId=${encodeURIComponent(t.assetId)}`,{credentials:"include"},s),d=await o.json().catch(()=>({}));if(!o.ok)throw new Error(d.error||`Failed to load reviews (${o.status})`);const f=Array.isArray(d.sessions)?d.sessions:[];B(f),K(_=>_&&f.some(Z=>Z.id===_)?_:f[0]?.id??null)}catch(o){a||(R(o?.message||"Failed to load reviews"),B([]),K(null))}finally{a||se(!1)}},[s,t.assetId]),Ge=i.useCallback(async()=>{if(!t.assetId||p)return null;$(!0),R(null);try{const n=await P("/api/taskforce/document-reviews/sessions",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({assetId:t.assetId,title:`Review ${F.length+1}`})},s),a=await n.json().catch(()=>({}));if(!n.ok)throw new Error(a.error||`Failed to create review (${n.status})`);const o=a.session||null;if(!o)throw new Error("Review session payload missing.");return B(d=>[o,...d.filter(f=>f.id!==o.id)]),K(o.id),o}catch(n){return R(n?.message||"Failed to create review"),null}finally{$(!1)}},[s,t.assetId,p,F.length]);i.useEffect(()=>{dt(),Ne(),xe(!1),V({type:"idle"}),ne(!1);const n=$e(t);h(n),le(n),Q(!1),j(!1),me(""),Y(null),ye(!1),De(""),pe(null),oe("")},[t,dt,Ne]),i.useEffect(()=>{if(!k)return;const n=ot.current;typeof n?.scrollIntoView=="function"&&n.scrollIntoView({block:"end"})},[k?.comments.length,k?.id]),i.useEffect(()=>{De(k?.title?.trim()||""),ye(!1)},[k?.id,k?.title]),i.useEffect(()=>{be&&window.setTimeout(()=>{We.current?.focus(),We.current?.select()},0)},[be]),i.useEffect(()=>{if(!t.assetId||N)return;const n=()=>{document.visibilityState==="visible"&&Ne({silent:!0})},a=window.setInterval(n,15e3);return window.addEventListener("focus",n),document.addEventListener("visibilitychange",n),()=>{window.clearInterval(a),window.removeEventListener("focus",n),document.removeEventListener("visibilitychange",n)}},[t.assetId,N,Ne]),i.useEffect(()=>{if(!N)return;const n=a=>{(a.metaKey||a.ctrlKey)&&a.key==="s"&&(a.preventDefault(),ut())};return window.addEventListener("keydown",n),()=>window.removeEventListener("keydown",n)},[N,U]);const ae=i.useCallback(()=>{Ce.current!==null&&(window.clearTimeout(Ce.current),Ce.current=null),ue.current&&(ue.current.remove(),ue.current=null)},[]);i.useEffect(()=>()=>{ae()},[ae]);const Te=i.useCallback(n=>{if(!N||J!=="split")return;const a=He.current,o=it.current;if(!a||!o)return;const d=n==="editor"?a:o,f=n==="editor"?o:a,_=Math.max(d.scrollHeight-d.clientHeight,0),Z=Math.max(f.scrollHeight-f.clientHeight,0),Je=_<=0?0:d.scrollTop/_,kt=Z*Je;Math.abs(f.scrollTop-kt)<=1||(f.scrollTop=kt)},[N,J]);i.useEffect(()=>{!N||J!=="split"||Te("editor")},[U,N,J,Te]);const zt=()=>{de&&(ce(C??""),V({type:"idle"}),xe(!0),setTimeout(()=>He.current?.focus(),50))},Ft=()=>{Oe&&!window.confirm("Discard unsaved changes?")||(xe(!1),ce(C??""),V({type:"idle"}))},ut=i.useCallback(async()=>{if(de&&X.type!=="saving"){V({type:"saving"});try{const n=await P("/api/taskforce/documents/save",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({fsPath:t.fsPath,content:U})},s),a=await n.json().catch(()=>({}));if(!n.ok)throw new Error(a.error||`Save failed (${n.status})`);const o=a.updatedAt||new Date().toISOString();D(U),V({type:"saved",savedAt:o}),c?.(o),xe(!1)}catch(n){V({type:"error",message:n?.message||"Save failed"})}}},[s,t.fsPath,U,X.type,c,de]),Ot=i.useCallback(()=>{const n=N?U:C??"";if(!n.trim())return;ae();const a=document.createElement("iframe");a.setAttribute("aria-hidden","true"),a.tabIndex=-1,a.style.position="fixed",a.style.right="0",a.style.bottom="0",a.style.width="0",a.style.height="0",a.style.border="0",a.style.opacity="0",a.style.pointerEvents="none",document.body.appendChild(a),ue.current=a;const o=a.contentWindow,d=a.contentDocument;if(!o||!d){ae();return}d.open(),d.write(sr(n)),d.close();let f=!1;const _=async()=>{f||ue.current!==a||(f=!0,await rr(o,d),ue.current===a&&(o.focus(),o.print(),Ce.current=ir(ae)))};o.addEventListener("afterprint",ae,{once:!0}),_()},[ae,C,U,N]),Ht=async()=>{const n=t.apiUrl,a=new URL(xt(n,s),window.location.origin).toString();try{await navigator.clipboard.writeText(a)}catch{const o=document.createElement("textarea");o.value=a,document.body.appendChild(o),o.select(),document.execCommand("copy"),document.body.removeChild(o)}Q(!0),setTimeout(()=>Q(!1),2e3)},Wt=i.useCallback(async()=>{if(T){try{await navigator.clipboard.writeText(T)}catch{const n=document.createElement("textarea");n.value=T,document.body.appendChild(n),n.select(),document.execCommand("copy"),document.body.removeChild(n)}j(!0),setTimeout(()=>j(!1),2e3)}},[T]),Gt=()=>{const n=t.apiUrl.includes("?")?"&":"?",a=xt(`${t.apiUrl}${n}download=1&filename=${encodeURIComponent(O)}`,s),o=document.createElement("a");o.href=a,o.click()},Ke=i.useCallback(async()=>{if(!t.assetId)return;const n=Fe.trim();if(!n){le(g),ne(!1);return}if(n===g){ne(!1);return}const a=await P(`/api/taskforce/documents/${encodeURIComponent(t.assetId)}`,{method:"PATCH",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({displayName:n})},s),o=await a.json().catch(()=>({}));if(!a.ok){window.alert(o.error||`Rename failed (${a.status})`);return}h(n),le(n),ne(!1),c?.(o.updatedAt||new Date().toISOString())},[s,t.assetId,c,g,Fe]),Kt=i.useCallback(n=>{if(n.key==="Enter"){n.preventDefault(),Ke();return}n.key==="Escape"&&(n.preventDefault(),le(g),ne(!1))},[Ke,g]),Ut=i.useCallback(async()=>{if(!t.assetId||_e)return;const n=fe==="attached",a=Math.max(0,Number(t.attachmentCount||0)),o=n?`Delete "${g}" everywhere?
251
+
252
+ This will remove it from ${a} linked task${a===1?"":"s"} and soft-delete the document across sync.`:`Permanently delete "${g}" from storage?`;if(window.confirm(o)){nt(!0);try{const d=await P(`/api/taskforce/documents/${encodeURIComponent(t.assetId)}`,{method:"DELETE",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify(n?{forceDetach:!0}:{})},s),f=await d.json().catch(()=>({}));if(!d.ok)throw new Error(f.error||`Delete failed (${d.status})`);u?.()}catch(d){window.alert(d?.message||"Delete failed")}finally{nt(!1)}}},[s,fe,_e,t.assetId,t.attachmentCount,u,g]),Jt=i.useCallback(()=>{st(""),je(null),ze(null),Se(!0)},[]),Vt=i.useCallback(async n=>{if(t.assetId){je(null),ze(n);try{const a=await P(`/api/taskforce/documents/${encodeURIComponent(t.assetId)}/attach`,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({targetType:"task",targetId:n})},s),o=await a.json().catch(()=>({}));if(!a.ok)throw new Error(o.error||`Attach failed (${a.status})`);if(o.alreadyAttached){je("This document is already attached to that task.");return}Se(!1),c?.(new Date().toISOString())}catch(a){je(a?.message||"Failed to attach document.")}finally{ze(null)}}},[s,t.assetId,c]),qt=i.useCallback(async()=>{if(!(!k||p)){$(!0),R(null);try{const n=k.status==="resolved"?"open":"resolved",a=await P(`/api/taskforce/document-reviews/sessions/${encodeURIComponent(k.id)}`,{method:"PATCH",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:n})},s),o=await a.json().catch(()=>({}));if(!a.ok)throw new Error(o.error||`Failed to update review (${a.status})`);const d=o.session||null;if(!d)throw new Error("Review session payload missing.");B(f=>f.map(_=>_.id===d.id?d:_))}catch(n){R(n?.message||"Failed to update review")}finally{$(!1)}}},[k,s,p]),Qt=i.useCallback(async()=>{if(!k||p)return;const n=Le.trim();$(!0),R(null);try{const a=await P(`/api/taskforce/document-reviews/sessions/${encodeURIComponent(k.id)}`,{method:"PATCH",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:n||null})},s),o=await a.json().catch(()=>({}));if(!a.ok)throw new Error(o.error||`Failed to update review (${a.status})`);const d=o.session||null;if(!d)throw new Error("Review session payload missing.");B(f=>f.map(_=>_.id===d.id?d:_)),ye(!1)}catch(a){R(a?.message||"Failed to update review")}finally{$(!1)}},[k,s,p,Le]),mt=N?U:C??"",Yt=i.useCallback(()=>{if(N||!te)return;const n=typeof window.getSelection=="function"?window.getSelection():null,a=n?.toString().replace(/\s+/g," ").trim()||"";if(!n||!a)return;const o=n.rangeCount>0?n.getRangeAt(0):null,d=ct.current;if(!o||!d)return;const f=o.commonAncestorContainer,_=f.nodeType===Node.TEXT_NODE?f.parentNode:f;if(!(_ instanceof Node)||!d.contains(_))return;const Z=dr(d,o,a);Z&&Y(Z)},[N,te]),Xt=i.useCallback(()=>{Lt(n=>{const a=!n;return a||Y(null),a})},[]),ht=i.useCallback(async()=>{const n=re.trim();if(!n||p)return;let a=k;if(a||(a=await Ge()),!!a){$(!0),R(null);try{const o=await P(`/api/taskforce/document-reviews/sessions/${encodeURIComponent(a.id)}/comments`,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({body:n,anchor:W||{kind:"document"}})},s),d=await o.json().catch(()=>({}));if(!o.ok)throw new Error(d.error||`Failed to add comment (${o.status})`);const f=d.session||null;if(!f)throw new Error("Review session payload missing.");B(_=>{const Z=_.filter(Je=>Je.id!==f.id);return[f,...Z]}),K(f.id),me(""),Y(null)}catch(o){R(o?.message||"Failed to add comment")}finally{$(!1)}}},[k,s,Ge,W,p,re]),Zt=i.useCallback((n,a)=>{pe(n),oe(a)},[]),en=i.useCallback(async()=>{if(!k||!ie||p)return;const n=ge.trim();if(n){$(!0),R(null);try{const a=await P(`/api/taskforce/document-reviews/sessions/${encodeURIComponent(k.id)}/comments/${encodeURIComponent(ie)}`,{method:"PATCH",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({body:n})},s),o=await a.json().catch(()=>({}));if(!a.ok)throw new Error(o.error||`Failed to update comment (${a.status})`);const d=o.session||null;if(!d)throw new Error("Review session payload missing.");B(f=>f.map(_=>_.id===d.id?d:_)),pe(null),oe("")}catch(a){R(a?.message||"Failed to update comment")}finally{$(!1)}}},[k,s,ge,ie,p]),tn=i.useCallback(async n=>{if(!(!k||p)&&window.confirm("Delete this review comment?")){$(!0),R(null);try{const a=await P(`/api/taskforce/document-reviews/sessions/${encodeURIComponent(k.id)}/comments/${encodeURIComponent(n)}`,{method:"DELETE",credentials:"include"},s),o=await a.json().catch(()=>({}));if(!a.ok)throw new Error(o.error||`Failed to delete comment (${a.status})`);const d=o.session||null;if(!d)throw new Error("Review session payload missing.");B(f=>f.map(_=>_.id===d.id?d:_)),ie===n&&(pe(null),oe(""))}catch(a){R(a?.message||"Failed to delete comment")}finally{$(!1)}}},[k,s,ie,p]),pt=i.useCallback(async n=>{if(!de)return!1;V({type:"saving"});try{const a=await P("/api/taskforce/documents/save",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({fsPath:t.fsPath,content:n})},s),o=await a.json().catch(()=>({}));if(!a.ok)throw new Error(o.error||`Save failed (${a.status})`);const d=o.updatedAt||new Date().toISOString();return D(n),ce(n),V({type:"saved",savedAt:d}),c?.(d),!0}catch(a){return V({type:"error",message:a?.message||"Save failed"}),!1}},[s,t.fsPath,c,de]),nn=i.useCallback((n,a)=>{const o=N?U:C??"",d=ur(o,n,a);if(d!==o){if(N){ce(d),V(f=>f.type==="saving"?f:{type:"idle"});return}pt(d)}},[C,U,N,pt]);let ft=-1;const Ue=n=>!n||!Array.isArray(n.children)?!1:n.children.some(a=>a?a.type==="element"&&a.tagName==="input"&&a.properties?.type==="checkbox"?!0:Ue(a):!1),vt=n=>!n||!Array.isArray(n.children)?!1:n.children.some(a=>typeof a?.checked=="boolean"?!0:Ue(a)),wt={input({type:n,checked:a,...o}){if(n!=="checkbox")return e.jsx("input",{type:n,checked:a,...o});ft+=1;const d=ft;return e.jsx("input",{...o,type:"checkbox",checked:!!a,disabled:!1,onClick:f=>f.stopPropagation(),onChange:f=>nn(d,f.currentTarget.checked)})},ul({children:n,node:a,...o}){const d=vt(a);return e.jsx("ul",{...o,style:d?{paddingLeft:"1.25em"}:void 0,"data-task-list":d?"true":void 0,children:n})},ol({children:n,node:a,...o}){const d=vt(a);return e.jsx("ol",{...o,style:d?{paddingLeft:"1.25em"}:void 0,"data-task-list":d?"true":void 0,children:n})},li({children:n,node:a,...o}){const d=typeof a?.checked=="boolean"||Ue(a);return e.jsx("li",{...o,style:d?{listStyleType:"none",listStyle:"none",marginLeft:0}:void 0,"data-task-item":d?"true":void 0,children:n})}};return e.jsxs("div",{className:`${r.viewer} ${N?r.viewerEditMode:""} ${tt?r.viewerMonochrome:""}`,children:[e.jsxs("div",{className:r.meta,children:[e.jsxs("div",{className:r.metaLeft,children:[e.jsxs("span",{className:`${r.typeBadge} ${Xs[t.docType]??""}`,children:[e.jsx(gn,{size:10}),Ys[t.docType]]}),be?e.jsx("div",{className:r.metaRenameRow,children:e.jsx("input",{ref:We,type:"text",className:L.input,value:Fe,onChange:n=>le(n.target.value),onBlur:()=>{Ke()},onKeyDown:Kt})}):e.jsx("span",{className:r.metaDocumentName,title:g,onDoubleClick:()=>{t.assetId&&(le(g),ne(!0))},children:g}),l&&e.jsx("span",{className:r.metaTaskName,title:`From task: ${l}`,children:l}),fe==="unattached"&&e.jsx("span",{className:r.statusBadge,children:"Unattached"}),t.updatedAt&&e.jsxs("span",{className:r.metaDate,title:jt(t.updatedAt),children:[e.jsx(xn,{size:11}),jt(t.updatedAt)]}),e.jsxs("span",{className:r.metaSize,children:[e.jsx(_n,{size:11}),nr(t.sizeBytes)]}),T&&e.jsx(rn,{label:T,copied:x,onClick:()=>{Wt()},title:"Copy document reference"}),X.type==="saved"&&e.jsxs("span",{className:`${r.saveStatus} ${r.saveStatusSaved}`,children:[e.jsx(At,{size:11}),"Saved"]}),X.type==="error"&&e.jsxs("span",{className:`${r.saveStatus} ${r.saveStatusError}`,title:X.message,children:[e.jsx(Ye,{size:11}),X.message||"Save failed"]}),Oe&&X.type!=="saving"&&e.jsx("span",{className:r.unsaved,children:"Unsaved changes"})]}),e.jsx("div",{className:r.actions,children:N?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:r.layoutToggle,children:[e.jsx("button",{className:`${r.layoutBtn} ${J==="editor"?r.layoutBtnActive:""}`,onClick:()=>Be("editor"),title:"Editor only",children:e.jsx(Ee,{size:12})}),e.jsx("button",{className:`${r.layoutBtn} ${J==="split"?r.layoutBtnActive:""}`,onClick:()=>Be("split"),title:"Split view",children:e.jsx(bn,{size:12})}),e.jsx("button",{className:`${r.layoutBtn} ${J==="preview"?r.layoutBtnActive:""}`,onClick:()=>Be("preview"),title:"Preview only",children:e.jsx(qe,{size:12})})]}),e.jsxs("button",{className:r.actionBtn,onClick:Ft,title:"Discard changes",children:[e.jsx(Rt,{size:13}),"Cancel"]}),e.jsxs("button",{className:`${r.actionBtn} ${r.saveBtn}`,onClick:ut,disabled:X.type==="saving"||!Oe,title:"Save (Ctrl+S)",children:[e.jsx(Sn,{size:13}),X.type==="saving"?"Saving…":"Save"]})]}):e.jsxs(e.Fragment,{children:[t.taskId&&w&&e.jsxs("button",{className:r.actionBtn,onClick:()=>w(t.taskId),title:"Back to task","aria-label":"Back to task",children:[e.jsx(jn,{size:13}),"Back to task"]}),t.assetId&&e.jsxs("button",{className:r.actionBtn,onClick:()=>ne(n=>!n),title:"Rename document",children:[e.jsx(Ee,{size:13}),be?"Close Rename":"Rename"]}),de&&e.jsxs("button",{className:`${r.actionBtn} ${r.editBtn}`,onClick:zt,title:"Edit document",children:[e.jsx(Ee,{size:13}),"Edit"]}),t.assetId&&e.jsxs("button",{className:r.actionBtn,onClick:Jt,title:"Attach document to a task",children:[e.jsx(bt,{size:13}),"Attach"]}),e.jsxs("button",{className:r.actionBtn,onClick:Xt,title:te?"Hide review and comments":"Show review and comments",children:[e.jsx(Ve,{size:13}),te?"Hide Review":"Show Review"]}),e.jsxs("button",{className:r.actionBtn,onClick:Ht,title:"Copy link",children:[e.jsx(bt,{size:13}),q?"Copied!":"Copy link"]}),e.jsxs("button",{className:r.actionBtn,onClick:Gt,title:"Download .md",children:[e.jsx(Cn,{size:13}),"Download"]}),e.jsxs("button",{className:r.actionBtn,onClick:Ot,title:"Print",children:[e.jsx(Nn,{size:13}),"Print"]}),e.jsxs("button",{className:r.actionBtn,onClick:()=>Bt(n=>!n),title:"Toggle black and white style",children:[e.jsx(qe,{size:13}),tt?"Color":"B/W"]}),y&&t.docType==="implementation-plan"&&!N&&e.jsxs("button",{className:`${r.actionBtn} ${r.generateBtn}`,onClick:()=>Me(!0),title:"Generate tasks from this plan",children:[e.jsx(Qe,{size:13}),"Generate Tasks"]}),Pt&&e.jsxs("button",{className:`${r.actionBtn} ${r.dangerBtn}`,onClick:()=>{Ut()},disabled:_e,title:fe==="attached"?"Remove this document from linked tasks and delete it":"Permanently delete this unattached document",children:[e.jsx(Tn,{size:13}),_e?"Deleting…":fe==="attached"?"Delete & Unlink":"Delete Permanently"]})]})})]}),E&&e.jsx("div",{className:r.viewerState,children:"Loading…"}),!E&&z&&e.jsx("div",{className:r.viewerStateError,children:z}),!E&&!z&&(N?e.jsxs("div",{className:`${r.editorArea} ${Zs[J]}`,children:[(J==="editor"||J==="split")&&e.jsxs("div",{className:r.editorPane,children:[e.jsx("div",{className:r.editorPaneLabel,children:"Markdown"}),e.jsx("textarea",{ref:He,className:`${r.editorTextarea} tf-scrollbar`,value:U,onScroll:()=>Te("editor"),onChange:n=>{ce(n.target.value),V(a=>a.type==="saving"?a:{type:"idle"})},spellCheck:!0,placeholder:"Write markdown here…"})]}),(J==="preview"||J==="split")&&e.jsxs("div",{className:r.previewPane,children:[e.jsx("div",{className:r.editorPaneLabel,children:"Preview"}),e.jsx("div",{ref:it,className:`${L.docMarkdown} ${r.markdownSurface}`,"data-testid":"doc-preview-scroll",onScroll:()=>Te("preview"),children:e.jsx(Re,{remarkPlugins:[Ae],rehypePlugins:[Ie],components:wt,children:mt})})]})]}):e.jsxs("div",{className:`${r.viewerBody} ${te?"":r.viewerBodyFullWidth}`,children:[e.jsx("div",{className:`${r.viewerContent} ${r.viewerMain} tf-scrollbar`,children:e.jsx("div",{ref:ct,className:`${L.docMarkdown} ${r.markdownSurface}`,onMouseUp:te?Yt:void 0,children:e.jsx(Re,{remarkPlugins:[Ae],rehypePlugins:[Ie],components:wt,children:mt})})}),te&&e.jsx("aside",{className:r.reviewRail,children:e.jsxs("section",{className:r.reviewSection,"aria-label":"Review and comments",children:[e.jsxs("div",{className:r.reviewHeader,children:[e.jsxs("div",{children:[e.jsxs("div",{className:r.reviewTitle,children:[e.jsx(Ve,{size:14}),"Review & Comments"]}),e.jsx("p",{className:r.reviewSubtitle,children:"Comments stay attached to this document review session."})]}),e.jsxs("div",{className:r.reviewControls,children:[F.length>1&&e.jsx("select",{className:`${L.select} ${r.reviewSelect}`,value:k?.id||"",onChange:n=>K(n.target.value||null),"aria-label":"Select review session",children:F.map(n=>e.jsx("option",{value:n.id,children:n.title?.trim()||"Untitled review"},n.id))}),e.jsxs("button",{type:"button",className:r.actionBtn,onClick:()=>{Ge()},disabled:p||!t.assetId,children:[e.jsx(Ve,{size:13}),"Start Review"]}),k&&e.jsxs("button",{type:"button",className:r.actionBtn,onClick:()=>{qt()},disabled:p,children:[k.status==="resolved"?e.jsx(En,{size:13}):e.jsx(Rn,{size:13}),k.status==="resolved"?"Reopen":"Resolve"]})]})]}),k&&e.jsxs("div",{className:r.reviewSessionMeta,children:[e.jsx("span",{className:`${r.statusBadge} ${k.status==="resolved"?r.reviewStatusResolved:""}`,children:k.status==="resolved"?"Resolved":"Open"}),he?e.jsxs("div",{className:r.reviewTitleEditRow,children:[e.jsx("input",{type:"text",className:L.input,value:Le,onChange:n=>De(n.target.value),placeholder:"Untitled review"}),e.jsx("button",{type:"button",className:L.secondaryHeaderBtn,onClick:()=>{Qt()},disabled:p,children:"Save Title"})]}):e.jsx("span",{className:r.reviewSessionLabel,children:k.title?.trim()||"Untitled review"}),e.jsxs("span",{className:r.reviewSessionTimestamp,children:["Updated ",Ct(k.updatedAt)]}),!he&&e.jsxs("button",{type:"button",className:r.actionBtn,onClick:()=>ye(!0),disabled:p,children:[e.jsx(Ee,{size:13}),"Rename Review"]})]}),ke&&e.jsx("div",{className:r.viewerStateError,children:ke}),e.jsxs("div",{className:M.commentPanel,children:[e.jsxs("div",{className:M.commentThread,children:[G&&e.jsx("div",{className:M.emptyComments,children:"Loading review comments…"}),!G&&!k&&e.jsx("div",{className:M.emptyComments,children:"Start a review to collect comments for this document."}),!G&&k&&k.comments.length===0&&e.jsx("div",{className:M.emptyComments,children:"No comments yet. Add the first review note for this document."}),!G&&k&&k.comments.map(n=>{const a=n.authorActor?.kind==="ai",o=Nt(n.anchor),d=a?An:In,f=ie===n.id;return e.jsxs("div",{className:`${M.comment} ${a?M.commentAi:M.commentUser}`,children:[e.jsxs("div",{className:M.commentHeader,children:[e.jsxs("span",{className:M.commentAuthor,style:n.authorActor?.color?{color:n.authorActor.color}:void 0,children:[e.jsx(d,{size:12,strokeWidth:1.5}),or(n)]}),e.jsx("span",{className:M.commentTime,children:Ct(n.updatedAt)}),e.jsxs("span",{className:r.reviewCommentActions,children:[!f&&e.jsx("button",{type:"button",className:r.reviewCommentAction,onClick:()=>Zt(n.id,n.body),disabled:p,children:"Edit"}),f&&e.jsx("button",{type:"button",className:r.reviewCommentAction,onClick:()=>{pe(null),oe("")},disabled:p,children:"Cancel"}),e.jsx("button",{type:"button",className:r.reviewCommentAction,onClick:()=>{tn(n.id)},disabled:p,children:"Delete"})]})]}),o&&e.jsx("span",{className:r.reviewAnchorLabel,children:o}),e.jsx("div",{className:M.commentText,children:f?e.jsxs("div",{className:r.reviewCommentEditor,children:[e.jsx("textarea",{className:M.commentInput,value:ge,onChange:_=>oe(_.target.value),disabled:p}),e.jsx("button",{type:"button",className:L.secondaryHeaderBtn,onClick:()=>{en()},disabled:p||!ge.trim(),children:"Save Comment"})]}):e.jsx(Re,{remarkPlugins:[Ae],rehypePlugins:[Ie],children:n.body})})]},n.id)}),e.jsx("div",{ref:ot})]}),e.jsxs("div",{className:M.commentInputArea,children:[e.jsxs("div",{className:r.reviewComposer,children:[W&&e.jsxs("div",{className:r.reviewAnchorChip,children:[e.jsx("span",{children:Nt(W)||"Selected text"}),"quote"in W&&W.quote&&e.jsxs("span",{className:r.reviewAnchorSnippet,children:['"',W.quote,'"']}),e.jsx("button",{type:"button",className:r.reviewAnchorClear,onClick:()=>Y(null),children:"Clear"})]}),e.jsx("textarea",{className:M.commentInput,placeholder:k?.status==="resolved"?"Reopen this review to add more comments…":W?"Add a comment for the selected text…":"Add a comment for this document review…",value:re,onChange:n=>me(n.target.value),disabled:p||k?.status==="resolved",onKeyDown:n=>{n.key==="Enter"&&!n.shiftKey&&(n.preventDefault(),ht())}})]}),e.jsx("button",{type:"button",className:M.sendCommentBtn,onClick:()=>{ht()},disabled:p||!re.trim()||k?.status==="resolved","aria-label":"Send review comment",title:"Send review comment",children:e.jsx($n,{size:15})})]})]})]})})]})),y&&Dt&&C!==null&&e.jsx(Qs,{content:C,docTitle:t.title,apiBaseUrl:s,onClose:()=>Me(!1),onGenerated:n=>Me(!1)}),e.jsx(on,{isOpen:Mt,onClose:()=>{Pe||Se(!1)},title:"Attach document",size:"md",footer:e.jsx("button",{className:r.actionBtn,onClick:()=>Se(!1),disabled:!!Pe,children:"Close"}),children:e.jsxs("div",{className:r.attachModalBody,children:[e.jsx("p",{className:r.attachModalCopy,children:"Attach this document to a task from the document manager. Initiative and workstream targets can be enabled later on the same attachment model."}),e.jsx("input",{type:"text",className:L.input,placeholder:"Search tasks…",value:at,onChange:n=>st(n.target.value)}),rt&&e.jsxs("div",{className:r.attachModalError,children:[e.jsx(Ye,{size:14}),e.jsx("span",{children:rt})]}),e.jsx("div",{className:`${r.attachTaskList} tf-scrollbar`,children:lt.length===0?e.jsx("div",{className:r.attachEmptyState,children:m.length===0?"No tasks are available in this workspace.":"No tasks match your search."}):lt.map(n=>{const a=t.taskId===n.id,o=Pe===n.id;return e.jsxs("button",{type:"button",className:r.attachTaskRow,disabled:o,onClick:()=>{Vt(n.id)},children:[e.jsxs("span",{className:r.attachTaskInfo,children:[e.jsx("span",{className:r.attachTaskTitle,children:n.title}),n.referenceLabel&&e.jsx("span",{className:r.attachTaskReference,children:n.referenceLabel})]}),e.jsx("span",{className:r.attachTaskMeta,children:o?"Attaching…":a?"Attached":"Attach"})]},n.id)})})]})}),!N&&e.jsx("div",{className:r.printHint,children:"For the cleanest output, disable browser Headers and footers in the print dialog."})]})}function Et(t){return typeof t=="string"?t.trim().replace(/\/+$/,""):""}function hr(t){return t.runtimeMode==="local"?"":Et(t.apiBaseUrl)||Et(t.cloudAuthBaseUrl)||""}function pr({runtimeMode:t="local",apiBaseUrl:l="",cloudAuthBaseUrl:m="",typeFilters:s,attachmentFilters:c,onTypeFiltersChange:u,onAttachmentFiltersChange:w,requestedDocPath:y=null,requestedDocAssetId:v=null,onRequestedDocHandled:b}){const[h,g]=i.useState([]),[O,T]=i.useState(!0),[C,D]=i.useState(null),[E,I]=i.useState(null),[z,H]=i.useState(""),[q,Q]=i.useState(()=>cn.map(p=>p.value)),[x,j]=i.useState(()=>ln.map(p=>p.value)),F=hr({runtimeMode:t,apiBaseUrl:l,cloudAuthBaseUrl:m}),B=s??q,G=c??x,se=u??Q,ke=w??j,R=i.useCallback(async()=>{T(!0),D(null);try{const p=await P("/api/taskforce/documents",{credentials:"include"},F);if(!p.ok)throw new Error(`Failed to load documents (${p.status})`);const $=await p.json(),W=Array.isArray($.documents)?$.documents:[];W.length,g(W)}catch(p){D(p?.message||"Failed to load documents"),p?.message}finally{T(!1)}},[F,t]);i.useEffect(()=>{R()},[R]);const ee=i.useMemo(()=>na(h,z,B,G),[G,h,z,B]),K=i.useMemo(()=>E?h.find(p=>p.id===E)??null:null,[h,E]);i.useEffect(()=>{if(!y&&!v||h.length===0)return;const p=y?Xe(y):"",$=String(v||"").trim().toLowerCase()||St(y),W=h.find(Y=>{const he=St(Y.fsPath)||String(Y.assetId||"").trim().toLowerCase()||null;return $&&he&&he===$?!0:p?ta(Xe(Y.fsPath),p):!1});W&&(I(W.id),b?.())},[h,b,v,y]),i.useEffect(()=>{if(!((y||v)&&!K)){if(ee.length===0){E!==null&&I(null);return}K&&ee.some(p=>p.id===K.id)||I(ee[0].id)}},[ee,v,y,K,E]);const re=i.useCallback(async()=>{I(null),await R()},[R]),me=z.trim().length>0||B.length>0||G.length>0;return{documentApiBaseUrl:F,documents:h,filteredDocs:ee,loading:O,error:C,selectedDoc:K,searchQuery:z,typeFilters:B,attachmentFilters:G,hasActiveFilters:me,setSearchQuery:H,handleTypeFiltersChange:se,handleAttachmentFiltersChange:ke,fetchDocuments:R,selectDoc:p=>I(p?.id??null),handleDeleteSelected:re}}function fr({tasks:t,apiBaseUrl:l="",documents:m,loading:s,error:c,selectedDoc:u,searchQuery:w,hasActiveFilters:y,documentTrayOpen:v,onSearchChange:b,onSelectDoc:h,onRefresh:g,onCloseDocumentTray:O,onDeleteSelected:T,onBackToTask:C,enableTaskGeneration:D=!1}){const E=new Map(t.map(H=>[H.id,H])),I=typeof v=="boolean",z=e.jsx(oa,{documents:m,selectedDocId:u?.id??null,loading:s,error:c,searchQuery:w,onSearchChange:b,onSelect:H=>h(H),onCloseTray:I?O:void 0,taskById:E,hasActiveFilters:y});return e.jsxs("div",{className:`${L.docWorkspace} ${I?L.docWorkspaceTrayMode:""} ${I&&v?L.docWorkspaceTrayOpen:""}`.trim(),children:[I?e.jsx("div",{className:`${L.docTrayPanel} ${v?L.docTrayPanelOpen:""}`.trim(),"aria-hidden":!v,children:z}):e.jsx("div",{className:L.docIndexPanel,children:z}),e.jsx("div",{className:L.docViewerPanel,children:u?e.jsx(mr,{doc:u,taskTitle:u.taskId?E.get(u.taskId)?.title??null:null,tasks:t,apiBaseUrl:l,onSaved:H=>g(),onDeleted:()=>{T()},onBackToTask:C,enableTaskGeneration:D}):!s&&e.jsx("div",{className:L.docViewerEmpty,children:e.jsx("p",{className:"tf-empty-copy",children:m.length===0?"No documents match your current filters.":"Select a document to view it."})})})]})}function br({tasks:t,runtimeMode:l="local",apiBaseUrl:m="",cloudAuthBaseUrl:s="",typeFilters:c,attachmentFilters:u,onTypeFiltersChange:w,onAttachmentFiltersChange:y,documentTrayOpen:v,onCloseDocumentTray:b,requestedDocPath:h=null,requestedDocAssetId:g=null,onRequestedDocHandled:O,onBackToTask:T,enableTaskGeneration:C=!1}){const{documentApiBaseUrl:D,filteredDocs:E,loading:I,error:z,selectedDoc:H,searchQuery:q,hasActiveFilters:Q,setSearchQuery:x,fetchDocuments:j,selectDoc:F,handleDeleteSelected:B}=pr({runtimeMode:l,apiBaseUrl:m,cloudAuthBaseUrl:s,typeFilters:c,attachmentFilters:u,onTypeFiltersChange:w,onAttachmentFiltersChange:y,requestedDocPath:h,requestedDocAssetId:g,onRequestedDocHandled:O}),G=ve.useRef(v);return ve.useEffect(()=>{const se=G.current===!0;G.current=v,!(v!==!0||se)&&j()},[v,j]),e.jsx(fr,{tasks:t,apiBaseUrl:D,documents:E,loading:I,error:z,selectedDoc:H,searchQuery:q,hasActiveFilters:Q,documentTrayOpen:v,onSearchChange:x,onSelectDoc:F,onRefresh:j,onCloseDocumentTray:b,onDeleteSelected:B,onBackToTask:T,enableTaskGeneration:C})}export{ln as DOCUMENT_ATTACHMENT_FILTER_OPTIONS,cn as DOCUMENT_TYPE_FILTER_OPTIONS,fr as DocumentWorkspace,br as DocumentWorkspaceShell};
@@ -0,0 +1 @@
1
+ ._thread_1mrb3_1{display:flex;flex-direction:column;gap:10px}._empty_1mrb3_7{text-align:center;color:var(--text-muted, #6b7280);font-size:13px;padding:32px 0;font-style:italic;opacity:.7;letter-spacing:.01em}._item_1mrb3_17{display:flex;flex-direction:column;max-width:calc(100% - 12px);gap:3px}._comment_1mrb3_24{animation:_fadeIn_1mrb3_1 .2s ease-out}._commentAgent_1mrb3_28{align-self:flex-start}._commentMember_1mrb3_32{align-self:flex-end}._event_1mrb3_36{align-self:stretch;max-width:100%;gap:6px;animation:_fadeIn_1mrb3_1 .2s ease-out}._eventSystem_1mrb3_43{opacity:.92}._header_1mrb3_47{display:flex;gap:8px;align-items:center;font-size:11px;margin-bottom:2px}._commentAgent_1mrb3_28 ._header_1mrb3_47{margin-left:2px}._commentMember_1mrb3_32 ._header_1mrb3_47{margin-right:2px;flex-direction:row-reverse}._eventHeader_1mrb3_64{margin:0;flex-direction:row;justify-content:space-between;gap:10px}._author_1mrb3_71{display:flex;align-items:center;gap:4px;font-weight:600;color:var(--text-secondary, #9ca3af)}._time_1mrb3_79{color:var(--text-tertiary, #6b7280)}._commentText_1mrb3_83{padding:10px 14px;border-radius:16px;font-size:14px;line-height:1.5;position:relative;word-break:break-word;box-shadow:0 2px 8px #00000026}._commentText_1mrb3_83 p{margin:0}._commentText_1mrb3_83 p+p{margin-top:8px}._commentAgent_1mrb3_28 ._commentText_1mrb3_83{background:linear-gradient(135deg,#06b6d426,#3b82f61f);border:1px solid rgba(6,182,212,.2);color:var(--text-primary, #fff);border-top-left-radius:4px}._commentMember_1mrb3_32 ._commentText_1mrb3_83{background:linear-gradient(135deg,#8b5cf633,#7c3aed26);border:1px solid rgba(139,92,246,.3);color:var(--text-primary, #fff);border-top-right-radius:4px}._eventText_1mrb3_123{color:var(--text-secondary, #cbd5e1);font-size:13px;line-height:1.45}._eventChanges_1mrb3_129{display:grid;gap:4px;margin-top:6px}._eventChange_1mrb3_129{padding-left:8px;border-left:2px solid var(--border-strong);color:var(--text-helper);font-size:12px;line-height:1.35}
@@ -0,0 +1 @@
1
+ import{R as k,j as t}from"./vendor-react-CKJs5o3c.js";import{S as A,U as N,V as E,W as I,X as S,Y as M}from"./index-607WPo_X.js";import"./vendor-icons-B32hGuF2.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";const $="_thread_1mrb3_1",z="_empty_1mrb3_7",P="_item_1mrb3_17",H="_comment_1mrb3_24",R="_commentAgent_1mrb3_28",B="_commentMember_1mrb3_32",W="_event_1mrb3_36",K="_eventSystem_1mrb3_43",w="_header_1mrb3_47",D="_eventHeader_1mrb3_64",F="_author_1mrb3_71",O="_time_1mrb3_79",U="_commentText_1mrb3_83",X="_eventText_1mrb3_123",Y="_eventChanges_1mrb3_129",q="_eventChange_1mrb3_129",e={thread:$,empty:z,item:P,comment:H,commentAgent:R,commentMember:B,event:W,eventSystem:K,header:w,eventHeader:D,author:F,time:O,commentText:U,eventText:X,eventChanges:Y,eventChange:q};function v(c,m){const r=c.replace("#","").trim();if(r.length!==3&&r.length!==6)return"";const i=r.length===3?r.split("").map(l=>l+l).join(""):r,a=Number.parseInt(i,16);if(Number.isNaN(a))return"";const _=a>>16&255,g=a>>8&255,u=a&255;return`rgba(${_}, ${g}, ${u}, ${m})`}function ee({activity:c,comments:m,formatFieldValue:r,resolveActorPresentation:i,onOpenTaskById:a,emptyMessage:_="No activity yet.",listClassName:g,emptyClassName:u,endRef:l}){const b=k.useMemo(()=>A({activity:c,comments:m}),[c,m]);return t.jsxs("div",{className:[e.thread,g].filter(Boolean).join(" "),children:[b.length===0?t.jsx("div",{className:[e.empty,u].filter(Boolean).join(" "),children:_}):null,b.map(n=>{if(n.type==="comment"){const o=i({actorId:n.comment.author,actorType:n.comment.actor?.kind==="ai"?"ai":n.comment.actor?.kind==="human"?"human":null,actorProfile:n.comment.actor||null}),x=o.kind==="agent"?"agent":"member",{ActorIcon:f}=o,s=o.color,T=s&&v(s,.35)?{background:`linear-gradient(135deg, ${v(s,.18)} 0%, ${v(s,.1)} 100%)`,borderColor:v(s,.35)}:void 0;return t.jsxs("div",{className:[e.item,e.comment,x==="agent"?e.commentAgent:e.commentMember].join(" "),children:[t.jsxs("div",{className:e.header,children:[t.jsxs("span",{className:e.author,style:s?{color:s}:void 0,children:[t.jsx(f,{size:12,strokeWidth:1.5}),o.label]}),t.jsx("span",{className:e.time,children:N(n.comment.timestamp,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})})]}),t.jsx("div",{className:e.commentText,style:T,children:t.jsx(E,{onTaskIdClick:a,children:n.comment.text})})]},n.id)}const d=i({actorId:n.event.actor,actorType:n.event.actorType,actorProfile:n.event.actorProfile||null,fallbackKind:"system"}),{ActorIcon:C}=d,y=d.color,h=Object.entries(n.event.details?.changes||{}),p=I(n.event),j=h.length>1&&p?h.filter(([o])=>o!==p):h.length>1?h:[];return t.jsxs("div",{className:[e.item,e.event,d.kind==="system"?e.eventSystem:""].filter(Boolean).join(" "),children:[t.jsxs("div",{className:[e.header,e.eventHeader].join(" "),children:[t.jsxs("span",{className:e.author,style:y?{color:y}:void 0,children:[t.jsx(C,{size:12,strokeWidth:1.5}),d.label]}),t.jsx("span",{className:e.time,children:N(n.event.createdAt,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})})]}),t.jsxs("div",{className:e.eventText,children:[t.jsx("div",{children:S(n.event,r)}),j.length>0?t.jsx("div",{className:e.eventChanges,children:j.map(([o,x])=>t.jsx("div",{className:e.eventChange,children:M(o,x,r)},o))}):null]})]},n.id)}),t.jsx("div",{ref:l})]})}export{ee as EntityActivityTimeline};
@@ -1 +1 @@
1
- import{r as i,j as s}from"./vendor-react-CKJs5o3c.js";import{t as e}from"./index-C6k75jr8.js";import{h as g,Z as v,b as j,k as f}from"./vendor-icons-DuEd_65c.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";function T({initiativeTemplates:n,onRefreshInitiativeTemplates:u,onCreateInitiativeFromTemplate:l}){const[a,o]=i.useState(""),[c,x]=i.useState(""),[d,m]=i.useState(!1),[r,p]=i.useState(null);return i.useEffect(()=>{if(!a&&n.length>0){const t=n[0];o(t.id)}},[n,a]),s.jsx("div",{className:`${e.standalonePage} ${e.standaloneContent}`,style:{overflow:"auto"},children:s.jsx("div",{className:e.settingsContent,style:{maxWidth:900,margin:"0 auto",width:"100%"},children:s.jsxs("div",{className:e.settingGroup,children:[s.jsxs("div",{className:e.settingTitleRow,children:[s.jsx("h2",{className:e.settingTitle,children:"Initiatives"}),s.jsx("button",{className:e.copyBtn,onClick:()=>{u?.()},children:"Refresh"})]}),s.jsx("p",{className:`${e.settingsHint} ${e.marginBottom12}`,children:"Create initiative-ready planning structures from reusable templates."}),s.jsxs("div",{className:e.exportItem,children:[s.jsx("label",{className:e.label,children:"Template"}),s.jsx("select",{className:e.input,value:a,onChange:t=>{const h=t.target.value;o(h)},children:n.map(t=>s.jsx("option",{value:t.id,children:t.name},t.id))})]}),s.jsxs("div",{className:`${e.exportItem} ${e.marginTop12}`,children:[s.jsx("label",{className:e.label,children:"Initiative Title"}),s.jsx("input",{className:e.input,placeholder:"e.g. Taskforce Private Beta Launch",value:c,onChange:t=>x(t.target.value)})]}),s.jsxs("button",{className:`${e.secondaryHeaderBtn} ${e.marginTop12}`,disabled:d||!a||!c.trim()||!l,onClick:async()=>{if(!l)return;m(!0);const t=await l({templateId:a,title:c.trim()});m(!1),p({type:t.success?"success":"error",message:t.success?"Initiative created from template.":t.error||"Failed to create initiative."})},children:[d?s.jsx(g,{size:14,className:e.spinner}):s.jsx(v,{size:14}),"Create Initiative"]}),r&&s.jsxs("div",{className:`${r.type==="success"?e.successMessage:e.errorMessage} ${e.marginTop12}`,children:[r.type==="success"?s.jsx(j,{size:14}):s.jsx(f,{size:14}),r.message]})]})})})}export{T as InitiativesModule};
1
+ import{r as i,j as s}from"./vendor-react-CKJs5o3c.js";import{t as e}from"./index-607WPo_X.js";import{h as g,Z as v,b as j,m as f}from"./vendor-icons-B32hGuF2.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";function T({initiativeTemplates:n,onRefreshInitiativeTemplates:u,onCreateInitiativeFromTemplate:l}){const[a,o]=i.useState(""),[c,x]=i.useState(""),[d,m]=i.useState(!1),[r,p]=i.useState(null);return i.useEffect(()=>{if(!a&&n.length>0){const t=n[0];o(t.id)}},[n,a]),s.jsx("div",{className:`${e.standalonePage} ${e.standaloneContent}`,style:{overflow:"auto"},children:s.jsx("div",{className:e.settingsContent,style:{maxWidth:900,margin:"0 auto",width:"100%"},children:s.jsxs("div",{className:e.settingGroup,children:[s.jsxs("div",{className:e.settingTitleRow,children:[s.jsx("h2",{className:e.settingTitle,children:"Initiatives"}),s.jsx("button",{className:e.copyBtn,onClick:()=>{u?.()},children:"Refresh"})]}),s.jsx("p",{className:`${e.settingsHint} ${e.marginBottom12}`,children:"Create initiative-ready planning structures from reusable templates."}),s.jsxs("div",{className:e.exportItem,children:[s.jsx("label",{className:e.label,children:"Template"}),s.jsx("select",{className:e.input,value:a,onChange:t=>{const h=t.target.value;o(h)},children:n.map(t=>s.jsx("option",{value:t.id,children:t.name},t.id))})]}),s.jsxs("div",{className:`${e.exportItem} ${e.marginTop12}`,children:[s.jsx("label",{className:e.label,children:"Initiative Title"}),s.jsx("input",{className:e.input,placeholder:"e.g. Taskforce Private Beta Launch",value:c,onChange:t=>x(t.target.value)})]}),s.jsxs("button",{className:`${e.secondaryHeaderBtn} ${e.marginTop12}`,disabled:d||!a||!c.trim()||!l,onClick:async()=>{if(!l)return;m(!0);const t=await l({templateId:a,title:c.trim()});m(!1),p({type:t.success?"success":"error",message:t.success?"Initiative created from template.":t.error||"Failed to create initiative."})},children:[d?s.jsx(g,{size:14,className:e.spinner}):s.jsx(v,{size:14}),"Create Initiative"]}),r&&s.jsxs("div",{className:`${r.type==="success"?e.successMessage:e.errorMessage} ${e.marginTop12}`,children:[r.type==="success"?s.jsx(j,{size:14}):s.jsx(f,{size:14}),r.message]})]})})})}export{T as InitiativesModule};
@@ -0,0 +1 @@
1
+ import{r as a,j as e}from"./vendor-react-CKJs5o3c.js";import{H as pe,t as Ue,J as Fe,K as we,L as me,N as de,O as Ve,Q as Oe}from"./index-607WPo_X.js";import{aI as De,h as Ke,U as He}from"./vendor-icons-B32hGuF2.js";import{u as Ye,a as ze}from"./vendor-router-BbWMxlnO.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";const qe="_plansWrapper_6hvnk_1",We="_contentFrame_6hvnk_28",Ge="_shellOwnsScroll_6hvnk_36",Qe="_withChrome_6hvnk_42",Je="_siteVariant_6hvnk_46",Xe="_title_6hvnk_54",Ze="_subtitle_6hvnk_66",et="_header_6hvnk_70",tt="_planCard_6hvnk_82",nt="_grid_6hvnk_95",rt="_planName_6hvnk_101",at="_featureText_6hvnk_108",st="_currentBadge_6hvnk_112",it="_navAction_6hvnk_116",ot="_backBtn_6hvnk_117",ct="_priceRows_6hvnk_128",lt="_headerBar_6hvnk_145",ut="_headerActions_6hvnk_154",mt="_debugMeta_6hvnk_183",dt="_clickablePlanCard_6hvnk_212",pt="_activePlanCard_6hvnk_227",ft="_planDescription_6hvnk_262",gt="_callToAction_6hvnk_291",ht="_primaryCta_6hvnk_303",yt="_secondaryCta_6hvnk_314",_t="_currentCta_6hvnk_326",vt="_featuresList_6hvnk_340",kt="_priceRow_6hvnk_128",St="_priceRowAmount_6hvnk_366",Ct="_priceRowInterval_6hvnk_372",bt="_ctaRow_6hvnk_377",wt="_featureItem_6hvnk_383",xt="_featureIcon_6hvnk_389",It="_featureLimitAccent_6hvnk_403",Nt="_featureLimitUnit_6hvnk_414",Pt="_featureTextBlock_6hvnk_420",jt="_featureDescription_6hvnk_426",Rt="_emptyState_6hvnk_432",Tt="_marketingEmptyState_6hvnk_441",At="_emptyBadge_6hvnk_469",Bt="_emptyHighlights_6hvnk_484",Et="_loader_6hvnk_506",Lt="_spinner_6hvnk_516",$t="_statusBanner_6hvnk_569",Mt="_successBanner_6hvnk_577",Ut="_infoBanner_6hvnk_583",Ft="_errorBanner_6hvnk_589",r={plansWrapper:qe,contentFrame:We,shellOwnsScroll:Ge,withChrome:Qe,siteVariant:Je,title:Xe,subtitle:Ze,header:et,planCard:tt,grid:nt,planName:rt,featureText:at,currentBadge:st,navAction:it,backBtn:ot,priceRows:ct,headerBar:lt,headerActions:ut,debugMeta:mt,clickablePlanCard:dt,activePlanCard:pt,planDescription:ft,callToAction:gt,primaryCta:ht,secondaryCta:yt,currentCta:_t,featuresList:vt,priceRow:kt,priceRowAmount:St,priceRowInterval:Ct,ctaRow:bt,featureItem:wt,featureIcon:xt,featureLimitAccent:It,featureLimitUnit:Nt,featureTextBlock:Pt,featureDescription:jt,emptyState:Rt,marketingEmptyState:Tt,emptyBadge:At,emptyHighlights:Bt,loader:Et,spinner:Lt,statusBanner:$t,successBanner:Mt,infoBanner:Ut,errorBanner:Ft};function Vt(){const n=globalThis.__DEBUG_MODE__;return typeof n=="boolean"?n:!1}function Ot(n){const i=String(n?.environment||"").trim(),c=String(n?.runtimeMode||"").trim();return!i&&!c?null:i&&c?`${i} (${c})`:i||c||null}function Dt(n,i){if(n==null||!i)return"Contact Sales";try{return new Intl.NumberFormat("en-US",{style:"currency",currency:i.toUpperCase(),minimumFractionDigits:0}).format(n/100)}catch{return`${i.toUpperCase()} ${n/100}`}}function Kt(){return"$0.00"}function Pe(n){return n?n.pricingType==="free"?!0:n.unitAmount!=null&&n.currency!=null:!1}function je(n){return n?n.pricingType==="free"?Kt():Dt(n.unitAmount,n.currency):"Unavailable"}function Re(n){const i=[n.pricing.month,n.pricing.year].filter(Boolean);if(i.some(u=>u.pricingType==="free"))return 0;const c=i.map(u=>u.pricingType==="stripe"&&typeof u.unitAmount=="number"?u.unitAmount:null).filter(u=>u!=null);return c.length>0?Math.min(...c):Number.POSITIVE_INFINITY}function Ht(n){return String(n||"").replace(/[_\-.]+/g," ").replace(/\b\w/g,i=>i.toUpperCase())}function xe(n,i){const c=n?.[i],u=Number(c);return Number.isFinite(u)?Math.max(1,Math.floor(u)):null}function Yt(n,i){const c=String(n.publicLabel||n.label||"").trim()||Ht(n.featureKey),u=n.config&&typeof n.config=="object"?n.config:{};if(n.featureKey==="context.uploads"){const g=xe(u,"storageLimitMb");if(g!==null)return{limitValue:String(g),limitUnit:"MB",baseLabel:c}}if(n.featureKey==="workspace.workspaces"){const g=xe(u,"maxWorkspaces");if(g!==null)return{limitValue:String(g),limitUnit:"x",baseLabel:c}}if(n.featureKey==="collaboration.ai_profiles"){const g=xe(u,"maxAiProfiles");if(g!==null)return{limitValue:String(g),limitUnit:"x",baseLabel:c}}if(n.featureKey==="collaboration.team_management"){const g=Number(i);if(Number.isFinite(g)&&g>0)return{limitValue:String(Math.floor(g)),limitUnit:"x",baseLabel:c}}return{limitValue:null,limitUnit:null,baseLabel:c}}function zt({heading:n,subtitle:i,variant:c="app",chrome:u,footer:g,isAuthenticated:D,authSessionResolved:Ce=!0,currentPlanId:ae,currentPlanVersionId:J,currentEntitlementState:X,markCurrentPlan:K,canManageCurrentPlan:H=!0,pricingEndpoint:se,statusBanner:b,onBack:Z,backLabel:P,backDisabled:j=!1,topActions:A,shellOwnsScroll:ie=!1,showPageBackButton:fe=!0,showHeaderBarWithChrome:ee=!1,currentPlanCardActionMode:Y="manage",fallbackPricingSource:oe=null,onSelectPlan:z}){const[m,ce]=a.useState([]),[q,$]=a.useState(null),[le,L]=a.useState({pageTitle:null,pageDescription:null}),[R,T]=a.useState(!0),[te,M]=a.useState(null),[ge,he]=a.useState(0);a.useEffect(()=>{let o=!0;return(async()=>{const v=String(se||"/api/taskforce/public/pricing").trim()||"/api/taskforce/public/pricing";o&&(T(!0),M(null));try{const S=await fetch(v,{method:"GET",credentials:"include"}),d=await S.json().catch(()=>({}));if(S.ok){o&&(ce(Array.isArray(d?.plans)?d.plans:[]),$(d?.pricingSource&&typeof d.pricingSource=="object"?d.pricingSource:null),L({pageTitle:typeof d?.pageTitle=="string"&&d.pageTitle.trim()||null,pageDescription:typeof d?.pageDescription=="string"&&d.pageDescription.trim()||null}));return}throw new Error(String(d?.error||`Failed to load pricing (${S.status})`))}catch(S){if(o){const d=S instanceof Error?S.message:"Failed to load pricing";M(d||"Failed to load pricing"),$(null),L({pageTitle:null,pageDescription:null})}}finally{o&&T(!1)}})(),()=>{o=!1}},[se,ge]);const V=a.useMemo(()=>[...m].sort((o,h)=>{const v=Re(o),S=Re(h);if(v!==S)return v-S;const d=o.defaultVersion?.versionNumber||0,y=h.defaultVersion?.versionNumber||0;return d!==y?d-y:String(o.displayName||o.planId).localeCompare(String(h.displayName||h.planId))}),[m]),O=a.useMemo(()=>Ot(q||oe),[oe,q]),ye=String(le.pageTitle||n).trim()||n,_e=String(le.pageDescription||i||"").trim(),W=Ce,k=`${r.plansWrapper} ${ie?r.shellOwnsScroll:"tf-scrollbar"} ${c==="site"?r.siteVariant:""} ${u?r.withChrome:""}`.trim(),ne=o=>ie?e.jsxs(e.Fragment,{children:[u,o,g]}):e.jsxs("div",{className:Ue.standaloneWrapper,"data-theme":"dark",children:[u,o,g]});return ne(R?e.jsx(e.Fragment,{children:e.jsx("div",{className:k,children:e.jsx("div",{className:r.contentFrame,children:e.jsxs("div",{className:r.loader,children:[e.jsx(Ke,{size:48,className:r.spinner}),e.jsx("p",{children:"Loading plans..."})]})})})}):te?e.jsx(e.Fragment,{children:e.jsx("div",{className:k,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:te}),e.jsx("button",{className:r.backBtn,onClick:()=>he(o=>o+1),children:"Retry"})]})})})}):e.jsx(e.Fragment,{children:e.jsx("div",{className:k,children:e.jsxs("div",{className:r.contentFrame,children:[e.jsxs("div",{className:r.header,children:[(!u||ee)&&(fe||A)&&e.jsxs("div",{className:r.headerBar,children:[e.jsx("div",{children:fe?e.jsx("button",{className:r.backBtn,onClick:Z,disabled:j,children:P}):null}),e.jsx("div",{className:r.headerActions,children:A})]}),e.jsx("h1",{className:r.title,children:ye}),_e&&e.jsx("p",{className:r.subtitle,children:_e}),Vt()&&O?e.jsxs("p",{className:r.debugMeta,children:["Pricing source: ",O]}):null,b&&e.jsx("div",{className:`${r.statusBanner} ${b.type==="success"?r.successBanner:b.type==="info"?r.infoBanner:r.errorBanner}`,children:b.message})]}),V.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.jsx("div",{className:r.grid,children:V.map(o=>{const h=o.pricing.month,v=o.pricing.year,S=Pe(h),d=Pe(v),y=String(o.defaultVersion?.planVersionId||"").trim(),I=pe(X),ue=K??I,G=!!(y&&J&&J===y)||!!(!J&&(ae&&ae===o.planId)),E=ue&&G&&X!=="canceled",U=S?"month":d?"year":null,Q=U==="year"?v:h,re=Y==="manage",be=Y==="indicator",F=W&&!!y&&(E?re&&H:!!U),ve=()=>{if(y){if(E){if(!re||!H)return;z({planId:o.planId,planVersionId:y,interval:U||"month",pricingType:Q?.pricingType||"stripe",isCurrentPlan:!0});return}U&&z({planId:o.planId,planVersionId:y,interval:U,pricingType:Q?.pricingType||"stripe",isCurrentPlan:!1})}};return e.jsxs("div",{className:`${r.planCard} ${E?r.activePlanCard:""} ${F?r.clickablePlanCard:""}`,"data-testid":`plan-card-${o.planId}`,role:F?"button":void 0,tabIndex:F?0:void 0,onClick:F?ve:void 0,onKeyDown:F?C=>{(C.key==="Enter"||C.key===" ")&&(C.preventDefault(),ve())}:void 0,children:[E&&e.jsx("span",{className:r.currentBadge,children:"Current Plan"}),e.jsx("h3",{className:r.planName,children:o.displayName}),String(o.description||"").trim()&&e.jsx("p",{className:r.planDescription,children:String(o.description||"").trim()}),e.jsx("div",{className:r.featuresList,children:Array.isArray(o.features)&&o.features.length>0?o.features.map((C,t)=>e.jsxs("div",{className:r.featureItem,children:[e.jsx(De,{className:r.featureIcon}),e.jsxs("div",{className:r.featureTextBlock,children:[(()=>{const{limitValue:s,limitUnit:f,baseLabel:l}=Yt(C,o.defaultVersion?.seatLimit);return e.jsxs("span",{className:r.featureText,children:[s&&e.jsxs("span",{className:r.featureLimitAccent,children:[e.jsx("span",{children:s}),f?e.jsx("span",{className:f==="MB"?r.featureLimitUnit:void 0,children:f}):null]}),e.jsx("span",{children:s?` ${l}`:l})]})})(),String(C.publicDescription||C.description||"").trim()&&e.jsx("span",{className:r.featureDescription,children:String(C.publicDescription||C.description||"").trim()})]})]},`${C.featureKey}-${t}`)):e.jsx("span",{className:r.featureText,children:"No additional features included"})}),S||d?e.jsxs("div",{className:r.priceRows,children:[S?e.jsxs("div",{className:r.priceRow,children:[e.jsx("span",{className:r.priceRowAmount,children:je(h)}),e.jsx("span",{className:r.priceRowInterval,children:"/ month"})]}):null,d?e.jsxs("div",{className:r.priceRow,children:[e.jsx("span",{className:r.priceRowAmount,children:je(v)}),e.jsx("span",{className:r.priceRowInterval,children:"/ year"})]}):null]}):null,E?re?e.jsx("button",{className:`${r.callToAction} ${r.currentCta}`,"data-testid":`plan-manage-${o.planId}`,onClick:C=>{C.stopPropagation(),H&&z({planId:o.planId,planVersionId:y,interval:U||"month",pricingType:Q?.pricingType||"stripe",isCurrentPlan:!0})},disabled:!y||!H||!W,children:D&&H?"Manage Plan":"Current Plan"}):be?e.jsx("button",{className:`${r.callToAction} ${r.currentCta}`,"data-testid":`plan-current-${o.planId}`,disabled:!0,children:"Current Plan"}):null:e.jsxs("div",{className:r.ctaRow,children:[S?e.jsx("button",{className:`${r.callToAction} ${r.secondaryCta}`,"data-testid":`plan-select-${o.planId}-month`,onClick:C=>{C.stopPropagation(),z({planId:o.planId,planVersionId:y,interval:"month",pricingType:h?.pricingType||"stripe",isCurrentPlan:!1})},disabled:!y||!W,children:h?.pricingType==="free"?D?"Select Free":"Get Started Free":D?"Choose Monthly":"Get Started Monthly"}):null,d?e.jsx("button",{className:`${r.callToAction} ${r.primaryCta}`,"data-testid":`plan-select-${o.planId}-year`,onClick:C=>{C.stopPropagation(),z({planId:o.planId,planVersionId:y,interval:"year",pricingType:v?.pricingType||"stripe",isCurrentPlan:!1})},disabled:!y||!W,children:v?.pricingType==="free"?D?"Select Free":"Get Started Free":D?"Choose Yearly":"Get Started Yearly"}):null]})]},o.planId)})})]})})}))}const qt=1600,Te=[0,500,1e3,2e3],Wt=5e3,Gt=45e3,Qt="Choose a plan to continue.";function Jt(n,i){if(n===401)return!0;const c=String(i||"").trim().toUpperCase();return c==="CHECKOUT_SESSION_INCOMPLETE"||c==="CHECKOUT_PLAN_VERSION_UNRESOLVED"}function Xt(n){return n==="year"?"year":"month"}function Ie(n){const i=String(n||"").trim().toLowerCase();return i==="year"?"year":i==="month"?"month":null}function Ae(n){const i=String(n||"").trim();return i?i.replace(/\/+$/,""):""}function Ne(n={}){const i=new URLSearchParams;i.set("screen","plans");for(const[c,u]of Object.entries(n)){const g=String(u||"").trim();g&&i.set(c,g)}return`/?${i.toString()}`}function ln({isAuthenticated:n,authUserId:i,runtimeMode:c,authSessionResolved:u,currentTheme:g="dark",projectName:D,currentWorkspaceId:Ce,apiBaseUrl:ae,connectedEnvironmentSource:J,resolveCloudAuthUrl:X,embedded:K=!1,shellOwnsScroll:H=!1,onAccountProfileSummaryChange:se,onContinueToTaskforce:b,continueBusy:Z=!1}){const P=Ye(),j=ze(),[A,ie]=a.useState(null),[fe,ee]=a.useState(!1),[Y,oe]=a.useState(!1),[z,m]=a.useState(null),ce=a.useRef(!1),q=a.useRef(null),$=a.useRef(null),le=a.useRef(b),L=a.useMemo(()=>new URLSearchParams(j.search),[j.search]),R=String(L.get("checkout")||"").trim().toLowerCase(),T=String(L.get("gate")||"").trim().toLowerCase(),te=String(L.get("planId")||"").trim(),M=String(L.get("planVersionId")||"").trim(),ge=Xt(L.get("interval")),he=Ie(L.get("interval")),V=String(L.get("session_id")||"").trim(),O=a.useMemo(()=>Ae(ae),[ae]),ye=a.useMemo(()=>Ae(J),[J]),_e=a.useMemo(()=>({environment:Fe(ye||O),runtimeMode:c==="cloud"?"cloud":"local"}),[O,ye,c]),W=a.useCallback(t=>{const s=String(t||"").trim();return O?`${O}${s.startsWith("/")?s:`/${s}`}`:s},[O]),k=a.useCallback(t=>X?X(t):W(t),[W,X]),ne=a.useCallback(()=>{const t=new URLSearchParams(j.search);t.delete("screen"),t.delete("gate"),t.delete("checkout"),t.delete("planId"),t.delete("planVersionId"),t.delete("interval");const s=t.toString();P(`/${s?`?${s}`:""}${j.hash||""}`)},[j.hash,j.search,P]),o=a.useMemo(()=>k("/api/taskforce/public/pricing"),[k]),h=a.useMemo(()=>we(A,T),[A,T]),v=a.useMemo(()=>h.allowReturnToApp,[h.allowReturnToApp]),S=a.useMemo(()=>{const t=String(h.message||"").trim();return!t||t===Qt?null:t},[h.message]),d=a.useCallback(()=>{const t=new URLSearchParams(j.search);t.delete("checkout"),t.delete("session_id"),t.delete("gate"),t.delete("planId"),t.delete("planVersionId"),t.delete("interval");const s=t.toString();P(`${j.pathname}${s?`?${s}`:""}${j.hash||""}`,{replace:!0})},[j.hash,j.pathname,j.search,P]),y=a.useCallback(()=>{$.current!=null&&window.clearTimeout($.current),$.current=window.setTimeout(()=>{d(),$.current=null},qt)},[d]);a.useEffect(()=>{le.current=b},[b]);const I=a.useCallback(async t=>{const s=k(me);if(!n)return ie(null),de(s,{identityKey:i}),null;try{const f=await Ve(s,{identityKey:i,force:t?.force===!0});return ie(f),se?.(f),f}catch{return null}},[i,k,n,se]),ue=a.useCallback((t,s,f)=>{const l=String(s||"").trim();if(f?.preferFallback&&l)return l;const _=we(t,T).message;return _||l||"Unable to confirm checkout completion."},[T]),G=a.useCallback((t,s)=>!we(t,s).allowReturnToApp,[]),E=a.useCallback(async(t,s,f)=>{if(!t){m({type:"error",message:"Selected plan is missing a default plan version."});return}ee(!0),m(null);try{const l=await fetch(k("/api/taskforce/billing/checkout-session"),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({planVersionId:t,interval:s})}),_=await l.json().catch(()=>({}));if(!l.ok){m({type:"error",message:String(_?.error||"Unable to start checkout for selected plan.")});return}const p=String(_?.checkoutState||"").trim().toLowerCase();if(p==="free"){m({type:"success",message:"Plan selected. Your access is ready."}),de(k(me),{identityKey:i});const x=await I({force:!0}),N=String(x?.entitlementState||"").trim().toLowerCase();f?.autoContinueOnActivation===!0&&pe(N)&&await b?.();return}if(p==="updated"){m({type:"success",message:String(_?.message||"Your subscription was updated successfully.")}),de(k(me),{identityKey:i});const x=await I({force:!0}),N=String(x?.entitlementState||"").trim().toLowerCase();f?.autoContinueOnActivation===!0&&pe(N)&&await b?.();return}if(p==="already_current_plan"){m({type:"success",message:String(_?.message||"You are already on this plan.")}),de(k(me),{identityKey:i}),await I();return}const B=String(_?.returnBaseUrl||"").trim();if(c==="local"&&B)try{const x=window.location.origin,N=new URL(B,x).origin;if(N!==x){m({type:"error",message:`Checkout return is misconfigured for this runtime. Expected ${x} but got ${N}.`});return}}catch{m({type:"error",message:"Checkout return URL is invalid for this runtime."});return}const w=String(_?.url||"").trim();if(!w){m({type:"error",message:"Checkout did not return a redirect URL."});return}window.location.assign(w)}catch{m({type:"error",message:"Unable to start checkout for selected plan."})}finally{ee(!1)}},[i,k,I,b,c]),U=a.useCallback(async(t,s)=>{if(!t)return{confirmed:!1,errorMessage:"Checkout session is missing.",retryable:!1};const f=async()=>{de(k(me),{identityKey:i});const l=await I({force:!0}),_=String(l?.entitlementState||"").trim().toLowerCase();if(!pe(_))return!1;const p=te,B=M,w=he,x=String(l?.planId||"").trim(),N=String(l?.planVersionId||"").trim(),ke=Ie(l?.billingInterval??null),Se=s?.preConfirmationSummary??null,Be=String(Se?.entitlementState||"").trim().toLowerCase(),Ee=pe(Be),Le=String(Se?.planId||"").trim(),$e=String(Se?.planVersionId||"").trim(),Me=Ie(Se?.billingInterval??null);return p&&x&&x!==p||B&&N&&N!==B||w&&ke&&ke!==w||Ee&&!(!!p&&x===p&&Le!==x)&&!(!!B&&N===B&&$e!==N)&&!(!!w&&ke===w&&Me!==ke)?!1:(s?.autoContinueOnActivation===!0&&await le.current?.(),!0)};try{const l=await fetch(k("/api/taskforce/billing/checkout-session/confirm"),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:t})}),_=await l.json().catch(()=>({}));if(!l.ok){const p=String(_?.code||"").trim(),B=Jt(l.status,p);return B&&await f()?{confirmed:!0}:{confirmed:!1,errorMessage:String(_?.error||"Unable to confirm checkout completion."),retryable:B}}return await f()?{confirmed:!0}:{confirmed:!0}}catch{return{confirmed:!1,errorMessage:"Unable to confirm checkout completion.",retryable:!0}}},[i,k,I,he,te,M]),Q=a.useCallback(async()=>{if(!n){P(`/login?mode=login&next=${encodeURIComponent(Ne())}`);return}ee(!0),m({type:"info",message:"Opening billing portal..."});try{const t=await fetch(k("/api/taskforce/billing/portal-session"),{method:"POST",credentials:"include"}),s=await t.json().catch(()=>({}));if(!t.ok){m({type:"error",message:String(s?.error||"Failed to open billing portal.")});return}const f=String(s?.url||"").trim();if(!f){m({type:"error",message:"Portal session did not return a redirect URL."});return}window.location.assign(f)}catch{m({type:"error",message:"Failed to open billing portal."})}finally{ee(!1)}},[k,n,P]),re=a.useCallback(async()=>{if(!(!b||Y||Z)){oe(!0);try{await b()}finally{oe(!1)}}},[Y,Z,b]);a.useEffect(()=>{I()},[I]),a.useEffect(()=>{v&&T==="missing_entitlement"&&d()},[d,T,v]),a.useEffect(()=>()=>{$.current!=null&&window.clearTimeout($.current)},[]),a.useEffect(()=>{R!=="success"&&(q.current=null)},[R]),a.useEffect(()=>{let t=!1;const s=new Set,f=async l=>{l<=0||await new Promise(_=>{const p=window.setTimeout(()=>{s.delete(p),_()},l);s.add(p)})};if(R==="success"){if(ce.current=!0,m({type:"success",message:"Checkout completed successfully. Finalizing your plan..."}),!n&&!u)return()=>{t=!0,s.forEach(p=>window.clearTimeout(p)),s.clear()};if(!n)return m({type:"error",message:"Sign in to finish activating your plan."}),()=>{t=!0,s.forEach(p=>window.clearTimeout(p)),s.clear()};const _=V||"__missing_session__";return q.current===_?()=>{t=!0,s.forEach(p=>window.clearTimeout(p)),s.clear()}:((async()=>{const p=Date.now(),B=await I({force:!0});if(t)return;let w=V?{confirmed:!1,errorMessage:"Unable to confirm checkout completion.",retryable:!0}:{confirmed:!1,errorMessage:"Checkout session is missing.",retryable:!1},x=0;for(;;){const N=x<Te.length?Te[x]:Wt;if(x+=1,await f(N),t||(w=V?await U(V,{autoContinueOnActivation:G(B,T),preConfirmationSummary:B}):{confirmed:!1,errorMessage:"Checkout session is missing.",retryable:!1},t))return;if(w.confirmed){q.current=_,m({type:"success",message:"Checkout completed successfully."}),y();return}if(!w.retryable||Date.now()-p>=Gt)break}if(!t&&!w.confirmed){const N=await I({force:!0});if(t)return;w.retryable||(q.current=_),m({type:"error",message:ue(N,w.errorMessage,{preferFallback:!w.retryable})}),w.retryable||y();return}})(),()=>{t=!0,s.forEach(p=>window.clearTimeout(p)),s.clear()})}if(R==="cancel"){(async()=>{const l=await I({force:!0});m({type:"error",message:ue(l,"Checkout was canceled. No charge was made.")}),y()})();return}if((R==="start"||R==="free")&&n&&M&&!ce.current){ce.current=!0,(async()=>{const l=await I({force:!0});await E(M,ge,{autoContinueOnActivation:G(l,T)})})();return}},[u,R,U,T,n,I,ge,M,V,ue,y,G,E]),a.useEffect(()=>{if(!(R==="success"||R==="cancel"||R==="start"||R==="free")){if(S){m({type:h.statusTone,message:S});return}m(t=>!t||t.type!=="error"?t:t.message===h.message?null:t)}},[R,S,h.message,h.statusTone]);const be=a.useCallback(async t=>{if(!n){const f=t.pricingType==="free"?"free":"start",l=Ne({checkout:f,planId:t.planId,planVersionId:t.planVersionId,interval:t.interval});P(`/login?mode=register&planId=${encodeURIComponent(t.planId)}&planVersionId=${encodeURIComponent(t.planVersionId)}&interval=${encodeURIComponent(t.interval)}&next=${encodeURIComponent(l)}`);return}if(t.isCurrentPlan){if(!A?.stripeCustomerId){m({type:"success",message:"Your current plan does not use Stripe billing."});return}await Q();return}const s=G(A,T);if(t.pricingType==="free"){await E(t.planVersionId,t.interval,{autoContinueOnActivation:s});return}await E(t.planVersionId,t.interval,{autoContinueOnActivation:s})},[A,T,n,P,Q,G,E]),F=a.useCallback(()=>{if(v&&b){re();return}if(K){ne();return}if(window.history.length>1){P(-1);return}P("/")},[ne,K,re,v,P,b]),ve=K?null:e.jsxs(e.Fragment,{children:[e.jsx("button",{className:r.navAction,onClick:F,disabled:Z||Y||n&&!v,children:v?"Take Me to Taskforce":"Back"}),n&&A?.stripeCustomerId&&e.jsx("button",{className:r.navAction,onClick:()=>{Q()},disabled:fe,children:"Manage billing"}),!n&&e.jsxs("button",{className:r.navAction,onClick:()=>P(`/login?mode=login&next=${encodeURIComponent(Ne())}`),children:[e.jsx(He,{size:16,style:{marginRight:"8px",verticalAlign:"text-bottom"}}),"Sign In"]})]}),C=K?null:e.jsx(Oe,{projectName:D,currentWorkspaceId:Ce,runtimeMode:c==="cloud"?"cloud":"local",theme:g,onBrandClick:F,actions:ve});return e.jsx(zt,{chrome:C,heading:"Subscription Plans",subtitle:"Manage your subscription and explore available features. Your current plan is highlighted below.",isAuthenticated:n,authSessionResolved:u,currentPlanId:String(A?.planId||te||"").trim()||null,currentPlanVersionId:String(A?.planVersionId||M||"").trim()||null,currentEntitlementState:String(A?.entitlementState||"").trim()||null,markCurrentPlan:h.markCurrentPlan,canManageCurrentPlan:!!A?.stripeCustomerId,pricingEndpoint:o,statusBanner:z,onBack:F,backLabel:v?"Take Me to Taskforce":K?"Back to Board":"Back to App",backDisabled:Z||Y||n&&!v,topActions:null,shellOwnsScroll:H,showPageBackButton:!1,showHeaderBarWithChrome:!1,currentPlanCardActionMode:"manage",fallbackPricingSource:_e,onSelectPlan:be})}export{ln as PlansPage};
@@ -0,0 +1 @@
1
+ ._plansWrapper_6hvnk_1{--plans-accent: var(--brand-primary, #6366f1);--plans-accent-strong: var(--brand-primary-strong, #7c3aed);--plans-accent-soft: var(--brand-primary-soft, rgba(99, 102, 241, .1));--plans-accent-border: var(--brand-primary-border, rgba(99, 102, 241, .24));--plans-surface: color-mix(in srgb, var(--surface-panel) 84%, var(--surface-page));--plans-surface-elevated: color-mix(in srgb, var(--surface-elevated) 88%, var(--surface-panel));--plans-surface-strong: color-mix(in srgb, var(--surface-page) 70%, var(--surface-panel));--plans-shadow: 0 22px 44px rgba(0, 0, 0, .18);overflow-y:auto;display:flex;flex-direction:column;align-items:stretch;align-self:stretch;width:100%;flex:1;min-height:100%;min-width:0;padding:64px 24px;box-sizing:border-box;background:radial-gradient(900px 520px at 18% -4%,color-mix(in srgb,var(--plans-accent) 18%,transparent),transparent 62%),radial-gradient(780px 480px at 88% 2%,color-mix(in srgb,var(--brand-cloud-accent, #dd6b20) 12%,transparent),transparent 60%),linear-gradient(180deg,color-mix(in srgb,var(--surface-page) 94%,var(--surface-panel)),var(--surface-page));scrollbar-gutter:stable}._contentFrame_6hvnk_28{width:min(1100px,100%);max-width:1100px;margin:0 auto;display:flex;flex-direction:column}._shellOwnsScroll_6hvnk_36{overflow:visible;min-height:100%;scrollbar-gutter:auto}._withChrome_6hvnk_42{padding-top:32px}._siteVariant_6hvnk_46{background:radial-gradient(1200px 700px at 20% -10%,rgba(56,189,248,.25),transparent 60%),radial-gradient(900px 600px at 90% 0%,rgba(45,212,191,.18),transparent 65%),linear-gradient(150deg,#0b1022,#111936);padding:56px 24px 80px}._siteVariant_6hvnk_46 ._title_6hvnk_54{background:none;-webkit-text-fill-color:var(--text-primary);color:var(--text-primary);font-size:clamp(34px,6vw,58px);font-family:var(--font-brand);font-style:italic;text-transform:uppercase;letter-spacing:-.03em;margin-bottom:0}._siteVariant_6hvnk_46 ._subtitle_6hvnk_66{color:#a6b3d9}._siteVariant_6hvnk_46 ._header_6hvnk_70{width:100%;max-width:1040px;border:1px solid rgba(203,213,255,.2);border-radius:20px;padding:42px 28px;background:#090e208c;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);text-align:left;margin-bottom:20px}._siteVariant_6hvnk_46 ._planCard_6hvnk_82{background:#090e20b3;border-color:#cbd5ff33;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);border-radius:16px;padding:22px 20px}._siteVariant_6hvnk_46 ._planCard_6hvnk_82:hover{transform:translateY(-3px);box-shadow:none}._siteVariant_6hvnk_46 ._grid_6hvnk_95{max-width:1040px;gap:12px;grid-template-columns:repeat(3,minmax(0,1fr))}._siteVariant_6hvnk_46 ._planName_6hvnk_101{font-size:22px;font-family:var(--font-brand);font-style:italic;text-transform:uppercase}._siteVariant_6hvnk_46 ._featureText_6hvnk_108{color:#a6b3d9}._siteVariant_6hvnk_46 ._currentBadge_6hvnk_112{font-size:11px}._siteVariant_6hvnk_46 ._navAction_6hvnk_116,._siteVariant_6hvnk_46 ._backBtn_6hvnk_117{border:1px solid rgba(203,213,255,.2);background:#141d3c99;color:#f6f8ff}._siteVariant_6hvnk_46 ._backBtn_6hvnk_117:hover,._siteVariant_6hvnk_46 ._navAction_6hvnk_116:hover{background:#141d3cd9}._siteVariant_6hvnk_46 ._priceRows_6hvnk_128{border-top-color:#cbd5ff33}._header_6hvnk_70{width:100%;text-align:left;margin-bottom:32px;padding:32px;border-radius:28px;border:1px solid var(--border-default);background:linear-gradient(180deg,color-mix(in srgb,var(--plans-surface-elevated) 92%,transparent),color-mix(in srgb,var(--plans-surface) 96%,transparent)),var(--plans-surface);box-shadow:var(--plans-shadow)}._headerBar_6hvnk_145{width:100%;display:flex;justify-content:space-between;align-items:center;gap:16px;margin-bottom:24px}._headerActions_6hvnk_154{display:flex;align-items:center;justify-content:flex-end;gap:12px;flex-wrap:wrap}._title_6hvnk_54{font-size:clamp(38px,5vw,54px);font-weight:800;font-family:var(--font-brand);font-style:italic;text-transform:uppercase;margin-bottom:16px;background:linear-gradient(135deg,var(--text-primary),color-mix(in srgb,var(--plans-accent) 72%,var(--text-primary)));background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;letter-spacing:-.04em;line-height:.98}._subtitle_6hvnk_66{font-size:18px;color:var(--text-secondary);line-height:1.7}._debugMeta_6hvnk_183{margin-top:16px;font-size:13px;color:var(--text-secondary);opacity:.8}._grid_6hvnk_95{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:20px;width:100%}._planCard_6hvnk_82{background:linear-gradient(180deg,color-mix(in srgb,var(--plans-surface-elevated) 90%,transparent),color-mix(in srgb,var(--plans-surface) 96%,transparent)),var(--plans-surface);border:1px solid var(--border-default);border-radius:22px;padding:28px;display:flex;flex-direction:column;position:relative;overflow:hidden;box-shadow:0 12px 28px #0000001f;transition:transform .24s ease,box-shadow .24s ease,border-color .24s ease,background .24s ease}._clickablePlanCard_6hvnk_212{cursor:pointer}._clickablePlanCard_6hvnk_212:focus-visible{outline:2px solid var(--plans-accent);outline-offset:4px}._planCard_6hvnk_82:hover{transform:translateY(-4px);border-color:var(--plans-accent-border);box-shadow:0 20px 36px #0000002e}._activePlanCard_6hvnk_227{border:1px solid color-mix(in srgb,var(--plans-accent) 38%,var(--border-default));background:linear-gradient(180deg,color-mix(in srgb,var(--plans-accent) 10%,var(--plans-surface-elevated)),color-mix(in srgb,var(--plans-accent) 4%,var(--plans-surface))),var(--plans-surface);box-shadow:0 18px 34px #0000002e,inset 0 0 0 1px color-mix(in srgb,var(--plans-accent) 16%,transparent)}._currentBadge_6hvnk_112{position:absolute;top:20px;right:20px;background:color-mix(in srgb,var(--plans-accent) 16%,var(--surface-page));color:var(--plans-accent-strong);font-size:12px;font-weight:700;padding:6px 12px;border-radius:999px;border:1px solid color-mix(in srgb,var(--plans-accent) 26%,transparent);text-transform:uppercase;letter-spacing:.08em}._planName_6hvnk_101{font-size:28px;font-weight:700;font-family:var(--font-brand);font-style:italic;text-transform:uppercase;color:var(--text-primary);margin-bottom:14px}._planDescription_6hvnk_262{margin:-4px 0 18px;color:var(--text-secondary);font-size:15px;line-height:1.45;max-width:34ch}._priceDisplay_6hvnk_270{margin-bottom:32px;display:flex;align-items:baseline;gap:8px}._priceAmount_6hvnk_277{font-size:56px;font-weight:800;color:var(--text-primary);letter-spacing:-2px;line-height:1}._priceInterval_6hvnk_285{font-size:16px;color:var(--text-secondary);font-weight:500}._callToAction_6hvnk_291{width:100%;padding:14px 18px;border-radius:12px;font-size:15px;font-weight:600;border:1px solid transparent;cursor:pointer;transition:all .2s ease;margin-bottom:0}._primaryCta_6hvnk_303{background:var(--button-primary-bg);border-color:var(--button-primary-border);color:var(--button-primary-text, white)}._primaryCta_6hvnk_303:hover{transform:translateY(-1px);box-shadow:0 10px 22px var(--brand-primary-glow)}._secondaryCta_6hvnk_314{background:var(--button-secondary-bg);color:var(--button-secondary-text);border-color:var(--button-secondary-border)}._secondaryCta_6hvnk_314:hover{background:var(--button-secondary-hover-bg);border-color:var(--button-secondary-hover-border);color:var(--button-secondary-hover-text)}._currentCta_6hvnk_326{background:color-mix(in srgb,var(--plans-accent) 9%,var(--plans-surface-strong));color:var(--text-primary);border-color:color-mix(in srgb,var(--plans-accent) 24%,var(--border-default));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--plans-accent) 10%,transparent);cursor:pointer}._currentCta_6hvnk_326:hover{background:color-mix(in srgb,var(--plans-accent) 14%,var(--plans-surface-strong));border-color:color-mix(in srgb,var(--plans-accent) 32%,var(--border-default));transform:translateY(-1px)}._featuresList_6hvnk_340{flex:1;display:flex;flex-direction:column;gap:20px;margin-bottom:28px}._priceRows_6hvnk_128{display:flex;flex-direction:column;gap:10px;margin-top:auto;margin-bottom:16px;border-top:1px solid var(--border-default);padding-top:16px}._priceRow_6hvnk_128{display:flex;align-items:baseline;justify-content:flex-end;gap:10px;text-align:right}._priceRowAmount_6hvnk_366{font-size:22px;font-weight:700;color:var(--text-primary)}._priceRowInterval_6hvnk_372{color:var(--text-secondary);font-weight:600}._ctaRow_6hvnk_377{display:grid;grid-template-columns:1fr;gap:10px}._featureItem_6hvnk_383{display:flex;align-items:flex-start;gap:16px}._featureIcon_6hvnk_389{color:var(--plans-accent);flex-shrink:0;width:20px;height:20px;margin-top:2px}._featureText_6hvnk_108{font-size:16px;line-height:1.5;color:var(--text-primary)}._featureLimitAccent_6hvnk_403{font-family:var(--font-brand);font-style:italic;color:var(--brand-cloud-accent, #ff8a00);letter-spacing:.01em;font-size:28px;line-height:.92;display:inline-block;margin-right:6px}._featureLimitUnit_6hvnk_414{font-size:.74em;line-height:1;vertical-align:baseline}._featureTextBlock_6hvnk_420{display:flex;flex-direction:column;gap:4px}._featureDescription_6hvnk_426{font-size:13px;line-height:1.45;color:var(--text-secondary)}._emptyState_6hvnk_432{text-align:center;padding:64px;background:var(--bg-secondary);border-radius:24px;border:1px dashed var(--border-color, var(--border-primary, rgba(255, 255, 255, .14)));width:100%}._marketingEmptyState_6hvnk_441{max-width:920px;border-style:solid;border-radius:28px;padding:72px 48px;background:radial-gradient(560px 260px at 15% 10%,rgba(34,197,94,.15),transparent 60%),radial-gradient(620px 320px at 85% 0%,rgba(251,191,36,.16),transparent 62%),linear-gradient(145deg,#0f172af5,#111827eb);box-shadow:0 28px 90px #00000047}._marketingEmptyState_6hvnk_441 h2{margin:18px 0 14px;font-size:clamp(32px,4vw,52px);line-height:1.02;letter-spacing:-.04em;color:#f8fafc}._marketingEmptyState_6hvnk_441 p{margin:0 auto;max-width:680px;font-size:18px;line-height:1.7;color:#cbd5e1}._emptyBadge_6hvnk_469{display:inline-flex;align-items:center;justify-content:center;padding:8px 16px;border-radius:999px;background:#f8fafc14;border:1px solid rgba(248,250,252,.18);color:#f8fafc;font-size:12px;font-weight:800;letter-spacing:.14em;text-transform:uppercase}._emptyHighlights_6hvnk_484{display:flex;flex-wrap:wrap;justify-content:center;gap:12px;margin-top:28px}._emptyHighlights_6hvnk_484 span{display:inline-flex;align-items:center;gap:8px;padding:10px 14px;border-radius:999px;background:#94a3b81f;border:1px solid rgba(148,163,184,.18);color:#e2e8f0;font-size:13px;font-weight:700;letter-spacing:.02em}._loader_6hvnk_506{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:50vh;gap:24px;color:var(--text-secondary)}._spinner_6hvnk_516{animation:_spin_6hvnk_516 1s linear infinite;color:var(--accent-primary, #6366f1)}@keyframes _spin_6hvnk_516{0%{transform:rotate(0)}to{transform:rotate(360deg)}}._backBtn_6hvnk_117{background:var(--button-secondary-bg);border:1px solid var(--button-secondary-border);color:var(--button-secondary-text);display:flex;align-items:center;gap:8px;font-size:14px;font-weight:600;cursor:pointer;padding:10px 16px;border-radius:12px;transition:all .2s ease}._backBtn_6hvnk_117:hover{background:var(--button-secondary-hover-bg);border-color:var(--button-secondary-hover-border);color:var(--button-secondary-hover-text)}._navAction_6hvnk_116{background:var(--button-secondary-bg);border:1px solid var(--button-secondary-border);color:var(--button-secondary-text);padding:10px 20px;border-radius:12px;font-weight:600;cursor:pointer;transition:all .2s ease}._navAction_6hvnk_116:hover{background:var(--button-secondary-hover-bg);border-color:var(--button-secondary-hover-border);color:var(--button-secondary-hover-text)}._statusBanner_6hvnk_569{margin-top:24px;padding:12px 24px;border-radius:12px;font-weight:500;font-size:14px}._successBanner_6hvnk_577{background:color-mix(in srgb,var(--status-success) 12%,var(--plans-surface-elevated));color:var(--status-success);border:1px solid color-mix(in srgb,var(--status-success) 24%,transparent)}._infoBanner_6hvnk_583{background:color-mix(in srgb,var(--button-primary-bg) 10%,var(--plans-surface-elevated));color:var(--text-secondary);border:1px solid color-mix(in srgb,var(--button-primary-bg) 18%,transparent)}._errorBanner_6hvnk_589{background:color-mix(in srgb,var(--status-error) 12%,var(--plans-surface-elevated));color:var(--status-error);border:1px solid color-mix(in srgb,var(--status-error) 24%,transparent)}@media(max-width:768px){._plansWrapper_6hvnk_1{padding:28px 14px}._withChrome_6hvnk_42{padding-top:24px}._header_6hvnk_70{margin-bottom:24px;padding:22px 18px}._headerBar_6hvnk_145{gap:10px;flex-wrap:wrap;margin-bottom:18px}._title_6hvnk_54{font-size:34px;margin-bottom:12px}._grid_6hvnk_95{grid-template-columns:1fr;gap:18px}._siteVariant_6hvnk_46 ._grid_6hvnk_95{grid-template-columns:1fr}._siteVariant_6hvnk_46 ._header_6hvnk_70{padding:26px 18px}._planCard_6hvnk_82{padding:22px}._marketingEmptyState_6hvnk_441{padding:56px 24px}._marketingEmptyState_6hvnk_441 h2{font-size:34px}._marketingEmptyState_6hvnk_441 p{font-size:16px}._headerActions_6hvnk_154{width:100%;justify-content:flex-start}}
@@ -0,0 +1 @@
1
+ import{j as s}from"./vendor-react-CKJs5o3c.js";import{ContextAttachmentManager as c}from"./ContextAttachmentManager-D2epuNnG.js";import"./index-607WPo_X.js";import"./vendor-icons-B32hGuF2.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";import"./documentReferences-DPZuTgHh.js";function R(t){const{taskId:e,taskReferenceLabel:o,workspaceId:n,apiBaseUrl:a,contextFiles:r,onAddContextFile:m,onRemoveContextFile:p,onUpdateContextCaption:i}=t;return s.jsx(c,{ownerType:"task",ownerId:e,ownerReferenceLabel:o,workspaceId:n,apiBaseUrl:a,attachments:r,onAddAttachment:m,onRemoveAttachment:p,onUpdateAttachmentCaption:i})}export{R as TaskContextUpload};