@taskforcehq/taskforce 0.3.304 → 0.3.306

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 (383) hide show
  1. package/README.md +140 -247
  2. package/dist/Taskforce.module.css +295 -89
  3. package/dist/TaskforceCore.js +378 -111
  4. package/dist/TaskforceCore.test.js +1221 -107
  5. package/dist/assets/fonts/CourierPrime-Bold.woff2 +0 -0
  6. package/dist/assets/fonts/CourierPrime-BoldItalic.woff2 +0 -0
  7. package/dist/assets/fonts/CourierPrime-Italic.woff2 +0 -0
  8. package/dist/assets/fonts/CourierPrime-Regular.woff2 +0 -0
  9. package/dist/assets/fonts/Noir_medium.woff2 +0 -0
  10. package/dist/assets/fonts/Noir_regular.woff2 +0 -0
  11. package/dist/assets/fonts/RussoOne-Regular.woff2 +0 -0
  12. package/dist/assets/fonts/SpecialElite-Regular.woff2 +0 -0
  13. package/dist/compat/workspaceSyncCompat.js +52 -2
  14. package/dist/compat/workspaceSyncCompat.test.js +38 -1
  15. package/dist/components/context/ContextAttachmentManager.d.ts +14 -0
  16. package/dist/components/context/ContextAttachmentManager.js +549 -0
  17. package/dist/components/features/AgentsModule.d.ts +10 -1
  18. package/dist/components/features/AgentsModule.js +260 -15
  19. package/dist/components/features/AgentsModule.test.js +255 -5
  20. package/dist/components/features/DocumentIndex.d.ts +1 -1
  21. package/dist/components/features/DocumentIndex.js +1 -1
  22. package/dist/components/features/DocumentViewer.d.ts +6 -2
  23. package/dist/components/features/DocumentViewer.js +90 -10
  24. package/dist/components/features/DocumentWorkspace.d.ts +5 -22
  25. package/dist/components/features/DocumentWorkspace.js +12 -155
  26. package/dist/components/features/DocumentWorkspace.test.js +226 -6
  27. package/dist/components/features/TaskSettings.js +29 -3
  28. package/dist/components/features/TaskSettings.test.js +42 -1
  29. package/dist/components/features/documentWorkspaceModel.d.ts +24 -0
  30. package/dist/components/features/documentWorkspaceModel.js +57 -0
  31. package/dist/components/features/useDocumentWorkspaceController.d.ts +34 -0
  32. package/dist/components/features/useDocumentWorkspaceController.js +113 -0
  33. package/dist/components/task/TaskCard.js +19 -28
  34. package/dist/components/task/TaskCard.test.js +38 -3
  35. package/dist/components/task/TaskContextUpload.js +4 -526
  36. package/dist/components/task/TaskForm.d.ts +8 -8
  37. package/dist/components/task/TaskForm.js +362 -230
  38. package/dist/components/task/TaskForm.test.js +558 -381
  39. package/dist/components/task/TaskKanban.d.ts +2 -1
  40. package/dist/components/task/TaskKanban.js +96 -14
  41. package/dist/components/task/TaskKanban.test.js +36 -0
  42. package/dist/components/ui/EditableAvatarButton.d.ts +18 -0
  43. package/dist/components/ui/EditableAvatarButton.js +18 -0
  44. package/dist/components/views/PlanComparisonPage.d.ts +9 -1
  45. package/dist/components/views/PlanComparisonPage.js +70 -17
  46. package/dist/components/views/PlanComparisonPage.test.js +289 -41
  47. package/dist/components/views/PlansPage.js +239 -106
  48. package/dist/components/views/PlansPage.test.js +593 -42
  49. package/dist/components/views/StandaloneLayout.js +310 -554
  50. package/dist/components/views/panels/FilterToolbar.test.js +6 -4
  51. package/dist/components/views/panels/PlanningDrawer.d.ts +8 -1
  52. package/dist/components/views/panels/PlanningDrawer.js +18 -11
  53. package/dist/components/views/panels/PlanningDrawer.test.d.ts +1 -0
  54. package/dist/components/views/panels/PlanningDrawer.test.js +141 -0
  55. package/dist/components/views/planningScope.d.ts +20 -0
  56. package/dist/components/views/planningScope.js +25 -0
  57. package/dist/components/views/planningScope.test.d.ts +1 -0
  58. package/dist/components/views/planningScope.test.js +60 -0
  59. package/dist/components/views/standalone/modals/AccountHubModal.d.ts +27 -14
  60. package/dist/components/views/standalone/modals/AccountHubModal.js +87 -15
  61. package/dist/components/views/standalone/modals/AccountHubModal.test.js +42 -2
  62. package/dist/components/views/standalone/modals/AvatarImageManagerModal.d.ts +20 -0
  63. package/dist/components/views/standalone/modals/AvatarImageManagerModal.js +127 -0
  64. package/dist/components/views/standalone/modals/EditProfileModal.d.ts +2 -9
  65. package/dist/components/views/standalone/modals/EditProfileModal.js +3 -2
  66. package/dist/components/views/standalone/modals/SyncEnableWarningModal.d.ts +9 -0
  67. package/dist/components/views/standalone/modals/SyncEnableWarningModal.js +6 -0
  68. package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.d.ts +1 -0
  69. package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.js +24 -0
  70. package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +2 -1
  71. package/dist/components/views/standalone/modals/SyncStatusModal.js +2 -2
  72. package/dist/config/envSchema.js +1 -1
  73. package/dist/core/AiProfileService.d.ts +45 -3
  74. package/dist/core/AiProfileService.js +774 -63
  75. package/dist/core/AiProfileService.test.js +22 -2
  76. package/dist/core/AiProfiles.test.js +761 -2
  77. package/dist/core/AttachmentLinkService.js +57 -15
  78. package/dist/core/AuthIdentityService.d.ts +107 -0
  79. package/dist/core/AuthIdentityService.js +284 -0
  80. package/dist/core/AuthTokenService.d.ts +4 -0
  81. package/dist/core/AuthTokenService.js +34 -6
  82. package/dist/core/AuthTokenService.test.d.ts +1 -0
  83. package/dist/core/AuthTokenService.test.js +78 -0
  84. package/dist/core/EntitlementsPolicy.test.js +77 -15
  85. package/dist/core/GlobalSettingsService.js +115 -6
  86. package/dist/core/PlanEntitlementService.d.ts +30 -3
  87. package/dist/core/PlanEntitlementService.js +454 -93
  88. package/dist/core/PlanFeatureCatalog.test.d.ts +1 -0
  89. package/dist/core/PlanFeatureCatalog.test.js +84 -0
  90. package/dist/core/PlanVersionPolicy.test.js +54 -28
  91. package/dist/core/PlanningEntities.test.js +52 -0
  92. package/dist/core/SignupMonetizationSettings.test.js +241 -44
  93. package/dist/core/SyncReconciliationService.js +2 -65
  94. package/dist/core/SystemAdmin.test.js +244 -88
  95. package/dist/core/TaskAttachmentsCanonical.test.js +51 -1
  96. package/dist/core/TaskTaxonomyValidation.test.js +53 -0
  97. package/dist/core/Taskforce.d.ts +228 -14
  98. package/dist/core/Taskforce.js +814 -201
  99. package/dist/core/Taskforce.listTasksSlim.test.d.ts +1 -0
  100. package/dist/core/Taskforce.listTasksSlim.test.js +91 -0
  101. package/dist/core/UserProfileAvatarDrafts.test.js +30 -3
  102. package/dist/core/WorkspaceLifecycleService.js +0 -5
  103. package/dist/core/WorkspacePermissions.test.js +25 -1
  104. package/dist/core/WorkspacePlanMode.test.js +128 -27
  105. package/dist/core/shared.d.ts +3 -1
  106. package/dist/core/shared.js +16 -1
  107. package/dist/core/types.d.ts +68 -2
  108. package/dist/hooks/auth/useTaskforceAuthBootstrap.js +26 -1
  109. package/dist/hooks/sync/auth.js +3 -1
  110. package/dist/hooks/sync/bootstrap.js +2 -0
  111. package/dist/hooks/sync/controlPlane.d.ts +37 -0
  112. package/dist/hooks/sync/controlPlane.js +78 -0
  113. package/dist/hooks/sync/controlPlane.test.d.ts +1 -0
  114. package/dist/hooks/sync/controlPlane.test.js +121 -0
  115. package/dist/hooks/sync/lifecyclePolicy.d.ts +45 -0
  116. package/dist/hooks/sync/lifecyclePolicy.js +93 -0
  117. package/dist/hooks/sync/lifecyclePolicy.test.d.ts +1 -0
  118. package/dist/hooks/sync/lifecyclePolicy.test.js +124 -0
  119. package/dist/hooks/sync/orchestratorShared.d.ts +10 -1
  120. package/dist/hooks/sync/orchestratorShared.js +68 -47
  121. package/dist/hooks/sync/orchestratorShared.test.js +50 -1
  122. package/dist/hooks/sync/pullLifecycle.d.ts +31 -0
  123. package/dist/hooks/sync/pullLifecycle.js +24 -0
  124. package/dist/hooks/sync/pullLifecycle.test.d.ts +1 -0
  125. package/dist/hooks/sync/pullLifecycle.test.js +80 -0
  126. package/dist/hooks/sync/recovery.d.ts +16 -2
  127. package/dist/hooks/sync/recovery.js +171 -53
  128. package/dist/hooks/sync/recovery.test.d.ts +1 -0
  129. package/dist/hooks/sync/recovery.test.js +292 -0
  130. package/dist/hooks/sync/transfers.d.ts +16 -3
  131. package/dist/hooks/sync/transfers.js +186 -65
  132. package/dist/hooks/sync/transfers.test.d.ts +1 -0
  133. package/dist/hooks/sync/transfers.test.js +396 -0
  134. package/dist/hooks/sync/useRecentSyncEvents.d.ts +21 -0
  135. package/dist/hooks/sync/useRecentSyncEvents.js +92 -0
  136. package/dist/hooks/sync/useRecentSyncEvents.test.d.ts +1 -0
  137. package/dist/hooks/sync/useRecentSyncEvents.test.js +124 -0
  138. package/dist/hooks/sync/useSyncStatusActions.d.ts +30 -0
  139. package/dist/hooks/sync/useSyncStatusActions.js +88 -0
  140. package/dist/hooks/sync/useSyncStatusActions.test.d.ts +1 -0
  141. package/dist/hooks/sync/useSyncStatusActions.test.js +133 -0
  142. package/dist/hooks/sync/useSyncStatusControls.d.ts +25 -0
  143. package/dist/hooks/sync/useSyncStatusControls.js +60 -0
  144. package/dist/hooks/sync/useSyncStatusControls.test.d.ts +1 -0
  145. package/dist/hooks/sync/useSyncStatusControls.test.js +88 -0
  146. package/dist/hooks/useSyncOrchestrator.aiProfiles.test.js +12 -0
  147. package/dist/hooks/useSyncOrchestrator.d.ts +16 -6
  148. package/dist/hooks/useSyncOrchestrator.js +424 -175
  149. package/dist/hooks/useSyncOrchestrator.retry-closure.test.js +487 -10
  150. package/dist/hooks/useTaskData.js +8 -3
  151. package/dist/hooks/useTaskData.test.js +45 -0
  152. package/dist/hooks/useTaskMutations.d.ts +2 -1
  153. package/dist/hooks/useTaskMutations.js +12 -1
  154. package/dist/hooks/useTaskMutations.test.js +30 -1
  155. package/dist/hooks/useTaskforce.d.ts +65 -4
  156. package/dist/hooks/useTaskforce.js +564 -243
  157. package/dist/hooks/useTaskforce.runtime-routing.test.d.ts +1 -0
  158. package/dist/hooks/useTaskforce.runtime-routing.test.js +152 -0
  159. package/dist/hooks/useTaskforce.sync-behavior.test.js +2454 -208
  160. package/dist/hooks/useWorkspaceSyncController.d.ts +4 -1
  161. package/dist/hooks/useWorkspaceSyncController.js +17 -2
  162. package/dist/hooks/useWorkspaceSyncController.test.js +1 -0
  163. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.d.ts +16 -0
  164. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +316 -35
  165. package/dist/localization/locales/en-US.d.ts +0 -1
  166. package/dist/localization/locales/en-US.js +0 -1
  167. package/dist/localization/locales/es-419.js +0 -1
  168. package/dist/localization/locales/pt-BR.js +0 -1
  169. package/dist/mcp/adminWorkspaceRegistrar.d.ts +2 -0
  170. package/dist/mcp/adminWorkspaceRegistrar.js +154 -0
  171. package/dist/mcp/collaborationRegistrar.d.ts +2 -0
  172. package/dist/mcp/collaborationRegistrar.js +71 -0
  173. package/dist/mcp/documentAssetRegistrar.d.ts +2 -0
  174. package/dist/mcp/documentAssetRegistrar.js +346 -0
  175. package/dist/mcp/runtime.d.ts +2 -0
  176. package/dist/mcp/runtime.js +2433 -3534
  177. package/dist/mcp/runtime.test.js +440 -2
  178. package/dist/mcp/taskPlanningRegistrar.d.ts +2 -0
  179. package/dist/mcp/taskPlanningRegistrar.js +418 -0
  180. package/dist/mcp/toolCatalog.d.ts +35 -0
  181. package/dist/mcp/toolCatalog.js +3 -0
  182. package/dist/migrations/taskSchemaMigrations.d.ts +1 -1
  183. package/dist/migrations/taskSchemaMigrations.js +171 -61
  184. package/dist/migrations/taskSchemaMigrations.test.js +15 -0
  185. package/dist/resources/templates/workflow-sources/workflowDocs.mjs +6 -6
  186. package/dist/resources/templates/workflows/collaborate.yaml +1 -1
  187. package/dist/resources/templates/workflows/evaluate.yaml +2 -2
  188. package/dist/resources/templates/workflows/plan.yaml +1 -1
  189. package/dist/resources/templates/workflows/review.yaml +2 -2
  190. package/dist/server/annotatedAttachmentsRoutes.test.js +3 -3
  191. package/dist/server/auth/providers/apple.d.ts +33 -0
  192. package/dist/server/auth/providers/apple.js +82 -0
  193. package/dist/server/auth/providers/appleClientSecret.d.ts +37 -0
  194. package/dist/server/auth/providers/appleClientSecret.js +65 -0
  195. package/dist/server/auth/providers/github.d.ts +26 -0
  196. package/dist/server/auth/providers/github.js +86 -0
  197. package/dist/server/auth/providers/google.d.ts +21 -0
  198. package/dist/server/auth/providers/google.js +56 -0
  199. package/dist/server/auth/providers/types.d.ts +21 -0
  200. package/dist/server/auth/providers/types.js +1 -0
  201. package/dist/server/auth.d.ts +2 -0
  202. package/dist/server/auth.js +6 -3
  203. package/dist/server/documentReviewRoutes.test.js +36 -3
  204. package/dist/server/index.cookieProxy.test.js +1 -0
  205. package/dist/server/index.d.ts +12 -0
  206. package/dist/server/index.js +120 -9
  207. package/dist/server/index.rateLimit.test.js +3 -0
  208. package/dist/server/index.test.js +106 -3
  209. package/dist/server/routes/admin.d.ts +4 -5
  210. package/dist/server/routes/admin.js +410 -80
  211. package/dist/server/routes/annotatedAttachments.d.ts +1 -1
  212. package/dist/server/routes/annotatedAttachments.js +1 -1
  213. package/dist/server/routes/auth.d.ts +16 -6
  214. package/dist/server/routes/auth.js +1015 -118
  215. package/dist/server/routes/authSupport.d.ts +30 -0
  216. package/dist/server/routes/authSupport.js +81 -0
  217. package/dist/server/routes/billing.d.ts +1 -1
  218. package/dist/server/routes/billing.js +276 -34
  219. package/dist/server/routes/billing.test.js +760 -52
  220. package/dist/server/routes/documentReviews.d.ts +1 -1
  221. package/dist/server/routes/documentReviews.js +1 -1
  222. package/dist/server/routes/documents.d.ts +5 -2
  223. package/dist/server/routes/documents.js +242 -74
  224. package/dist/server/routes/primitives.d.ts +11 -0
  225. package/dist/server/routes/primitives.js +73 -0
  226. package/dist/server/routes/resources.d.ts +1 -1
  227. package/dist/server/routes/resources.js +1 -1
  228. package/dist/server/routes/shared.d.ts +29 -3
  229. package/dist/server/routes/shared.js +69 -4
  230. package/dist/server/routes/sync.d.ts +1 -1
  231. package/dist/server/routes/sync.integration.test.js +437 -39
  232. package/dist/server/routes/sync.js +62 -606
  233. package/dist/server/routes/syncAuxRoutes.d.ts +15 -0
  234. package/dist/server/routes/syncAuxRoutes.js +91 -0
  235. package/dist/server/routes/syncAuxRoutes.test.d.ts +1 -0
  236. package/dist/server/routes/syncAuxRoutes.test.js +158 -0
  237. package/dist/server/routes/syncPullApplyRoutes.d.ts +36 -0
  238. package/dist/server/routes/syncPullApplyRoutes.js +204 -0
  239. package/dist/server/routes/syncPushRoutes.d.ts +24 -0
  240. package/dist/server/routes/syncPushRoutes.js +212 -0
  241. package/dist/server/routes/syncRouteGuards.d.ts +36 -0
  242. package/dist/server/routes/syncRouteGuards.js +67 -0
  243. package/dist/server/routes/syncRouteGuards.test.d.ts +1 -0
  244. package/dist/server/routes/syncRouteGuards.test.js +94 -0
  245. package/dist/server/routes/syncRouteTypes.d.ts +13 -0
  246. package/dist/server/routes/syncRouteTypes.js +1 -0
  247. package/dist/server/routes/syncSnapshotRoutes.d.ts +66 -0
  248. package/dist/server/routes/syncSnapshotRoutes.js +180 -0
  249. package/dist/server/routes/tasks.d.ts +1 -1
  250. package/dist/server/routes/tasks.js +44 -2
  251. package/dist/server/routes/workspaces.d.ts +1 -1
  252. package/dist/server/routes/workspaces.js +37 -6
  253. package/dist/server/routes.d.ts +2 -9
  254. package/dist/server/routes.js +136 -165
  255. package/dist/server/routes.test.js +2457 -162
  256. package/dist/services/workflowExportSnapshots.test.js +2 -0
  257. package/dist/shared/aiProfileSeatScope.d.ts +5 -0
  258. package/dist/shared/aiProfileSeatScope.js +21 -0
  259. package/dist/shared/passwordPolicy.d.ts +13 -0
  260. package/dist/shared/passwordPolicy.js +84 -0
  261. package/dist/shared/passwordPolicy.test.d.ts +1 -0
  262. package/dist/shared/passwordPolicy.test.js +34 -0
  263. package/dist/storage/workspaceAssetStore.d.ts +15 -3
  264. package/dist/storage/workspaceAssetStore.js +132 -44
  265. package/dist/storage/workspaceAssetStore.test.js +93 -6
  266. package/dist/styles/fonts.css +70 -0
  267. package/dist/sync/collaborationSyncPayload.d.ts +6 -1
  268. package/dist/sync/collaborationSyncPayload.js +17 -11
  269. package/dist/sync/collaborationSyncPayload.test.js +13 -1
  270. package/dist/sync/contentSyncState.d.ts +4 -8
  271. package/dist/sync/contentSyncState.js +33 -77
  272. package/dist/sync/syncApplyHandlers.d.ts +7 -0
  273. package/dist/sync/syncApplyHandlers.js +28 -13
  274. package/dist/sync/syncApplyHandlers.test.js +72 -3
  275. package/dist/sync/syncFieldSemantics.d.ts +12 -0
  276. package/dist/sync/syncFieldSemantics.js +55 -0
  277. package/dist/sync/syncResourceAdapters.d.ts +44 -0
  278. package/dist/sync/syncResourceAdapters.js +77 -0
  279. package/dist/sync/syncService.d.ts +6 -0
  280. package/dist/sync/syncService.js +60 -0
  281. package/dist/sync/syncService.test.js +71 -3
  282. package/dist/sync/taskSyncChangeKey.d.ts +2 -0
  283. package/dist/sync/taskSyncChangeKey.js +143 -0
  284. package/dist/sync/taskSyncPayload.js +3 -8
  285. package/dist/sync/workspacePullFeed.js +4 -3
  286. package/dist/sync/workspacePullFeed.test.js +43 -0
  287. package/dist/sync/workspaceRepair.js +5 -2
  288. package/dist/sync/workspaceSyncModel.d.ts +48 -0
  289. package/dist/sync/workspaceSyncModel.js +195 -31
  290. package/dist/sync/workspaceSyncModel.test.js +325 -12
  291. package/dist/sync/workspaceSyncState.d.ts +19 -0
  292. package/dist/sync/workspaceSyncState.js +3 -1
  293. package/dist/sync/workspaceSyncSurface.js +3 -8
  294. package/dist/types.d.ts +17 -0
  295. package/dist/ui/assets/AgentsModule-DrLawwNl.js +1 -0
  296. package/dist/ui/assets/{AnnotatedAttachmentWorkspace-BlS-cqnl.js → AnnotatedAttachmentWorkspace-Z9_whf7F.js} +1 -1
  297. package/dist/ui/assets/CourierPrime-Bold-BuLj_dpw.woff2 +0 -0
  298. package/dist/ui/assets/CourierPrime-BoldItalic-BrK2pUkZ.woff2 +0 -0
  299. package/dist/ui/assets/CourierPrime-Italic-DFUZK5Ey.woff2 +0 -0
  300. package/dist/ui/assets/CourierPrime-Regular-BsKphzVf.woff2 +0 -0
  301. package/dist/ui/assets/DocumentWorkspace-B03MaSkw.js +252 -0
  302. package/dist/ui/assets/DocumentWorkspace-Dhdso07p.css +1 -0
  303. package/dist/ui/assets/{InitiativesModule-BjR6iBf9.js → InitiativesModule-9E6ParrY.js} +1 -1
  304. package/dist/ui/assets/Noir_medium-bxQwKGzB.woff2 +0 -0
  305. package/dist/ui/assets/Noir_regular-ojf2kxlG.woff2 +0 -0
  306. package/dist/ui/assets/PlansPage-CvfnMiWq.css +1 -0
  307. package/dist/ui/assets/PlansPage-DRXscYxH.js +1 -0
  308. package/dist/ui/assets/RussoOne-Regular-Cu_qq_qC.woff2 +0 -0
  309. package/dist/ui/assets/SpecialElite-Regular-Di6gSvAS.woff2 +0 -0
  310. package/dist/ui/assets/TaskSettings-DZX4jk7e.js +9 -0
  311. package/dist/ui/assets/{WorkflowsModule-DnFqdUME.js → WorkflowsModule-BA7jcEpH.js} +1 -1
  312. package/dist/ui/assets/index-9eT8e0Lu.css +1 -0
  313. package/dist/ui/assets/index-C6k75jr8.js +6 -0
  314. package/dist/ui/assets/{vendor-icons-I7ZwG1z_.js → vendor-icons-DuEd_65c.js} +1 -1
  315. package/dist/ui/fonts/CourierPrime-Bold.ttf +0 -0
  316. package/dist/ui/fonts/CourierPrime-Bold.woff2 +0 -0
  317. package/dist/ui/fonts/CourierPrime-BoldItalic.ttf +0 -0
  318. package/dist/ui/fonts/CourierPrime-BoldItalic.woff2 +0 -0
  319. package/dist/ui/fonts/CourierPrime-Italic.ttf +0 -0
  320. package/dist/ui/fonts/CourierPrime-Italic.woff2 +0 -0
  321. package/dist/ui/fonts/CourierPrime-Regular.ttf +0 -0
  322. package/dist/ui/fonts/CourierPrime-Regular.woff2 +0 -0
  323. package/dist/ui/fonts/Noir_medium.otf +0 -0
  324. package/dist/ui/fonts/Noir_medium.woff2 +0 -0
  325. package/dist/ui/fonts/Noir_regular.otf +0 -0
  326. package/dist/ui/fonts/Noir_regular.woff2 +0 -0
  327. package/dist/ui/fonts/RussoOne-Regular.woff2 +0 -0
  328. package/dist/ui/fonts/SpecialElite-Regular.ttf +0 -0
  329. package/dist/ui/fonts/SpecialElite-Regular.woff2 +0 -0
  330. package/dist/ui/index.html +3 -3
  331. package/dist/utils/accountProfileSummaryCache.d.ts +5 -0
  332. package/dist/utils/assignees.d.ts +2 -0
  333. package/dist/utils/assignees.js +2 -0
  334. package/dist/utils/avatarUpload.d.ts +27 -0
  335. package/dist/utils/avatarUpload.js +132 -0
  336. package/dist/utils/avatarUpload.test.d.ts +1 -0
  337. package/dist/utils/avatarUpload.test.js +40 -0
  338. package/dist/utils/bootstrapTrace.d.ts +7 -0
  339. package/dist/utils/bootstrapTrace.js +29 -0
  340. package/dist/utils/commercialLifecyclePresentation.d.ts +19 -0
  341. package/dist/utils/commercialLifecyclePresentation.js +199 -0
  342. package/dist/utils/contextAssetEvents.d.ts +2 -0
  343. package/dist/utils/syncEventDetails.d.ts +3 -0
  344. package/dist/utils/syncEventDetails.js +64 -0
  345. package/dist/utils/syncEventDetails.test.d.ts +1 -0
  346. package/dist/utils/syncEventDetails.test.js +23 -0
  347. package/dist/utils/syncEventPresentation.d.ts +15 -0
  348. package/dist/utils/syncEventPresentation.js +129 -0
  349. package/dist/utils/syncEventPresentation.test.d.ts +1 -0
  350. package/dist/utils/syncEventPresentation.test.js +64 -0
  351. package/dist/utils/syncStatusPresentation.d.ts +72 -0
  352. package/dist/utils/syncStatusPresentation.js +217 -0
  353. package/dist/utils/syncStatusPresentation.test.d.ts +1 -0
  354. package/dist/utils/syncStatusPresentation.test.js +164 -0
  355. package/dist/utils/taskActivity.d.ts +2 -0
  356. package/dist/utils/taskActivity.js +228 -22
  357. package/dist/utils/taskActivity.test.js +119 -8
  358. package/dist/utils/workspaceSyncPresentation.d.ts +4 -0
  359. package/dist/utils/workspaceSyncPresentation.js +68 -2
  360. package/dist/utils/workspaceSyncPresentation.test.js +36 -1
  361. package/package.json +10 -2
  362. package/scripts/check-cloud-mcp.mjs +83 -0
  363. package/scripts/export-sqlite-to-postgres.mjs +7 -9
  364. package/scripts/playwright-auth.sh +5 -1
  365. package/scripts/run-billing-performance-smoke.sh +24 -0
  366. package/scripts/run-e2e-realtime.sh +17 -3
  367. package/scripts/run-smoke.sh +17 -5
  368. package/scripts/run-soak.sh +17 -5
  369. package/src/resources/templates/workflow-sources/workflowDocs.mjs +6 -6
  370. package/src/resources/templates/workflows/collaborate.yaml +1 -1
  371. package/src/resources/templates/workflows/evaluate.yaml +2 -2
  372. package/src/resources/templates/workflows/plan.yaml +1 -1
  373. package/src/resources/templates/workflows/review.yaml +2 -2
  374. package/dist/ui/assets/AgentsModule-BLWVbuKP.js +0 -1
  375. package/dist/ui/assets/DocumentWorkspace-BH_6DF6x.js +0 -250
  376. package/dist/ui/assets/DocumentWorkspace-C_8T8oz-.css +0 -1
  377. package/dist/ui/assets/PlansPage-C2dd2n1X.css +0 -1
  378. package/dist/ui/assets/PlansPage-CSDQ4sLa.js +0 -1
  379. package/dist/ui/assets/RussoOne-Regular-C3BxZIj7.ttf +0 -0
  380. package/dist/ui/assets/TaskSettings-CEDy34Jo.js +0 -9
  381. package/dist/ui/assets/index-DXUdtH1B.js +0 -6
  382. package/dist/ui/assets/index-Ii0B0rTO.css +0 -1
  383. package/scripts/migrate-planning-model.ts +0 -233
