@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
@@ -15,11 +15,12 @@ describe('PlanComparisonPage', () => {
15
15
  },
16
16
  plans: [
17
17
  {
18
- planId: 'starter',
19
- displayName: 'Starter',
18
+ planId: 'free',
19
+ displayName: 'Free',
20
+ description: 'Start using Taskforce at no cost.',
20
21
  status: 'active',
21
22
  defaultVersion: {
22
- planVersionId: 'starter-v1',
23
+ planVersionId: 'free-v1',
23
24
  versionNumber: 1,
24
25
  seatLimit: null,
25
26
  metadata: {}
@@ -31,19 +32,20 @@ describe('PlanComparisonPage', () => {
31
32
  }
32
33
  },
33
34
  {
34
- planId: 'collab',
35
- displayName: 'Collab',
35
+ planId: 'team-5',
36
+ displayName: 'Team 5',
37
+ description: 'For small collaborative teams.',
36
38
  status: 'active',
37
39
  defaultVersion: {
38
- planVersionId: 'collab-v2',
40
+ planVersionId: 'team-5-v2',
39
41
  versionNumber: 2,
40
42
  seatLimit: 5,
41
43
  metadata: {}
42
44
  },
43
45
  features: [],
44
46
  pricing: {
45
- month: { pricingType: 'stripe', stripePriceId: 'price_collab_month', unitAmount: 2000, currency: 'usd', interval: 'month' },
46
- year: { pricingType: 'stripe', stripePriceId: 'price_collab_year', unitAmount: 20000, currency: 'usd', interval: 'year' }
47
+ month: { pricingType: 'stripe', stripePriceId: 'price_team_5_month', unitAmount: 2000, currency: 'usd', interval: 'month' },
48
+ year: { pricingType: 'stripe', stripePriceId: 'price_team_5_year', unitAmount: 20000, currency: 'usd', interval: 'year' }
47
49
  }
48
50
  }
49
51
  ]
@@ -59,6 +61,11 @@ describe('PlanComparisonPage', () => {
59
61
  render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: false, onBack: () => { }, backLabel: "Back", onSelectPlan: () => { } }));
60
62
  expect(await screen.findByText('Pricing source: production (cloud)')).toBeInTheDocument();
61
63
  });
