@taskforcehq/taskforce 0.3.305 → 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 (337) hide show
  1. package/dist/Taskforce.module.css +295 -89
  2. package/dist/TaskforceCore.js +215 -43
  3. package/dist/TaskforceCore.test.js +433 -28
  4. package/dist/assets/fonts/CourierPrime-Bold.woff2 +0 -0
  5. package/dist/assets/fonts/CourierPrime-BoldItalic.woff2 +0 -0
  6. package/dist/assets/fonts/CourierPrime-Italic.woff2 +0 -0
  7. package/dist/assets/fonts/CourierPrime-Regular.woff2 +0 -0
  8. package/dist/assets/fonts/Noir_medium.woff2 +0 -0
  9. package/dist/assets/fonts/Noir_regular.woff2 +0 -0
  10. package/dist/assets/fonts/RussoOne-Regular.woff2 +0 -0
  11. package/dist/assets/fonts/SpecialElite-Regular.woff2 +0 -0
  12. package/dist/compat/workspaceSyncCompat.js +46 -2
  13. package/dist/compat/workspaceSyncCompat.test.js +38 -1
  14. package/dist/components/context/ContextAttachmentManager.d.ts +14 -0
  15. package/dist/components/context/ContextAttachmentManager.js +549 -0
  16. package/dist/components/features/AgentsModule.d.ts +10 -1
  17. package/dist/components/features/AgentsModule.js +260 -15
  18. package/dist/components/features/AgentsModule.test.js +255 -5
  19. package/dist/components/features/DocumentViewer.d.ts +5 -1
  20. package/dist/components/features/DocumentViewer.js +60 -3
  21. package/dist/components/features/DocumentWorkspace.js +1 -1
  22. package/dist/components/features/DocumentWorkspace.test.js +33 -0
  23. package/dist/components/features/documentWorkspaceModel.d.ts +1 -1
  24. package/dist/components/task/TaskCard.js +19 -28
  25. package/dist/components/task/TaskCard.test.js +38 -3
  26. package/dist/components/task/TaskContextUpload.js +4 -526
  27. package/dist/components/task/TaskForm.js +85 -90
  28. package/dist/components/task/TaskForm.test.js +110 -8
  29. package/dist/components/task/TaskKanban.d.ts +2 -1
  30. package/dist/components/task/TaskKanban.js +94 -13
  31. package/dist/components/task/TaskKanban.test.js +36 -0
  32. package/dist/components/ui/EditableAvatarButton.d.ts +18 -0
  33. package/dist/components/ui/EditableAvatarButton.js +18 -0
  34. package/dist/components/views/PlanComparisonPage.d.ts +9 -1
  35. package/dist/components/views/PlanComparisonPage.js +70 -14
  36. package/dist/components/views/PlanComparisonPage.test.js +238 -0
  37. package/dist/components/views/PlansPage.js +127 -36
  38. package/dist/components/views/PlansPage.test.js +294 -12
  39. package/dist/components/views/StandaloneLayout.js +283 -533
  40. package/dist/components/views/panels/PlanningDrawer.d.ts +8 -1
  41. package/dist/components/views/panels/PlanningDrawer.js +18 -11
  42. package/dist/components/views/panels/PlanningDrawer.test.d.ts +1 -0
  43. package/dist/components/views/panels/PlanningDrawer.test.js +141 -0
  44. package/dist/components/views/planningScope.d.ts +20 -0
  45. package/dist/components/views/planningScope.js +25 -0
  46. package/dist/components/views/planningScope.test.d.ts +1 -0
  47. package/dist/components/views/planningScope.test.js +60 -0
  48. package/dist/components/views/standalone/modals/AccountHubModal.d.ts +26 -1
  49. package/dist/components/views/standalone/modals/AccountHubModal.js +76 -2
  50. package/dist/components/views/standalone/modals/AccountHubModal.test.js +20 -3
  51. package/dist/components/views/standalone/modals/AvatarImageManagerModal.d.ts +20 -0
  52. package/dist/components/views/standalone/modals/AvatarImageManagerModal.js +127 -0
  53. package/dist/components/views/standalone/modals/EditProfileModal.d.ts +2 -9
  54. package/dist/components/views/standalone/modals/EditProfileModal.js +3 -2
  55. package/dist/components/views/standalone/modals/SyncEnableWarningModal.d.ts +9 -0
  56. package/dist/components/views/standalone/modals/SyncEnableWarningModal.js +6 -0
  57. package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.d.ts +1 -0
  58. package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.js +24 -0
  59. package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +2 -1
  60. package/dist/components/views/standalone/modals/SyncStatusModal.js +2 -2
  61. package/dist/core/AiProfileService.d.ts +39 -2
  62. package/dist/core/AiProfileService.js +639 -73
  63. package/dist/core/AiProfileService.test.js +19 -1
  64. package/dist/core/AiProfiles.test.js +566 -7
  65. package/dist/core/AttachmentLinkService.js +57 -15
  66. package/dist/core/AuthIdentityService.d.ts +107 -0
  67. package/dist/core/AuthIdentityService.js +284 -0
  68. package/dist/core/AuthTokenService.d.ts +4 -0
  69. package/dist/core/AuthTokenService.js +34 -6
  70. package/dist/core/AuthTokenService.test.js +3 -3
  71. package/dist/core/EntitlementsPolicy.test.js +2 -2
  72. package/dist/core/GlobalSettingsService.js +115 -6
  73. package/dist/core/PlanEntitlementService.d.ts +23 -2
  74. package/dist/core/PlanEntitlementService.js +343 -57
  75. package/dist/core/PlanFeatureCatalog.test.d.ts +1 -0
  76. package/dist/core/PlanFeatureCatalog.test.js +84 -0
  77. package/dist/core/PlanVersionPolicy.test.js +35 -2
  78. package/dist/core/PlanningEntities.test.js +52 -0
  79. package/dist/core/SignupMonetizationSettings.test.js +199 -27
  80. package/dist/core/SyncReconciliationService.js +2 -65
  81. package/dist/core/SystemAdmin.test.js +42 -42
  82. package/dist/core/TaskAttachmentsCanonical.test.js +51 -1
  83. package/dist/core/Taskforce.d.ts +225 -14
  84. package/dist/core/Taskforce.js +765 -192
  85. package/dist/core/Taskforce.listTasksSlim.test.d.ts +1 -0
  86. package/dist/core/Taskforce.listTasksSlim.test.js +91 -0
  87. package/dist/core/UserProfileAvatarDrafts.test.js +30 -3
  88. package/dist/core/WorkspaceLifecycleService.js +0 -5
  89. package/dist/core/WorkspacePermissions.test.js +25 -1
  90. package/dist/core/WorkspacePlanMode.test.js +117 -16
  91. package/dist/core/shared.d.ts +1 -1
  92. package/dist/core/shared.js +5 -1
  93. package/dist/core/types.d.ts +68 -2
  94. package/dist/hooks/auth/useTaskforceAuthBootstrap.js +26 -1
  95. package/dist/hooks/sync/bootstrap.js +2 -0
  96. package/dist/hooks/sync/controlPlane.d.ts +37 -0
  97. package/dist/hooks/sync/controlPlane.js +78 -0
  98. package/dist/hooks/sync/controlPlane.test.d.ts +1 -0
  99. package/dist/hooks/sync/controlPlane.test.js +121 -0
  100. package/dist/hooks/sync/lifecyclePolicy.d.ts +45 -0
  101. package/dist/hooks/sync/lifecyclePolicy.js +93 -0
  102. package/dist/hooks/sync/lifecyclePolicy.test.d.ts +1 -0
  103. package/dist/hooks/sync/lifecyclePolicy.test.js +124 -0
  104. package/dist/hooks/sync/orchestratorShared.d.ts +10 -1
  105. package/dist/hooks/sync/orchestratorShared.js +68 -47
  106. package/dist/hooks/sync/orchestratorShared.test.js +50 -1
  107. package/dist/hooks/sync/pullLifecycle.d.ts +31 -0
  108. package/dist/hooks/sync/pullLifecycle.js +24 -0
  109. package/dist/hooks/sync/pullLifecycle.test.d.ts +1 -0
  110. package/dist/hooks/sync/pullLifecycle.test.js +80 -0
  111. package/dist/hooks/sync/recovery.d.ts +16 -2
  112. package/dist/hooks/sync/recovery.js +171 -53
  113. package/dist/hooks/sync/recovery.test.d.ts +1 -0
  114. package/dist/hooks/sync/recovery.test.js +292 -0
  115. package/dist/hooks/sync/transfers.d.ts +15 -3
  116. package/dist/hooks/sync/transfers.js +179 -62
  117. package/dist/hooks/sync/transfers.test.d.ts +1 -0
  118. package/dist/hooks/sync/transfers.test.js +396 -0
  119. package/dist/hooks/sync/useRecentSyncEvents.d.ts +21 -0
  120. package/dist/hooks/sync/useRecentSyncEvents.js +92 -0
  121. package/dist/hooks/sync/useRecentSyncEvents.test.d.ts +1 -0
  122. package/dist/hooks/sync/useRecentSyncEvents.test.js +124 -0
  123. package/dist/hooks/sync/useSyncStatusActions.d.ts +30 -0
  124. package/dist/hooks/sync/useSyncStatusActions.js +88 -0
  125. package/dist/hooks/sync/useSyncStatusActions.test.d.ts +1 -0
  126. package/dist/hooks/sync/useSyncStatusActions.test.js +133 -0
  127. package/dist/hooks/sync/useSyncStatusControls.d.ts +25 -0
  128. package/dist/hooks/sync/useSyncStatusControls.js +60 -0
  129. package/dist/hooks/sync/useSyncStatusControls.test.d.ts +1 -0
  130. package/dist/hooks/sync/useSyncStatusControls.test.js +88 -0
  131. package/dist/hooks/useSyncOrchestrator.aiProfiles.test.js +12 -0
  132. package/dist/hooks/useSyncOrchestrator.d.ts +9 -2
  133. package/dist/hooks/useSyncOrchestrator.js +359 -178
  134. package/dist/hooks/useSyncOrchestrator.retry-closure.test.js +407 -0
  135. package/dist/hooks/useTaskData.js +8 -3
  136. package/dist/hooks/useTaskData.test.js +45 -0
  137. package/dist/hooks/useTaskforce.d.ts +60 -2
  138. package/dist/hooks/useTaskforce.js +549 -240
  139. package/dist/hooks/useTaskforce.runtime-routing.test.d.ts +1 -0
  140. package/dist/hooks/useTaskforce.runtime-routing.test.js +152 -0
  141. package/dist/hooks/useTaskforce.sync-behavior.test.js +2380 -212
  142. package/dist/hooks/useWorkspaceSyncController.d.ts +1 -0
  143. package/dist/hooks/useWorkspaceSyncController.js +6 -1
  144. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.d.ts +16 -0
  145. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +316 -35
  146. package/dist/localization/locales/en-US.d.ts +0 -1
  147. package/dist/localization/locales/en-US.js +0 -1
  148. package/dist/localization/locales/es-419.js +0 -1
  149. package/dist/localization/locales/pt-BR.js +0 -1
  150. package/dist/mcp/documentAssetRegistrar.js +3 -3
  151. package/dist/mcp/runtime.d.ts +2 -0
  152. package/dist/mcp/runtime.js +131 -64
  153. package/dist/mcp/runtime.test.js +291 -12
  154. package/dist/migrations/taskSchemaMigrations.d.ts +1 -1
  155. package/dist/migrations/taskSchemaMigrations.js +171 -61
  156. package/dist/migrations/taskSchemaMigrations.test.js +15 -0
  157. package/dist/resources/templates/workflow-sources/workflowDocs.mjs +6 -6
  158. package/dist/resources/templates/workflows/collaborate.yaml +1 -1
  159. package/dist/resources/templates/workflows/evaluate.yaml +2 -2
  160. package/dist/resources/templates/workflows/plan.yaml +1 -1
  161. package/dist/resources/templates/workflows/review.yaml +2 -2
  162. package/dist/server/annotatedAttachmentsRoutes.test.js +3 -3
  163. package/dist/server/auth/providers/apple.d.ts +33 -0
  164. package/dist/server/auth/providers/apple.js +82 -0
  165. package/dist/server/auth/providers/appleClientSecret.d.ts +37 -0
  166. package/dist/server/auth/providers/appleClientSecret.js +65 -0
  167. package/dist/server/auth/providers/github.d.ts +26 -0
  168. package/dist/server/auth/providers/github.js +86 -0
  169. package/dist/server/auth/providers/google.d.ts +21 -0
  170. package/dist/server/auth/providers/google.js +56 -0
  171. package/dist/server/auth/providers/types.d.ts +21 -0
  172. package/dist/server/auth/providers/types.js +1 -0
  173. package/dist/server/auth.d.ts +2 -0
  174. package/dist/server/auth.js +6 -3
  175. package/dist/server/documentReviewRoutes.test.js +36 -3
  176. package/dist/server/index.cookieProxy.test.js +1 -0
  177. package/dist/server/index.d.ts +12 -0
  178. package/dist/server/index.js +120 -9
  179. package/dist/server/index.rateLimit.test.js +3 -0
  180. package/dist/server/index.test.js +106 -3
  181. package/dist/server/routes/admin.d.ts +3 -0
  182. package/dist/server/routes/admin.js +272 -19
  183. package/dist/server/routes/auth.d.ts +15 -2
  184. package/dist/server/routes/auth.js +994 -57
  185. package/dist/server/routes/authSupport.d.ts +1 -1
  186. package/dist/server/routes/authSupport.js +1 -1
  187. package/dist/server/routes/billing.js +361 -35
  188. package/dist/server/routes/billing.test.js +592 -12
  189. package/dist/server/routes/documents.d.ts +1 -0
  190. package/dist/server/routes/documents.js +172 -70
  191. package/dist/server/routes/shared.d.ts +28 -2
  192. package/dist/server/routes/shared.js +69 -4
  193. package/dist/server/routes/sync.integration.test.js +437 -39
  194. package/dist/server/routes/sync.js +61 -605
  195. package/dist/server/routes/syncAuxRoutes.d.ts +15 -0
  196. package/dist/server/routes/syncAuxRoutes.js +91 -0
  197. package/dist/server/routes/syncAuxRoutes.test.d.ts +1 -0
  198. package/dist/server/routes/syncAuxRoutes.test.js +158 -0
  199. package/dist/server/routes/syncPullApplyRoutes.d.ts +36 -0
  200. package/dist/server/routes/syncPullApplyRoutes.js +204 -0
  201. package/dist/server/routes/syncPushRoutes.d.ts +24 -0
  202. package/dist/server/routes/syncPushRoutes.js +212 -0
  203. package/dist/server/routes/syncRouteGuards.d.ts +36 -0
  204. package/dist/server/routes/syncRouteGuards.js +67 -0
  205. package/dist/server/routes/syncRouteGuards.test.d.ts +1 -0
  206. package/dist/server/routes/syncRouteGuards.test.js +94 -0
  207. package/dist/server/routes/syncRouteTypes.d.ts +13 -0
  208. package/dist/server/routes/syncRouteTypes.js +1 -0
  209. package/dist/server/routes/syncSnapshotRoutes.d.ts +66 -0
  210. package/dist/server/routes/syncSnapshotRoutes.js +180 -0
  211. package/dist/server/routes/tasks.js +43 -1
  212. package/dist/server/routes/workspaces.js +36 -5
  213. package/dist/server/routes.js +60 -3
  214. package/dist/server/routes.test.js +1824 -171
  215. package/dist/services/workflowExportSnapshots.test.js +2 -0
  216. package/dist/shared/aiProfileSeatScope.d.ts +5 -0
  217. package/dist/shared/aiProfileSeatScope.js +21 -0
  218. package/dist/shared/passwordPolicy.d.ts +13 -0
  219. package/dist/shared/passwordPolicy.js +84 -0
  220. package/dist/shared/passwordPolicy.test.d.ts +1 -0
  221. package/dist/shared/passwordPolicy.test.js +34 -0
  222. package/dist/storage/workspaceAssetStore.d.ts +15 -3
  223. package/dist/storage/workspaceAssetStore.js +132 -44
  224. package/dist/storage/workspaceAssetStore.test.js +93 -6
  225. package/dist/styles/fonts.css +70 -0
  226. package/dist/sync/collaborationSyncPayload.d.ts +6 -1
  227. package/dist/sync/collaborationSyncPayload.js +17 -11
  228. package/dist/sync/collaborationSyncPayload.test.js +13 -1
  229. package/dist/sync/contentSyncState.d.ts +4 -8
  230. package/dist/sync/contentSyncState.js +17 -70
  231. package/dist/sync/syncApplyHandlers.d.ts +7 -0
  232. package/dist/sync/syncApplyHandlers.js +28 -13
  233. package/dist/sync/syncApplyHandlers.test.js +70 -3
  234. package/dist/sync/syncFieldSemantics.d.ts +12 -0
  235. package/dist/sync/syncFieldSemantics.js +55 -0
  236. package/dist/sync/syncResourceAdapters.d.ts +44 -0
  237. package/dist/sync/syncResourceAdapters.js +77 -0
  238. package/dist/sync/syncService.d.ts +5 -0
  239. package/dist/sync/syncService.js +52 -0
  240. package/dist/sync/syncService.test.js +57 -3
  241. package/dist/sync/taskSyncChangeKey.d.ts +2 -0
  242. package/dist/sync/taskSyncChangeKey.js +143 -0
  243. package/dist/sync/taskSyncPayload.js +3 -8
  244. package/dist/sync/workspacePullFeed.js +4 -3
  245. package/dist/sync/workspacePullFeed.test.js +43 -0
  246. package/dist/sync/workspaceRepair.js +5 -2
  247. package/dist/sync/workspaceSyncModel.d.ts +45 -0
  248. package/dist/sync/workspaceSyncModel.js +183 -28
  249. package/dist/sync/workspaceSyncModel.test.js +291 -12
  250. package/dist/sync/workspaceSyncState.d.ts +17 -0
  251. package/dist/sync/workspaceSyncState.js +2 -1
  252. package/dist/sync/workspaceSyncSurface.js +3 -8
  253. package/dist/types.d.ts +17 -0
  254. package/dist/ui/assets/AgentsModule-DrLawwNl.js +1 -0
  255. package/dist/ui/assets/{AnnotatedAttachmentWorkspace-BG6P_GVW.js → AnnotatedAttachmentWorkspace-Z9_whf7F.js} +1 -1
  256. package/dist/ui/assets/CourierPrime-Bold-BuLj_dpw.woff2 +0 -0
  257. package/dist/ui/assets/CourierPrime-BoldItalic-BrK2pUkZ.woff2 +0 -0
  258. package/dist/ui/assets/CourierPrime-Italic-DFUZK5Ey.woff2 +0 -0
  259. package/dist/ui/assets/CourierPrime-Regular-BsKphzVf.woff2 +0 -0
  260. package/dist/ui/assets/DocumentWorkspace-B03MaSkw.js +252 -0
  261. package/dist/ui/assets/DocumentWorkspace-Dhdso07p.css +1 -0
  262. package/dist/ui/assets/{InitiativesModule-Dhm7M8e7.js → InitiativesModule-9E6ParrY.js} +1 -1
  263. package/dist/ui/assets/Noir_medium-bxQwKGzB.woff2 +0 -0
  264. package/dist/ui/assets/Noir_regular-ojf2kxlG.woff2 +0 -0
  265. package/dist/ui/assets/PlansPage-CvfnMiWq.css +1 -0
  266. package/dist/ui/assets/PlansPage-DRXscYxH.js +1 -0
  267. package/dist/ui/assets/RussoOne-Regular-Cu_qq_qC.woff2 +0 -0
  268. package/dist/ui/assets/SpecialElite-Regular-Di6gSvAS.woff2 +0 -0
  269. package/dist/ui/assets/{TaskSettings-ln0aF7xc.js → TaskSettings-DZX4jk7e.js} +1 -1
  270. package/dist/ui/assets/{WorkflowsModule-BcS4afRn.js → WorkflowsModule-BA7jcEpH.js} +1 -1
  271. package/dist/ui/assets/index-9eT8e0Lu.css +1 -0
  272. package/dist/ui/assets/index-C6k75jr8.js +6 -0
  273. package/dist/ui/assets/{vendor-icons-BSUaRwF8.js → vendor-icons-DuEd_65c.js} +1 -1
  274. package/dist/ui/fonts/CourierPrime-Bold.ttf +0 -0
  275. package/dist/ui/fonts/CourierPrime-Bold.woff2 +0 -0
  276. package/dist/ui/fonts/CourierPrime-BoldItalic.ttf +0 -0
  277. package/dist/ui/fonts/CourierPrime-BoldItalic.woff2 +0 -0
  278. package/dist/ui/fonts/CourierPrime-Italic.ttf +0 -0
  279. package/dist/ui/fonts/CourierPrime-Italic.woff2 +0 -0
  280. package/dist/ui/fonts/CourierPrime-Regular.ttf +0 -0
  281. package/dist/ui/fonts/CourierPrime-Regular.woff2 +0 -0
  282. package/dist/ui/fonts/Noir_medium.otf +0 -0
  283. package/dist/ui/fonts/Noir_medium.woff2 +0 -0
  284. package/dist/ui/fonts/Noir_regular.otf +0 -0
  285. package/dist/ui/fonts/Noir_regular.woff2 +0 -0
  286. package/dist/ui/fonts/RussoOne-Regular.woff2 +0 -0
  287. package/dist/ui/fonts/SpecialElite-Regular.ttf +0 -0
  288. package/dist/ui/fonts/SpecialElite-Regular.woff2 +0 -0
  289. package/dist/ui/index.html +3 -3
  290. package/dist/utils/accountProfileSummaryCache.d.ts +5 -0
  291. package/dist/utils/assignees.d.ts +2 -0
  292. package/dist/utils/assignees.js +2 -0
  293. package/dist/utils/avatarUpload.d.ts +27 -0
  294. package/dist/utils/avatarUpload.js +132 -0
  295. package/dist/utils/avatarUpload.test.d.ts +1 -0
  296. package/dist/utils/avatarUpload.test.js +40 -0
  297. package/dist/utils/bootstrapTrace.d.ts +7 -0
  298. package/dist/utils/bootstrapTrace.js +29 -0
  299. package/dist/utils/commercialLifecyclePresentation.js +3 -0
  300. package/dist/utils/contextAssetEvents.d.ts +2 -0
  301. package/dist/utils/syncEventDetails.d.ts +3 -0
  302. package/dist/utils/syncEventDetails.js +64 -0
  303. package/dist/utils/syncEventDetails.test.d.ts +1 -0
  304. package/dist/utils/syncEventDetails.test.js +23 -0
  305. package/dist/utils/syncEventPresentation.d.ts +15 -0
  306. package/dist/utils/syncEventPresentation.js +129 -0
  307. package/dist/utils/syncEventPresentation.test.d.ts +1 -0
  308. package/dist/utils/syncEventPresentation.test.js +64 -0
  309. package/dist/utils/syncStatusPresentation.d.ts +72 -0
  310. package/dist/utils/syncStatusPresentation.js +217 -0
  311. package/dist/utils/syncStatusPresentation.test.d.ts +1 -0
  312. package/dist/utils/syncStatusPresentation.test.js +164 -0
  313. package/dist/utils/taskActivity.d.ts +2 -0
  314. package/dist/utils/taskActivity.js +228 -22
  315. package/dist/utils/taskActivity.test.js +119 -8
  316. package/dist/utils/workspaceSyncPresentation.d.ts +4 -0
  317. package/dist/utils/workspaceSyncPresentation.js +68 -2
  318. package/dist/utils/workspaceSyncPresentation.test.js +36 -1
  319. package/package.json +3 -2
  320. package/scripts/export-sqlite-to-postgres.mjs +7 -9
  321. package/scripts/run-e2e-realtime.sh +17 -3
  322. package/scripts/run-smoke.sh +17 -5
  323. package/scripts/run-soak.sh +17 -5
  324. package/src/resources/templates/workflow-sources/workflowDocs.mjs +6 -6
  325. package/src/resources/templates/workflows/collaborate.yaml +1 -1
  326. package/src/resources/templates/workflows/evaluate.yaml +2 -2
  327. package/src/resources/templates/workflows/plan.yaml +1 -1
  328. package/src/resources/templates/workflows/review.yaml +2 -2
  329. package/dist/ui/assets/AgentsModule-N2MnQBZk.js +0 -1
  330. package/dist/ui/assets/DocumentWorkspace-B3nV_Gc5.css +0 -1
  331. package/dist/ui/assets/DocumentWorkspace-DRbDMwh8.js +0 -252
  332. package/dist/ui/assets/PlansPage-C2dd2n1X.css +0 -1
  333. package/dist/ui/assets/PlansPage-Cq0zXj3I.js +0 -1
  334. package/dist/ui/assets/RussoOne-Regular-C3BxZIj7.ttf +0 -0
  335. package/dist/ui/assets/index-C2-OXZV7.css +0 -1
  336. package/dist/ui/assets/index-DcSI5F86.js +0 -6
  337. package/scripts/migrate-planning-model.ts +0 -233
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
3
  import { useLocation, useNavigate } from 'react-router-dom';
