@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,611 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import * as fs from 'fs';
3
- import * as os from 'os';
4
- import * as path from 'path';
5
- import { TaskforceCore } from './Taskforce';
6
- import { ensureTaskReferenceSchema } from '../migrations/taskSchemaMigrations';
7
- function makeCore() {
8
- const projectRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'taskforce-id-test-'));
9
- const core = new TaskforceCore({
10
- projectRoot,
11
- storagePath: path.join(projectRoot, '.taskforce')
12
- });
13
- return {
14
- core,
15
- cleanup: () => {
16
- core.close();
17
- fs.rmSync(projectRoot, { recursive: true, force: true });
18
- }
19
- };
20
- }
21
- describe('TaskforceCore id policy', () => {
22
- it('rejects client-supplied task id for normal create', () => {
23
- const { core, cleanup } = makeCore();
24
- try {
25
- expect(() => core.createTask({
26
- id: 'task-client-provided',
27
- title: 'Should fail'
28
- })).toThrowError(/task id is not allowed/i);
29
- }
30
- finally {
31
- cleanup();
32
- }
33
- });
34
- it('allows client-supplied task id in workspace sync snapshot apply path', () => {
35
- const { core, cleanup } = makeCore();
36
- try {
37
- const result = core.applyWorkspaceSyncSnapshot({
38
- tasks: [
39
- {
40
- id: 'task-sync-imported',
41
- title: 'Imported',
42
- status: 'task'
43
- }
44
- ]
45
- }, 'workspace-test');
46
- expect(result.created).toBe(1);
47
- const task = core.getTask('task-sync-imported', 'workspace-test');
48
- expect(task?.title).toBe('Imported');
49
- }
50
- finally {
51
- cleanup();
52
- }
53
- });
54
- it('rejects client-supplied task reference number for normal create', () => {
55
- const { core, cleanup } = makeCore();
56
- try {
57
- expect(() => core.createTask({
58
- title: 'Should fail',
59
- referenceNumber: 99
60
- })).toThrowError(/task reference number is not allowed/i);
61
- }
62
- finally {
63
- cleanup();
64
- }
65
- });
66
- it('assigns sequential task references per workspace', () => {
67
- const { core, cleanup } = makeCore();
68
- try {
69
- const first = core.createTask({ title: 'First' }, { workspaceId: 'workspace-a' });
70
- const second = core.createTask({ title: 'Second' }, { workspaceId: 'workspace-a' });
71
- const otherWorkspaceFirst = core.createTask({ title: 'Other workspace first' }, { workspaceId: 'workspace-b' });
72
- expect(first.referenceNumber).toBe(1);
73
- expect(first.referenceLabel).toBe('T-1');
74
- expect(second.referenceNumber).toBe(2);
75
- expect(second.referenceLabel).toBe('T-2');
76
- expect(otherWorkspaceFirst.referenceNumber).toBe(1);
77
- expect(otherWorkspaceFirst.referenceLabel).toBe('T-1');
78
- }
79
- finally {
80
- cleanup();
81
- }
82
- });
83
- it('assigns provisional local task references without consuming canonical task references', () => {
84
- const { core, cleanup } = makeCore();
85
- try {
86
- const provisionalFirst = core.createTask({ title: 'Offline first' }, {
87
- workspaceId: 'workspace-a',
88
- provisionalLocalReference: true
89
- });
90
- const provisionalSecond = core.createTask({ title: 'Offline second' }, {
91
- workspaceId: 'workspace-a',
92
- provisionalLocalReference: true
93
- });
94
- const canonical = core.createTask({ title: 'Cloud-backed task' }, { workspaceId: 'workspace-a' });
95
- expect(provisionalFirst.referenceNumber).toBeNull();
96
- expect(provisionalFirst.localReferenceNumber).toBe(1);
97
- expect(provisionalFirst.referenceLabel).toBe('LT-1');
98
- expect(provisionalSecond.referenceNumber).toBeNull();
99
- expect(provisionalSecond.localReferenceNumber).toBe(2);
100
- expect(provisionalSecond.referenceLabel).toBe('LT-2');
101
- expect(canonical.referenceNumber).toBe(1);
102
- expect(canonical.localReferenceNumber).toBeNull();
103
- expect(canonical.referenceLabel).toBe('T-1');
104
- }
105
- finally {
106
- cleanup();
107
- }
108
- });
109
- it('replaces a provisional local reference with a canonical cloud reference during sync apply', () => {
110
- const { core, cleanup } = makeCore();
111
- try {
112
- const provisional = core.createTask({ title: 'Offline draft' }, {
113
- workspaceId: 'workspace-a',
114
- provisionalLocalReference: true
115
- });
116
- expect(provisional.referenceLabel).toBe('LT-1');
117
- const syncResult = core.applyWorkspaceSyncSnapshot({
118
- tasks: [
119
- {
120
- id: provisional.id,
121
- title: 'Offline draft',
122
- status: 'task',
123
- referenceNumber: 7,
124
- updatedAt: '2099-04-10T17:00:00.000Z'
125
- }
126
- ]
127
- }, 'workspace-a');
128
- expect(syncResult.updated).toBe(1);
129
- expect(core.getTask(provisional.id, 'workspace-a')).toEqual(expect.objectContaining({
130
- referenceNumber: 7,
131
- localReferenceNumber: null,
132
- referenceLabel: 'T-7'
133
- }));
134
- }
135
- finally {
136
- cleanup();
137
- }
138
- });
139
- it('preserves provisional local references across core reloads', () => {
140
- const projectRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'taskforce-id-reload-test-'));
141
- const storagePath = path.join(projectRoot, '.taskforce');
142
- const firstCore = new TaskforceCore({ projectRoot, storagePath });
143
- try {
144
- const provisional = firstCore.createTask({ title: 'Offline draft' }, {
145
- workspaceId: 'workspace-a',
146
- provisionalLocalReference: true
147
- });
148
- expect(provisional.referenceNumber).toBeNull();
149
- expect(provisional.localReferenceNumber).toBe(1);
150
- firstCore.close();
151
- const reloadedCore = new TaskforceCore({ projectRoot, storagePath });
152
- try {
153
- const reloadedTask = reloadedCore.getTask(provisional.id, 'workspace-a');
154
- expect(reloadedTask).toEqual(expect.objectContaining({
155
- referenceNumber: null,
156
- localReferenceNumber: 1,
157
- referenceLabel: 'LT-1'
158
- }));
159
- }
160
- finally {
161
- reloadedCore.close();
162
- }
163
- }
164
- finally {
165
- fs.rmSync(projectRoot, { recursive: true, force: true });
166
- }
167
- });
168
- it('lets the incoming synced task keep its preferred reference and renumbers the local incumbent', () => {
169
- const { core, cleanup } = makeCore();
170
- try {
171
- const localTask = core.createTask({ title: 'Local task' }, { workspaceId: 'workspace-a' });
172
- const syncResult = core.applyWorkspaceSyncSnapshot({
173
- tasks: [
174
- {
175
- id: 'task-sync-imported-collision',
176
- title: 'Remote task',
177
- status: 'task',
178
- referenceNumber: localTask.referenceNumber,
179
- createdAt: '2026-04-10T15:00:00.000Z',
180
- updatedAt: '2026-04-10T15:00:00.000Z',
181
- }
182
- ]
183
- }, 'workspace-a');
184
- expect(syncResult.created).toBe(1);
185
- expect(core.getTask(localTask.id, 'workspace-a')?.referenceLabel).toBe('T-2');
186
- expect(core.getTask('task-sync-imported-collision', 'workspace-a')?.referenceLabel).toBe('T-1');
187
- }
188
- finally {
189
- cleanup();
190
- }
191
- });
192
- it('lets incoming synced updates claim the preferred reference and renumbers the displaced task', () => {
193
- const { core, cleanup } = makeCore();
194
- try {
195
- const first = core.createTask({ title: 'First' }, { workspaceId: 'workspace-a' });
196
- const second = core.createTask({ title: 'Second' }, { workspaceId: 'workspace-a' });
197
- const syncResult = core.applyWorkspaceSyncSnapshot({
198
- tasks: [
199
- {
200
- id: second.id,
201
- title: 'Second',
202
- status: 'task',
203
- referenceNumber: first.referenceNumber,
204
- updatedAt: '2099-04-11T16:00:00.000Z',
205
- }
206
- ]
207
- }, 'workspace-a');
208
- expect(syncResult.updated).toBe(1);
209
- expect(core.getTask(first.id, 'workspace-a')?.referenceLabel).toBe('T-3');
210
- expect(core.getTask(second.id, 'workspace-a')?.referenceLabel).toBe('T-1');
211
- }
212
- finally {
213
- cleanup();
214
- }
215
- });
216
- it('resolves task identifiers by task reference or internal id', () => {
217
- const { core, cleanup } = makeCore();
218
- try {
219
- const created = core.createTask({ title: 'Lookup target' }, { workspaceId: 'workspace-a' });
220
- expect(core.resolveTaskIdentifier('T-1', 'workspace-a')?.id).toBe(created.id);
221
- expect(core.resolveTaskIdentifier(created.id, 'workspace-a')?.referenceLabel).toBe('T-1');
222
- expect(core.searchTasks('T-1', 'all', 'workspace-a')[0]?.id).toBe(created.id);
223
- }
224
- finally {
225
- cleanup();
226
- }
227
- });
228
- it('backfills missing task references deterministically and restores workspace counters', () => {
229
- const { core, cleanup } = makeCore();
230
- try {
231
- const first = core.createTask({ title: 'First' }, { workspaceId: 'workspace-a' });
232
- const second = core.createTask({ title: 'Second' }, { workspaceId: 'workspace-a' });
233
- const db = core.db;
234
- db.prepare(`UPDATE tasks SET reference_number = NULL WHERE tenant_id = ? AND workspace_id = ?`).run('default', 'workspace-a');
235
- db.prepare(`DELETE FROM workspace_task_reference_sequences WHERE tenant_id = ? AND workspace_id = ?`).run('default', 'workspace-a');
236
- ensureTaskReferenceSchema(db);
237
- const refreshedFirst = core.getTask(first.id, 'workspace-a');
238
- const refreshedSecond = core.getTask(second.id, 'workspace-a');
239
- const third = core.createTask({ title: 'Third' }, { workspaceId: 'workspace-a' });
240
- expect(refreshedFirst?.referenceLabel).toBe('T-1');
241
- expect(refreshedSecond?.referenceLabel).toBe('T-2');
242
- expect(third.referenceLabel).toBe('T-3');
243
- }
244
- finally {
245
- cleanup();
246
- }
247
- });
248
- it('imports synced comments when creating a task from workspace sync snapshot', () => {
249
- const { core, cleanup } = makeCore();
250
- try {
251
- core.applyWorkspaceSyncSnapshot({
252
- tasks: [
253
- {
254
- id: 'task-sync-comments-create',
255
- title: 'Imported with comments',
256
- status: 'task',
257
- comments: [
258
- {
259
- id: 'comment-sync-1',
260
- author: 'user',
261
- text: 'Imported comment',
262
- timestamp: '2026-02-20T10:00:00.000Z'
263
- }
264
- ]
265
- }
266
- ]
267
- }, 'workspace-test');
268
- const task = core.getTask('task-sync-comments-create', 'workspace-test');
269
- expect(task?.comments).toEqual([
270
- expect.objectContaining({
271
- id: 'comment-sync-1',
272
- author: 'user',
273
- submittedAuthor: 'user',
274
- text: 'Imported comment',
275
- timestamp: '2026-02-20T10:00:00.000Z',
276
- actor: expect.objectContaining({
277
- id: 'user',
278
- kind: 'human'
279
- })
280
- })
281
- ]);
282
- }
283
- finally {
284
- cleanup();
285
- }
286
- });
287
- it('ignores stale incoming sync update when existing task is newer', () => {
288
- const { core, cleanup } = makeCore();
289
- try {
290
- core.applyWorkspaceSyncSnapshot({
291
- tasks: [
292
- {
293
- id: 'task-sync-conflict-1',
294
- title: 'Local newer',
295
- status: 'task',
296
- createdAt: '2026-02-20T10:00:00.000Z'
297
- }
298
- ]
299
- }, 'workspace-test');
300
- const staleResult = core.applyWorkspaceSyncSnapshot({
301
- tasks: [
302
- {
303
- id: 'task-sync-conflict-1',
304
- title: 'Cloud stale',
305
- status: 'task',
306
- updatedAt: '2026-02-20T09:00:00.000Z'
307
- }
308
- ]
309
- }, 'workspace-test');
310
- expect(staleResult.skipped).toBe(1);
311
- const task = core.getTask('task-sync-conflict-1', 'workspace-test');
312
- expect(task?.title).toBe('Local newer');
313
- }
314
- finally {
315
- cleanup();
316
- }
317
- });
318
- it('applies newer incoming sync update when timestamp is later', () => {
319
- const { core, cleanup } = makeCore();
320
- try {
321
- core.applyWorkspaceSyncSnapshot({
322
- tasks: [
323
- {
324
- id: 'task-sync-conflict-2',
325
- title: 'Old value',
326
- status: 'task',
327
- createdAt: '2026-02-20T10:00:00.000Z'
328
- }
329
- ]
330
- }, 'workspace-test');
331
- const newerResult = core.applyWorkspaceSyncSnapshot({
332
- tasks: [
333
- {
334
- id: 'task-sync-conflict-2',
335
- title: 'Newer value',
336
- status: 'in-progress',
337
- updatedAt: '2026-02-20T11:00:00.000Z'
338
- }
339
- ]
340
- }, 'workspace-test');
341
- expect(newerResult.updated).toBe(1);
342
- const task = core.getTask('task-sync-conflict-2', 'workspace-test');
343
- expect(task?.title).toBe('Newer value');
344
- expect(task?.status).toBe('in-progress');
345
- }
346
- finally {
347
- cleanup();
348
- }
349
- });
350
- it('preserves unresolved synced assignee ids instead of coercing them to unassigned', () => {
351
- const { core, cleanup } = makeCore();
352
- try {
353
- const result = core.applyWorkspaceSyncSnapshot({
354
- tasks: [
355
- {
356
- id: 'task-sync-unresolved-assignee',
357
- title: 'Imported with opaque assignee',
358
- status: 'task',
359
- assignee: 'user-remote-1'
360
- }
361
- ]
362
- }, 'workspace-test');
363
- expect(result.created).toBe(1);
364
- const task = core.getTask('task-sync-unresolved-assignee', 'workspace-test');
365
- expect(task?.assignee).toBe('user-remote-1');
366
- expect(task?.assigneeActor).toEqual(expect.objectContaining({
367
- id: 'user-remote-1',
368
- kind: 'human',
369
- meta: expect.objectContaining({ unresolved: true })
370
- }));
371
- }
372
- finally {
373
- cleanup();
374
- }
375
- });
376
- it('applies newer incoming sync comments and ignores stale incoming comment snapshots', () => {
377
- const { core, cleanup } = makeCore();
378
- try {
379
- core.applyWorkspaceSyncSnapshot({
380
- tasks: [
381
- {
382
- id: 'task-sync-comments-update',
383
- title: 'Comment sync task',
384
- status: 'task',
385
- updatedAt: '2026-02-20T10:00:00.000Z',
386
- comments: [
387
- {
388
- id: 'comment-old',
389
- author: 'user',
390
- text: 'Older comment',
391
- timestamp: '2026-02-20T10:00:00.000Z'
392
- }
393
- ]
394
- }
395
- ]
396
- }, 'workspace-test');
397
- const newerResult = core.applyWorkspaceSyncSnapshot({
398
- tasks: [
399
- {
400
- id: 'task-sync-comments-update',
401
- title: 'Comment sync task',
402
- status: 'task',
403
- updatedAt: '2026-02-20T11:00:00.000Z',
404
- comments: [
405
- {
406
- id: 'comment-new',
407
- author: 'ai',
408
- text: 'Newer synced comment',
409
- timestamp: '2026-02-20T11:00:00.000Z'
410
- }
411
- ]
412
- }
413
- ]
414
- }, 'workspace-test');
415
- expect(newerResult.updated).toBe(1);
416
- expect(core.getTask('task-sync-comments-update', 'workspace-test')?.comments).toEqual([
417
- expect.objectContaining({
418
- id: 'comment-new',
419
- author: 'agent',
420
- submittedAuthor: 'ai',
421
- text: 'Newer synced comment',
422
- timestamp: '2026-02-20T11:00:00.000Z',
423
- actor: expect.objectContaining({
424
- id: 'agent',
425
- kind: 'ai'
426
- })
427
- })
428
- ]);
429
- const removalSnapshotResult = core.applyWorkspaceSyncSnapshot({
430
- tasks: [
431
- {
432
- id: 'task-sync-comments-update',
433
- title: 'Comment sync task',
434
- status: 'task',
435
- updatedAt: '2026-02-20T12:00:00.000Z',
436
- comments: [
437
- {
438
- id: 'comment-new',
439
- author: 'ai',
440
- text: 'Newer synced comment',
441
- timestamp: '2026-02-20T11:00:00.000Z'
442
- }
443
- ]
444
- }
445
- ]
446
- }, 'workspace-test');
447
- expect(removalSnapshotResult.updated).toBe(1);
448
- expect(core.getTask('task-sync-comments-update', 'workspace-test')?.comments).toEqual([
449
- expect.objectContaining({
450
- id: 'comment-new',
451
- text: 'Newer synced comment',
452
- })
453
- ]);
454
- const staleResult = core.applyWorkspaceSyncSnapshot({
455
- tasks: [
456
- {
457
- id: 'task-sync-comments-update',
458
- title: 'Comment sync task',
459
- status: 'task',
460
- updatedAt: '2026-02-20T10:30:00.000Z',
461
- comments: [
462
- {
463
- id: 'comment-stale',
464
- author: 'user',
465
- text: 'Stale comment',
466
- timestamp: '2026-02-20T10:30:00.000Z'
467
- }
468
- ]
469
- }
470
- ]
471
- }, 'workspace-test');
472
- expect(staleResult.skipped).toBe(1);
473
- expect(core.getTask('task-sync-comments-update', 'workspace-test')?.comments).toEqual([
474
- expect.objectContaining({
475
- id: 'comment-new',
476
- author: 'agent',
477
- submittedAuthor: 'ai',
478
- text: 'Newer synced comment',
479
- timestamp: '2026-02-20T11:00:00.000Z',
480
- actor: expect.objectContaining({
481
- id: 'agent',
482
- kind: 'ai'
483
- })
484
- })
485
- ]);
486
- }
487
- finally {
488
- cleanup();
489
- }
490
- });
491
- it('keeps task sync watermarks monotonic when adding comments', () => {
492
- const { core, cleanup } = makeCore();
493
- try {
494
- const task = core.createTask({
495
- title: 'Comment watermark task',
496
- status: 'task'
497
- }, { workspaceId: 'workspace-test' });
498
- const futureWatermark = '2099-02-20T10:00:00.000Z';
499
- const db = core.db;
500
- db.prepare(`
501
- UPDATE tasks
502
- SET updated_at = ?
503
- WHERE tenant_id = ? AND workspace_id = ? AND id = ?
504
- `).run(futureWatermark, 'default', 'workspace-test', task.id);
505
- const updated = core.addComment(task.id, 'Comment should advance sync', 'user', 'workspace-test');
506
- expect(Date.parse(String(updated?.updatedAt || ''))).toBeGreaterThan(Date.parse(futureWatermark));
507
- const syncRows = core.listTasksForSync('workspace-test', {
508
- watermark: futureWatermark,
509
- id: task.id
510
- }, 10);
511
- expect(syncRows).toHaveLength(1);
512
- expect(syncRows[0]?.task.comments).toEqual([
513
- expect.objectContaining({
514
- author: 'user',
515
- submittedAuthor: 'user',
516
- text: 'Comment should advance sync'
517
- })
518
- ]);
519
- }
520
- finally {
521
- cleanup();
522
- }
523
- });
524
- it('applies incoming sync update when timestamps are equal (deterministic tie behavior)', () => {
525
- const { core, cleanup } = makeCore();
526
- try {
527
- core.applyWorkspaceSyncSnapshot({
528
- tasks: [
529
- {
530
- id: 'task-sync-conflict-3',
531
- title: 'Initial value',
532
- status: 'task',
533
- createdAt: '2026-02-20T10:00:00.000Z'
534
- }
535
- ]
536
- }, 'workspace-test');
537
- const equalTimestampResult = core.applyWorkspaceSyncSnapshot({
538
- tasks: [
539
- {
540
- id: 'task-sync-conflict-3',
541
- title: 'zz-incoming-same-timestamp',
542
- status: 'review',
543
- createdAt: '2026-02-20T10:00:00.000Z',
544
- updatedAt: '2026-02-20T10:00:00.000Z'
545
- }
546
- ]
547
- }, 'workspace-test');
548
- expect(equalTimestampResult.updated).toBe(1);
549
- const task = core.getTask('task-sync-conflict-3', 'workspace-test');
550
- expect(task?.title).toBe('zz-incoming-same-timestamp');
551
- expect(task?.status).toBe('review');
552
- }
553
- finally {
554
- cleanup();
555
- }
556
- });
557
- it('does not churn updatedAt when the incoming sync snapshot is identical to the winning local snapshot', () => {
558
- const { core, cleanup } = makeCore();
559
- try {
560
- core.applyWorkspaceSyncSnapshot({
561
- tasks: [
562
- {
563
- id: 'task-sync-stable',
564
- title: 'Stable task',
565
- status: 'in-progress',
566
- createdAt: '2026-02-20T10:00:00.000Z',
567
- updatedAt: '2026-02-20T11:00:00.000Z'
568
- }
569
- ]
570
- }, 'workspace-test');
571
- const before = core.getTask('task-sync-stable', 'workspace-test');
572
- const repeatedResult = core.applyWorkspaceSyncSnapshot({
573
- tasks: [
574
- {
575
- id: 'task-sync-stable',
576
- title: 'Stable task',
577
- status: 'in-progress',
578
- createdAt: '2026-02-20T10:00:00.000Z',
579
- updatedAt: '2026-02-20T11:00:00.000Z'
580
- }
581
- ]
582
- }, 'workspace-test');
583
- const after = core.getTask('task-sync-stable', 'workspace-test');
584
- expect(repeatedResult.skipped).toBe(1);
585
- expect(after?.updatedAt).toBe(before?.updatedAt);
586
- expect(after?.status).toBe('in-progress');
587
- }
588
- finally {
589
- cleanup();
590
- }
591
- });
592
- it('resolves preferred workspace to the most active non-default workspace', () => {
593
- const { core, cleanup } = makeCore();
594
- try {
595
- core.applyWorkspaceSyncSnapshot({
596
- tasks: [{ id: 'task-a', title: 'A', status: 'task' }]
597
- }, 'workspace-small');
598
- core.applyWorkspaceSyncSnapshot({
599
- tasks: [
600
- { id: 'task-b1', title: 'B1', status: 'task' },
601
- { id: 'task-b2', title: 'B2', status: 'task' }
602
- ]
603
- }, 'workspace-large');
604
- expect(core.resolvePreferredWorkspaceId({ allowDefault: true })).toBe('workspace-large');
605
- expect(core.resolvePreferredWorkspaceId({ allowDefault: false })).toBe('workspace-large');
606
- }
607
- finally {
608
- cleanup();
609
- }
610
- });
611
- });
@@ -1 +0,0 @@
1
- export {};