@taskforcehq/taskforce 0.3.170 → 0.3.300

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 (696) hide show
  1. package/README.md +52 -21
  2. package/dist/Taskforce.module.css +3394 -5981
  3. package/dist/TaskforceCore.CategoryFallback.test.js +5 -2
  4. package/dist/TaskforceCore.filter-persistence.test.js +402 -0
  5. package/dist/TaskforceCore.js +388 -71
  6. package/dist/TaskforceCore.routing.test.js +311 -0
  7. package/dist/TaskforceCore.test.js +3344 -615
  8. package/dist/TaskforceWidget.js +3 -2
  9. package/dist/__tests__/localizationCatalogs.test.js +48 -31
  10. package/dist/__tests__/workflowSimulation.test.js +2 -2
  11. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.d.ts +60 -0
  12. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.js +324 -0
  13. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.test.js +278 -0
  14. package/dist/annotatedAttachments/payload.d.ts +2 -0
  15. package/dist/annotatedAttachments/payload.js +54 -0
  16. package/dist/annotatedAttachments/payload.test.js +67 -0
  17. package/dist/annotatedAttachments/service.d.ts +49 -0
  18. package/dist/annotatedAttachments/service.js +121 -0
  19. package/dist/annotatedAttachments/types.d.ts +86 -0
  20. package/dist/cli.js +74 -25
  21. package/dist/compat/deploymentCompat.d.ts +12 -0
  22. package/dist/compat/deploymentCompat.js +43 -0
  23. package/dist/compat/workspaceSyncCompat.d.ts +6 -0
  24. package/dist/compat/workspaceSyncCompat.js +79 -0
  25. package/dist/compat/workspaceSyncCompat.test.js +87 -0
  26. package/dist/components/features/AgentsModule.d.ts +5 -0
  27. package/dist/components/features/AgentsModule.js +131 -0
  28. package/dist/components/features/AgentsModule.test.js +102 -0
  29. package/dist/components/features/AnnotatedAttachmentWorkspace.d.ts +24 -0
  30. package/dist/components/features/AnnotatedAttachmentWorkspace.js +1942 -0
  31. package/dist/components/features/AnnotatedAttachmentWorkspace.test.js +2831 -0
  32. package/dist/components/features/DocumentGenerateModal.js +8 -16
  33. package/dist/components/features/DocumentIndex.d.ts +3 -4
  34. package/dist/components/features/DocumentIndex.js +22 -10
  35. package/dist/components/features/DocumentViewer.d.ts +6 -2
  36. package/dist/components/features/DocumentViewer.js +1000 -18
  37. package/dist/components/features/DocumentWorkspace.d.ts +40 -2
  38. package/dist/components/features/DocumentWorkspace.js +96 -16
  39. package/dist/components/features/DocumentWorkspace.test.js +1202 -0
  40. package/dist/components/features/InitiativesModule.d.ts +22 -0
  41. package/dist/components/features/InitiativesModule.js +33 -0
  42. package/dist/components/features/TaskSettings.d.ts +41 -32
  43. package/dist/components/features/TaskSettings.js +798 -313
  44. package/dist/components/features/TaskSettings.test.js +1221 -47
  45. package/dist/components/features/WorkflowsModule.d.ts +27 -0
  46. package/dist/components/features/WorkflowsModule.js +21 -0
  47. package/dist/components/features/documentWorkspaceFilters.d.ts +10 -0
  48. package/dist/components/features/documentWorkspaceFilters.js +11 -0
  49. package/dist/components/features/settings/CategoryManager.d.ts +2 -0
  50. package/dist/components/features/settings/CategoryManager.js +15 -8
  51. package/dist/components/features/settings/PriorityManager.d.ts +18 -0
  52. package/dist/components/features/settings/PriorityManager.js +51 -0
  53. package/dist/components/features/settings/TaxonomyEditor.d.ts +2 -1
  54. package/dist/components/features/settings/TaxonomyEditor.js +41 -18
  55. package/dist/components/features/settings/TaxonomyLibraryManager.d.ts +26 -0
  56. package/dist/components/features/settings/TaxonomyLibraryManager.js +301 -0
  57. package/dist/components/features/settings/TaxonomyLibraryManager.test.js +141 -0
  58. package/dist/components/features/settings/TaxonomyManager.d.ts +35 -12
  59. package/dist/components/features/settings/TaxonomyManager.js +59 -27
  60. package/dist/components/features/settings/TypeManager.d.ts +11 -0
  61. package/dist/components/features/settings/TypeManager.js +48 -11
  62. package/dist/components/features/settings/{WorkflowEditorPrototype.d.ts → WorkflowEditor.d.ts} +2 -2
  63. package/dist/components/features/settings/{WorkflowEditorPrototype.js → WorkflowEditor.js} +3 -3
  64. package/dist/components/task/TaskActionHeader.d.ts +12 -2
  65. package/dist/components/task/TaskActionHeader.js +64 -8
  66. package/dist/components/task/TaskActionHeader.test.js +73 -0
  67. package/dist/components/task/TaskCard.d.ts +14 -16
  68. package/dist/components/task/TaskCard.js +144 -174
  69. package/dist/components/task/TaskCard.test.js +416 -64
  70. package/dist/components/task/TaskContextUpload.d.ts +6 -5
  71. package/dist/components/task/TaskContextUpload.js +199 -64
  72. package/dist/components/task/TaskContextUpload.test.js +331 -14
  73. package/dist/components/task/TaskForm.d.ts +23 -29
  74. package/dist/components/task/TaskForm.js +348 -169
  75. package/dist/components/task/TaskForm.test.js +419 -23
  76. package/dist/components/task/TaskKanban.d.ts +20 -21
  77. package/dist/components/task/TaskKanban.js +176 -316
  78. package/dist/components/task/TaskKanban.planning-drop.test.js +93 -0
  79. package/dist/components/task/TaskList.d.ts +22 -11
  80. package/dist/components/task/TaskList.js +98 -12
  81. package/dist/components/task/TaskList.test.js +206 -7
  82. package/dist/components/task/TaskReferenceBadge.d.ts +12 -0
  83. package/dist/components/task/TaskReferenceBadge.js +5 -0
  84. package/dist/components/task/TaskStatusActions.d.ts +12 -0
  85. package/dist/components/task/TaskStatusActions.js +18 -0
  86. package/dist/components/task/TaskStatusActions.test.js +45 -0
  87. package/dist/components/ui/ImageReferenceBadge.d.ts +12 -0
  88. package/dist/components/ui/ImageReferenceBadge.js +5 -0
  89. package/dist/components/ui/LevelSelector.d.ts +2 -1
  90. package/dist/components/ui/LevelSelector.js +2 -2
  91. package/dist/components/ui/Markdown.d.ts +1 -2
  92. package/dist/components/ui/Markdown.js +2 -13
  93. package/dist/components/ui/Modal.d.ts +3 -2
  94. package/dist/components/ui/Modal.js +4 -3
  95. package/dist/components/ui/MultiSelectFilter.d.ts +3 -1
  96. package/dist/components/ui/MultiSelectFilter.js +2 -2
  97. package/dist/components/ui/ReferenceBadgeButton.d.ts +13 -0
  98. package/dist/components/ui/ReferenceBadgeButton.js +6 -0
  99. package/dist/components/ui/TaxonomyDropdown.d.ts +7 -1
  100. package/dist/components/ui/TaxonomyDropdown.js +58 -23
  101. package/dist/components/ui/TopNoticeLayer.d.ts +7 -0
  102. package/dist/components/ui/TopNoticeLayer.js +14 -0
  103. package/dist/components/ui/TopNoticeLayer.test.js +25 -0
  104. package/dist/components/views/AppShellHeader.d.ts +13 -0
  105. package/dist/components/views/AppShellHeader.js +19 -0
  106. package/dist/components/views/AppShellHeader.test.js +21 -0
  107. package/dist/components/views/PlanComparisonPage.d.ts +73 -0
  108. package/dist/components/views/PlanComparisonPage.js +196 -0
  109. package/dist/components/views/PlanComparisonPage.test.js +251 -0
  110. package/dist/components/views/PlansPage.d.ts +14 -0
  111. package/dist/components/views/PlansPage.js +355 -0
  112. package/dist/components/views/StandaloneLayout.d.ts +2 -2
  113. package/dist/components/views/StandaloneLayout.js +2212 -1194
  114. package/dist/components/views/WidgetView.d.ts +2 -2
  115. package/dist/components/views/WidgetView.js +149 -43
  116. package/dist/components/views/chrome/WorkspaceChromeSections.d.ts +57 -0
  117. package/dist/components/views/chrome/WorkspaceChromeSections.js +38 -0
  118. package/dist/components/views/chrome/WorkspaceChromeSections.test.js +54 -0
  119. package/dist/components/views/chrome/workspaceChrome.d.ts +31 -0
  120. package/dist/components/views/chrome/workspaceChrome.js +108 -0
  121. package/dist/components/views/chrome/workspaceChrome.test.js +52 -0
  122. package/dist/components/views/panels/DocumentFilterToolbar.d.ts +10 -0
  123. package/dist/components/views/panels/DocumentFilterToolbar.js +7 -0
  124. package/dist/components/views/panels/DocumentFilterToolbar.test.js +19 -0
  125. package/dist/components/views/panels/FilterToolbar.d.ts +66 -0
  126. package/dist/components/views/panels/FilterToolbar.js +21 -0
  127. package/dist/components/views/panels/FilterToolbar.test.d.ts +1 -0
  128. package/dist/components/views/panels/FilterToolbar.test.js +45 -0
  129. package/dist/components/views/panels/FilterToolbarControls.d.ts +46 -0
  130. package/dist/components/views/panels/FilterToolbarControls.js +61 -0
  131. package/dist/components/views/panels/PlanningDrawer.d.ts +115 -0
  132. package/dist/components/views/panels/PlanningDrawer.js +220 -0
  133. package/dist/components/views/panels/ScheduleSidebar.d.ts +52 -0
  134. package/dist/components/views/panels/ScheduleSidebar.js +127 -0
  135. package/dist/components/views/panels/scheduleUtils.d.ts +14 -0
  136. package/dist/components/views/panels/scheduleUtils.js +79 -0
  137. package/dist/components/views/teamManagementAccess.d.ts +6 -0
  138. package/dist/components/views/teamManagementAccess.js +18 -0
  139. package/dist/components/views/teamManagementAccess.test.d.ts +1 -0
  140. package/dist/components/views/teamManagementAccess.test.js +44 -0
  141. package/dist/config/clientDeployment.d.ts +2 -0
  142. package/dist/config/clientDeployment.js +13 -0
  143. package/dist/config/cloudEnvironment.d.ts +15 -0
  144. package/dist/config/cloudEnvironment.js +60 -0
  145. package/dist/config/deployment.d.ts +20 -0
  146. package/dist/config/deployment.js +67 -0
  147. package/dist/config/deployment.test.d.ts +1 -0
  148. package/dist/config/deployment.test.js +88 -0
  149. package/dist/config/envSchema.js +36 -8
  150. package/dist/config/envSchema.test.js +28 -0
  151. package/dist/core/AiProfileService.d.ts +66 -0
  152. package/dist/core/AiProfileService.js +320 -0
  153. package/dist/core/AiProfileService.test.d.ts +1 -0
  154. package/dist/core/AiProfileService.test.js +164 -0
  155. package/dist/core/AiProfiles.test.d.ts +1 -0
  156. package/dist/core/AiProfiles.test.js +449 -0
  157. package/dist/core/AttachmentLinkService.d.ts +15 -0
  158. package/dist/core/AttachmentLinkService.js +157 -0
  159. package/dist/core/AuthTokenService.d.ts +44 -0
  160. package/dist/core/AuthTokenService.js +207 -0
  161. package/dist/core/CreatedBy.test.js +134 -6
  162. package/dist/core/DeletedTaskLifecycleService.d.ts +33 -0
  163. package/dist/core/DeletedTaskLifecycleService.js +158 -0
  164. package/dist/core/DeletedTaskTrash.test.d.ts +1 -0
  165. package/dist/core/DeletedTaskTrash.test.js +104 -0
  166. package/dist/core/EntitlementsPolicy.test.js +78 -5
  167. package/dist/core/GlobalSettingsService.d.ts +16 -0
  168. package/dist/core/GlobalSettingsService.js +370 -0
  169. package/dist/core/JsonBackupRuntime.test.d.ts +1 -0
  170. package/dist/core/JsonBackupRuntime.test.js +155 -0
  171. package/dist/core/McpTokenService.d.ts +118 -0
  172. package/dist/core/McpTokenService.js +921 -0
  173. package/dist/core/PlanEntitlementService.d.ts +201 -0
  174. package/dist/core/PlanEntitlementService.js +1442 -0
  175. package/dist/core/PlanVersionPolicy.test.d.ts +1 -0
  176. package/dist/core/PlanVersionPolicy.test.js +178 -0
  177. package/dist/core/PlanningEntities.test.d.ts +1 -0
  178. package/dist/core/PlanningEntities.test.js +95 -0
  179. package/dist/core/ScheduleFields.test.js +15 -19
  180. package/dist/core/SignupMonetizationSettings.test.d.ts +1 -0
  181. package/dist/core/SignupMonetizationSettings.test.js +159 -0
  182. package/dist/core/Stats.test.d.ts +1 -0
  183. package/dist/core/Stats.test.js +36 -0
  184. package/dist/core/SyncReconciliationService.d.ts +93 -0
  185. package/dist/core/SyncReconciliationService.js +406 -0
  186. package/dist/core/SystemAdmin.test.js +578 -13
  187. package/dist/core/TaskActivityService.d.ts +21 -0
  188. package/dist/core/TaskActivityService.js +130 -0
  189. package/dist/core/TaskAttachmentsCanonical.test.d.ts +1 -0
  190. package/dist/core/TaskAttachmentsCanonical.test.js +306 -0
  191. package/dist/core/TaskAuditTimeline.test.d.ts +1 -0
  192. package/dist/core/TaskAuditTimeline.test.js +132 -0
  193. package/dist/core/TaskTaxonomyValidation.test.js +338 -15
  194. package/dist/core/Taskforce.d.ts +930 -183
  195. package/dist/core/Taskforce.ids.test.js +252 -0
  196. package/dist/core/Taskforce.js +3848 -2532
  197. package/dist/core/Taskforce.mcpAuth.test.d.ts +1 -0
  198. package/dist/core/Taskforce.mcpAuth.test.js +343 -0
  199. package/dist/core/Taskforce.realtimeMutation.test.js +57 -2
  200. package/dist/core/TaxonomySettingsService.d.ts +18 -0
  201. package/dist/core/TaxonomySettingsService.js +162 -0
  202. package/dist/core/WorkspaceDelete.test.js +32 -13
  203. package/dist/core/WorkspaceLifecycleService.d.ts +11 -0
  204. package/dist/core/WorkspaceLifecycleService.js +88 -0
  205. package/dist/core/WorkspacePermissions.test.js +95 -0
  206. package/dist/core/WorkspacePlanMode.test.js +114 -1
  207. package/dist/core/WorkspacePreferenceService.d.ts +41 -0
  208. package/dist/core/WorkspacePreferenceService.js +246 -0
  209. package/dist/core/WorkspaceSyncSettings.test.d.ts +1 -0
  210. package/dist/core/WorkspaceSyncSettings.test.js +65 -0
  211. package/dist/core/__tests__/TaskAttachmentsCanonical.test.d.ts +1 -0
  212. package/dist/core/__tests__/TaskAttachmentsCanonical.test.js +212 -0
  213. package/dist/core/shared.d.ts +36 -0
  214. package/dist/core/shared.js +128 -0
  215. package/dist/core/types.d.ts +614 -0
  216. package/dist/core/types.js +27 -0
  217. package/dist/documentReviews/DocumentReviewCommentStore.d.ts +56 -0
  218. package/dist/documentReviews/DocumentReviewCommentStore.js +230 -0
  219. package/dist/documentReviews/DocumentReviewSessionStore.d.ts +52 -0
  220. package/dist/documentReviews/DocumentReviewSessionStore.js +193 -0
  221. package/dist/documentReviews/DocumentReviewSessionStore.test.d.ts +1 -0
  222. package/dist/documentReviews/DocumentReviewSessionStore.test.js +127 -0
  223. package/dist/documentReviews/service.d.ts +68 -0
  224. package/dist/documentReviews/service.js +210 -0
  225. package/dist/documentReviews/types.d.ts +58 -0
  226. package/dist/documentReviews/types.js +1 -0
  227. package/dist/hooks/auth/useAuthGuardPolicy.d.ts +2 -0
  228. package/dist/hooks/auth/useAuthGuardPolicy.js +1 -0
  229. package/dist/hooks/tasks/useCurrentTaskRelations.d.ts +15 -0
  230. package/dist/hooks/tasks/useCurrentTaskRelations.js +37 -0
  231. package/dist/hooks/tasks/useTaskActions.d.ts +3 -0
  232. package/dist/hooks/tasks/useTaskActions.js +2 -0
  233. package/dist/hooks/tasks/useTaskEditorNavigation.d.ts +65 -0
  234. package/dist/hooks/tasks/useTaskEditorNavigation.js +235 -0
  235. package/dist/hooks/tasks/useTaskFilters.d.ts +2 -0
  236. package/dist/hooks/tasks/useTaskFilters.js +2 -0
  237. package/dist/hooks/tasks/useTaskFormActions.d.ts +58 -0
  238. package/dist/hooks/tasks/useTaskFormActions.js +365 -0
  239. package/dist/hooks/tasks/useTaskRelationships.d.ts +16 -0
  240. package/dist/hooks/tasks/useTaskRelationships.js +64 -0
  241. package/dist/hooks/ui/useResourceExport.d.ts +19 -0
  242. package/dist/hooks/ui/useResourceExport.js +84 -0
  243. package/dist/hooks/ui/useSettingsModel.d.ts +203 -0
  244. package/dist/hooks/ui/useSettingsModel.js +125 -0
  245. package/dist/hooks/ui/useSettingsPersistence.d.ts +36 -0
  246. package/dist/hooks/ui/useSettingsPersistence.js +254 -0
  247. package/dist/hooks/ui/useSettingsTaxonomyManagement.d.ts +119 -0
  248. package/dist/hooks/ui/useSettingsTaxonomyManagement.js +536 -0
  249. package/dist/hooks/ui/useUiNotice.d.ts +1 -0
  250. package/dist/hooks/ui/useUiNotice.js +1 -0
  251. package/dist/hooks/ui/useWorkflowTemplates.d.ts +37 -0
  252. package/dist/hooks/ui/useWorkflowTemplates.js +111 -0
  253. package/dist/hooks/ui/useZenMode.d.ts +5 -0
  254. package/dist/hooks/ui/useZenMode.js +32 -0
  255. package/dist/hooks/useFilterSort.d.ts +60 -0
  256. package/dist/hooks/useFilterSort.js +362 -0
  257. package/dist/hooks/useFilterSort.test.d.ts +1 -0
  258. package/dist/hooks/useFilterSort.test.js +333 -0
  259. package/dist/hooks/useRealtimeSync.d.ts +1 -0
  260. package/dist/hooks/useRealtimeSync.js +24 -9
  261. package/dist/hooks/useRealtimeSync.test.js +28 -1
  262. package/dist/hooks/useSyncOrchestrator.aiProfiles.test.d.ts +1 -0
  263. package/dist/hooks/useSyncOrchestrator.aiProfiles.test.js +34 -0
  264. package/dist/hooks/useSyncOrchestrator.d.ts +65 -103
  265. package/dist/hooks/useSyncOrchestrator.js +1538 -670
  266. package/dist/hooks/useSyncOrchestrator.retry-closure.test.js +700 -174
  267. package/dist/hooks/useTaskData.d.ts +35 -0
  268. package/dist/hooks/useTaskData.js +239 -0
  269. package/dist/hooks/useTaskData.test.d.ts +1 -0
  270. package/dist/hooks/useTaskData.test.js +119 -0
  271. package/dist/hooks/useTaskMutations.d.ts +46 -0
  272. package/dist/hooks/useTaskMutations.js +472 -0
  273. package/dist/hooks/useTaskMutations.test.d.ts +1 -0
  274. package/dist/hooks/useTaskMutations.test.js +80 -0
  275. package/dist/hooks/useTaskforce.contract.test.d.ts +1 -0
  276. package/dist/hooks/useTaskforce.contract.test.js +7 -0
  277. package/dist/hooks/useTaskforce.d.ts +260 -295
  278. package/dist/hooks/useTaskforce.js +1954 -2623
  279. package/dist/hooks/useTaskforce.priority-filters.test.js +6 -11
  280. package/dist/hooks/useTaskforce.sync-behavior.test.d.ts +1 -0
  281. package/dist/hooks/useTaskforce.sync-behavior.test.js +1120 -0
  282. package/dist/hooks/useUiNotice.d.ts +16 -0
  283. package/dist/hooks/useUiNotice.js +49 -0
  284. package/dist/hooks/useWorkspaceSyncController.d.ts +23 -46
  285. package/dist/hooks/useWorkspaceSyncController.js +280 -461
  286. package/dist/hooks/useWorkspaceSyncController.test.js +106 -199
  287. package/dist/hooks/workspace/useTaskforceApiRouting.d.ts +8 -0
  288. package/dist/hooks/workspace/useTaskforceApiRouting.js +91 -0
  289. package/dist/hooks/workspace/useTaskforceApiRouting.test.d.ts +1 -0
  290. package/dist/hooks/workspace/useTaskforceApiRouting.test.js +60 -0
  291. package/dist/hooks/workspace/useWorkspaceSyncController.d.ts +1 -0
  292. package/dist/hooks/workspace/useWorkspaceSyncController.js +1 -0
  293. package/dist/hooks/workspace/workspaceLocalState.d.ts +30 -0
  294. package/dist/hooks/workspace/workspaceLocalState.js +101 -0
  295. package/dist/localization/locales/en-US.d.ts +1 -8
  296. package/dist/localization/locales/en-US.js +4 -11
  297. package/dist/localization/locales/es-419.js +2 -9
  298. package/dist/localization/locales/pt-BR.js +2 -9
  299. package/dist/localization/localizationCatalogs.test.d.ts +1 -0
  300. package/dist/localization/localizationCatalogs.test.js +37 -0
  301. package/dist/main.d.ts +1 -0
  302. package/dist/main.js +9 -15
  303. package/dist/mcp/clientIntegrations.d.ts +33 -0
  304. package/dist/mcp/clientIntegrations.js +199 -0
  305. package/dist/mcp/clientIntegrations.test.d.ts +1 -0
  306. package/dist/mcp/clientIntegrations.test.js +110 -0
  307. package/dist/mcp/index.d.ts +2 -0
  308. package/dist/mcp/index.js +2 -0
  309. package/dist/mcp/optionResolution.test.js +6 -2
  310. package/dist/mcp/runtime.d.ts +120 -0
  311. package/dist/mcp/runtime.js +5668 -0
  312. package/dist/mcp/runtime.test.d.ts +1 -0
  313. package/dist/mcp/runtime.test.js +3293 -0
  314. package/dist/mcp/server.js +2 -1793
  315. package/dist/mcp/structuredCommentValidation.test.d.ts +1 -0
  316. package/dist/{__tests__ → mcp}/structuredCommentValidation.test.js +1 -1
  317. package/dist/mcp/structuredDocValidation.js +1 -2
  318. package/dist/mcp/structuredDocValidation.test.d.ts +1 -0
  319. package/dist/{__tests__ → mcp}/structuredDocValidation.test.js +9 -4
  320. package/dist/mcp/toolRegistry.d.ts +570 -0
  321. package/dist/mcp/toolRegistry.js +90 -0
  322. package/dist/mcp/toolRegistry.test.d.ts +1 -0
  323. package/dist/mcp/toolRegistry.test.js +30 -0
  324. package/dist/migrations/billingSchemaParity.test.js +111 -0
  325. package/dist/migrations/taskSchemaMigrations.d.ts +5 -0
  326. package/dist/migrations/taskSchemaMigrations.js +681 -39
  327. package/dist/migrations/taskSchemaMigrations.test.d.ts +1 -0
  328. package/dist/migrations/taskSchemaMigrations.test.js +210 -0
  329. package/dist/plugins/vite.js +13 -7
  330. package/dist/public/apple-touch-icon.png +0 -0
  331. package/dist/public/archive/phoenix/apple-touch-icon.png +0 -0
  332. package/dist/public/archive/phoenix/favicon.ico +0 -0
  333. package/dist/public/archive/phoenix/site.webmanifest +1 -0
  334. package/dist/public/favicon-96x96.png +0 -0
  335. package/dist/public/favicon.ico +0 -0
  336. package/dist/public/favicon.svg +17 -0
  337. package/dist/public/site.webmanifest +21 -1
  338. package/dist/public/web-app-manifest-192x192.png +0 -0
  339. package/dist/public/web-app-manifest-512x512.png +0 -0
  340. package/dist/releaseVersion.test.d.ts +1 -0
  341. package/dist/{__tests__/releaseVersion.test.js → releaseVersion.test.js} +1 -1
  342. package/dist/resources/templates/WORKFLOW_V2_POLICY.md +1 -1
  343. package/dist/resources/templates/workflow-sources/workflowDocs.mjs +62 -52
  344. package/dist/resources/templates/workflows/collaborate.yaml +11 -5
  345. package/dist/resources/templates/workflows/do.yaml +8 -2
  346. package/dist/resources/templates/workflows/evaluate.yaml +13 -7
  347. package/dist/resources/templates/workflows/execute.yaml +40 -23
  348. package/dist/resources/templates/workflows/plan.yaml +15 -8
  349. package/dist/resources/templates/workflows/review.yaml +14 -8
  350. package/dist/runtime/appGateDefinitions.d.ts +32 -0
  351. package/dist/runtime/appGateDefinitions.js +32 -0
  352. package/dist/runtime/appGates.d.ts +29 -0
  353. package/dist/runtime/appGates.js +53 -0
  354. package/dist/runtime/appGates.test.d.ts +1 -0
  355. package/dist/runtime/appGates.test.js +42 -0
  356. package/dist/runtime/migrationFlags.d.ts +1 -0
  357. package/dist/runtime/migrationFlags.js +1 -0
  358. package/dist/server/annotatedAttachmentsRoutes.test.d.ts +1 -0
  359. package/dist/server/annotatedAttachmentsRoutes.test.js +473 -0
  360. package/dist/server/auth.js +14 -2
  361. package/dist/server/auth.test.js +21 -1
  362. package/dist/server/cors.js +11 -5
  363. package/dist/server/cors.test.js +6 -0
  364. package/dist/server/documentReviewRoutes.test.d.ts +1 -0
  365. package/dist/server/documentReviewRoutes.test.js +157 -0
  366. package/dist/server/index.cookieProxy.test.js +46 -1
  367. package/dist/server/index.d.ts +20 -0
  368. package/dist/server/index.js +168 -41
  369. package/dist/server/index.rateLimit.test.js +6 -0
  370. package/dist/server/index.test.js +133 -2
  371. package/dist/server/mockStripe.d.ts +72 -0
  372. package/dist/server/mockStripe.js +357 -0
  373. package/dist/server/realtimeSyncWs.js +4 -0
  374. package/dist/server/routes/admin.d.ts +114 -0
  375. package/dist/server/routes/admin.js +2226 -0
  376. package/dist/server/routes/annotatedAttachments.d.ts +24 -0
  377. package/dist/server/routes/annotatedAttachments.js +235 -0
  378. package/dist/server/routes/auth.d.ts +61 -0
  379. package/dist/server/routes/auth.js +1296 -0
  380. package/dist/server/{routes.billing.d.ts → routes/billing.d.ts} +3 -2
  381. package/dist/server/routes/billing.js +2001 -0
  382. package/dist/server/routes/billing.test.d.ts +1 -0
  383. package/dist/server/routes/billing.test.js +1631 -0
  384. package/dist/server/routes/documentReviews.d.ts +11 -0
  385. package/dist/server/routes/documentReviews.js +191 -0
  386. package/dist/server/routes/documents.d.ts +118 -0
  387. package/dist/server/routes/documents.js +1113 -0
  388. package/dist/server/routes/resources.d.ts +25 -0
  389. package/dist/server/routes/resources.js +225 -0
  390. package/dist/server/routes/shared.d.ts +35 -0
  391. package/dist/server/routes/shared.js +305 -0
  392. package/dist/server/routes/shared.test.d.ts +1 -0
  393. package/dist/server/routes/shared.test.js +32 -0
  394. package/dist/server/{routes.sync.d.ts → routes/sync.d.ts} +5 -5
  395. package/dist/server/routes/sync.integration.test.d.ts +1 -0
  396. package/dist/server/routes/sync.integration.test.js +2003 -0
  397. package/dist/server/routes/sync.js +3143 -0
  398. package/dist/server/routes/tasks.d.ts +72 -0
  399. package/dist/server/routes/tasks.js +1252 -0
  400. package/dist/server/routes/workspaces.d.ts +32 -0
  401. package/dist/server/routes/workspaces.js +307 -0
  402. package/dist/server/routes.d.ts +8 -9
  403. package/dist/server/routes.js +968 -4092
  404. package/dist/server/routes.test.js +9043 -2415
  405. package/dist/server/runtimeMode.d.ts +1 -1
  406. package/dist/server/runtimeMode.js +3 -18
  407. package/dist/server/runtimeMode.test.js +3 -3
  408. package/dist/server/securityHeaders.d.ts +1 -1
  409. package/dist/server/securityHeaders.js +65 -6
  410. package/dist/server/securityHeaders.test.js +40 -2
  411. package/dist/services/templateEngine.test.d.ts +1 -0
  412. package/dist/{__tests__ → services}/templateEngine.test.js +1 -1
  413. package/dist/services/templates.test.d.ts +1 -0
  414. package/dist/{__tests__ → services}/templates.test.js +1 -1
  415. package/dist/services/workflowDocumentFixtures.test.d.ts +1 -0
  416. package/dist/{__tests__ → services}/workflowDocumentFixtures.test.js +4 -4
  417. package/dist/services/workflowExportMatrix.test.d.ts +1 -0
  418. package/dist/{__tests__ → services}/workflowExportMatrix.test.js +1 -1
  419. package/dist/services/workflowExportSnapshots.test.d.ts +1 -0
  420. package/dist/services/workflowGeneration.test.d.ts +1 -0
  421. package/dist/services/workflowSimulation.test.d.ts +1 -0
  422. package/dist/services/workflowSimulation.test.js +113 -0
  423. package/dist/services/workflowV2Policy.test.d.ts +1 -0
  424. package/dist/{__tests__ → services}/workflowV2Policy.test.js +2 -2
  425. package/dist/shared/aiProfileSurfaceType.d.ts +9 -0
  426. package/dist/shared/aiProfileSurfaceType.js +49 -0
  427. package/dist/shared/customTaxonomyLibrary.d.ts +11 -0
  428. package/dist/shared/customTaxonomyLibrary.js +276 -0
  429. package/dist/shared/customTaxonomyLibrary.test.d.ts +1 -0
  430. package/dist/shared/customTaxonomyLibrary.test.js +20 -0
  431. package/dist/shared/taxonomyCatalog.d.ts +19 -0
  432. package/dist/shared/taxonomyCatalog.js +36 -0
  433. package/dist/shared/taxonomyDefaults.d.ts +29 -0
  434. package/dist/shared/taxonomyDefaults.js +26 -0
  435. package/dist/shared/taxonomyLibrary.d.ts +15 -0
  436. package/dist/shared/taxonomyLibrary.js +98 -0
  437. package/dist/shared/taxonomyLibrary.test.d.ts +1 -0
  438. package/dist/shared/taxonomyLibrary.test.js +26 -0
  439. package/dist/shared/taxonomyState.d.ts +36 -0
  440. package/dist/shared/taxonomyState.js +73 -0
  441. package/dist/shared/taxonomyState.test.d.ts +1 -0
  442. package/dist/shared/taxonomyState.test.js +71 -0
  443. package/dist/shared/workflowDefaults.d.ts +9 -0
  444. package/dist/shared/workflowDefaults.js +11 -0
  445. package/dist/storage/documentIntegrity.d.ts +2 -0
  446. package/dist/storage/documentIntegrity.js +34 -17
  447. package/dist/storage/documentPurge.d.ts +2 -1
  448. package/dist/storage/documentPurge.js +35 -8
  449. package/dist/storage/index.d.ts +4 -0
  450. package/dist/storage/index.js +2 -0
  451. package/dist/storage/objectStorage.d.ts +1 -1
  452. package/dist/storage/objectStorageClient.d.ts +6 -4
  453. package/dist/storage/objectStorageClient.js +77 -29
  454. package/dist/storage/objectStorageClient.test.d.ts +1 -0
  455. package/dist/storage/objectStorageClient.test.js +57 -0
  456. package/dist/storage/objectStorageConfig.js +3 -1
  457. package/dist/storage/objectStorageConfig.test.d.ts +1 -0
  458. package/dist/storage/objectStorageConfig.test.js +38 -0
  459. package/dist/storage/postgresAdapter.d.ts +5 -0
  460. package/dist/storage/postgresAdapter.js +2 -2
  461. package/dist/storage/postgresAdapter.test.d.ts +1 -0
  462. package/dist/storage/postgresAdapter.test.js +29 -0
  463. package/dist/storage/taskAssetStore.d.ts +7 -4
  464. package/dist/storage/taskAssetStore.js +65 -60
  465. package/dist/storage/workspaceAssetStore.d.ts +122 -0
  466. package/dist/storage/workspaceAssetStore.js +496 -0
  467. package/dist/storage/workspaceAssetStore.test.d.ts +1 -0
  468. package/dist/storage/workspaceAssetStore.test.js +501 -0
  469. package/dist/sync/cloudSyncApi.d.ts +33 -2
  470. package/dist/sync/cloudSyncApi.js +37 -15
  471. package/dist/sync/cloudSyncApi.test.js +60 -3
  472. package/dist/sync/index.d.ts +2 -0
  473. package/dist/sync/index.js +3 -0
  474. package/dist/sync/syncService.d.ts +25 -0
  475. package/dist/sync/syncService.js +184 -16
  476. package/dist/sync/syncService.test.js +289 -25
  477. package/dist/sync/workspaceRepair.d.ts +114 -0
  478. package/dist/sync/workspaceRepair.js +566 -0
  479. package/dist/sync/workspaceSyncModel.d.ts +230 -2
  480. package/dist/sync/workspaceSyncModel.js +456 -17
  481. package/dist/sync/workspaceSyncModel.test.js +642 -0
  482. package/dist/sync/workspaceSyncState.d.ts +12 -0
  483. package/dist/sync/workspaceSyncState.js +12 -0
  484. package/dist/sync/workspaceSyncSurface.d.ts +33 -0
  485. package/dist/sync/workspaceSyncSurface.js +74 -0
  486. package/dist/types.d.ts +143 -18
  487. package/dist/types.js +9 -24
  488. package/dist/ui/assets/AgentsModule-TVmCgizS.js +1 -0
  489. package/dist/ui/assets/AnnotatedAttachmentWorkspace-BaS2VwIr.css +1 -0
  490. package/dist/ui/assets/AnnotatedAttachmentWorkspace-CAyhnPeR.js +3 -0
  491. package/dist/ui/assets/DocumentWorkspace-BOCw5e4D.js +250 -0
  492. package/dist/ui/assets/DocumentWorkspace-C_8T8oz-.css +1 -0
  493. package/dist/ui/assets/InitiativesModule-CN0r02Oi.js +1 -0
  494. package/dist/ui/assets/PlansPage-BlVC_lRq.css +1 -0
  495. package/dist/ui/assets/PlansPage-FcQSNLZd.js +1 -0
  496. package/dist/ui/assets/TaskSettings-BwB9NtmJ.css +1 -0
  497. package/dist/ui/assets/TaskSettings-Cw5zYD1L.js +8 -0
  498. package/dist/ui/assets/WorkflowsModule-CY9R2zPB.js +5 -0
  499. package/dist/ui/assets/index-Bzqy5QGm.js +6 -0
  500. package/dist/ui/assets/index-DxRiI3tY.css +1 -0
  501. package/dist/ui/assets/vendor-dnd-DRzYolkg.js +5 -0
  502. package/dist/ui/assets/{vendor-icons-ZFG3SGwo.js → vendor-icons-QZyhEwgT.js} +1 -1
  503. package/dist/ui/assets/{vendor-markdown-CKYkQHfj.js → vendor-markdown-BUxTU7dS.js} +1 -1
  504. package/dist/ui/assets/vendor-react-CKJs5o3c.js +61 -0
  505. package/dist/ui/assets/vendor-router-BbWMxlnO.js +3 -0
  506. package/dist/ui/branding/logos/logo.png +0 -0
  507. package/dist/ui/branding/logos/logo_dark.svg +27 -0
  508. package/dist/ui/branding/logos/logo_favicon.svg +35 -0
  509. package/dist/ui/branding/logos/logo_light.svg +27 -0
  510. package/dist/ui/favicon/apple-touch-icon.png +0 -0
  511. package/dist/ui/favicon/archive/phoenix/apple-touch-icon.png +0 -0
  512. package/dist/ui/favicon/archive/phoenix/favicon.ico +0 -0
  513. package/dist/ui/favicon/archive/phoenix/site.webmanifest +1 -0
  514. package/dist/ui/favicon/favicon-96x96.png +0 -0
  515. package/dist/ui/favicon/favicon.ico +0 -0
  516. package/dist/ui/favicon/favicon.svg +17 -0
  517. package/dist/ui/favicon/site.webmanifest +21 -1
  518. package/dist/ui/favicon/web-app-manifest-192x192.png +0 -0
  519. package/dist/ui/favicon/web-app-manifest-512x512.png +0 -0
  520. package/dist/ui/index.html +10 -7
  521. package/dist/ui/product/screen_01.png +0 -0
  522. package/dist/ui/product/screen_02.png +0 -0
  523. package/dist/ui/product/screen_03.png +0 -0
  524. package/dist/utils/annotatedAttachments.d.ts +20 -0
  525. package/dist/utils/annotatedAttachments.js +74 -0
  526. package/dist/utils/annotatedAttachments.test.d.ts +1 -0
  527. package/dist/utils/annotatedAttachments.test.js +108 -0
  528. package/dist/utils/assignees.d.ts +26 -0
  529. package/dist/utils/assignees.js +132 -0
  530. package/dist/utils/canonicalAssetKind.d.ts +16 -0
  531. package/dist/utils/canonicalAssetKind.js +39 -0
  532. package/dist/utils/canonicalAssetKind.test.d.ts +1 -0
  533. package/dist/utils/canonicalAssetKind.test.js +24 -0
  534. package/dist/utils/coalescedRefresh.d.ts +5 -0
  535. package/dist/utils/coalescedRefresh.js +16 -0
  536. package/dist/utils/coalescedRefresh.test.d.ts +1 -0
  537. package/dist/utils/coalescedRefresh.test.js +30 -0
  538. package/dist/utils/constants.d.ts +16 -3
  539. package/dist/utils/constants.icons.test.js +2 -1
  540. package/dist/utils/constants.js +70 -13
  541. package/dist/utils/contextAssetEvents.d.ts +7 -0
  542. package/dist/utils/contextAssetEvents.js +6 -0
  543. package/dist/utils/contextFiles.d.ts +14 -3
  544. package/dist/utils/contextFiles.js +40 -8
  545. package/dist/utils/documentManagerApi.d.ts +6 -0
  546. package/dist/utils/documentManagerApi.js +19 -0
  547. package/dist/utils/documentNames.d.ts +24 -0
  548. package/dist/utils/documentNames.js +91 -0
  549. package/dist/utils/documentReferences.d.ts +9 -0
  550. package/dist/utils/documentReferences.js +11 -0
  551. package/dist/utils/entityReferences.d.ts +9 -0
  552. package/dist/utils/entityReferences.js +32 -0
  553. package/dist/utils/imageReferences.d.ts +9 -0
  554. package/dist/utils/imageReferences.js +11 -0
  555. package/dist/utils/planParser.d.ts +2 -2
  556. package/dist/utils/planParser.js +11 -11
  557. package/dist/utils/planParser.test.d.ts +1 -0
  558. package/dist/{__tests__ → utils}/planParser.test.js +22 -22
  559. package/dist/utils/planningReferences.d.ts +17 -0
  560. package/dist/utils/planningReferences.js +30 -0
  561. package/dist/utils/planningReferences.test.d.ts +1 -0
  562. package/dist/utils/planningReferences.test.js +17 -0
  563. package/dist/utils/taskActivity.d.ts +9 -0
  564. package/dist/utils/taskActivity.js +147 -0
  565. package/dist/utils/taskActivity.test.d.ts +1 -0
  566. package/dist/utils/taskActivity.test.js +34 -0
  567. package/dist/utils/taskDraftDefaults.d.ts +21 -0
  568. package/dist/utils/taskDraftDefaults.js +40 -0
  569. package/dist/utils/taskDraftDefaults.test.d.ts +1 -0
  570. package/dist/utils/taskDraftDefaults.test.js +34 -0
  571. package/dist/utils/taskNormalization.d.ts +25 -0
  572. package/dist/utils/taskNormalization.js +161 -0
  573. package/dist/utils/taskNormalization.test.d.ts +1 -0
  574. package/dist/utils/taskNormalization.test.js +158 -0
  575. package/dist/utils/taskReferences.d.ts +5 -0
  576. package/dist/utils/taskReferences.js +11 -0
  577. package/dist/utils/taskforceApiClient.d.ts +2 -0
  578. package/dist/utils/taskforceApiClient.js +101 -3
  579. package/dist/utils/taskforceApiClient.test.d.ts +1 -0
  580. package/dist/utils/taskforceApiClient.test.js +44 -0
  581. package/dist/utils/taxonomyFilterOptions.d.ts +2 -0
  582. package/dist/utils/taxonomyFilterOptions.js +17 -0
  583. package/dist/utils/taxonomyFormDefaults.d.ts +3 -0
  584. package/dist/utils/taxonomyFormDefaults.js +28 -0
  585. package/dist/utils/taxonomyFormDefaults.test.d.ts +1 -0
  586. package/dist/utils/taxonomyFormDefaults.test.js +63 -0
  587. package/dist/utils/taxonomyLifecycle.d.ts +3 -0
  588. package/dist/utils/taxonomyLifecycle.js +17 -0
  589. package/dist/utils/taxonomySorting.d.ts +7 -0
  590. package/dist/utils/taxonomySorting.js +74 -0
  591. package/dist/utils/theme.d.ts +15 -0
  592. package/dist/utils/theme.js +23 -0
  593. package/dist/utils/uiNotice.d.ts +7 -0
  594. package/dist/utils/uiNotice.js +6 -0
  595. package/dist/utils/uiNotice.test.d.ts +1 -0
  596. package/dist/utils/uiNotice.test.js +18 -0
  597. package/dist/utils/workspaceIdentity.d.ts +14 -0
  598. package/dist/utils/workspaceIdentity.js +21 -0
  599. package/dist/utils/workspaceIdentity.test.js +30 -1
  600. package/dist/utils/workspaceSyncPresentation.d.ts +20 -0
  601. package/dist/utils/workspaceSyncPresentation.js +21 -0
  602. package/dist/utils/workspaceSyncPresentation.test.d.ts +1 -0
  603. package/dist/utils/workspaceSyncPresentation.test.js +36 -0
  604. package/package.json +28 -23
  605. package/scripts/bootstrap-playwright-auth.mjs +155 -0
  606. package/scripts/check-compat-boundaries.mjs +41 -0
  607. package/scripts/check-env.ts +9 -2
  608. package/scripts/debug-login.mjs +32 -0
  609. package/scripts/migrate-planning-model.ts +233 -0
  610. package/scripts/migrate-task-data-assets.mjs +408 -0
  611. package/scripts/playwright-auth.sh +11 -0
  612. package/scripts/run-dev-proxy.sh +2 -0
  613. package/scripts/update-homebrew-formula.sh +2 -2
  614. package/scripts/with-esbuild.sh +11 -0
  615. package/src/resources/templates/WORKFLOW_V2_POLICY.md +1 -1
  616. package/src/resources/templates/workflow-sources/workflowDocs.mjs +62 -52
  617. package/src/resources/templates/workflows/collaborate.yaml +11 -5
  618. package/src/resources/templates/workflows/do.yaml +8 -2
  619. package/src/resources/templates/workflows/evaluate.yaml +13 -7
  620. package/src/resources/templates/workflows/execute.yaml +40 -23
  621. package/src/resources/templates/workflows/plan.yaml +15 -8
  622. package/src/resources/templates/workflows/review.yaml +14 -8
  623. package/dist/TaskforceScreenshot.d.ts +0 -11
  624. package/dist/TaskforceScreenshot.js +0 -113
  625. package/dist/compat/priorityCompat.d.ts +0 -2
  626. package/dist/compat/priorityCompat.js +0 -24
  627. package/dist/components/features/settings/TaxonomyManager 2.d.ts +0 -52
  628. package/dist/components/features/settings/TaxonomyManager 2.js +0 -75
  629. package/dist/components/task/TaskKanban 2.d.ts +0 -76
  630. package/dist/components/task/TaskKanban 2.js +0 -1004
  631. package/dist/components/task/TaskScreenshotSection.d.ts +0 -15
  632. package/dist/components/task/TaskScreenshotSection.js +0 -22
  633. package/dist/components/views/StandaloneLayout 2.d.ts +0 -8
  634. package/dist/components/views/StandaloneLayout 2.js +0 -1660
  635. package/dist/core/InitiativeTemplates.test.js +0 -50
  636. package/dist/core/ParentLifecycle.test.js +0 -98
  637. package/dist/migrations/clientMigrations.d.ts +0 -9
  638. package/dist/migrations/clientMigrations.js +0 -74
  639. package/dist/migrations/flags.d.ts +0 -6
  640. package/dist/migrations/flags.js +0 -8
  641. package/dist/migrations/taskMigrations.d.ts +0 -71
  642. package/dist/migrations/taskMigrations.js +0 -236
  643. package/dist/migrations/taskMigrations.test.js +0 -34
  644. package/dist/server/routes.billing.js +0 -991
  645. package/dist/server/routes.billing.test.js +0 -387
  646. package/dist/server/routes.sync.integration.test.js +0 -470
  647. package/dist/server/routes.sync.js +0 -1141
  648. package/dist/soak/syncSoakHarness.d.ts +0 -6
  649. package/dist/soak/syncSoakHarness.js +0 -10
  650. package/dist/ui/assets/index-0W5vyCpn.css +0 -1
  651. package/dist/ui/assets/index-MCZuNNfn.js +0 -23
  652. package/dist/ui/assets/logo_white_01-0Vx-iIIv.png +0 -0
  653. package/dist/ui/assets/vendor-dnd-BI1K77C1.js +0 -5
  654. package/dist/ui/assets/vendor-react-DdIDsh7f.js +0 -9
  655. package/dist/ui/assets/vendor-router-BtiNU7Dl.js +0 -3
  656. package/dist/utils/taskHierarchy.d.ts +0 -4
  657. package/dist/utils/taskHierarchy.js +0 -69
  658. package/dist/utils/taskHierarchy.test.js +0 -38
  659. package/dist/utils/taskParenting.d.ts +0 -3
  660. package/dist/utils/taskParenting.js +0 -24
  661. package/dist/utils/taskParenting.test.js +0 -21
  662. package/dist/utils/taskRelations.d.ts +0 -6
  663. package/dist/utils/taskRelations.js +0 -24
  664. package/dist/utils/taskRelations.test.js +0 -34
  665. package/scripts/check-compat-boundaries.js +0 -48
  666. /package/dist/{__tests__/planParser.test.d.ts → TaskforceCore.filter-persistence.test.d.ts} +0 -0
  667. /package/dist/{__tests__/releaseVersion.test.d.ts → TaskforceCore.routing.test.d.ts} +0 -0
  668. /package/dist/{__tests__/structuredCommentValidation.test.d.ts → annotatedAttachments/AnnotatedAttachmentSessionStore.test.d.ts} +0 -0
  669. /package/dist/{__tests__/structuredDocValidation.test.d.ts → annotatedAttachments/payload.test.d.ts} +0 -0
  670. /package/dist/{__tests__/templateEngine.test.d.ts → annotatedAttachments/types.js} +0 -0
  671. /package/dist/{__tests__/templates.test.d.ts → compat/workspaceSyncCompat.test.d.ts} +0 -0
  672. /package/dist/{__tests__/workflowDocumentFixtures.test.d.ts → components/features/AgentsModule.test.d.ts} +0 -0
  673. /package/dist/{__tests__/workflowExportMatrix.test.d.ts → components/features/AnnotatedAttachmentWorkspace.test.d.ts} +0 -0
  674. /package/dist/{__tests__/workflowExportSnapshots.test.d.ts → components/features/DocumentWorkspace.test.d.ts} +0 -0
  675. /package/dist/{__tests__/workflowGeneration.test.d.ts → components/features/settings/TaxonomyLibraryManager.test.d.ts} +0 -0
  676. /package/dist/{__tests__/workflowV2Policy.test.d.ts → components/task/TaskActionHeader.test.d.ts} +0 -0
  677. /package/dist/{core/InitiativeTemplates.test.d.ts → components/task/TaskKanban.planning-drop.test.d.ts} +0 -0
  678. /package/dist/{core/ParentLifecycle.test.d.ts → components/task/TaskStatusActions.test.d.ts} +0 -0
  679. /package/dist/{migrations/taskMigrations.test.d.ts → components/ui/TopNoticeLayer.test.d.ts} +0 -0
  680. /package/dist/{server/routes.billing.test.d.ts → components/views/AppShellHeader.test.d.ts} +0 -0
  681. /package/dist/{server/routes.sync.integration.test.d.ts → components/views/PlanComparisonPage.test.d.ts} +0 -0
  682. /package/dist/{utils/taskHierarchy.test.d.ts → components/views/chrome/WorkspaceChromeSections.test.d.ts} +0 -0
  683. /package/dist/{utils/taskParenting.test.d.ts → components/views/chrome/workspaceChrome.test.d.ts} +0 -0
  684. /package/dist/{utils/taskRelations.test.d.ts → components/views/panels/DocumentFilterToolbar.test.d.ts} +0 -0
  685. /package/dist/public/{android-chrome-192x192.png → archive/phoenix/android-chrome-192x192.png} +0 -0
  686. /package/dist/public/{android-chrome-512x512.png → archive/phoenix/android-chrome-512x512.png} +0 -0
  687. /package/dist/public/{favicon-16x16.png → archive/phoenix/favicon-16x16.png} +0 -0
  688. /package/dist/public/{favicon-32x32.png → archive/phoenix/favicon-32x32.png} +0 -0
  689. /package/dist/public/{favicon.png → archive/phoenix/favicon.png} +0 -0
  690. /package/dist/{__tests__ → services}/workflowExportSnapshots.test.js +0 -0
  691. /package/dist/{__tests__ → services}/workflowGeneration.test.js +0 -0
  692. /package/dist/ui/favicon/{android-chrome-192x192.png → archive/phoenix/android-chrome-192x192.png} +0 -0
  693. /package/dist/ui/favicon/{android-chrome-512x512.png → archive/phoenix/android-chrome-512x512.png} +0 -0
  694. /package/dist/ui/favicon/{favicon-16x16.png → archive/phoenix/favicon-16x16.png} +0 -0
  695. /package/dist/ui/favicon/{favicon-32x32.png → archive/phoenix/favicon-32x32.png} +0 -0
  696. /package/dist/ui/favicon/{favicon.png → archive/phoenix/favicon.png} +0 -0