64
+ it('renders plan descriptions when provided by the pricing payload', async () => {
65
+ render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: false, onBack: () => { }, backLabel: "Back", onSelectPlan: () => { } }));
66
+ expect(await screen.findByText('Start using Taskforce at no cost.')).toBeInTheDocument();
67
+ expect(screen.getByText('For small collaborative teams.')).toBeInTheDocument();
68
+ });
62
69
  it('falls back to provided pricing source details when the pricing response omits them', async () => {
63
70
  globalThis.__DEBUG_MODE__ = true;
64
71
  vi.stubGlobal('fetch', vi.fn(async () => ({
@@ -66,11 +73,11 @@ describe('PlanComparisonPage', () => {
66
73
  json: async () => ({
67
74
  plans: [
68
75
  {
69
- planId: 'starter',
70
- displayName: 'Starter',
76
+ planId: 'free',
77
+ displayName: 'Free',
71
78
  status: 'active',
72
79
  defaultVersion: {
73
- planVersionId: 'starter-v1',
80
+ planVersionId: 'free-v1',
74
81
  versionNumber: 1,
75
82
  seatLimit: null,
76
83
  metadata: {}
@@ -92,29 +99,270 @@ describe('PlanComparisonPage', () => {
92
99
  await screen.findByRole('heading', { name: 'Subscription Plans' });
93
100
  expect(screen.queryByText('Pricing source: production (cloud)')).not.toBeInTheDocument();
94
101
  });
102
+ it('renders public feature copy when provided by the pricing payload', async () => {
103
+ vi.stubGlobal('fetch', vi.fn(async () => ({
104
+ ok: true,
105
+ json: async () => ({
106
+ pricingSource: {
107
+ environment: 'production',
108
+ runtimeMode: 'cloud'
109
+ },
110
+ plans: [
111
+ {
112
+ planId: 'team-5',
113
+ displayName: 'Team 5',
114
+ status: 'active',
115
+ defaultVersion: {
116
+ planVersionId: 'team-5-v2',
117
+ versionNumber: 2,
118
+ seatLimit: 5,
119
+ metadata: {}
120
+ },
121
+ features: [
122
+ {
123
+ featureKey: 'collaboration.ai_profiles',
124
+ access: 'enabled',
125
+ label: 'AI Profiles',
126
+ publicLabel: 'AI teammates',
127
+ publicDescription: 'Add reusable AI teammates to your workspace.'
128
+ }
129
+ ],
130
+ pricing: {
131
+ month: { pricingType: 'stripe', stripePriceId: 'price_team_5_month', unitAmount: 2000, currency: 'usd', interval: 'month' },
132
+ year: null
133
+ }
134
+ }
135
+ ]
136
+ })
137
+ })));
138
+ render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: false, onBack: () => { }, backLabel: "Back", onSelectPlan: () => { } }));
139
+ expect(await screen.findByText('AI teammates')).toBeInTheDocument();
140
+ expect(screen.getByText('Add reusable AI teammates to your workspace.')).toBeInTheDocument();
141
+ expect(screen.queryByText('Collaboration Ai Profiles')).not.toBeInTheDocument();
142
+ });
143
+ it('renders inline numeric feature limits next to each feature label', async () => {
144
+ vi.stubGlobal('fetch', vi.fn(async () => ({
145
+ ok: true,
146
+ json: async () => ({
147
+ pricingSource: {
148
+ environment: 'production',
149
+ runtimeMode: 'cloud'
150
+ },
151
+ plans: [
152
+ {
153
+ planId: 'free',
154
+ displayName: 'Free',
155
+ status: 'active',
156
+ defaultVersion: {
157
+ planVersionId: 'free-v1',
158
+ versionNumber: 1,
159
+ seatLimit: 12,
160
+ metadata: {}
161
+ },
162
+ features: [
163
+ {
164
+ featureKey: 'workspace.workspaces',
165
+ access: 'enabled',
166
+ label: 'Workspaces',
167
+ config: { maxWorkspaces: 1 }
168
+ },
169
+ {
170
+ featureKey: 'collaboration.ai_profiles',
171
+ access: 'limited',
172
+ label: 'AI Profiles',
173
+ publicLabel: 'AI Agents',
174
+ config: { maxAiProfiles: 4 }
175
+ },
176
+ {
177
+ featureKey: 'context.uploads',
178
+ access: 'enabled',
179
+ label: 'Cloud Storage',
180
+ config: { storageLimitMb: 24 }
181
+ },
182
+ {
183
+ featureKey: 'collaboration.team_management',
184
+ access: 'enabled',
185
+ label: 'Team Management'
186
+ }
187
+ ],
188
+ pricing: {
189
+ month: { pricingType: 'free', stripePriceId: null, unitAmount: null, currency: null, interval: 'month' },
190
+ year: null
191
+ }
192
+ }
193
+ ]
194
+ })
195
+ })));
196
+ const { container } = render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: false, onBack: () => { }, backLabel: "Back", onSelectPlan: () => { } }));
197
+ const freeCard = await screen.findByTestId('plan-card-free');
198
+ const featureTextNodes = Array.from(freeCard.querySelectorAll('span')).map((node) => node.textContent);
199
+ expect(featureTextNodes).toContain('1x Workspaces');
200
+ expect(featureTextNodes).toContain('4x AI Agents');
201
+ expect(featureTextNodes).toContain('24MB Cloud Storage');
202
+ expect(featureTextNodes).toContain('12x Team Management');
203
+ expect(container.querySelector('[class*="featureLimitUnit"]')?.textContent).toBe('MB');
204
+ });
205
+ it('renders the storage unit suffix in a smaller accent span', async () => {
206
+ vi.stubGlobal('fetch', vi.fn(async () => ({
207
+ ok: true,
208
+ json: async () => ({
209
+ pricingSource: {
210
+ environment: 'production',
211
+ runtimeMode: 'cloud'
212
+ },
213
+ plans: [
214
+ {
215
+ planId: 'free',
216
+ displayName: 'Free',
217
+ status: 'active',
218
+ defaultVersion: {
219
+ planVersionId: 'free-v1',
220
+ versionNumber: 1,
221
+ seatLimit: null,
222
+ metadata: {}
223
+ },
224
+ features: [
225
+ {
226
+ featureKey: 'context.uploads',
227
+ access: 'enabled',
228
+ label: 'Cloud Storage',
229
+ config: { storageLimitMb: 64 }
230
+ }
231
+ ],
232
+ pricing: {
233
+ month: { pricingType: 'free', stripePriceId: null, unitAmount: null, currency: null, interval: 'month' },
234
+ year: null
235
+ }
236
+ }
237
+ ]
238
+ })
239
+ })));
240
+ const { container } = render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: false, onBack: () => { }, backLabel: "Back", onSelectPlan: () => { } }));
241
+ await screen.findByText('Cloud Storage');
242
+ const accent = container.querySelector('[class*="featureLimitAccent"]');
243
+ const unit = container.querySelector('[class*="featureLimitUnit"]');
244
+ expect(accent?.textContent).toBe('64MB');
245
+ expect(unit?.textContent).toBe('MB');
246
+ });
247
+ it('hides missing yearly pricing rows and buttons instead of rendering unavailable state', async () => {
248
+ vi.stubGlobal('fetch', vi.fn(async () => ({
249
+ ok: true,
250
+ json: async () => ({
251
+ pricingSource: {
252
+ environment: 'production',
253
+ runtimeMode: 'cloud'
254
+ },
255
+ plans: [
256
+ {
257
+ planId: 'operator',
258
+ displayName: 'Operator',
259
+ status: 'active',
260
+ defaultVersion: {
261
+ planVersionId: 'operator-v1',
262
+ versionNumber: 1,
263
+ seatLimit: null,
264
+ metadata: {}
265
+ },
266
+ features: [],
267
+ pricing: {
268
+ month: { pricingType: 'stripe', stripePriceId: 'price_operator_month', unitAmount: 999, currency: 'usd', interval: 'month' },
269
+ year: null
270
+ }
271
+ }
272
+ ]
273
+ })
274
+ })));
275
+ render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: true, onBack: () => { }, backLabel: "Back", onSelectPlan: () => { } }));
276
+ const operatorCard = await screen.findByTestId('plan-card-operator');
277
+ expect(within(operatorCard).getByText('$9.99')).toBeInTheDocument();
278
+ expect(within(operatorCard).getByText('/ month')).toBeInTheDocument();
279
+ expect(within(operatorCard).queryByText('/ year')).not.toBeInTheDocument();
280
+ expect(within(operatorCard).queryByText('Unavailable')).not.toBeInTheDocument();
281
+ expect(within(operatorCard).getByRole('button', { name: 'Choose Monthly' })).toBeInTheDocument();
282
+ expect(within(operatorCard).queryByRole('button', { name: 'Choose Yearly' })).not.toBeInTheDocument();
283
+ });
95
284
  it('does not mark a plan current when only the plan id matches but the version does not', async () => {
96
- render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: true, currentPlanId: "collab", currentPlanVersionId: "collab-v1", currentEntitlementState: "active", onBack: () => { }, backLabel: "Back", onSelectPlan: () => { } }));
285
+ render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: true, currentPlanId: "team-5", currentPlanVersionId: "team-5-v1", currentEntitlementState: "active", onBack: () => { }, backLabel: "Back", onSelectPlan: () => { } }));
286
+ expect(await screen.findByRole('heading', { name: 'Subscription Plans' })).toBeInTheDocument();
287
+ expect(screen.queryByText('Current Plan')).not.toBeInTheDocument();
288
+ });
289
+ it('marks a trialing entitlement as the current plan', async () => {
290
+ render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: true, currentPlanId: "team-5", currentPlanVersionId: "team-5-v2", currentEntitlementState: "trialing", onBack: () => { }, backLabel: "Back", onSelectPlan: () => { } }));
291
+ expect(await screen.findByRole('heading', { name: 'Subscription Plans' })).toBeInTheDocument();
292
+ expect(screen.getByText('Current Plan')).toBeInTheDocument();
293
+ });
294
+ it('can show the current plan as a non-interactive indicator when billing is managed from page chrome', async () => {
295
+ const onSelectPlan = vi.fn();
296
+ render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: true, currentPlanId: "team-5", currentPlanVersionId: "team-5-v2", currentEntitlementState: "active", canManageCurrentPlan: true, currentPlanCardActionMode: "indicator", onBack: () => { }, backLabel: "Back", onSelectPlan: onSelectPlan }));
297
+ expect(await screen.findByRole('heading', { name: 'Subscription Plans' })).toBeInTheDocument();
298
+ const currentCard = screen.getByTestId('plan-card-team-5');
299
+ expect(currentCard).not.toHaveAttribute('role', 'button');
300
+ expect(screen.queryByTestId('plan-manage-team-5')).not.toBeInTheDocument();
301
+ expect(screen.queryByRole('button', { name: 'Manage Plan' })).not.toBeInTheDocument();
302
+ expect(screen.getByTestId('plan-current-team-5')).toBeDisabled();
303
+ fireEvent.click(currentCard);
304
+ expect(onSelectPlan).not.toHaveBeenCalled();
305
+ });
306
+ it('can render the page header bar even when shell chrome is present', async () => {
307
+ render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: true, chrome: _jsx("div", { children: "Shell chrome" }), showHeaderBarWithChrome: true, topActions: _jsx("button", { type: "button", children: "Manage billing" }), onBack: () => { }, backLabel: "Back to App", onSelectPlan: () => { } }));
308
+ expect(await screen.findByRole('heading', { name: 'Subscription Plans' })).toBeInTheDocument();
309
+ expect(screen.getByRole('button', { name: 'Back to App' })).toBeInTheDocument();
310
+ expect(screen.getByRole('button', { name: 'Manage billing' })).toBeInTheDocument();
311
+ });
312
+ it('does not mark a canceled entitlement as current through the plan-id fallback path', async () => {
313
+ render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: true, currentPlanId: "team-5", currentPlanVersionId: null, currentEntitlementState: "canceled", onBack: () => { }, backLabel: "Back", onSelectPlan: () => { } }));
314
+ expect(await screen.findByRole('heading', { name: 'Subscription Plans' })).toBeInTheDocument();
315
+ expect(screen.queryByText('Current Plan')).not.toBeInTheDocument();
316
+ });
317
+ it('does not mark a linked pending-plan-selection entitlement as the current plan', async () => {
318
+ render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: true, currentPlanId: "team-5", currentPlanVersionId: "team-5-v2", currentEntitlementState: "pending_plan_selection", canManageCurrentPlan: true, onBack: () => { }, backLabel: "Back", onSelectPlan: () => { } }));
97
319
  expect(await screen.findByRole('heading', { name: 'Subscription Plans' })).toBeInTheDocument();
