@taskforcehq/taskforce 0.3.303 → 0.3.305

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 (237) hide show
  1. package/README.md +140 -247
  2. package/dist/Taskforce.module.css +102 -5
  3. package/dist/TaskforceCore.js +635 -238
  4. package/dist/TaskforceCore.test.js +2243 -495
  5. package/dist/annotatedAttachments/service.d.ts +1 -1
  6. package/dist/annotatedAttachments/types.d.ts +1 -1
  7. package/dist/compat/workspaceSyncCompat.js +6 -0
  8. package/dist/components/features/AgentsModule.js +1 -1
  9. package/dist/components/features/AgentsModule.test.js +1 -1
  10. package/dist/components/features/DocumentIndex.d.ts +1 -1
  11. package/dist/components/features/DocumentIndex.js +1 -1
  12. package/dist/components/features/DocumentViewer.d.ts +1 -1
  13. package/dist/components/features/DocumentViewer.js +32 -9
  14. package/dist/components/features/DocumentWorkspace.d.ts +5 -22
  15. package/dist/components/features/DocumentWorkspace.js +12 -155
  16. package/dist/components/features/DocumentWorkspace.test.js +193 -6
  17. package/dist/components/features/TaskSettings.js +87 -41
  18. package/dist/components/features/TaskSettings.test.js +180 -40
  19. package/dist/components/features/documentWorkspaceModel.d.ts +24 -0
  20. package/dist/components/features/documentWorkspaceModel.js +57 -0
  21. package/dist/components/features/useDocumentWorkspaceController.d.ts +34 -0
  22. package/dist/components/features/useDocumentWorkspaceController.js +113 -0
  23. package/dist/components/task/TaskActionHeader.d.ts +2 -1
  24. package/dist/components/task/TaskActionHeader.js +3 -3
  25. package/dist/components/task/TaskActionHeader.test.js +8 -0
  26. package/dist/components/task/TaskCard.js +16 -1
  27. package/dist/components/task/TaskCard.test.js +31 -0
  28. package/dist/components/task/TaskForm.d.ts +9 -8
  29. package/dist/components/task/TaskForm.js +374 -219
  30. package/dist/components/task/TaskForm.test.js +482 -361
  31. package/dist/components/task/TaskKanban.d.ts +1 -1
  32. package/dist/components/task/TaskKanban.js +33 -161
  33. package/dist/components/task/TaskStatusActions.d.ts +6 -1
  34. package/dist/components/task/TaskStatusActions.js +8 -3
  35. package/dist/components/task/TaskStatusActions.test.js +9 -0
  36. package/dist/components/task/taskKanbanDropRules.d.ts +58 -0
  37. package/dist/components/task/taskKanbanDropRules.js +187 -0
  38. package/dist/components/task/taskKanbanDropRules.test.d.ts +1 -0
  39. package/dist/components/task/taskKanbanDropRules.test.js +114 -0
  40. package/dist/components/ui/Modal.d.ts +1 -1
  41. package/dist/components/ui/Modal.js +1 -0
  42. package/dist/components/views/AppShellHeader.js +5 -1
  43. package/dist/components/views/AppShellHeader.test.js +4 -0
  44. package/dist/components/views/PlanComparisonPage.d.ts +3 -2
  45. package/dist/components/views/PlanComparisonPage.js +9 -10
  46. package/dist/components/views/PlanComparisonPage.test.js +55 -41
  47. package/dist/components/views/PlansPage.d.ts +5 -1
  48. package/dist/components/views/PlansPage.js +150 -81
  49. package/dist/components/views/PlansPage.test.js +367 -41
  50. package/dist/components/views/StandaloneLayout.js +135 -54
  51. package/dist/components/views/WidgetView.js +11 -2
  52. package/dist/components/views/panels/FilterToolbar.test.js +6 -4
  53. package/dist/components/views/standalone/modals/AccountHubModal.d.ts +2 -14
  54. package/dist/components/views/standalone/modals/AccountHubModal.js +12 -14
  55. package/dist/components/views/standalone/modals/AccountHubModal.test.js +24 -1
  56. package/dist/components/views/standalone/modals/SyncStatusModal.js +1 -1
  57. package/dist/config/envSchema.js +1 -1
  58. package/dist/core/AiProfileService.d.ts +6 -1
  59. package/dist/core/AiProfileService.js +161 -16
  60. package/dist/core/AiProfileService.test.js +3 -1
  61. package/dist/core/AiProfiles.test.js +200 -0
  62. package/dist/core/AuthTokenService.test.d.ts +1 -0
  63. package/dist/core/AuthTokenService.test.js +78 -0
  64. package/dist/core/DeletedTaskLifecycleService.d.ts +2 -1
  65. package/dist/core/EntitlementsPolicy.test.js +75 -13
  66. package/dist/core/PlanEntitlementService.d.ts +9 -1
  67. package/dist/core/PlanEntitlementService.js +144 -19
  68. package/dist/core/PlanVersionPolicy.test.js +19 -26
  69. package/dist/core/SignupMonetizationSettings.test.js +75 -15
  70. package/dist/core/SystemAdmin.test.js +212 -56
  71. package/dist/core/TaskActivityService.d.ts +4 -1
  72. package/dist/core/TaskActivityService.js +45 -0
  73. package/dist/core/TaskAuditTimeline.test.js +52 -1
  74. package/dist/core/TaskTaxonomyValidation.test.js +53 -0
  75. package/dist/core/Taskforce.d.ts +18 -11
  76. package/dist/core/Taskforce.js +93 -12
  77. package/dist/core/WorkspacePlanMode.test.js +73 -8
  78. package/dist/core/shared.d.ts +2 -0
  79. package/dist/core/shared.js +11 -0
  80. package/dist/documentReviews/service.d.ts +1 -1
  81. package/dist/documentReviews/types.d.ts +1 -1
  82. package/dist/hooks/auth/useTaskforceAuthBootstrap.d.ts +48 -0
  83. package/dist/hooks/auth/useTaskforceAuthBootstrap.js +219 -0
  84. package/dist/hooks/sync/auth.d.ts +37 -0
  85. package/dist/hooks/sync/auth.js +63 -0
  86. package/dist/hooks/sync/bootstrap.d.ts +34 -0
  87. package/dist/hooks/sync/bootstrap.js +52 -0
  88. package/dist/hooks/sync/orchestratorShared.d.ts +36 -0
  89. package/dist/hooks/sync/orchestratorShared.js +209 -0
  90. package/dist/hooks/sync/orchestratorShared.test.d.ts +1 -0
  91. package/dist/hooks/sync/orchestratorShared.test.js +49 -0
  92. package/dist/hooks/sync/realtime.d.ts +25 -0
  93. package/dist/hooks/sync/realtime.js +60 -0
  94. package/dist/hooks/sync/recovery.d.ts +69 -0
  95. package/dist/hooks/sync/recovery.js +118 -0
  96. package/dist/hooks/sync/transfers.d.ts +123 -0
  97. package/dist/hooks/sync/transfers.js +435 -0
  98. package/dist/hooks/sync/useDataVersionRefresh.d.ts +16 -0
  99. package/dist/hooks/sync/useDataVersionRefresh.js +73 -0
  100. package/dist/hooks/ui/useResourceExport.d.ts +3 -1
  101. package/dist/hooks/ui/useResourceExport.js +5 -2
  102. package/dist/hooks/ui/useWorkflowTemplates.js +11 -6
  103. package/dist/hooks/useRealtimeSync.js +2 -1
  104. package/dist/hooks/useSyncOrchestrator.aiProfiles.test.js +8 -0
  105. package/dist/hooks/useSyncOrchestrator.context-assets.test.d.ts +1 -0
  106. package/dist/hooks/useSyncOrchestrator.context-assets.test.js +228 -0
  107. package/dist/hooks/useSyncOrchestrator.d.ts +12 -8
  108. package/dist/hooks/useSyncOrchestrator.js +388 -879
  109. package/dist/hooks/useSyncOrchestrator.retry-closure.test.js +641 -6
  110. package/dist/hooks/useTaskMutations.d.ts +2 -1
  111. package/dist/hooks/useTaskMutations.js +57 -7
  112. package/dist/hooks/useTaskMutations.test.js +176 -0
  113. package/dist/hooks/useTaskforce.d.ts +13 -4
  114. package/dist/hooks/useTaskforce.js +302 -817
  115. package/dist/hooks/useTaskforce.sync-behavior.test.js +78 -0
  116. package/dist/hooks/useWorkspaceSyncController.d.ts +4 -1
  117. package/dist/hooks/useWorkspaceSyncController.js +33 -11
  118. package/dist/hooks/useWorkspaceSyncController.test.js +1 -0
  119. package/dist/hooks/workspace/useTaskforceApiRouting.test.js +17 -0
  120. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.d.ts +166 -0
  121. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +434 -0
  122. package/dist/hooks/workspace/workspaceLocalState.d.ts +19 -0
  123. package/dist/hooks/workspace/workspaceLocalState.js +100 -0
  124. package/dist/hooks/workspace/workspaceLocalState.test.d.ts +1 -0
  125. package/dist/hooks/workspace/workspaceLocalState.test.js +59 -0
  126. package/dist/localization/locales/en-US.js +2 -2
  127. package/dist/mcp/adminWorkspaceRegistrar.d.ts +2 -0
  128. package/dist/mcp/adminWorkspaceRegistrar.js +154 -0
  129. package/dist/mcp/canonicalAssetHelpers.d.ts +70 -0
  130. package/dist/mcp/canonicalAssetHelpers.js +259 -0
  131. package/dist/mcp/clientIntegrations.d.ts +12 -1
  132. package/dist/mcp/clientIntegrations.js +161 -6
  133. package/dist/mcp/clientIntegrations.test.js +76 -4
  134. package/dist/mcp/collaborationRegistrar.d.ts +2 -0
  135. package/dist/mcp/collaborationRegistrar.js +71 -0
  136. package/dist/mcp/documentAssetRegistrar.d.ts +2 -0
  137. package/dist/mcp/documentAssetRegistrar.js +346 -0
  138. package/dist/mcp/documentHelpers.d.ts +100 -0
  139. package/dist/mcp/documentHelpers.js +161 -0
  140. package/dist/mcp/runtime.js +2455 -3925
  141. package/dist/mcp/runtime.test.js +240 -8
  142. package/dist/mcp/taskAttachmentHelpers.d.ts +41 -0
  143. package/dist/mcp/taskAttachmentHelpers.js +60 -0
  144. package/dist/mcp/taskAttachmentTypes.d.ts +37 -0
  145. package/dist/mcp/taskAttachmentTypes.js +1 -0
  146. package/dist/mcp/taskPlanningRegistrar.d.ts +2 -0
  147. package/dist/mcp/taskPlanningRegistrar.js +418 -0
  148. package/dist/mcp/toolCatalog.d.ts +35 -0
  149. package/dist/mcp/toolCatalog.js +3 -0
  150. package/dist/plugins/vite.js +1 -1
  151. package/dist/runtime/appGateDefinitions.d.ts +1 -1
  152. package/dist/runtime/appGateDefinitions.js +1 -1
  153. package/dist/server/index.d.ts +1 -0
  154. package/dist/server/index.js +46 -3
  155. package/dist/server/index.test.js +12 -1
  156. package/dist/server/routes/admin.d.ts +1 -5
  157. package/dist/server/routes/admin.js +151 -80
  158. package/dist/server/routes/annotatedAttachments.d.ts +1 -1
  159. package/dist/server/routes/annotatedAttachments.js +1 -1
  160. package/dist/server/routes/auth.d.ts +1 -4
  161. package/dist/server/routes/auth.js +59 -64
  162. package/dist/server/routes/authSupport.d.ts +30 -0
  163. package/dist/server/routes/authSupport.js +81 -0
  164. package/dist/server/routes/billing.d.ts +1 -1
  165. package/dist/server/routes/billing.js +122 -255
  166. package/dist/server/routes/billing.test.js +257 -86
  167. package/dist/server/routes/documentReviews.d.ts +1 -1
  168. package/dist/server/routes/documentReviews.js +1 -1
  169. package/dist/server/routes/documents.d.ts +4 -2
  170. package/dist/server/routes/documents.js +73 -7
  171. package/dist/server/routes/primitives.d.ts +11 -0
  172. package/dist/server/routes/primitives.js +73 -0
  173. package/dist/server/routes/resources.d.ts +1 -1
  174. package/dist/server/routes/resources.js +1 -1
  175. package/dist/server/routes/shared.d.ts +31 -1
  176. package/dist/server/routes/shared.js +26 -0
  177. package/dist/server/routes/sync.d.ts +1 -1
  178. package/dist/server/routes/sync.integration.test.js +20 -0
  179. package/dist/server/routes/sync.js +111 -238
  180. package/dist/server/routes/tasks.d.ts +1 -1
  181. package/dist/server/routes/tasks.js +50 -8
  182. package/dist/server/routes/workspaces.d.ts +1 -1
  183. package/dist/server/routes/workspaces.js +1 -1
  184. package/dist/server/routes.d.ts +2 -9
  185. package/dist/server/routes.js +84 -181
  186. package/dist/server/routes.test.js +912 -32
  187. package/dist/shared/taskActor.d.ts +10 -0
  188. package/dist/shared/taskActor.js +1 -0
  189. package/dist/sync/collaborationSyncPayload.js +4 -0
  190. package/dist/sync/collaborationSyncPayload.test.js +8 -0
  191. package/dist/sync/collaborationSyncState.d.ts +3 -1
  192. package/dist/sync/collaborationSyncState.js +19 -0
  193. package/dist/sync/contentSyncState.js +28 -17
  194. package/dist/sync/syncApplyHandlers.d.ts +87 -1
  195. package/dist/sync/syncApplyHandlers.js +370 -8
  196. package/dist/sync/syncApplyHandlers.test.d.ts +1 -0
  197. package/dist/sync/syncApplyHandlers.test.js +379 -0
  198. package/dist/sync/syncService.d.ts +9 -1
  199. package/dist/sync/syncService.js +44 -2
  200. package/dist/sync/syncService.test.js +62 -0
  201. package/dist/sync/workspacePullFeed.d.ts +1 -0
  202. package/dist/sync/workspacePullFeed.js +66 -59
  203. package/dist/sync/workspacePullFeed.test.js +72 -4
  204. package/dist/sync/workspaceSyncModel.d.ts +25 -1
  205. package/dist/sync/workspaceSyncModel.js +77 -3
  206. package/dist/sync/workspaceSyncModel.test.js +153 -0
  207. package/dist/sync/workspaceSyncState.d.ts +2 -0
  208. package/dist/sync/workspaceSyncState.js +1 -0
  209. package/dist/types.d.ts +2 -10
  210. package/dist/ui/assets/AgentsModule-N2MnQBZk.js +1 -0
  211. package/dist/ui/assets/{AnnotatedAttachmentWorkspace-C_TmXZwA.js → AnnotatedAttachmentWorkspace-BG6P_GVW.js} +1 -1
  212. package/dist/ui/assets/DocumentWorkspace-B3nV_Gc5.css +1 -0
  213. package/dist/ui/assets/DocumentWorkspace-DRbDMwh8.js +252 -0
  214. package/dist/ui/assets/{InitiativesModule-4-Rh2K2n.js → InitiativesModule-Dhm7M8e7.js} +1 -1
  215. package/dist/ui/assets/{PlansPage-BlVC_lRq.css → PlansPage-C2dd2n1X.css} +1 -1
  216. package/dist/ui/assets/PlansPage-Cq0zXj3I.js +1 -0
  217. package/dist/ui/assets/TaskSettings-ln0aF7xc.js +9 -0
  218. package/dist/ui/assets/{WorkflowsModule-CGk9s3NJ.js → WorkflowsModule-BcS4afRn.js} +1 -1
  219. package/dist/ui/assets/index-C2-OXZV7.css +1 -0
  220. package/dist/ui/assets/index-DcSI5F86.js +6 -0
  221. package/dist/ui/assets/{vendor-icons-pWocEipT.js → vendor-icons-BSUaRwF8.js} +1 -1
  222. package/dist/ui/index.html +4 -4
  223. package/dist/utils/commercialLifecyclePresentation.d.ts +19 -0
  224. package/dist/utils/commercialLifecyclePresentation.js +196 -0
  225. package/dist/utils/taskActivity.js +4 -0
  226. package/dist/utils/taskActivity.test.js +25 -1
  227. package/package.json +10 -1
  228. package/scripts/check-cloud-mcp.mjs +83 -0
  229. package/scripts/playwright-auth.sh +9 -1
  230. package/scripts/run-billing-performance-smoke.sh +24 -0
  231. package/dist/ui/assets/AgentsModule-CpsTmrIW.js +0 -1
  232. package/dist/ui/assets/DocumentWorkspace-C3GyzrWm.js +0 -250
  233. package/dist/ui/assets/DocumentWorkspace-C_8T8oz-.css +0 -1
  234. package/dist/ui/assets/PlansPage-BP7AYOqr.js +0 -1
  235. package/dist/ui/assets/TaskSettings-BOC5F6Ag.js +0 -8
  236. package/dist/ui/assets/index-CLIMgR6g.js +0 -6
  237. package/dist/ui/assets/index-DneETxcu.css +0 -1