@@ -0,0 +1,11 @@
1
+ import type { DatabaseAdapter } from '../storage/databaseAdapter.js';
2
+ import type { WorkspaceDeleteSummary } from './types.js';
3
+ export interface WorkspaceLifecycleServiceDeps {
4
+ db: DatabaseAdapter;
5
+ tenantId: string;
6
+ createRuleError: (message: string, statusCode?: number, code?: string) => Error;
7
+ revokeMcpCredentialsForWorkspace: (workspaceId: string, revokedByUserId?: string | null) => void;
8
+ }
9
+ export declare function deleteWorkspaceService(deps: WorkspaceLifecycleServiceDeps, input: {
10
+ workspaceId: string;
11
+ }): WorkspaceDeleteSummary;
@@ -0,0 +1,88 @@
1
+ export function deleteWorkspaceService(deps, input) {
2
+ const normalizedWorkspaceId = String(input.workspaceId || '').trim();
3
+ if (!normalizedWorkspaceId) {
4
+ throw deps.createRuleError('workspaceId is required', 400, 'WORKSPACE_ID_REQUIRED');
5
+ }
6
+ if (normalizedWorkspaceId.toLowerCase() === 'default') {
7
+ throw deps.createRuleError('workspaceId "default" is reserved.', 400, 'WORKSPACE_ID_RESERVED');
8
+ }
9
+ const tx = deps.db.transaction(() => {
10
+ const workspace = deps.db.prepare(`
11
+ SELECT id
12
+ FROM workspaces
13
+ WHERE tenant_id = ? AND id = ?
14
+ LIMIT 1
15
+ `).get(deps.tenantId, normalizedWorkspaceId);
16
+ if (!workspace?.id) {
17
+ throw deps.createRuleError('Workspace not found', 404, 'WORKSPACE_NOT_FOUND');
18
+ }
19
+ deps.revokeMcpCredentialsForWorkspace(normalizedWorkspaceId, 'system');
20
+ const deletedTaskRows = deps.db.prepare(`
21
+ SELECT id
22
+ FROM tasks
23
+ WHERE tenant_id = ? AND workspace_id = ?
24
+ `).all(deps.tenantId, normalizedWorkspaceId);
25
+ const deletedTaskIds = deletedTaskRows
26
+ .map((row) => String(row.id || '').trim())
27
+ .filter(Boolean);
28
+ const deletedDocumentRows = deps.db.prepare(`
29
+ SELECT path
30
+ FROM workspace_documents
31
+ WHERE tenant_id = ? AND workspace_id = ?
32
+ `).all(deps.tenantId, normalizedWorkspaceId);
33
+ const deletedDocumentPaths = deletedDocumentRows
34
+ .map((row) => String(row.path || '').trim())
35
+ .filter(Boolean);
36
+ const deletedAssetRows = deps.db.prepare(`
37
+ SELECT path, provider, workspace_id
38
+ FROM task_assets
39
+ WHERE tenant_id = ? AND workspace_id = ?
40
+ `).all(deps.tenantId, normalizedWorkspaceId);
41
+ const deletedAssets = deletedAssetRows
42
+ .map((row) => {
43
+ const path = String(row.path || '').trim();
44
+ if (!path)
45
+ return null;
46
+ return {
47
+ path,
48
+ provider: String(row.provider || '').toLowerCase() === 'r2' ? 'r2' : 'local',
49
+ workspaceId: String(row.workspace_id || normalizedWorkspaceId).trim() || normalizedWorkspaceId
50
+ };
51
+ })
52
+ .filter((row) => Boolean(row));
53
+ const counts = {};
54
+ const runDelete = (tableName, sql, ...params) => {
55
+ const result = deps.db.prepare(sql).run(...params);
56
+ counts[tableName] = Number(result?.changes || 0);
57
+ };
58
+ deps.db.prepare(`
59
+ UPDATE tasks
60
+ SET parent_task_id = NULL
61
+ WHERE tenant_id = ? AND workspace_id = ? AND parent_task_id IS NOT NULL
62
+ `).run(deps.tenantId, normalizedWorkspaceId);
63
+ runDelete('comments', 'DELETE FROM comments WHERE tenant_id = ? AND workspace_id = ?', deps.tenantId, normalizedWorkspaceId);
64
+ runDelete('task_events', 'DELETE FROM task_events WHERE tenant_id = ? AND workspace_id = ?', deps.tenantId, normalizedWorkspaceId);
65
+ runDelete('deleted_tasks', 'DELETE FROM deleted_tasks WHERE tenant_id = ? AND workspace_id = ?', deps.tenantId, normalizedWorkspaceId);
66
+ runDelete('workspace_sync_deletes', 'DELETE FROM workspace_sync_deletes WHERE tenant_id = ? AND workspace_id = ?', deps.tenantId, normalizedWorkspaceId);
67
+ runDelete('sync_idempotency', 'DELETE FROM sync_idempotency WHERE tenant_id = ? AND workspace_id = ?', deps.tenantId, normalizedWorkspaceId);
68
+ runDelete('sync_events', 'DELETE FROM sync_events WHERE tenant_id = ? AND workspace_id = ?', deps.tenantId, normalizedWorkspaceId);
69
+ runDelete('ui_state', 'DELETE FROM ui_state WHERE tenant_id = ? AND workspace_id = ?', deps.tenantId, normalizedWorkspaceId);
70
+ runDelete('workspace_settings', 'DELETE FROM workspace_settings WHERE tenant_id = ? AND workspace_id = ?', deps.tenantId, normalizedWorkspaceId);
71
+ runDelete('admin_audit_logs', 'DELETE FROM admin_audit_logs WHERE tenant_id = ? AND workspace_id = ?', deps.tenantId, normalizedWorkspaceId);
72
+ runDelete('auth_tokens', 'DELETE FROM auth_tokens WHERE tenant_id = ? AND workspace_id = ?', deps.tenantId, normalizedWorkspaceId);
73
+ runDelete('workspace_documents', 'DELETE FROM workspace_documents WHERE tenant_id = ? AND workspace_id = ?', deps.tenantId, normalizedWorkspaceId);
74
+ runDelete('ai_profiles', 'DELETE FROM ai_profiles WHERE tenant_id = ? AND workspace_id = ?', deps.tenantId, normalizedWorkspaceId);
75
+ runDelete('task_assets', 'DELETE FROM task_assets WHERE tenant_id = ? AND workspace_id = ?', deps.tenantId, normalizedWorkspaceId);
76
+ runDelete('tasks', 'DELETE FROM tasks WHERE tenant_id = ? AND workspace_id = ?', deps.tenantId, normalizedWorkspaceId);
77
+ runDelete('workspace_memberships', 'DELETE FROM workspace_memberships WHERE tenant_id = ? AND workspace_id = ?', deps.tenantId, normalizedWorkspaceId);
78
+ runDelete('workspaces', 'DELETE FROM workspaces WHERE tenant_id = ? AND id = ?', deps.tenantId, normalizedWorkspaceId);
79
+ return {
80
+ deletedWorkspaceId: normalizedWorkspaceId,
81
+ deletedTaskIds,
82
+ deletedDocumentPaths,
83
+ deletedAssets,
84
+ counts
85
+ };
86
+ });
87
+ return tx();
88
+ }
@@ -148,4 +148,99 @@ describe('TaskforceCore workspace permission invariants', () => {
148
148
  cleanup();
149
149
  }
150
150
  });
