@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,588 +0,0 @@
1
- import { afterEach, describe, expect, it, vi } from 'vitest';
2
- import fs from 'fs';
3
- import os from 'os';
4
- import path from 'path';
5
- import { createDatabaseAdapter } from './createDatabaseAdapter.js';
6
- import { ensureDocumentReferenceSchema, ensureTaskAssetsSchema, ensureWorkspaceAssetsSchema } from '../migrations/taskSchemaMigrations.js';
7
- import { WorkspaceAssetStore } from './workspaceAssetStore.js';
8
- function makeStore() {
9
- const root = fs.mkdtempSync(path.join(os.tmpdir(), 'taskforce-workspace-assets-'));
10
- const dbPath = path.join(root, 'taskforce.db');
11
- const db = createDatabaseAdapter({ sqliteDbPath: dbPath });
12
- ensureTaskAssetsSchema(db);
13
- ensureWorkspaceAssetsSchema(db);
14
- ensureDocumentReferenceSchema(db);
15
- const store = new WorkspaceAssetStore(db, 'default');
16
- return {
17
- root,
18
- db,
19
- store,
20
- cleanup() {
21
- db.close();
22
- fs.rmSync(root, { recursive: true, force: true });
23
- }
24
- };
25
- }
26
- function makeLegacyLinkStore() {
27
- const root = fs.mkdtempSync(path.join(os.tmpdir(), 'taskforce-workspace-assets-legacy-'));
28
- const dbPath = path.join(root, 'taskforce.db');
29
- const db = createDatabaseAdapter({ sqliteDbPath: dbPath });
30
- ensureTaskAssetsSchema(db);
31
- ensureWorkspaceAssetsSchema(db);
32
- ensureDocumentReferenceSchema(db);
33
- db.exec(`DROP TABLE IF EXISTS workspace_asset_links`);
34
- db.exec(`
35
- CREATE TABLE IF NOT EXISTS workspace_asset_links (
36
- tenant_id TEXT NOT NULL DEFAULT 'default',
37
- workspace_id TEXT NOT NULL,
38
- asset_id TEXT NOT NULL,
39
- task_id TEXT NOT NULL,
40
- role TEXT NOT NULL,
41
- display_name TEXT,
42
- sort_order INTEGER,
43
- created_at TEXT NOT NULL,
44
- updated_at TEXT NOT NULL,
45
- deleted_at TEXT,
46
- PRIMARY KEY (tenant_id, workspace_id, asset_id, task_id, role)
47
- );
48
- `);
49
- const store = new WorkspaceAssetStore(db, 'default');
50
- return {
51
- root,
52
- db,
53
- store,
54
- cleanup() {
55
- db.close();
56
- fs.rmSync(root, { recursive: true, force: true });
57
- }
58
- };
59
- }
60
- describe('WorkspaceAssetStore', () => {
61
- const cleanups = [];
62
- afterEach(() => {
63
- while (cleanups.length > 0) {
64
- const cleanup = cleanups.pop();
65
- cleanup?.();
66
- }
67
- });
68
- it('upserts and reads canonical assets by asset id', () => {
69
- const ctx = makeStore();
70
- cleanups.push(() => ctx.cleanup());
71
- const created = ctx.store.upsertAsset({
72
- assetId: 'asset-1',
73
- workspaceId: 'workspace-1',
74
- kind: 'document',
75
- logicalName: 'Spec',
76
- originalFilename: 'spec.md',
77
- mimeType: 'text/markdown',
78
- storageProvider: 'local',
79
- storageKey: 'workspaces/workspace-1/assets/documents/asset-1-spec.md',
80
- contentSha256: 'sha-123',
81
- sizeBytes: 128,
82
- documentId: 'doc-1',
83
- version: 1,
84
- createdByUserId: 'user-1',
85
- scanStatus: 'clean'
86
- });
87
- expect(created.assetId).toBe('asset-1');
88
- expect(created.workspaceId).toBe('workspace-1');
89
- expect(created.kind).toBe('document');
90
- expect(created.storageKey).toContain('workspaces/workspace-1/assets/documents');
91
- expect(created.referenceNumber).toBe(1);
92
- const fetched = ctx.store.get('asset-1', 'workspace-1');
93
- expect(fetched).toMatchObject({
94
- assetId: 'asset-1',
95
- documentId: 'doc-1',
96
- version: 1,
97
- isLatest: true,
98
- referenceNumber: 1
99
- });
100
- });
101
- it('supports legacy workspace asset links without target_type', () => {
102
- const ctx = makeLegacyLinkStore();
103
- cleanups.push(() => ctx.cleanup());
104
- const now = new Date().toISOString();
105
- ctx.store.upsertAsset({
106
- assetId: 'asset-legacy-1',
107
- workspaceId: 'workspace-1',
108
- kind: 'file',
109
- originalFilename: 'legacy.pdf',
110
- mimeType: 'application/pdf',
111
- storageProvider: 'local',
112
- storageKey: 'workspaces/workspace-1/assets/files/asset-legacy-1-legacy.pdf',
113
- contentSha256: 'sha-legacy',
114
- sizeBytes: 42,
115
- createdAt: now,
116
- updatedAt: now
117
- });
118
- const created = ctx.store.upsertLink({
119
- workspaceId: 'workspace-1',
120
- assetId: 'asset-legacy-1',
121
- taskId: 'task-1',
122
- role: 'attachment',
123
- displayName: 'Legacy attachment',
124
- createdAt: now,
125
- updatedAt: now
126
- });
127
- expect(created.targetType).toBe('task');
128
- expect(created.targetId).toBe('task-1');
129
- expect(ctx.store.listLinksForTask('task-1', 'workspace-1')).toEqual([
130
- expect.objectContaining({
131
- assetId: 'asset-legacy-1',
132
- targetType: 'task',
133
- targetId: 'task-1',
134
- role: 'attachment'
135
- })
136
- ]);
137
- expect(ctx.store.deleteLink({
138
- workspaceId: 'workspace-1',
139
- assetId: 'asset-legacy-1',
140
- taskId: 'task-1',
141
- role: 'attachment'
142
- })).toBe(true);
143
- expect(ctx.store.listLinksForTask('task-1', 'workspace-1')).toEqual([]);
144
- });
145
- it('assigns sequential document reference numbers per workspace', () => {
146
- const ctx = makeStore();
147
- cleanups.push(() => ctx.cleanup());
148
- const first = ctx.store.upsertAsset({
149
- assetId: 'asset-doc-1',
150
- workspaceId: 'workspace-1',
151
- kind: 'document',
152
- originalFilename: 'alpha.md',
153
- mimeType: 'text/markdown',
154
- storageProvider: 'local',
155
- storageKey: 'workspaces/workspace-1/assets/documents/asset-doc-1-alpha.md',
156
- contentSha256: 'sha-alpha',
157
- sizeBytes: 10
158
- });
159
- const second = ctx.store.upsertAsset({
160
- assetId: 'asset-doc-2',
161
- workspaceId: 'workspace-1',
162
- kind: 'document',
163
- originalFilename: 'beta.md',
164
- mimeType: 'text/markdown',
165
- storageProvider: 'local',
166
- storageKey: 'workspaces/workspace-1/assets/documents/asset-doc-2-beta.md',
167
- contentSha256: 'sha-beta',
168
- sizeBytes: 20
169
- });
170
- const otherWorkspace = ctx.store.upsertAsset({
171
- assetId: 'asset-doc-3',
172
- workspaceId: 'workspace-2',
173
- kind: 'document',
174
- originalFilename: 'gamma.md',
175
- mimeType: 'text/markdown',
176
- storageProvider: 'local',
177
- storageKey: 'workspaces/workspace-2/assets/documents/asset-doc-3-gamma.md',
178
- contentSha256: 'sha-gamma',
179
- sizeBytes: 30
180
- });
181
- expect(first.referenceNumber).toBe(1);
182
- expect(second.referenceNumber).toBe(2);
183
- expect(otherWorkspace.referenceNumber).toBe(1);
184
- });
185
- it('assigns sequential image reference numbers per workspace independently from documents', () => {
186
- const ctx = makeStore();
187
- cleanups.push(() => ctx.cleanup());
188
- const firstImage = ctx.store.upsertAsset({
189
- assetId: 'asset-image-1',
190
- workspaceId: 'workspace-1',
191
- kind: 'image',
192
- originalFilename: 'alpha.png',
193
- mimeType: 'image/png',
194
- storageProvider: 'local',
195
- storageKey: 'workspaces/workspace-1/assets/images/asset-image-1-alpha.png',
196
- contentSha256: 'sha-image-alpha',
197
- sizeBytes: 10
198
- });
199
- const document = ctx.store.upsertAsset({
200
- assetId: 'asset-doc-1',
201
- workspaceId: 'workspace-1',
202
- kind: 'document',
203
- originalFilename: 'alpha.md',
204
- mimeType: 'text/markdown',
205
- storageProvider: 'local',
206
- storageKey: 'workspaces/workspace-1/assets/documents/asset-doc-1-alpha.md',
207
- contentSha256: 'sha-doc-alpha',
208
- sizeBytes: 20
209
- });
210
- const secondImage = ctx.store.upsertAsset({
211
- assetId: 'asset-image-2',
212
- workspaceId: 'workspace-1',
213
- kind: 'image',
214
- originalFilename: 'beta.png',
215
- mimeType: 'image/png',
216
- storageProvider: 'local',
217
- storageKey: 'workspaces/workspace-1/assets/images/asset-image-2-beta.png',
218
- contentSha256: 'sha-image-beta',
219
- sizeBytes: 30
220
- });
221
- expect(firstImage.referenceNumber).toBe(1);
222
- expect(document.referenceNumber).toBe(1);
223
- expect(secondImage.referenceNumber).toBe(2);
224
- });
225
- it('preserves an existing readable asset reference number during normal upserts', () => {
226
- const ctx = makeStore();
227
- cleanups.push(() => ctx.cleanup());
228
- const created = ctx.store.upsertAsset({
229
- assetId: 'asset-doc-stable-1',
230
- workspaceId: 'workspace-1',
231
- kind: 'document',
232
- originalFilename: 'alpha.md',
233
- mimeType: 'text/markdown',
234
- storageProvider: 'local',
235
- storageKey: 'workspaces/workspace-1/assets/documents/asset-doc-stable-1-alpha.md',
236
- contentSha256: 'sha-alpha',
237
- sizeBytes: 10,
238
- referenceNumber: 5
239
- });
240
- const updated = ctx.store.upsertAsset({
241
- assetId: 'asset-doc-stable-1',
242
- workspaceId: 'workspace-1',
243
- kind: 'document',
244
- originalFilename: 'alpha.md',
245
- mimeType: 'text/markdown',
246
- storageProvider: 'local',
247
- storageKey: 'workspaces/workspace-1/assets/documents/asset-doc-stable-1-alpha.md',
248
- contentSha256: 'sha-alpha-2',
249
- sizeBytes: 12,
250
- referenceNumber: 11
251
- });
252
- expect(created.referenceNumber).toBe(5);
253
- expect(updated.referenceNumber).toBe(5);
254
- });
255
- it('allows readable asset reference reassignment only when explicitly requested', () => {
256
- const ctx = makeStore();
257
- cleanups.push(() => ctx.cleanup());
258
- ctx.store.upsertAsset({
259
- assetId: 'asset-image-stable-1',
260
- workspaceId: 'workspace-1',
261
- kind: 'image',
262
- originalFilename: 'alpha.png',
263
- mimeType: 'image/png',
264
- storageProvider: 'local',
265
- storageKey: 'workspaces/workspace-1/assets/images/asset-image-stable-1-alpha.png',
266
- contentSha256: 'sha-image-alpha',
267
- sizeBytes: 10,
268
- referenceNumber: 3
269
- });
270
- const repaired = ctx.store.upsertAsset({
271
- assetId: 'asset-image-stable-1',
272
- workspaceId: 'workspace-1',
273
- kind: 'image',
274
- originalFilename: 'alpha.png',
275
- mimeType: 'image/png',
276
- storageProvider: 'local',
277
- storageKey: 'workspaces/workspace-1/assets/images/asset-image-stable-1-alpha.png',
278
- contentSha256: 'sha-image-beta',
279
- sizeBytes: 10,
280
- referenceNumber: 7,
281
- allowReferenceNumberReassignment: true
282
- });
283
- expect(repaired.referenceNumber).toBe(7);
284
- });
285
- it('skips stale sequence values when allocating readable asset references', () => {
286
- const ctx = makeStore();
287
- cleanups.push(() => ctx.cleanup());
288
- ctx.store.upsertAsset({
289
- assetId: 'asset-doc-existing',
290
- workspaceId: 'workspace-1',
291
- kind: 'document',
292
- originalFilename: 'existing.md',
293
- mimeType: 'text/markdown',
294
- storageProvider: 'local',
295
- storageKey: 'workspaces/workspace-1/assets/documents/existing.md',
296
- contentSha256: 'sha-existing',
297
- sizeBytes: 10,
298
- referenceNumber: 1
299
- });
300
- ctx.db.prepare(`
301
- INSERT INTO workspace_document_reference_sequences (tenant_id, workspace_id, next_reference_number)
302
- VALUES ('default', 'workspace-1', 0)
303
- ON CONFLICT (tenant_id, workspace_id) DO UPDATE SET next_reference_number = 0
304
- `).run();
305
- const created = ctx.store.upsertAsset({
306
- assetId: 'asset-doc-new',
307
- workspaceId: 'workspace-1',
308
- kind: 'document',
309
- originalFilename: 'new.md',
310
- mimeType: 'text/markdown',
311
- storageProvider: 'local',
312
- storageKey: 'workspaces/workspace-1/assets/documents/new.md',
313
- contentSha256: 'sha-new',
314
- sizeBytes: 10
315
- });
316
- expect(created.referenceNumber).toBe(2);
317
- });
318
- it('retries with the next available readable reference when the database raises a reference collision', () => {
319
- const ctx = makeStore();
320
- cleanups.push(() => ctx.cleanup());
321
- ctx.store.upsertAsset({
322
- assetId: 'asset-doc-existing',
323
- workspaceId: 'workspace-1',
324
- kind: 'document',
325
- originalFilename: 'existing.md',
326
- mimeType: 'text/markdown',
327
- storageProvider: 'local',
328
- storageKey: 'workspaces/workspace-1/assets/documents/existing.md',
329
- contentSha256: 'sha-existing',
330
- sizeBytes: 10,
331
- referenceNumber: 7
332
- });
333
- const originalPrepare = ctx.db.prepare.bind(ctx.db);
334
- let forcedCollision = false;
335
- vi.spyOn(ctx.db, 'prepare').mockImplementation((sql) => {
336
- const statement = originalPrepare(sql);
337
- if (!sql.includes('INSERT INTO workspace_assets')) {
338
- return statement;
339
- }
340
- return {
341
- ...statement,
342
- run: (...args) => {
343
- const referenceNumberArg = args[12];
344
- if (!forcedCollision && referenceNumberArg === 8) {
345
- forcedCollision = true;
346
- throw new Error('UNIQUE constraint failed: workspace_assets.tenant_id, workspace_assets.workspace_id, workspace_assets.kind, workspace_assets.reference_number');
347
- }
348
- return statement.run(...args);
349
- }
350
- };
351
- });
352
- const created = ctx.store.upsertAsset({
353
- assetId: 'asset-doc-new',
354
- workspaceId: 'workspace-1',
355
- kind: 'document',
356
- originalFilename: 'new.md',
357
- mimeType: 'text/markdown',
358
- storageProvider: 'local',
359
- storageKey: 'workspaces/workspace-1/assets/documents/new.md',
360
- contentSha256: 'sha-new',
361
- sizeBytes: 10,
362
- referenceNumber: 8
363
- });
364
- expect(created.referenceNumber).toBe(8 + 1);
365
- });
366
- it('migrates old cross-kind asset reference indexes before backfilling image references', () => {
367
- const root = fs.mkdtempSync(path.join(os.tmpdir(), 'taskforce-workspace-assets-migrate-'));
368
- const dbPath = path.join(root, 'taskforce.db');
369
- const db = createDatabaseAdapter({ sqliteDbPath: dbPath });
370
- cleanups.push(() => {
371
- db.close();
372
- fs.rmSync(root, { recursive: true, force: true });
373
- });
374
- ensureTaskAssetsSchema(db);
375
- ensureWorkspaceAssetsSchema(db);
376
- db.exec(`ALTER TABLE workspace_assets ADD COLUMN reference_number INTEGER`);
377
- db.exec(`
378
- CREATE TABLE workspace_document_reference_sequences (
379
- tenant_id TEXT NOT NULL DEFAULT 'default',
380
- workspace_id TEXT NOT NULL DEFAULT 'default',
381
- next_reference_number INTEGER NOT NULL DEFAULT 0,
382
- PRIMARY KEY (tenant_id, workspace_id)
383
- );
384
- CREATE UNIQUE INDEX idx_workspace_assets_workspace_reference
385
- ON workspace_assets(tenant_id, workspace_id, reference_number);
386
- `);
387
- const insertAsset = db.prepare(`
388
- INSERT INTO workspace_assets (
389
- asset_id,
390
- tenant_id,
391
- workspace_id,
392
- kind,
393
- logical_name,
394
- original_filename,
395
- mime_type,
396
- storage_provider,
397
- storage_key,
398
- content_sha256,
399
- size_bytes,
400
- document_id,
401
- version,
402
- is_latest,
403
- scan_status,
404
- scan_engine,
405
- scan_details,
406
- created_by_user_id,
407
- created_at,
408
- updated_at,
409
- deleted_at,
410
- purge_after,
411
- reference_number
412
- ) VALUES (?, 'default', 'workspace-1', ?, NULL, ?, ?, 'local', ?, ?, ?, NULL, 1, 1, 'clean', NULL, NULL, NULL, ?, ?, NULL, NULL, ?)
413
- `);
414
- insertAsset.run('asset-doc-1', 'document', 'doc-1.md', 'text/markdown', 'workspaces/workspace-1/assets/documents/asset-doc-1-doc-1.md', 'sha-doc-1', 10, '2026-03-25T12:00:00.000Z', '2026-03-25T12:00:00.000Z', 1);
415
- insertAsset.run('asset-doc-2', 'document', 'doc-2.md', 'text/markdown', 'workspaces/workspace-1/assets/documents/asset-doc-2-doc-2.md', 'sha-doc-2', 20, '2026-03-25T12:01:00.000Z', '2026-03-25T12:01:00.000Z', 2);
416
- insertAsset.run('asset-image-1', 'image', 'image-1.png', 'image/png', 'workspaces/workspace-1/assets/images/asset-image-1-image-1.png', 'sha-image-1', 30, '2026-03-25T12:02:00.000Z', '2026-03-25T12:02:00.000Z', null);
417
- insertAsset.run('asset-image-2', 'image', 'image-2.png', 'image/png', 'workspaces/workspace-1/assets/images/asset-image-2-image-2.png', 'sha-image-2', 40, '2026-03-25T12:03:00.000Z', '2026-03-25T12:03:00.000Z', null);
418
- expect(() => ensureDocumentReferenceSchema(db)).not.toThrow();
419
- const migrated = db.prepare(`
420
- SELECT kind, reference_number
421
- FROM workspace_assets
422
- WHERE tenant_id = 'default' AND workspace_id = 'workspace-1'
423
- ORDER BY kind ASC, asset_id ASC
424
- `).all();
425
- expect(migrated).toEqual([
426
- { kind: 'document', reference_number: 1 },
427
- { kind: 'document', reference_number: 2 },
428
- { kind: 'image', reference_number: 1 },
429
- { kind: 'image', reference_number: 2 }
430
- ]);
431
- });
432
- it('lists workspace assets and excludes deleted rows by default', () => {
433
- const ctx = makeStore();
434
- cleanups.push(() => ctx.cleanup());
435
- ctx.store.upsertAsset({
436
- assetId: 'asset-a',
437
- workspaceId: 'workspace-1',
438
- kind: 'document',
439
- originalFilename: 'a.md',
440
- mimeType: 'text/markdown',
441
- storageProvider: 'local',
442
- storageKey: 'workspaces/workspace-1/assets/documents/asset-a-a.md',
443
- contentSha256: 'sha-a',
444
- sizeBytes: 10
445
- });
446
- ctx.store.upsertAsset({
447
- assetId: 'asset-b',
448
- workspaceId: 'workspace-1',
449
- kind: 'image',
450
- originalFilename: 'b.png',
451
- mimeType: 'image/png',
452
- storageProvider: 'r2',
453
- storageKey: 'workspaces/workspace-1/assets/images/asset-b-b.png',
454
- contentSha256: 'sha-b',
455
- sizeBytes: 20
456
- });
457
- ctx.store.markDeleted('asset-b', 'workspace-1', '2026-03-17T00:00:00.000Z', '2026-03-24T00:00:00.000Z');
458
- const active = ctx.store.listByWorkspace('workspace-1');
459
- expect(active.map((entry) => entry.assetId)).toEqual(['asset-a']);
460
- const all = ctx.store.listByWorkspace('workspace-1', { includeDeleted: true });
461
- expect(all.map((entry) => entry.assetId).sort()).toEqual(['asset-a', 'asset-b']);
462
- });
463
- it('creates, lists, and soft-deletes generic target links while preserving task compatibility helpers', () => {
464
- const ctx = makeStore();
465
- cleanups.push(() => ctx.cleanup());
466
- ctx.store.upsertAsset({
467
- assetId: 'asset-link-1',
468
- workspaceId: 'workspace-1',
469
- kind: 'file',
470
- originalFilename: 'brief.pdf',
471
- mimeType: 'application/pdf',
472
- storageProvider: 'r2',
473
- storageKey: 'workspaces/workspace-1/assets/files/asset-link-1-brief.pdf',
474
- contentSha256: 'sha-link',
475
- sizeBytes: 55
476
- });
477
- ctx.store.upsertLink({
478
- workspaceId: 'workspace-1',
479
- assetId: 'asset-link-1',
480
- targetType: 'task',
481
- targetId: 'task-1',
482
- role: 'attachment',
483
- sortOrder: 2
484
- });
485
- ctx.store.upsertLink({
486
- workspaceId: 'workspace-1',
487
- assetId: 'asset-link-1',
488
- targetType: 'initiative',
489
- targetId: 'initiative-2',
490
- role: 'reference',
491
- sortOrder: 1
492
- });
493
- const taskLinks = ctx.store.listLinksForTask('task-1', 'workspace-1');
494
- expect(taskLinks).toHaveLength(1);
495
- expect(taskLinks[0]).toMatchObject({ assetId: 'asset-link-1', role: 'attachment', targetType: 'task', targetId: 'task-1', taskId: 'task-1' });
496
- const initiativeLinks = ctx.store.listLinksForTarget('initiative', 'initiative-2', 'workspace-1');
497
- expect(initiativeLinks).toHaveLength(1);
498
- expect(initiativeLinks[0]).toMatchObject({ assetId: 'asset-link-1', role: 'reference', targetType: 'initiative', targetId: 'initiative-2', taskId: null });
499
- const assetLinks = ctx.store.listLinksForAsset('asset-link-1', 'workspace-1');
500
- expect(assetLinks).toHaveLength(2);
501
- expect(assetLinks.map((entry) => [entry.targetType, entry.targetId])).toEqual([
502
- ['initiative', 'initiative-2'],
503
- ['task', 'task-1'],
504
- ]);
505
- expect(ctx.store.deleteLink({
506
- workspaceId: 'workspace-1',
507
- assetId: 'asset-link-1',
508
- targetType: 'task',
509
- targetId: 'task-1',
510
- role: 'attachment'
511
- })).toBe(true);
512
- expect(ctx.store.listLinksForTask('task-1', 'workspace-1')).toHaveLength(0);
513
- expect(ctx.store.listLinksForTask('task-1', 'workspace-1', { includeDeleted: true })).toHaveLength(1);
514
- });
515
- it('resolves legacy path-keyed writes through a stable canonical asset id', () => {
516
- const ctx = makeStore();
517
- cleanups.push(() => ctx.cleanup());
518
- const created = ctx.store.upsertAsset({
519
- assetId: 'asset-legacy-1',
520
- workspaceId: 'workspace-1',
521
- kind: 'document',
522
- originalFilename: 'notes.md',
523
- mimeType: 'text/markdown',
524
- storageProvider: 'local',
525
- storageKey: 'task-data/task-1/attachments/notes.md',
526
- contentSha256: 'sha-v1',
527
- sizeBytes: 12,
528
- documentId: 'doc-legacy-1',
529
- version: 1
530
- });
531
- const samePath = ctx.store.getByStorageKey('task-data/task-1/attachments/notes.md', 'workspace-1');
532
- expect(samePath).toMatchObject({
533
- assetId: created.assetId,
534
- documentId: 'doc-legacy-1',
535
- version: 1
536
- });
537
- ctx.store.upsertAsset({
538
- assetId: created.assetId,
539
- workspaceId: 'workspace-1',
540
- kind: 'document',
541
- originalFilename: 'notes.md',
542
- mimeType: 'text/markdown',
543
- storageProvider: 'local',
544
- storageKey: 'task-data/task-1/attachments/notes.md',
545
- contentSha256: 'sha-v2',
546
- sizeBytes: 24,
547
- documentId: 'doc-legacy-1',
548
- version: 2
549
- });
550
- const updated = ctx.store.getByStorageKey('task-data/task-1/attachments/notes.md', 'workspace-1');
551
- expect(updated).toMatchObject({
552
- assetId: created.assetId,
553
- documentId: 'doc-legacy-1',
554
- version: 2,
555
- contentSha256: 'sha-v2',
556
- sizeBytes: 24
557
- });
558
- });
559
- it('normalizes invalid document metadata for txt files into plain files', () => {
560
- const ctx = makeStore();
561
- cleanups.push(() => ctx.cleanup());
562
- const created = ctx.store.upsertAsset({
563
- assetId: 'asset-invalid-doc-1',
564
- workspaceId: 'workspace-1',
565
- kind: 'document',
566
- logicalName: 'diagnostic.txt',
567
- originalFilename: 'diagnostic.txt',
568
- mimeType: 'text/plain',
569
- storageProvider: 'local',
570
- storageKey: 'workspaces/workspace-1/assets/documents/asset-invalid-doc-1-diagnostic.txt',
571
- contentSha256: 'sha-invalid-doc-1',
572
- sizeBytes: 42,
573
- documentId: 'doc-invalid',
574
- version: 1
575
- });
576
- expect(created.kind).toBe('file');
577
- expect(created.referenceNumber).toBeNull();
578
- expect(created.documentId).toBeNull();
579
- expect(created.version).toBeNull();
580
- const fetched = ctx.store.get('asset-invalid-doc-1', 'workspace-1');
581
- expect(fetched).toMatchObject({
582
- kind: 'file',
583
- referenceNumber: null,
584
- documentId: null,
585
- version: null
586
- });
587
- });
588
- });
@@ -1 +0,0 @@
1
- export {};