@@ -22,18 +22,23 @@ function openCore(projectRoot) {
22
22
  storagePath: path.join(projectRoot, '.taskforce'),
23
23
  tenantId: path.basename(projectRoot)
24
24
  });
25
- core.upsertPlanCatalog({ planId: 'starter', displayName: 'Starter' });
25
+ core.upsertPlanCatalog({ planId: 'free', displayName: 'Free', status: 'active' });
26
+ core.updatePlanVersion({
27
+ planId: 'free',
28
+ versionNumber: 1,
29
+ seatLimit: 1
30
+ });
26
31
  core.updatePlanVersionFeatures({
27
- planVersionId: 'starter-v1',
32
+ planVersionId: 'free-v1',
28
33
  features: [
29
34
  { featureKey: 'workspace.switching', access: 'enabled' }
30
35
  ]
31
36
  });
32
- insertFreePriceMapping(core, 'starter-v1');
37
+ insertFreePriceMapping(core, 'free-v1');
33
38
  return core;
34
39
  }
35
40
  describe('TaskforceCore onboarding policy', () => {
36
- it('defaults to require_plan_selection with no plan version', () => {
41
+ it('fails closed to require_plan_selection when no explicit onboarding policy is configured', () => {
37
42
  const projectRoot = makeProjectRoot();
38
43
  const core = openCore(projectRoot);
39
44
  try {
@@ -47,6 +52,36 @@ describe('TaskforceCore onboarding policy', () => {
47
52
  fs.rmSync(projectRoot, { recursive: true, force: true });
48
53
  }
49
54
  });
55
+ it('falls back to require_plan_selection when no free onboarding plan is available', () => {
56
+ const projectRoot = makeProjectRoot();
57
+ const core = new TaskforceCore({
58
+ projectRoot,
59
+ storagePath: path.join(projectRoot, '.taskforce'),
60
+ tenantId: path.basename(projectRoot)
61
+ });
62
+ core.upsertPlanCatalog({ planId: 'free', displayName: 'Free', status: 'active' });
63
+ core.updatePlanVersion({
64
+ planId: 'free',
65
+ versionNumber: 1,
66
+ seatLimit: 1
67
+ });
68
+ core.updatePlanVersionFeatures({
69
+ planVersionId: 'free-v1',
70
+ features: [
71
+ { featureKey: 'workspace.switching', access: 'enabled' }
72
+ ]
73
+ });
74
+ try {
75
+ expect(core.getOnboardingPolicy()).toEqual({
76
+ mode: 'require_plan_selection',
77
+ planVersionId: null
78
+ });
79
+ }
80
+ finally {
81
+ core.close();
82
+ fs.rmSync(projectRoot, { recursive: true, force: true });
83
+ }
84
+ });
50
85
  it('fails validation for auto_grant_free without a plan version id', () => {
51
86
  const projectRoot = makeProjectRoot();
52
87
  const core = openCore(projectRoot);
@@ -85,10 +120,10 @@ describe('TaskforceCore onboarding policy', () => {
85
120
  const projectRoot = makeProjectRoot();
86
121
  const core = openCore(projectRoot);
87
122
  try {
88
- core.upsertPlanCatalog({ planId: 'starter', displayName: 'Starter', status: 'archived' });
123
+ core.upsertPlanCatalog({ planId: 'free', displayName: 'Free', status: 'archived' });
89
124
  expect(core.validateOnboardingPolicy({
90
125
  mode: 'auto_grant_free',
91
- planVersionId: 'starter-v1'
126
+ planVersionId: 'free-v1'
92
127
  })).toEqual(expect.objectContaining({
93
128
  valid: false,
94
129
  code: 'ONBOARDING_PLAN_NOT_ENABLED'
@@ -103,10 +138,10 @@ describe('TaskforceCore onboarding policy', () => {
103
138
  const projectRoot = makeProjectRoot();
104
139
  const core = openCore(projectRoot);
105
140
  try {
106
- core.upsertPlanCatalog({ planId: 'collab', displayName: 'Collab', status: 'active' });
141
+ core.upsertPlanCatalog({ planId: 'team-5', displayName: 'Team 5', status: 'active' });
107
142
  expect(core.validateOnboardingPolicy({
108
143
  mode: 'auto_grant_free',
109
- planVersionId: 'collab-v1'
144
+ planVersionId: 'team-5-v1'
110
145
  })).toEqual(expect.objectContaining({
111
146
  valid: false,
112
147
  code: 'ONBOARDING_PLAN_MUST_BE_FREE'
@@ -131,6 +166,31 @@ describe('TaskforceCore onboarding policy', () => {
131
166
  fs.rmSync(projectRoot, { recursive: true, force: true });
132
167
  }
133
168
  });
169
+ it('requires plan selection during registration when no explicit onboarding policy is configured', () => {
170
+ const projectRoot = makeProjectRoot();
171
+ const core = openCore(projectRoot);
172
+ try {
173
+ const created = core.registerPasswordUser({
174
+ email: 'implicit-onboarding@example.com',
175
+ password: 'password123'
176
+ });
177
+ expect(created.planSelectionRequired).toBe(true);
178
+ expect(created.checkoutPending).toBe(false);
179
+ expect(core.getAccountEntitlement(created.userId)).toEqual(expect.objectContaining({
180
+ state: 'pending_plan_selection'
181
+ }));
182
+ expect(core.getAccountAccessStatus(created.userId)).toEqual(expect.objectContaining({
183
+ gate: 'plan_selection_required',
184
+ canAccessApp: false,
185
+ canAccessPlans: true,
186
+ planSelectionRequired: true
187
+ }));
188
+ }
189
+ finally {
190
+ core.close();
191
+ fs.rmSync(projectRoot, { recursive: true, force: true });
192
+ }
193
+ });
134
194
  it('allows backfill transitions to create pending plan selection entitlements', () => {
135
195
  const projectRoot = makeProjectRoot();
136
196
  const tenantId = path.basename(projectRoot);
@@ -156,7 +216,7 @@ describe('TaskforceCore onboarding policy', () => {
156
216
  `).run('pending-u1', tenantId, 'pending_plan_selection', now, now);
157
217
  core.transitionCanonicalCommercialState({
158
218
  accountId: 'pending-u1',
159
- planVersionId: 'starter-v1',
219
+ planVersionId: 'free-v1',
160
220
  state: 'pending_plan_selection',
161
221
  source: 'backfill',
162
222
  updatedBy: 'backfill',
@@ -185,7 +245,7 @@ describe('TaskforceCore onboarding policy', () => {
185
245
  try {
186
246
  const now = new Date().toISOString();
187
247
  const checkoutExpiresAt = new Date(Date.now() + (60 * 60 * 1000)).toISOString();
188
- core.upsertPlanCatalog({ planId: 'pro', displayName: 'Pro', status: 'active' });
248
+ core.upsertPlanCatalog({ planId: 'basic', displayName: 'Basic', status: 'active' });
189
249
  const db = core.getDatabaseAdapter();
190
250
  db.prepare(`
191
251
  INSERT INTO users (id, tenant_id, email, display_name, auth_provider, external_auth_id, is_disabled, created_at, updated_at)
@@ -193,11 +253,11 @@ describe('TaskforceCore onboarding policy', () => {
193
253
  `).run('checkout-u1', tenantId, 'checkout@example.com', 'Checkout', 'token', 'checkout-u1', now, now);
194
254
  core.transitionCanonicalCommercialState({
195
255
  accountId: 'checkout-u1',
196
- planVersionId: 'pro-v1',
256
+ planVersionId: 'basic-v1',
197
257
  state: 'checkout_pending',
198
258
  source: 'checkout-start',
199
259
  updatedBy: 'checkout-start',
200
- billingMirrorPlanId: 'pro',
260
+ billingMirrorPlanId: 'basic',
201
261
  effectiveAt: now,
202
262
  effectiveUntil: checkoutExpiresAt,
203
263
  createdAt: now,
@@ -223,7 +283,7 @@ describe('TaskforceCore onboarding policy', () => {
223
283
  try {
224
284
  const now = new Date().toISOString();
225
285
  const expiredAt = new Date(Date.now() - (60 * 1000)).toISOString();
226
- core.upsertPlanCatalog({ planId: 'pro', displayName: 'Pro', status: 'active' });
286
+ core.upsertPlanCatalog({ planId: 'basic', displayName: 'Basic', status: 'active' });
227
287
  const db = core.getDatabaseAdapter();
228
288
  db.prepare(`
229
289
  INSERT INTO users (id, tenant_id, email, display_name, auth_provider, external_auth_id, is_disabled, created_at, updated_at)
@@ -231,11 +291,11 @@ describe('TaskforceCore onboarding policy', () => {
231
291
  `).run('expired-checkout-u1', tenantId, 'expired@example.com', 'Expired Checkout', 'token', 'expired-checkout-u1', now, now);
232
292
  core.transitionCanonicalCommercialState({
233
293
  accountId: 'expired-checkout-u1',
234
- planVersionId: 'pro-v1',
294
+ planVersionId: 'basic-v1',
235
295
  state: 'checkout_pending',
236
296
  source: 'checkout-start',
237
297
  updatedBy: 'checkout-start',
238
- billingMirrorPlanId: 'pro',
298
+ billingMirrorPlanId: 'basic',
239
299
  effectiveAt: now,
240
300
  effectiveUntil: expiredAt,
241
301
  createdAt: now,