151
+ it('clears active task assignments when a workspace user is disabled', () => {
152
+ const { core, cleanup } = makeCore();
153
+ try {
154
+ core.createWorkspace({ workspaceId: 'workspace-1', name: 'Workspace 1' });
155
+ core.ensureBootstrapUserAccess({
156
+ userId: 'owner-1',
157
+ workspaceId: 'workspace-1',
158
+ role: 'owner',
159
+ email: 'owner@example.com'
160
+ });
161
+ core.ensureBootstrapUserAccess({
162
+ userId: 'member-1',
163
+ workspaceId: 'workspace-1',
164
+ role: 'member',
165
+ email: 'member@example.com'
166
+ });
167
+ const active = core.createTask({ title: 'Assigned Active', assignee: 'member-1' }, { workspaceId: 'workspace-1' });
168
+ const archived = core.createTask({ title: 'Assigned Archived', assignee: 'member-1' }, { workspaceId: 'workspace-1' });
169
+ core.bulkArchive([archived.id], false, 'workspace-1');
170
+ expect(core.setWorkspaceUserDisabled('member-1', 'workspace-1', true)).toBe(true);
171
+ expect(core.getTask(active.id, 'workspace-1')?.assignee).toBe('unassigned');
172
+ expect(core.listArchive('workspace-1').archived.find((task) => task.id === archived.id)?.assignee).toBe('member-1');
173
+ }
174
+ finally {
175
+ cleanup();
176
+ }
177
+ });
178
+ it('clears active task assignments when a workspace user is removed', () => {
179
+ const { core, cleanup } = makeCore();
180
+ try {
181
+ core.createWorkspace({ workspaceId: 'workspace-1', name: 'Workspace 1' });
182
+ core.ensureBootstrapUserAccess({
183
+ userId: 'owner-1',
184
+ workspaceId: 'workspace-1',
185
+ role: 'owner',
186
+ email: 'owner@example.com'
187
+ });
188
+ core.ensureBootstrapUserAccess({
189
+ userId: 'member-1',
190
+ workspaceId: 'workspace-1',
191
+ role: 'member',
192
+ email: 'member@example.com'
193
+ });
194
+ const active = core.createTask({ title: 'Assigned Active', assignee: 'member-1' }, { workspaceId: 'workspace-1' });
195
+ expect(core.removeWorkspaceUser('member-1', 'workspace-1')).toBe(true);
196
+ expect(core.getTask(active.id, 'workspace-1')?.assignee).toBe('unassigned');
197
+ }
198
+ finally {
199
+ cleanup();
200
+ }
201
+ });
202
+ it('preserves existing workspace members when sync receives a partial member snapshot', () => {
203
+ const { core, cleanup } = makeCore();
204
+ try {
205
+ core.createWorkspace({ workspaceId: 'workspace-1', name: 'Workspace 1' });
206
+ core.ensureBootstrapUserAccess({
207
+ userId: 'owner-1',
208
+ workspaceId: 'workspace-1',
209
+ role: 'owner',
210
+ email: 'owner@example.com'
211
+ });
212
+ core.ensureBootstrapUserAccess({
213
+ userId: 'member-1',
214
+ workspaceId: 'workspace-1',
215
+ role: 'member',
216
+ email: 'member1@example.com'
217
+ });
218
+ core.ensureBootstrapUserAccess({
219
+ userId: 'member-2',
220
+ workspaceId: 'workspace-1',
221
+ role: 'member',
222
+ email: 'member2@example.com'
223
+ });
224
+ core.replaceWorkspaceUsersForSync({
225
+ workspaceId: 'workspace-1',
226
+ users: [
227
+ {
228
+ userId: 'owner-1',
229
+ email: 'owner@example.com',
230
+ displayName: 'Owner One',
231
+ role: 'owner',
232
+ permissionMode: 'read-write',
233
+ betaAccess: true,
234
+ status: 'active',
235
+ disabled: false
236
+ }
237
+ ]
238
+ });
239
+ const users = core.listWorkspaceUsers('workspace-1');
240
+ expect(users.map((user) => user.userId)).toEqual(expect.arrayContaining(['owner-1', 'member-1', 'member-2']));
241
+ }
242
+ finally {
243
+ cleanup();
244
+ }
245
+ });
151
246
  });
