@taskforcehq/taskforce 0.3.311 → 0.3.313

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 (454) hide show
  1. package/README.md +40 -2
  2. package/dist/TaskforceCore.js +1 -1
  3. package/dist/components/features/InitiativesModule.js +1 -1
  4. package/dist/components/features/TaskSettings.js +1 -1
  5. package/dist/components/views/StandaloneLayout.js +3 -6
  6. package/dist/components/views/standalone/modals/AccountHubModal.d.ts +1 -2
  7. package/dist/components/views/standalone/modals/AccountHubModal.js +2 -3
  8. package/dist/components/views/standalone/modals/HelpModal.js +15 -2
  9. package/dist/hooks/useFilterSort.js +1 -1
  10. package/dist/hooks/useTaskforce.js +2 -2
  11. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +5 -2
  12. package/dist/ui/assets/{AgentsModule-D8u9P5dZ.js → AgentsModule-BULqIo8e.js} +1 -1
  13. package/dist/ui/assets/{AnnotatedAttachmentWorkspace-CsUauFA2.js → AnnotatedAttachmentWorkspace-DHr4rHK9.js} +1 -1
  14. package/dist/ui/assets/{ContextAttachmentManager-DbQvDHFz.js → ContextAttachmentManager-DoMe2OpY.js} +1 -1
  15. package/dist/ui/assets/{DocumentWorkspace-BmTkN1A8.js → DocumentWorkspace-DumBWhvb.js} +1 -1
  16. package/dist/ui/assets/{EntityActivityTimeline-BXHTM-Nh.js → EntityActivityTimeline-sHk8Nzbq.js} +1 -1
  17. package/dist/ui/assets/{InitiativesModule-D33RyXx0.js → InitiativesModule-3X9UNzHh.js} +1 -1
  18. package/dist/ui/assets/{PlansPage-D0RXlT9_.js → PlansPage-C3A3EYaV.js} +1 -1
  19. package/dist/ui/assets/{TaskContextUpload-Vsg67lpR.js → TaskContextUpload-C8G7pWkX.js} +1 -1
  20. package/dist/ui/assets/{TaskSettings-DshLw7_d.js → TaskSettings-DM1o9Wla.js} +2 -2
  21. package/dist/ui/assets/{WorkflowsModule-CLM-1BnF.js → WorkflowsModule-CW0crzvD.js} +1 -1
  22. package/dist/ui/assets/documentReferences-BZB3nMRb.js +1 -0
  23. package/dist/ui/assets/index-BWFQ9mGn.js +5 -0
  24. package/dist/ui/assets/{index-DOR9PRqt.css → index-DcK_8tuE.css} +1 -1
  25. package/dist/ui/index.html +2 -2
  26. package/package.json +12 -4
  27. package/scripts/postinstall.js +4 -3
  28. package/dist/TaskforceCore.CategoryFallback.test.d.ts +0 -1
  29. package/dist/TaskforceCore.CategoryFallback.test.js +0 -101
  30. package/dist/TaskforceCore.filter-persistence.test.d.ts +0 -1
  31. package/dist/TaskforceCore.filter-persistence.test.js +0 -402
  32. package/dist/TaskforceCore.routing.test.d.ts +0 -1
  33. package/dist/TaskforceCore.routing.test.js +0 -311
  34. package/dist/TaskforceCore.test.d.ts +0 -1
  35. package/dist/TaskforceCore.test.js +0 -7910
  36. package/dist/TaskforceWidget.test.d.ts +0 -1
  37. package/dist/TaskforceWidget.test.js +0 -92
  38. package/dist/UnsavedChangesRelaxed.test.d.ts +0 -1
  39. package/dist/UnsavedChangesRelaxed.test.js +0 -16
  40. package/dist/__tests__/localizationCatalogs.test.d.ts +0 -1
  41. package/dist/__tests__/localizationCatalogs.test.js +0 -54
  42. package/dist/__tests__/workflowSimulation.test.d.ts +0 -1
  43. package/dist/__tests__/workflowSimulation.test.js +0 -113
  44. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.test.d.ts +0 -1
  45. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.test.js +0 -278
  46. package/dist/annotatedAttachments/payload.test.d.ts +0 -1
  47. package/dist/annotatedAttachments/payload.test.js +0 -67
  48. package/dist/compat/workspaceSyncCompat.test.d.ts +0 -1
  49. package/dist/compat/workspaceSyncCompat.test.js +0 -124
  50. package/dist/components/features/AgentsModule.test.d.ts +0 -1
  51. package/dist/components/features/AgentsModule.test.js +0 -601
  52. package/dist/components/features/AnnotatedAttachmentWorkspace.test.d.ts +0 -1
  53. package/dist/components/features/AnnotatedAttachmentWorkspace.test.js +0 -2883
  54. package/dist/components/features/DocumentWorkspace.test.d.ts +0 -1
  55. package/dist/components/features/DocumentWorkspace.test.js +0 -1439
  56. package/dist/components/features/TaskSettings.test.d.ts +0 -1
  57. package/dist/components/features/TaskSettings.test.js +0 -1674
  58. package/dist/components/features/settings/TaxonomyLibraryManager.test.d.ts +0 -1
  59. package/dist/components/features/settings/TaxonomyLibraryManager.test.js +0 -141
  60. package/dist/components/task/TaskActionHeader.test.d.ts +0 -1
  61. package/dist/components/task/TaskActionHeader.test.js +0 -91
  62. package/dist/components/task/TaskCard.test.d.ts +0 -1
  63. package/dist/components/task/TaskCard.test.js +0 -513
  64. package/dist/components/task/TaskContextUpload.test.d.ts +0 -1
  65. package/dist/components/task/TaskContextUpload.test.js +0 -506
  66. package/dist/components/task/TaskForm.test.d.ts +0 -1
  67. package/dist/components/task/TaskForm.test.js +0 -946
  68. package/dist/components/task/TaskKanban.empty-column-drop.test.d.ts +0 -1
  69. package/dist/components/task/TaskKanban.empty-column-drop.test.js +0 -66
  70. package/dist/components/task/TaskKanban.planning-drop.test.d.ts +0 -1
  71. package/dist/components/task/TaskKanban.planning-drop.test.js +0 -93
  72. package/dist/components/task/TaskKanban.test.d.ts +0 -1
  73. package/dist/components/task/TaskKanban.test.js +0 -99
  74. package/dist/components/task/TaskList.test.d.ts +0 -1
  75. package/dist/components/task/TaskList.test.js +0 -473
  76. package/dist/components/task/TaskStatusActions.test.d.ts +0 -1
  77. package/dist/components/task/TaskStatusActions.test.js +0 -54
  78. package/dist/components/task/taskKanbanDropRules.test.d.ts +0 -1
  79. package/dist/components/task/taskKanbanDropRules.test.js +0 -114
  80. package/dist/components/ui/LevelSelector.test.d.ts +0 -1
  81. package/dist/components/ui/LevelSelector.test.js +0 -55
  82. package/dist/components/ui/Markdown.test.d.ts +0 -1
  83. package/dist/components/ui/Markdown.test.js +0 -38
  84. package/dist/components/ui/MultiSelectFilter.test.d.ts +0 -1
  85. package/dist/components/ui/MultiSelectFilter.test.js +0 -74
  86. package/dist/components/ui/TaxonomyDropdown.test.d.ts +0 -1
  87. package/dist/components/ui/TaxonomyDropdown.test.js +0 -130
  88. package/dist/components/ui/TopNoticeLayer.test.d.ts +0 -1
  89. package/dist/components/ui/TopNoticeLayer.test.js +0 -25
  90. package/dist/components/views/AppShellHeader.test.d.ts +0 -1
  91. package/dist/components/views/AppShellHeader.test.js +0 -42
  92. package/dist/components/views/PlanComparisonPage.test.d.ts +0 -1
  93. package/dist/components/views/PlanComparisonPage.test.js +0 -758
  94. package/dist/components/views/PlansPage.test.d.ts +0 -1
  95. package/dist/components/views/PlansPage.test.js +0 -710
  96. package/dist/components/views/chrome/WorkspaceChromeSections.test.d.ts +0 -1
  97. package/dist/components/views/chrome/WorkspaceChromeSections.test.js +0 -54
  98. package/dist/components/views/chrome/workspaceChrome.test.d.ts +0 -1
  99. package/dist/components/views/chrome/workspaceChrome.test.js +0 -52
  100. package/dist/components/views/panels/DocumentFilterToolbar.test.d.ts +0 -1
  101. package/dist/components/views/panels/DocumentFilterToolbar.test.js +0 -19
  102. package/dist/components/views/panels/FilterToolbar.test.d.ts +0 -1
  103. package/dist/components/views/panels/FilterToolbar.test.js +0 -47
  104. package/dist/components/views/panels/PlanningDrawer.test.d.ts +0 -1
  105. package/dist/components/views/panels/PlanningDrawer.test.js +0 -529
  106. package/dist/components/views/planningScope.test.d.ts +0 -1
  107. package/dist/components/views/planningScope.test.js +0 -60
  108. package/dist/components/views/standalone/modals/AccountHubModal.test.d.ts +0 -1
  109. package/dist/components/views/standalone/modals/AccountHubModal.test.js +0 -72
  110. package/dist/components/views/standalone/modals/HelpModal.test.d.ts +0 -1
  111. package/dist/components/views/standalone/modals/HelpModal.test.js +0 -23
  112. package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.d.ts +0 -1
  113. package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.js +0 -24
  114. package/dist/components/views/teamManagementAccess.test.d.ts +0 -1
  115. package/dist/components/views/teamManagementAccess.test.js +0 -44
  116. package/dist/config/deployment.test.d.ts +0 -1
  117. package/dist/config/deployment.test.js +0 -90
  118. package/dist/config/envSchema.test.d.ts +0 -1
  119. package/dist/config/envSchema.test.js +0 -125
  120. package/dist/core/AiProfileService.test.d.ts +0 -1
  121. package/dist/core/AiProfileService.test.js +0 -184
  122. package/dist/core/AiProfiles.test.d.ts +0 -1
  123. package/dist/core/AiProfiles.test.js +0 -1873
  124. package/dist/core/AuthTokenService.test.d.ts +0 -1
  125. package/dist/core/AuthTokenService.test.js +0 -78
  126. package/dist/core/BulkUpdateFieldsPreview.test.d.ts +0 -1
  127. package/dist/core/BulkUpdateFieldsPreview.test.js +0 -62
  128. package/dist/core/CompletedAt.test.d.ts +0 -1
  129. package/dist/core/CompletedAt.test.js +0 -44
  130. package/dist/core/CreatedBy.test.d.ts +0 -1
  131. package/dist/core/CreatedBy.test.js +0 -188
  132. package/dist/core/DeletedTaskTrash.test.d.ts +0 -1
  133. package/dist/core/DeletedTaskTrash.test.js +0 -104
  134. package/dist/core/EntitlementsPolicy.test.d.ts +0 -1
  135. package/dist/core/EntitlementsPolicy.test.js +0 -280
  136. package/dist/core/GlobalSettingsService.test.d.ts +0 -1
  137. package/dist/core/GlobalSettingsService.test.js +0 -45
  138. package/dist/core/JsonBackupRuntime.test.d.ts +0 -1
  139. package/dist/core/JsonBackupRuntime.test.js +0 -155
  140. package/dist/core/PlanFeatureCatalog.test.d.ts +0 -1
  141. package/dist/core/PlanFeatureCatalog.test.js +0 -139
  142. package/dist/core/PlanVersionPolicy.test.d.ts +0 -1
  143. package/dist/core/PlanVersionPolicy.test.js +0 -236
  144. package/dist/core/PlanningEntities.test.d.ts +0 -1
  145. package/dist/core/PlanningEntities.test.js +0 -509
  146. package/dist/core/ScheduleFields.test.d.ts +0 -1
  147. package/dist/core/ScheduleFields.test.js +0 -193
  148. package/dist/core/SetupState.test.d.ts +0 -1
  149. package/dist/core/SetupState.test.js +0 -113
  150. package/dist/core/SignupMonetizationSettings.test.d.ts +0 -1
  151. package/dist/core/SignupMonetizationSettings.test.js +0 -515
  152. package/dist/core/Stats.test.d.ts +0 -1
  153. package/dist/core/Stats.test.js +0 -36
  154. package/dist/core/SystemAdmin.test.d.ts +0 -1
  155. package/dist/core/SystemAdmin.test.js +0 -1106
  156. package/dist/core/TaskActivitySync.test.d.ts +0 -1
  157. package/dist/core/TaskActivitySync.test.js +0 -90
  158. package/dist/core/TaskAttachmentsCanonical.test.d.ts +0 -1
  159. package/dist/core/TaskAttachmentsCanonical.test.js +0 -356
  160. package/dist/core/TaskAuditTimeline.test.d.ts +0 -1
  161. package/dist/core/TaskAuditTimeline.test.js +0 -319
  162. package/dist/core/TaskTaxonomyValidation.test.d.ts +0 -1
  163. package/dist/core/TaskTaxonomyValidation.test.js +0 -440
  164. package/dist/core/Taskforce.ids.test.d.ts +0 -1
  165. package/dist/core/Taskforce.ids.test.js +0 -611
  166. package/dist/core/Taskforce.listTasksSlim.test.d.ts +0 -1
  167. package/dist/core/Taskforce.listTasksSlim.test.js +0 -91
  168. package/dist/core/Taskforce.mcpAuth.test.d.ts +0 -1
  169. package/dist/core/Taskforce.mcpAuth.test.js +0 -450
  170. package/dist/core/Taskforce.realtimeMutation.test.d.ts +0 -1
  171. package/dist/core/Taskforce.realtimeMutation.test.js +0 -131
  172. package/dist/core/UserProfileAvatarDrafts.test.d.ts +0 -1
  173. package/dist/core/UserProfileAvatarDrafts.test.js +0 -138
  174. package/dist/core/WorkspaceDelete.test.d.ts +0 -1
  175. package/dist/core/WorkspaceDelete.test.js +0 -159
  176. package/dist/core/WorkspacePermissions.test.d.ts +0 -1
  177. package/dist/core/WorkspacePermissions.test.js +0 -270
  178. package/dist/core/WorkspacePlanMode.test.d.ts +0 -1
  179. package/dist/core/WorkspacePlanMode.test.js +0 -383
  180. package/dist/core/WorkspaceSyncSettings.test.d.ts +0 -1
  181. package/dist/core/WorkspaceSyncSettings.test.js +0 -65
  182. package/dist/core/__tests__/TaskAttachmentsCanonical.test.d.ts +0 -1
  183. package/dist/core/__tests__/TaskAttachmentsCanonical.test.js +0 -212
  184. package/dist/documentReviews/DocumentReviewSessionStore.test.d.ts +0 -1
  185. package/dist/documentReviews/DocumentReviewSessionStore.test.js +0 -127
  186. package/dist/hooks/authGuardPolicy.test.d.ts +0 -1
  187. package/dist/hooks/authGuardPolicy.test.js +0 -76
  188. package/dist/hooks/bootstrapTimeouts.test.d.ts +0 -1
  189. package/dist/hooks/bootstrapTimeouts.test.js +0 -12
  190. package/dist/hooks/sync/controlPlane.test.d.ts +0 -1
  191. package/dist/hooks/sync/controlPlane.test.js +0 -121
  192. package/dist/hooks/sync/lifecyclePolicy.test.d.ts +0 -1
  193. package/dist/hooks/sync/lifecyclePolicy.test.js +0 -124
  194. package/dist/hooks/sync/orchestratorShared.test.d.ts +0 -1
  195. package/dist/hooks/sync/orchestratorShared.test.js +0 -98
  196. package/dist/hooks/sync/pullLifecycle.test.d.ts +0 -1
  197. package/dist/hooks/sync/pullLifecycle.test.js +0 -80
  198. package/dist/hooks/sync/recovery.test.d.ts +0 -1
  199. package/dist/hooks/sync/recovery.test.js +0 -292
  200. package/dist/hooks/sync/transfers.test.d.ts +0 -1
  201. package/dist/hooks/sync/transfers.test.js +0 -928
  202. package/dist/hooks/sync/useRecentSyncEvents.test.d.ts +0 -1
  203. package/dist/hooks/sync/useRecentSyncEvents.test.js +0 -124
  204. package/dist/hooks/sync/useSyncStatusActions.test.d.ts +0 -1
  205. package/dist/hooks/sync/useSyncStatusActions.test.js +0 -133
  206. package/dist/hooks/sync/useSyncStatusControls.test.d.ts +0 -1
  207. package/dist/hooks/sync/useSyncStatusControls.test.js +0 -88
  208. package/dist/hooks/useFilterSort.test.d.ts +0 -1
  209. package/dist/hooks/useFilterSort.test.js +0 -419
  210. package/dist/hooks/useRealtimeSync.test.d.ts +0 -1
  211. package/dist/hooks/useRealtimeSync.test.js +0 -311
  212. package/dist/hooks/useSyncOrchestrator.aiProfiles.test.d.ts +0 -1
  213. package/dist/hooks/useSyncOrchestrator.aiProfiles.test.js +0 -54
  214. package/dist/hooks/useSyncOrchestrator.context-assets.test.d.ts +0 -1
  215. package/dist/hooks/useSyncOrchestrator.context-assets.test.js +0 -228
  216. package/dist/hooks/useSyncOrchestrator.retry-closure.test.d.ts +0 -1
  217. package/dist/hooks/useSyncOrchestrator.retry-closure.test.js +0 -2027
  218. package/dist/hooks/useTaskData.test.d.ts +0 -1
  219. package/dist/hooks/useTaskData.test.js +0 -291
  220. package/dist/hooks/useTaskMutations.test.d.ts +0 -1
  221. package/dist/hooks/useTaskMutations.test.js +0 -256
  222. package/dist/hooks/useTaskforce.contract.test.d.ts +0 -1
  223. package/dist/hooks/useTaskforce.contract.test.js +0 -7
  224. package/dist/hooks/useTaskforce.priority-filters.test.d.ts +0 -1
  225. package/dist/hooks/useTaskforce.priority-filters.test.js +0 -28
  226. package/dist/hooks/useTaskforce.runtime-routing.test.d.ts +0 -1
  227. package/dist/hooks/useTaskforce.runtime-routing.test.js +0 -246
  228. package/dist/hooks/useTaskforce.sync-behavior.test.d.ts +0 -1
  229. package/dist/hooks/useTaskforce.sync-behavior.test.js +0 -3644
  230. package/dist/hooks/useWorkspaceSyncController.test.d.ts +0 -1
  231. package/dist/hooks/useWorkspaceSyncController.test.js +0 -192
  232. package/dist/hooks/workspace/useTaskforceApiRouting.test.d.ts +0 -1
  233. package/dist/hooks/workspace/useTaskforceApiRouting.test.js +0 -77
  234. package/dist/hooks/workspace/workspaceLocalState.test.d.ts +0 -1
  235. package/dist/hooks/workspace/workspaceLocalState.test.js +0 -59
  236. package/dist/localization/localizationCatalogs.test.d.ts +0 -1
  237. package/dist/localization/localizationCatalogs.test.js +0 -37
  238. package/dist/mcp/aiProfileBootstrap.test.d.ts +0 -1
  239. package/dist/mcp/aiProfileBootstrap.test.js +0 -68
  240. package/dist/mcp/canonicalAssetHelpers.test.d.ts +0 -1
  241. package/dist/mcp/canonicalAssetHelpers.test.js +0 -67
  242. package/dist/mcp/clientIntegrations.test.d.ts +0 -1
  243. package/dist/mcp/clientIntegrations.test.js +0 -219
  244. package/dist/mcp/optionResolution.test.d.ts +0 -1
  245. package/dist/mcp/optionResolution.test.js +0 -43
  246. package/dist/mcp/runtime.test.d.ts +0 -1
  247. package/dist/mcp/runtime.test.js +0 -5211
  248. package/dist/mcp/structuredCommentValidation.test.d.ts +0 -1
  249. package/dist/mcp/structuredCommentValidation.test.js +0 -31
  250. package/dist/mcp/structuredDocValidation.test.d.ts +0 -1
  251. package/dist/mcp/structuredDocValidation.test.js +0 -35
  252. package/dist/mcp/toolRegistry.test.d.ts +0 -1
  253. package/dist/mcp/toolRegistry.test.js +0 -34
  254. package/dist/migrations/billingSchemaParity.test.d.ts +0 -1
  255. package/dist/migrations/billingSchemaParity.test.js +0 -160
  256. package/dist/migrations/taskSchemaMigrations.test.d.ts +0 -1
  257. package/dist/migrations/taskSchemaMigrations.test.js +0 -225
  258. package/dist/qaOpen.test.d.ts +0 -1
  259. package/dist/qaOpen.test.js +0 -56
  260. package/dist/releaseVersion.test.d.ts +0 -1
  261. package/dist/releaseVersion.test.js +0 -32
  262. package/dist/runtime/appGates.test.d.ts +0 -1
  263. package/dist/runtime/appGates.test.js +0 -42
  264. package/dist/server/aiProfileAvatarAssets.test.d.ts +0 -1
  265. package/dist/server/aiProfileAvatarAssets.test.js +0 -213
  266. package/dist/server/annotatedAttachmentsRoutes.test.d.ts +0 -1
  267. package/dist/server/annotatedAttachmentsRoutes.test.js +0 -532
  268. package/dist/server/auth.test.d.ts +0 -1
  269. package/dist/server/auth.test.js +0 -131
  270. package/dist/server/buildInfo.test.d.ts +0 -1
  271. package/dist/server/buildInfo.test.js +0 -29
  272. package/dist/server/cors.test.d.ts +0 -1
  273. package/dist/server/cors.test.js +0 -77
  274. package/dist/server/documentReviewRoutes.test.d.ts +0 -1
  275. package/dist/server/documentReviewRoutes.test.js +0 -190
  276. package/dist/server/email.test.d.ts +0 -1
  277. package/dist/server/email.test.js +0 -113
  278. package/dist/server/index.cookieProxy.test.d.ts +0 -1
  279. package/dist/server/index.cookieProxy.test.js +0 -67
  280. package/dist/server/index.rateLimit.test.d.ts +0 -1
  281. package/dist/server/index.rateLimit.test.js +0 -22
  282. package/dist/server/index.test.d.ts +0 -1
  283. package/dist/server/index.test.js +0 -283
  284. package/dist/server/rateLimit.test.d.ts +0 -1
  285. package/dist/server/rateLimit.test.js +0 -107
  286. package/dist/server/realtimeSync.auth.test.d.ts +0 -1
  287. package/dist/server/realtimeSync.auth.test.js +0 -62
  288. package/dist/server/realtimeSync.replay.test.d.ts +0 -1
  289. package/dist/server/realtimeSync.replay.test.js +0 -192
  290. package/dist/server/realtimeSync.workspaceIsolation.test.d.ts +0 -1
  291. package/dist/server/realtimeSync.workspaceIsolation.test.js +0 -101
  292. package/dist/server/routes/billing.test.d.ts +0 -1
  293. package/dist/server/routes/billing.test.js +0 -3515
  294. package/dist/server/routes/shared.test.d.ts +0 -1
  295. package/dist/server/routes/shared.test.js +0 -32
  296. package/dist/server/routes/sync.integration.test.d.ts +0 -1
  297. package/dist/server/routes/sync.integration.test.js +0 -2932
  298. package/dist/server/routes/syncAuxRoutes.test.d.ts +0 -1
  299. package/dist/server/routes/syncAuxRoutes.test.js +0 -158
  300. package/dist/server/routes/syncRouteGuards.test.d.ts +0 -1
  301. package/dist/server/routes/syncRouteGuards.test.js +0 -94
  302. package/dist/server/routes.test.d.ts +0 -1
  303. package/dist/server/routes.test.js +0 -15612
  304. package/dist/server/runtimeMode.test.d.ts +0 -1
  305. package/dist/server/runtimeMode.test.js +0 -26
  306. package/dist/server/securityHeaders.test.d.ts +0 -1
  307. package/dist/server/securityHeaders.test.js +0 -70
  308. package/dist/services/templateEngine.test.d.ts +0 -1
  309. package/dist/services/templateEngine.test.js +0 -150
  310. package/dist/services/templates.test.d.ts +0 -1
  311. package/dist/services/templates.test.js +0 -45
  312. package/dist/services/workflowDocumentFixtures.test.d.ts +0 -1
  313. package/dist/services/workflowDocumentFixtures.test.js +0 -78
  314. package/dist/services/workflowExportMatrix.test.d.ts +0 -1
  315. package/dist/services/workflowExportMatrix.test.js +0 -113
  316. package/dist/services/workflowExportSnapshots.test.d.ts +0 -1
  317. package/dist/services/workflowExportSnapshots.test.js +0 -30
  318. package/dist/services/workflowGeneration.test.d.ts +0 -1
  319. package/dist/services/workflowGeneration.test.js +0 -12
  320. package/dist/services/workflowSimulation.test.d.ts +0 -1
  321. package/dist/services/workflowSimulation.test.js +0 -113
  322. package/dist/services/workflowV2Policy.test.d.ts +0 -1
  323. package/dist/services/workflowV2Policy.test.js +0 -80
  324. package/dist/shared/customTaxonomyLibrary.test.d.ts +0 -1
  325. package/dist/shared/customTaxonomyLibrary.test.js +0 -20
  326. package/dist/shared/passwordPolicy.test.d.ts +0 -1
  327. package/dist/shared/passwordPolicy.test.js +0 -34
  328. package/dist/shared/runtimeContract.test.d.ts +0 -1
  329. package/dist/shared/runtimeContract.test.js +0 -23
  330. package/dist/shared/taxonomyLibrary.test.d.ts +0 -1
  331. package/dist/shared/taxonomyLibrary.test.js +0 -26
  332. package/dist/shared/taxonomyState.test.d.ts +0 -1
  333. package/dist/shared/taxonomyState.test.js +0 -71
  334. package/dist/soak/preflight.cli.d.ts +0 -1
  335. package/dist/soak/preflight.cli.js +0 -28
  336. package/dist/soak/preflight.d.ts +0 -26
  337. package/dist/soak/preflight.js +0 -113
  338. package/dist/soak/preflight.test.d.ts +0 -1
  339. package/dist/soak/preflight.test.js +0 -39
  340. package/dist/storage/objectStorageClient.test.d.ts +0 -1
  341. package/dist/storage/objectStorageClient.test.js +0 -82
  342. package/dist/storage/objectStorageConfig.test.d.ts +0 -1
  343. package/dist/storage/objectStorageConfig.test.js +0 -50
  344. package/dist/storage/postgresAdapter.test.d.ts +0 -1
  345. package/dist/storage/postgresAdapter.test.js +0 -29
  346. package/dist/storage/workspaceAssetStore.test.d.ts +0 -1
  347. package/dist/storage/workspaceAssetStore.test.js +0 -588
  348. package/dist/sync/cloudSyncApi.test.d.ts +0 -1
  349. package/dist/sync/cloudSyncApi.test.js +0 -111
  350. package/dist/sync/collaborationSyncPayload.test.d.ts +0 -1
  351. package/dist/sync/collaborationSyncPayload.test.js +0 -125
  352. package/dist/sync/contentSyncPayload.test.d.ts +0 -1
  353. package/dist/sync/contentSyncPayload.test.js +0 -143
  354. package/dist/sync/encryptionService.test.d.ts +0 -1
  355. package/dist/sync/encryptionService.test.js +0 -52
  356. package/dist/sync/planningSyncPayload.test.d.ts +0 -1
  357. package/dist/sync/planningSyncPayload.test.js +0 -92
  358. package/dist/sync/realtimeFeature.test.d.ts +0 -1
  359. package/dist/sync/realtimeFeature.test.js +0 -30
  360. package/dist/sync/realtimeReconcile.test.d.ts +0 -1
  361. package/dist/sync/realtimeReconcile.test.js +0 -43
  362. package/dist/sync/syncApplyHandlers.test.d.ts +0 -1
  363. package/dist/sync/syncApplyHandlers.test.js +0 -626
  364. package/dist/sync/syncService.test.d.ts +0 -1
  365. package/dist/sync/syncService.test.js +0 -903
  366. package/dist/sync/taskSyncPayload.test.d.ts +0 -1
  367. package/dist/sync/taskSyncPayload.test.js +0 -54
  368. package/dist/sync/workspacePullFeed.test.d.ts +0 -1
  369. package/dist/sync/workspacePullFeed.test.js +0 -438
  370. package/dist/sync/workspaceSyncModel.test.d.ts +0 -1
  371. package/dist/sync/workspaceSyncModel.test.js +0 -1442
  372. package/dist/test/setup.d.ts +0 -1
  373. package/dist/test/setup.js +0 -15
  374. package/dist/ui/assets/documentReferences-BPWp6ce0.js +0 -1
  375. package/dist/ui/assets/index-zvbo2Jse.js +0 -5
  376. package/dist/utils/accountProfileSummaryCache.test.d.ts +0 -1
  377. package/dist/utils/accountProfileSummaryCache.test.js +0 -63
  378. package/dist/utils/annotatedAttachments.test.d.ts +0 -1
  379. package/dist/utils/annotatedAttachments.test.js +0 -108
  380. package/dist/utils/assignees.test.d.ts +0 -1
  381. package/dist/utils/assignees.test.js +0 -25
  382. package/dist/utils/avatarUpload.test.d.ts +0 -1
  383. package/dist/utils/avatarUpload.test.js +0 -40
  384. package/dist/utils/canonicalAssetKind.test.d.ts +0 -1
  385. package/dist/utils/canonicalAssetKind.test.js +0 -24
  386. package/dist/utils/coalescedRefresh.test.d.ts +0 -1
  387. package/dist/utils/coalescedRefresh.test.js +0 -30
  388. package/dist/utils/constants.icons.test.d.ts +0 -1
  389. package/dist/utils/constants.icons.test.js +0 -41
  390. package/dist/utils/planParser.test.d.ts +0 -1
  391. package/dist/utils/planParser.test.js +0 -183
  392. package/dist/utils/planningReferences.test.d.ts +0 -1
  393. package/dist/utils/planningReferences.test.js +0 -17
  394. package/dist/utils/supportContact.test.d.ts +0 -1
  395. package/dist/utils/supportContact.test.js +0 -19
  396. package/dist/utils/syncEventDetails.test.d.ts +0 -1
  397. package/dist/utils/syncEventDetails.test.js +0 -23
  398. package/dist/utils/syncEventPresentation.test.d.ts +0 -1
  399. package/dist/utils/syncEventPresentation.test.js +0 -64
  400. package/dist/utils/syncStatusPresentation.test.d.ts +0 -1
  401. package/dist/utils/syncStatusPresentation.test.js +0 -164
  402. package/dist/utils/taskActivity.test.d.ts +0 -1
  403. package/dist/utils/taskActivity.test.js +0 -218
  404. package/dist/utils/taskDraftDefaults.test.d.ts +0 -1
  405. package/dist/utils/taskDraftDefaults.test.js +0 -34
  406. package/dist/utils/taskDragZones.test.d.ts +0 -1
  407. package/dist/utils/taskDragZones.test.js +0 -14
  408. package/dist/utils/taskNormalization.test.d.ts +0 -1
  409. package/dist/utils/taskNormalization.test.js +0 -158
  410. package/dist/utils/taskSearch.test.d.ts +0 -1
  411. package/dist/utils/taskSearch.test.js +0 -69
  412. package/dist/utils/taskUtils.test.d.ts +0 -1
  413. package/dist/utils/taskUtils.test.js +0 -19
  414. package/dist/utils/taskforceApiClient.test.d.ts +0 -1
  415. package/dist/utils/taskforceApiClient.test.js +0 -44
  416. package/dist/utils/taxonomyFormDefaults.test.d.ts +0 -1
  417. package/dist/utils/taxonomyFormDefaults.test.js +0 -63
  418. package/dist/utils/uiNotice.test.d.ts +0 -1
  419. package/dist/utils/uiNotice.test.js +0 -18
  420. package/dist/utils/workspaceIdentity.test.d.ts +0 -1
  421. package/dist/utils/workspaceIdentity.test.js +0 -61
  422. package/dist/utils/workspaceLifecycle.test.d.ts +0 -1
  423. package/dist/utils/workspaceLifecycle.test.js +0 -64
  424. package/dist/utils/workspaceSyncPresentation.test.d.ts +0 -1
  425. package/dist/utils/workspaceSyncPresentation.test.js +0 -71
  426. package/scripts/bootstrap-playwright-auth.mjs +0 -155
  427. package/scripts/check-cloud-mcp.mjs +0 -83
  428. package/scripts/check-compat-boundaries.mjs +0 -41
  429. package/scripts/check-env.ts +0 -31
  430. package/scripts/check-localization-strings.mjs +0 -49
  431. package/scripts/check-runtime-boundaries.mjs +0 -44
  432. package/scripts/debug-global.mjs +0 -34
  433. package/scripts/debug-login.mjs +0 -32
  434. package/scripts/debug-server.mjs +0 -36
  435. package/scripts/deploy-prod.sh +0 -41
  436. package/scripts/deploy-staging.sh +0 -23
  437. package/scripts/export-sqlite-to-postgres.mjs +0 -123
  438. package/scripts/generate-env-example.ts +0 -8
  439. package/scripts/mcp-stdio-adapter.mjs +0 -160
  440. package/scripts/migrate-task-data-assets.mjs +0 -408
  441. package/scripts/playwright-auth.sh +0 -19
  442. package/scripts/qa-open-lib.mjs +0 -175
  443. package/scripts/qa-open-lib.mjs.d.ts +0 -49
  444. package/scripts/qa-open.mjs +0 -352
  445. package/scripts/release-version-lib.mjs +0 -88
  446. package/scripts/release-version.mjs +0 -72
  447. package/scripts/run-billing-performance-smoke.sh +0 -24
  448. package/scripts/run-dev-proxy.sh +0 -51
  449. package/scripts/run-e2e-realtime.sh +0 -30
  450. package/scripts/run-smoke.sh +0 -35
  451. package/scripts/run-soak.sh +0 -41
  452. package/scripts/test-global.js +0 -143
  453. package/scripts/update-homebrew-formula.sh +0 -108
  454. package/scripts/with-esbuild.sh +0 -11