4
4
  import { User } from 'lucide-react';
@@ -9,16 +9,29 @@ import { resolveTaskforceCloudEnvironmentFromBaseUrl } from '../../config/cloudE
9
9
  import { ACCOUNT_PROFILE_SUMMARY_PATH, invalidateAccountProfileSummaryCache, loadAccountProfileSummaryCached } from '../../utils/accountProfileSummaryCache';
10
10
  import { isCommercialEntitlementActive, resolveCommercialLifecyclePresentation } from '../../utils/commercialLifecyclePresentation';
11
11
  const TRANSIENT_CHECKOUT_QUERY_CLEAR_DELAY_MS = 1600;
12
- const CHECKOUT_CONFIRM_RETRY_DELAYS_MS = [0, 500, 1000, 2000];
12
+ const CHECKOUT_CONFIRM_INITIAL_RETRY_DELAYS_MS = [0, 500, 1000, 2000];
13
+ const CHECKOUT_CONFIRM_RETRY_INTERVAL_MS = 5000;
14
+ const CHECKOUT_CONFIRM_MAX_AUTO_RETRY_MS = 45000;
15
+ const HIDDEN_GATE_MESSAGE = 'Choose a plan to continue.';
13
16
  function shouldRetryCheckoutConfirmation(statusCode, errorCode) {
14
17
  if (statusCode === 401) {
15
18
  return true;
16
19
  }
17
- return String(errorCode || '').trim().toUpperCase() === 'CHECKOUT_SESSION_INCOMPLETE';
20
+ const normalizedErrorCode = String(errorCode || '').trim().toUpperCase();
21
+ return normalizedErrorCode === 'CHECKOUT_SESSION_INCOMPLETE'
22
+ || normalizedErrorCode === 'CHECKOUT_PLAN_VERSION_UNRESOLVED';
18
23
  }