320
+ expect(screen.queryByRole('button', { name: 'Manage Plan' })).not.toBeInTheDocument();
98
321
  expect(screen.queryByText('Current Plan')).not.toBeInTheDocument();
322
+ expect(screen.getByRole('button', { name: 'Choose Monthly' })).toBeInTheDocument();
99
323
  });
100
324
  it('can disable the page back button while onboarding remains blocked', async () => {
101
325
  render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: true, onBack: () => { }, backLabel: "Back to App", backDisabled: true, onSelectPlan: () => { } }));
102
326
  expect(await screen.findByRole('button', { name: 'Back to App' })).toBeDisabled();
103
327
  });
328
+ it('shows pricing before auth resolves but keeps plan selection disabled until bootstrap finishes', async () => {
329
+ const onSelectPlan = vi.fn();
330
+ const view = render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: false, authSessionResolved: false, onBack: () => { }, backLabel: "Back", onSelectPlan: onSelectPlan }));
331
+ expect(await screen.findByRole('heading', { name: 'Subscription Plans' })).toBeInTheDocument();
332
+ const freeCard = screen.getByTestId('plan-card-free');
333
+ expect(screen.getByRole('button', { name: 'Get Started Free' })).toBeDisabled();
334
+ expect(screen.getByRole('button', { name: 'Get Started Monthly' })).toBeDisabled();
335
+ expect(freeCard).not.toHaveAttribute('role', 'button');
336
+ view.rerender(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: false, authSessionResolved: true, onBack: () => { }, backLabel: "Back", onSelectPlan: onSelectPlan }));
337
+ const enabledFreeCard = screen.getByTestId('plan-card-free');
338
+ expect(screen.getByRole('button', { name: 'Get Started Free' })).toBeEnabled();
339
+ expect(screen.getByRole('button', { name: 'Get Started Monthly' })).toBeEnabled();
340
+ expect(enabledFreeCard).toHaveAttribute('role', 'button');
341
+ fireEvent.click(screen.getByRole('button', { name: 'Get Started Free' }));
342
+ await waitFor(() => {
343
+ expect(onSelectPlan).toHaveBeenCalledWith({
344
+ planId: 'free',
345
+ planVersionId: 'free-v1',
346
+ interval: 'month',
347
+ pricingType: 'free',
348
+ isCurrentPlan: false
349
+ });
350
+ });
351
+ });
104
352
  it('selects the whole plan card using the default available interval', async () => {
105
353
  const onSelectPlan = vi.fn();
106
354
  render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: false, onBack: () => { }, backLabel: "Back", onSelectPlan: onSelectPlan }));
