@taskforcehq/taskforce 0.3.309 → 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 (470) hide show
  1. package/README.md +89 -127
  2. package/dist/TaskforceCore.js +1 -1
  3. package/dist/components/context/ContextAttachmentManager.js +4 -3
  4. package/dist/components/features/InitiativesModule.js +1 -1
  5. package/dist/components/features/TaskSettings.js +1 -1
  6. package/dist/components/ui/DisclosureSectionHeader.d.ts +12 -0
  7. package/dist/components/ui/DisclosureSectionHeader.js +8 -0
  8. package/dist/components/views/PlanComparisonPage.js +1 -1
  9. package/dist/components/views/StandaloneLayout.js +18 -4
  10. package/dist/components/views/panels/PlanningDrawer.js +2 -1
  11. package/dist/components/views/standalone/modals/AccountHubModal.js +1 -1
  12. package/dist/components/views/standalone/modals/HelpModal.d.ts +3 -1
  13. package/dist/components/views/standalone/modals/HelpModal.js +17 -2
  14. package/dist/core/PlanEntitlementService.d.ts +2 -0
  15. package/dist/core/PlanEntitlementService.js +57 -4
  16. package/dist/hooks/useFilterSort.js +1 -1
  17. package/dist/hooks/useTaskforce.js +2 -2
  18. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +5 -2
  19. package/dist/localization/locales/en-US.js +1 -1
  20. package/dist/localization/locales/es-419.js +1 -1
  21. package/dist/localization/locales/pt-BR.js +1 -1
  22. package/dist/mcp/runtime.js +49 -14
  23. package/dist/server/routes/billing.js +0 -1
  24. package/dist/ui/assets/AgentsModule-BULqIo8e.js +1 -0
  25. package/dist/ui/assets/{AnnotatedAttachmentWorkspace-CCckzWYZ.js → AnnotatedAttachmentWorkspace-DHr4rHK9.js} +1 -1
  26. package/dist/ui/assets/ContextAttachmentManager-DoMe2OpY.js +3 -0
  27. package/dist/ui/assets/{DocumentWorkspace-BVaWPA25.js → DocumentWorkspace-DumBWhvb.js} +1 -1
  28. package/dist/ui/assets/{EntityActivityTimeline-DSj0ThaK.js → EntityActivityTimeline-sHk8Nzbq.js} +1 -1
  29. package/dist/ui/assets/{InitiativesModule-AxMkWtxH.js → InitiativesModule-3X9UNzHh.js} +1 -1
  30. package/dist/ui/assets/PlansPage-C3A3EYaV.js +1 -0
  31. package/dist/ui/assets/PlansPage-DeAzWYTb.css +1 -0
  32. package/dist/ui/assets/{TaskContextUpload-Dw4rTF4i.js → TaskContextUpload-C8G7pWkX.js} +1 -1
  33. package/dist/ui/assets/{TaskSettings-f2ga42_V.js → TaskSettings-DM1o9Wla.js} +2 -2
  34. package/dist/ui/assets/{WorkflowsModule-E4UL3mov.js → WorkflowsModule-CW0crzvD.js} +1 -1
  35. package/dist/ui/assets/documentReferences-BZB3nMRb.js +1 -0
  36. package/dist/ui/assets/index-BWFQ9mGn.js +5 -0
  37. package/dist/ui/assets/{index-BvAbqx5Q.css → index-DcK_8tuE.css} +1 -1
  38. package/dist/ui/assets/{vendor-icons-B32hGuF2.js → vendor-icons-CLnehDTw.js} +1 -1
  39. package/dist/ui/index.html +3 -3
  40. package/dist/utils/supportContact.d.ts +9 -0
  41. package/dist/utils/supportContact.js +32 -0
  42. package/package.json +12 -4
  43. package/scripts/postinstall.js +4 -3
  44. package/dist/TaskforceCore.CategoryFallback.test.d.ts +0 -1
  45. package/dist/TaskforceCore.CategoryFallback.test.js +0 -101
  46. package/dist/TaskforceCore.filter-persistence.test.d.ts +0 -1
  47. package/dist/TaskforceCore.filter-persistence.test.js +0 -402
  48. package/dist/TaskforceCore.routing.test.d.ts +0 -1
  49. package/dist/TaskforceCore.routing.test.js +0 -311
  50. package/dist/TaskforceCore.test.d.ts +0 -1
  51. package/dist/TaskforceCore.test.js +0 -7910
  52. package/dist/TaskforceWidget.test.d.ts +0 -1
  53. package/dist/TaskforceWidget.test.js +0 -92
  54. package/dist/UnsavedChangesRelaxed.test.d.ts +0 -1
  55. package/dist/UnsavedChangesRelaxed.test.js +0 -16
  56. package/dist/__tests__/localizationCatalogs.test.d.ts +0 -1
  57. package/dist/__tests__/localizationCatalogs.test.js +0 -54
  58. package/dist/__tests__/workflowSimulation.test.d.ts +0 -1
  59. package/dist/__tests__/workflowSimulation.test.js +0 -113
  60. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.test.d.ts +0 -1
  61. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.test.js +0 -278
  62. package/dist/annotatedAttachments/payload.test.d.ts +0 -1
  63. package/dist/annotatedAttachments/payload.test.js +0 -67
  64. package/dist/compat/workspaceSyncCompat.test.d.ts +0 -1
  65. package/dist/compat/workspaceSyncCompat.test.js +0 -124
  66. package/dist/components/features/AgentsModule.test.d.ts +0 -1
  67. package/dist/components/features/AgentsModule.test.js +0 -601
  68. package/dist/components/features/AnnotatedAttachmentWorkspace.test.d.ts +0 -1
  69. package/dist/components/features/AnnotatedAttachmentWorkspace.test.js +0 -2883
  70. package/dist/components/features/DocumentWorkspace.test.d.ts +0 -1
  71. package/dist/components/features/DocumentWorkspace.test.js +0 -1439
  72. package/dist/components/features/TaskSettings.test.d.ts +0 -1
  73. package/dist/components/features/TaskSettings.test.js +0 -1674
  74. package/dist/components/features/settings/TaxonomyLibraryManager.test.d.ts +0 -1
  75. package/dist/components/features/settings/TaxonomyLibraryManager.test.js +0 -141
  76. package/dist/components/task/TaskActionHeader.test.d.ts +0 -1
  77. package/dist/components/task/TaskActionHeader.test.js +0 -91
  78. package/dist/components/task/TaskCard.test.d.ts +0 -1
  79. package/dist/components/task/TaskCard.test.js +0 -513
  80. package/dist/components/task/TaskContextUpload.test.d.ts +0 -1
  81. package/dist/components/task/TaskContextUpload.test.js +0 -506
  82. package/dist/components/task/TaskForm.test.d.ts +0 -1
  83. package/dist/components/task/TaskForm.test.js +0 -946
  84. package/dist/components/task/TaskKanban.empty-column-drop.test.d.ts +0 -1
  85. package/dist/components/task/TaskKanban.empty-column-drop.test.js +0 -66
  86. package/dist/components/task/TaskKanban.planning-drop.test.d.ts +0 -1
  87. package/dist/components/task/TaskKanban.planning-drop.test.js +0 -93
  88. package/dist/components/task/TaskKanban.test.d.ts +0 -1
  89. package/dist/components/task/TaskKanban.test.js +0 -99
  90. package/dist/components/task/TaskList.test.d.ts +0 -1
  91. package/dist/components/task/TaskList.test.js +0 -473
  92. package/dist/components/task/TaskStatusActions.test.d.ts +0 -1
  93. package/dist/components/task/TaskStatusActions.test.js +0 -54
  94. package/dist/components/task/taskKanbanDropRules.test.d.ts +0 -1
  95. package/dist/components/task/taskKanbanDropRules.test.js +0 -114
  96. package/dist/components/ui/LevelSelector.test.d.ts +0 -1
  97. package/dist/components/ui/LevelSelector.test.js +0 -55
  98. package/dist/components/ui/Markdown.test.d.ts +0 -1
  99. package/dist/components/ui/Markdown.test.js +0 -38
  100. package/dist/components/ui/MultiSelectFilter.test.d.ts +0 -1
  101. package/dist/components/ui/MultiSelectFilter.test.js +0 -74
  102. package/dist/components/ui/TaxonomyDropdown.test.d.ts +0 -1
  103. package/dist/components/ui/TaxonomyDropdown.test.js +0 -130
  104. package/dist/components/ui/TopNoticeLayer.test.d.ts +0 -1
  105. package/dist/components/ui/TopNoticeLayer.test.js +0 -25
  106. package/dist/components/views/AppShellHeader.test.d.ts +0 -1
  107. package/dist/components/views/AppShellHeader.test.js +0 -42
  108. package/dist/components/views/PlanComparisonPage.test.d.ts +0 -1
  109. package/dist/components/views/PlanComparisonPage.test.js +0 -757
  110. package/dist/components/views/PlansPage.test.d.ts +0 -1
  111. package/dist/components/views/PlansPage.test.js +0 -710
  112. package/dist/components/views/chrome/WorkspaceChromeSections.test.d.ts +0 -1
  113. package/dist/components/views/chrome/WorkspaceChromeSections.test.js +0 -54
  114. package/dist/components/views/chrome/workspaceChrome.test.d.ts +0 -1
  115. package/dist/components/views/chrome/workspaceChrome.test.js +0 -52
  116. package/dist/components/views/panels/DocumentFilterToolbar.test.d.ts +0 -1
  117. package/dist/components/views/panels/DocumentFilterToolbar.test.js +0 -19
  118. package/dist/components/views/panels/FilterToolbar.test.d.ts +0 -1
  119. package/dist/components/views/panels/FilterToolbar.test.js +0 -47
  120. package/dist/components/views/panels/PlanningDrawer.test.d.ts +0 -1
  121. package/dist/components/views/panels/PlanningDrawer.test.js +0 -529
  122. package/dist/components/views/planningScope.test.d.ts +0 -1
  123. package/dist/components/views/planningScope.test.js +0 -60
  124. package/dist/components/views/standalone/modals/AccountHubModal.test.d.ts +0 -1
  125. package/dist/components/views/standalone/modals/AccountHubModal.test.js +0 -66
  126. package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.d.ts +0 -1
  127. package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.js +0 -24
  128. package/dist/components/views/teamManagementAccess.test.d.ts +0 -1
  129. package/dist/components/views/teamManagementAccess.test.js +0 -44
  130. package/dist/config/deployment.test.d.ts +0 -1
  131. package/dist/config/deployment.test.js +0 -90
  132. package/dist/config/envSchema.test.d.ts +0 -1
  133. package/dist/config/envSchema.test.js +0 -125
  134. package/dist/core/AiProfileService.test.d.ts +0 -1
  135. package/dist/core/AiProfileService.test.js +0 -184
  136. package/dist/core/AiProfiles.test.d.ts +0 -1
  137. package/dist/core/AiProfiles.test.js +0 -1873
  138. package/dist/core/AuthTokenService.test.d.ts +0 -1
  139. package/dist/core/AuthTokenService.test.js +0 -78
  140. package/dist/core/BulkUpdateFieldsPreview.test.d.ts +0 -1
  141. package/dist/core/BulkUpdateFieldsPreview.test.js +0 -62
  142. package/dist/core/CompletedAt.test.d.ts +0 -1
  143. package/dist/core/CompletedAt.test.js +0 -44
  144. package/dist/core/CreatedBy.test.d.ts +0 -1
  145. package/dist/core/CreatedBy.test.js +0 -188
  146. package/dist/core/DeletedTaskTrash.test.d.ts +0 -1
  147. package/dist/core/DeletedTaskTrash.test.js +0 -104
  148. package/dist/core/EntitlementsPolicy.test.d.ts +0 -1
  149. package/dist/core/EntitlementsPolicy.test.js +0 -280
  150. package/dist/core/GlobalSettingsService.test.d.ts +0 -1
  151. package/dist/core/GlobalSettingsService.test.js +0 -45
  152. package/dist/core/JsonBackupRuntime.test.d.ts +0 -1
  153. package/dist/core/JsonBackupRuntime.test.js +0 -155
  154. package/dist/core/PlanFeatureCatalog.test.d.ts +0 -1
  155. package/dist/core/PlanFeatureCatalog.test.js +0 -139
  156. package/dist/core/PlanVersionPolicy.test.d.ts +0 -1
  157. package/dist/core/PlanVersionPolicy.test.js +0 -204
  158. package/dist/core/PlanningEntities.test.d.ts +0 -1
  159. package/dist/core/PlanningEntities.test.js +0 -509
  160. package/dist/core/ScheduleFields.test.d.ts +0 -1
  161. package/dist/core/ScheduleFields.test.js +0 -193
  162. package/dist/core/SetupState.test.d.ts +0 -1
  163. package/dist/core/SetupState.test.js +0 -113
  164. package/dist/core/SignupMonetizationSettings.test.d.ts +0 -1
  165. package/dist/core/SignupMonetizationSettings.test.js +0 -515
  166. package/dist/core/Stats.test.d.ts +0 -1
  167. package/dist/core/Stats.test.js +0 -36
  168. package/dist/core/SystemAdmin.test.d.ts +0 -1
  169. package/dist/core/SystemAdmin.test.js +0 -1106
  170. package/dist/core/TaskActivitySync.test.d.ts +0 -1
  171. package/dist/core/TaskActivitySync.test.js +0 -90
  172. package/dist/core/TaskAttachmentsCanonical.test.d.ts +0 -1
  173. package/dist/core/TaskAttachmentsCanonical.test.js +0 -356
  174. package/dist/core/TaskAuditTimeline.test.d.ts +0 -1
  175. package/dist/core/TaskAuditTimeline.test.js +0 -319
  176. package/dist/core/TaskTaxonomyValidation.test.d.ts +0 -1
  177. package/dist/core/TaskTaxonomyValidation.test.js +0 -440
  178. package/dist/core/Taskforce.ids.test.d.ts +0 -1
  179. package/dist/core/Taskforce.ids.test.js +0 -611
  180. package/dist/core/Taskforce.listTasksSlim.test.d.ts +0 -1
  181. package/dist/core/Taskforce.listTasksSlim.test.js +0 -91
  182. package/dist/core/Taskforce.mcpAuth.test.d.ts +0 -1
  183. package/dist/core/Taskforce.mcpAuth.test.js +0 -450
  184. package/dist/core/Taskforce.realtimeMutation.test.d.ts +0 -1
  185. package/dist/core/Taskforce.realtimeMutation.test.js +0 -131
  186. package/dist/core/UserProfileAvatarDrafts.test.d.ts +0 -1
  187. package/dist/core/UserProfileAvatarDrafts.test.js +0 -138
  188. package/dist/core/WorkspaceDelete.test.d.ts +0 -1
  189. package/dist/core/WorkspaceDelete.test.js +0 -159
  190. package/dist/core/WorkspacePermissions.test.d.ts +0 -1
  191. package/dist/core/WorkspacePermissions.test.js +0 -270
  192. package/dist/core/WorkspacePlanMode.test.d.ts +0 -1
  193. package/dist/core/WorkspacePlanMode.test.js +0 -383
  194. package/dist/core/WorkspaceSyncSettings.test.d.ts +0 -1
  195. package/dist/core/WorkspaceSyncSettings.test.js +0 -65
  196. package/dist/core/__tests__/TaskAttachmentsCanonical.test.d.ts +0 -1
  197. package/dist/core/__tests__/TaskAttachmentsCanonical.test.js +0 -212
  198. package/dist/documentReviews/DocumentReviewSessionStore.test.d.ts +0 -1
  199. package/dist/documentReviews/DocumentReviewSessionStore.test.js +0 -127
  200. package/dist/hooks/authGuardPolicy.test.d.ts +0 -1
  201. package/dist/hooks/authGuardPolicy.test.js +0 -76
  202. package/dist/hooks/bootstrapTimeouts.test.d.ts +0 -1
  203. package/dist/hooks/bootstrapTimeouts.test.js +0 -12
  204. package/dist/hooks/sync/controlPlane.test.d.ts +0 -1
  205. package/dist/hooks/sync/controlPlane.test.js +0 -121
  206. package/dist/hooks/sync/lifecyclePolicy.test.d.ts +0 -1
  207. package/dist/hooks/sync/lifecyclePolicy.test.js +0 -124
  208. package/dist/hooks/sync/orchestratorShared.test.d.ts +0 -1
  209. package/dist/hooks/sync/orchestratorShared.test.js +0 -98
  210. package/dist/hooks/sync/pullLifecycle.test.d.ts +0 -1
  211. package/dist/hooks/sync/pullLifecycle.test.js +0 -80
  212. package/dist/hooks/sync/recovery.test.d.ts +0 -1
  213. package/dist/hooks/sync/recovery.test.js +0 -292
  214. package/dist/hooks/sync/transfers.test.d.ts +0 -1
  215. package/dist/hooks/sync/transfers.test.js +0 -928
  216. package/dist/hooks/sync/useRecentSyncEvents.test.d.ts +0 -1
  217. package/dist/hooks/sync/useRecentSyncEvents.test.js +0 -124
  218. package/dist/hooks/sync/useSyncStatusActions.test.d.ts +0 -1
  219. package/dist/hooks/sync/useSyncStatusActions.test.js +0 -133
  220. package/dist/hooks/sync/useSyncStatusControls.test.d.ts +0 -1
  221. package/dist/hooks/sync/useSyncStatusControls.test.js +0 -88
  222. package/dist/hooks/useFilterSort.test.d.ts +0 -1
  223. package/dist/hooks/useFilterSort.test.js +0 -419
  224. package/dist/hooks/useRealtimeSync.test.d.ts +0 -1
  225. package/dist/hooks/useRealtimeSync.test.js +0 -311
  226. package/dist/hooks/useSyncOrchestrator.aiProfiles.test.d.ts +0 -1
  227. package/dist/hooks/useSyncOrchestrator.aiProfiles.test.js +0 -54
  228. package/dist/hooks/useSyncOrchestrator.context-assets.test.d.ts +0 -1
  229. package/dist/hooks/useSyncOrchestrator.context-assets.test.js +0 -228
  230. package/dist/hooks/useSyncOrchestrator.retry-closure.test.d.ts +0 -1
  231. package/dist/hooks/useSyncOrchestrator.retry-closure.test.js +0 -2027
  232. package/dist/hooks/useTaskData.test.d.ts +0 -1
  233. package/dist/hooks/useTaskData.test.js +0 -291
  234. package/dist/hooks/useTaskMutations.test.d.ts +0 -1
  235. package/dist/hooks/useTaskMutations.test.js +0 -256
  236. package/dist/hooks/useTaskforce.contract.test.d.ts +0 -1
  237. package/dist/hooks/useTaskforce.contract.test.js +0 -7
  238. package/dist/hooks/useTaskforce.priority-filters.test.d.ts +0 -1
  239. package/dist/hooks/useTaskforce.priority-filters.test.js +0 -28
  240. package/dist/hooks/useTaskforce.runtime-routing.test.d.ts +0 -1
  241. package/dist/hooks/useTaskforce.runtime-routing.test.js +0 -246
  242. package/dist/hooks/useTaskforce.sync-behavior.test.d.ts +0 -1
  243. package/dist/hooks/useTaskforce.sync-behavior.test.js +0 -3644
  244. package/dist/hooks/useWorkspaceSyncController.test.d.ts +0 -1
  245. package/dist/hooks/useWorkspaceSyncController.test.js +0 -192
  246. package/dist/hooks/workspace/useTaskforceApiRouting.test.d.ts +0 -1
  247. package/dist/hooks/workspace/useTaskforceApiRouting.test.js +0 -77
  248. package/dist/hooks/workspace/workspaceLocalState.test.d.ts +0 -1
  249. package/dist/hooks/workspace/workspaceLocalState.test.js +0 -59
  250. package/dist/localization/localizationCatalogs.test.d.ts +0 -1
  251. package/dist/localization/localizationCatalogs.test.js +0 -37
  252. package/dist/mcp/aiProfileBootstrap.test.d.ts +0 -1
  253. package/dist/mcp/aiProfileBootstrap.test.js +0 -68
  254. package/dist/mcp/canonicalAssetHelpers.test.d.ts +0 -1
  255. package/dist/mcp/canonicalAssetHelpers.test.js +0 -67
  256. package/dist/mcp/clientIntegrations.test.d.ts +0 -1
  257. package/dist/mcp/clientIntegrations.test.js +0 -219
  258. package/dist/mcp/optionResolution.test.d.ts +0 -1
  259. package/dist/mcp/optionResolution.test.js +0 -43
  260. package/dist/mcp/runtime.test.d.ts +0 -1
  261. package/dist/mcp/runtime.test.js +0 -5120
  262. package/dist/mcp/structuredCommentValidation.test.d.ts +0 -1
  263. package/dist/mcp/structuredCommentValidation.test.js +0 -31
  264. package/dist/mcp/structuredDocValidation.test.d.ts +0 -1
  265. package/dist/mcp/structuredDocValidation.test.js +0 -35
  266. package/dist/mcp/toolRegistry.test.d.ts +0 -1
  267. package/dist/mcp/toolRegistry.test.js +0 -34
  268. package/dist/migrations/billingSchemaParity.test.d.ts +0 -1
  269. package/dist/migrations/billingSchemaParity.test.js +0 -160
  270. package/dist/migrations/taskSchemaMigrations.test.d.ts +0 -1
  271. package/dist/migrations/taskSchemaMigrations.test.js +0 -225
  272. package/dist/qaOpen.test.d.ts +0 -1
  273. package/dist/qaOpen.test.js +0 -56
  274. package/dist/releaseVersion.test.d.ts +0 -1
  275. package/dist/releaseVersion.test.js +0 -32
  276. package/dist/runtime/appGates.test.d.ts +0 -1
  277. package/dist/runtime/appGates.test.js +0 -42
  278. package/dist/server/aiProfileAvatarAssets.test.d.ts +0 -1
  279. package/dist/server/aiProfileAvatarAssets.test.js +0 -213
  280. package/dist/server/annotatedAttachmentsRoutes.test.d.ts +0 -1
  281. package/dist/server/annotatedAttachmentsRoutes.test.js +0 -532
  282. package/dist/server/auth.test.d.ts +0 -1
  283. package/dist/server/auth.test.js +0 -131
  284. package/dist/server/buildInfo.test.d.ts +0 -1
  285. package/dist/server/buildInfo.test.js +0 -29
  286. package/dist/server/cors.test.d.ts +0 -1
  287. package/dist/server/cors.test.js +0 -77
  288. package/dist/server/documentReviewRoutes.test.d.ts +0 -1
  289. package/dist/server/documentReviewRoutes.test.js +0 -190
  290. package/dist/server/email.test.d.ts +0 -1
  291. package/dist/server/email.test.js +0 -113
  292. package/dist/server/index.cookieProxy.test.d.ts +0 -1
  293. package/dist/server/index.cookieProxy.test.js +0 -67
  294. package/dist/server/index.rateLimit.test.d.ts +0 -1
  295. package/dist/server/index.rateLimit.test.js +0 -22
  296. package/dist/server/index.test.d.ts +0 -1
  297. package/dist/server/index.test.js +0 -283
  298. package/dist/server/rateLimit.test.d.ts +0 -1
  299. package/dist/server/rateLimit.test.js +0 -107
  300. package/dist/server/realtimeSync.auth.test.d.ts +0 -1
  301. package/dist/server/realtimeSync.auth.test.js +0 -62
  302. package/dist/server/realtimeSync.replay.test.d.ts +0 -1
  303. package/dist/server/realtimeSync.replay.test.js +0 -192
  304. package/dist/server/realtimeSync.workspaceIsolation.test.d.ts +0 -1
  305. package/dist/server/realtimeSync.workspaceIsolation.test.js +0 -101
  306. package/dist/server/routes/billing.test.d.ts +0 -1
  307. package/dist/server/routes/billing.test.js +0 -3455
  308. package/dist/server/routes/shared.test.d.ts +0 -1
  309. package/dist/server/routes/shared.test.js +0 -32
  310. package/dist/server/routes/sync.integration.test.d.ts +0 -1
  311. package/dist/server/routes/sync.integration.test.js +0 -2932
  312. package/dist/server/routes/syncAuxRoutes.test.d.ts +0 -1
  313. package/dist/server/routes/syncAuxRoutes.test.js +0 -158
  314. package/dist/server/routes/syncRouteGuards.test.d.ts +0 -1
  315. package/dist/server/routes/syncRouteGuards.test.js +0 -94
  316. package/dist/server/routes.test.d.ts +0 -1
  317. package/dist/server/routes.test.js +0 -15612
  318. package/dist/server/runtimeMode.test.d.ts +0 -1
  319. package/dist/server/runtimeMode.test.js +0 -26
  320. package/dist/server/securityHeaders.test.d.ts +0 -1
  321. package/dist/server/securityHeaders.test.js +0 -70
  322. package/dist/services/templateEngine.test.d.ts +0 -1
  323. package/dist/services/templateEngine.test.js +0 -150
  324. package/dist/services/templates.test.d.ts +0 -1
  325. package/dist/services/templates.test.js +0 -45
  326. package/dist/services/workflowDocumentFixtures.test.d.ts +0 -1
  327. package/dist/services/workflowDocumentFixtures.test.js +0 -78
  328. package/dist/services/workflowExportMatrix.test.d.ts +0 -1
  329. package/dist/services/workflowExportMatrix.test.js +0 -113
  330. package/dist/services/workflowExportSnapshots.test.d.ts +0 -1
  331. package/dist/services/workflowExportSnapshots.test.js +0 -30
  332. package/dist/services/workflowGeneration.test.d.ts +0 -1
  333. package/dist/services/workflowGeneration.test.js +0 -12
  334. package/dist/services/workflowSimulation.test.d.ts +0 -1
  335. package/dist/services/workflowSimulation.test.js +0 -113
  336. package/dist/services/workflowV2Policy.test.d.ts +0 -1
  337. package/dist/services/workflowV2Policy.test.js +0 -80
  338. package/dist/shared/customTaxonomyLibrary.test.d.ts +0 -1
  339. package/dist/shared/customTaxonomyLibrary.test.js +0 -20
  340. package/dist/shared/passwordPolicy.test.d.ts +0 -1
  341. package/dist/shared/passwordPolicy.test.js +0 -34
  342. package/dist/shared/runtimeContract.test.d.ts +0 -1
  343. package/dist/shared/runtimeContract.test.js +0 -23
  344. package/dist/shared/taxonomyLibrary.test.d.ts +0 -1
  345. package/dist/shared/taxonomyLibrary.test.js +0 -26
  346. package/dist/shared/taxonomyState.test.d.ts +0 -1
  347. package/dist/shared/taxonomyState.test.js +0 -71
  348. package/dist/soak/preflight.cli.d.ts +0 -1
  349. package/dist/soak/preflight.cli.js +0 -28
  350. package/dist/soak/preflight.d.ts +0 -26
  351. package/dist/soak/preflight.js +0 -113
  352. package/dist/soak/preflight.test.d.ts +0 -1
  353. package/dist/soak/preflight.test.js +0 -39
  354. package/dist/storage/objectStorageClient.test.d.ts +0 -1
  355. package/dist/storage/objectStorageClient.test.js +0 -82
  356. package/dist/storage/objectStorageConfig.test.d.ts +0 -1
  357. package/dist/storage/objectStorageConfig.test.js +0 -50
  358. package/dist/storage/postgresAdapter.test.d.ts +0 -1
  359. package/dist/storage/postgresAdapter.test.js +0 -29
  360. package/dist/storage/workspaceAssetStore.test.d.ts +0 -1
  361. package/dist/storage/workspaceAssetStore.test.js +0 -588
  362. package/dist/sync/cloudSyncApi.test.d.ts +0 -1
  363. package/dist/sync/cloudSyncApi.test.js +0 -111
  364. package/dist/sync/collaborationSyncPayload.test.d.ts +0 -1
  365. package/dist/sync/collaborationSyncPayload.test.js +0 -125
  366. package/dist/sync/contentSyncPayload.test.d.ts +0 -1
  367. package/dist/sync/contentSyncPayload.test.js +0 -143
  368. package/dist/sync/encryptionService.test.d.ts +0 -1
  369. package/dist/sync/encryptionService.test.js +0 -52
  370. package/dist/sync/planningSyncPayload.test.d.ts +0 -1
  371. package/dist/sync/planningSyncPayload.test.js +0 -92
  372. package/dist/sync/realtimeFeature.test.d.ts +0 -1
  373. package/dist/sync/realtimeFeature.test.js +0 -30
  374. package/dist/sync/realtimeReconcile.test.d.ts +0 -1
  375. package/dist/sync/realtimeReconcile.test.js +0 -43
  376. package/dist/sync/syncApplyHandlers.test.d.ts +0 -1
  377. package/dist/sync/syncApplyHandlers.test.js +0 -626
  378. package/dist/sync/syncService.test.d.ts +0 -1
  379. package/dist/sync/syncService.test.js +0 -903
  380. package/dist/sync/taskSyncPayload.test.d.ts +0 -1
  381. package/dist/sync/taskSyncPayload.test.js +0 -54
  382. package/dist/sync/workspacePullFeed.test.d.ts +0 -1
  383. package/dist/sync/workspacePullFeed.test.js +0 -438
  384. package/dist/sync/workspaceSyncModel.test.d.ts +0 -1
  385. package/dist/sync/workspaceSyncModel.test.js +0 -1442
  386. package/dist/test/setup.d.ts +0 -1
  387. package/dist/test/setup.js +0 -15
  388. package/dist/ui/assets/AgentsModule-BS4Pi_nC.js +0 -1
  389. package/dist/ui/assets/ContextAttachmentManager-CfG_ER7C.js +0 -3
  390. package/dist/ui/assets/PlansPage-B_z-D6Nh.css +0 -1
  391. package/dist/ui/assets/PlansPage-Ndt7mYfo.js +0 -1
  392. package/dist/ui/assets/documentReferences-BOUcJm6-.js +0 -1
  393. package/dist/ui/assets/index-MAHKvFqp.js +0 -4
  394. package/dist/utils/accountProfileSummaryCache.test.d.ts +0 -1
  395. package/dist/utils/accountProfileSummaryCache.test.js +0 -63
  396. package/dist/utils/annotatedAttachments.test.d.ts +0 -1
  397. package/dist/utils/annotatedAttachments.test.js +0 -108
  398. package/dist/utils/assignees.test.d.ts +0 -1
  399. package/dist/utils/assignees.test.js +0 -25
  400. package/dist/utils/avatarUpload.test.d.ts +0 -1
  401. package/dist/utils/avatarUpload.test.js +0 -40
  402. package/dist/utils/canonicalAssetKind.test.d.ts +0 -1
  403. package/dist/utils/canonicalAssetKind.test.js +0 -24
  404. package/dist/utils/coalescedRefresh.test.d.ts +0 -1
  405. package/dist/utils/coalescedRefresh.test.js +0 -30
  406. package/dist/utils/constants.icons.test.d.ts +0 -1
  407. package/dist/utils/constants.icons.test.js +0 -41
  408. package/dist/utils/planParser.test.d.ts +0 -1
  409. package/dist/utils/planParser.test.js +0 -183
  410. package/dist/utils/planningReferences.test.d.ts +0 -1
  411. package/dist/utils/planningReferences.test.js +0 -17
  412. package/dist/utils/syncEventDetails.test.d.ts +0 -1
  413. package/dist/utils/syncEventDetails.test.js +0 -23
  414. package/dist/utils/syncEventPresentation.test.d.ts +0 -1
  415. package/dist/utils/syncEventPresentation.test.js +0 -64
  416. package/dist/utils/syncStatusPresentation.test.d.ts +0 -1
  417. package/dist/utils/syncStatusPresentation.test.js +0 -164
  418. package/dist/utils/taskActivity.test.d.ts +0 -1
  419. package/dist/utils/taskActivity.test.js +0 -218
  420. package/dist/utils/taskDraftDefaults.test.d.ts +0 -1
  421. package/dist/utils/taskDraftDefaults.test.js +0 -34
  422. package/dist/utils/taskDragZones.test.d.ts +0 -1
  423. package/dist/utils/taskDragZones.test.js +0 -14
  424. package/dist/utils/taskNormalization.test.d.ts +0 -1
  425. package/dist/utils/taskNormalization.test.js +0 -158
  426. package/dist/utils/taskSearch.test.d.ts +0 -1
  427. package/dist/utils/taskSearch.test.js +0 -69
  428. package/dist/utils/taskUtils.test.d.ts +0 -1
  429. package/dist/utils/taskUtils.test.js +0 -19
  430. package/dist/utils/taskforceApiClient.test.d.ts +0 -1
  431. package/dist/utils/taskforceApiClient.test.js +0 -44
  432. package/dist/utils/taxonomyFormDefaults.test.d.ts +0 -1
  433. package/dist/utils/taxonomyFormDefaults.test.js +0 -63
  434. package/dist/utils/uiNotice.test.d.ts +0 -1
  435. package/dist/utils/uiNotice.test.js +0 -18
  436. package/dist/utils/workspaceIdentity.test.d.ts +0 -1
  437. package/dist/utils/workspaceIdentity.test.js +0 -61
  438. package/dist/utils/workspaceLifecycle.test.d.ts +0 -1
  439. package/dist/utils/workspaceLifecycle.test.js +0 -64
  440. package/dist/utils/workspaceSyncPresentation.test.d.ts +0 -1
  441. package/dist/utils/workspaceSyncPresentation.test.js +0 -71
  442. package/scripts/bootstrap-playwright-auth.mjs +0 -155
  443. package/scripts/check-cloud-mcp.mjs +0 -83
  444. package/scripts/check-compat-boundaries.mjs +0 -41
  445. package/scripts/check-env.ts +0 -31
  446. package/scripts/check-localization-strings.mjs +0 -49
  447. package/scripts/check-runtime-boundaries.mjs +0 -44
  448. package/scripts/debug-global.mjs +0 -34
  449. package/scripts/debug-login.mjs +0 -32
  450. package/scripts/debug-server.mjs +0 -36
  451. package/scripts/deploy-prod.sh +0 -41
  452. package/scripts/deploy-staging.sh +0 -23
  453. package/scripts/export-sqlite-to-postgres.mjs +0 -123
  454. package/scripts/generate-env-example.ts +0 -8
  455. package/scripts/mcp-stdio-adapter.mjs +0 -160
  456. package/scripts/migrate-task-data-assets.mjs +0 -408
  457. package/scripts/playwright-auth.sh +0 -19
  458. package/scripts/qa-open-lib.mjs +0 -175
  459. package/scripts/qa-open-lib.mjs.d.ts +0 -49
  460. package/scripts/qa-open.mjs +0 -352
  461. package/scripts/release-version-lib.mjs +0 -88
  462. package/scripts/release-version.mjs +0 -72
  463. package/scripts/run-billing-performance-smoke.sh +0 -24
  464. package/scripts/run-dev-proxy.sh +0 -51
  465. package/scripts/run-e2e-realtime.sh +0 -30
  466. package/scripts/run-smoke.sh +0 -35
  467. package/scripts/run-soak.sh +0 -41
  468. package/scripts/test-global.js +0 -143
  469. package/scripts/update-homebrew-formula.sh +0 -108
  470. 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,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 {};