19
24
  function parseInterval(raw) {
20
25
  return raw === 'year' ? 'year' : 'month';
21
26
  }
27
+ function normalizeIntervalValue(raw) {
28
+ const normalized = String(raw || '').trim().toLowerCase();
29
+ if (normalized === 'year')
30
+ return 'year';
31
+ if (normalized === 'month')
32
+ return 'month';
33
+ return null;
34
+ }
22
35
  function normalizeApiBaseUrl(raw) {
23
36
  const trimmed = String(raw || '').trim();
24
37
  if (!trimmed)
@@ -40,16 +53,19 @@ export function PlansPage({ isAuthenticated, authUserId, runtimeMode, authSessio
40
53
  const location = useLocation();
41
54
  const [accountProfileSummary, setAccountProfileSummary] = useState(null);
42
55
  const [actionBusy, setActionBusy] = useState(false);
56
+ const [continueActionBusy, setContinueActionBusy] = useState(false);
43
57
  const [feedback, setFeedback] = useState(null);
44
58
  const checkoutStartRan = useRef(false);
45
- const checkoutSuccessHandledRef = useRef(null);
59
+ const checkoutSuccessSettledRef = useRef(null);
46
60
  const transientQueryClearTimeoutRef = useRef(null);
61
+ const onContinueToTaskforceRef = useRef(onContinueToTaskforce);
47
62
  const query = useMemo(() => new URLSearchParams(location.search), [location.search]);
48
63
  const checkoutState = String(query.get('checkout') || '').trim().toLowerCase();
49
64
  const gateState = String(query.get('gate') || '').trim().toLowerCase();
50
65
  const queryPlanId = String(query.get('planId') || '').trim();
51
66
  const queryPlanVersionId = String(query.get('planVersionId') || '').trim();
52
67
  const queryInterval = parseInterval(query.get('interval'));
68
+ const queryIntervalValue = normalizeIntervalValue(query.get('interval'));
53
69
  const querySessionId = String(query.get('session_id') || '').trim();
54
70
  const normalizedApiBaseUrl = useMemo(() => normalizeApiBaseUrl(apiBaseUrl), [apiBaseUrl]);
55
71
  const normalizedConnectedEnvironmentSource = useMemo(() => normalizeApiBaseUrl(connectedEnvironmentSource), [connectedEnvironmentSource]);
@@ -80,16 +96,15 @@ export function PlansPage({ isAuthenticated, authUserId, runtimeMode, authSessio
80
96
  const nextQuery = params.toString();
81
97
  navigate(`/${nextQuery ? `?${nextQuery}` : ''}${location.hash || ''}`);
82
98
  }, [location.hash, location.search, navigate]);
83
- const pricingEndpoints = useMemo(() => {
84
- const endpoints = [
85
- normalizedApiBaseUrl ? `${normalizedApiBaseUrl}/api/taskforce/public/pricing` : '',
86
- '/api/taskforce/public/pricing'
87
- ].map((value) => String(value || '').trim()).filter((value, index, all) => value && all.indexOf(value) === index);
88
- return endpoints;
89
- }, [normalizedApiBaseUrl]);
99
+ const pricingEndpoint = useMemo(() => buildCloudBillingUrl('/api/taskforce/public/pricing'), [buildCloudBillingUrl]);
90
100
  const lifecyclePresentation = useMemo(() => resolveCommercialLifecyclePresentation(accountProfileSummary, gateState), [accountProfileSummary, gateState]);
91
101
  const hasResolvedActiveEntitlement = useMemo(() => lifecyclePresentation.allowReturnToApp, [lifecyclePresentation.allowReturnToApp]);
92
- const gateMessage = useMemo(() => lifecyclePresentation.message, [lifecyclePresentation.message]);
102
+ const gateMessage = useMemo(() => {
103
+ const message = String(lifecyclePresentation.message || '').trim();
104
+ if (!message || message === HIDDEN_GATE_MESSAGE)
105
+ return null;
106
+ return message;
107
+ }, [lifecyclePresentation.message]);
93
108
  const clearTransientQueryState = useCallback(() => {
94
109
  const next = new URLSearchParams(location.search);
95
110
  next.delete('checkout');
@@ -110,6 +125,9 @@ export function PlansPage({ isAuthenticated, authUserId, runtimeMode, authSessio
110
125
  transientQueryClearTimeoutRef.current = null;
111
126
  }, TRANSIENT_CHECKOUT_QUERY_CLEAR_DELAY_MS);
112
127
  }, [clearTransientQueryState]);
128
+ useEffect(() => {
129
+ onContinueToTaskforceRef.current = onContinueToTaskforce;
130
+ }, [onContinueToTaskforce]);
113
131
  const loadAccountProfileSummary = useCallback(async (options) => {
114
132
  const accountProfileSummaryUrl = buildCloudBillingUrl(ACCOUNT_PROFILE_SUMMARY_PATH);
115
133
  if (!isAuthenticated) {
@@ -131,11 +149,14 @@ export function PlansPage({ isAuthenticated, authUserId, runtimeMode, authSessio
131
149
  return null;
132
150
  }
133
151
  }, [authUserId, buildCloudBillingUrl, isAuthenticated, onAccountProfileSummaryChange]);
134
- const resolveRecoveryMessage = useCallback((summary, fallback) => {
152
+ const resolveRecoveryMessage = useCallback((summary, fallback, options) => {
153
+ const normalizedFallback = String(fallback || '').trim();
154
+ if (options?.preferFallback && normalizedFallback)
155
+ return normalizedFallback;
135
156
  const message = resolveCommercialLifecyclePresentation(summary, gateState).message;
136
157
  if (message)
137
158
  return message;
138
- return String(fallback || 'Unable to confirm checkout completion.').trim() || 'Unable to confirm checkout completion.';
159
+ return normalizedFallback || 'Unable to confirm checkout completion.';
139
160
  }, [gateState]);
140
161
  const shouldAutoContinueAfterActivation = useCallback((summary, fallbackGate) => {
141
162
  return !resolveCommercialLifecyclePresentation(summary, fallbackGate).allowReturnToApp;
@@ -226,6 +247,47 @@ export function PlansPage({ isAuthenticated, authUserId, runtimeMode, authSessio
226
247
  retryable: false
227
248
  };
228
249
  }
250
+ const confirmViaSummary = async () => {
251
+ invalidateAccountProfileSummaryCache(buildCloudBillingUrl(ACCOUNT_PROFILE_SUMMARY_PATH), { identityKey: authUserId });
252
+ const summary = await loadAccountProfileSummary({ force: true });
253
+ const summaryState = String(summary?.entitlementState || '').trim().toLowerCase();
254
+ if (!isCommercialEntitlementActive(summaryState)) {
255
+ return false;
256
+ }
257
+ const expectedPlanId = queryPlanId;
258
+ const expectedPlanVersionId = queryPlanVersionId;
259
+ const expectedInterval = queryIntervalValue;
260
+ const currentPlanId = String(summary?.planId || '').trim();
261
+ const currentPlanVersionId = String(summary?.planVersionId || '').trim();
262
+ const currentInterval = normalizeIntervalValue(summary?.billingInterval ?? null);
263
+ const preSummary = options?.preConfirmationSummary ?? null;
264
+ const preState = String(preSummary?.entitlementState || '').trim().toLowerCase();
265
+ const preWasActive = isCommercialEntitlementActive(preState);
266
+ const prePlanId = String(preSummary?.planId || '').trim();
267
+ const prePlanVersionId = String(preSummary?.planVersionId || '').trim();
268
+ const preInterval = normalizeIntervalValue(preSummary?.billingInterval ?? null);
269
+ if (expectedPlanId && currentPlanId && currentPlanId !== expectedPlanId) {
270
+ return false;
271
+ }
272
+ if (expectedPlanVersionId && currentPlanVersionId && currentPlanVersionId !== expectedPlanVersionId) {
273
+ return false;
274
+ }
275
+ if (expectedInterval && currentInterval && currentInterval !== expectedInterval) {
276
+ return false;
277
+ }
278
+ if (preWasActive) {
279
+ const requestedPlanChanged = Boolean(expectedPlanId) && currentPlanId === expectedPlanId && prePlanId !== currentPlanId;
280
+ const requestedPlanVersionChanged = Boolean(expectedPlanVersionId) && currentPlanVersionId === expectedPlanVersionId && prePlanVersionId !== currentPlanVersionId;
281
+ const requestedIntervalChanged = Boolean(expectedInterval) && currentInterval === expectedInterval && preInterval !== currentInterval;
282
+ if (!requestedPlanChanged && !requestedPlanVersionChanged && !requestedIntervalChanged) {
283
+ return false;
284
+ }
285
+ }
286
+ if (options?.autoContinueOnActivation === true) {
287
+ await onContinueToTaskforceRef.current?.();
288
+ }
289
+ return true;
290
+ };
229
291
  try {
230
292
  const res = await fetch(buildCloudBillingUrl('/api/taskforce/billing/checkout-session/confirm'), {
231
293
  method: 'POST',
@@ -236,17 +298,18 @@ export function PlansPage({ isAuthenticated, authUserId, runtimeMode, authSessio
236
298
  const payload = await res.json().catch(() => ({}));
237
299
  if (!res.ok) {
238
300
  const errorCode = String(payload?.code || '').trim();
301
+ const retryable = shouldRetryCheckoutConfirmation(res.status, errorCode);
302
+ if (retryable && await confirmViaSummary()) {
303
+ return { confirmed: true };
304
+ }
239
305
  return {
240
306
  confirmed: false,
241
307
  errorMessage: String(payload?.error || 'Unable to confirm checkout completion.'),
242
- retryable: shouldRetryCheckoutConfirmation(res.status, errorCode)
308
+ retryable
243
309
  };
244
310
  }
245
- invalidateAccountProfileSummaryCache(buildCloudBillingUrl(ACCOUNT_PROFILE_SUMMARY_PATH), { identityKey: authUserId });
246
- const summary = await loadAccountProfileSummary({ force: true });
247
- const summaryState = String(summary?.entitlementState || '').trim().toLowerCase();
248
- if (options?.autoContinueOnActivation === true && isCommercialEntitlementActive(summaryState)) {
249
- await onContinueToTaskforce?.();
311
+ if (await confirmViaSummary()) {
312
+ return { confirmed: true };
250
313
  }
251
314
  return { confirmed: true };
252
315
  }
@@ -257,14 +320,14 @@ export function PlansPage({ isAuthenticated, authUserId, runtimeMode, authSessio
257
320
  retryable: true
258
321
  };
259
322
  }
260
- }, [authUserId, buildCloudBillingUrl, loadAccountProfileSummary, onContinueToTaskforce]);
323
+ }, [authUserId, buildCloudBillingUrl, loadAccountProfileSummary, queryIntervalValue, queryPlanId, queryPlanVersionId]);
261
324
  const openBillingPortal = useCallback(async () => {
262
325
  if (!isAuthenticated) {
263
326
  navigate(`/login?mode=login&next=${encodeURIComponent(buildEmbeddedPlansPath())}`);
264
327
  return;
265
328
  }
266
329
  setActionBusy(true);
267
- setFeedback(null);
330
+ setFeedback({ type: 'info', message: 'Opening billing portal...' });
268
331
  try {
269
332
  const res = await fetch(buildCloudBillingUrl('/api/taskforce/billing/portal-session'), {
270
333
  method: 'POST',
@@ -289,6 +352,17 @@ export function PlansPage({ isAuthenticated, authUserId, runtimeMode, authSessio
289
352
  setActionBusy(false);
290
353
  }
291
354
  }, [buildCloudBillingUrl, isAuthenticated, navigate]);
355
+ const handleContinueToTaskforce = useCallback(async () => {
356
+ if (!onContinueToTaskforce || continueActionBusy || continueBusy)
357
+ return;
358
+ setContinueActionBusy(true);
359
+ try {
360
+ await onContinueToTaskforce();
361
+ }
362
+ finally {
363
+ setContinueActionBusy(false);
364
+ }
365
+ }, [continueActionBusy, continueBusy, onContinueToTaskforce]);
292
366
  useEffect(() => {
293
367
  void loadAccountProfileSummary();
294
368
  }, [loadAccountProfileSummary]);
@@ -306,7 +380,7 @@ export function PlansPage({ isAuthenticated, authUserId, runtimeMode, authSessio
306
380
  }, []);
307
381
  useEffect(() => {
308
382
  if (checkoutState !== 'success') {
309
- checkoutSuccessHandledRef.current = null;
383
+ checkoutSuccessSettledRef.current = null;
310
384
  }
311
385
  }, [checkoutState]);
312
386
  useEffect(() => {
@@ -326,7 +400,8 @@ export function PlansPage({ isAuthenticated, authUserId, runtimeMode, authSessio
326
400
  if (checkoutState === 'success') {
327
401
  checkoutStartRan.current = true;
328
402
  setFeedback({ type: 'success', message: 'Checkout completed successfully. Finalizing your plan...' });
329
- if (!authSessionResolved) {
403
+ const shouldWaitForAuthBootstrap = !isAuthenticated && !authSessionResolved;
404
+ if (shouldWaitForAuthBootstrap) {
330
405
  return () => {
331
406
  cancelled = true;
332
407
  pendingRetryTimeouts.forEach((timeoutId) => window.clearTimeout(timeoutId));
@@ -342,33 +417,40 @@ export function PlansPage({ isAuthenticated, authUserId, runtimeMode, authSessio
342
417
  };
343
418
  }
344
419
  const successFlowKey = querySessionId || '__missing_session__';
345
- if (checkoutSuccessHandledRef.current === successFlowKey) {
420
+ if (checkoutSuccessSettledRef.current === successFlowKey) {
346
421
  return () => {
347
422
  cancelled = true;
348
423
  pendingRetryTimeouts.forEach((timeoutId) => window.clearTimeout(timeoutId));
349
424
  pendingRetryTimeouts.clear();
350
425
  };
351
426
  }
352
- checkoutSuccessHandledRef.current = successFlowKey;
353
427
  void (async () => {
428
+ const autoConfirmStartedAt = Date.now();
354
429
  const preConfirmationSummary = await loadAccountProfileSummary({ force: true });
355
430
  if (cancelled)
356
431
  return;
357
432
  let confirmation = querySessionId
358
433
  ? { confirmed: false, errorMessage: 'Unable to confirm checkout completion.', retryable: true }
359
434
  : { confirmed: false, errorMessage: 'Checkout session is missing.', retryable: false };
360
- for (const delayMs of CHECKOUT_CONFIRM_RETRY_DELAYS_MS) {
435
+ let attemptIndex = 0;
436
+ while (true) {
437
+ const delayMs = attemptIndex < CHECKOUT_CONFIRM_INITIAL_RETRY_DELAYS_MS.length
438
+ ? CHECKOUT_CONFIRM_INITIAL_RETRY_DELAYS_MS[attemptIndex]
439
+ : CHECKOUT_CONFIRM_RETRY_INTERVAL_MS;
440
+ attemptIndex += 1;
361
441
  await waitForRetry(delayMs);
362
442
  if (cancelled)
363
443
  return;
364
444
  confirmation = querySessionId
365
445
  ? await confirmCheckoutSession(querySessionId, {
366
- autoContinueOnActivation: shouldAutoContinueAfterActivation(preConfirmationSummary, gateState)
446
+ autoContinueOnActivation: shouldAutoContinueAfterActivation(preConfirmationSummary, gateState),
447
+ preConfirmationSummary
367
448
  })
368
449
  : { confirmed: false, errorMessage: 'Checkout session is missing.', retryable: false };
369
450
  if (cancelled)
370
451
  return;
371
452
  if (confirmation.confirmed) {
453
+ checkoutSuccessSettledRef.current = successFlowKey;
372
454
  setFeedback({ type: 'success', message: 'Checkout completed successfully.' });
373
455
  scheduleTransientQueryClear();
374
456
  return;
@@ -376,6 +458,9 @@ export function PlansPage({ isAuthenticated, authUserId, runtimeMode, authSessio
376
458
  if (!confirmation.retryable) {
377
459
  break;
378
460
  }
461
+ if ((Date.now() - autoConfirmStartedAt) >= CHECKOUT_CONFIRM_MAX_AUTO_RETRY_MS) {
462
+ break;
463
+ }
379
464
  }
380
465
  if (cancelled)
381
466
  return;
@@ -383,11 +468,18 @@ export function PlansPage({ isAuthenticated, authUserId, runtimeMode, authSessio
383
468
  const summary = await loadAccountProfileSummary({ force: true });
384
469
  if (cancelled)
385
470
  return;
471
+ if (!confirmation.retryable) {
472
+ checkoutSuccessSettledRef.current = successFlowKey;
473
+ }
386
474
  setFeedback({
387
475
  type: 'error',
388
- message: resolveRecoveryMessage(summary, confirmation.errorMessage)
476
+ message: resolveRecoveryMessage(summary, confirmation.errorMessage, {
477
+ preferFallback: !confirmation.retryable
478
+ })
389
479
  });
390
- scheduleTransientQueryClear();
480
+ if (!confirmation.retryable) {
481
+ scheduleTransientQueryClear();
482
+ }
391
483
  return;
392
484
  }
393
485
  })();
@@ -464,7 +556,7 @@ export function PlansPage({ isAuthenticated, authUserId, runtimeMode, authSessio
464
556
  }, [accountProfileSummary, gateState, isAuthenticated, navigate, openBillingPortal, shouldAutoContinueAfterActivation, startCheckout]);
465
557
  const handleBack = useCallback(() => {
466
558
  if (hasResolvedActiveEntitlement && onContinueToTaskforce) {
467
- void onContinueToTaskforce();
559
+ void handleContinueToTaskforce();
468
560
  return;
469
561
  }
470
562
  if (embedded) {
@@ -476,9 +568,8 @@ export function PlansPage({ isAuthenticated, authUserId, runtimeMode, authSessio
476
568
  return;
477
569
  }
478
570
  navigate('/');
479
- }, [closeEmbeddedPlansScreen, embedded, hasResolvedActiveEntitlement, navigate, onContinueToTaskforce]);
480
- const continueAction = hasResolvedActiveEntitlement && onContinueToTaskforce ? (_jsx("button", { className: styles.navAction, onClick: () => { void onContinueToTaskforce(); }, disabled: continueBusy || actionBusy, children: "Take Me to Taskforce" })) : null;
481
- const topActions = embedded ? (_jsxs(_Fragment, { children: [continueAction, isAuthenticated && accountProfileSummary?.stripeCustomerId && (_jsx("button", { className: styles.navAction, onClick: () => { void openBillingPortal(); }, disabled: actionBusy, children: "Manage billing" }))] })) : (_jsxs(_Fragment, { children: [_jsx("button", { className: styles.navAction, onClick: handleBack, disabled: continueBusy || (isAuthenticated && !hasResolvedActiveEntitlement), children: hasResolvedActiveEntitlement ? 'Take Me to Taskforce' : 'Back' }), isAuthenticated && accountProfileSummary?.stripeCustomerId && (_jsx("button", { className: styles.navAction, onClick: () => { void openBillingPortal(); }, disabled: actionBusy, children: "Manage billing" })), !isAuthenticated && (_jsxs("button", { className: styles.navAction, onClick: () => navigate(`/login?mode=login&next=${encodeURIComponent(buildEmbeddedPlansPath())}`), children: [_jsx(User, { size: 16, style: { marginRight: '8px', verticalAlign: 'text-bottom' } }), "Sign In"] }))] }));
482
- const chrome = embedded ? null : (_jsx(AppShellHeader, { projectName: projectName, currentWorkspaceId: currentWorkspaceId, runtimeMode: runtimeMode === 'cloud' ? 'cloud' : 'local', theme: currentTheme, actions: topActions }));
483
- return (_jsx(PlanComparisonPage, { chrome: chrome, heading: "Subscription Plans", subtitle: "Manage your subscription and explore available features. Your current plan is highlighted below.", isAuthenticated: isAuthenticated, authSessionResolved: authSessionResolved, currentPlanId: String(accountProfileSummary?.planId || queryPlanId || '').trim() || null, currentPlanVersionId: String(accountProfileSummary?.planVersionId || queryPlanVersionId || '').trim() || null, currentEntitlementState: String(accountProfileSummary?.entitlementState || '').trim() || null, canManageCurrentPlan: Boolean(accountProfileSummary?.stripeCustomerId), pricingEndpoint: pricingEndpoints[0], statusBanner: feedback, onBack: handleBack, backLabel: hasResolvedActiveEntitlement ? 'Take Me to Taskforce' : (embedded ? 'Back to Board' : 'Back to App'), backDisabled: continueBusy || (isAuthenticated && !hasResolvedActiveEntitlement), topActions: embedded ? topActions : null, shellOwnsScroll: shellOwnsScroll, showPageBackButton: !embedded, fallbackPricingSource: fallbackPricingSource, onSelectPlan: handleSelectPlan }));
571
+ }, [closeEmbeddedPlansScreen, embedded, handleContinueToTaskforce, hasResolvedActiveEntitlement, navigate, onContinueToTaskforce]);
572
+ const headerActions = embedded ? null : (_jsxs(_Fragment, { children: [_jsx("button", { className: styles.navAction, onClick: handleBack, disabled: continueBusy || continueActionBusy || (isAuthenticated && !hasResolvedActiveEntitlement), children: hasResolvedActiveEntitlement ? 'Take Me to Taskforce' : 'Back' }), isAuthenticated && accountProfileSummary?.stripeCustomerId && (_jsx("button", { className: styles.navAction, onClick: () => { void openBillingPortal(); }, disabled: actionBusy, children: "Manage billing" })), !isAuthenticated && (_jsxs("button", { className: styles.navAction, onClick: () => navigate(`/login?mode=login&next=${encodeURIComponent(buildEmbeddedPlansPath())}`), children: [_jsx(User, { size: 16, style: { marginRight: '8px', verticalAlign: 'text-bottom' } }), "Sign In"] }))] }));
573
+ const chrome = embedded ? null : (_jsx(AppShellHeader, { projectName: projectName, currentWorkspaceId: currentWorkspaceId, runtimeMode: runtimeMode === 'cloud' ? 'cloud' : 'local', theme: currentTheme, actions: headerActions }));
574
+ return (_jsx(PlanComparisonPage, { chrome: chrome, heading: "Subscription Plans", subtitle: "Manage your subscription and explore available features. Your current plan is highlighted below.", isAuthenticated: isAuthenticated, authSessionResolved: authSessionResolved, currentPlanId: String(accountProfileSummary?.planId || queryPlanId || '').trim() || null, currentPlanVersionId: String(accountProfileSummary?.planVersionId || queryPlanVersionId || '').trim() || null, currentEntitlementState: String(accountProfileSummary?.entitlementState || '').trim() || null, markCurrentPlan: lifecyclePresentation.markCurrentPlan, canManageCurrentPlan: Boolean(accountProfileSummary?.stripeCustomerId), pricingEndpoint: pricingEndpoint, statusBanner: feedback, onBack: handleBack, backLabel: hasResolvedActiveEntitlement ? 'Take Me to Taskforce' : (embedded ? 'Back to Board' : 'Back to App'), backDisabled: continueBusy || continueActionBusy || (isAuthenticated && !hasResolvedActiveEntitlement), topActions: null, shellOwnsScroll: shellOwnsScroll, showPageBackButton: false, showHeaderBarWithChrome: false, currentPlanCardActionMode: "manage", fallbackPricingSource: fallbackPricingSource, onSelectPlan: handleSelectPlan }));
484
575
  }