107
355
  await screen.findByRole('heading', { name: 'Subscription Plans' });
108
- const starterHeading = screen.getByRole('heading', { name: 'Starter' });
109
- const starterCard = starterHeading.closest('[role="button"]');
110
- expect(starterCard).toBeTruthy();
111
- expect(within(starterCard).getByText('$0.00')).toBeInTheDocument();
112
- expect(within(starterCard).getByText('/ month')).toBeInTheDocument();
113
- fireEvent.click(starterCard);
356
+ const freeHeading = screen.getByRole('heading', { name: 'Free' });
357
+ const freeCard = freeHeading.closest('[role="button"]');
358
+ expect(freeCard).toBeTruthy();
359
+ expect(within(freeCard).getByText('$0.00')).toBeInTheDocument();
360
+ expect(within(freeCard).getByText('/ month')).toBeInTheDocument();
361
+ fireEvent.click(freeCard);
114
362
  await waitFor(() => {
115
363
  expect(onSelectPlan).toHaveBeenCalledWith({
116
- planId: 'starter',
117
- planVersionId: 'starter-v1',
364
+ planId: 'free',
365
+ planVersionId: 'free-v1',
118
366
  interval: 'month',
119
367
  pricingType: 'free',
120
368
  isCurrentPlan: false
@@ -123,7 +371,7 @@ describe('PlanComparisonPage', () => {
123
371
  });
124
372
  it('does not trigger current-plan actions when the current plan is not Stripe-managed', async () => {
125
373
  const onSelectPlan = vi.fn();
126
- render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: true, currentPlanId: "starter", currentPlanVersionId: "starter-v1", currentEntitlementState: "active", canManageCurrentPlan: false, onBack: () => { }, backLabel: "Back", onSelectPlan: onSelectPlan }));
374
+ render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: true, currentPlanId: "free", currentPlanVersionId: "free-v1", currentEntitlementState: "active", canManageCurrentPlan: false, onBack: () => { }, backLabel: "Back", onSelectPlan: onSelectPlan }));
127
375
  await screen.findByRole('heading', { name: 'Subscription Plans' });