@@ -7,10 +7,38 @@ function makeProjectRoot() {
7
7
  return fs.mkdtempSync(path.join(os.tmpdir(), 'taskforce-plan-mode-'));
8
8
  }
9
9
  function openCore(projectRoot) {
10
- return new TaskforceCore({
10
+ const core = new TaskforceCore({
11
11
  projectRoot,
12
12
  storagePath: path.join(projectRoot, '.taskforce')
13
13
  });
14
+ const db = core.db;
15
+ const now = new Date().toISOString();
16
+ const addFreeMapping = (planVersionId) => {
17
+ db.prepare(`
18
+ INSERT OR IGNORE INTO billing_price_mappings (
19
+ tenant_id, plan_version_id, billing_interval, stripe_price_id, pricing_type, active, unit_amount, currency, created_at, updated_at
20
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
21
+ `).run('default', planVersionId, 'month', `free:${planVersionId}:month`, 'free', 1, 0, null, now, now);
22
+ };
23
+ core.upsertPlanCatalog({ planId: 'starter', displayName: 'Starter' });
24
+ addFreeMapping('starter-v1');
25
+ core.upsertPlanCatalog({ planId: 'starter', displayName: 'Starter', status: 'active' });
26
+ core.upsertPlanCatalog({ planId: 'collab', displayName: 'Collab' });
27
+ addFreeMapping('collab-v1');
28
+ core.upsertPlanCatalog({ planId: 'collab', displayName: 'Collab', status: 'active' });
29
+ core.updatePlanVersion({
30
+ planId: 'collab',
31
+ versionNumber: 1,
32
+ seatLimit: 5
33
+ });
34
+ core.updatePlanVersionFeatures({
35
+ planVersionId: 'collab-v1',
36
+ features: [
37
+ { featureKey: 'collaboration.invites', access: 'enabled' },
38
+ { featureKey: 'collaboration.team_management', access: 'enabled' }
39
+ ]
40
+ });
41
+ return core;
14
42
  }
15
43
  describe('TaskforceCore account-level plan mode and invite revoke', () => {
16
44
  it('derives workspace plan mode from owner account plan across all owned workspaces', () => {
@@ -101,4 +129,89 @@ describe('TaskforceCore account-level plan mode and invite revoke', () => {
101
129
  fs.rmSync(projectRoot, { recursive: true, force: true });
102
130
  }
103
131
  });
132
+ it('classifies invited placeholder users as new users and registered users as existing users', () => {
133
+ const projectRoot = makeProjectRoot();
134
+ const core = openCore(projectRoot);
135
+ try {
136
+ core.createWorkspace({ workspaceId: 'workspace-invite', name: 'Invite Workspace' });
137
+ core.ensureBootstrapUserAccess({
138
+ userId: 'user-new',
139
+ workspaceId: 'workspace-invite',
140
+ role: 'member',
141
+ email: 'new@example.com'
142
+ });
143
+ core.ensurePasswordUser({
144
+ email: 'existing@example.com',
145
+ password: 'Password123!',
146
+ workspaceId: 'workspace-invite',
147
+ role: 'member'
148
+ });
149
+ const inviteNew = core.requestInviteAcceptance({ userId: 'user-new', workspaceId: 'workspace-invite' });
150
+ const inspectNew = core.inspectInviteAcceptance(String(inviteNew.token));
151
+ expect(inspectNew.inviteeKind).toBe('new_user');
152
+ expect(inspectNew.passwordRequired).toBe(true);
153
+ const existingUserId = core.resolveUserIdentity('user-new')?.userId;
154
+ expect(existingUserId).toBe('user-new');
155
+ const existingLookup = core.db.prepare(`
156
+ SELECT id FROM users WHERE tenant_id = ? AND email = ? LIMIT 1
157
+ `).get('default', 'existing@example.com');
158
+ const inviteExisting = core.requestInviteAcceptance({ userId: String(existingLookup?.id || ''), workspaceId: 'workspace-invite' });
159
+ const inspectExisting = core.inspectInviteAcceptance(String(inviteExisting.token));
160
+ expect(inspectExisting.inviteeKind).toBe('existing_user');
161
+ expect(inspectExisting.passwordRequired).toBe(false);
162
+ }
163
+ finally {
164
+ core.close();
165
+ fs.rmSync(projectRoot, { recursive: true, force: true });
166
+ }
167
+ });
168
+ it('joins invite for existing authenticated users without changing their password hash', () => {
169
+ const projectRoot = makeProjectRoot();
170
+ const core = openCore(projectRoot);
171
+ try {
172
+ core.createWorkspace({ workspaceId: 'workspace-invite', name: 'Invite Workspace' });
173
+ core.ensureBootstrapUserAccess({
174
+ userId: 'owner-user',
175
+ workspaceId: 'workspace-invite',
176
+ role: 'owner',
177
+ email: 'owner@example.com'
178
+ });
179
+ core.setUserAccountPlanMode('owner-user', 'team');
180
+ const existing = core.ensurePasswordUser({
181
+ email: 'existing@example.com',
182
+ password: 'Password123!',
183
+ workspaceId: 'workspace-invite',
184
+ role: 'member'
185
+ });
186
+ core.setWorkspaceUserDisabled(existing.userId, 'workspace-invite', true);
187
+ const db = core.db;
188
+ db.prepare(`
189
+ UPDATE workspace_memberships
190
+ SET status = 'invited'
191
+ WHERE tenant_id = ? AND user_id = ? AND workspace_id = ?
192
+ `).run('default', existing.userId, 'workspace-invite');
193
+ const before = db.prepare(`
194
+ SELECT password_hash FROM users WHERE tenant_id = ? AND id = ? LIMIT 1
195
+ `).get('default', existing.userId);
196
+ const invite = core.requestInviteAcceptance({ userId: existing.userId, workspaceId: 'workspace-invite' });
197
+ const accepted = core.joinInviteWithAuthenticatedUser({
198
+ token: String(invite.token),
199
+ userId: existing.userId
200
+ });
201
+ const after = db.prepare(`
202
+ SELECT password_hash FROM users WHERE tenant_id = ? AND id = ? LIMIT 1
203
+ `).get('default', existing.userId);
204
+ const membership = db.prepare(`
205
+ SELECT status FROM workspace_memberships WHERE tenant_id = ? AND user_id = ? AND workspace_id = ? LIMIT 1
206
+ `).get('default', existing.userId, 'workspace-invite');
207
+ expect(accepted.workspaceId).toBe('workspace-invite');
208
+ expect(before?.password_hash).toBeTruthy();
209
+ expect(after?.password_hash).toBe(before?.password_hash);
210
+ expect(membership?.status).toBe('active');
211
+ }
212
+ finally {
213
+ core.close();
214
+ fs.rmSync(projectRoot, { recursive: true, force: true });
215
+ }
216
+ });
104
217
  });
@@ -0,0 +1,41 @@
1
+ import type { DatabaseAdapter } from '../storage/databaseAdapter.js';
2
+ import type { UserGlobalSyncSettings } from './types.js';
3
+ export type WorkspaceSyncSettingsPayloadLike = Record<string, Record<string, unknown>>;
4
+ export interface UserWorkspaceRecordLike {
5
+ id?: string | null;
6
+ }
7
+ export interface WorkspacePreferenceServiceDeps {
8
+ db: DatabaseAdapter;
9
+ tenantId: string;
10
+ createRuleError: (message: string, statusCode?: number, code?: string) => Error;
11
+ getGlobalSettingsStore: () => DatabaseAdapter;
12
+ ensureStructuredSettingsTables: (store: DatabaseAdapter) => void;
13
+ writeSettingsPayloadRow: (store: DatabaseAdapter, tableName: 'user_preferences' | 'workspace_settings', identity: [string, string, string], payload: Record<string, unknown>, updatedAt: string) => void;
14
+ listUserWorkspaces: (userId: string) => UserWorkspaceRecordLike[];
15
+ workspaceSyncSettingsAllowlist: Set<string>;
16
+ }
17
+ export declare function sanitizeUserGlobalSyncSettingsService(input: unknown): UserGlobalSyncSettings;
18
+ export declare function getUserGlobalSyncSettingsService(deps: WorkspacePreferenceServiceDeps, userId: string): {
19
+ settings: UserGlobalSyncSettings;
20
+ updatedAt: string | null;
21
+ };
22
+ export declare function upsertUserGlobalSyncSettingsService(deps: WorkspacePreferenceServiceDeps, userId: string, settings: unknown, updatedAt?: string | null): {
23
+ settings: UserGlobalSyncSettings;
24
+ updatedAt: string;
25
+ applied: boolean;
26
+ };
27
+ export declare function sanitizeWorkspaceShareableSyncSettingsService(allowlist: Set<string>, input: unknown): WorkspaceSyncSettingsPayloadLike;
28
+ export declare function getWorkspaceShareableSyncSettingsService(deps: WorkspacePreferenceServiceDeps, workspaceId: string): {
29
+ settings: WorkspaceSyncSettingsPayloadLike;
30
+ updatedAt: string | null;
31
+ };
32
+ export declare function upsertWorkspaceShareableSyncSettingsService(deps: WorkspacePreferenceServiceDeps, workspaceId: string, settings: unknown, updatedAt?: string | null): {
33
+ settings: WorkspaceSyncSettingsPayloadLike;
34
+ updatedAt: string | null;
35
+ applied: boolean;
36
+ };
37
+ export declare function resolvePreferredWorkspaceIdService(deps: WorkspacePreferenceServiceDeps, allowDefault: boolean): string | null;
38
+ export declare function resolvePreferredUserWorkspaceIdService(deps: WorkspacePreferenceServiceDeps, userId: string, options?: {
39
+ preferredWorkspaceId?: string | null;
40
+ persistedWorkspaceId?: string | null;
41
+ }): string | null;
@@ -0,0 +1,246 @@
1
+ import { normalizeTaskforceTheme } from '../utils/theme.js';
2
+ export function sanitizeUserGlobalSyncSettingsService(input) {
3
+ const source = input && typeof input === 'object' ? input : {};
4
+ const next = {};
5
+ const theme = normalizeTaskforceTheme(source.theme);
6
+ if (theme) {
7
+ next.theme = theme;
8
+ }
9
+ const operatingMode = typeof source.operatingMode === 'string' ? source.operatingMode.trim() : '';
10
+ if (operatingMode === 'core' || operatingMode === 'operations') {
11
+ next.operatingMode = operatingMode;
12
+ }
13
+ const localizationRaw = source.localization && typeof source.localization === 'object'
14
+ ? source.localization
15
+ : null;
16
+ if (localizationRaw) {
17
+ const localization = {};
18
+ const locale = typeof localizationRaw.locale === 'string' ? localizationRaw.locale.trim() : '';
19
+ if (locale) {
20
+ localization.locale = locale;
21
+ }
22
+ const weekStartsOn = typeof localizationRaw.weekStartsOn === 'string'
23
+ ? localizationRaw.weekStartsOn.trim().toLowerCase()
24
+ : '';
25
+ if (weekStartsOn === 'sunday' || weekStartsOn === 'monday') {
26
+ localization.weekStartsOn = weekStartsOn;
27
+ }
28
+ if (Object.keys(localization).length > 0) {
29
+ next.localization = localization;
30
+ }
31
+ }
32
+ return next;
33
+ }
34
+ export function getUserGlobalSyncSettingsService(deps, userId) {
35
+ const normalizedUserId = String(userId || '').trim();
36
+ if (!normalizedUserId) {
37
+ return { settings: {}, updatedAt: null };
38
+ }
39
+ const store = deps.getGlobalSettingsStore();
40
+ deps.ensureStructuredSettingsTables(store);
41
+ try {
42
+ const row = store.prepare(`
43
+ SELECT payload, updated_at
44
+ FROM user_preferences
45
+ WHERE tenant_id = ? AND user_id = ? AND prefs_key = ?
46
+ LIMIT 1
47
+ `).get(deps.tenantId, normalizedUserId, 'cloud_sync_global');
48
+ if (!row?.payload) {
49
+ return { settings: {}, updatedAt: null };
50
+ }
51
+ const parsed = JSON.parse(row.payload);
52
+ return {
53
+ settings: sanitizeUserGlobalSyncSettingsService(parsed),
54
+ updatedAt: typeof row.updated_at === 'string' ? row.updated_at : null
55
+ };
56
+ }
57
+ catch {
58
+ return { settings: {}, updatedAt: null };
59
+ }
60
+ }
61
+ export function upsertUserGlobalSyncSettingsService(deps, userId, settings, updatedAt) {
62
+ const normalizedUserId = String(userId || '').trim();
63
+ if (!normalizedUserId) {
64
+ throw deps.createRuleError('userId is required', 400, 'USER_ID_REQUIRED');
65
+ }
66
+ const sanitized = sanitizeUserGlobalSyncSettingsService(settings);
67
+ const current = getUserGlobalSyncSettingsService(deps, normalizedUserId);
68
+ const incomingUpdatedAt = typeof updatedAt === 'string' && updatedAt.trim().length > 0
69
+ ? updatedAt.trim()
70
+ : null;
71
+ const incomingMs = incomingUpdatedAt ? Date.parse(incomingUpdatedAt) : NaN;
72
+ const currentMs = current.updatedAt ? Date.parse(current.updatedAt) : NaN;
73
+ if (incomingUpdatedAt
74
+ && Number.isFinite(incomingMs)
75
+ && Number.isFinite(currentMs)
76
+ && incomingMs <= currentMs) {
77
+ return {
78
+ settings: current.settings,
79
+ updatedAt: current.updatedAt || new Date().toISOString(),
80
+ applied: false
81
+ };
82
+ }
83
+ const now = Number.isFinite(incomingMs) && incomingUpdatedAt
84
+ ? incomingUpdatedAt
85
+ : new Date().toISOString();
86
+ const store = deps.getGlobalSettingsStore();
87
+ deps.ensureStructuredSettingsTables(store);
88
+ deps.writeSettingsPayloadRow(store, 'user_preferences', [deps.tenantId, normalizedUserId, 'cloud_sync_global'], sanitized, now);
89
+ return {
90
+ settings: sanitized,
91
+ updatedAt: now,
92
+ applied: true
93
+ };
94
+ }
95
+ export function sanitizeWorkspaceShareableSyncSettingsService(allowlist, input) {
96
+ if (!input || typeof input !== 'object' || Array.isArray(input)) {
97
+ return {};
98
+ }
99
+ const source = input;
100
+ const next = {};
101
+ for (const key of allowlist) {
102
+ const rawValue = source[key];
103
+ if (!rawValue || typeof rawValue !== 'object' || Array.isArray(rawValue))
104
+ continue;
105
+ next[key] = { ...rawValue };
106
+ }
107
+ return next;
108
+ }
109
+ export function getWorkspaceShareableSyncSettingsService(deps, workspaceId) {
110
+ const normalizedWorkspaceId = String(workspaceId || '').trim() || 'default';
111
+ const store = deps.getGlobalSettingsStore();
112
+ deps.ensureStructuredSettingsTables(store);
113
+ if (deps.workspaceSyncSettingsAllowlist.size === 0) {
114
+ return { settings: {}, updatedAt: null };
115
+ }
116
+ try {
117
+ const rows = store.prepare(`
118
+ SELECT settings_key, payload, updated_at
119
+ FROM workspace_settings
120
+ WHERE tenant_id = ? AND workspace_id = ?
121
+ `).all(deps.tenantId, normalizedWorkspaceId);
122
+ const settings = {};
123
+ let latestUpdatedAt = null;
124
+ for (const row of rows) {
125
+ const key = String(row?.settings_key || '').trim();
126
+ if (!deps.workspaceSyncSettingsAllowlist.has(key) || !row?.payload)
127
+ continue;
128
+ try {
129
+ const parsed = JSON.parse(row.payload);
130
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
131
+ continue;
132
+ settings[key] = parsed;
133
+ const rowUpdatedAt = typeof row.updated_at === 'string' ? row.updated_at : null;
134
+ if (rowUpdatedAt && (!latestUpdatedAt || rowUpdatedAt > latestUpdatedAt)) {
135
+ latestUpdatedAt = rowUpdatedAt;
136
+ }
137
+ }
138
+ catch {
139
+ continue;
140
+ }
141
+ }
142
+ return { settings, updatedAt: latestUpdatedAt };
143
+ }
144
+ catch {
145
+ return { settings: {}, updatedAt: null };
146
+ }
147
+ }
148
+ export function upsertWorkspaceShareableSyncSettingsService(deps, workspaceId, settings, updatedAt) {
149
+ const normalizedWorkspaceId = String(workspaceId || '').trim() || 'default';
150
+ if (!normalizedWorkspaceId) {
151
+ throw deps.createRuleError('workspaceId is required', 400, 'WORKSPACE_ID_REQUIRED');
152
+ }
153
+ const sanitized = sanitizeWorkspaceShareableSyncSettingsService(deps.workspaceSyncSettingsAllowlist, settings);
154
+ if (deps.workspaceSyncSettingsAllowlist.size === 0) {
155
+ return { settings: {}, updatedAt: null, applied: false };
156
+ }
157
+ const current = getWorkspaceShareableSyncSettingsService(deps, normalizedWorkspaceId);
158
+ const incomingUpdatedAt = typeof updatedAt === 'string' && updatedAt.trim().length > 0
159
+ ? updatedAt.trim()
160
+ : null;
161
+ const incomingMs = incomingUpdatedAt ? Date.parse(incomingUpdatedAt) : NaN;
162
+ const currentMs = current.updatedAt ? Date.parse(current.updatedAt) : NaN;
163
+ if (incomingUpdatedAt
164
+ && Number.isFinite(incomingMs)
165
+ && Number.isFinite(currentMs)
166
+ && incomingMs <= currentMs) {
167
+ return {
168
+ settings: current.settings,
169
+ updatedAt: current.updatedAt,
170
+ applied: false
171
+ };
172
+ }
173
+ const now = Number.isFinite(incomingMs) && incomingUpdatedAt
174
+ ? incomingUpdatedAt
175
+ : new Date().toISOString();
176
+ const store = deps.getGlobalSettingsStore();
177
+ deps.ensureStructuredSettingsTables(store);
178
+ const tx = store.transaction(() => {
179
+ for (const key of deps.workspaceSyncSettingsAllowlist) {
180
+ const payload = sanitized[key];
181
+ if (!payload)
182
+ continue;
183
+ deps.writeSettingsPayloadRow(store, 'workspace_settings', [deps.tenantId, normalizedWorkspaceId, key], payload, now);
184
+ }
185
+ });
186
+ tx();
187
+ return {
188
+ settings: getWorkspaceShareableSyncSettingsService(deps, normalizedWorkspaceId).settings,
189
+ updatedAt: now,
190
+ applied: true
191
+ };
192
+ }
193
+ export function resolvePreferredWorkspaceIdService(deps, allowDefault) {
194
+ const taskRows = deps.db.prepare(`
195
+ SELECT workspace_id, COUNT(*) AS task_count, MAX(COALESCE(updated_at, created_at)) AS latest_activity
196
+ FROM tasks
197
+ WHERE tenant_id = ?
198
+ GROUP BY workspace_id
199
+ ORDER BY task_count DESC, latest_activity DESC
200
+ `).all(deps.tenantId);
201
+ const taskWorkspaceIds = taskRows
202
+ .map((row) => String(row.workspace_id || '').trim())
203
+ .filter((value) => value.length > 0);
204
+ const nonDefaultTaskWorkspaceIds = taskWorkspaceIds.filter((id) => id !== 'default');
205
+ if (nonDefaultTaskWorkspaceIds.length >= 1)
206
+ return nonDefaultTaskWorkspaceIds[0];
207
+ const workspaceRows = deps.db.prepare(`
208
+ SELECT id, updated_at
209
+ FROM workspaces
210
+ WHERE tenant_id = ?
211
+ ORDER BY updated_at DESC, created_at DESC
212
+ `).all(deps.tenantId);
213
+ const workspaceIds = workspaceRows
214
+ .map((row) => String(row.id || '').trim())
215
+ .filter((value) => value.length > 0);
216
+ const nonDefaultWorkspaceIds = workspaceIds.filter((id) => id !== 'default');
217
+ if (nonDefaultWorkspaceIds.length >= 1)
218
+ return nonDefaultWorkspaceIds[0];
219
+ if (!allowDefault)
220
+ return null;
221
+ if (taskWorkspaceIds.includes('default'))
222
+ return 'default';
223
+ if (workspaceIds.includes('default'))
224
+ return 'default';
225
+ return null;
226
+ }
227
+ export function resolvePreferredUserWorkspaceIdService(deps, userId, options) {
228
+ const normalizedUserId = String(userId || '').trim();
229
+ if (!normalizedUserId || normalizedUserId === 'anonymous')
230
+ return null;
231
+ const workspaces = deps.listUserWorkspaces(normalizedUserId);
232
+ if (workspaces.length === 0)
233
+ return null;
234
+ const accessibleIds = new Set(workspaces
235
+ .map((workspace) => String(workspace.id || '').trim())
236
+ .filter(Boolean));
237
+ const preferredWorkspaceId = String(options?.preferredWorkspaceId || '').trim();
238
+ if (preferredWorkspaceId && accessibleIds.has(preferredWorkspaceId)) {
239
+ return preferredWorkspaceId;
240
+ }
241
+ const persistedWorkspaceId = String(options?.persistedWorkspaceId || '').trim();
242
+ if (persistedWorkspaceId && accessibleIds.has(persistedWorkspaceId)) {
243
+ return persistedWorkspaceId;
244
+ }
245
+ return String(workspaces[0]?.id || '').trim() || null;
246
+ }
@@ -0,0 +1 @@
1
+ export {};