@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 +0,0 @@
1
- export {};
@@ -1,192 +0,0 @@
1
- import { afterEach, describe, expect, it, vi } from 'vitest';
2
- import { act, renderHook } from '@testing-library/react';
3
- import { useWorkspaceSyncController } from './useWorkspaceSyncController';
4
- const makeInput = (overrides = {}) => ({
5
- currentWorkspaceId: 'ws-test',
6
- setWorkspaceCloudSyncEnabled: vi.fn(),
7
- setWorkspaceSyncPhase: vi.fn(),
8
- setWorkspaceSyncSetupIntent: vi.fn(),
9
- setWorkspaceLastPullAt: vi.fn(),
10
- setWorkspaceLastPushAt: vi.fn(),
11
- setWorkspaceLastErrorMessage: vi.fn(),
12
- ...overrides
13
- });
14
- describe('useWorkspaceSyncController', () => {
15
- afterEach(() => {
16
- localStorage.clear();
17
- vi.unstubAllGlobals();
18
- vi.clearAllMocks();
19
- });
20
- it('acquires and releases a workspace sync lease', async () => {
21
- const { result } = renderHook(() => useWorkspaceSyncController(makeInput()));
22
- let acquired = false;
23
- await act(async () => {
24
- acquired = await result.current.acquireWorkspaceSyncLease('ws-test', 'pull');
25
- });
26
- expect(acquired).toBe(true);
27
- expect(result.current.readWorkspaceSyncLease('ws-test')?.operation).toBe('pull');
28
- act(() => {
29
- result.current.releaseWorkspaceSyncLease('ws-test');
30
- });
31
- expect(result.current.readWorkspaceSyncLease('ws-test')).toBeNull();
32
- });
33
- it('refuses a healthy competing workspace sync lease owner', async () => {
34
- window.localStorage.setItem('taskforce.sync.lease.v1.ws-test', JSON.stringify({
35
- ownerId: 'other-window',
36
- workspaceId: 'ws-test',
37
- operation: 'pull',
38
- heartbeatAt: new Date().toISOString(),
39
- expiresAt: new Date(Date.now() + 30_000).toISOString()
40
- }));
41
- const { result } = renderHook(() => useWorkspaceSyncController(makeInput()));
42
- let acquired = true;
43
- await act(async () => {
44
- acquired = await result.current.acquireWorkspaceSyncLease('ws-test', 'push');
45
- });
46
- expect(acquired).toBe(false);
47
- expect(result.current.readWorkspaceSyncLease('ws-test')?.ownerId).toBe('other-window');
48
- });
49
- it('reclaims a stale workspace sync lease owner', async () => {
50
- window.localStorage.setItem('taskforce.sync.lease.v1.ws-test', JSON.stringify({
51
- ownerId: 'other-window',
52
- workspaceId: 'ws-test',
53
- operation: 'pull',
54
- heartbeatAt: '2026-03-15T10:00:00.000Z',
55
- expiresAt: '2026-03-15T10:00:01.000Z'
56
- }));
57
- const { result } = renderHook(() => useWorkspaceSyncController(makeInput()));
58
- let acquired = false;
59
- await act(async () => {
60
- acquired = await result.current.acquireWorkspaceSyncLease('ws-test', 'repair');
61
- });
62
- expect(acquired).toBe(true);
63
- expect(result.current.readWorkspaceSyncLease('ws-test')?.operation).toBe('repair');
64
- expect(result.current.readWorkspaceSyncLease('ws-test')?.ownerId).not.toBe('other-window');
65
- });
66
- it('loads legacy workspace sync state through the v2 compat mapping', async () => {
67
- vi.stubGlobal('fetch', vi.fn((url) => {
68
- if (url.includes('/api/taskforce/ui-state?key=workspace-sync')) {
69
- return Promise.resolve({
70
- ok: true,
71
- json: () => Promise.resolve({
72
- success: true,
73
- state: {
74
- cloudSyncEnabled: true,
75
- sourceOfTruth: 'cloud',
76
- onboardingCompleted: false,
77
- pullCursor: 'cursor-1'
78
- }
79
- })
80
- });
81
- }
82
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ success: true }) });
83
- }));
84
- const input = makeInput();
85
- const { result } = renderHook(() => useWorkspaceSyncController(input));
86
- await act(async () => {
87
- await result.current.loadWorkspaceSyncState();
88
- });
89
- expect(input.setWorkspaceCloudSyncEnabled).toHaveBeenCalledWith(true);
90
- expect(input.setWorkspaceSyncPhase).toHaveBeenCalledWith('attach-cloud');
91
- });
92
- it('clears local-only push baselines from remote ui-state patches', async () => {
93
- const uiStatePosts = [];
94
- vi.stubGlobal('fetch', vi.fn((url, init) => {
95
- if (url.includes('/api/taskforce/ui-state?key=workspace-sync')) {
96
- return Promise.resolve({
97
- ok: true,
98
- json: () => Promise.resolve({
99
- success: true,
100
- state: {
101
- version: 2,
102
- enabled: true,
103
- phase: 'active',
104
- pullCursor: 'cursor-1',
105
- pushBaseline: {
106
- taskIds: ['task-1'],
107
- taskWatermarks: [['task-1', 'x'.repeat(1024 * 1024)]],
108
- initiativeWatermarks: [],
109
- workstreamWatermarks: [],
110
- aiProfileWatermarks: [],
111
- documentWatermarks: [],
112
- assetWatermarks: [],
113
- documentReviewSessionWatermarks: [],
114
- documentReviewCommentWatermarks: [],
115
- annotatedAttachmentSessionWatermarks: [],
116
- taskEventWatermarks: [],
117
- taxonomyStateFingerprint: ''
118
- }
119
- }
120
- })
121
- });
122
- }
123
- if (url.includes('/api/taskforce/ui-state') && String(init?.method || '').toUpperCase() === 'POST') {
124
- uiStatePosts.push(JSON.parse(String(init?.body || '{}')));
125
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ success: true }) });
126
- }
127
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ success: true }) });
128
- }));
129
- const { result } = renderHook(() => useWorkspaceSyncController(makeInput()));
130
- await act(async () => {
131
- await result.current.loadWorkspaceSyncState();
132
- await result.current.persistWorkspaceSyncPatch({ lastPullAt: '2026-04-27T20:30:00.000Z' });
133
- });
134
- expect(result.current.readWorkspaceSyncStateSnapshot().pushBaseline?.taskWatermarks[0]?.[1]).toHaveLength(1024 * 1024);
135
- expect(uiStatePosts).toHaveLength(1);
136
- expect(uiStatePosts[0]?.patch?.lastPullAt).toBe('2026-04-27T20:30:00.000Z');
137
- expect(uiStatePosts[0]?.patch?.pushBaseline).toBeNull();
138
- expect(JSON.stringify(uiStatePosts[0])).not.toContain('xxxx');
139
- });
140
- it('persists attach-cloud phase when enabling sync for an existing cloud workspace', async () => {
141
- const uiStatePosts = [];
142
- vi.stubGlobal('fetch', vi.fn((url, init) => {
143
- if (url.includes('/api/taskforce/ui-state') && String(init?.method || '').toUpperCase() === 'POST') {
144
- uiStatePosts.push(JSON.parse(String(init?.body || '{}')));
145
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ success: true }) });
146
- }
147
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ success: true }) });
148
- }));
149
- const input = makeInput();
150
- const { result } = renderHook(() => useWorkspaceSyncController(input));
151
- let saveResult;
152
- await act(async () => {
153
- saveResult = await result.current.saveWorkspaceCloudSyncSettings({ enabled: true }, {
154
- cloudAuthConfigured: true,
155
- isAuthenticated: true,
156
- ensureCloudWorkspaceReadyForSync: async () => ({ success: true, provisioned: false })
157
- });
158
- });
159
- expect(saveResult).toEqual({ success: true });
160
- expect(input.setWorkspaceCloudSyncEnabled).toHaveBeenCalledWith(true);
161
- expect(input.setWorkspaceSyncPhase).toHaveBeenCalledWith('attach-cloud');
162
- expect(uiStatePosts.some((entry) => entry?.patch?.version === 2
163
- && entry?.patch?.enabled === true
164
- && entry?.patch?.phase === 'attach-cloud'
165
- && entry?.patch?.pullCursor === null)).toBe(true);
166
- });
167
- it('persists provision-local phase when enabling sync for a new cloud workspace', async () => {
168
- const uiStatePosts = [];
169
- vi.stubGlobal('fetch', vi.fn((url, init) => {
170
- if (url.includes('/api/taskforce/ui-state') && String(init?.method || '').toUpperCase() === 'POST') {
171
- uiStatePosts.push(JSON.parse(String(init?.body || '{}')));
172
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ success: true }) });
173
- }
174
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ success: true }) });
175
- }));
176
- const input = makeInput();
177
- const { result } = renderHook(() => useWorkspaceSyncController(input));
178
- let saveResult;
179
- await act(async () => {
180
- saveResult = await result.current.saveWorkspaceCloudSyncSettings({ enabled: true }, {
181
- cloudAuthConfigured: true,
182
- isAuthenticated: true,
183
- ensureCloudWorkspaceReadyForSync: async () => ({ success: true, provisioned: true })
184
- });
185
- });
186
- expect(saveResult).toEqual({ success: true });
187
- expect(input.setWorkspaceSyncPhase).toHaveBeenCalledWith('provision-local');
188
- expect(uiStatePosts.some((entry) => entry?.patch?.version === 2
189
- && entry?.patch?.enabled === true
190
- && entry?.patch?.phase === 'provision-local')).toBe(true);
191
- });
192
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,77 +0,0 @@
1
- import { renderHook } from '@testing-library/react';
2
- import { afterEach, describe, expect, it, vi } from 'vitest';
3
- import { createRef } from 'react';
4
- import { useTaskforceApiRouting } from './useTaskforceApiRouting';
5
- describe('useTaskforceApiRouting', () => {
6
- afterEach(() => {
7
- vi.restoreAllMocks();
8
- });
9
- it('keeps local-only sync routes on the current origin in cloud runtime', async () => {
10
- const fetchMock = vi.fn(async (input) => new Response(null, { status: 204 }));
11
- vi.stubGlobal('fetch', fetchMock);
12
- const currentWorkspaceIdRef = createRef();
13
- currentWorkspaceIdRef.current = 'workspace-1';
14
- renderHook(() => useTaskforceApiRouting({
15
- currentWorkspaceIdRef,
16
- runtimeMode: 'cloud',
17
- resolveApiUrl: (path) => `https://cloud.example.com${path}`
18
- }));
19
- await window.fetch('/api/taskforce/sync/workspace/repair-startup', { method: 'POST' });
20
- await window.fetch('/api/taskforce/sync/workspace/apply-local', { method: 'POST' });
21
- await window.fetch('/api/taskforce/auth/runtime-config');
22
- expect(fetchMock.mock.calls.map(([input]) => String(input))).toEqual([
23
- '/api/taskforce/sync/workspace/repair-startup',
24
- '/api/taskforce/sync/workspace/apply-local',
25
- '/api/taskforce/auth/runtime-config'
26
- ]);
27
- });
28
- it('still rewrites cloud-owned taskforce routes in cloud runtime', async () => {
29
- const fetchMock = vi.fn(async (input) => new Response(null, { status: 204 }));
30
- vi.stubGlobal('fetch', fetchMock);
31
- const currentWorkspaceIdRef = createRef();
32
- currentWorkspaceIdRef.current = 'workspace-1';
33
- renderHook(() => useTaskforceApiRouting({
34
- currentWorkspaceIdRef,
35
- runtimeMode: 'cloud',
36
- resolveApiUrl: (path) => `https://cloud.example.com${path}`
37
- }));
38
- await window.fetch('/api/taskforce/sync/workspace/pull?workspaceId=workspace-1');
39
- expect(fetchMock).toHaveBeenCalledWith('https://cloud.example.com/api/taskforce/sync/workspace/pull?workspaceId=workspace-1', expect.objectContaining({
40
- headers: expect.any(Headers)
41
- }));
42
- });
43
- it('reads the injected workspace header from the live ref without waiting for rerender', async () => {
44
- const fetchMock = vi.fn(async (_input, init) => new Response(null, { status: 204 }));
45
- vi.stubGlobal('fetch', fetchMock);
46
- const currentWorkspaceIdRef = createRef();
47
- currentWorkspaceIdRef.current = 'workspace-1';
48
- renderHook(() => useTaskforceApiRouting({
49
- currentWorkspaceIdRef,
50
- runtimeMode: 'cloud',
51
- resolveApiUrl: (path) => `https://cloud.example.com${path}`
52
- }));
53
- currentWorkspaceIdRef.current = 'workspace-2';
54
- await window.fetch('/api/taskforce/tasks');
55
- const [, init] = fetchMock.mock.calls.at(-1);
56
- const headers = init.headers;
57
- expect(headers.get('x-taskforce-workspace-id')).toBe('workspace-2');
58
- expect(headers.get('x-taskforce-workspace-authoritative')).toBe('1');
59
- });
60
- it('stops injecting the workspace header when the live ref resets to default', async () => {
61
- const fetchMock = vi.fn(async (_input, init) => new Response(null, { status: 204 }));
62
- vi.stubGlobal('fetch', fetchMock);
63
- const currentWorkspaceIdRef = createRef();
64
- currentWorkspaceIdRef.current = 'workspace-1';
65
- renderHook(() => useTaskforceApiRouting({
66
- currentWorkspaceIdRef,
67
- runtimeMode: 'cloud',
68
- resolveApiUrl: (path) => `https://cloud.example.com${path}`
69
- }));
70
- currentWorkspaceIdRef.current = 'default';
71
- await window.fetch('/api/taskforce/tasks');
72
- const [, init] = fetchMock.mock.calls.at(-1);
73
- const headers = init.headers;
74
- expect(headers.get('x-taskforce-workspace-id')).toBeNull();
75
- expect(headers.get('x-taskforce-workspace-authoritative')).toBeNull();
76
- });
77
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,59 +0,0 @@
1
- import { afterEach, describe, expect, it, vi } from 'vitest';
2
- import { persistRemoteUiState, resetRemoteUiStatePersistCache } from './workspaceLocalState';
3
- describe('persistRemoteUiState', () => {
4
- afterEach(() => {
5
- resetRemoteUiStatePersistCache();
6
- vi.unstubAllGlobals();
7
- vi.clearAllMocks();
8
- vi.useRealTimers();
9
- });
10
- it('skips identical payloads after a successful persist', async () => {
11
- const fetchMock = vi.fn(async () => ({
12
- ok: true,
13
- status: 200,
14
- json: async () => ({ success: true })
15
- }));
16
- vi.stubGlobal('fetch', fetchMock);
17
- const first = await persistRemoteUiState({
18
- stateKey: 'app',
19
- workspaceId: 'workspace-1',
20
- patch: { activeWorkspaceModule: 'tasks' }
21
- });
22
- const second = await persistRemoteUiState({
23
- stateKey: 'app',
24
- workspaceId: 'workspace-1',
25
- patch: { activeWorkspaceModule: 'tasks' }
26
- });
27
- expect(first.skipped).toBe(false);
28
- expect(second).toEqual({ skipped: true, reason: 'unchanged' });
29
- expect(fetchMock).toHaveBeenCalledTimes(1);
30
- });
31
- it('backs off identical failed payloads briefly before retrying', async () => {
32
- vi.useFakeTimers();
33
- const fetchMock = vi.fn(async () => {
34
- throw new Error('gateway');
35
- });
36
- vi.stubGlobal('fetch', fetchMock);
37
- const first = await persistRemoteUiState({
38
- stateKey: 'layout',
39
- workspaceId: 'workspace-1',
40
- patch: { planningDrawerOpen: true }
41
- });
42
- const second = await persistRemoteUiState({
43
- stateKey: 'layout',
44
- workspaceId: 'workspace-1',
45
- patch: { planningDrawerOpen: true }
46
- });
47
- expect(first.skipped).toBe(false);
48
- expect(second).toEqual({ skipped: true, reason: 'cooldown' });
49
- expect(fetchMock).toHaveBeenCalledTimes(1);
50
- vi.advanceTimersByTime(5001);
51
- const third = await persistRemoteUiState({
52
- stateKey: 'layout',
53
- workspaceId: 'workspace-1',
54
- patch: { planningDrawerOpen: true }
55
- });
56
- expect(third.skipped).toBe(false);
57
- expect(fetchMock).toHaveBeenCalledTimes(2);
58
- });
59
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,37 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { enUS } from './locales/en-US';
3
- import { es419 } from './locales/es-419';
4
- import { ptBR } from './locales/pt-BR';
5
- function collectLeafKeys(input, prefix = '') {
6
- if (!input || typeof input !== 'object')
7
- return [];
8
- return Object.entries(input).flatMap(([key, value]) => {
9
- const nextPrefix = prefix ? `${prefix}.${key}` : key;
10
- if (value && typeof value === 'object' && !Array.isArray(value)) {
11
- return collectLeafKeys(value, nextPrefix);
12
- }
13
- return [nextPrefix];
14
- });
15
- }
16
- describe('Localization catalogs', () => {
17
- it('keeps identical key coverage across locales', () => {
18
- const enKeys = collectLeafKeys(enUS).sort();
19
- const esKeys = collectLeafKeys(es419).sort();
20
- const ptKeys = collectLeafKeys(ptBR).sort();
21
- expect(esKeys).toEqual(enKeys);
22
- expect(ptKeys).toEqual(enKeys);
23
- });
24
- it('avoids blank translations in non-default locales', () => {
25
- const values = [es419, ptBR];
26
- for (const catalog of values) {
27
- for (const key of collectLeafKeys(catalog)) {
28
- const segments = key.split('.');
29
- let cursor = catalog;
30
- for (const segment of segments)
31
- cursor = cursor?.[segment];
32
- expect(typeof cursor).toBe('string');
33
- expect(String(cursor).trim().length).toBeGreaterThan(0);
34
- }
35
- }
36
- });
37
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,68 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { AI_PROFILE_BOOTSTRAP_HEADER_NAMES, buildAiProfileBootstrapHeaders, buildResolveAiProfileInputFromBootstrap, parseAiProfileBootstrapHeaders, } from './aiProfileBootstrap';
3
- describe('aiProfileBootstrap', () => {
4
- it('builds and parses bootstrap headers from a shared contract', () => {
5
- const headers = buildAiProfileBootstrapHeaders({
6
- aiProfileName: 'Automation Codex',
7
- aiProfileToken: 'tfp_automation_codex',
8
- aiProfileIcon: 'Code2',
9
- aiProfileColor: '#10a37f',
10
- aiProfileDescription: 'OpenAI Codex coding agent connected through MCP.',
11
- aiProfileRole: 'Coding Agent',
12
- aiProfileProvider: 'OpenAI',
13
- aiProfileModel: 'Codex',
14
- aiProfileSurfaceType: 'coding_tool',
15
- });
16
- expect(headers).toEqual({
17
- [AI_PROFILE_BOOTSTRAP_HEADER_NAMES.aiProfileName]: 'Automation Codex',
18
- [AI_PROFILE_BOOTSTRAP_HEADER_NAMES.aiProfileToken]: 'tfp_automation_codex',
19
- [AI_PROFILE_BOOTSTRAP_HEADER_NAMES.aiProfileIcon]: 'Code2',
20
- [AI_PROFILE_BOOTSTRAP_HEADER_NAMES.aiProfileColor]: '#10a37f',
21
- [AI_PROFILE_BOOTSTRAP_HEADER_NAMES.aiProfileDescription]: 'OpenAI Codex coding agent connected through MCP.',
22
- [AI_PROFILE_BOOTSTRAP_HEADER_NAMES.aiProfileRole]: 'Coding Agent',
23
- [AI_PROFILE_BOOTSTRAP_HEADER_NAMES.aiProfileProvider]: 'OpenAI',
24
- [AI_PROFILE_BOOTSTRAP_HEADER_NAMES.aiProfileModel]: 'Codex',
25
- [AI_PROFILE_BOOTSTRAP_HEADER_NAMES.aiProfileSurfaceType]: 'coding_tool',
26
- });
27
- expect(parseAiProfileBootstrapHeaders(headers)).toEqual({
28
- aiProfileName: 'Automation Codex',
29
- aiProfileToken: 'tfp_automation_codex',
30
- aiProfileIcon: 'Code2',
31
- aiProfileColor: '#10a37f',
32
- aiProfileDescription: 'OpenAI Codex coding agent connected through MCP.',
33
- aiProfileRole: 'Coding Agent',
34
- aiProfileProvider: 'OpenAI',
35
- aiProfileModel: 'Codex',
36
- aiProfileSurfaceType: 'coding_tool',
37
- });
38
- });
39
- it('builds resolve_profile input from bootstrap metadata', () => {
40
- expect(buildResolveAiProfileInputFromBootstrap('workspace-1', {
41
- aiProfileName: 'Automation Codex',
42
- aiProfileToken: 'tfp_automation_codex',
43
- aiProfileIcon: 'Code2',
44
- aiProfileColor: '#10a37f',
45
- aiProfileDescription: 'OpenAI Codex coding agent connected through MCP.',
46
- aiProfileRole: 'Coding Agent',
47
- aiProfileProvider: 'OpenAI',
48
- aiProfileModel: 'Codex',
49
- aiProfileSurfaceType: 'coding_tool',
50
- })).toEqual({
51
- workspaceId: 'workspace-1',
52
- name: 'Automation Codex',
53
- profileToken: 'tfp_automation_codex',
54
- icon: 'Code2',
55
- color: '#10a37f',
56
- description: 'OpenAI Codex coding agent connected through MCP.',
57
- role: 'Coding Agent',
58
- provider: 'OpenAI',
59
- model: 'Codex',
60
- surfaceType: 'coding_tool',
61
- });
62
- });
63
- it('returns null resolve input when no bootstrap name is present', () => {
64
- expect(buildResolveAiProfileInputFromBootstrap('workspace-1', {
65
- aiProfileToken: 'tfp_automation_codex',
66
- })).toBeNull();
67
- });
68
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,67 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import fs from 'fs';
3
- import os from 'os';
4
- import path from 'path';
5
- import { TaskforceCore } from '../core/Taskforce';
6
- import { createCanonicalAssetHelpers } from './canonicalAssetHelpers';
7
- function makeCore() {
8
- const projectRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'taskforce-mcp-canonical-assets-'));
9
- const core = new TaskforceCore({
10
- projectRoot,
11
- storagePath: path.join(projectRoot, '.taskforce')
12
- });
13
- return {
14
- projectRoot,
15
- core,
16
- cleanup: () => fs.rmSync(projectRoot, { recursive: true, force: true })
17
- };
18
- }
19
- describe('MCP canonical asset helpers', () => {
20
- it('uploads canonical attachments to object storage before recording durable cloud metadata', async () => {
21
- const { projectRoot, core, cleanup } = makeCore();
22
- try {
23
- core.createWorkspace({ workspaceId: 'workspace-1', name: 'Workspace 1' });
24
- const task = core.createTask({ title: 'Object-backed attachment' }, { workspaceId: 'workspace-1' });
25
- const relativePath = '.taskforce/workspaces/workspace-1/assets/documents/asset-test-note.md';
26
- const absolutePath = path.join(projectRoot, relativePath);
27
- fs.mkdirSync(path.dirname(absolutePath), { recursive: true });
28
- fs.writeFileSync(absolutePath, '# Stored in object storage\n', 'utf8');
29
- const putObject = vi.fn(async () => { });
30
- const helpers = createCanonicalAssetHelpers({
31
- activeWorkspaceId: 'workspace-1',
32
- projectRoot,
33
- basePath: core.getPaths().basePath,
34
- workspaceAssetStore: core.getWorkspaceAssetStore(),
35
- objectStorageClient: {
36
- getObject: vi.fn(async () => null),
37
- putObject,
38
- },
39
- sanitizeFilenameForPath: (value, fallback = 'file.txt') => String(value || fallback).trim() || fallback,
40
- sanitizeDisplayName: (value, fallback) => String(value || fallback).trim() || fallback,
41
- toPosixPath: (value) => value.replace(/\\/g, '/'),
42
- inferMimeTypeFromPath: (value) => value.endsWith('.md') ? 'text/markdown' : 'application/octet-stream',
43
- inferAssetKind: (value, mimeType) => (value.endsWith('.md') || mimeType === 'text/markdown' ? 'document' : 'file'),
44
- buildCanonicalWorkspaceAssetRelativePath: () => ({
45
- assetId: 'asset-test-note',
46
- relativePath: 'workspaces/workspace-1/assets/documents/asset-test-note.md'
47
- })
48
- });
49
- const asset = await helpers.ensureCanonicalTaskAttachment(relativePath, task.id, 'note.md', '2026-04-27T01:00:00.000Z', 'attachment', { originalFilename: 'note.md', logicalName: 'note.md' });
50
- expect(putObject).toHaveBeenCalledWith('workspaces/workspace-1/assets/documents/asset-test-note.md', Buffer.from('# Stored in object storage\n', 'utf8'), 'text/markdown');
51
- expect(asset?.storageProvider).toBe('r2');
52
- expect(core.getWorkspaceAssetStore().get(asset.assetId, 'workspace-1')?.storageProvider).toBe('r2');
53
- expect(core.getWorkspaceAssetStore().listLinksForTask(task.id, 'workspace-1')).toEqual(expect.arrayContaining([
54
- expect.objectContaining({
55
- assetId: asset?.assetId,
56
- targetType: 'task',
57
- role: 'attachment',
58
- deletedAt: null,
59
- })
60
- ]));
61
- }
62
- finally {
63
- core.close();
64
- cleanup();
65
- }
66
- });
67
- });
@@ -1 +0,0 @@
1
- export {};