128
376
  const currentButton = screen.getByRole('button', { name: 'Current Plan' });
129
377
  expect(currentButton).toBeDisabled();
@@ -139,11 +387,11 @@ describe('PlanComparisonPage', () => {
139
387
  },
140
388
  plans: [
141
389
  {
142
- planId: 'starter',
143
- displayName: 'Starter',
390
+ planId: 'free',
391
+ displayName: 'Free',
144
392
  status: 'active',
145
393
  defaultVersion: {
146
- planVersionId: 'starter-v1',
394
+ planVersionId: 'free-v1',
147
395
  versionNumber: 1,
148
396
  seatLimit: null,
149
397
  metadata: {}
@@ -159,7 +407,7 @@ describe('PlanComparisonPage', () => {
159
407
  });
160
408
  vi.stubGlobal('fetch', fetchMock);
161
409
  render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: false, pricingEndpoint: "https://performance-app.example/api/taskforce/public/pricing", onBack: () => { }, backLabel: "Back", onSelectPlan: () => { } }));
162
- expect(await screen.findByRole('heading', { name: 'Starter' })).toBeInTheDocument();
410
+ expect(await screen.findByRole('heading', { name: 'Free' })).toBeInTheDocument();
163
411
  expect(fetchMock).toHaveBeenCalledTimes(1);
164
412
  expect(fetchMock).toHaveBeenCalledWith('https://performance-app.example/api/taskforce/public/pricing', {
165
413
  method: 'GET',
@@ -177,27 +425,27 @@ describe('PlanComparisonPage', () => {
177
425
  },
178
426
  plans: [
179
427
  {
180
- planId: 'enterprise',
181
- displayName: 'Enterprise',
428
+ planId: 'team-5',
429
+ displayName: 'Team 5',
182
430
  status: 'active',
183
431
  defaultVersion: {
184
- planVersionId: 'enterprise-v3',
432
+ planVersionId: 'team-5-v2',
185
433
  versionNumber: 3,
186
- seatLimit: 100,
434
+ seatLimit: 5,
187
435
  metadata: {}
188
436
  },
189
437
  features: [],
190
438
  pricing: {
191
- month: { pricingType: 'stripe', stripePriceId: 'price_enterprise_month', unitAmount: 12000, currency: 'usd', interval: 'month' },
192
- year: { pricingType: 'stripe', stripePriceId: 'price_enterprise_year', unitAmount: 120000, currency: 'usd', interval: 'year' }
439
+ month: { pricingType: 'stripe', stripePriceId: 'price_team_5_month', unitAmount: 12000, currency: 'usd', interval: 'month' },
440
+ year: { pricingType: 'stripe', stripePriceId: 'price_team_5_year', unitAmount: 120000, currency: 'usd', interval: 'year' }
193
441
  }
194
442
  },
195
443
  {
196
- planId: 'starter',
197
- displayName: 'Starter',
444
+ planId: 'free',
445
+ displayName: 'Free',
198
446
  status: 'active',
199
447
  defaultVersion: {
200
- planVersionId: 'starter-v1',
448
+ planVersionId: 'free-v1',
201
449
  versionNumber: 1,
202
450
  seatLimit: null,
203
451
  metadata: {}
@@ -209,19 +457,19 @@ describe('PlanComparisonPage', () => {
209
457
  }
210
458
  },
211
459
  {
212
- planId: 'pro',
213
- displayName: 'Pro',
460
+ planId: 'basic',
461
+ displayName: 'Basic',
214
462
  status: 'active',
215
463
  defaultVersion: {
216
- planVersionId: 'pro-v2',
464
+ planVersionId: 'basic-v1',
217
465
  versionNumber: 2,
218
- seatLimit: 10,
466
+ seatLimit: 1,
219
467
  metadata: {}
220
468
  },
221
469
  features: [],
222
470
  pricing: {
223
- month: { pricingType: 'stripe', stripePriceId: 'price_pro_month', unitAmount: 3000, currency: 'usd', interval: 'month' },
224
- year: { pricingType: 'stripe', stripePriceId: 'price_pro_year', unitAmount: 30000, currency: 'usd', interval: 'year' }
471
+ month: { pricingType: 'stripe', stripePriceId: 'price_basic_month', unitAmount: 3000, currency: 'usd', interval: 'month' },
472
+ year: { pricingType: 'stripe', stripePriceId: 'price_basic_year', unitAmount: 30000, currency: 'usd', interval: 'year' }
225
473
  }
226
474
  }
227
475
  ]
@@ -231,7 +479,7 @@ describe('PlanComparisonPage', () => {
231
479
  render(_jsx(PlanComparisonPage, { heading: "Subscription Plans", isAuthenticated: false, onBack: () => { }, backLabel: "Back", onSelectPlan: () => { } }));
232
480
  await screen.findByRole('heading', { name: 'Subscription Plans' });
233
481
  const planNames = screen.getAllByRole('heading', { level: 3 }).map((node) => node.textContent);
234
- expect(planNames).toEqual(['Starter', 'Pro', 'Enterprise']);
482
+ expect(planNames).toEqual(['Free', 'Basic', 'Team 5']);
235
483
  });
236
484
  it('defaults to the same-origin pricing endpoint', async () => {
237
485
  const fetchMock = vi.fn().mockResolvedValue({