@@ -1,72 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { fireEvent, render, screen } from '@testing-library/react';
3
- import { describe, expect, it, vi } from 'vitest';
4
- import { AccountHubModal } from './AccountHubModal';
5
- vi.mock('../../../ui/Modal', () => ({
6
- Modal: ({ isOpen, children, title }) => (isOpen ? _jsxs("div", { children: [_jsx("h1", { children: title }), children] }) : null)
7
- }));
8
- describe('AccountHubModal', () => {
9
- it('shows checkout recovery guidance and a plan-selection CTA for expired checkout attempts', () => {
10
- const onStartCheckout = vi.fn();
11
- render(_jsx(AccountHubModal, { isOpen: true, theme: "dark", runtimeMode: "cloud", authRequiredForApi: true, isAuthenticated: true, hasAuthIdentity: true, authIdentityLabel: "owner@example.com", billingLoading: false, billingError: null, billingActionError: null, billingNotice: null, billingActionBusy: false, billingIntervalChoice: "month", accountProfileSummary: {
12
- planId: 'pro',
13
- planName: 'Pro Plan',
14
- entitlementState: 'pending_plan_selection',
15
- gate: 'plan_selection_required',
16
- message: 'Your latest checkout expired. Choose a plan to continue.',
17
- billingConflictCode: 'CHECKOUT_SESSION_EXPIRED',
18
- planSelectionRequired: true
19
- }, currentWorkspaceId: "workspace-1", canOpenTeamManagement: false, canManageWorkspaceSync: false, workspaceCloudSyncEnabled: false, syncStatusLabel: "Disabled", workspaceSyncError: null, syncControlBusy: false, supportMailtoHref: "mailto:support@taskforcehq.ai", cloudAuthEnabled: true, availableAuthProviders: [], onFetchLoginMethods: async () => ({ success: true, methods: [] }), onUnlinkLoginMethod: async () => ({ success: true }), onAddPassword: async () => ({ success: true }), onLinkProvider: () => { }, onClose: () => { }, onOpenWorkspaceAudit: () => { }, onBillingIntervalChange: () => { }, onRefreshBilling: () => { }, onUpdateInterval: () => { }, onManageBilling: () => { }, onStartCheckout: onStartCheckout, onToggleWorkspaceSync: () => { }, onOpenHelp: () => { } }));
20
- expect(screen.getByText('Your previous checkout expired. Choose a plan to continue.')).toBeInTheDocument();
21
- expect(screen.getByText('Pro Plan')).toBeInTheDocument();
22
- const cta = screen.getByRole('button', { name: 'Choose Plan' });
23
- fireEvent.click(cta);
24
- expect(onStartCheckout).toHaveBeenCalledTimes(1);
25
- });
26
- it('makes billing recovery the primary action for suspended accounts', () => {
27
- const onManageBilling = vi.fn();
28
- render(_jsx(AccountHubModal, { isOpen: true, theme: "dark", runtimeMode: "cloud", authRequiredForApi: true, isAuthenticated: true, hasAuthIdentity: true, authIdentityLabel: "owner@example.com", billingLoading: false, billingError: null, billingActionError: null, billingNotice: null, billingActionBusy: false, billingIntervalChoice: "month", accountProfileSummary: {
29
- planId: 'pro',
30
- planName: 'Pro Plan',
31
- entitlementState: 'suspended',
32
- stripeCustomerId: 'cus_123'
33
- }, currentWorkspaceId: "workspace-1", canOpenTeamManagement: false, canManageWorkspaceSync: false, workspaceCloudSyncEnabled: false, syncStatusLabel: "Disabled", workspaceSyncError: null, syncControlBusy: false, supportMailtoHref: "mailto:support@taskforcehq.ai", cloudAuthEnabled: true, availableAuthProviders: [], onFetchLoginMethods: async () => ({ success: true, methods: [] }), onUnlinkLoginMethod: async () => ({ success: true }), onAddPassword: async () => ({ success: true }), onLinkProvider: () => { }, onClose: () => { }, onOpenWorkspaceAudit: () => { }, onBillingIntervalChange: () => { }, onRefreshBilling: () => { }, onUpdateInterval: () => { }, onManageBilling: onManageBilling, onStartCheckout: () => { }, onToggleWorkspaceSync: () => { }, onOpenHelp: () => { } }));
34
- expect(screen.getByText('Your access is suspended because billing needs attention. Update billing to restore access.')).toBeInTheDocument();
35
- fireEvent.click(screen.getAllByRole('button', { name: 'Manage Billing' })[1]);
36
- expect(onManageBilling).toHaveBeenCalledTimes(1);
37
- });
38
- it('shows trialing accounts as active without blocked recovery copy', () => {
39
- const nowSpy = vi.spyOn(Date, 'now').mockReturnValue(new Date('2026-04-20T12:00:00.000Z').getTime());
40
- try {
41
- render(_jsx(AccountHubModal, { isOpen: true, theme: "dark", runtimeMode: "cloud", authRequiredForApi: true, isAuthenticated: true, hasAuthIdentity: true, authIdentityLabel: "owner@example.com", billingLoading: false, billingError: null, billingActionError: null, billingNotice: null, billingActionBusy: false, billingIntervalChoice: "month", accountProfileSummary: {
42
- planId: 'starter',
43
- planName: 'Starter',
44
- entitlementState: 'trialing',
45
- stripeCustomerId: 'cus_123',
46
- trialEnd: '2026-05-01T12:00:00.000Z'
47
- }, currentWorkspaceId: "workspace-1", canOpenTeamManagement: false, canManageWorkspaceSync: false, workspaceCloudSyncEnabled: false, syncStatusLabel: "Disabled", workspaceSyncError: null, syncControlBusy: false, supportMailtoHref: "mailto:support@taskforcehq.ai", cloudAuthEnabled: true, availableAuthProviders: [], onFetchLoginMethods: async () => ({ success: true, methods: [] }), onUnlinkLoginMethod: async () => ({ success: true }), onAddPassword: async () => ({ success: true }), onLinkProvider: () => { }, onClose: () => { }, onOpenWorkspaceAudit: () => { }, onBillingIntervalChange: () => { }, onRefreshBilling: () => { }, onUpdateInterval: () => { }, onManageBilling: () => { }, onStartCheckout: () => { }, onToggleWorkspaceSync: () => { }, onOpenHelp: () => { } }));
48
- expect(screen.getByText(/Your trial is active through/)).toBeInTheDocument();
49
- expect(screen.queryByText('Your access is suspended because billing needs attention. Update billing to restore access.')).not.toBeInTheDocument();
50
- }
51
- finally {
52
- nowSpy.mockRestore();
53
- }
54
- });
55
- it('shows an updating message instead of an expired active-trial date', () => {
56
- const nowSpy = vi.spyOn(Date, 'now').mockReturnValue(new Date('2026-04-20T12:00:00.000Z').getTime());
57
- try {
58
- render(_jsx(AccountHubModal, { isOpen: true, theme: "dark", runtimeMode: "cloud", authRequiredForApi: true, isAuthenticated: true, hasAuthIdentity: true, authIdentityLabel: "owner@example.com", billingLoading: false, billingError: null, billingActionError: null, billingNotice: null, billingActionBusy: false, billingIntervalChoice: "month", accountProfileSummary: {
59
- planId: 'starter',
60
- planName: 'Starter',
61
- entitlementState: 'trialing',
62
- stripeCustomerId: 'cus_123',
63
- trialEnd: '2026-04-12T16:09:09.000Z'
64
- }, currentWorkspaceId: "workspace-1", canOpenTeamManagement: false, canManageWorkspaceSync: false, workspaceCloudSyncEnabled: false, syncStatusLabel: "Disabled", workspaceSyncError: null, syncControlBusy: false, supportMailtoHref: "mailto:support@taskforcehq.ai", cloudAuthEnabled: true, availableAuthProviders: [], onFetchLoginMethods: async () => ({ success: true, methods: [] }), onUnlinkLoginMethod: async () => ({ success: true }), onAddPassword: async () => ({ success: true }), onLinkProvider: () => { }, onClose: () => { }, onOpenWorkspaceAudit: () => { }, onBillingIntervalChange: () => { }, onRefreshBilling: () => { }, onUpdateInterval: () => { }, onManageBilling: () => { }, onStartCheckout: () => { }, onToggleWorkspaceSync: () => { }, onOpenHelp: () => { } }));
65
- expect(screen.getByText('Your trial end date has passed. Billing status is updating.')).toBeInTheDocument();
66
- expect(screen.queryByText(/Your trial is active through/)).not.toBeInTheDocument();
67
- }
68
- finally {
69
- nowSpy.mockRestore();
70
- }
71
- });
72
- });
@@ -1,23 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { fireEvent, render, screen } from '@testing-library/react';
3
- import { describe, expect, it, vi } from 'vitest';
4
- import { TASKFORCE_SUPPORT_EMAIL } from '../../../../utils/supportContact';
5
- import { HelpModal } from './HelpModal';
6
- vi.mock('../../../ui/Modal', () => ({
7
- Modal: ({ isOpen, children, title }) => (isOpen ? _jsxs("div", { children: [_jsx("h1", { children: title }), children] }) : null)
8
- }));
9
- describe('HelpModal', () => {
10
- it('presents support actions instead of tutorial steps', () => {
11
- const onOpenSettings = vi.fn();
12
- const onOpenAccountHub = vi.fn();
13
- render(_jsx(HelpModal, { isOpen: true, theme: "dark", onClose: () => { }, onOpenSettings: onOpenSettings, onOpenAccountHub: onOpenAccountHub, supportMailtoHref: `mailto:${TASKFORCE_SUPPORT_EMAIL}` }));
14
- expect(screen.getByRole('heading', { name: 'Help & Support' })).toBeInTheDocument();
15
- expect(screen.getByRole('link', { name: 'Email Support' })).toHaveAttribute('href', `mailto:${TASKFORCE_SUPPORT_EMAIL}`);
16
- expect(screen.queryByText('Close Tutorial')).not.toBeInTheDocument();
17
- expect(screen.queryByText('Capture work')).not.toBeInTheDocument();
18
- fireEvent.click(screen.getByRole('button', { name: 'Open Settings' }));
19
- expect(onOpenSettings).toHaveBeenCalledTimes(1);
20
- fireEvent.click(screen.getByRole('button', { name: 'Open Account Hub' }));
21
- expect(onOpenAccountHub).toHaveBeenCalledTimes(1);
22
- });
23
- });
@@ -1,24 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { fireEvent, render, screen } from '@testing-library/react';
3
- import { describe, expect, it, vi } from 'vitest';
4
- import { SyncEnableWarningModal } from './SyncEnableWarningModal';
5
- vi.mock('../../../ui/Modal', () => ({
6
- Modal: ({ isOpen, children, title }) => (isOpen ? _jsxs("div", { children: [_jsx("h1", { children: title }), children] }) : null)
7
- }));
8
- describe('SyncEnableWarningModal', () => {
9
- it('warns that cloud sync reassigns canonical reference numbers', () => {
10
- render(_jsx(SyncEnableWarningModal, { isOpen: true, theme: "dark", onClose: () => { }, onConfirm: () => { } }));
11
- expect(screen.getByText('Turning on cloud sync can renumber task, document, and image references to match the cloud workspace.')).toBeInTheDocument();
12
- expect(screen.getByText(/Plain file attachments are not renumbered/)).toBeInTheDocument();
13
- expect(screen.getByRole('button', { name: 'Enable Sync Anyway' })).toBeInTheDocument();
14
- });
15
- it('routes cancel and confirm actions to the provided handlers', () => {
16
- const onClose = vi.fn();
17
- const onConfirm = vi.fn();
18
- render(_jsx(SyncEnableWarningModal, { isOpen: true, theme: "dark", onClose: onClose, onConfirm: onConfirm }));
19
- fireEvent.click(screen.getByRole('button', { name: 'Go Back' }));
20
- fireEvent.click(screen.getByRole('button', { name: 'Enable Sync Anyway' }));
21
- expect(onClose).toHaveBeenCalledTimes(1);
22
- expect(onConfirm).toHaveBeenCalledTimes(1);
23
- });
24
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,44 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { canManageTeamWorkspace, canOpenTeamManagement, normalizeTeamWorkspaceRole, resolveTeamPlanModeFromEntitlements } from './teamManagementAccess';
3
- describe('teamManagementAccess', () => {
4
- it('normalizes supported workspace roles', () => {
5
- expect(normalizeTeamWorkspaceRole('owner')).toBe('owner');
6
- expect(normalizeTeamWorkspaceRole('Admin')).toBe('admin');
7
- expect(normalizeTeamWorkspaceRole('read-only')).toBe('read-only');
8
- expect(normalizeTeamWorkspaceRole('viewer')).toBeNull();
9
- });
10
- it('allows team management eligibility only for cloud owners and admins', () => {
11
- expect(canManageTeamWorkspace(true, 'owner')).toBe(true);
12
- expect(canManageTeamWorkspace(true, 'admin')).toBe(true);
13
- expect(canManageTeamWorkspace(true, 'member')).toBe(false);
14
- expect(canManageTeamWorkspace(false, 'owner')).toBe(false);
15
- });
16
- it('resolves team plan mode only when team management is allowed in an active team entitlement', () => {
17
- expect(resolveTeamPlanModeFromEntitlements({
18
- state: 'active',
19
- features: {
20
- 'collaboration.team_management': { allowed: true, access: 'enabled', config: {} }
21
- }
22
- })).toBe('team');
23
- expect(resolveTeamPlanModeFromEntitlements({
24
- state: 'canceled',
25
- features: {
26
- 'collaboration.team_management': { allowed: true, access: 'enabled', config: {} }
27
- }
28
- })).toBe('personal');
29
- expect(resolveTeamPlanModeFromEntitlements({
30
- state: 'active',
31
- features: {
32
- 'collaboration.team_management': { allowed: false, access: 'disabled', config: {} }
33
- }
34
- })).toBe('personal');
35
- });
36
- it('opens Team Management only when the workspace admin role and team entitlement are both present', () => {
37
- expect(canOpenTeamManagement(true, 'owner', 'team')).toBe(true);
38
- expect(canOpenTeamManagement(true, 'admin', 'team')).toBe(true);
39
- expect(canOpenTeamManagement(true, 'owner', 'personal')).toBe(false);
40
- expect(canOpenTeamManagement(true, 'owner', 'unknown')).toBe(false);
41
- expect(canOpenTeamManagement(true, 'member', 'team')).toBe(false);
42
- expect(canOpenTeamManagement(false, 'owner', 'team')).toBe(false);
43
- });
44
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,90 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { resolveDeploymentConfig } from './deployment';
3
- describe('config/deployment', () => {
4
- it('defaults runtime mode to local without inferring from db provider', () => {
5
- const deployment = resolveDeploymentConfig({
6
- TASKFORCE_DB_PROVIDER: 'postgres'
7
- });
8
- expect(deployment.runtimeMode).toBe('local');
9
- expect(deployment.cloudEnvironment).toBe(null);
10
- });
11
- it('resolves canonical cloud environment into cloud endpoints', () => {
12
- const deployment = resolveDeploymentConfig({
13
- TASKFORCE_RUNTIME_MODE: 'cloud',
14
- TASKFORCE_CLOUD_ENVIRONMENT: 'staging'
15
- });
16
- expect(deployment.runtimeMode).toBe('cloud');
17
- expect(deployment.cloudEnvironment).toBe('staging');
18
- expect(deployment.cloudBaseUrl).toBe('https://staging-app.taskforcehq.ai');
19
- expect(deployment.cloudMcpBaseUrl).toBe('https://staging-mcp.taskforcehq.ai');
20
- expect(deployment.apiBaseUrl).toBe('https://staging-app.taskforcehq.ai');
21
- expect(deployment.cloudAuthBaseUrl).toBe('https://staging-app.taskforcehq.ai');
22
- expect(deployment.wsBaseUrl).toBe('https://staging-app.taskforcehq.ai');
23
- });
24
- it('keeps request-origin precedence for base/api urls and local-runtime websockets while preserving cloud auth origin', () => {
25
- const deployment = resolveDeploymentConfig({
26
- TASKFORCE_RUNTIME_MODE: 'local',
27
- TASKFORCE_CLOUD_ENVIRONMENT: 'production',
28
- VITE_TASKFORCE_API_BASE_URL: 'https://app.taskforcehq.ai'
29
- }, {
30
- requestBaseUrl: 'http://127.0.0.1:5174'
31
- });
32
- expect(deployment.baseUrl).toBe('http://127.0.0.1:5174');
33
- expect(deployment.apiBaseUrl).toBe('http://127.0.0.1:5174');
34
- expect(deployment.cloudAuthBaseUrl).toBe('https://app.taskforcehq.ai');
35
- expect(deployment.wsBaseUrl).toBe('http://127.0.0.1:5174');
36
- expect(deployment.cloudMcpBaseUrl).toBe('https://mcp.taskforcehq.ai');
37
- expect(deployment.cloudAuthViaLocalProxy).toBe(true);
38
- });
39
- it('keeps local-runtime websockets on the request origin even when cloud proxying is configured', () => {
40
- const deployment = resolveDeploymentConfig({
41
- TASKFORCE_RUNTIME_MODE: 'local',
42
- TASKFORCE_CLOUD_ENVIRONMENT: 'staging',
43
- TASKFORCE_CLOUD_PROXY_BASE_URL: 'https://staging-app.taskforcehq.ai'
44
- }, {
45
- requestBaseUrl: 'http://127.0.0.1:5174'
46
- });
47
- expect(deployment.baseUrl).toBe('http://127.0.0.1:5174');
48
- expect(deployment.apiBaseUrl).toBe('http://127.0.0.1:5174');
49
- expect(deployment.cloudAuthBaseUrl).toBe('https://staging-app.taskforcehq.ai');
50
- expect(deployment.wsBaseUrl).toBe('http://127.0.0.1:5174');
51
- expect(deployment.cloudAuthViaLocalProxy).toBe(true);
52
- });
53
- it('still honors an explicit websocket override in local runtime', () => {
54
- const deployment = resolveDeploymentConfig({
55
- TASKFORCE_RUNTIME_MODE: 'local',
56
- TASKFORCE_CLOUD_ENVIRONMENT: 'staging',
57
- TASKFORCE_CLOUD_PROXY_BASE_URL: 'https://staging-app.taskforcehq.ai',
58
- VITE_TASKFORCE_WS_BASE_URL: 'https://ws-proxy.example.com'
59
- }, {
60
- requestBaseUrl: 'http://127.0.0.1:5174'
61
- });
62
- expect(deployment.wsBaseUrl).toBe('https://ws-proxy.example.com');
63
- });
64
- it('keeps legacy URL-only configuration working with compat warnings', () => {
65
- const deployment = resolveDeploymentConfig({
66
- VITE_TASKFORCE_API_BASE_URL: 'https://performance-app.taskforcehq.ai'
67
- });
68
- expect(deployment.cloudEnvironment).toBe('performance');
69
- expect(deployment.cloudMcpBaseUrl).toBe('https://performance-mcp.taskforcehq.ai');
70
- expect(deployment.apiBaseUrl).toBe('https://performance-app.taskforcehq.ai');
71
- expect(deployment.warnings.join('\n')).toContain('VITE_TASKFORCE_API_BASE_URL');
72
- });
73
- it('uses an explicit MCP base URL when provided', () => {
74
- const deployment = resolveDeploymentConfig({
75
- TASKFORCE_RUNTIME_MODE: 'cloud',
76
- TASKFORCE_CLOUD_ENVIRONMENT: 'production',
77
- VITE_TASKFORCE_CLOUD_MCP_BASE_URL: 'https://mcp.taskforcehq.ai'
78
- });
79
- expect(deployment.cloudBaseUrl).toBe('https://app.taskforcehq.ai');
80
- expect(deployment.cloudMcpBaseUrl).toBe('https://mcp.taskforcehq.ai');
81
- expect(deployment.cloudAuthBaseUrl).toBe('https://app.taskforcehq.ai');
82
- });
83
- it('accepts legacy ENV alias for site builds during compat mode', () => {
84
- const deployment = resolveDeploymentConfig({
85
- ENV: 'staging'
86
- });
87
- expect(deployment.cloudEnvironment).toBe('staging');
88
- expect(deployment.warnings.join('\n')).toContain('ENV=staging');
89
- });
90
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,125 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { renderEnvExample, validateEnvironment } from './envSchema';
3
- describe('config/envSchema', () => {
4
- it('fails server validation when cloud runtime is configured without postgres', () => {
5
- const result = validateEnvironment({
6
- TASKFORCE_RUNTIME_MODE: 'cloud',
7
- TASKFORCE_CLOUD_ENVIRONMENT: 'production',
8
- TASKFORCE_DB_PROVIDER: 'sqlite',
9
- TASKFORCE_AUTH_ENABLED: 'false'
10
- }, { target: 'server', strictUnknown: false });
11
- expect(result.ok).toBe(false);
12
- expect(result.errors.join('\n')).toMatch(/Cloud runtime requires TASKFORCE_DB_PROVIDER=postgres/i);
13
- });
14
- it('fails soak validation when credentials are missing', () => {
15
- const result = validateEnvironment({
16
- SYNC_SOAK_LOCAL_BASE_URL: 'http://localhost:5174',
17
- SYNC_SOAK_CLOUD_BASE_URL: 'https://performance-app.taskforcehq.ai',
18
- SYNC_SOAK_WORKSPACE_ID: 'test-smoke'
19
- }, { target: 'soak', strictUnknown: false });
20
- expect(result.ok).toBe(false);
21
- expect(result.errors.join('\n')).toMatch(/SYNC_SOAK_ACCOUNTS_JSON|SYNC_SOAK_EMAIL/i);
22
- });
23
- it('renders an env example with key sections', () => {
24
- const example = renderEnvExample('all');
25
- expect(example).toContain('# Core');
26
- expect(example).toContain('TASKFORCE_DB_PROVIDER=');
27
- expect(example).toContain('SYNC_SOAK_ACCOUNTS_JSON=');
28
- });
29
- it('rejects unknown email provider', () => {
30
- const result = validateEnvironment({
31
- TASKFORCE_RUNTIME_MODE: 'cloud',
32
- TASKFORCE_CLOUD_ENVIRONMENT: 'production',
33
- TASKFORCE_DB_PROVIDER: 'postgres',
34
- TASKFORCE_DATABASE_URL: 'postgresql://localhost/test',
35
- TASKFORCE_AUTH_ENABLED: 'false',
36
- TASKFORCE_EMAIL_PROVIDER: 'ses'
37
- }, { target: 'server', strictUnknown: false });
38
- expect(result.ok).toBe(false);
39
- expect(result.errors.join('\n')).toContain('TASKFORCE_EMAIL_PROVIDER must be one of: console, resend, google-workspace.');
40
- });
41
- it('requires google workspace app password when provider is google-workspace', () => {
42
- const result = validateEnvironment({
43
- TASKFORCE_RUNTIME_MODE: 'cloud',
44
- TASKFORCE_CLOUD_ENVIRONMENT: 'production',
45
- TASKFORCE_DB_PROVIDER: 'postgres',
46
- TASKFORCE_DATABASE_URL: 'postgresql://localhost/test',
47
- TASKFORCE_AUTH_ENABLED: 'false',
48
- TASKFORCE_EMAIL_PROVIDER: 'google-workspace'
49
- }, { target: 'server', strictUnknown: false });
50
- expect(result.ok).toBe(false);
51
- expect(result.errors.join('\n')).toContain('TASKFORCE_EMAIL_PROVIDER_API_KEY (or TASKFORCE_EMAIL_GOOGLE_APP_PASSWORD) is required when TASKFORCE_EMAIL_PROVIDER=google-workspace.');
52
- });
53
- it('accepts google workspace provider with google app password alias', () => {
54
- const result = validateEnvironment({
55
- TASKFORCE_RUNTIME_MODE: 'cloud',
56
- TASKFORCE_CLOUD_ENVIRONMENT: 'production',
57
- TASKFORCE_DB_PROVIDER: 'postgres',
58
- TASKFORCE_DATABASE_URL: 'postgresql://localhost/test',
59
- TASKFORCE_AUTH_ENABLED: 'false',
60
- TASKFORCE_EMAIL_PROVIDER: 'google-workspace',
61
- TASKFORCE_EMAIL_GOOGLE_APP_PASSWORD: 'app-password'
62
- }, { target: 'server', strictUnknown: false });
63
- expect(result.ok).toBe(true);
64
- });
65
- it('requires TASKFORCE_STRIPE_SECRET_KEY when billing is enabled', () => {
66
- const result = validateEnvironment({
67
- TASKFORCE_RUNTIME_MODE: 'cloud',
68
- TASKFORCE_CLOUD_ENVIRONMENT: 'production',
69
- TASKFORCE_DB_PROVIDER: 'postgres',
70
- TASKFORCE_DATABASE_URL: 'postgresql://localhost/test',
71
- TASKFORCE_AUTH_ENABLED: 'false',
72
- TASKFORCE_BILLING_ENABLED: 'true',
73
- TASKFORCE_STRIPE_WEBHOOK_SECRET: 'whsec_test'
74
- }, { target: 'server', strictUnknown: false });
75
- expect(result.ok).toBe(false);
76
- expect(result.errors.join('\n')).toContain('TASKFORCE_STRIPE_SECRET_KEY is required when TASKFORCE_BILLING_ENABLED=true.');
77
- });
78
- it('requires TASKFORCE_STRIPE_WEBHOOK_SECRET when billing is enabled', () => {
79
- const result = validateEnvironment({
80
- TASKFORCE_RUNTIME_MODE: 'cloud',
81
- TASKFORCE_CLOUD_ENVIRONMENT: 'production',
82
- TASKFORCE_DB_PROVIDER: 'postgres',
83
- TASKFORCE_DATABASE_URL: 'postgresql://localhost/test',
84
- TASKFORCE_AUTH_ENABLED: 'false',
85
- TASKFORCE_BILLING_ENABLED: 'true',
86
- TASKFORCE_STRIPE_SECRET_KEY: 'sk_test_x'
87
- }, { target: 'server', strictUnknown: false });
88
- expect(result.ok).toBe(false);
89
- expect(result.errors.join('\n')).toContain('TASKFORCE_STRIPE_WEBHOOK_SECRET is required when TASKFORCE_BILLING_ENABLED=true.');
90
- });
91
- it('requires cloud runtime when billing is enabled', () => {
92
- const result = validateEnvironment({
93
- TASKFORCE_RUNTIME_MODE: 'local',
94
- TASKFORCE_CLOUD_ENVIRONMENT: 'production',
95
- TASKFORCE_DB_PROVIDER: 'sqlite',
96
- TASKFORCE_AUTH_ENABLED: 'false',
97
- TASKFORCE_BILLING_ENABLED: 'true',
98
- TASKFORCE_STRIPE_SECRET_KEY: 'sk_test_x',
99
- TASKFORCE_STRIPE_WEBHOOK_SECRET: 'whsec_test'
100
- }, { target: 'server', strictUnknown: false });
101
- expect(result.ok).toBe(false);
102
- expect(result.errors.join('\n')).toContain('TASKFORCE_BILLING_ENABLED requires TASKFORCE_RUNTIME_MODE=cloud.');
103
- });
104
- it('warns when inferring cloud environment from legacy URL inputs', () => {
105
- const result = validateEnvironment({
106
- TASKFORCE_RUNTIME_MODE: 'local',
107
- TASKFORCE_DB_PROVIDER: 'sqlite',
108
- VITE_TASKFORCE_API_BASE_URL: 'https://performance-app.taskforcehq.ai'
109
- }, { target: 'server', strictUnknown: false });
110
- expect(result.ok).toBe(true);
111
- expect(result.warnings.join('\n')).toContain('VITE_TASKFORCE_API_BASE_URL');
112
- });
113
- it('accepts VITE_TASKFORCE_CLOUD_MCP_BASE_URL as a managed environment variable', () => {
114
- const result = validateEnvironment({
115
- TASKFORCE_RUNTIME_MODE: 'cloud',
116
- TASKFORCE_CLOUD_ENVIRONMENT: 'performance',
117
- TASKFORCE_DB_PROVIDER: 'postgres',
118
- TASKFORCE_DATABASE_URL: 'postgresql://localhost/test',
119
- TASKFORCE_AUTH_ENABLED: 'false',
120
- VITE_TASKFORCE_CLOUD_MCP_BASE_URL: 'https://performance-mcp.taskforcehq.ai'
121
- }, { target: 'server', strictUnknown: true });
122
- expect(result.ok).toBe(true);
123
- expect(result.errors).toEqual([]);
124
- });
125
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,184 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { upsertAiProfileForSyncService } from './AiProfileService.js';
3
- function createDeps(overrides) {
4
- return {
5
- db: {
6
- provider: 'sqlite',
7
- open: true,
8
- prepare() {
9
- return {
10
- run() {
11
- return { changes: 1 };
12
- },
13
- get() {
14
- return undefined;
15
- },
16
- all() {
17
- return [];
18
- }
19
- };
20
- },
21
- exec() { },
22
- pragma() {
23
- return null;
24
- },
25
- transaction(fn) {
26
- return fn;
27
- },
28
- close() { }
29
- },
30
- tenantId: 'default',
31
- normalizeWorkspaceId: (workspaceId) => workspaceId.trim() || 'default',
32
- normalizeAiProfileName: (name) => String(name || '').trim() || 'AI Agent',
33
- normalizeAiProfileUsername: (value, fallbackName) => {
34
- const raw = String(value || '').trim();
35
- if (raw)
36
- return raw;
37
- return fallbackName.trim().toLowerCase().replace(/\s+/g, '-');
38
- },
39
- normalizeAiProfileIcon: (value) => String(value || '').trim() || 'Bot',
40
- normalizeAiProfileColor: (value) => String(value || '').trim() || '#64748b',
41
- aiProfileRowToRecord: (row) => ({
42
- id: String(row.id || ''),
43
- workspaceId: String(row.workspace_id || ''),
44
- profileToken: String(row.profile_token || ''),
45
- name: String(row.name || ''),
46
- username: String(row.username || ''),
47
- icon: String(row.icon || ''),
48
- color: String(row.color || ''),
49
- surfaceType: typeof row.surface_type === 'string' ? row.surface_type : null,
50
- providerMetadata: row.provider_metadata_json && typeof row.provider_metadata_json === 'string'
51
- ? JSON.parse(row.provider_metadata_json)
52
- : null,
53
- createdAt: String(row.created_at || ''),
54
- updatedAt: String(row.updated_at || ''),
55
- lastActiveAt: typeof row.last_active_at === 'string' ? row.last_active_at : null
56
- }),
57
- generateEntityId: (prefix) => `${prefix}-1`,
58
- issueProfileToken: () => 'tfp_test',
59
- countAiProfileUsage: () => ({ used: 0, limit: null, remaining: null }),
60
- createRuleError: (message, statusCode = 400, code = 'TASK_RULE_VIOLATION', details) => {
61
- const error = new Error(message);
62
- error.statusCode = statusCode;
63
- error.code = code;
64
- error.details = details;
65
- return error;
66
- },
67
- ...overrides
68
- };
69
- }
70
- describe('AiProfileService', () => {
71
- it('uses the expected ai_profiles upsert statement for sync writes', () => {
72
- const statements = [];
73
- const profile = {
74
- id: 'ai-profile-codex',
75
- workspaceId: 'workspace-1',
76
- profileToken: 'tfp_codex_sync',
77
- name: 'Codex',
78
- username: 'codex',
79
- icon: 'Bot',
80
- color: '#0ea5e9',
81
- surfaceType: 'coding_tool',
82
- providerMetadata: { source: 'sync' },
83
- archivedAt: null,
84
- archivedBy: null,
85
- archivedReason: null,
86
- mergedIntoProfileId: null,
87
- rosterStateUpdatedAt: '2026-03-22T10:00:00.000Z',
88
- createdAt: '2026-03-22T10:00:00.000Z',
89
- updatedAt: '2026-03-22T10:05:00.000Z',
90
- lastActiveAt: '2026-03-22T10:05:00.000Z'
91
- };
92
- const deps = createDeps({
93
- db: {
94
- provider: 'sqlite',
95
- open: true,
96
- prepare(sql) {
97
- statements.push(sql);
98
- if (sql.includes('WHERE tenant_id = ? AND workspace_id = ? AND id = ?')) {
99
- return {
100
- run() {
101
- return { changes: 0 };
102
- },
103
- get() {
104
- return undefined;
105
- },
106
- all() {
107
- return [];
108
- }
109
- };
110
- }
111
- if (sql.includes('INSERT INTO ai_profiles')) {
112
- return {
113
- run() {
114
- return { changes: 1 };
115
- },
116
- get() {
117
- return undefined;
118
- },
119
- all() {
120
- return [];
121
- }
122
- };
123
- }
124
- return {
125
- run() {
126
- return { changes: 0 };
127
- },
128
- get() {
129
- return {
130
- id: profile.id,
131
- workspace_id: profile.workspaceId,
132
- profile_token: profile.profileToken,
133
- name: profile.name,
134
- username: profile.username,
135
- icon: profile.icon,
136
- color: profile.color,
137
- surface_type: profile.surfaceType,
138
- provider_metadata_json: JSON.stringify(profile.providerMetadata),
139
- archived_at: profile.archivedAt,
140
- archived_by: profile.archivedBy,
141
- archived_reason: profile.archivedReason,
142
- merged_into_profile_id: profile.mergedIntoProfileId,
143
- roster_state_updated_at: profile.rosterStateUpdatedAt,
144
- created_at: profile.createdAt,
145
- updated_at: profile.updatedAt,
146
- last_active_at: profile.lastActiveAt
147
- };
148
- },
149
- all() {
150
- return [];
151
- }
152
- };
153
- },
154
- exec() { },
155
- pragma() {
156
- return null;
157
- },
158
- transaction(fn) {
159
- return fn;
160
- },
161
- close() { }
162
- }
163
- });
164
- upsertAiProfileForSyncService(deps, profile);
165
- const upsertSql = statements.find((statement) => statement.includes('INSERT INTO ai_profiles'));
166
- expect(upsertSql).toBeTruthy();
167
- expect(upsertSql).toContain('id, tenant_id, workspace_id, profile_token, name, username, icon, color,');
168
- expect(upsertSql).toContain('surface_type, seat_scope, provider_metadata_json,');
169
- expect(upsertSql).toContain('archived_at, archived_by, archived_reason, merged_into_profile_id,');
170
- expect(upsertSql).toContain('roster_state_updated_at, created_at, updated_at, last_active_at');
171
- expect(upsertSql).toContain('ON CONFLICT(id) DO UPDATE SET');
172
- expect(upsertSql).toContain('workspace_id = excluded.workspace_id');
173
- expect(upsertSql).toContain('profile_token = excluded.profile_token');
174
- expect(upsertSql).toContain('surface_type = excluded.surface_type');
175
- expect(upsertSql).toContain('seat_scope = excluded.seat_scope');
176
- expect(upsertSql).toContain('provider_metadata_json = excluded.provider_metadata_json');
177
- expect(upsertSql).toContain('archived_at = excluded.archived_at');
178
- expect(upsertSql).toContain('archived_by = excluded.archived_by');
179
- expect(upsertSql).toContain('archived_reason = excluded.archived_reason');
180
- expect(upsertSql).toContain('merged_into_profile_id = excluded.merged_into_profile_id');
181
- expect(upsertSql).toContain('roster_state_updated_at = excluded.roster_state_updated_at');
182
- expect(upsertSql).toContain('last_active_at = excluded.last_active_at');
183
- });
184
- });
@@ -1 +0,0 @@
1
- export {};