@@ -1,250 +0,0 @@
1
- import{j as e,r as i,s as Ft,R as Fe}from"./vendor-react-CKJs5o3c.js";import{t as M,h as fe,f as B,i as rt,j as ot,k as Ot,m as Ht,R as Gt,n as I,o as ct,q as Wt,s as Kt}from"./index-DXUdtH1B.js";import{r as Ut,t as Jt,u as Vt,l as Yt,au as Xt,av as Oe,n as qt,Z as He,X as wt,aw as lt,e as gt,ax as yt,ay as Qt,az as Zt,a as en,i as tn,aA as nn,aB as sn,aC as an,aD as _e,aE as rn,s as on,aF as cn,D as ln,aG as dn,T as un,at as dt,R as mn,aH as fn,B as hn,U as pn,S as vn}from"./vendor-icons-I7ZwG1z_.js";import{s as wn,M as ke,r as Se}from"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";const gn="_index_18mna_1",yn="_header_18mna_8",xn="_title_18mna_17",bn="_refreshBtn_18mna_26",_n="_search_18mna_48",kn="_searchIcon_18mna_54",Sn="_searchInput_18mna_63",jn="_list_18mna_80",Cn="_state_18mna_89",Nn="_stateError_18mna_97",Tn="_item_18mna_104",En="_itemActive_18mna_124",Rn="_itemIcon_18mna_132",An="_itemBody_18mna_142",$n="_itemTitle_18mna_150",Ln="_itemTask_18mna_162",In="_itemBadge_18mna_172",Bn="_itemMeta_18mna_185",Dn="_itemMetaDetails_18mna_195",Pn="_itemMetaReference_18mna_202",R={index:gn,header:yn,title:xn,refreshBtn:bn,search:_n,searchIcon:kn,searchInput:Sn,list:jn,state:Cn,stateError:Nn,item:Tn,itemActive:En,itemIcon:Rn,itemBody:An,itemTitle:$n,itemTask:Ln,itemBadge:In,itemMeta:Bn,itemMetaDetails:Dn,itemMetaReference:Pn};function Mn({docType:t}){switch(t){case"implementation-plan":return e.jsx(qt,{size:13});case"review":return e.jsx(Oe,{size:13});case"walkthrough":return e.jsx(Xt,{size:13});default:return e.jsx(Yt,{size:13})}}function zn(t){return t<1024?`${t}B`:t<1024*1024?`${(t/1024).toFixed(1)}KB`:`${(t/(1024*1024)).toFixed(1)}MB`}function Fn(t){if(!t)return"";const l=new Date(t),r=new Date().getTime()-l.getTime(),u=Math.floor(r/(1e3*60*60*24));return u===0?"Today":u===1?"Yesterday":u<7?`${u}d ago`:u<30?`${Math.floor(u/7)}w ago`:l.toLocaleDateString()}function On(t,l){t.key!=="Enter"&&t.key!==" "||(t.preventDefault(),l())}function Hn({documents:t,selectedDocId:l,loading:c,error:r,searchQuery:u,taskById:m,onSearchChange:v,onSelect:S,onRefresh:g,hasActiveFilters:w}){return e.jsxs("div",{className:R.index,children:[e.jsxs("div",{className:R.header,children:[e.jsxs("span",{className:R.title,children:[e.jsx(Ut,{size:14}),"Documents"]}),e.jsx("button",{className:R.refreshBtn,onClick:g,title:"Refresh document list",disabled:c,children:e.jsx(Jt,{size:13,className:c?M.docSpinning:void 0})})]}),e.jsxs("div",{className:R.search,children:[e.jsx(Vt,{size:12,className:R.searchIcon}),e.jsx("input",{type:"text",placeholder:"Search documents…",value:u,onChange:p=>v(p.target.value),className:R.searchInput})]}),e.jsxs("div",{className:`${R.list} tf-scrollbar`,children:[c&&e.jsx("div",{className:R.state,children:"Loading documents…"}),!c&&r&&e.jsx("div",{className:R.stateError,children:r}),!c&&!r&&t.length===0&&e.jsx("div",{className:R.state,children:w?"No documents match your filters.":"No documents found. Documents added as task attachments will appear here."}),!c&&t.map(p=>{const _=p.taskId?m.get(p.taskId):null,b=p.id===l,L=fe(p),z=Ce(p),D=typeof p.attachmentCount=="number"&&Number.isFinite(p.attachmentCount)?p.attachmentCount:p.taskId?1:0,N=D>1?`${D} tasks linked`:D===1?_?.title||"1 task linked":null;return e.jsxs("div",{role:"button",tabIndex:0,className:`${R.item} ${b?R.itemActive:""}`,onClick:()=>S(p),onKeyDown:J=>On(J,()=>S(p)),children:[e.jsx("div",{className:R.itemIcon,children:e.jsx(Mn,{docType:p.docType})}),e.jsxs("div",{className:R.itemBody,children:[e.jsx("span",{className:R.itemTitle,title:L,children:L}),z==="unattached"&&e.jsx("span",{className:R.itemBadge,children:"Unattached"}),N&&e.jsx("span",{className:R.itemTask,title:N,children:N}),e.jsxs("span",{className:R.itemMeta,children:[e.jsxs("span",{className:R.itemMetaDetails,children:[zn(p.sizeBytes),p.updatedAt&&e.jsxs(e.Fragment,{children:[" · ",Fn(p.updatedAt)]})]}),p.referenceLabel&&e.jsx("span",{className:R.itemMetaReference,children:p.referenceLabel})]})]})]},p.id)})]})]})}function je(t){return function(l){return wn(l,t)}}const Gn="_viewer_biumc_1",Wn="_viewerMonochrome_biumc_10",Kn="_metaDocumentName_biumc_10",Un="_viewerEditMode_biumc_14",Jn="_meta_biumc_10",Vn="_metaLeft_biumc_30",Yn="_metaRenameRow_biumc_49",Xn="_typeBadge_biumc_56",qn="_typeBadgeImplementationPlan_biumc_71",Qn="_typeBadgeReview_biumc_77",Zn="_typeBadgeWalkthrough_biumc_83",es="_metaTaskName_biumc_89",ts="_statusBadge_biumc_98",ns="_metaDate_biumc_113",ss="_metaSize_biumc_114",as="_actions_biumc_122",is="_actionBtn_biumc_129",rs="_dangerBtn_biumc_156",os="_generateBtn_biumc_167",cs="_editBtn_biumc_178",ls="_saveBtn_biumc_189",ds="_layoutToggle_biumc_205",us="_layoutBtn_biumc_213",ms="_layoutBtnActive_biumc_229",fs="_saveStatus_biumc_234",hs="_saveStatusSaved_biumc_241",ps="_saveStatusError_biumc_245",vs="_unsaved_biumc_250",ws="_viewerContent_biumc_256",gs="_viewerBody_biumc_265",ys="_viewerMain_biumc_273",xs="_reviewRail_biumc_277",bs="_printHint_biumc_283",_s="_reviewSection_biumc_290",ks="_reviewHeader_biumc_299",Ss="_reviewTitle_biumc_307",js="_reviewSubtitle_biumc_316",Cs="_reviewControls_biumc_323",Ns="_reviewSelect_biumc_330",Ts="_reviewSessionMeta_biumc_334",Es="_reviewStatusResolved_biumc_342",Rs="_reviewSessionLabel_biumc_348",As="_reviewTitleEditRow_biumc_353",$s="_reviewSessionTimestamp_biumc_360",Ls="_reviewAnchorLabel_biumc_364",Is="_reviewComposer_biumc_370",Bs="_reviewAnchorChip_biumc_377",Ds="_reviewAnchorSnippet_biumc_390",Ps="_reviewAnchorClear_biumc_395",Ms="_reviewCommentActions_biumc_408",zs="_reviewCommentAction_biumc_408",Fs="_reviewCommentEditor_biumc_429",Os="_viewerState_biumc_435",Hs="_viewerStateError_biumc_442",Gs="_editorArea_biumc_449",Ws="_editorPane_biumc_456",Ks="_editorLayoutSplit_biumc_464",Us="_previewPane_biumc_465",Js="_editorLayoutEditor_biumc_469",Vs="_editorLayoutPreview_biumc_470",Ys="_editorPaneLabel_biumc_474",Xs="_editorTextarea_biumc_486",qs="_markdownSurface_biumc_528",a={viewer:Gn,viewerMonochrome:Wn,metaDocumentName:Kn,viewerEditMode:Un,meta:Jn,metaLeft:Vn,metaRenameRow:Yn,typeBadge:Xn,typeBadgeImplementationPlan:qn,typeBadgeReview:Qn,typeBadgeWalkthrough:Zn,metaTaskName:es,statusBadge:ts,metaDate:ns,metaSize:ss,actions:as,actionBtn:is,dangerBtn:rs,generateBtn:os,editBtn:cs,saveBtn:ls,layoutToggle:ds,layoutBtn:us,layoutBtnActive:ms,saveStatus:fs,saveStatusSaved:hs,saveStatusError:ps,unsaved:vs,viewerContent:ws,viewerBody:gs,viewerMain:ys,reviewRail:xs,printHint:bs,reviewSection:_s,reviewHeader:ks,reviewTitle:Ss,reviewSubtitle:js,reviewControls:Cs,reviewSelect:Ns,reviewSessionMeta:Ts,reviewStatusResolved:Es,reviewSessionLabel:Rs,reviewTitleEditRow:As,reviewSessionTimestamp:$s,reviewAnchorLabel:Ls,reviewComposer:Is,reviewAnchorChip:Bs,reviewAnchorSnippet:Ds,reviewAnchorClear:Ps,reviewCommentActions:Ms,reviewCommentAction:zs,reviewCommentEditor:Fs,viewerState:Os,viewerStateError:Hs,editorArea:Gs,editorPane:Ws,editorLayoutSplit:Ks,previewPane:Us,editorLayoutEditor:Js,editorLayoutPreview:Vs,editorPaneLabel:Ys,editorTextarea:Xs,markdownSurface:qs},Qs="_overlay_1unik_1",Zs="_modal_1unik_12",ea="_header_1unik_16",ta="_title_1unik_20",na="_docName_1unik_24",sa="_body_1unik_34",aa="_state_1unik_41",ia="_stateError_1unik_52",ra="_stateDone_1unik_63",oa="_toolbar_1unik_84",ca="_toolbarCount_1unik_95",la="_toolbarActions_1unik_100",da="_tree_1unik_105",ua="_taskRow_1unik_113",ma="_taskRowDimmed_1unik_126",fa="_taskCheck_1unik_130",ha="_taskExpandBtn_1unik_139",pa="_taskExpandSpacer_1unik_155",va="_taskTitle_1unik_160",wa="_taskBadge_1unik_169",ga="_footer_1unik_179",C={overlay:Qs,modal:Zs,header:ea,title:ta,docName:na,body:sa,state:aa,stateError:ia,stateDone:ra,toolbar:oa,toolbarCount:ca,toolbarActions:la,tree:da,taskRow:ua,taskRowDimmed:ma,taskCheck:fa,taskExpandBtn:ha,taskExpandSpacer:pa,taskTitle:va,taskBadge:wa,footer:ga},ya={1:"Low",2:"Medium",3:"High"};function me(t,l){return t.map(c=>({...c,selected:l,children:me(c.children,l)}))}function xt(t,l,c){return t.map(r=>r.idempotencyKey===l?{...r,selected:c,children:me(r.children,c)}:{...r,children:xt(r.children,l,c)})}function Ge(t){let l=0;for(const c of t)c.selected&&l++,l+=Ge(c.children);return l}function bt({node:t,depth:l,onToggle:c}){const[r,u]=i.useState(!0),m=t.children.length>0,v=l*20;return e.jsxs("div",{children:[e.jsxs("div",{className:`${C.taskRow} ${t.selected?"":C.taskRowDimmed}`,style:{paddingLeft:`${12+v}px`},children:[e.jsx("button",{className:C.taskCheck,onClick:()=>c(t.idempotencyKey,!t.selected),title:t.selected?"Deselect":"Select",children:t.selected?e.jsx(Qt,{size:14,style:{color:"var(--brand-primary-strong)"}}):e.jsx(Zt,{size:14,style:{color:"var(--text-muted)"}})}),m?e.jsx("button",{className:C.taskExpandBtn,onClick:()=>u(S=>!S),children:r?e.jsx(en,{size:12}):e.jsx(tn,{size:12})}):e.jsx("span",{className:C.taskExpandSpacer}),e.jsx("span",{className:C.taskTitle,title:t.description||void 0,children:t.title}),e.jsx("span",{className:C.taskBadge,style:{color:rt(t.type),borderColor:rt(t.type)},children:t.type}),e.jsx("span",{className:C.taskBadge,style:{color:ot(t.priority),borderColor:ot(t.priority)},children:ya[t.priority]})]}),m&&r&&e.jsx("div",{children:t.children.map(S=>e.jsx(bt,{node:S,depth:l+1,onToggle:c},S.idempotencyKey))})]})}function xa({content:t,docTitle:l,apiBaseUrl:c="",onClose:r,onGenerated:u}){const[m,v]=i.useState("preview"),[S,g]=i.useState(null),[w,p]=i.useState([]),[_,b]=i.useState(!0),[L,z]=i.useState(0),[D,N]=i.useState(null);i.useEffect(()=>{let y=!1;return b(!0),g(null),B("/api/taskforce/documents/generate-tasks/preview",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:t})},c).then(j=>j.json()).then(j=>{if(!y){if(j.error)throw new Error(j.error);p(j.tasks||[]),v("preview")}}).catch(j=>{y||(g(j?.message||"Failed to parse plan"),v("error"))}).finally(()=>{y||b(!1)}),()=>{y=!0}},[t,c]);const J=i.useCallback((y,j)=>{p(q=>xt(q,y,j))},[]),F=()=>p(y=>me(y,!0)),G=()=>p(y=>me(y,!1)),O=Ge(w),Y=async()=>{v("generating"),N(null);try{const y=await B("/api/taskforce/documents/generate-tasks/commit",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({tasks:w})},c),j=await y.json().catch(()=>({}));if(!y.ok)throw new Error(j.error||`Generation failed (${y.status})`);z(j.created??0),v("done"),u(j.created??0)}catch(y){N(y?.message||"Generation failed"),v("error")}};return e.jsx("div",{className:C.overlay,onClick:y=>{y.target===y.currentTarget&&r()},children:e.jsxs("div",{className:`tf-surface-modal tf-modal-shell ${C.modal}`,children:[e.jsxs("div",{className:`tf-modal-header ${C.header}`,children:[e.jsxs("div",{className:`tf-modal-title ${C.title}`,children:[e.jsx(He,{size:16,style:{color:"var(--brand-primary-strong)"}}),"Generate Tasks from Plan"]}),e.jsx("span",{className:C.docName,children:l}),e.jsx("button",{className:"tf-control-icon",onClick:r,title:"Close",children:e.jsx(wt,{size:16})})]}),e.jsxs("div",{className:C.body,children:[_&&e.jsxs("div",{className:C.state,children:[e.jsx(lt,{size:20,className:M.docSpinning}),"Parsing plan…"]}),!_&&m==="error"&&e.jsxs("div",{className:C.stateError,children:[e.jsx(gt,{size:16}),S||D||"An error occurred"]}),!_&&m==="done"&&e.jsxs("div",{className:C.stateDone,children:[e.jsx(yt,{size:24,style:{color:"var(--status-success)"}}),e.jsxs("strong",{children:[L," task",L!==1?"s":""," created"]}),e.jsx("p",{children:"Tasks are now in your board. Switch to the Kanban or Hierarchy view to see them."})]}),!_&&(m==="preview"||m==="confirm"||m==="generating")&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:C.toolbar,children:[e.jsxs("span",{className:C.toolbarCount,children:[O," of ",Ge(me(w,!0))," tasks selected"]}),e.jsxs("div",{className:C.toolbarActions,children:[e.jsx("button",{className:"tf-control-icon",onClick:F,children:"Select all"}),e.jsx("button",{className:"tf-control-icon",onClick:G,children:"Deselect all"})]})]}),w.length===0?e.jsx("div",{className:C.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:`${C.tree} tf-scrollbar`,children:w.map(y=>e.jsx(bt,{node:y,depth:0,onToggle:J},y.idempotencyKey))})]})]}),!_&&m!=="done"&&m!=="error"&&e.jsxs("div",{className:C.footer,children:[e.jsx("button",{className:"tf-button-secondary",onClick:r,children:"Cancel"}),e.jsx("button",{className:"tf-button-primary",onClick:Y,disabled:O===0||m==="generating",children:m==="generating"?e.jsxs(e.Fragment,{children:[e.jsx(lt,{size:13,className:M.docSpinning})," Generating…"]}):e.jsxs(e.Fragment,{children:[e.jsx(He,{size:13})," Generate ",O," task",O!==1?"s":""]})})]}),!_&&m==="done"&&e.jsx("div",{className:C.footer,children:e.jsx("button",{className:"tf-button-primary",onClick:r,children:"Done"})})]})})}const ba={"implementation-plan":"Implementation Plan",review:"Review",walkthrough:"Walkthrough",planning:"Planning",other:"Document"},_a={"implementation-plan":a.typeBadgeImplementationPlan,review:a.typeBadgeReview,walkthrough:a.typeBadgeWalkthrough,planning:void 0,other:void 0},ka={editor:a.editorLayoutEditor,split:a.editorLayoutSplit,preview:a.editorLayoutPreview},Sa=1500,ja=`
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 Ca(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function ut(t){return t?new Date(t).toLocaleString():"—"}function Na(){const t=r=>!r||!Array.isArray(r.children)?!1:r.children.some(u=>u?u.type==="element"&&u.tagName==="input"&&u.properties?.type==="checkbox"?!0:t(u):!1),l=r=>!r||!Array.isArray(r.children)?!1:r.children.some(u=>typeof u?.checked=="boolean"?!0:t(u)),c=r=>{const u=Fe.Children.toArray(r).filter(g=>typeof g!="string"?!0:g.trim().length>0);if(u.length!==1)return null;const m=u[0];if(!Fe.isValidElement(m)||m.type!=="strong")return null;const v=m.props,S=Fe.Children.toArray(v.children).join("").trim();return S||null};return{input({type:r,checked:u,...m}){return r!=="checkbox"?e.jsx("input",{type:r,checked:u,...m}):e.jsx("input",{...m,type:"checkbox",checked:!!u,disabled:!0,readOnly:!0})},ul({children:r,node:u,...m}){const v=l(u);return e.jsx("ul",{...m,style:v?{paddingLeft:"1.2em"}:void 0,children:r})},ol({children:r,node:u,...m}){const v=l(u);return e.jsx("ol",{...m,style:v?{paddingLeft:"1.2em"}:void 0,children:r})},li({children:r,node:u,...m}){const v=typeof u?.checked=="boolean"||t(u);return e.jsx("li",{...m,style:v?{listStyleType:"none",listStyle:"none",marginLeft:0}:void 0,children:r})},p({children:r,...u}){const m=c(r);return m?e.jsx("p",{...u,className:"tf-print-section-label",children:m}):e.jsx("p",{...u,children:r})}}}function Ta(t){const l=Ft.renderToStaticMarkup(e.jsx("div",{className:"tf-print-document",children:e.jsx(ke,{remarkPlugins:[Se],rehypePlugins:[je],components:Na(),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>${ja}</style>
246
- </head>
247
- <body>${l}</body>
248
- </html>`}async function Ea(t,l){try{await l.fonts?.ready}catch{}await new Promise(c=>{const r=t.requestAnimationFrame?.bind(t)??(u=>window.setTimeout(()=>u(0),0));r(()=>r(()=>c()))})}function Ra(t){return window.setTimeout(t,Sa)}function mt(t){try{return new Date(t).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return t}}function ft(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 Aa(t){return t.authorActor?.label?t.authorActor.label:t.authorActorId==="user"||t.authorActorId==="human"?"You":t.authorActorId?t.authorActorId:"Reviewer"}function ht(t){return t.replace(/\s+/g," ").trim()}function $a(t,l){if(!l)return 0;let c=0,r=0;for(;r>=0&&(r=t.indexOf(l,r),!(r<0));)c+=1,r+=l.length;return c}function La(t,l,c){const r=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);let u=r.nextNode(),m=0;for(;u;){const v=u.textContent||"";if(u===l)return m+Math.max(0,Math.min(c,v.length));m+=v.length,u=r.nextNode()}return null}function Ia(t,l,c){const r=c.replace(/\s+/g," ").trim();if(!r)return null;const u=t.textContent||"",m=ht(u),v=[];let S=m.indexOf(r);for(;S>=0;)v.push(S),S=m.indexOf(r,S+r.length);let g=null;const w=La(t,l.startContainer,l.startOffset);if(w!==null){const z=ht(u.slice(0,w));g=$a(z,r)}const p=g!==null&&g>=0&&g<v.length?g:v.length===1?0:null,_=p!==null?v[p]:v[0]??-1;if(_<0)return{kind:"quote",quote:r,occurrenceIndex:g};const b=m.slice(Math.max(0,_-40),_).trim()||null,L=m.slice(_+r.length,_+r.length+40).trim()||null;return{kind:"quote",quote:r,occurrenceIndex:p,prefix:b,suffix:L}}function Ba(t,l,c){if(l<0)return t;const r=t.split(`
249
- `);let u=-1;const m=/^(\s*(?:[-*+]|\d+\.)\s+)\[( |x|X)\](.*)$/,v=c?"x":" ";return r.map(g=>{const w=g.match(m);return!w||(u+=1,u!==l)?g:`${w[1]}[${v}]${w[3]}`}).join(`
250
- `)}function Da({doc:t,taskTitle:l,apiBaseUrl:c="",onSaved:r,onDeleted:u,enableTaskGeneration:m=!1}){const v=fe(t),[S,g]=i.useState(v),w=S,p=Ot({...t,displayName:S}),_=Ht(t),[b,L]=i.useState(null),[z,D]=i.useState(!1),[N,J]=i.useState(null),[F,G]=i.useState(!1),[O,Y]=i.useState(!1),[y,j]=i.useState([]),[q,Ne]=i.useState(!1),[ee,A]=i.useState(null),[se,V]=i.useState(null),[E,P]=i.useState(""),[x,$]=i.useState(!1),[H,Q]=i.useState(null),[he,ae]=i.useState(!1),[Te,Ee]=i.useState(""),[ie,ue]=i.useState(null),[pe,re]=i.useState(""),[T,ve]=i.useState(!1),[W,oe]=i.useState(""),[K,Re]=i.useState("split"),[X,U]=i.useState({type:"idle"}),[_t,Ae]=i.useState(!1),[Ke,kt]=i.useState(!1),[we,Ue]=i.useState(!1),[ge,te]=i.useState(!1),[$e,ce]=i.useState(w),le=t.editable!==!1,Je=Ce(t),St=Je==="unattached"&&!!t.assetId,Le=T&&W!==(b??""),Ie=i.useRef(null),Be=i.useRef(null),Ve=i.useRef(null),de=i.useRef(null),ye=i.useRef(null),Ye=i.useRef(null),Xe=i.useRef(null),h=y.find(n=>n.id===se)||y[0]||null,qe=i.useCallback(async()=>{D(!0),J(null),L(null);try{const n=await B(t.apiUrl,{credentials:"same-origin"},c);if(!n.ok)throw new Error(`Failed to load document (${n.status})`);const s=await n.text();L(s),oe(s)}catch(n){J(n?.message||"Failed to load document")}finally{D(!1)}},[c,t.apiUrl]),xe=i.useCallback(async n=>{if(!t.assetId){j([]),V(null),A(null);return}const s=n?.silent===!0;s||(Ne(!0),A(null));try{const o=await B(`/api/taskforce/document-reviews/sessions?assetId=${encodeURIComponent(t.assetId)}`,{credentials:"include"},c),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:[];j(f),V(k=>k&&f.some(Z=>Z.id===k)?k:f[0]?.id??null)}catch(o){s||(A(o?.message||"Failed to load reviews"),j([]),V(null))}finally{s||Ne(!1)}},[c,t.assetId]),De=i.useCallback(async()=>{if(!t.assetId||x)return null;$(!0),A(null);try{const n=await B("/api/taskforce/document-reviews/sessions",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({assetId:t.assetId,title:`Review ${y.length+1}`})},c),s=await n.json().catch(()=>({}));if(!n.ok)throw new Error(s.error||`Failed to create review (${n.status})`);const o=s.session||null;if(!o)throw new Error("Review session payload missing.");return j(d=>[o,...d.filter(f=>f.id!==o.id)]),V(o.id),o}catch(n){return A(n?.message||"Failed to create review"),null}finally{$(!1)}},[c,t.assetId,x,y.length]);i.useEffect(()=>{qe(),xe(),ve(!1),U({type:"idle"}),te(!1);const n=fe(t);g(n),ce(n),G(!1),Y(!1),P(""),Q(null),ae(!1),Ee(""),ue(null),re("")},[t,qe,xe]),i.useEffect(()=>{if(!h)return;const n=Ye.current;typeof n?.scrollIntoView=="function"&&n.scrollIntoView({block:"end"})},[h?.comments.length,h?.id]),i.useEffect(()=>{Ee(h?.title?.trim()||""),ae(!1)},[h?.id,h?.title]),i.useEffect(()=>{ge&&window.setTimeout(()=>{Be.current?.focus(),Be.current?.select()},0)},[ge]),i.useEffect(()=>{if(!t.assetId||T)return;const n=()=>{document.visibilityState==="visible"&&xe({silent:!0})},s=window.setInterval(n,15e3);return window.addEventListener("focus",n),document.addEventListener("visibilitychange",n),()=>{window.clearInterval(s),window.removeEventListener("focus",n),document.removeEventListener("visibilitychange",n)}},[t.assetId,T,xe]),i.useEffect(()=>{if(!T)return;const n=s=>{(s.metaKey||s.ctrlKey)&&s.key==="s"&&(s.preventDefault(),Qe())};return window.addEventListener("keydown",n),()=>window.removeEventListener("keydown",n)},[T,W]);const ne=i.useCallback(()=>{ye.current!==null&&(window.clearTimeout(ye.current),ye.current=null),de.current&&(de.current.remove(),de.current=null)},[]);i.useEffect(()=>()=>{ne()},[ne]);const be=i.useCallback(n=>{if(!T||K!=="split")return;const s=Ie.current,o=Ve.current;if(!s||!o)return;const d=n==="editor"?s:o,f=n==="editor"?o:s,k=Math.max(d.scrollHeight-d.clientHeight,0),Z=Math.max(f.scrollHeight-f.clientHeight,0),ze=k<=0?0:d.scrollTop/k,it=Z*ze;Math.abs(f.scrollTop-it)<=1||(f.scrollTop=it)},[T,K]);i.useEffect(()=>{!T||K!=="split"||be("editor")},[W,T,K,be]);const jt=()=>{le&&(oe(b??""),U({type:"idle"}),ve(!0),setTimeout(()=>Ie.current?.focus(),50))},Ct=()=>{Le&&!window.confirm("Discard unsaved changes?")||(ve(!1),oe(b??""),U({type:"idle"}))},Qe=i.useCallback(async()=>{if(le&&X.type!=="saving"){U({type:"saving"});try{const n=await B("/api/taskforce/documents/save",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({fsPath:t.fsPath,content:W})},c),s=await n.json().catch(()=>({}));if(!n.ok)throw new Error(s.error||`Save failed (${n.status})`);const o=s.updatedAt||new Date().toISOString();L(W),U({type:"saved",savedAt:o}),r?.(o),ve(!1)}catch(n){U({type:"error",message:n?.message||"Save failed"})}}},[c,t.fsPath,W,X.type,r,le]),Nt=i.useCallback(()=>{const n=T?W:b??"";if(!n.trim())return;ne();const s=document.createElement("iframe");s.setAttribute("aria-hidden","true"),s.tabIndex=-1,s.style.position="fixed",s.style.right="0",s.style.bottom="0",s.style.width="0",s.style.height="0",s.style.border="0",s.style.opacity="0",s.style.pointerEvents="none",document.body.appendChild(s),de.current=s;const o=s.contentWindow,d=s.contentDocument;if(!o||!d){ne();return}d.open(),d.write(Ta(n)),d.close();let f=!1;const k=async()=>{f||de.current!==s||(f=!0,await Ea(o,d),de.current===s&&(o.focus(),o.print(),ye.current=Ra(ne)))};o.addEventListener("afterprint",ne,{once:!0}),k()},[ne,b,W,T]),Tt=async()=>{const n=t.apiUrl,s=new URL(ct(n,c),window.location.origin).toString();try{await navigator.clipboard.writeText(s)}catch{const o=document.createElement("textarea");o.value=s,document.body.appendChild(o),o.select(),document.execCommand("copy"),document.body.removeChild(o)}G(!0),setTimeout(()=>G(!1),2e3)},Et=i.useCallback(async()=>{if(_){try{await navigator.clipboard.writeText(_)}catch{const n=document.createElement("textarea");n.value=_,document.body.appendChild(n),n.select(),document.execCommand("copy"),document.body.removeChild(n)}Y(!0),setTimeout(()=>Y(!1),2e3)}},[_]),Rt=()=>{const n=t.apiUrl.includes("?")?"&":"?",s=ct(`${t.apiUrl}${n}download=1&filename=${encodeURIComponent(p)}`,c),o=document.createElement("a");o.href=s,o.click()},Pe=i.useCallback(async()=>{if(!t.assetId)return;const n=$e.trim();if(!n){ce(w),te(!1);return}if(n===w){te(!1);return}const s=await B(`/api/taskforce/documents/${encodeURIComponent(t.assetId)}`,{method:"PATCH",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({displayName:n})},c),o=await s.json().catch(()=>({}));if(!s.ok){window.alert(o.error||`Rename failed (${s.status})`);return}g(n),ce(n),te(!1),r?.(o.updatedAt||new Date().toISOString())},[c,t.assetId,r,w,$e]),At=i.useCallback(n=>{if(n.key==="Enter"){n.preventDefault(),Pe();return}n.key==="Escape"&&(n.preventDefault(),ce(w),te(!1))},[Pe,w]),$t=i.useCallback(async()=>{if(!(!t.assetId||we)&&window.confirm(`Permanently delete "${w}" from storage?`)){Ue(!0);try{const n=await B(`/api/taskforce/documents/${encodeURIComponent(t.assetId)}`,{method:"DELETE",credentials:"include"},c),s=await n.json().catch(()=>({}));if(!n.ok)throw new Error(s.error||`Delete failed (${n.status})`);u?.()}catch(n){window.alert(n?.message||"Delete failed")}finally{Ue(!1)}}},[c,we,t.assetId,u,w]),Lt=i.useCallback(async()=>{if(!(!h||x)){$(!0),A(null);try{const n=h.status==="resolved"?"open":"resolved",s=await B(`/api/taskforce/document-reviews/sessions/${encodeURIComponent(h.id)}`,{method:"PATCH",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:n})},c),o=await s.json().catch(()=>({}));if(!s.ok)throw new Error(o.error||`Failed to update review (${s.status})`);const d=o.session||null;if(!d)throw new Error("Review session payload missing.");j(f=>f.map(k=>k.id===d.id?d:k))}catch(n){A(n?.message||"Failed to update review")}finally{$(!1)}}},[h,c,x]),It=i.useCallback(async()=>{if(!h||x)return;const n=Te.trim();$(!0),A(null);try{const s=await B(`/api/taskforce/document-reviews/sessions/${encodeURIComponent(h.id)}`,{method:"PATCH",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:n||null})},c),o=await s.json().catch(()=>({}));if(!s.ok)throw new Error(o.error||`Failed to update review (${s.status})`);const d=o.session||null;if(!d)throw new Error("Review session payload missing.");j(f=>f.map(k=>k.id===d.id?d:k)),ae(!1)}catch(s){A(s?.message||"Failed to update review")}finally{$(!1)}},[h,c,x,Te]),Ze=T?W:b??"",Bt=i.useCallback(()=>{if(T)return;const n=typeof window.getSelection=="function"?window.getSelection():null,s=n?.toString().replace(/\s+/g," ").trim()||"";if(!n||!s)return;const o=n.rangeCount>0?n.getRangeAt(0):null,d=Xe.current;if(!o||!d)return;const f=o.commonAncestorContainer,k=f.nodeType===Node.TEXT_NODE?f.parentNode:f;if(!(k instanceof Node)||!d.contains(k))return;const Z=Ia(d,o,s);Z&&Q(Z)},[T]),et=i.useCallback(async()=>{const n=E.trim();if(!n||x)return;let s=h;if(s||(s=await De()),!!s){$(!0),A(null);try{const o=await B(`/api/taskforce/document-reviews/sessions/${encodeURIComponent(s.id)}/comments`,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({body:n,anchor:H||{kind:"document"}})},c),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.");j(k=>{const Z=k.filter(ze=>ze.id!==f.id);return[f,...Z]}),V(f.id),P(""),Q(null)}catch(o){A(o?.message||"Failed to add comment")}finally{$(!1)}}},[h,c,De,H,x,E]),Dt=i.useCallback((n,s)=>{ue(n),re(s)},[]),Pt=i.useCallback(async()=>{if(!h||!ie||x)return;const n=pe.trim();if(n){$(!0),A(null);try{const s=await B(`/api/taskforce/document-reviews/sessions/${encodeURIComponent(h.id)}/comments/${encodeURIComponent(ie)}`,{method:"PATCH",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({body:n})},c),o=await s.json().catch(()=>({}));if(!s.ok)throw new Error(o.error||`Failed to update comment (${s.status})`);const d=o.session||null;if(!d)throw new Error("Review session payload missing.");j(f=>f.map(k=>k.id===d.id?d:k)),ue(null),re("")}catch(s){A(s?.message||"Failed to update comment")}finally{$(!1)}}},[h,c,pe,ie,x]),Mt=i.useCallback(async n=>{if(!(!h||x)&&window.confirm("Delete this review comment?")){$(!0),A(null);try{const s=await B(`/api/taskforce/document-reviews/sessions/${encodeURIComponent(h.id)}/comments/${encodeURIComponent(n)}`,{method:"DELETE",credentials:"include"},c),o=await s.json().catch(()=>({}));if(!s.ok)throw new Error(o.error||`Failed to delete comment (${s.status})`);const d=o.session||null;if(!d)throw new Error("Review session payload missing.");j(f=>f.map(k=>k.id===d.id?d:k)),ie===n&&(ue(null),re(""))}catch(s){A(s?.message||"Failed to delete comment")}finally{$(!1)}}},[h,c,ie,x]),tt=i.useCallback(async n=>{if(!le)return!1;U({type:"saving"});try{const s=await B("/api/taskforce/documents/save",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({fsPath:t.fsPath,content:n})},c),o=await s.json().catch(()=>({}));if(!s.ok)throw new Error(o.error||`Save failed (${s.status})`);const d=o.updatedAt||new Date().toISOString();return L(n),oe(n),U({type:"saved",savedAt:d}),r?.(d),!0}catch(s){return U({type:"error",message:s?.message||"Save failed"}),!1}},[c,t.fsPath,r,le]),zt=i.useCallback((n,s)=>{const o=T?W:b??"",d=Ba(o,n,s);if(d!==o){if(T){oe(d),U(f=>f.type==="saving"?f:{type:"idle"});return}tt(d)}},[b,W,T,tt]);let nt=-1;const Me=n=>!n||!Array.isArray(n.children)?!1:n.children.some(s=>s?s.type==="element"&&s.tagName==="input"&&s.properties?.type==="checkbox"?!0:Me(s):!1),st=n=>!n||!Array.isArray(n.children)?!1:n.children.some(s=>typeof s?.checked=="boolean"?!0:Me(s)),at={input({type:n,checked:s,...o}){if(n!=="checkbox")return e.jsx("input",{type:n,checked:s,...o});nt+=1;const d=nt;return e.jsx("input",{...o,type:"checkbox",checked:!!s,disabled:!1,onClick:f=>f.stopPropagation(),onChange:f=>zt(d,f.currentTarget.checked)})},ul({children:n,node:s,...o}){const d=st(s);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:s,...o}){const d=st(s);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:s,...o}){const d=typeof s?.checked=="boolean"||Me(s);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:`${a.viewer} ${T?a.viewerEditMode:""} ${Ke?a.viewerMonochrome:""}`,children:[e.jsxs("div",{className:a.meta,children:[e.jsxs("div",{className:a.metaLeft,children:[e.jsxs("span",{className:`${a.typeBadge} ${_a[t.docType]??""}`,children:[e.jsx(nn,{size:10}),ba[t.docType]]}),ge?e.jsx("div",{className:a.metaRenameRow,children:e.jsx("input",{ref:Be,type:"text",className:M.input,value:$e,onChange:n=>ce(n.target.value),onBlur:()=>{Pe()},onKeyDown:At})}):e.jsx("span",{className:a.metaDocumentName,title:w,onDoubleClick:()=>{t.assetId&&(ce(w),te(!0))},children:w}),l&&e.jsx("span",{className:a.metaTaskName,title:`From task: ${l}`,children:l}),Je==="unattached"&&e.jsx("span",{className:a.statusBadge,children:"Unattached"}),t.updatedAt&&e.jsxs("span",{className:a.metaDate,title:ut(t.updatedAt),children:[e.jsx(sn,{size:11}),ut(t.updatedAt)]}),e.jsxs("span",{className:a.metaSize,children:[e.jsx(an,{size:11}),Ca(t.sizeBytes)]}),_&&e.jsx(Gt,{label:_,copied:O,onClick:()=>{Et()},title:"Copy document reference"}),X.type==="saved"&&e.jsxs("span",{className:`${a.saveStatus} ${a.saveStatusSaved}`,children:[e.jsx(yt,{size:11}),"Saved"]}),X.type==="error"&&e.jsxs("span",{className:`${a.saveStatus} ${a.saveStatusError}`,title:X.message,children:[e.jsx(gt,{size:11}),X.message||"Save failed"]}),Le&&X.type!=="saving"&&e.jsx("span",{className:a.unsaved,children:"Unsaved changes"})]}),e.jsx("div",{className:a.actions,children:T?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:a.layoutToggle,children:[e.jsx("button",{className:`${a.layoutBtn} ${K==="editor"?a.layoutBtnActive:""}`,onClick:()=>Re("editor"),title:"Editor only",children:e.jsx(_e,{size:12})}),e.jsx("button",{className:`${a.layoutBtn} ${K==="split"?a.layoutBtnActive:""}`,onClick:()=>Re("split"),title:"Split view",children:e.jsx(rn,{size:12})}),e.jsx("button",{className:`${a.layoutBtn} ${K==="preview"?a.layoutBtnActive:""}`,onClick:()=>Re("preview"),title:"Preview only",children:e.jsx(Oe,{size:12})})]}),e.jsxs("button",{className:a.actionBtn,onClick:Ct,title:"Discard changes",children:[e.jsx(wt,{size:13}),"Cancel"]}),e.jsxs("button",{className:`${a.actionBtn} ${a.saveBtn}`,onClick:Qe,disabled:X.type==="saving"||!Le,title:"Save (Ctrl+S)",children:[e.jsx(on,{size:13}),X.type==="saving"?"Saving…":"Save"]})]}):e.jsxs(e.Fragment,{children:[t.assetId&&e.jsxs("button",{className:a.actionBtn,onClick:()=>te(n=>!n),title:"Rename document",children:[e.jsx(_e,{size:13}),ge?"Close Rename":"Rename"]}),le&&e.jsxs("button",{className:`${a.actionBtn} ${a.editBtn}`,onClick:jt,title:"Edit document",children:[e.jsx(_e,{size:13}),"Edit"]}),e.jsxs("button",{className:a.actionBtn,onClick:Tt,title:"Copy link",children:[e.jsx(cn,{size:13}),F?"Copied!":"Copy link"]}),e.jsxs("button",{className:a.actionBtn,onClick:Rt,title:"Download .md",children:[e.jsx(ln,{size:13}),"Download"]}),e.jsxs("button",{className:a.actionBtn,onClick:Nt,title:"Print",children:[e.jsx(dn,{size:13}),"Print"]}),e.jsxs("button",{className:a.actionBtn,onClick:()=>kt(n=>!n),title:"Toggle black and white style",children:[e.jsx(Oe,{size:13}),Ke?"Color":"B/W"]}),m&&t.docType==="implementation-plan"&&!T&&e.jsxs("button",{className:`${a.actionBtn} ${a.generateBtn}`,onClick:()=>Ae(!0),title:"Generate tasks from this plan",children:[e.jsx(He,{size:13}),"Generate Tasks"]}),St&&e.jsxs("button",{className:`${a.actionBtn} ${a.dangerBtn}`,onClick:()=>{$t()},disabled:we,title:"Permanently delete this unattached document",children:[e.jsx(un,{size:13}),we?"Deleting…":"Delete Permanently"]})]})})]}),z&&e.jsx("div",{className:a.viewerState,children:"Loading…"}),!z&&N&&e.jsx("div",{className:a.viewerStateError,children:N}),!z&&!N&&(T?e.jsxs("div",{className:`${a.editorArea} ${ka[K]}`,children:[(K==="editor"||K==="split")&&e.jsxs("div",{className:a.editorPane,children:[e.jsx("div",{className:a.editorPaneLabel,children:"Markdown"}),e.jsx("textarea",{ref:Ie,className:`${a.editorTextarea} tf-scrollbar`,value:W,onScroll:()=>be("editor"),onChange:n=>{oe(n.target.value),U(s=>s.type==="saving"?s:{type:"idle"})},spellCheck:!0,placeholder:"Write markdown here…"})]}),(K==="preview"||K==="split")&&e.jsxs("div",{className:a.previewPane,children:[e.jsx("div",{className:a.editorPaneLabel,children:"Preview"}),e.jsx("div",{ref:Ve,className:`${M.docMarkdown} ${a.markdownSurface}`,"data-testid":"doc-preview-scroll",onScroll:()=>be("preview"),children:e.jsx(ke,{remarkPlugins:[Se],rehypePlugins:[je],components:at,children:Ze})})]})]}):e.jsxs("div",{className:a.viewerBody,children:[e.jsx("div",{className:`${a.viewerContent} ${a.viewerMain} tf-scrollbar`,children:e.jsx("div",{ref:Xe,className:`${M.docMarkdown} ${a.markdownSurface}`,onMouseUp:Bt,children:e.jsx(ke,{remarkPlugins:[Se],rehypePlugins:[je],components:at,children:Ze})})}),e.jsx("aside",{className:a.reviewRail,children:e.jsxs("section",{className:a.reviewSection,"aria-label":"Review and comments",children:[e.jsxs("div",{className:a.reviewHeader,children:[e.jsxs("div",{children:[e.jsxs("div",{className:a.reviewTitle,children:[e.jsx(dt,{size:14}),"Review & Comments"]}),e.jsx("p",{className:a.reviewSubtitle,children:"Comments stay attached to this document review session."})]}),e.jsxs("div",{className:a.reviewControls,children:[y.length>1&&e.jsx("select",{className:`${M.select} ${a.reviewSelect}`,value:h?.id||"",onChange:n=>V(n.target.value||null),"aria-label":"Select review session",children:y.map(n=>e.jsx("option",{value:n.id,children:n.title?.trim()||"Untitled review"},n.id))}),e.jsxs("button",{type:"button",className:a.actionBtn,onClick:()=>{De()},disabled:x||!t.assetId,children:[e.jsx(dt,{size:13}),"Start Review"]}),h&&e.jsxs("button",{type:"button",className:a.actionBtn,onClick:()=>{Lt()},disabled:x,children:[h.status==="resolved"?e.jsx(mn,{size:13}):e.jsx(fn,{size:13}),h.status==="resolved"?"Reopen":"Resolve"]})]})]}),h&&e.jsxs("div",{className:a.reviewSessionMeta,children:[e.jsx("span",{className:`${a.statusBadge} ${h.status==="resolved"?a.reviewStatusResolved:""}`,children:h.status==="resolved"?"Resolved":"Open"}),he?e.jsxs("div",{className:a.reviewTitleEditRow,children:[e.jsx("input",{type:"text",className:M.input,value:Te,onChange:n=>Ee(n.target.value),placeholder:"Untitled review"}),e.jsx("button",{type:"button",className:M.secondaryHeaderBtn,onClick:()=>{It()},disabled:x,children:"Save Title"})]}):e.jsx("span",{className:a.reviewSessionLabel,children:h.title?.trim()||"Untitled review"}),e.jsxs("span",{className:a.reviewSessionTimestamp,children:["Updated ",mt(h.updatedAt)]}),!he&&e.jsxs("button",{type:"button",className:a.actionBtn,onClick:()=>ae(!0),disabled:x,children:[e.jsx(_e,{size:13}),"Rename Review"]})]}),ee&&e.jsx("div",{className:a.viewerStateError,children:ee}),e.jsxs("div",{className:I.commentPanel,children:[e.jsxs("div",{className:I.commentThread,children:[q&&e.jsx("div",{className:I.emptyComments,children:"Loading review comments…"}),!q&&!h&&e.jsx("div",{className:I.emptyComments,children:"Start a review to collect comments for this document."}),!q&&h&&h.comments.length===0&&e.jsx("div",{className:I.emptyComments,children:"No comments yet. Add the first review note for this document."}),!q&&h&&h.comments.map(n=>{const s=n.authorActor?.kind==="ai",o=ft(n.anchor),d=s?hn:pn,f=ie===n.id;return e.jsxs("div",{className:`${I.comment} ${s?I.commentAi:I.commentUser}`,children:[e.jsxs("div",{className:I.commentHeader,children:[e.jsxs("span",{className:I.commentAuthor,style:n.authorActor?.color?{color:n.authorActor.color}:void 0,children:[e.jsx(d,{size:12,strokeWidth:1.5}),Aa(n)]}),e.jsx("span",{className:I.commentTime,children:mt(n.updatedAt)}),e.jsxs("span",{className:a.reviewCommentActions,children:[!f&&e.jsx("button",{type:"button",className:a.reviewCommentAction,onClick:()=>Dt(n.id,n.body),disabled:x,children:"Edit"}),f&&e.jsx("button",{type:"button",className:a.reviewCommentAction,onClick:()=>{ue(null),re("")},disabled:x,children:"Cancel"}),e.jsx("button",{type:"button",className:a.reviewCommentAction,onClick:()=>{Mt(n.id)},disabled:x,children:"Delete"})]})]}),o&&e.jsx("span",{className:a.reviewAnchorLabel,children:o}),e.jsx("div",{className:I.commentText,children:f?e.jsxs("div",{className:a.reviewCommentEditor,children:[e.jsx("textarea",{className:I.commentInput,value:pe,onChange:k=>re(k.target.value),disabled:x}),e.jsx("button",{type:"button",className:M.secondaryHeaderBtn,onClick:()=>{Pt()},disabled:x||!pe.trim(),children:"Save Comment"})]}):e.jsx(ke,{remarkPlugins:[Se],rehypePlugins:[je],children:n.body})})]},n.id)}),e.jsx("div",{ref:Ye})]}),e.jsxs("div",{className:I.commentInputArea,children:[e.jsxs("div",{className:a.reviewComposer,children:[H&&e.jsxs("div",{className:a.reviewAnchorChip,children:[e.jsx("span",{children:ft(H)||"Selected text"}),"quote"in H&&H.quote&&e.jsxs("span",{className:a.reviewAnchorSnippet,children:['"',H.quote,'"']}),e.jsx("button",{type:"button",className:a.reviewAnchorClear,onClick:()=>Q(null),children:"Clear"})]}),e.jsx("textarea",{className:I.commentInput,placeholder:h?.status==="resolved"?"Reopen this review to add more comments…":H?"Add a comment for the selected text…":"Add a comment for this document review…",value:E,onChange:n=>P(n.target.value),disabled:x||h?.status==="resolved",onKeyDown:n=>{n.key==="Enter"&&!n.shiftKey&&(n.preventDefault(),et())}})]}),e.jsx("button",{type:"button",className:I.sendCommentBtn,onClick:()=>{et()},disabled:x||!E.trim()||h?.status==="resolved","aria-label":"Send review comment",title:"Send review comment",children:e.jsx(vn,{size:15})})]})]})]})})]})),m&&_t&&b!==null&&e.jsx(xa,{content:b,docTitle:t.title,apiBaseUrl:c,onClose:()=>Ae(!1),onGenerated:n=>Ae(!1)}),!T&&e.jsx("div",{className:a.printHint,children:"For the cleanest output, disable browser Headers and footers in the print dialog."})]})}function pt(t){return typeof t=="string"?t.trim().replace(/\/+$/,""):""}function Pa(t){return t.runtimeMode==="local"?"":pt(t.apiBaseUrl)||pt(t.cloudAuthBaseUrl)||""}function We(t){let l=t;try{l=decodeURIComponent(t)}catch{l=t}return l.trim().replace(/\\/g,"/").replace(/^\/+/,"").replace(/^\.\//,"").replace(/^\.taskforce\//,"")}function Ma(t,l){return!!(t===l||t.endsWith(`/${l}`)||l.endsWith(`/${t}`))}function vt(t){const l=We(String(t||""));if(!l)return null;const c=l.match(/(^|\/)(asset-[a-f0-9]{32})(?=[^/]*$)/i);return c?.[2]?c[2].toLowerCase():null}function Ce(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 za({tasks:t,apiBaseUrl:l="",documents:c,loading:r,error:u,selectedDoc:m,searchQuery:v,typeFilters:S,attachmentFilters:g,onSearchChange:w,onSelectDoc:p,onRefresh:_,enableTaskGeneration:b=!1}){const L=c.filter(N=>{const F=`${fe(N)} ${N.originalFilename||""}`.toLowerCase(),G=!v||F.includes(v.toLowerCase()),O=S.length===0||S.includes(N.docType),Y=Ce(N),y=g.length===0||g.includes(Y);return G&&O&&y}),z=v.trim().length>0||S.length>0||g.length>0,D=new Map(t.map(N=>[N.id,N]));return e.jsxs("div",{className:M.docWorkspace,children:[e.jsx("div",{className:M.docIndexPanel,children:e.jsx(Hn,{documents:L,selectedDocId:m?.id??null,loading:r,error:u,searchQuery:v,onSearchChange:w,onSelect:N=>p(N),onRefresh:_,taskById:D,hasActiveFilters:z})}),e.jsx("div",{className:M.docViewerPanel,children:m?e.jsx(Da,{doc:m,taskTitle:m.taskId?D.get(m.taskId)?.title??null:null,apiBaseUrl:l,onSaved:N=>_(),onDeleted:()=>{p(null),_()},enableTaskGeneration:b}):!r&&e.jsx("div",{className:M.docViewerEmpty,children:e.jsx("p",{className:"tf-empty-copy",children:L.length===0?"No documents match your current filters.":"Select a document to view it."})})})]})}function Ua({tasks:t,runtimeMode:l="local",apiBaseUrl:c="",cloudAuthBaseUrl:r="",typeFilters:u,attachmentFilters:m,onTypeFiltersChange:v,onAttachmentFiltersChange:S,requestedDocPath:g=null,requestedDocAssetId:w=null,onRequestedDocHandled:p,enableTaskGeneration:_=!1}){const[b,L]=i.useState([]),[z,D]=i.useState(!0),[N,J]=i.useState(null),[F,G]=i.useState(null),[O,Y]=i.useState(""),[y,j]=i.useState(()=>Wt.map(E=>E.value)),[q,Ne]=i.useState(()=>Kt.map(E=>E.value)),ee=Pa({runtimeMode:l,apiBaseUrl:c,cloudAuthBaseUrl:r}),A=u??y,se=m??q,V=i.useCallback(async()=>{D(!0),J(null);try{const E=await B("/api/taskforce/documents",{credentials:"include"},ee);if(!E.ok)throw new Error(`Failed to load documents (${E.status})`);const x=(await E.json()).documents||[];Array.isArray(x)&&x.length,L(x)}catch(E){J(E?.message||"Failed to load documents"),E?.message}finally{D(!1)}},[ee,l]);return i.useEffect(()=>{V()},[V]),i.useEffect(()=>{g||w||!F&&b.length>0&&G(b[0])},[b,F,w,g]),i.useEffect(()=>{if(!g&&!w||b.length===0)return;const E=g?We(g):"",P=String(w||"").trim().toLowerCase()||vt(g),x=b.find($=>{const H=vt($.fsPath)||String($.assetId||"").trim().toLowerCase()||null;if(P&&H&&H===P)return!0;if(!E)return!1;const Q=We($.fsPath);return Ma(Q,E)});if(x){G(x),p?.();return}},[w,g,b,p]),i.useEffect(()=>{if((g||w)&&!F)return;const E=b.filter(P=>{const $=`${fe(P)} ${P.originalFilename||""}`.toLowerCase(),H=!O||$.includes(O.toLowerCase()),Q=A.length===0||A.includes(P.docType),he=Ce(P),ae=se.length===0||se.includes(he);return H&&Q&&ae});F&&E.some(P=>P.id===F.id)||G(E[0]??null)},[se,b,w,g,O,F,A]),e.jsx(za,{tasks:t,apiBaseUrl:ee,documents:b,loading:z,error:N,selectedDoc:F,searchQuery:O,typeFilters:A,attachmentFilters:se,onSearchChange:Y,onSelectDoc:G,onRefresh:V,enableTaskGeneration:_})}export{Kt as DOCUMENT_ATTACHMENT_FILTER_OPTIONS,Wt as DOCUMENT_TYPE_FILTER_OPTIONS,za as DocumentWorkspace,Ua as DocumentWorkspaceShell,Ce as getEffectiveAttachmentState};
@@ -1 +0,0 @@
1
- ._index_18mna_1{display:flex;flex-direction:column;height:100%;min-height:0}._header_18mna_8{display:flex;align-items:center;justify-content:space-between;padding:14px 12px 10px;border-bottom:1px solid var(--border-subtle);flex-shrink:0}._title_18mna_17{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:600;color:var(--text-primary)}._refreshBtn_18mna_26{background:transparent;border:none;color:var(--text-muted);cursor:pointer;padding:4px;border-radius:4px;display:flex;align-items:center;transition:color .15s,background .15s}._refreshBtn_18mna_26:hover{color:var(--text-primary);background:var(--bg-hover)}._refreshBtn_18mna_26:disabled{opacity:.5;cursor:not-allowed}._search_18mna_48{position:relative;padding:8px 10px;flex-shrink:0}._searchIcon_18mna_54{position:absolute;left:18px;top:50%;transform:translateY(-50%);color:var(--text-muted);pointer-events:none}._searchInput_18mna_63{width:100%;padding:6px 8px 6px 28px;background:var(--bg-primary);border:1px solid var(--border-subtle);border-radius:6px;color:var(--text-primary);font-size:12px;font-family:inherit;outline:none;box-sizing:border-box}._searchInput_18mna_63:focus{border-color:var(--brand-primary)}._list_18mna_80{flex:1;overflow-y:auto;min-height:0;padding:4px 0;scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track)}._state_18mna_89{padding:24px 16px;font-size:12px;color:var(--text-muted);text-align:center;line-height:1.5}._stateError_18mna_97{padding:16px;font-size:12px;color:var(--status-error);text-align:center}._item_18mna_104{width:100%;display:flex;align-items:flex-start;gap:8px;padding:8px 12px;background:transparent;border:none;cursor:pointer;text-align:left;transition:background .12s;font-family:inherit;color:var(--text-primary);min-width:0}._item_18mna_104:hover{background:var(--bg-hover, rgba(255, 255, 255, .04))}._itemActive_18mna_124{background:var(--brand-primary-soft)}._itemActive_18mna_124:hover{background:color-mix(in srgb,var(--brand-primary) 18%,transparent)}._itemIcon_18mna_132{color:var(--text-muted);padding-top:1px;flex-shrink:0}._itemActive_18mna_124 ._itemIcon_18mna_132{color:var(--brand-primary-strong)}._itemBody_18mna_142{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}._itemTitle_18mna_150{display:block;max-width:100%;font-size:12px;font-weight:500;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-transform:capitalize}._itemTask_18mna_162{display:block;max-width:100%;font-size:11px;color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._itemBadge_18mna_172{display:inline-flex;align-items:center;width:fit-content;padding:2px 6px;border-radius:999px;border:1px solid color-mix(in srgb,var(--status-warning) 28%,transparent);background:color-mix(in srgb,var(--status-warning) 12%,transparent);color:color-mix(in srgb,var(--status-warning) 70%,white);font-size:10px;font-weight:600}._itemMeta_18mna_185{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;font-size:10px;color:var(--text-muted)}._itemMetaDetails_18mna_195{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._itemMetaReference_18mna_202{flex-shrink:0;font-size:10px;font-weight:600;color:var(--text-secondary)}._viewer_biumc_1{flex:1;display:flex;flex-direction:column;overflow:hidden;min-height:0;height:100%}._viewerMonochrome_biumc_10 ._metaDocumentName_biumc_10{color:#111!important}._viewerEditMode_biumc_14{background:var(--bg-primary)}._meta_biumc_10{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 20px;border-bottom:1px solid var(--border-subtle);background:var(--bg-secondary);flex-shrink:0;flex-wrap:wrap}._metaLeft_biumc_30{display:flex;align-items:center;gap:12px;flex-wrap:wrap}._metaDocumentName_biumc_10{font-size:14px;font-weight:700;color:var(--text-primary);max-width:min(26ch,100%);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;letter-spacing:-.015em;cursor:text}._metaRenameRow_biumc_49{display:inline-flex;align-items:center;gap:8px;min-width:min(420px,100%)}._typeBadge_biumc_56{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:999px;font-size:10px;font-weight:600;background:var(--brand-primary-soft);color:var(--brand-primary-strong);border:1px solid color-mix(in srgb,var(--brand-primary) 25%,transparent);text-transform:uppercase;letter-spacing:.3px}._typeBadgeImplementationPlan_biumc_71{background:color-mix(in srgb,var(--status-info) 15%,transparent);color:color-mix(in srgb,var(--status-info) 55%,white);border-color:color-mix(in srgb,var(--status-info) 25%,transparent)}._typeBadgeReview_biumc_77{background:color-mix(in srgb,var(--status-warning) 15%,transparent);color:color-mix(in srgb,var(--status-warning) 68%,white);border-color:color-mix(in srgb,var(--status-warning) 25%,transparent)}._typeBadgeWalkthrough_biumc_83{background:color-mix(in srgb,var(--status-success) 15%,transparent);color:color-mix(in srgb,var(--status-success) 60%,white);border-color:color-mix(in srgb,var(--status-success) 25%,transparent)}._metaTaskName_biumc_89{font-size:11px;color:var(--text-secondary);max-width:180px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._statusBadge_biumc_98{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:999px;border:1px solid color-mix(in srgb,var(--status-warning) 28%,transparent);background:color-mix(in srgb,var(--status-warning) 12%,transparent);color:color-mix(in srgb,var(--status-warning) 68%,white);font-size:10px;font-weight:600;letter-spacing:.2px;text-transform:uppercase}._metaDate_biumc_113,._metaSize_biumc_114{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--text-muted)}._actions_biumc_122{display:flex;align-items:center;gap:6px;flex-shrink:0}._actionBtn_biumc_129{display:inline-flex;align-items:center;gap:5px;padding:5px 10px;border-radius:6px;border:1px solid var(--border-subtle);background:transparent;color:var(--text-secondary);font-size:11px;font-family:inherit;cursor:pointer;transition:all .15s;white-space:nowrap}._actionBtn_biumc_129:hover{background:var(--bg-hover);color:var(--text-primary);border-color:var(--border-primary)}._actionBtn_biumc_129:disabled{opacity:.6;cursor:not-allowed}._dangerBtn_biumc_156{border-color:color-mix(in srgb,var(--status-error) 35%,transparent)!important;color:color-mix(in srgb,var(--status-error) 45%,white)!important}._dangerBtn_biumc_156:hover:not(:disabled){background:color-mix(in srgb,var(--status-error) 12%,transparent)!important;border-color:color-mix(in srgb,var(--status-error) 50%,transparent)!important;color:color-mix(in srgb,var(--status-error) 30%,white)!important}._generateBtn_biumc_167{background:var(--brand-primary-soft)!important;border-color:var(--brand-primary-border)!important;color:var(--brand-primary-strong)!important}._generateBtn_biumc_167:hover{background:color-mix(in srgb,var(--brand-primary) 24%,transparent)!important;color:color-mix(in srgb,var(--brand-primary-strong) 72%,white)!important}._editBtn_biumc_178{color:var(--text-primary)!important;border-color:var(--border-primary)!important}._editBtn_biumc_178:hover{background:color-mix(in srgb,var(--brand-primary) 10%,transparent)!important;border-color:var(--brand-primary-border)!important;color:var(--brand-primary-strong)!important}._saveBtn_biumc_189{background:color-mix(in srgb,var(--brand-primary) 15%,transparent)!important;border-color:var(--brand-primary-border)!important;color:var(--brand-primary-strong)!important}._saveBtn_biumc_189:hover:not(:disabled){background:color-mix(in srgb,var(--brand-primary) 25%,transparent)!important;color:color-mix(in srgb,var(--brand-primary-strong) 72%,white)!important}._saveBtn_biumc_189:disabled{opacity:.4!important;cursor:not-allowed!important}._layoutToggle_biumc_205{display:flex;background:var(--bg-primary);border:1px solid var(--border-subtle);border-radius:6px;overflow:hidden}._layoutBtn_biumc_213{padding:5px 8px;background:transparent;border:none;color:var(--text-muted);cursor:pointer;display:flex;align-items:center;transition:all .12s}._layoutBtn_biumc_213:hover{color:var(--text-primary);background:var(--bg-hover)}._layoutBtnActive_biumc_229{color:var(--brand-primary-strong);background:var(--brand-primary-soft)}._saveStatus_biumc_234{display:inline-flex;align-items:center;gap:4px;font-size:11px}._saveStatusSaved_biumc_241{color:var(--status-success)}._saveStatusError_biumc_245{color:var(--status-error);cursor:help}._unsaved_biumc_250{font-size:11px;color:color-mix(in srgb,var(--status-warning) 70%,white);font-style:italic}._viewerContent_biumc_256{flex:1;overflow-y:auto;padding:16px 24px 40px;min-height:0;scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track)}._viewerBody_biumc_265{flex:1;min-height:0;display:grid;grid-template-columns:minmax(0,1fr) 360px;align-items:stretch}._viewerMain_biumc_273{border-right:1px solid var(--border-subtle)}._reviewRail_biumc_277{min-height:0;overflow:hidden;background:color-mix(in srgb,var(--bg-secondary) 78%,transparent)}._printHint_biumc_283{padding:0 24px 18px;color:var(--text-muted);font-size:11px;line-height:1.45}._reviewSection_biumc_290{height:100%;min-height:0;padding:18px 18px 18px 16px;display:flex;flex-direction:column;gap:12px}._reviewHeader_biumc_299{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap}._reviewTitle_biumc_307{display:inline-flex;align-items:center;gap:8px;font-size:13px;font-weight:700;color:var(--text-primary)}._reviewSubtitle_biumc_316{margin:4px 0 0;color:var(--text-muted);font-size:11px;line-height:1.45}._reviewControls_biumc_323{display:flex;align-items:center;gap:8px;flex-wrap:wrap}._reviewSelect_biumc_330{min-width:180px}._reviewSessionMeta_biumc_334{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:11px}._reviewStatusResolved_biumc_342{border-color:color-mix(in srgb,var(--status-success) 30%,transparent);background:color-mix(in srgb,var(--status-success) 12%,transparent);color:color-mix(in srgb,var(--status-success) 66%,white)}._reviewSessionLabel_biumc_348{color:var(--text-secondary);font-weight:600}._reviewTitleEditRow_biumc_353{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap}._reviewSessionTimestamp_biumc_360{color:var(--text-muted)}._reviewAnchorLabel_biumc_364{color:var(--text-muted);font-size:11px;padding:0 4px}._reviewComposer_biumc_370{flex:1;display:flex;flex-direction:column;gap:8px}._reviewAnchorChip_biumc_377{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:8px 10px;border:1px solid var(--border-subtle);border-radius:10px;background:var(--bg-secondary);color:var(--text-secondary);font-size:11px}._reviewAnchorSnippet_biumc_390{color:var(--text-primary);font-style:italic}._reviewAnchorClear_biumc_395{border:none;background:transparent;color:var(--brand-primary-strong);font:inherit;cursor:pointer;padding:0}._reviewAnchorClear_biumc_395:hover{text-decoration:underline}._reviewCommentActions_biumc_408{display:inline-flex;align-items:center;gap:6px;margin-left:auto}._reviewCommentAction_biumc_408{border:none;background:transparent;color:var(--text-muted);font:inherit;cursor:pointer;padding:0}._reviewCommentAction_biumc_408:hover{color:var(--text-primary);text-decoration:underline}._reviewCommentEditor_biumc_429{display:flex;flex-direction:column;gap:8px}._viewerState_biumc_435{padding:40px;text-align:center;color:var(--text-muted);font-size:13px}._viewerStateError_biumc_442{padding:40px;text-align:center;color:var(--status-error);font-size:13px}._editorArea_biumc_449{flex:1;display:flex;min-height:0;overflow:hidden}._editorPane_biumc_456{flex:1;display:flex;flex-direction:column;min-width:0;border-right:1px solid var(--border-subtle)}._editorLayoutSplit_biumc_464 ._editorPane_biumc_456,._editorLayoutSplit_biumc_464 ._previewPane_biumc_465,._editorLayoutEditor_biumc_469 ._editorPane_biumc_456,._editorLayoutPreview_biumc_470 ._previewPane_biumc_465{flex:1}._editorPaneLabel_biumc_474{padding:6px 12px;font-size:10px;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;border-bottom:1px solid var(--border-subtle);background:var(--bg-secondary);flex-shrink:0}._editorTextarea_biumc_486{flex:1;width:100%;resize:none;background:var(--bg-primary);color:var(--text-primary);border:none;outline:none;padding:16px;font-family:Fira Code,Cascadia Code,JetBrains Mono,monospace;font-size:13px;line-height:1.65;tab-size:2;caret-color:var(--brand-primary-strong);scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track);min-height:0;box-sizing:border-box}._editorTextarea_biumc_486::selection{background:color-mix(in srgb,var(--brand-primary) 30%,transparent)}._previewPane_biumc_465{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden}._previewPane_biumc_465 .docMarkdown{flex:1;overflow-y:auto;padding:16px 24px 40px;min-height:0;max-width:none;scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track)}._markdownSurface_biumc_528{color:var(--text-body);font-size:14px;line-height:1.7;max-width:800px}._markdownSurface_biumc_528 h1,._markdownSurface_biumc_528 h2,._markdownSurface_biumc_528 h3,._markdownSurface_biumc_528 h4{color:var(--text-primary);font-weight:700;margin:1.5em 0 .5em;line-height:1.3}._markdownSurface_biumc_528 h1{font-size:1.6em}._markdownSurface_biumc_528 h2{font-size:1.25em;border-bottom:1px solid var(--border-subtle);padding-bottom:.3em}._markdownSurface_biumc_528 h3{font-size:1.1em}._markdownSurface_biumc_528 p{margin:.8em 0}._markdownSurface_biumc_528 a{color:var(--brand-primary-strong);text-decoration:underline;text-underline-offset:2px}._markdownSurface_biumc_528 a:hover{color:color-mix(in srgb,var(--brand-primary-strong) 72%,white)}._markdownSurface_biumc_528 code{font-family:Fira Code,Cascadia Code,monospace;font-size:.875em;background:var(--brand-primary-soft);padding:2px 5px;border-radius:4px;color:var(--code-inline-text, var(--brand-primary-strong))}._markdownSurface_biumc_528 pre{background:var(--bg-primary);border:1px solid var(--border-subtle);border-radius:8px;padding:16px;overflow-x:auto;margin:1em 0}._markdownSurface_biumc_528 pre code{background:none;padding:0;font-size:13px;color:var(--code-block-text, var(--text-body))}._markdownSurface_biumc_528 blockquote{border-left:3px solid color-mix(in srgb,var(--brand-primary) 50%,transparent);padding-left:16px;margin:1em 0;color:var(--text-secondary);font-style:italic}._markdownSurface_biumc_528 table{border-collapse:collapse;width:100%;margin:1em 0;font-size:13px}._markdownSurface_biumc_528 th,._markdownSurface_biumc_528 td{border:1px solid var(--border-subtle);padding:8px 12px;text-align:left}._markdownSurface_biumc_528 th{background:var(--bg-secondary);font-weight:600;color:var(--text-secondary);font-size:11px;text-transform:uppercase;letter-spacing:.4px}._markdownSurface_biumc_528 ul,._markdownSurface_biumc_528 ol{padding-left:1.5em;margin:.5em 0}._markdownSurface_biumc_528 li{margin:.3em 0}._markdownSurface_biumc_528 li._task-list-item_biumc_639,._markdownSurface_biumc_528 li[data-task-item=true]{list-style:none}._markdownSurface_biumc_528 li:has(input[type=checkbox]){list-style:none!important;list-style-type:none!important}._markdownSurface_biumc_528 ul._contains-task-list_biumc_649,._markdownSurface_biumc_528 ol._contains-task-list_biumc_649{padding-left:.25em}._markdownSurface_biumc_528 ul:has(li input[type=checkbox]),._markdownSurface_biumc_528 ol:has(li input[type=checkbox]){padding-left:1.25em!important}._markdownSurface_biumc_528 li._task-list-item_biumc_639>input[type=checkbox],._markdownSurface_biumc_528 li[data-task-item=true]>input[type=checkbox]{margin-right:.45em;cursor:pointer;accent-color:var(--brand-primary-strong)}._markdownSurface_biumc_528 hr{border:none;border-top:1px solid var(--border-subtle);margin:1.5em 0}._markdownSurface_biumc_528 img{max-width:100%;border-radius:8px}._viewerMonochrome_biumc_10 ._viewerContent_biumc_256,._viewerMonochrome_biumc_10 ._markdownSurface_biumc_528{background:#fff!important}@media(max-width:1100px){._viewerBody_biumc_265{grid-template-columns:minmax(0,1fr)}._viewerMain_biumc_273{border-right:none;border-bottom:1px solid var(--border-subtle)}._reviewRail_biumc_277{max-height:480px}._reviewSection_biumc_290{padding:16px 24px 18px}}._viewerMonochrome_biumc_10 ._markdownSurface_biumc_528,._viewerMonochrome_biumc_10 ._markdownSurface_biumc_528 h1,._viewerMonochrome_biumc_10 ._markdownSurface_biumc_528 h2,._viewerMonochrome_biumc_10 ._markdownSurface_biumc_528 h3,._viewerMonochrome_biumc_10 ._markdownSurface_biumc_528 h4,._viewerMonochrome_biumc_10 ._markdownSurface_biumc_528 p,._viewerMonochrome_biumc_10 ._markdownSurface_biumc_528 li,._viewerMonochrome_biumc_10 ._markdownSurface_biumc_528 blockquote,._viewerMonochrome_biumc_10 ._markdownSurface_biumc_528 th,._viewerMonochrome_biumc_10 ._markdownSurface_biumc_528 td,._viewerMonochrome_biumc_10 ._markdownSurface_biumc_528 a{color:#111!important}._viewerMonochrome_biumc_10 ._markdownSurface_biumc_528 code{color:#111!important;background:#f2f2f2!important}._viewerMonochrome_biumc_10 ._markdownSurface_biumc_528 pre{background:#f7f7f7!important;border-color:#d7d7d7!important}._viewerMonochrome_biumc_10 ._markdownSurface_biumc_528 pre code,._viewerMonochrome_biumc_10 ._markdownSurface_biumc_528 code,._viewerMonochrome_biumc_10 ._markdownSurface_biumc_528 a,._viewerMonochrome_biumc_10 ._metaTaskName_biumc_89,._viewerMonochrome_biumc_10 ._metaDate_biumc_113,._viewerMonochrome_biumc_10 ._metaSize_biumc_114{color:#111!important}._overlay_1unik_1{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:#0000008c;z-index:2000;padding:1rem}._modal_1unik_12{width:min(720px,100%)}._header_1unik_16{align-items:flex-start}._title_1unik_20{font-size:1rem}._docName_1unik_24{font-size:.75rem;color:var(--text-secondary);max-width:14rem;text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._body_1unik_34{padding:.75rem 1rem 1rem;display:flex;flex-direction:column;gap:.75rem}._state_1unik_41{min-height:10rem;display:flex;align-items:center;justify-content:center;gap:.5rem;font-size:.875rem;color:var(--text-secondary);text-align:center}._stateError_1unik_52{min-height:10rem;display:flex;align-items:center;justify-content:center;gap:.5rem;font-size:.875rem;color:var(--status-error);text-align:center}._stateDone_1unik_63{min-height:10rem;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;text-align:center}._stateDone_1unik_63 strong{color:var(--text-primary);font-size:1rem}._stateDone_1unik_63 p{margin:0;font-size:.8125rem;color:var(--text-secondary)}._toolbar_1unik_84{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.625rem .75rem;border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-inset)}._toolbarCount_1unik_95{font-size:.75rem;color:var(--text-secondary)}._toolbarActions_1unik_100{display:flex;gap:.5rem}._tree_1unik_105{display:flex;flex-direction:column;gap:.125rem;max-height:22rem;overflow-y:auto}._taskRow_1unik_113{display:flex;align-items:center;gap:.375rem;padding:.4375rem .75rem;min-height:2.125rem;transition:background .1s}._taskRow_1unik_113:hover{background:#ffffff08}._taskRowDimmed_1unik_126{opacity:.4}._taskCheck_1unik_130{background:transparent;border:none;cursor:pointer;display:flex;padding:0;flex-shrink:0}._taskExpandBtn_1unik_139{background:transparent;border:none;color:var(--text-muted);cursor:pointer;display:flex;align-items:center;padding:0;flex-shrink:0;transition:color .1s}._taskExpandBtn_1unik_139:hover{color:var(--text-primary)}._taskExpandSpacer_1unik_155{width:12px;flex-shrink:0}._taskTitle_1unik_160{flex:1;font-size:.8125rem;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._taskBadge_1unik_169{font-size:.625rem;padding:.125rem .375rem;border-radius:var(--radius-sm);border:1px solid currentColor;opacity:.85;white-space:nowrap;flex-shrink:0}._footer_1unik_179{display:flex;align-items:center;justify-content:flex-end;gap:.625rem;padding:0 1rem 1rem}
@@ -1 +0,0 @@
1
- ._plansWrapper_1i5vs_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_1i5vs_28{width:min(1100px,100%);max-width:1100px;margin:0 auto;display:flex;flex-direction:column}._shellOwnsScroll_1i5vs_36{overflow:visible;min-height:100%;scrollbar-gutter:auto}._withChrome_1i5vs_42{padding-top:52px}._siteVariant_1i5vs_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_1i5vs_46 ._title_1i5vs_54{background:none;-webkit-text-fill-color:var(--text-primary);color:var(--text-primary);font-size:clamp(34px,6vw,58px);letter-spacing:-.03em;margin-bottom:0}._siteVariant_1i5vs_46 ._subtitle_1i5vs_63{color:#a6b3d9}._siteVariant_1i5vs_46 ._header_1i5vs_67{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_1i5vs_46 ._planCard_1i5vs_79{background:#090e20b3;border-color:#cbd5ff33;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);border-radius:16px;padding:22px 20px}._siteVariant_1i5vs_46 ._planCard_1i5vs_79:hover{transform:translateY(-3px);box-shadow:none}._siteVariant_1i5vs_46 ._grid_1i5vs_92{max-width:1040px;gap:12px;grid-template-columns:repeat(3,minmax(0,1fr))}._siteVariant_1i5vs_46 ._planName_1i5vs_98{font-size:22px}._siteVariant_1i5vs_46 ._featureText_1i5vs_102{color:#a6b3d9}._siteVariant_1i5vs_46 ._currentBadge_1i5vs_106{font-size:11px}._siteVariant_1i5vs_46 ._navAction_1i5vs_110,._siteVariant_1i5vs_46 ._backBtn_1i5vs_111{border:1px solid rgba(203,213,255,.2);background:#141d3c99;color:#f6f8ff}._siteVariant_1i5vs_46 ._backBtn_1i5vs_111:hover,._siteVariant_1i5vs_46 ._navAction_1i5vs_110:hover{background:#141d3cd9}._siteVariant_1i5vs_46 ._priceRows_1i5vs_122{border-top-color:#cbd5ff33}._header_1i5vs_67{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_1i5vs_139{width:100%;display:flex;justify-content:space-between;align-items:center;gap:16px;margin-bottom:24px}._headerActions_1i5vs_148{display:flex;align-items:center;justify-content:flex-end;gap:12px;flex-wrap:wrap}._title_1i5vs_54{font-size:clamp(38px,5vw,54px);font-weight:800;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_1i5vs_63{max-width:720px;font-size:18px;color:var(--text-secondary);line-height:1.7}._debugMeta_1i5vs_175{margin-top:16px;font-size:13px;color:var(--text-secondary);opacity:.8}._grid_1i5vs_92{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:20px;width:100%}._planCard_1i5vs_79{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_1i5vs_204{cursor:pointer}._clickablePlanCard_1i5vs_204:focus-visible{outline:2px solid var(--plans-accent);outline-offset:4px}._planCard_1i5vs_79:hover{transform:translateY(-4px);border-color:var(--plans-accent-border);box-shadow:0 20px 36px #0000002e}._activePlanCard_1i5vs_219{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_1i5vs_106{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_1i5vs_98{font-size:28px;font-weight:700;color:var(--text-primary);margin-bottom:14px}._priceDisplay_1i5vs_251{margin-bottom:32px;display:flex;align-items:baseline;gap:8px}._priceAmount_1i5vs_258{font-size:56px;font-weight:800;color:var(--text-primary);letter-spacing:-2px;line-height:1}._priceInterval_1i5vs_266{font-size:16px;color:var(--text-secondary);font-weight:500}._callToAction_1i5vs_272{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_1i5vs_284{background:var(--button-primary-bg);border-color:var(--button-primary-border);color:var(--button-primary-text, white)}._primaryCta_1i5vs_284:hover{transform:translateY(-1px);box-shadow:0 10px 22px var(--brand-primary-glow)}._secondaryCta_1i5vs_295{background:var(--button-secondary-bg);color:var(--button-secondary-text);border-color:var(--button-secondary-border)}._secondaryCta_1i5vs_295:hover{background:var(--button-secondary-hover-bg);border-color:var(--button-secondary-hover-border);color:var(--button-secondary-hover-text)}._currentCta_1i5vs_307{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_1i5vs_307: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_1i5vs_321{flex:1;display:flex;flex-direction:column;gap:20px;margin-bottom:28px}._priceRows_1i5vs_122{display:flex;flex-direction:column;gap:10px;margin-top:auto;margin-bottom:16px;border-top:1px solid var(--border-default);padding-top:16px}._priceRow_1i5vs_122{display:flex;align-items:baseline;justify-content:space-between;gap:10px}._priceRowAmount_1i5vs_346{font-size:22px;font-weight:700;color:var(--text-primary)}._priceRowInterval_1i5vs_352{color:var(--text-secondary);font-weight:600}._ctaRow_1i5vs_357{display:grid;grid-template-columns:1fr 1fr;gap:10px}._featureItem_1i5vs_363{display:flex;align-items:flex-start;gap:16px}._featureIcon_1i5vs_369{color:var(--plans-accent);flex-shrink:0;width:20px;height:20px;margin-top:2px}._featureText_1i5vs_102{font-size:16px;line-height:1.5;color:var(--text-primary)}._emptyState_1i5vs_383{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_1i5vs_392{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_1i5vs_392 h2{margin:18px 0 14px;font-size:clamp(32px,4vw,52px);line-height:1.02;letter-spacing:-.04em;color:#f8fafc}._marketingEmptyState_1i5vs_392 p{margin:0 auto;max-width:680px;font-size:18px;line-height:1.7;color:#cbd5e1}._emptyBadge_1i5vs_420{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_1i5vs_435{display:flex;flex-wrap:wrap;justify-content:center;gap:12px;margin-top:28px}._emptyHighlights_1i5vs_435 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_1i5vs_457{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:50vh;gap:24px;color:var(--text-secondary)}._spinner_1i5vs_467{animation:_spin_1i5vs_467 1s linear infinite;color:var(--accent-primary, #6366f1)}@keyframes _spin_1i5vs_467{0%{transform:rotate(0)}to{transform:rotate(360deg)}}._backBtn_1i5vs_111{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_1i5vs_111:hover{background:var(--button-secondary-hover-bg);border-color:var(--button-secondary-hover-border);color:var(--button-secondary-hover-text)}._navAction_1i5vs_110{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_1i5vs_110:hover{background:var(--button-secondary-hover-bg);border-color:var(--button-secondary-hover-border);color:var(--button-secondary-hover-text)}._statusBanner_1i5vs_520{margin-top:24px;padding:12px 24px;border-radius:12px;font-weight:500;font-size:14px}._successBanner_1i5vs_528{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_1i5vs_534{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_1i5vs_540{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_1i5vs_1{padding:28px 14px}._withChrome_1i5vs_42{padding-top:36px}._header_1i5vs_67{margin-bottom:24px;padding:22px 18px}._headerBar_1i5vs_139{gap:10px;flex-wrap:wrap;margin-bottom:18px}._title_1i5vs_54{font-size:34px;margin-bottom:12px}._grid_1i5vs_92{grid-template-columns:1fr;gap:18px}._siteVariant_1i5vs_46 ._grid_1i5vs_92{grid-template-columns:1fr}._siteVariant_1i5vs_46 ._header_1i5vs_67{padding:26px 18px}._planCard_1i5vs_79{padding:22px}._marketingEmptyState_1i5vs_392{padding:56px 24px}._marketingEmptyState_1i5vs_392 h2{font-size:34px}._marketingEmptyState_1i5vs_392 p{font-size:16px}._headerActions_1i5vs_148{width:100%;justify-content:flex-start}}
@@ -1 +0,0 @@
1
- import{r as i,j as t}from"./vendor-react-CKJs5o3c.js";import{t as ke,y as Ee,z as te,B as ne,C as we,E as xe}from"./index-DXUdtH1B.js";import{aK as Ie,h as Ne,U as Pe}from"./vendor-icons-I7ZwG1z_.js";import{u as je,a as Re}from"./vendor-router-BbWMxlnO.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";const Te="_plansWrapper_1i5vs_1",Be="_contentFrame_1i5vs_28",Ue="_shellOwnsScroll_1i5vs_36",$e="_withChrome_1i5vs_42",Oe="_siteVariant_1i5vs_46",Ae="_title_1i5vs_54",Me="_subtitle_1i5vs_63",Le="_header_1i5vs_67",Fe="_planCard_1i5vs_79",De="_grid_1i5vs_92",Ke="_planName_1i5vs_98",Ve="_featureText_1i5vs_102",He="_currentBadge_1i5vs_106",Ye="_navAction_1i5vs_110",Ge="_backBtn_1i5vs_111",qe="_priceRows_1i5vs_122",ze="_headerBar_1i5vs_139",We="_headerActions_1i5vs_148",Xe="_debugMeta_1i5vs_175",Qe="_clickablePlanCard_1i5vs_204",Je="_activePlanCard_1i5vs_219",Ze="_callToAction_1i5vs_272",et="_primaryCta_1i5vs_284",tt="_secondaryCta_1i5vs_295",nt="_currentCta_1i5vs_307",rt="_featuresList_1i5vs_321",st="_priceRow_1i5vs_122",at="_priceRowAmount_1i5vs_346",it="_priceRowInterval_1i5vs_352",ot="_ctaRow_1i5vs_357",ct="_featureItem_1i5vs_363",lt="_featureIcon_1i5vs_369",ut="_emptyState_1i5vs_383",dt="_marketingEmptyState_1i5vs_392",mt="_emptyBadge_1i5vs_420",pt="_emptyHighlights_1i5vs_435",gt="_loader_1i5vs_457",ft="_spinner_1i5vs_467",ht="_statusBanner_1i5vs_520",St="_successBanner_1i5vs_528",yt="_infoBanner_1i5vs_534",_t="_errorBanner_1i5vs_540",n={plansWrapper:Te,contentFrame:Be,shellOwnsScroll:Ue,withChrome:$e,siteVariant:Oe,title:Ae,subtitle:Me,header:Le,planCard:Fe,grid:De,planName:Ke,featureText:Ve,currentBadge:He,navAction:Ye,backBtn:Ge,priceRows:qe,headerBar:ze,headerActions:We,debugMeta:Xe,clickablePlanCard:Qe,activePlanCard:Je,callToAction:Ze,primaryCta:et,secondaryCta:tt,currentCta:nt,featuresList:rt,priceRow:st,priceRowAmount:at,priceRowInterval:it,ctaRow:ot,featureItem:ct,featureIcon:lt,emptyState:ut,marketingEmptyState:dt,emptyBadge:mt,emptyHighlights:pt,loader:gt,spinner:ft,statusBanner:ht,successBanner:St,infoBanner:yt,errorBanner:_t};function Ct(){const r=globalThis.__DEBUG_MODE__;return typeof r=="boolean"?r:!1}function vt(r){const o=String(r?.environment||"").trim(),f=String(r?.runtimeMode||"").trim();return!o&&!f?null:o&&f?`${o} (${f})`:o||f||null}function bt(r,o){if(r==null||!o)return"Contact Sales";try{return new Intl.NumberFormat("en-US",{style:"currency",currency:o.toUpperCase(),minimumFractionDigits:0}).format(r/100)}catch{return`${o.toUpperCase()} ${r/100}`}}function kt(){return"$0.00"}function he(r){return r?r.pricingType==="free"?!0:r.unitAmount!=null&&r.currency!=null:!1}function Se(r){return r?r.pricingType==="free"?kt():bt(r.unitAmount,r.currency):"Unavailable"}function ye(r){const o=[r.pricing.month,r.pricing.year].filter(Boolean);if(o.some(h=>h.pricingType==="free"))return 0;const f=o.map(h=>h.pricingType==="stripe"&&typeof h.unitAmount=="number"?h.unitAmount:null).filter(h=>h!=null);return f.length>0?Math.min(...f):Number.POSITIVE_INFINITY}function Et(r){const o=String(r||"").trim().toLowerCase();return o==="active"||o==="trialing"||o==="grace"}function wt({heading:r,subtitle:o,variant:f="app",chrome:h,footer:$,isAuthenticated:O,authSessionResolved:le=!0,currentPlanId:W,currentPlanVersionId:F,currentEntitlementState:X,canManageCurrentPlan:v=!0,pricingEndpoint:re,statusBanner:A,onBack:k,backLabel:Q,backDisabled:_=!1,topActions:S,shellOwnsScroll:p=!1,showPageBackButton:J=!0,fallbackPricingSource:D=null,onSelectPlan:x}){const[se,u]=i.useState([]),[K,N]=i.useState(null),[T,B]=i.useState(!0),[M,ae]=i.useState(null),[V,ie]=i.useState(0);i.useEffect(()=>{let a=!0;return(async()=>{const b=String(re||"/api/taskforce/public/pricing").trim()||"/api/taskforce/public/pricing";a&&(B(!0),ae(null));try{const C=await fetch(b,{method:"GET",credentials:"include"}),c=await C.json().catch(()=>({}));if(C.ok){a&&(u(Array.isArray(c?.plans)?c.plans:[]),N(c?.pricingSource&&typeof c.pricingSource=="object"?c.pricingSource:null));return}throw new Error(String(c?.error||`Failed to load pricing (${C.status})`))}catch(C){if(a){const c=C instanceof Error?C.message:"Failed to load pricing";ae(c||"Failed to load pricing"),N(null)}}finally{a&&B(!1)}})(),()=>{a=!1}},[re,V]);const H=i.useMemo(()=>[...se].sort((a,l)=>{const b=ye(a),C=ye(l);if(b!==C)return b-C;const c=a.defaultVersion?.versionNumber||0,m=l.defaultVersion?.versionNumber||0;return c!==m?c-m:String(a.displayName||a.planId).localeCompare(String(l.displayName||l.planId))}),[se]),E=i.useMemo(()=>vt(K||D),[D,K]),Y=`${n.plansWrapper} ${p?n.shellOwnsScroll:"tf-scrollbar"} ${f==="site"?n.siteVariant:""} ${h?n.withChrome:""}`.trim(),Z=a=>p?t.jsxs(t.Fragment,{children:[h,a,$]}):t.jsxs("div",{className:ke.standaloneWrapper,"data-theme":"dark",children:[h,a,$]});return Z(T||!le?t.jsx(t.Fragment,{children:t.jsx("div",{className:Y,children:t.jsx("div",{className:n.contentFrame,children:t.jsxs("div",{className:n.loader,children:[t.jsx(Ne,{size:48,className:n.spinner}),t.jsx("p",{children:"Loading plans..."})]})})})}):M?t.jsx(t.Fragment,{children:t.jsx("div",{className:Y,children:t.jsx("div",{className:n.contentFrame,children:t.jsxs("div",{className:n.emptyState,children:[t.jsx("h2",{children:"Connecting to plan pricing..."}),t.jsx("p",{children:M}),t.jsx("button",{className:n.backBtn,onClick:()=>ie(a=>a+1),children:"Retry"})]})})})}):t.jsx(t.Fragment,{children:t.jsx("div",{className:Y,children:t.jsxs("div",{className:n.contentFrame,children:[t.jsxs("div",{className:n.header,children:[!h&&(J||S)&&t.jsxs("div",{className:n.headerBar,children:[t.jsx("div",{children:J?t.jsx("button",{className:n.backBtn,onClick:k,disabled:_,children:Q}):null}),t.jsx("div",{className:n.headerActions,children:S})]}),t.jsx("h1",{className:n.title,children:r}),o&&t.jsx("p",{className:n.subtitle,children:o}),Ct()&&E?t.jsxs("p",{className:n.debugMeta,children:["Pricing source: ",E]}):null,A&&t.jsx("div",{className:`${n.statusBanner} ${A.type==="success"?n.successBanner:A.type==="info"?n.infoBanner:n.errorBanner}`,children:A.message})]}),H.length===0?t.jsxs("div",{className:`${n.emptyState} ${n.marketingEmptyState}`,children:[t.jsx("span",{className:n.emptyBadge,children:"Coming Soon"}),t.jsx("h2",{children:"Paid plans are getting their final polish."}),t.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."}),t.jsxs("div",{className:n.emptyHighlights,"aria-label":"Upcoming pricing highlights",children:[t.jsx("span",{children:"Launch-ready tiers"}),t.jsx("span",{children:"Team billing controls"}),t.jsx("span",{children:"Feature-based packaging"})]})]}):t.jsx("div",{className:n.grid,children:H.map(a=>{const l=a.pricing.month,b=a.pricing.year,C=he(l),c=he(b),m=String(a.defaultVersion?.planVersionId||"").trim(),I=!!(m&&F&&F===m&&Et(X))||!F&&!!(W&&W===a.planId),w=C?"month":c?"year":null,y=w==="year"?b:l,P=!!m&&(I?v:!!w),ee=()=>{if(m){if(I){if(!v)return;x({planId:a.planId,planVersionId:m,interval:w||"month",pricingType:y?.pricingType||"stripe",isCurrentPlan:!0});return}w&&x({planId:a.planId,planVersionId:m,interval:w,pricingType:y?.pricingType||"stripe",isCurrentPlan:!1})}};return t.jsxs("div",{className:`${n.planCard} ${I?n.activePlanCard:""} ${P?n.clickablePlanCard:""}`,"data-testid":`plan-card-${a.planId}`,role:P?"button":void 0,tabIndex:P?0:void 0,onClick:P?ee:void 0,onKeyDown:P?g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),ee())}:void 0,children:[I&&t.jsx("span",{className:n.currentBadge,children:"Current Plan"}),t.jsx("h3",{className:n.planName,children:a.displayName}),t.jsx("div",{className:n.featuresList,children:Array.isArray(a.features)&&a.features.length>0?a.features.map((g,oe)=>t.jsxs("div",{className:n.featureItem,children:[t.jsx(Ie,{className:n.featureIcon}),t.jsx("span",{className:n.featureText,children:String(g.featureKey||"").replace(/[_\-.]+/g," ").replace(/\b\w/g,G=>G.toUpperCase())})]},`${g.featureKey}-${oe}`)):t.jsx("span",{className:n.featureText,children:"No additional features included"})}),t.jsxs("div",{className:n.priceRows,children:[t.jsxs("div",{className:n.priceRow,children:[t.jsx("span",{className:n.priceRowAmount,children:Se(l)}),t.jsx("span",{className:n.priceRowInterval,children:"/ month"})]}),t.jsxs("div",{className:n.priceRow,children:[t.jsx("span",{className:n.priceRowAmount,children:Se(b)}),t.jsx("span",{className:n.priceRowInterval,children:"/ year"})]})]}),I?t.jsx("button",{className:`${n.callToAction} ${n.currentCta}`,"data-testid":`plan-manage-${a.planId}`,onClick:g=>{g.stopPropagation(),v&&x({planId:a.planId,planVersionId:m,interval:w||"month",pricingType:y?.pricingType||"stripe",isCurrentPlan:!0})},disabled:!m||!v,children:O&&v?"Manage Plan":"Current Plan"}):t.jsxs("div",{className:n.ctaRow,children:[t.jsx("button",{className:`${n.callToAction} ${n.secondaryCta}`,"data-testid":`plan-select-${a.planId}-month`,onClick:g=>{g.stopPropagation(),x({planId:a.planId,planVersionId:m,interval:"month",pricingType:l?.pricingType||"stripe",isCurrentPlan:!1})},disabled:!m||!C,children:l?.pricingType==="free"?O?"Select Free":"Get Started Free":O?"Choose Monthly":"Get Started Monthly"}),t.jsx("button",{className:`${n.callToAction} ${n.primaryCta}`,"data-testid":`plan-select-${a.planId}-year`,onClick:g=>{g.stopPropagation(),x({planId:a.planId,planVersionId:m,interval:"year",pricingType:b?.pricingType||"stripe",isCurrentPlan:!1})},disabled:!m||!c,children:b?.pricingType==="free"?O?"Select Free":"Get Started Free":O?"Choose Yearly":"Get Started Yearly"})]})]},a.planId)})})]})})}))}const xt=1600,ce=new Set(["active","trialing","grace"]),R={planSelectionRequired:"Choose a plan to continue.",checkoutPending:"Complete checkout to continue.",misconfigured:"Onboarding policy is misconfigured. Contact support or a system administrator.",missingEntitlement:"No entitlement is linked to this account."},z={CHECKOUT_SESSION_EXPIRED:"Your previous checkout expired. Choose a plan to continue.",CHECKOUT_SESSION_SUPERSEDED:"A newer checkout replaced your previous checkout. Choose a plan to continue."};function It(r){return r==="year"?"year":"month"}function _e(r){const o=String(r||"").trim();return o?o.replace(/\/+$/,""):""}function de(r={}){const o=new URLSearchParams;o.set("screen","plans");for(const[f,h]of Object.entries(r)){const $=String(h||"").trim();$&&o.set(f,$)}return`/?${o.toString()}`}function Ut({isAuthenticated:r,authUserId:o,runtimeMode:f,authSessionResolved:h,currentTheme:$="dark",projectName:O,currentWorkspaceId:le,apiBaseUrl:W,connectedEnvironmentSource:F,resolveCloudAuthUrl:X,embedded:v=!1,shellOwnsScroll:re=!1,onAccountProfileSummaryChange:A,onContinueToTaskforce:k,continueBusy:Q=!1}){const _=je(),S=Re(),[p,J]=i.useState(null),[D,x]=i.useState(!1),[se,u]=i.useState(null),K=i.useRef(!1),N=i.useRef(null),T=i.useMemo(()=>new URLSearchParams(S.search),[S.search]),B=String(T.get("checkout")||"").trim().toLowerCase(),M=String(T.get("gate")||"").trim().toLowerCase(),ae=String(T.get("planId")||"").trim(),V=String(T.get("planVersionId")||"").trim(),ie=It(T.get("interval")),H=String(T.get("session_id")||"").trim(),E=i.useMemo(()=>_e(W),[W]),Y=i.useMemo(()=>_e(F),[F]),Z=i.useMemo(()=>({environment:Ee(Y||E),runtimeMode:f==="cloud"?"cloud":"local"}),[E,Y,f]),a=i.useCallback(e=>{const s=String(e||"").trim();return E?`${E}${s.startsWith("/")?s:`/${s}`}`:s},[E]),l=i.useCallback(e=>X?X(e):a(e),[a,X]),b=i.useCallback(()=>{const e=new URLSearchParams(S.search);e.delete("screen"),e.delete("gate"),e.delete("checkout"),e.delete("planId"),e.delete("planVersionId"),e.delete("interval");const s=e.toString();_(`/${s?`?${s}`:""}${S.hash||""}`)},[S.hash,S.search,_]),C=i.useMemo(()=>[E?`${E}/api/taskforce/public/pricing`:"","/api/taskforce/public/pricing"].map(s=>String(s||"").trim()).filter((s,d,j)=>s&&j.indexOf(s)===d),[E]),c=i.useMemo(()=>{const e=String(p?.entitlementState||"").trim().toLowerCase();return ce.has(e)},[p?.entitlementState]),m=i.useMemo(()=>{if(c)return null;const e=String(p?.billingConflictCode||"").trim().toUpperCase();if(e==="CHECKOUT_SESSION_EXPIRED")return z.CHECKOUT_SESSION_EXPIRED;if(e==="CHECKOUT_SESSION_SUPERSEDED")return z.CHECKOUT_SESSION_SUPERSEDED;const s=String(p?.message||"").trim();if(s)return s;const d=String(p?.gate||M||"").trim().toLowerCase();return d==="plan_selection_required"?R.planSelectionRequired:d==="checkout_pending"?R.checkoutPending:d==="misconfigured"?R.misconfigured:d==="missing_entitlement"?R.missingEntitlement:null},[p?.billingConflictCode,p?.gate,p?.message,M,c]),I=i.useCallback(()=>{const e=new URLSearchParams(S.search);e.delete("checkout"),e.delete("session_id"),e.delete("gate"),e.delete("planId"),e.delete("planVersionId"),e.delete("interval");const s=e.toString();_(`${S.pathname}${s?`?${s}`:""}${S.hash||""}`,{replace:!0})},[S.hash,S.pathname,S.search,_]),w=i.useCallback(()=>{N.current!=null&&window.clearTimeout(N.current),N.current=window.setTimeout(()=>{I(),N.current=null},xt)},[I]),y=i.useCallback(async e=>{const s=l(te);if(!r)return J(null),ne(s,{identityKey:o}),null;try{const d=await we(s,{identityKey:o,force:e?.force===!0});return J(d),A?.(d),d}catch{return null}},[o,l,r,A]),P=i.useCallback((e,s)=>{const d=String(e?.billingConflictCode||"").trim().toUpperCase();if(d==="CHECKOUT_SESSION_EXPIRED")return z.CHECKOUT_SESSION_EXPIRED;if(d==="CHECKOUT_SESSION_SUPERSEDED")return z.CHECKOUT_SESSION_SUPERSEDED;const j=String(e?.message||"").trim();return j||String(s||"Unable to confirm checkout completion.").trim()||"Unable to confirm checkout completion."},[]),ee=i.useCallback(e=>{const s=String(e||"").trim();return s===R.planSelectionRequired||s===R.checkoutPending?"info":"error"},[]),g=i.useCallback(async(e,s)=>{if(!e){u({type:"error",message:"Selected plan is missing a default plan version."});return}const d=c;x(!0),u(null);try{const j=await fetch(l("/api/taskforce/billing/checkout-session"),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({planVersionId:e,interval:s})}),U=await j.json().catch(()=>({}));if(!j.ok){u({type:"error",message:String(U?.error||"Unable to start checkout for selected plan.")});return}const ue=String(U?.checkoutState||"").trim().toLowerCase();if(ue==="free"){u({type:"success",message:"Plan selected. Your access is ready."}),ne(l(te),{identityKey:o});const L=await y({force:!0}),q=String(L?.entitlementState||"").trim().toLowerCase();!d&&ce.has(q)&&await k?.();return}if(ue==="updated"){u({type:"success",message:String(U?.message||"Your subscription was updated successfully.")}),ne(l(te),{identityKey:o});const L=await y({force:!0}),q=String(L?.entitlementState||"").trim().toLowerCase();!d&&ce.has(q)&&await k?.();return}if(ue==="already_current_plan"){u({type:"success",message:String(U?.message||"You are already on this plan.")}),ne(l(te),{identityKey:o}),await y();return}const ge=String(U?.returnBaseUrl||"").trim();if(f==="local"&&ge)try{const L=window.location.origin,q=new URL(ge,L).origin;if(q!==L){u({type:"error",message:`Checkout return is misconfigured for this runtime. Expected ${L} but got ${q}.`});return}}catch{u({type:"error",message:"Checkout return URL is invalid for this runtime."});return}const fe=String(U?.url||"").trim();if(!fe){u({type:"error",message:"Checkout did not return a redirect URL."});return}window.location.assign(fe)}catch{u({type:"error",message:"Unable to start checkout for selected plan."})}finally{x(!1)}},[o,l,c,y,k,f]),oe=i.useCallback(async e=>{if(!e)return{confirmed:!1,errorMessage:"Checkout session is missing."};try{const s=await fetch(l("/api/taskforce/billing/checkout-session/confirm"),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:e})}),d=await s.json().catch(()=>({}));if(!s.ok)return{confirmed:!1,errorMessage:String(d?.error||"Unable to confirm checkout completion.")};ne(l(te),{identityKey:o});const j=await y({force:!0}),U=String(j?.entitlementState||"").trim().toLowerCase();return ce.has(U)&&await k?.(),{confirmed:!0}}catch{return{confirmed:!1,errorMessage:"Unable to confirm checkout completion."}}},[o,l,y,k]),G=i.useCallback(async()=>{if(!r){_(`/login?mode=login&next=${encodeURIComponent(de())}`);return}x(!0),u(null);try{const e=await fetch(l("/api/taskforce/billing/portal-session"),{method:"POST",credentials:"include"}),s=await e.json().catch(()=>({}));if(!e.ok){u({type:"error",message:String(s?.error||"Failed to open billing portal.")});return}const d=String(s?.url||"").trim();if(!d){u({type:"error",message:"Portal session did not return a redirect URL."});return}window.location.assign(d)}catch{u({type:"error",message:"Failed to open billing portal."})}finally{x(!1)}},[l,r,_]);i.useEffect(()=>{y()},[y]),i.useEffect(()=>{c&&M==="missing_entitlement"&&I()},[I,M,c]),i.useEffect(()=>()=>{N.current!=null&&window.clearTimeout(N.current)},[]),i.useEffect(()=>{if(B==="success"){K.current=!0,u({type:"success",message:"Checkout completed successfully. Finalizing your plan..."}),(async()=>{const e=H?await oe(H):{confirmed:!1,errorMessage:"Checkout session is missing."};if(!e.confirmed){const s=await y({force:!0});u({type:"error",message:P(s,e.errorMessage)}),w();return}u({type:"success",message:"Checkout completed successfully."}),w()})();return}if(B==="cancel"){(async()=>{const e=await y({force:!0});u({type:"error",message:P(e,"Checkout was canceled. No charge was made.")}),w()})();return}if((B==="start"||B==="free")&&r&&V&&!K.current){K.current=!0,g(V,ie);return}if(m){u({type:ee(m),message:m});return}u(e=>!e||e.type!=="error"?e:e.message===R.planSelectionRequired||e.message===R.misconfigured||e.message===R.missingEntitlement||e.message===z.CHECKOUT_SESSION_EXPIRED||e.message===z.CHECKOUT_SESSION_SUPERSEDED?null:e)},[B,oe,m,r,y,ie,V,H,ee,P,w,g]);const Ce=i.useCallback(async e=>{if(!r){const s=e.pricingType==="free"?"free":"start",d=de({checkout:s,planId:e.planId,planVersionId:e.planVersionId,interval:e.interval});_(`/login?mode=register&planId=${encodeURIComponent(e.planId)}&planVersionId=${encodeURIComponent(e.planVersionId)}&interval=${encodeURIComponent(e.interval)}&next=${encodeURIComponent(d)}`);return}if(e.isCurrentPlan){if(!p?.stripeCustomerId){u({type:"success",message:"Your current plan does not use Stripe billing."});return}await G();return}if(e.pricingType==="free"){await g(e.planVersionId,e.interval);return}await g(e.planVersionId,e.interval)},[r,_,G,g]),me=i.useCallback(()=>{if(c&&k){k();return}if(v){b();return}if(window.history.length>1){_(-1);return}_("/")},[b,v,c,_,k]),ve=c&&k?t.jsx("button",{className:n.navAction,onClick:()=>{k()},disabled:Q||D,children:"Take Me to Taskforce"}):null,pe=v?t.jsxs(t.Fragment,{children:[ve,r&&p?.stripeCustomerId&&t.jsx("button",{className:n.navAction,onClick:()=>{G()},disabled:D,children:"Manage billing"})]}):t.jsxs(t.Fragment,{children:[t.jsx("button",{className:n.navAction,onClick:me,disabled:Q||r&&!c,children:c?"Take Me to Taskforce":"Back"}),r&&p?.stripeCustomerId&&t.jsx("button",{className:n.navAction,onClick:()=>{G()},disabled:D,children:"Manage billing"}),!r&&t.jsxs("button",{className:n.navAction,onClick:()=>_(`/login?mode=login&next=${encodeURIComponent(de())}`),children:[t.jsx(Pe,{size:16,style:{marginRight:"8px",verticalAlign:"text-bottom"}}),"Sign In"]})]}),be=v?null:t.jsx(xe,{projectName:O,currentWorkspaceId:le,runtimeMode:f==="cloud"?"cloud":"local",theme:$,actions:pe});return t.jsx(wt,{chrome:be,heading:"Subscription Plans",subtitle:"Manage your subscription and explore available features. Your current plan is highlighted below.",isAuthenticated:r,authSessionResolved:h,currentPlanId:String(p?.planId||ae||"").trim()||null,currentPlanVersionId:String(p?.planVersionId||V||"").trim()||null,currentEntitlementState:String(p?.entitlementState||"").trim()||null,canManageCurrentPlan:!!p?.stripeCustomerId,pricingEndpoint:C[0],statusBanner:se,onBack:me,backLabel:c?"Take Me to Taskforce":v?"Back to Board":"Back to App",backDisabled:Q||r&&!c,topActions:v?pe:null,shellOwnsScroll:re,showPageBackButton:!v,fallbackPricingSource:Z,onSelectPlan:Ce})}export{Ut as PlansPage};