@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,63 +0,0 @@
1
- import { afterEach, describe, expect, it, vi } from 'vitest';
2
- import { ACCOUNT_PROFILE_SUMMARY_PATH, invalidateAccountProfileSummaryCache, loadAccountProfileSummaryCached } from './accountProfileSummaryCache';
3
- describe('accountProfileSummaryCache', () => {
4
- afterEach(() => {
5
- vi.restoreAllMocks();
6
- vi.useRealTimers();
7
- invalidateAccountProfileSummaryCache(ACCOUNT_PROFILE_SUMMARY_PATH, { identityKey: 'user-a' });
8
- invalidateAccountProfileSummaryCache(ACCOUNT_PROFILE_SUMMARY_PATH, { identityKey: 'user-b' });
9
- });
10
- it('keeps account summaries isolated per authenticated user', async () => {
11
- const fetchMock = vi.fn()
12
- .mockResolvedValueOnce({
13
- ok: true,
14
- json: async () => ({ planId: 'team-5', planVersionId: 'team-5-v1' })
15
- })
16
- .mockResolvedValueOnce({
17
- ok: true,
18
- json: async () => ({ planId: 'starter', planVersionId: 'starter-v1' })
19
- });
20
- vi.stubGlobal('fetch', fetchMock);
21
- const first = await loadAccountProfileSummaryCached(ACCOUNT_PROFILE_SUMMARY_PATH, { identityKey: 'user-a' });
22
- const second = await loadAccountProfileSummaryCached(ACCOUNT_PROFILE_SUMMARY_PATH, { identityKey: 'user-b' });
23
- expect(first?.planId).toBe('team-5');
24
- expect(second?.planId).toBe('starter');
25
- expect(fetchMock).toHaveBeenCalledTimes(2);
26
- expect(fetchMock).toHaveBeenNthCalledWith(1, ACCOUNT_PROFILE_SUMMARY_PATH, expect.any(Object));
27
- expect(fetchMock).toHaveBeenNthCalledWith(2, ACCOUNT_PROFILE_SUMMARY_PATH, expect.any(Object));
28
- });
29
- it('reuses the cached summary inside the cache window', async () => {
30
- vi.useFakeTimers();
31
- const fetchMock = vi.fn().mockResolvedValue({
32
- ok: true,
33
- json: async () => ({ planId: 'team-5', planVersionId: 'team-5-v1' })
34
- });
35
- vi.stubGlobal('fetch', fetchMock);
36
- const first = await loadAccountProfileSummaryCached(ACCOUNT_PROFILE_SUMMARY_PATH, { identityKey: 'user-a' });
37
- vi.advanceTimersByTime(30_000);
38
- const second = await loadAccountProfileSummaryCached(ACCOUNT_PROFILE_SUMMARY_PATH, { identityKey: 'user-a' });
39
- expect(first?.planId).toBe('team-5');
40
- expect(second?.planId).toBe('team-5');
41
- expect(fetchMock).toHaveBeenCalledTimes(1);
42
- });
43
- it('returns the last successful summary when a forced refresh fails', async () => {
44
- const fetchMock = vi.fn()
45
- .mockResolvedValueOnce({
46
- ok: true,
47
- json: async () => ({ planId: 'team-5', planVersionId: 'team-5-v1', teamManagementAllowed: true })
48
- })
49
- .mockResolvedValueOnce({
50
- ok: false,
51
- json: async () => ({ error: 'Stripe unavailable' })
52
- });
53
- vi.stubGlobal('fetch', fetchMock);
54
- const warm = await loadAccountProfileSummaryCached(ACCOUNT_PROFILE_SUMMARY_PATH, { identityKey: 'user-a' });
55
- const refreshed = await loadAccountProfileSummaryCached(ACCOUNT_PROFILE_SUMMARY_PATH, {
56
- identityKey: 'user-a',
57
- force: true
58
- });
59
- expect(warm?.planId).toBe('team-5');
60
- expect(refreshed).toEqual(warm);
61
- expect(fetchMock).toHaveBeenCalledTimes(2);
62
- });
63
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,108 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import { canOpenAnnotatedAttachment, dispatchOpenAnnotatedAttachment, resolveAnnotatedAttachmentDetail } from './annotatedAttachments';
3
- describe('annotatedAttachments helpers', () => {
4
- it('only allows editable image formats for annotated attachments', () => {
5
- expect(canOpenAnnotatedAttachment({
6
- path: '/api/taskforce/context/image.png',
7
- assetId: 'asset-image',
8
- })).toBe(true);
9
- expect(canOpenAnnotatedAttachment({
10
- path: '/api/taskforce/context/animated.gif',
11
- assetId: 'asset-gif',
12
- })).toBe(false);
13
- });
14
- it('dispatches annotated attachment events with canonical detail', () => {
15
- const dispatchSpy = vi.spyOn(window, 'dispatchEvent').mockReturnValue(false);
16
- const handled = dispatchOpenAnnotatedAttachment({
17
- path: '/api/taskforce/context/workspaces%2Fworkspace-1%2Fassets%2Fimages%2Fasset-image-1-ui.png',
18
- assetId: 'asset-image-1',
19
- referenceLabel: 'I-9',
20
- taskId: 'task-1',
21
- displayName: 'UI Screenshot',
22
- originalFilename: 'ui.png',
23
- }, { taskReferenceLabel: 'T-101' });
24
- expect(handled).toBe(true);
25
- expect(dispatchSpy).toHaveBeenCalledWith(expect.objectContaining({
26
- type: 'taskforce:open-annotated-attachment',
27
- detail: expect.objectContaining({
28
- taskId: 'task-1',
29
- taskReferenceLabel: 'T-101',
30
- assetId: 'asset-image-1',
31
- imageReferenceLabel: 'I-9',
32
- displayName: 'UI Screenshot',
33
- })
34
- }));
35
- dispatchSpy.mockRestore();
36
- });
37
- it('dispatches canonical image detail without requiring a task id', () => {
38
- const dispatchSpy = vi.spyOn(window, 'dispatchEvent').mockReturnValue(false);
39
- const handled = dispatchOpenAnnotatedAttachment({
40
- path: '/api/taskforce/context/workspaces%2Fworkspace-1%2Fassets%2Fimages%2Fasset-image-2-ui.png',
41
- assetId: 'asset-image-2',
42
- referenceLabel: 'I-12',
43
- displayName: 'Standalone Screenshot',
44
- originalFilename: 'standalone.png',
45
- });
46
- expect(handled).toBe(true);
47
- expect(dispatchSpy).toHaveBeenCalledWith(expect.objectContaining({
48
- type: 'taskforce:open-annotated-attachment',
49
- detail: {
50
- assetId: 'asset-image-2',
51
- imageReferenceLabel: 'I-12',
52
- path: '/api/taskforce/context/workspaces%2Fworkspace-1%2Fassets%2Fimages%2Fasset-image-2-ui.png',
53
- displayName: 'Standalone Screenshot',
54
- }
55
- }));
56
- dispatchSpy.mockRestore();
57
- });
58
- it('derives the image reference label from the reference number when dispatching', () => {
59
- const dispatchSpy = vi.spyOn(window, 'dispatchEvent').mockReturnValue(false);
60
- const handled = dispatchOpenAnnotatedAttachment({
61
- path: '/api/taskforce/context/workspaces%2Fworkspace-1%2Fassets%2Fimages%2Fasset-image-3-ui.png',
62
- assetId: 'asset-image-3',
63
- referenceNumber: 22,
64
- displayName: 'Derived reference screenshot',
65
- originalFilename: 'derived.png',
66
- });
67
- expect(handled).toBe(true);
68
- expect(dispatchSpy).toHaveBeenCalledWith(expect.objectContaining({
69
- detail: expect.objectContaining({
70
- assetId: 'asset-image-3',
71
- imageReferenceLabel: 'I-22',
72
- })
73
- }));
74
- dispatchSpy.mockRestore();
75
- });
76
- it('resolves a missing annotated attachment reference label from the task', () => {
77
- expect(resolveAnnotatedAttachmentDetail({
78
- taskId: 'task-1',
79
- assetId: 'asset-image-1',
80
- path: '/api/taskforce/context/workspaces%2Fworkspace-1%2Fassets%2Fimages%2Fasset-image-1-ui.png',
81
- displayName: 'UI Screenshot',
82
- }, [{
83
- id: 'task-1',
84
- referenceNumber: 101,
85
- referenceLabel: 'T-101',
86
- }])).toEqual({
87
- taskId: 'task-1',
88
- taskReferenceLabel: 'T-101',
89
- assetId: 'asset-image-1',
90
- imageReferenceLabel: undefined,
91
- path: '/api/taskforce/context/workspaces%2Fworkspace-1%2Fassets%2Fimages%2Fasset-image-1-ui.png',
92
- displayName: 'UI Screenshot',
93
- });
94
- });
95
- it('resolves canonical image detail without requiring task context', () => {
96
- expect(resolveAnnotatedAttachmentDetail({
97
- assetId: 'asset-image-2',
98
- imageReferenceLabel: 'I-12',
99
- path: '/api/taskforce/context/workspaces%2Fworkspace-1%2Fassets%2Fimages%2Fasset-image-2-ui.png',
100
- displayName: 'Standalone Screenshot',
101
- }, [])).toEqual({
102
- assetId: 'asset-image-2',
103
- imageReferenceLabel: 'I-12',
104
- path: '/api/taskforce/context/workspaces%2Fworkspace-1%2Fassets%2Fimages%2Fasset-image-2-ui.png',
105
- displayName: 'Standalone Screenshot',
106
- });
107
- });
108
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,25 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { mergeAssigneeOptions } from './assignees';
3
- describe('mergeAssigneeOptions', () => {
4
- it('keeps one unassigned option and filters archived AI profile options', () => {
5
- expect(mergeAssigneeOptions([
6
- { value: 'unassigned', label: 'Unassigned', icon: 'HelpCircle', color: '#999', kind: 'unassigned' },
7
- { value: 'ai-profile-retired', label: 'Retired Agent', icon: 'Bot', color: '#8b5cf6', kind: 'agent', archivedAt: '2026-04-24T15:28:13.577Z' },
8
- { value: 'ai-profile-codex', label: 'Codex', icon: 'Bot', color: '#8b5cf6', kind: 'agent' },
9
- ])).toEqual([
10
- { value: 'unassigned', label: 'Unassigned', icon: 'HelpCircle', color: 'var(--text-secondary)', kind: 'unassigned' },
11
- {
12
- value: 'ai-profile-codex',
13
- label: 'Codex',
14
- icon: 'Bot',
15
- color: '#8b5cf6',
16
- kind: 'agent',
17
- avatarUrl: null,
18
- username: null,
19
- archivedAt: null,
20
- createdAt: null,
21
- updatedAt: null,
22
- },
23
- ]);
24
- });
25
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,40 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { prepareAvatarUploadFile } from './avatarUpload';
3
- describe('prepareAvatarUploadFile', () => {
4
- it('optimizes oversized jpeg uploads down under the limit', async () => {
5
- const file = new File([new Uint8Array(8)], 'portrait.jpg', {
6
- type: 'image/jpeg',
7
- lastModified: 123
8
- });
9
- Object.defineProperty(file, 'size', { configurable: true, value: 8_000_000 });
10
- let renderCallCount = 0;
11
- const prepared = await prepareAvatarUploadFile(file, { maxBytes: 5 * 1024 * 1024 }, {
12
- loadImage: async () => ({
13
- width: 3200,
14
- height: 2400,
15
- source: {}
16
- }),
17
- renderToBlob: async ({ type, width }) => {
18
- renderCallCount += 1;
19
- const bytes = renderCallCount === 1 ? 6_000_000 : 4_000_000;
20
- return new Blob([new Uint8Array(bytes)], { type: type || (width < 3200 ? 'image/webp' : 'image/jpeg') });
21
- }
22
- });
23
- expect(prepared.optimized).toBe(true);
24
- expect(prepared.exceededLimit).toBe(false);
25
- expect(prepared.file.size).toBe(4_000_000);
26
- expect(['image/jpeg', 'image/webp']).toContain(prepared.file.type);
27
- expect(prepared.file.name).toMatch(/^portrait\.(jpg|webp)$/);
28
- });
29
- it('keeps oversized gif uploads rejected because they are not resized', async () => {
30
- const file = new File([new Uint8Array(8)], 'animated.gif', {
31
- type: 'image/gif',
32
- lastModified: 123
33
- });
34
- Object.defineProperty(file, 'size', { configurable: true, value: 8_000_000 });
35
- const prepared = await prepareAvatarUploadFile(file, { maxBytes: 5 * 1024 * 1024 });
36
- expect(prepared.optimized).toBe(false);
37
- expect(prepared.exceededLimit).toBe(true);
38
- expect(prepared.file).toBe(file);
39
- });
40
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,24 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { inferCanonicalAssetKind, isValidCanonicalDocumentAsset, normalizeCanonicalAssetKind } from './canonicalAssetKind';
3
- describe('canonicalAssetKind', () => {
4
- it('treats markdown as canonical documents', () => {
5
- expect(inferCanonicalAssetKind('plan.md', 'text/markdown')).toBe('document');
6
- expect(inferCanonicalAssetKind('plan.markdown', 'application/octet-stream')).toBe('document');
7
- expect(isValidCanonicalDocumentAsset({ kind: 'document', originalFilename: 'plan.md', mimeType: 'text/plain' })).toBe(true);
8
- });
9
- it('does not treat non-markdown files in document folders as canonical documents', () => {
10
- expect(inferCanonicalAssetKind('workspaces/default/assets/documents/asset-doc-inline-missing-2-spec.pdf', 'application/pdf')).toBe('file');
11
- expect(normalizeCanonicalAssetKind({
12
- kind: 'document',
13
- storageKey: 'workspaces/default/assets/documents/asset-sync-hello.txt',
14
- originalFilename: 'hello.txt',
15
- mimeType: 'text/plain'
16
- })).toBe('file');
17
- expect(isValidCanonicalDocumentAsset({
18
- kind: 'document',
19
- storageKey: 'workspaces/default/assets/documents/asset-sync-hello.txt',
20
- originalFilename: 'hello.txt',
21
- mimeType: 'text/plain'
22
- })).toBe(false);
23
- });
24
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,30 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { runCoalescedRefresh } from './coalescedRefresh';
3
- describe('runCoalescedRefresh', () => {
4
- it('coalesces overlapping refresh triggers into one follow-up run', async () => {
5
- const inFlightRef = { current: false };
6
- const pendingRef = { current: false };
7
- const releaseQueue = [];
8
- let refreshCalls = 0;
9
- const refresh = async () => {
10
- refreshCalls += 1;
11
- await new Promise((resolve) => {
12
- releaseQueue.push(resolve);
13
- });
14
- };
15
- const firstRun = runCoalescedRefresh(inFlightRef, pendingRef, refresh);
16
- expect(refreshCalls).toBe(1);
17
- await runCoalescedRefresh(inFlightRef, pendingRef, refresh);
18
- expect(refreshCalls).toBe(1);
19
- expect(pendingRef.current).toBe(true);
20
- releaseQueue.shift()?.();
21
- await Promise.resolve();
22
- await Promise.resolve();
23
- expect(refreshCalls).toBe(2);
24
- releaseQueue.shift()?.();
25
- await firstRun;
26
- expect(refreshCalls).toBe(2);
27
- expect(inFlightRef.current).toBe(false);
28
- expect(pendingRef.current).toBe(false);
29
- });
30
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,41 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { AVAILABLE_ICONS, IconMap, STATUS_DEFINITIONS, TypeMeta } from './constants';
3
- import { DEFAULT_CONFIG } from '../types';
4
- function collectIcons(items) {
5
- return items
6
- .map((item) => item.icon)
7
- .filter((icon) => typeof icon === 'string' && icon.length > 0);
8
- }
9
- describe('icon registry coverage', () => {
10
- it('resolves all system/default icon names through IconMap', () => {
11
- const systemIconNames = new Set([
12
- ...AVAILABLE_ICONS,
13
- ...Object.values(TypeMeta).map((meta) => meta.icon),
14
- ...collectIcons(DEFAULT_CONFIG.categories),
15
- ...collectIcons(DEFAULT_CONFIG.priorities),
16
- ...collectIcons(DEFAULT_CONFIG.approaches),
17
- ...collectIcons(STATUS_DEFINITIONS),
18
- // Schedule/hierarchy/assignee columns and form defaults used in the app.
19
- 'Calendar',
20
- 'Gauge',
21
- 'Bot',
22
- 'User',
23
- 'Circle',
24
- 'Inbox',
25
- 'Layers',
26
- 'Palette',
27
- 'Server',
28
- 'HelpCircle',
29
- 'Folder',
30
- // Environment templates
31
- 'Wind',
32
- 'Github',
33
- // Requested additions
34
- 'CircleQuestionMark',
35
- 'TriangleAlert'
36
- ]);
37
- for (const iconName of systemIconNames) {
38
- expect(IconMap[iconName], `Missing IconMap entry for "${iconName}"`).toBeTruthy();
39
- }
40
- });
41
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,183 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { parsePlan, flattenSelected } from './planParser';
3
- // ─── parsePlan ───────────────────────────────────────────────────────────────
4
- describe('parsePlan', () => {
5
- it('returns empty array for empty content', () => {
6
- expect(parsePlan('')).toEqual([]);
7
- expect(parsePlan(' \n\n ')).toEqual([]);
8
- });
9
- it('parses H2 headings as top-level root tasks', () => {
10
- const result = parsePlan('## Phase 1\n## Phase 2');
11
- expect(result).toHaveLength(2);
12
- expect(result[0].title).toBe('Phase 1');
13
- expect(result[1].title).toBe('Phase 2');
14
- expect(result[0].depth).toBe(0);
15
- });
16
- it('parses H3 headings as children of the preceding H2', () => {
17
- const md = `## Phase 1\n### Setup\n### Config`;
18
- const result = parsePlan(md);
19
- expect(result).toHaveLength(1);
20
- expect(result[0].children).toHaveLength(2);
21
- expect(result[0].children[0].title).toBe('Setup');
22
- expect(result[0].children[0].depth).toBe(1);
23
- });
24
- it('parses dash list items as children of current heading', () => {
25
- const md = `## Phase 1\n- Task A\n- Task B`;
26
- const result = parsePlan(md);
27
- expect(result[0].children).toHaveLength(2);
28
- expect(result[0].children[0].title).toBe('Task A');
29
- });
30
- it('parses asterisk list items', () => {
31
- const md = `## Phase 1\n* Task A\n* Task B`;
32
- const result = parsePlan(md);
33
- expect(result[0].children).toHaveLength(2);
34
- });
35
- it('parses numbered list items', () => {
36
- const md = `## Phase 1\n1. Task A\n2. Task B`;
37
- const result = parsePlan(md);
38
- expect(result[0].children).toHaveLength(2);
39
- expect(result[0].children[0].title).toBe('Task A');
40
- });
41
- it('nests list items under H3 when H3 is present', () => {
42
- const md = `## Phase 1\n### API\n- Route A\n- Route B\n### UI\n- Component X`;
43
- const result = parsePlan(md);
44
- const phase = result[0];
45
- expect(phase.children).toHaveLength(2); // API, UI
46
- expect(phase.children[0].children).toHaveLength(2); // Route A, Route B
47
- expect(phase.children[1].children).toHaveLength(1); // Component X
48
- });
49
- it('all nodes start selected by default', () => {
50
- const md = `## Phase 1\n### Step\n- Item`;
51
- const result = parsePlan(md);
52
- expect(result[0].selected).toBe(true);
53
- expect(result[0].children[0].selected).toBe(true);
54
- expect(result[0].children[0].children[0].selected).toBe(true);
55
- });
56
- it('generates stable idempotency keys', () => {
57
- const md = `## Phase 1\n- Task A`;
58
- const r1 = parsePlan(md);
59
- const r2 = parsePlan(md);
60
- expect(r1[0].idempotencyKey).toBe(r2[0].idempotencyKey);
61
- expect(r1[0].children[0].idempotencyKey).toBe(r2[0].children[0].idempotencyKey);
62
- });
63
- it('sibling tasks have different idempotency keys', () => {
64
- const md = `## Phase 1\n- Task A\n- Task B`;
65
- const result = parsePlan(md);
66
- const keys = result[0].children.map((c) => c.idempotencyKey);
67
- expect(new Set(keys).size).toBe(keys.length);
68
- });
69
- });
70
- // ─── Type inference ──────────────────────────────────────────────────────────
71
- describe('parsePlan — type inference', () => {
72
- function typeOf(title) {
73
- return parsePlan(`## ${title}`)[0].type;
74
- }
75
- it('infers "issue" for fix/bug keywords', () => {
76
- expect(typeOf('Fix login bug')).toBe('issue');
77
- expect(typeOf('Bug: broken redirect')).toBe('issue');
78
- expect(typeOf('Hotfix for session issue')).toBe('issue');
79
- });
80
- it('defaults refactor/cleanup work to "task"', () => {
81
- expect(typeOf('Refactor auth module')).toBe('task');
82
- expect(typeOf('Clean up legacy routes')).toBe('task');
83
- });
84
- it('infers "deliverable" for docs keywords', () => {
85
- expect(typeOf('Update README')).toBe('deliverable');
86
- expect(typeOf('Write docs for API')).toBe('deliverable');
87
- });
88
- it('defaults to "task" for setup/config/deploy keywords', () => {
89
- expect(typeOf('Setup CI pipeline')).toBe('task');
90
- expect(typeOf('Config environment')).toBe('task');
91
- expect(typeOf('Deploy infrastructure')).toBe('task');
92
- });
93
- it('defaults to "task" for unrecognised titles', () => {
94
- expect(typeOf('Add user dashboard')).toBe('task');
95
- expect(typeOf('Phase 1 — Core Module')).toBe('task');
96
- });
97
- });
98
- // ─── Priority inference ──────────────────────────────────────────────────────
99
- describe('parsePlan — priority inference', () => {
100
- function priorityOf(title) {
101
- return parsePlan(`## ${title}`)[0].priority;
102
- }
103
- it('maps "critical" / "blocker" / "p0" to the highest 3-level priority', () => {
104
- expect(priorityOf('Critical: auth bypass')).toBe(3);
105
- expect(priorityOf('Blocker — build fails')).toBe(3);
106
- expect(priorityOf('P0 fix needed')).toBe(3);
107
- });
108
- it('infers priority 3 (High) for "high" / "important"', () => {
109
- expect(priorityOf('High priority task')).toBe(3);
110
- expect(priorityOf('Important migration')).toBe(3);
111
- });
112
- it('infers priority 1 (Low) for "low" / "minor" / "nice-to-have"', () => {
113
- expect(priorityOf('Low priority cleanup')).toBe(1);
114
- expect(priorityOf('Minor styling tweak')).toBe(1);
115
- expect(priorityOf('Nice to have feature')).toBe(1);
116
- });
117
- it('defaults to priority 2 (Medium) for unrecognised titles', () => {
118
- expect(priorityOf('Add user dashboard')).toBe(2);
119
- });
120
- });
121
- // ─── flattenSelected ─────────────────────────────────────────────────────────
122
- describe('flattenSelected', () => {
123
- it('returns all nodes when all selected', () => {
124
- const md = `## Phase\n### Step\n- Item`;
125
- const tasks = parsePlan(md);
126
- const flat = flattenSelected(tasks);
127
- expect(flat.length).toBe(3);
128
- });
129
- it('excludes deselected nodes and their children', () => {
130
- const md = `## Phase\n### Step\n- Item`;
131
- const tasks = parsePlan(md);
132
- // Deselect the H3 — should exclude it and its children
133
- tasks[0].children[0].selected = false;
134
- const flat = flattenSelected(tasks);
135
- // Should only have the H2 root
136
- expect(flat.length).toBe(1);
137
- expect(flat[0].title).toBe('Phase');
138
- });
139
- it('returns empty array when root is deselected', () => {
140
- const md = `## Phase\n- Item`;
141
- const tasks = parsePlan(md);
142
- tasks[0].selected = false;
143
- const flat = flattenSelected(tasks);
144
- expect(flat).toHaveLength(0);
145
- });
146
- it('preserves order (root before children)', () => {
147
- const md = `## Phase 1\n- Task A\n- Task B\n## Phase 2\n- Task C`;
148
- const tasks = parsePlan(md);
149
- const flat = flattenSelected(tasks);
150
- expect(flat[0].title).toBe('Phase 1');
151
- expect(flat[1].title).toBe('Task A');
152
- expect(flat[2].title).toBe('Task B');
153
- expect(flat[3].title).toBe('Phase 2');
154
- expect(flat[4].title).toBe('Task C');
155
- });
156
- });
157
- // ─── Edge cases ──────────────────────────────────────────────────────────────
158
- describe('parsePlan — edge cases', () => {
159
- it('handles H3 without preceding H2 as root node', () => {
160
- const result = parsePlan('### Orphan step');
161
- expect(result).toHaveLength(1);
162
- expect(result[0].title).toBe('Orphan step');
163
- });
164
- it('handles documents with no headings (only paragraphs)', () => {
165
- const result = parsePlan('This is just a paragraph.\nAnd another one.');
166
- // No actionable tasks parseable
167
- expect(result).toHaveLength(0);
168
- });
169
- it('trims trailing/leading whitespace from titles', () => {
170
- const result = parsePlan('## Phase 1 ');
171
- expect(result[0].title).toBe('Phase 1');
172
- });
173
- it('handles mixed list markers in the same section', () => {
174
- const md = `## Phase\n- Task A\n* Task B\n1. Task C`;
175
- const result = parsePlan(md);
176
- expect(result[0].children).toHaveLength(3);
177
- });
178
- it('ignores horizontal rules and other non-task lines', () => {
179
- const md = `## Phase 1\n---\n- Task A`;
180
- const result = parsePlan(md);
181
- expect(result[0].children).toHaveLength(1);
182
- });
183
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,17 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { formatInitiativeReference, resolveInitiativeReference, } from './planningReferences';
3
- describe('planningReferences', () => {
4
- const initiatives = [
5
- { id: 'initiative-1', referenceNumber: 1, title: 'Alpha' },
6
- { id: 'initiative-2', referenceNumber: 2, title: 'Beta' },
7
- ];
8
- it('resolves initiative references by id and formatted label', () => {
9
- expect(resolveInitiativeReference(initiatives, 'initiative-1')?.id).toBe('initiative-1');
10
- expect(resolveInitiativeReference(initiatives, formatInitiativeReference(initiatives[1]))?.id).toBe('initiative-2');
11
- });
12
- it('returns null for empty or invalid initiative references', () => {
13
- expect(resolveInitiativeReference(initiatives, '')).toBeNull();
14
- expect(resolveInitiativeReference(initiatives, 'IN-999')).toBeNull();
15
- expect(resolveInitiativeReference(initiatives, 'not-a-reference')).toBeNull();
16
- });
17
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,19 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { buildSupportMailtoHref, TASKFORCE_SUPPORT_EMAIL } from './supportContact';
3
- describe('supportContact', () => {
4
- it('builds a support mailto link with useful workspace context', () => {
5
- const href = buildSupportMailtoHref({
6
- workspaceName: 'Launch Room',
7
- workspaceId: 'workspace-123',
8
- accountLabel: 'owner@example.com',
9
- runtimeMode: 'cloud'
10
- });
11
- expect(href.startsWith(`mailto:${TASKFORCE_SUPPORT_EMAIL}?`)).toBe(true);
12
- const query = new URLSearchParams(href.split('?')[1]);
13
- expect(query.get('subject')).toBe('Taskforce support request');
14
- expect(query.get('body')).toContain('Workspace: Launch Room');
15
- expect(query.get('body')).toContain('Workspace ID: workspace-123');
16
- expect(query.get('body')).toContain('Account: owner@example.com');
17
- expect(query.get('body')).toContain('Runtime: cloud');
18
- });
19
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,23 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { normalizeSyncEventDetails, stableStringifySyncEventDetails } from './syncEventDetails';
3
- describe('syncEventDetails', () => {
4
- it('normalizes non-JSON sync event details into a safe record', () => {
5
- const circular = {
6
- bigint: 4n,
7
- map: new Map([['assetId', 'asset-1']]),
8
- set: new Set(['doc-1', 'doc-2'])
9
- };
10
- circular.self = circular;
11
- expect(normalizeSyncEventDetails(circular)).toEqual({
12
- bigint: '4',
13
- map: { assetId: 'asset-1' },
14
- set: ['doc-1', 'doc-2'],
15
- self: '[Circular]'
16
- });
17
- });
18
- it('returns a stable string even for malformed details', () => {
19
- const details = {};
20
- details.self = details;
21
- expect(stableStringifySyncEventDetails(details)).toContain('[Circular]');
22
- });
23
- });
@@ -1 +0,0 @@
1
- export {};