@taskforcehq/taskforce 0.3.326 → 0.3.328

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 (1382) hide show
  1. package/LICENSE.md +68 -0
  2. package/README.md +19 -0
  3. package/dist/Taskforce.module.css +2168 -585
  4. package/dist/TaskforceCore.d.ts +1 -0
  5. package/dist/TaskforceCore.js +65 -22
  6. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.d.ts +1 -0
  7. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.js +3 -2
  8. package/dist/annotatedAttachments/commandService.d.ts +68 -0
  9. package/dist/annotatedAttachments/commandService.js +348 -0
  10. package/dist/annotatedAttachments/service.d.ts +2 -0
  11. package/dist/annotatedAttachments/service.js +13 -12
  12. package/dist/cli.js +158 -9
  13. package/dist/cliOpenPort.d.ts +1 -0
  14. package/dist/cliOpenPort.js +4 -0
  15. package/dist/compat/taskforceAgentDefinitionCompat.d.ts +12 -0
  16. package/dist/compat/taskforceAgentDefinitionCompat.js +25 -0
  17. package/dist/compat/workspaceSyncCompat.js +6 -2
  18. package/dist/compat/workspaceSyncV3CombinedCoverageCompat.d.ts +6 -0
  19. package/dist/compat/workspaceSyncV3CombinedCoverageCompat.js +22 -0
  20. package/dist/compat/workspaceSyncV3OperationCompat.d.ts +7 -0
  21. package/dist/compat/workspaceSyncV3OperationCompat.js +30 -0
  22. package/dist/components/activity/EntityActivityTimeline.d.ts +10 -2
  23. package/dist/components/activity/EntityActivityTimeline.js +83 -35
  24. package/dist/components/context/AttachmentPreviewHost.d.ts +6 -0
  25. package/dist/components/context/AttachmentPreviewHost.js +222 -0
  26. package/dist/components/context/ContextAttachmentManager.d.ts +7 -0
  27. package/dist/components/context/ContextAttachmentManager.js +514 -208
  28. package/dist/components/features/AiProfilesModule.d.ts +24 -0
  29. package/dist/components/features/AiProfilesModule.js +744 -0
  30. package/dist/components/features/AnnotatedAttachmentWorkspace.d.ts +4 -1
  31. package/dist/components/features/AnnotatedAttachmentWorkspace.js +351 -79
  32. package/dist/components/features/DocumentGenerateModal.js +23 -5
  33. package/dist/components/features/DocumentIndex.d.ts +19 -1
  34. package/dist/components/features/DocumentIndex.js +104 -15
  35. package/dist/components/features/DocumentViewer.d.ts +9 -1
  36. package/dist/components/features/DocumentViewer.js +721 -100
  37. package/dist/components/features/DocumentWorkspace.d.ts +37 -2
  38. package/dist/components/features/DocumentWorkspace.js +21 -6
  39. package/dist/components/features/TaskSettings.d.ts +6 -27
  40. package/dist/components/features/TaskSettings.js +232 -143
  41. package/dist/components/features/TaskforceAgentsModule.d.ts +36 -0
  42. package/dist/components/features/TaskforceAgentsModule.js +1782 -0
  43. package/dist/components/features/agentBehavior/AgentBehaviorManagerShared.d.ts +94 -0
  44. package/dist/components/features/agentBehavior/AgentBehaviorManagerShared.js +70 -0
  45. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +65 -0
  46. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.js +115 -0
  47. package/dist/components/features/agentRoles/RoleManagerPanel.d.ts +4 -0
  48. package/dist/components/features/agentRoles/RoleManagerPanel.js +382 -0
  49. package/dist/components/features/agentSkills/SkillManagerPanel.d.ts +5 -0
  50. package/dist/components/features/agentSkills/SkillManagerPanel.js +355 -0
  51. package/dist/components/features/documentWorkspaceModel.d.ts +16 -4
  52. package/dist/components/features/documentWorkspaceModel.js +30 -5
  53. package/dist/components/features/planning/PlanningArchiveConfirmation.d.ts +9 -0
  54. package/dist/components/features/planning/PlanningArchiveConfirmation.js +19 -0
  55. package/dist/components/features/planning/PlanningCardIdentity.d.ts +12 -0
  56. package/dist/components/features/planning/PlanningCardIdentity.js +44 -0
  57. package/dist/components/features/planning/PlanningEntityDetails.d.ts +36 -0
  58. package/dist/components/features/planning/PlanningEntityDetails.js +131 -0
  59. package/dist/components/features/planning/PlanningEntitySummary.d.ts +46 -0
  60. package/dist/components/features/planning/PlanningEntitySummary.js +98 -0
  61. package/dist/components/features/planning/PlanningLinkPicker.d.ts +11 -0
  62. package/dist/components/features/planning/PlanningLinkPicker.js +28 -0
  63. package/dist/components/features/planning/PlanningModule.d.ts +6 -0
  64. package/dist/components/features/planning/PlanningModule.js +588 -0
  65. package/dist/components/features/planning/PlanningOwnerDropdown.d.ts +27 -0
  66. package/dist/components/features/planning/PlanningOwnerDropdown.js +80 -0
  67. package/dist/components/features/planning/PlanningTaskArrangeControl.d.ts +5 -0
  68. package/dist/components/features/planning/PlanningTaskArrangeControl.js +11 -0
  69. package/dist/components/features/planning/PlanningTaskCard.d.ts +20 -0
  70. package/dist/components/features/planning/PlanningTaskCard.js +26 -0
  71. package/dist/components/features/planning/PlanningTaskOrderList.d.ts +10 -0
  72. package/dist/components/features/planning/PlanningTaskOrderList.js +52 -0
  73. package/dist/components/features/planning/PlanningUnlinkConfirmation.d.ts +15 -0
  74. package/dist/components/features/planning/PlanningUnlinkConfirmation.js +7 -0
  75. package/dist/components/features/planning/PlanningVisualIdentity.d.ts +14 -0
  76. package/dist/components/features/planning/PlanningVisualIdentity.js +106 -0
  77. package/dist/components/features/planning/planningCreateIntent.d.ts +10 -0
  78. package/dist/components/features/planning/planningCreateIntent.js +16 -0
  79. package/dist/components/features/planning/planningNavigator.d.ts +33 -0
  80. package/dist/components/features/planning/planningNavigator.js +96 -0
  81. package/dist/components/features/planning/planningTaskArrangement.d.ts +18 -0
  82. package/dist/components/features/planning/planningTaskArrangement.js +106 -0
  83. package/dist/components/features/planning/planningWorkspaceModel.d.ts +132 -0
  84. package/dist/components/features/planning/planningWorkspaceModel.js +5 -0
  85. package/dist/components/features/settings/CategoryManager.js +2 -2
  86. package/dist/components/features/settings/TaxonomyEditor.js +1 -1
  87. package/dist/components/features/settings/TaxonomyManager.js +1 -1
  88. package/dist/components/features/settings/TypeManager.js +1 -1
  89. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.d.ts +10 -0
  90. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +175 -0
  91. package/dist/components/features/taskforceAgentAssignments/agentBehaviorCatalogApi.d.ts +27 -0
  92. package/dist/components/features/taskforceAgentAssignments/agentBehaviorCatalogApi.js +24 -0
  93. package/dist/components/features/taskforceAgentEditorModel.d.ts +109 -0
  94. package/dist/components/features/taskforceAgentEditorModel.js +145 -0
  95. package/dist/components/features/useDocumentWorkspaceController.d.ts +20 -1
  96. package/dist/components/features/useDocumentWorkspaceController.js +106 -21
  97. package/dist/components/features/workflowManager/WorkflowManagerModule.d.ts +11 -0
  98. package/dist/components/features/workflowManager/WorkflowManagerModule.js +313 -0
  99. package/dist/components/features/workflowManager/WorkflowPublishDialog.d.ts +11 -0
  100. package/dist/components/features/workflowManager/WorkflowPublishDialog.js +8 -0
  101. package/dist/components/features/workflowManager/types.d.ts +74 -0
  102. package/dist/components/features/workflowManager/types.js +1 -0
  103. package/dist/components/features/workflowManager/useWorkflowManager.d.ts +30 -0
  104. package/dist/components/features/workflowManager/useWorkflowManager.js +213 -0
  105. package/dist/components/features/workflowManager/workflowManagerApi.d.ts +52 -0
  106. package/dist/components/features/workflowManager/workflowManagerApi.js +142 -0
  107. package/dist/components/task/TaskActionHeader.d.ts +7 -3
  108. package/dist/components/task/TaskActionHeader.js +46 -53
  109. package/dist/components/task/TaskCard.d.ts +10 -2
  110. package/dist/components/task/TaskCard.js +138 -56
  111. package/dist/components/task/TaskContextUpload.d.ts +4 -0
  112. package/dist/components/task/TaskContextUpload.js +3 -2
  113. package/dist/components/task/TaskForm.d.ts +16 -17
  114. package/dist/components/task/TaskForm.js +569 -199
  115. package/dist/components/task/TaskImageReviews.d.ts +8 -0
  116. package/dist/components/task/TaskImageReviews.js +47 -0
  117. package/dist/components/task/TaskKanban.d.ts +9 -10
  118. package/dist/components/task/TaskKanban.js +70 -18
  119. package/dist/components/task/TaskList.d.ts +9 -8
  120. package/dist/components/task/TaskList.js +46 -32
  121. package/dist/components/task/TaskReferenceBadge.d.ts +2 -1
  122. package/dist/components/task/TaskReferenceBadge.js +3 -2
  123. package/dist/components/task/TaskStatusActions.d.ts +3 -1
  124. package/dist/components/task/TaskStatusActions.js +27 -7
  125. package/dist/components/task/TaskWorkflowAssignmentField.d.ts +18 -0
  126. package/dist/components/task/TaskWorkflowAssignmentField.js +362 -0
  127. package/dist/components/task/TaskWorkstreamPicker.d.ts +8 -0
  128. package/dist/components/task/TaskWorkstreamPicker.js +25 -0
  129. package/dist/components/task/TrashRestoreControls.d.ts +18 -0
  130. package/dist/components/task/TrashRestoreControls.js +71 -0
  131. package/dist/components/ui/AiIdentityRosterCard.d.ts +20 -0
  132. package/dist/components/ui/AiIdentityRosterCard.js +5 -0
  133. package/dist/components/ui/AssetTraySortControl.d.ts +10 -0
  134. package/dist/components/ui/AssetTraySortControl.js +38 -0
  135. package/dist/components/ui/AssigneeIdentity.d.ts +12 -0
  136. package/dist/components/ui/AssigneeIdentity.js +41 -0
  137. package/dist/components/ui/DiscardChangesDialog.d.ts +10 -0
  138. package/dist/components/ui/DiscardChangesDialog.js +7 -0
  139. package/dist/components/ui/DisclosureSectionHeader.d.ts +4 -1
  140. package/dist/components/ui/DisclosureSectionHeader.js +2 -2
  141. package/dist/components/ui/DocumentTypeIcon.d.ts +7 -0
  142. package/dist/components/ui/DocumentTypeIcon.js +8 -0
  143. package/dist/components/ui/EditableAvatarButton.d.ts +6 -1
  144. package/dist/components/ui/EditableAvatarButton.js +6 -5
  145. package/dist/components/ui/HierarchyActionBadge.d.ts +2 -1
  146. package/dist/components/ui/HierarchyActionBadge.js +2 -2
  147. package/dist/components/ui/Markdown.d.ts +13 -3
  148. package/dist/components/ui/Markdown.fixture.d.ts +1 -0
  149. package/dist/components/ui/Markdown.fixture.js +23 -0
  150. package/dist/components/ui/Markdown.js +158 -68
  151. package/dist/components/ui/Modal.d.ts +3 -1
  152. package/dist/components/ui/Modal.js +85 -19
  153. package/dist/components/ui/MultiSelectFilter.d.ts +9 -2
  154. package/dist/components/ui/MultiSelectFilter.js +26 -5
  155. package/dist/components/ui/ReferenceBadgeButton.js +2 -3
  156. package/dist/components/ui/TaxonomyDropdown.d.ts +18 -1
  157. package/dist/components/ui/TaxonomyDropdown.js +177 -59
  158. package/dist/components/ui/TopNoticeLayer.d.ts +2 -1
  159. package/dist/components/ui/TopNoticeLayer.js +5 -2
  160. package/dist/components/ui/useFallbackImageUrl.d.ts +4 -0
  161. package/dist/components/ui/useFallbackImageUrl.js +20 -0
  162. package/dist/components/views/AppShellHeader.js +2 -2
  163. package/dist/components/views/StandaloneLayout.d.ts +1 -0
  164. package/dist/components/views/StandaloneLayout.js +1717 -600
  165. package/dist/components/views/WidgetView.d.ts +1 -0
  166. package/dist/components/views/WidgetView.js +99 -31
  167. package/dist/components/views/chrome/WorkspaceChromeSections.d.ts +4 -2
  168. package/dist/components/views/chrome/WorkspaceChromeSections.js +3 -6
  169. package/dist/components/views/chrome/workspaceChrome.d.ts +5 -8
  170. package/dist/components/views/chrome/workspaceChrome.js +62 -27
  171. package/dist/components/views/panels/FilterToolbar.d.ts +4 -3
  172. package/dist/components/views/panels/FilterToolbar.js +8 -5
  173. package/dist/components/views/panels/FilterToolbarControls.d.ts +11 -2
  174. package/dist/components/views/panels/FilterToolbarControls.js +35 -20
  175. package/dist/components/views/panels/PlanningDrawer.d.ts +66 -49
  176. package/dist/components/views/panels/PlanningDrawer.js +983 -314
  177. package/dist/components/views/planningScope.js +7 -1
  178. package/dist/components/views/standalone/modals/AccountSettingsModal.d.ts +62 -0
  179. package/dist/components/views/standalone/modals/AccountSettingsModal.js +197 -0
  180. package/dist/components/views/standalone/modals/AvatarImageManagerModal.d.ts +7 -2
  181. package/dist/components/views/standalone/modals/AvatarImageManagerModal.js +56 -9
  182. package/dist/components/views/standalone/modals/HelpModal.d.ts +1 -2
  183. package/dist/components/views/standalone/modals/HelpModal.js +3 -4
  184. package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +8 -9
  185. package/dist/components/views/standalone/modals/SyncStatusModal.js +85 -25
  186. package/dist/components/views/standalone/modals/TeamManagementModal.js +1 -1
  187. package/dist/config/applicationBaseUrl.d.ts +2 -0
  188. package/dist/config/applicationBaseUrl.js +23 -0
  189. package/dist/config/envSchema.d.ts +1 -1
  190. package/dist/config/envSchema.js +167 -5
  191. package/dist/config/localServiceCloudTarget.d.ts +10 -0
  192. package/dist/config/localServiceCloudTarget.js +76 -0
  193. package/dist/core/AdminAuditRetentionService.d.ts +43 -0
  194. package/dist/core/AdminAuditRetentionService.js +126 -0
  195. package/dist/core/AiProfileService.d.ts +35 -0
  196. package/dist/core/AiProfileService.js +511 -251
  197. package/dist/core/AttachmentLinkService.d.ts +10 -2
  198. package/dist/core/AttachmentLinkService.js +50 -15
  199. package/dist/core/AuthIdentityService.d.ts +6 -0
  200. package/dist/core/AuthIdentityService.js +38 -0
  201. package/dist/core/AuthTokenService.d.ts +1 -0
  202. package/dist/core/AuthTokenService.js +13 -0
  203. package/dist/core/DeletedTaskLifecycleService.d.ts +8 -2
  204. package/dist/core/DeletedTaskLifecycleService.js +145 -38
  205. package/dist/core/GlobalSettingsService.d.ts +3 -1
  206. package/dist/core/GlobalSettingsService.js +30 -4
  207. package/dist/core/InitiativeDurableMutationService.d.ts +89 -0
  208. package/dist/core/InitiativeDurableMutationService.js +187 -0
  209. package/dist/core/McpTokenService.d.ts +5 -0
  210. package/dist/core/McpTokenService.js +91 -13
  211. package/dist/core/PlanningCommandPreparationService.d.ts +60 -0
  212. package/dist/core/PlanningCommandPreparationService.js +149 -0
  213. package/dist/core/ScheduleCommandService.d.ts +76 -0
  214. package/dist/core/ScheduleCommandService.js +165 -0
  215. package/dist/core/SyncReconciliationService.d.ts +29 -6
  216. package/dist/core/SyncReconciliationService.js +256 -84
  217. package/dist/core/TaskActivityService.d.ts +22 -2
  218. package/dist/core/TaskActivityService.js +177 -29
  219. package/dist/core/TaskAttachmentLinksDurableMutationService.d.ts +36 -0
  220. package/dist/core/TaskAttachmentLinksDurableMutationService.js +240 -0
  221. package/dist/core/TaskChecklistCommandService.d.ts +50 -0
  222. package/dist/core/TaskChecklistCommandService.js +111 -0
  223. package/dist/core/TaskDurableCreateMutationService.d.ts +38 -0
  224. package/dist/core/TaskDurableCreateMutationService.js +85 -0
  225. package/dist/core/TaskDurableDeleteMutationService.d.ts +47 -0
  226. package/dist/core/TaskDurableDeleteMutationService.js +54 -0
  227. package/dist/core/TaskDurableLifecycleMutationService.d.ts +38 -0
  228. package/dist/core/TaskDurableLifecycleMutationService.js +42 -0
  229. package/dist/core/TaskDurableRelationshipMutationService.d.ts +58 -0
  230. package/dist/core/TaskDurableRelationshipMutationService.js +66 -0
  231. package/dist/core/TaskDurableRestoreMutationService.d.ts +31 -0
  232. package/dist/core/TaskDurableRestoreMutationService.js +33 -0
  233. package/dist/core/TaskDurableStatusMutationService.d.ts +74 -0
  234. package/dist/core/TaskDurableStatusMutationService.js +247 -0
  235. package/dist/core/TaskDurableSyncMutationService.d.ts +34 -0
  236. package/dist/core/TaskDurableSyncMutationService.js +70 -0
  237. package/dist/core/TaskDurableWorkflowMutationService.d.ts +48 -0
  238. package/dist/core/TaskDurableWorkflowMutationService.js +59 -0
  239. package/dist/core/TaskLifecycleCommandService.d.ts +101 -0
  240. package/dist/core/TaskLifecycleCommandService.js +161 -0
  241. package/dist/core/TaskRootCommandPreparationService.d.ts +35 -0
  242. package/dist/core/TaskRootCommandPreparationService.js +103 -0
  243. package/dist/core/Taskforce.d.ts +542 -60
  244. package/dist/core/Taskforce.js +4220 -905
  245. package/dist/core/WorkflowAssignmentService.d.ts +40 -0
  246. package/dist/core/WorkflowAssignmentService.js +158 -0
  247. package/dist/core/WorkflowExecutionService.d.ts +69 -0
  248. package/dist/core/WorkflowExecutionService.js +342 -0
  249. package/dist/core/WorkflowTaskActivationService.d.ts +32 -0
  250. package/dist/core/WorkflowTaskActivationService.js +63 -0
  251. package/dist/core/WorkflowTemplateService.d.ts +64 -0
  252. package/dist/core/WorkflowTemplateService.js +223 -0
  253. package/dist/core/WorkspaceLifecycleService.d.ts +1 -0
  254. package/dist/core/WorkspaceLifecycleService.js +18 -0
  255. package/dist/core/WorkstreamDurableMutationService.d.ts +90 -0
  256. package/dist/core/WorkstreamDurableMutationService.js +184 -0
  257. package/dist/core/planningReferencePolicy.d.ts +14 -0
  258. package/dist/core/planningReferencePolicy.js +53 -0
  259. package/dist/core/taskReferencePolicy.js +24 -3
  260. package/dist/core/types.d.ts +12 -11
  261. package/dist/documentReviews/DocumentReviewCommentStore.d.ts +33 -2
  262. package/dist/documentReviews/DocumentReviewCommentStore.js +125 -8
  263. package/dist/documentReviews/commandService.d.ts +51 -0
  264. package/dist/documentReviews/commandService.js +63 -0
  265. package/dist/documentReviews/service.d.ts +24 -1
  266. package/dist/documentReviews/service.js +354 -49
  267. package/dist/documentReviews/types.d.ts +18 -1
  268. package/dist/hooks/sync/bootstrap.d.ts +3 -7
  269. package/dist/hooks/sync/bootstrap.js +6 -14
  270. package/dist/hooks/sync/browserSyncAuthority.d.ts +21 -0
  271. package/dist/hooks/sync/browserSyncAuthority.js +70 -0
  272. package/dist/hooks/sync/browserSyncRemoteServices.d.ts +29 -0
  273. package/dist/hooks/sync/browserSyncRemoteServices.js +58 -0
  274. package/dist/hooks/sync/controlPlane.d.ts +1 -37
  275. package/dist/hooks/sync/controlPlane.js +1 -78
  276. package/dist/hooks/sync/lifecyclePolicy.d.ts +1 -45
  277. package/dist/hooks/sync/lifecyclePolicy.js +1 -93
  278. package/dist/hooks/sync/orchestratorShared.d.ts +9 -3
  279. package/dist/hooks/sync/orchestratorShared.js +70 -96
  280. package/dist/hooks/sync/pullLifecycle.d.ts +1 -31
  281. package/dist/hooks/sync/pullLifecycle.js +1 -24
  282. package/dist/hooks/sync/realtime.d.ts +4 -1
  283. package/dist/hooks/sync/realtime.js +103 -3
  284. package/dist/hooks/sync/recovery.d.ts +1 -84
  285. package/dist/hooks/sync/recovery.js +1 -245
  286. package/dist/hooks/sync/transfers.d.ts +8 -129
  287. package/dist/hooks/sync/transfers.js +19 -581
  288. package/dist/hooks/sync/useDataVersionRefresh.d.ts +6 -1
  289. package/dist/hooks/sync/useDataVersionRefresh.js +127 -12
  290. package/dist/hooks/sync/useDurableLocalOutboxDrain.d.ts +14 -0
  291. package/dist/hooks/sync/useDurableLocalOutboxDrain.js +208 -0
  292. package/dist/hooks/sync/useDurableTaskCreateMutation.d.ts +15 -0
  293. package/dist/hooks/sync/useDurableTaskCreateMutation.js +152 -0
  294. package/dist/hooks/sync/useDurableTaskDeleteMutation.d.ts +11 -0
  295. package/dist/hooks/sync/useDurableTaskDeleteMutation.js +21 -0
  296. package/dist/hooks/sync/useDurableTaskLifecycleMutation.d.ts +12 -0
  297. package/dist/hooks/sync/useDurableTaskLifecycleMutation.js +22 -0
  298. package/dist/hooks/sync/useDurableTaskMetadataMutation.d.ts +14 -0
  299. package/dist/hooks/sync/useDurableTaskMetadataMutation.js +24 -0
  300. package/dist/hooks/sync/useDurableTaskRestoreMutation.d.ts +12 -0
  301. package/dist/hooks/sync/useDurableTaskRestoreMutation.js +24 -0
  302. package/dist/hooks/sync/useDurableTaskStatusMutation.d.ts +18 -0
  303. package/dist/hooks/sync/useDurableTaskStatusMutation.js +23 -0
  304. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +23 -0
  305. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +414 -0
  306. package/dist/hooks/sync/useSyncStatusActions.d.ts +2 -1
  307. package/dist/hooks/sync/useSyncStatusActions.js +8 -3
  308. package/dist/hooks/tasks/taskHttpMutation.d.ts +25 -0
  309. package/dist/hooks/tasks/taskHttpMutation.js +134 -0
  310. package/dist/hooks/tasks/useCurrentTaskRelations.d.ts +6 -1
  311. package/dist/hooks/tasks/useCurrentTaskRelations.js +32 -6
  312. package/dist/hooks/tasks/useTaskEditorNavigation.d.ts +4 -3
  313. package/dist/hooks/tasks/useTaskEditorNavigation.js +9 -13
  314. package/dist/hooks/tasks/useTaskFormActions.d.ts +20 -2
  315. package/dist/hooks/tasks/useTaskFormActions.js +339 -59
  316. package/dist/hooks/tasks/useTaskReferenceContract.d.ts +5 -0
  317. package/dist/hooks/tasks/useTaskReferenceContract.js +17 -0
  318. package/dist/hooks/tasks/useTaskRelationships.d.ts +1 -3
  319. package/dist/hooks/tasks/useTaskRelationships.js +5 -25
  320. package/dist/hooks/tasks/useTrashSelection.d.ts +12 -0
  321. package/dist/hooks/tasks/useTrashSelection.js +49 -0
  322. package/dist/hooks/ui/useInitiativeTemplates.d.ts +24 -0
  323. package/dist/hooks/ui/useInitiativeTemplates.js +22 -0
  324. package/dist/hooks/ui/useSettingsModel.d.ts +5 -29
  325. package/dist/hooks/ui/useSettingsModel.js +31 -15
  326. package/dist/hooks/ui/useSettingsPersistence.d.ts +0 -1
  327. package/dist/hooks/ui/useSettingsPersistence.js +4 -8
  328. package/dist/hooks/ui/useSettingsTaxonomyManagement.js +31 -0
  329. package/dist/hooks/useFilterSort.d.ts +2 -2
  330. package/dist/hooks/useFilterSort.js +19 -15
  331. package/dist/hooks/useRealtimeSync.d.ts +10 -0
  332. package/dist/hooks/useRealtimeSync.js +57 -4
  333. package/dist/hooks/useSyncOrchestrator.d.ts +32 -1
  334. package/dist/hooks/useSyncOrchestrator.js +963 -287
  335. package/dist/hooks/useTaskData.d.ts +11 -2
  336. package/dist/hooks/useTaskData.js +59 -26
  337. package/dist/hooks/useTaskMutations.d.ts +42 -5
  338. package/dist/hooks/useTaskMutations.js +750 -125
  339. package/dist/hooks/useTaskforce.d.ts +79 -74
  340. package/dist/hooks/useTaskforce.js +1205 -450
  341. package/dist/hooks/useUiNotice.d.ts +5 -1
  342. package/dist/hooks/useUiNotice.js +13 -2
  343. package/dist/hooks/useWorkspaceSyncController.d.ts +9 -0
  344. package/dist/hooks/useWorkspaceSyncController.js +159 -17
  345. package/dist/hooks/workspace/usePersistedAppUiState.d.ts +74 -0
  346. package/dist/hooks/workspace/usePersistedAppUiState.js +325 -0
  347. package/dist/hooks/workspace/usePersistedLayoutUiState.d.ts +76 -0
  348. package/dist/hooks/workspace/usePersistedLayoutUiState.js +479 -0
  349. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.d.ts +2 -7
  350. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +42 -31
  351. package/dist/hooks/workspace/workspaceLocalState.d.ts +17 -6
  352. package/dist/hooks/workspace/workspaceLocalState.js +175 -5
  353. package/dist/hooks/workstreams/workstreamHttpMutation.d.ts +23 -0
  354. package/dist/hooks/workstreams/workstreamHttpMutation.js +134 -0
  355. package/dist/localization/locales/en-US.d.ts +3 -3
  356. package/dist/localization/locales/en-US.js +3 -3
  357. package/dist/localization/locales/es-419.js +3 -3
  358. package/dist/localization/locales/pt-BR.js +3 -3
  359. package/dist/mcp/adminWorkspaceRegistrar.js +2 -30
  360. package/dist/mcp/aiProfileBootstrap.d.ts +3 -0
  361. package/dist/mcp/aiProfileBootstrap.js +4 -0
  362. package/dist/mcp/canonicalAssetHelpers.d.ts +29 -4
  363. package/dist/mcp/canonicalAssetHelpers.js +138 -35
  364. package/dist/mcp/clientIntegrations.d.ts +4 -2
  365. package/dist/mcp/clientIntegrations.js +58 -57
  366. package/dist/mcp/clientRegistry.d.ts +30 -0
  367. package/dist/mcp/clientRegistry.js +134 -0
  368. package/dist/mcp/collaborationRegistrar.js +31 -15
  369. package/dist/mcp/documentAssetRegistrar.js +231 -56
  370. package/dist/mcp/documentContentCommand.d.ts +94 -0
  371. package/dist/mcp/documentContentCommand.js +226 -0
  372. package/dist/mcp/documentHelpers.d.ts +13 -65
  373. package/dist/mcp/documentHelpers.js +49 -62
  374. package/dist/mcp/durableTaskMutationRouter.d.ts +65 -0
  375. package/dist/mcp/durableTaskMutationRouter.js +217 -0
  376. package/dist/mcp/durableTaskRelationshipMutationRouter.d.ts +38 -0
  377. package/dist/mcp/durableTaskRelationshipMutationRouter.js +168 -0
  378. package/dist/mcp/durableTaskRootMutationRouter.d.ts +64 -0
  379. package/dist/mcp/durableTaskRootMutationRouter.js +226 -0
  380. package/dist/mcp/gitWorktreeRoots.d.ts +2 -0
  381. package/dist/mcp/gitWorktreeRoots.js +19 -0
  382. package/dist/mcp/legacyServer.d.ts +1 -0
  383. package/dist/mcp/legacyServer.js +42 -0
  384. package/dist/mcp/localCliHealth.d.ts +56 -0
  385. package/dist/mcp/localCliHealth.js +170 -0
  386. package/dist/mcp/localServiceProxy.d.ts +23 -0
  387. package/dist/mcp/localServiceProxy.js +258 -0
  388. package/dist/mcp/mcpInputValidator.d.ts +17 -0
  389. package/dist/mcp/mcpInputValidator.js +58 -0
  390. package/dist/mcp/planningAttachmentCommandAdapter.d.ts +127 -0
  391. package/dist/mcp/planningAttachmentCommandAdapter.js +188 -0
  392. package/dist/mcp/programScaffoldCommandAdapter.d.ts +6 -0
  393. package/dist/mcp/programScaffoldCommandAdapter.js +39 -0
  394. package/dist/mcp/proxyServer.d.ts +1 -0
  395. package/dist/mcp/proxyServer.js +2 -0
  396. package/dist/mcp/runtime.d.ts +98 -1
  397. package/dist/mcp/runtime.js +4682 -1927
  398. package/dist/mcp/server.js +29 -2
  399. package/dist/mcp/sharedLocalServiceGateD.d.ts +115 -0
  400. package/dist/mcp/sharedLocalServiceGateD.js +344 -0
  401. package/dist/mcp/stdioLifecycle.d.ts +22 -0
  402. package/dist/mcp/stdioLifecycle.js +54 -0
  403. package/dist/mcp/taskAttachmentCommandAdapter.d.ts +192 -0
  404. package/dist/mcp/taskAttachmentCommandAdapter.js +470 -0
  405. package/dist/mcp/taskAttachmentHelpers.d.ts +8 -6
  406. package/dist/mcp/taskAttachmentHelpers.js +74 -2
  407. package/dist/mcp/taskAttachmentTypes.d.ts +26 -5
  408. package/dist/mcp/taskPlanCommand.d.ts +64 -0
  409. package/dist/mcp/taskPlanCommand.js +98 -0
  410. package/dist/mcp/taskPlanningRegistrar.js +240 -44
  411. package/dist/mcp/toolCallCompatibility.d.ts +6 -0
  412. package/dist/mcp/toolCallCompatibility.js +16 -0
  413. package/dist/mcp/toolCatalog.d.ts +3 -1
  414. package/dist/mcp/toolProfiles.d.ts +12 -1
  415. package/dist/mcp/toolProfiles.js +43 -0
  416. package/dist/mcp/toolRegistry.d.ts +17 -2
  417. package/dist/mcp/toolRegistry.js +26 -11
  418. package/dist/mcp/workflowExecutionRegistrar.d.ts +2 -0
  419. package/dist/mcp/workflowExecutionRegistrar.js +51 -0
  420. package/dist/migrations/taskSchemaMigrations.d.ts +35 -0
  421. package/dist/migrations/taskSchemaMigrations.js +1892 -64
  422. package/dist/migrations/taskUpdatedAtSyncDriftMigration.d.ts +20 -0
  423. package/dist/migrations/taskUpdatedAtSyncDriftMigration.js +153 -0
  424. package/dist/migrations/taskforceAgentDefinitionMigration.d.ts +26 -0
  425. package/dist/migrations/taskforceAgentDefinitionMigration.js +116 -0
  426. package/dist/plugins/vite.js +48 -17
  427. package/dist/public/Taskforce_Van.webp +0 -0
  428. package/dist/runtime/appGateDefinitions.d.ts +16 -10
  429. package/dist/runtime/appGateDefinitions.js +16 -10
  430. package/dist/runtime/appGates.d.ts +5 -4
  431. package/dist/runtime/appGates.js +4 -3
  432. package/dist/server/aiProfileAvatarAssets.d.ts +11 -8
  433. package/dist/server/aiProfileAvatarAssets.js +159 -70
  434. package/dist/server/appAccess.d.ts +12 -0
  435. package/dist/server/appAccess.js +21 -0
  436. package/dist/server/auth.js +15 -1
  437. package/dist/server/authorizedWorkspaceAccess.d.ts +12 -0
  438. package/dist/server/authorizedWorkspaceAccess.js +40 -0
  439. package/dist/server/cloudCollectionRead.d.ts +25 -0
  440. package/dist/server/cloudCollectionRead.js +120 -0
  441. package/dist/server/cloudCollectionReadPool.d.ts +52 -0
  442. package/dist/server/cloudCollectionReadPool.js +140 -0
  443. package/dist/server/cloudCollectionReadWorker.d.ts +1 -0
  444. package/dist/server/cloudCollectionReadWorker.js +36 -0
  445. package/dist/server/cors.d.ts +2 -1
  446. package/dist/server/cors.js +45 -8
  447. package/dist/server/email.d.ts +3 -1
  448. package/dist/server/email.js +46 -8
  449. package/dist/server/index.d.ts +27 -12
  450. package/dist/server/index.js +395 -86
  451. package/dist/server/localDataOwnerPermit.d.ts +18 -0
  452. package/dist/server/localDataOwnerPermit.js +58 -0
  453. package/dist/server/localDatabaseIdentity.d.ts +14 -0
  454. package/dist/server/localDatabaseIdentity.js +69 -0
  455. package/dist/server/localRealtimeFileInvalidation.d.ts +1 -0
  456. package/dist/server/localRealtimeFileInvalidation.js +7 -0
  457. package/dist/server/localServiceLease.d.ts +65 -0
  458. package/dist/server/localServiceLease.js +485 -0
  459. package/dist/server/localServiceOwnershipBootstrap.d.ts +19 -0
  460. package/dist/server/localServiceOwnershipBootstrap.js +84 -0
  461. package/dist/server/localServiceSessions.d.ts +87 -0
  462. package/dist/server/localServiceSessions.js +309 -0
  463. package/dist/server/localServiceWindowsAcl.d.ts +8 -0
  464. package/dist/server/localServiceWindowsAcl.js +60 -0
  465. package/dist/server/localSyncProcessLockBootstrap.d.ts +3 -0
  466. package/dist/server/localSyncProcessLockBootstrap.js +16 -0
  467. package/dist/server/localWorkspaceSyncServerComposition.d.ts +59 -0
  468. package/dist/server/localWorkspaceSyncServerComposition.js +91 -0
  469. package/dist/server/localWorkspaceSyncServerRuntime.d.ts +119 -0
  470. package/dist/server/localWorkspaceSyncServerRuntime.js +1163 -0
  471. package/dist/server/rateLimit.d.ts +1 -0
  472. package/dist/server/rateLimit.js +16 -0
  473. package/dist/server/routes/admin.d.ts +2 -4
  474. package/dist/server/routes/admin.js +199 -337
  475. package/dist/server/routes/agentRoles.d.ts +13 -0
  476. package/dist/server/routes/agentRoles.js +273 -0
  477. package/dist/server/routes/agentSkills.d.ts +16 -0
  478. package/dist/server/routes/agentSkills.js +291 -0
  479. package/dist/server/routes/agents.d.ts +49 -0
  480. package/dist/server/routes/agents.js +1455 -0
  481. package/dist/server/routes/annotatedAttachments.js +46 -9
  482. package/dist/server/routes/assetAccess.d.ts +36 -0
  483. package/dist/server/routes/assetAccess.js +93 -0
  484. package/dist/server/routes/auth.d.ts +4 -3
  485. package/dist/server/routes/auth.js +236 -21
  486. package/dist/server/routes/authSupport.d.ts +3 -1
  487. package/dist/server/routes/authSupport.js +22 -8
  488. package/dist/server/routes/documentReviews.d.ts +2 -0
  489. package/dist/server/routes/documentReviews.js +155 -15
  490. package/dist/server/routes/documents.d.ts +6 -2
  491. package/dist/server/routes/documents.js +492 -151
  492. package/dist/server/routes/durableTaskHttpRouters.d.ts +167 -0
  493. package/dist/server/routes/durableTaskHttpRouters.js +89 -0
  494. package/dist/server/routes/localMcpHealth.d.ts +11 -0
  495. package/dist/server/routes/localMcpHealth.js +29 -0
  496. package/dist/server/routes/localService.d.ts +13 -0
  497. package/dist/server/routes/localService.js +446 -0
  498. package/dist/server/routes/localUpdate.d.ts +11 -0
  499. package/dist/server/routes/localUpdate.js +154 -0
  500. package/dist/server/routes/primitives.d.ts +29 -0
  501. package/dist/server/routes/primitives.js +18 -0
  502. package/dist/server/routes/resources.d.ts +1 -10
  503. package/dist/server/routes/resources.js +1 -153
  504. package/dist/server/routes/shared.d.ts +55 -2
  505. package/dist/server/routes/shared.js +506 -16
  506. package/dist/server/routes/sync.d.ts +2 -0
  507. package/dist/server/routes/sync.js +206 -272
  508. package/dist/server/routes/syncAuxRoutes.d.ts +3 -1
  509. package/dist/server/routes/syncAuxRoutes.js +9 -4
  510. package/dist/server/routes/syncCoordinatorLocalRoutes.d.ts +6 -0
  511. package/dist/server/routes/syncCoordinatorLocalRoutes.js +867 -0
  512. package/dist/server/routes/syncPullApplyRoutes.d.ts +29 -1
  513. package/dist/server/routes/syncPullApplyRoutes.js +520 -17
  514. package/dist/server/routes/syncPushRoutes.d.ts +33 -4
  515. package/dist/server/routes/syncPushRoutes.js +251 -62
  516. package/dist/server/routes/syncRouteTypes.d.ts +1 -1
  517. package/dist/server/routes/syncSnapshotRoutes.d.ts +15 -7
  518. package/dist/server/routes/syncSnapshotRoutes.js +95 -17
  519. package/dist/server/routes/syncV3DiagnosticsRoutes.d.ts +14 -0
  520. package/dist/server/routes/syncV3DiagnosticsRoutes.js +72 -0
  521. package/dist/server/routes/syncV3FeedRoutes.d.ts +20 -0
  522. package/dist/server/routes/syncV3FeedRoutes.js +464 -0
  523. package/dist/server/routes/syncV3LocalCaptureRoutes.d.ts +37 -0
  524. package/dist/server/routes/syncV3LocalCaptureRoutes.js +915 -0
  525. package/dist/server/routes/syncV3LocalDispatchRoutes.d.ts +17 -0
  526. package/dist/server/routes/syncV3LocalDispatchRoutes.js +280 -0
  527. package/dist/server/routes/syncV3LocalFeedApplyRoutes.d.ts +17 -0
  528. package/dist/server/routes/syncV3LocalFeedApplyRoutes.js +493 -0
  529. package/dist/server/routes/syncV3LocalOwnershipRoutes.d.ts +10 -0
  530. package/dist/server/routes/syncV3LocalOwnershipRoutes.js +51 -0
  531. package/dist/server/routes/syncV3LocalRecoveryRoutes.d.ts +12 -0
  532. package/dist/server/routes/syncV3LocalRecoveryRoutes.js +78 -0
  533. package/dist/server/routes/syncV3OperationRoutes.d.ts +35 -0
  534. package/dist/server/routes/syncV3OperationRoutes.js +1151 -0
  535. package/dist/server/routes/tasks.d.ts +0 -2
  536. package/dist/server/routes/tasks.js +1083 -236
  537. package/dist/server/routes/workflows.d.ts +26 -0
  538. package/dist/server/routes/workflows.js +500 -0
  539. package/dist/server/routes.d.ts +1 -6
  540. package/dist/server/routes.js +179 -342
  541. package/dist/server/smtpTransport.d.ts +11 -3
  542. package/dist/server/smtpTransport.js +9 -2
  543. package/dist/server/start.js +42 -10
  544. package/dist/service/localServiceCli.d.ts +33 -0
  545. package/dist/service/localServiceCli.js +376 -0
  546. package/dist/service/localServiceClientLifecycle.d.ts +25 -0
  547. package/dist/service/localServiceClientLifecycle.js +189 -0
  548. package/dist/service/localServiceOpen.d.ts +17 -0
  549. package/dist/service/localServiceOpen.js +27 -0
  550. package/dist/services/agentRoleResolver.d.ts +4 -0
  551. package/dist/services/agentRoleResolver.js +7 -0
  552. package/dist/services/aiProfileAvatarGenerationService.d.ts +41 -0
  553. package/dist/services/aiProfileAvatarGenerationService.js +158 -0
  554. package/dist/services/avatarImageProvider.d.ts +33 -0
  555. package/dist/services/avatarImageProvider.js +140 -0
  556. package/dist/services/bedrockAnthropicMessagesModelGateway.d.ts +24 -0
  557. package/dist/services/bedrockAnthropicMessagesModelGateway.js +95 -0
  558. package/dist/services/bedrockMantleModelGateway.d.ts +43 -0
  559. package/dist/services/bedrockMantleModelGateway.js +81 -0
  560. package/dist/services/bedrockModelGateway.d.ts +26 -0
  561. package/dist/services/bedrockModelGateway.js +94 -0
  562. package/dist/services/modelGateway.d.ts +82 -0
  563. package/dist/services/modelGateway.js +61 -0
  564. package/dist/services/taskforceAgentAvatarImageProvider.d.ts +8 -0
  565. package/dist/services/taskforceAgentAvatarImageProvider.js +24 -0
  566. package/dist/services/taskforceAgentMcpBridge.d.ts +77 -0
  567. package/dist/services/taskforceAgentMcpBridge.js +527 -0
  568. package/dist/shared/agentRoleDefinition.d.ts +34 -0
  569. package/dist/shared/agentRoleDefinition.js +207 -0
  570. package/dist/shared/aiProfileAvatarEligibility.d.ts +10 -0
  571. package/dist/shared/aiProfileAvatarEligibility.js +27 -0
  572. package/dist/shared/aiProfileColors.d.ts +7 -0
  573. package/dist/shared/aiProfileColors.js +33 -0
  574. package/dist/shared/colorPalette.d.ts +3 -0
  575. package/dist/shared/colorPalette.js +20 -0
  576. package/dist/shared/commentProvenance.d.ts +4 -0
  577. package/dist/shared/commentProvenance.js +6 -0
  578. package/dist/shared/deletedTaskRetention.d.ts +2 -0
  579. package/dist/shared/deletedTaskRetention.js +7 -0
  580. package/dist/shared/passwordPolicy.d.ts +2 -1
  581. package/dist/shared/passwordPolicy.js +9 -0
  582. package/dist/shared/planningIdentity.d.ts +20 -0
  583. package/dist/shared/planningIdentity.js +79 -0
  584. package/dist/shared/taskDeepLinks.d.ts +28 -0
  585. package/dist/shared/taskDeepLinks.js +48 -0
  586. package/dist/shared/taskRestoreDestination.d.ts +2 -0
  587. package/dist/shared/taskRestoreDestination.js +5 -0
  588. package/dist/shared/taskforceAgentDefinition.d.ts +88 -0
  589. package/dist/shared/taskforceAgentDefinition.js +434 -0
  590. package/dist/shared/taskforceAgentExecutionSnapshot.d.ts +50 -0
  591. package/dist/shared/taskforceAgentExecutionSnapshot.js +68 -0
  592. package/dist/shared/taskforceAgentModels.d.ts +56 -0
  593. package/dist/shared/taskforceAgentModels.js +314 -0
  594. package/dist/shared/taskforceAgentRunContext.d.ts +23 -0
  595. package/dist/shared/taskforceAgentRunContext.js +21 -0
  596. package/dist/shared/taskforceAgentRuntimeResolution.d.ts +31 -0
  597. package/dist/shared/taskforceAgentRuntimeResolution.js +72 -0
  598. package/dist/shared/taskforceAgentSkill.d.ts +33 -0
  599. package/dist/shared/taskforceAgentSkill.js +149 -0
  600. package/dist/storage/agentRoleStore.d.ts +91 -0
  601. package/dist/storage/agentRoleStore.js +385 -0
  602. package/dist/storage/databaseAdapter.d.ts +1 -0
  603. package/dist/storage/databaseAdapter.js +7 -1
  604. package/dist/storage/documentIntegrity.d.ts +12 -3
  605. package/dist/storage/documentIntegrity.js +105 -27
  606. package/dist/storage/objectStorageClient.d.ts +10 -4
  607. package/dist/storage/objectStorageClient.js +73 -43
  608. package/dist/storage/postgresAdapter.d.ts +2 -1
  609. package/dist/storage/postgresAdapter.js +42 -6
  610. package/dist/storage/postgresRequestDiagnostics.d.ts +8 -0
  611. package/dist/storage/postgresRequestDiagnostics.js +24 -0
  612. package/dist/storage/postgresWorker.js +65 -1
  613. package/dist/storage/sqliteAdapter.d.ts +1 -1
  614. package/dist/storage/sqliteAdapter.js +7 -1
  615. package/dist/storage/sqliteWalHealth.d.ts +71 -0
  616. package/dist/storage/sqliteWalHealth.js +176 -0
  617. package/dist/storage/taskDataPath.d.ts +1 -0
  618. package/dist/storage/taskDataPath.js +20 -0
  619. package/dist/storage/taskforceAgentConversationStore.d.ts +66 -0
  620. package/dist/storage/taskforceAgentConversationStore.js +264 -0
  621. package/dist/storage/taskforceAgentSkillStore.d.ts +93 -0
  622. package/dist/storage/taskforceAgentSkillStore.js +355 -0
  623. package/dist/storage/taskforceAgentStore.d.ts +105 -0
  624. package/dist/storage/taskforceAgentStore.js +549 -0
  625. package/dist/storage/workflowStore.d.ts +223 -0
  626. package/dist/storage/workflowStore.js +1032 -0
  627. package/dist/storage/workspaceAssetStore.d.ts +102 -0
  628. package/dist/storage/workspaceAssetStore.js +488 -25
  629. package/dist/sync/aiProfileAvatarSyncPaths.d.ts +14 -0
  630. package/dist/sync/aiProfileAvatarSyncPaths.js +56 -0
  631. package/dist/sync/cloudSyncApi.d.ts +329 -0
  632. package/dist/sync/cloudSyncApi.js +574 -1
  633. package/dist/sync/collaborationSyncPayload.d.ts +5 -1
  634. package/dist/sync/collaborationSyncPayload.js +213 -1
  635. package/dist/sync/collaborationSyncState.d.ts +23 -3
  636. package/dist/sync/collaborationSyncState.js +92 -3
  637. package/dist/sync/contentSyncPayload.d.ts +9 -0
  638. package/dist/sync/contentSyncPayload.js +29 -0
  639. package/dist/sync/contentSyncState.d.ts +79 -4
  640. package/dist/sync/contentSyncState.js +1113 -313
  641. package/dist/sync/coordinator/localSyncBrowserApplyPermitContext.d.ts +39 -0
  642. package/dist/sync/coordinator/localSyncBrowserApplyPermitContext.js +234 -0
  643. package/dist/sync/coordinator/localSyncBrowserAuthorityCapability.d.ts +7 -0
  644. package/dist/sync/coordinator/localSyncBrowserAuthorityCapability.js +10 -0
  645. package/dist/sync/coordinator/localSyncCommittedApplyPolicy.d.ts +7 -0
  646. package/dist/sync/coordinator/localSyncCommittedApplyPolicy.js +41 -0
  647. package/dist/sync/coordinator/localSyncCoordinatorBrowserClient.d.ts +178 -0
  648. package/dist/sync/coordinator/localSyncCoordinatorBrowserClient.js +131 -0
  649. package/dist/sync/coordinator/localSyncCoordinatorCommandLifecycle.d.ts +25 -0
  650. package/dist/sync/coordinator/localSyncCoordinatorCommandLifecycle.js +200 -0
  651. package/dist/sync/coordinator/localSyncCoordinatorHost.d.ts +84 -0
  652. package/dist/sync/coordinator/localSyncCoordinatorHost.js +435 -0
  653. package/dist/sync/coordinator/localSyncCoordinatorRouteServices.d.ts +33 -0
  654. package/dist/sync/coordinator/localSyncCoordinatorRouteServices.js +1 -0
  655. package/dist/sync/coordinator/localSyncCoordinatorStore.d.ts +122 -0
  656. package/dist/sync/coordinator/localSyncCoordinatorStore.js +1039 -0
  657. package/dist/sync/coordinator/localSyncCoordinatorTypes.d.ts +82 -0
  658. package/dist/sync/coordinator/localSyncCoordinatorTypes.js +9 -0
  659. package/dist/sync/coordinator/localSyncDispatchTracker.d.ts +15 -0
  660. package/dist/sync/coordinator/localSyncDispatchTracker.js +68 -0
  661. package/dist/sync/coordinator/localSyncExecutionPermitStore.d.ts +216 -0
  662. package/dist/sync/coordinator/localSyncExecutionPermitStore.js +1436 -0
  663. package/dist/sync/coordinator/localSyncExecutionPermitTypes.d.ts +52 -0
  664. package/dist/sync/coordinator/localSyncExecutionPermitTypes.js +8 -0
  665. package/dist/sync/coordinator/localSyncOwnershipDrainBarrier.d.ts +33 -0
  666. package/dist/sync/coordinator/localSyncOwnershipDrainBarrier.js +83 -0
  667. package/dist/sync/coordinator/localSyncPermitTransactionHooks.d.ts +9 -0
  668. package/dist/sync/coordinator/localSyncPermitTransactionHooks.js +27 -0
  669. package/dist/sync/coordinator/localSyncProcessLock.d.ts +12 -0
  670. package/dist/sync/coordinator/localSyncProcessLock.js +212 -0
  671. package/dist/sync/coordinator/localSyncV3DispatchRecoveryReconciler.d.ts +17 -0
  672. package/dist/sync/coordinator/localSyncV3DispatchRecoveryReconciler.js +82 -0
  673. package/dist/sync/coordinator/localWorkspaceSyncRunner.d.ts +134 -0
  674. package/dist/sync/coordinator/localWorkspaceSyncRunner.js +981 -0
  675. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +189 -0
  676. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +961 -0
  677. package/dist/sync/coordinator/workspaceSyncCloudCredentialValidator.d.ts +19 -0
  678. package/dist/sync/coordinator/workspaceSyncCloudCredentialValidator.js +83 -0
  679. package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +117 -0
  680. package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +323 -0
  681. package/dist/sync/coordinator/workspaceSyncLocalAccessBootstrap.d.ts +11 -0
  682. package/dist/sync/coordinator/workspaceSyncLocalAccessBootstrap.js +51 -0
  683. package/dist/sync/coordinator/workspaceSyncTransportGateway.d.ts +139 -0
  684. package/dist/sync/coordinator/workspaceSyncTransportGateway.js +740 -0
  685. package/dist/sync/engine/localWorkspaceContentManifestService.d.ts +21 -0
  686. package/dist/sync/engine/localWorkspaceContentManifestService.js +44 -0
  687. package/dist/sync/engine/workspaceSyncAtomicLocalPublisher.d.ts +36 -0
  688. package/dist/sync/engine/workspaceSyncAtomicLocalPublisher.js +203 -0
  689. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +21 -0
  690. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.js +13 -0
  691. package/dist/sync/engine/workspaceSyncContentPullObligationStore.d.ts +65 -0
  692. package/dist/sync/engine/workspaceSyncContentPullObligationStore.js +160 -0
  693. package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +216 -0
  694. package/dist/sync/engine/workspaceSyncContentVersionStore.js +1068 -0
  695. package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.d.ts +28 -0
  696. package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.js +543 -0
  697. package/dist/sync/engine/workspaceSyncEngineContracts.d.ts +78 -0
  698. package/dist/sync/engine/workspaceSyncEngineContracts.js +1 -0
  699. package/dist/sync/engine/workspaceSyncEngineControlPlane.d.ts +37 -0
  700. package/dist/sync/engine/workspaceSyncEngineControlPlane.js +79 -0
  701. package/dist/sync/engine/workspaceSyncEngineIdentity.d.ts +1 -0
  702. package/dist/sync/engine/workspaceSyncEngineIdentity.js +4 -0
  703. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.d.ts +68 -0
  704. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +180 -0
  705. package/dist/sync/engine/workspaceSyncEngineLocalApply.d.ts +72 -0
  706. package/dist/sync/engine/workspaceSyncEngineLocalApply.js +132 -0
  707. package/dist/sync/engine/workspaceSyncEngineLocalServices.d.ts +70 -0
  708. package/dist/sync/engine/workspaceSyncEngineLocalServices.js +25 -0
  709. package/dist/sync/engine/workspaceSyncEngineParity.d.ts +8 -0
  710. package/dist/sync/engine/workspaceSyncEngineParity.js +7 -0
  711. package/dist/sync/engine/workspaceSyncEnginePullPolicy.d.ts +32 -0
  712. package/dist/sync/engine/workspaceSyncEnginePullPolicy.js +27 -0
  713. package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +20 -0
  714. package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +87 -0
  715. package/dist/sync/engine/workspaceSyncEngineRecovery.d.ts +56 -0
  716. package/dist/sync/engine/workspaceSyncEngineRecovery.js +288 -0
  717. package/dist/sync/engine/workspaceSyncEngineRemoteServices.d.ts +109 -0
  718. package/dist/sync/engine/workspaceSyncEngineRemoteServices.js +21 -0
  719. package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +61 -0
  720. package/dist/sync/engine/workspaceSyncEngineRuntime.js +59 -0
  721. package/dist/sync/engine/workspaceSyncEngineServerApplyBoundary.d.ts +28 -0
  722. package/dist/sync/engine/workspaceSyncEngineServerApplyBoundary.js +86 -0
  723. package/dist/sync/engine/workspaceSyncEngineServerLocalServices.d.ts +73 -0
  724. package/dist/sync/engine/workspaceSyncEngineServerLocalServices.js +452 -0
  725. package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.d.ts +23 -0
  726. package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.js +466 -0
  727. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.d.ts +125 -0
  728. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +1147 -0
  729. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.d.ts +63 -0
  730. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +276 -0
  731. package/dist/sync/engine/workspaceSyncEngineTransferCompletion.d.ts +20 -0
  732. package/dist/sync/engine/workspaceSyncEngineTransferCompletion.js +37 -0
  733. package/dist/sync/engine/workspaceSyncEngineTransferTypes.d.ts +7 -0
  734. package/dist/sync/engine/workspaceSyncEngineTransferTypes.js +1 -0
  735. package/dist/sync/engine/workspaceSyncEngineTransfers.d.ts +240 -0
  736. package/dist/sync/engine/workspaceSyncEngineTransfers.js +1184 -0
  737. package/dist/sync/engine/workspaceSyncEngineV3LocalFeedApply.d.ts +39 -0
  738. package/dist/sync/engine/workspaceSyncEngineV3LocalFeedApply.js +39 -0
  739. package/dist/sync/engine/workspaceSyncImmutableContentGcRunner.d.ts +25 -0
  740. package/dist/sync/engine/workspaceSyncImmutableContentGcRunner.js +83 -0
  741. package/dist/sync/engine/workspaceSyncImmutableContentProvider.d.ts +71 -0
  742. package/dist/sync/engine/workspaceSyncImmutableContentProvider.js +209 -0
  743. package/dist/sync/engine/workspaceSyncImmutableContentStager.d.ts +32 -0
  744. package/dist/sync/engine/workspaceSyncImmutableContentStager.js +202 -0
  745. package/dist/sync/engine/workspaceSyncPublishedContentResolver.d.ts +43 -0
  746. package/dist/sync/engine/workspaceSyncPublishedContentResolver.js +142 -0
  747. package/dist/sync/engine/workspaceSyncServerContentRuntime.d.ts +26 -0
  748. package/dist/sync/engine/workspaceSyncServerContentRuntime.js +41 -0
  749. package/dist/sync/engine/workspaceSyncServerDataServices.d.ts +44 -0
  750. package/dist/sync/engine/workspaceSyncServerDataServices.js +143 -0
  751. package/dist/sync/engine/workspaceSyncTransferEvidence.d.ts +39 -0
  752. package/dist/sync/engine/workspaceSyncTransferEvidence.js +45 -0
  753. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +44 -0
  754. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +992 -0
  755. package/dist/sync/engine/workspaceSyncV2PreparedContent.d.ts +82 -0
  756. package/dist/sync/engine/workspaceSyncV2PreparedContent.js +219 -0
  757. package/dist/sync/planningCanonicalFields.d.ts +41 -0
  758. package/dist/sync/planningCanonicalFields.js +211 -0
  759. package/dist/sync/planningSyncPayload.d.ts +5 -1
  760. package/dist/sync/planningSyncPayload.js +88 -4
  761. package/dist/sync/syncApplyHandlers.d.ts +100 -8
  762. package/dist/sync/syncApplyHandlers.js +845 -78
  763. package/dist/sync/syncResourceAdapters.d.ts +10 -0
  764. package/dist/sync/syncResourceAdapters.js +21 -1
  765. package/dist/sync/syncService.d.ts +57 -1
  766. package/dist/sync/syncService.js +1094 -138
  767. package/dist/sync/taskNestedContent.d.ts +2 -0
  768. package/dist/sync/taskNestedContent.js +8 -0
  769. package/dist/sync/taskSyncChangeKey.js +0 -1
  770. package/dist/sync/taskSyncPayload.d.ts +1 -1
  771. package/dist/sync/taskSyncPayload.js +20 -3
  772. package/dist/sync/v3/canonicalWorkspaceSyncJson.d.ts +2 -0
  773. package/dist/sync/v3/canonicalWorkspaceSyncJson.js +26 -0
  774. package/dist/sync/v3/combinedFeedCapability.d.ts +21 -0
  775. package/dist/sync/v3/combinedFeedCapability.js +80 -0
  776. package/dist/sync/v3/combinedFeedPrerequisites.d.ts +18 -0
  777. package/dist/sync/v3/combinedFeedPrerequisites.js +184 -0
  778. package/dist/sync/v3/durableInitiativeMutationRouter.d.ts +61 -0
  779. package/dist/sync/v3/durableInitiativeMutationRouter.js +287 -0
  780. package/dist/sync/v3/durableOperationReplay.d.ts +36 -0
  781. package/dist/sync/v3/durableOperationReplay.js +103 -0
  782. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.d.ts +50 -0
  783. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +216 -0
  784. package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +47 -0
  785. package/dist/sync/v3/durableTaskChecklistMutationRouter.js +182 -0
  786. package/dist/sync/v3/durableTaskCommentMutationRouter.d.ts +47 -0
  787. package/dist/sync/v3/durableTaskCommentMutationRouter.js +191 -0
  788. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.d.ts +60 -0
  789. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.js +333 -0
  790. package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +40 -0
  791. package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +518 -0
  792. package/dist/sync/v3/durableTaxonomyMutationRouter.d.ts +63 -0
  793. package/dist/sync/v3/durableTaxonomyMutationRouter.js +289 -0
  794. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +77 -0
  795. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +361 -0
  796. package/dist/sync/v3/durableWorkstreamMutationRouter.d.ts +61 -0
  797. package/dist/sync/v3/durableWorkstreamMutationRouter.js +287 -0
  798. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.d.ts +42 -0
  799. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +122 -0
  800. package/dist/sync/v3/entityEventLegacyAdoptionContract.d.ts +6 -0
  801. package/dist/sync/v3/entityEventLegacyAdoptionContract.js +6 -0
  802. package/dist/sync/v3/entityEventLegacyAdoptionService.d.ts +62 -0
  803. package/dist/sync/v3/entityEventLegacyAdoptionService.js +180 -0
  804. package/dist/sync/v3/initiativeActivityAuthoritativeRevision.d.ts +11 -0
  805. package/dist/sync/v3/initiativeActivityAuthoritativeRevision.js +23 -0
  806. package/dist/sync/v3/initiativeActivityIdentity.d.ts +8 -0
  807. package/dist/sync/v3/initiativeActivityIdentity.js +14 -0
  808. package/dist/sync/v3/initiativeCoexistence.d.ts +26 -0
  809. package/dist/sync/v3/initiativeCoexistence.js +148 -0
  810. package/dist/sync/v3/initiativeFeedActivationCapability.d.ts +6 -0
  811. package/dist/sync/v3/initiativeFeedActivationCapability.js +16 -0
  812. package/dist/sync/v3/initiativeMutationPayload.d.ts +26 -0
  813. package/dist/sync/v3/initiativeMutationPayload.js +144 -0
  814. package/dist/sync/v3/initiativeMutationService.d.ts +62 -0
  815. package/dist/sync/v3/initiativeMutationService.js +206 -0
  816. package/dist/sync/v3/localEntityEventLegacyAdoption.d.ts +31 -0
  817. package/dist/sync/v3/localEntityEventLegacyAdoption.js +607 -0
  818. package/dist/sync/v3/localInitiativeOutboxHandler.d.ts +8 -0
  819. package/dist/sync/v3/localInitiativeOutboxHandler.js +88 -0
  820. package/dist/sync/v3/localInitiativeOutboxService.d.ts +50 -0
  821. package/dist/sync/v3/localInitiativeOutboxService.js +497 -0
  822. package/dist/sync/v3/localOperationIdentityStore.d.ts +81 -0
  823. package/dist/sync/v3/localOperationIdentityStore.js +388 -0
  824. package/dist/sync/v3/localOutboxDispatchCapability.d.ts +7 -0
  825. package/dist/sync/v3/localOutboxDispatchCapability.js +13 -0
  826. package/dist/sync/v3/localOutboxDispatchRuntime.d.ts +16 -0
  827. package/dist/sync/v3/localOutboxDispatchRuntime.js +269 -0
  828. package/dist/sync/v3/localOutboxDispatcher.d.ts +53 -0
  829. package/dist/sync/v3/localOutboxDispatcher.js +366 -0
  830. package/dist/sync/v3/localOutboxDrainClient.d.ts +50 -0
  831. package/dist/sync/v3/localOutboxDrainClient.js +250 -0
  832. package/dist/sync/v3/localOutboxOperationHandler.d.ts +31 -0
  833. package/dist/sync/v3/localOutboxOperationHandler.js +10 -0
  834. package/dist/sync/v3/localOutboxRecoveryClient.d.ts +14 -0
  835. package/dist/sync/v3/localOutboxRecoveryClient.js +45 -0
  836. package/dist/sync/v3/localOutboxRecoveryPreparationService.d.ts +12 -0
  837. package/dist/sync/v3/localOutboxRecoveryPreparationService.js +151 -0
  838. package/dist/sync/v3/localSyncIdentityStore.d.ts +9 -0
  839. package/dist/sync/v3/localSyncIdentityStore.js +43 -0
  840. package/dist/sync/v3/localTaskAttachmentLinksOutboxHandler.d.ts +10 -0
  841. package/dist/sync/v3/localTaskAttachmentLinksOutboxHandler.js +80 -0
  842. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.d.ts +46 -0
  843. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.js +303 -0
  844. package/dist/sync/v3/localTaskChecklistOutboxHandler.d.ts +10 -0
  845. package/dist/sync/v3/localTaskChecklistOutboxHandler.js +54 -0
  846. package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +47 -0
  847. package/dist/sync/v3/localTaskChecklistOutboxService.js +221 -0
  848. package/dist/sync/v3/localTaskCommentOutboxHandler.d.ts +10 -0
  849. package/dist/sync/v3/localTaskCommentOutboxHandler.js +94 -0
  850. package/dist/sync/v3/localTaskCommentOutboxService.d.ts +75 -0
  851. package/dist/sync/v3/localTaskCommentOutboxService.js +391 -0
  852. package/dist/sync/v3/localTaskCreateClient.d.ts +27 -0
  853. package/dist/sync/v3/localTaskCreateClient.js +209 -0
  854. package/dist/sync/v3/localTaskCreateOutboxHandler.d.ts +8 -0
  855. package/dist/sync/v3/localTaskCreateOutboxHandler.js +147 -0
  856. package/dist/sync/v3/localTaskCreateOutboxService.d.ts +77 -0
  857. package/dist/sync/v3/localTaskCreateOutboxService.js +397 -0
  858. package/dist/sync/v3/localTaskDeleteClient.d.ts +10 -0
  859. package/dist/sync/v3/localTaskDeleteClient.js +23 -0
  860. package/dist/sync/v3/localTaskDeleteOutboxHandler.d.ts +8 -0
  861. package/dist/sync/v3/localTaskDeleteOutboxHandler.js +54 -0
  862. package/dist/sync/v3/localTaskDeleteOutboxService.d.ts +38 -0
  863. package/dist/sync/v3/localTaskDeleteOutboxService.js +235 -0
  864. package/dist/sync/v3/localTaskLegacyRootAdoption.d.ts +28 -0
  865. package/dist/sync/v3/localTaskLegacyRootAdoption.js +219 -0
  866. package/dist/sync/v3/localTaskLifecycleClient.d.ts +49 -0
  867. package/dist/sync/v3/localTaskLifecycleClient.js +57 -0
  868. package/dist/sync/v3/localTaskLifecycleOutboxHandler.d.ts +8 -0
  869. package/dist/sync/v3/localTaskLifecycleOutboxHandler.js +94 -0
  870. package/dist/sync/v3/localTaskLifecycleOutboxService.d.ts +60 -0
  871. package/dist/sync/v3/localTaskLifecycleOutboxService.js +304 -0
  872. package/dist/sync/v3/localTaskMetadataClient.d.ts +13 -0
  873. package/dist/sync/v3/localTaskMetadataClient.js +30 -0
  874. package/dist/sync/v3/localTaskMetadataOutboxHandler.d.ts +8 -0
  875. package/dist/sync/v3/localTaskMetadataOutboxHandler.js +70 -0
  876. package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +48 -0
  877. package/dist/sync/v3/localTaskMetadataOutboxService.js +229 -0
  878. package/dist/sync/v3/localTaskOperationClient.d.ts +72 -0
  879. package/dist/sync/v3/localTaskOperationClient.js +195 -0
  880. package/dist/sync/v3/localTaskRelationshipOutboxHandler.d.ts +8 -0
  881. package/dist/sync/v3/localTaskRelationshipOutboxHandler.js +114 -0
  882. package/dist/sync/v3/localTaskRelationshipOutboxService.d.ts +45 -0
  883. package/dist/sync/v3/localTaskRelationshipOutboxService.js +192 -0
  884. package/dist/sync/v3/localTaskRestoreClient.d.ts +13 -0
  885. package/dist/sync/v3/localTaskRestoreClient.js +32 -0
  886. package/dist/sync/v3/localTaskRestoreOutboxHandler.d.ts +8 -0
  887. package/dist/sync/v3/localTaskRestoreOutboxHandler.js +41 -0
  888. package/dist/sync/v3/localTaskRestoreOutboxService.d.ts +56 -0
  889. package/dist/sync/v3/localTaskRestoreOutboxService.js +323 -0
  890. package/dist/sync/v3/localTaskStatusClient.d.ts +17 -0
  891. package/dist/sync/v3/localTaskStatusClient.js +35 -0
  892. package/dist/sync/v3/localTaskStatusOutboxHandler.d.ts +8 -0
  893. package/dist/sync/v3/localTaskStatusOutboxHandler.js +75 -0
  894. package/dist/sync/v3/localTaskStatusOutboxService.d.ts +53 -0
  895. package/dist/sync/v3/localTaskStatusOutboxService.js +422 -0
  896. package/dist/sync/v3/localTaxonomyCompositeOutboxService.d.ts +34 -0
  897. package/dist/sync/v3/localTaxonomyCompositeOutboxService.js +290 -0
  898. package/dist/sync/v3/localTaxonomyOutboxHandler.d.ts +9 -0
  899. package/dist/sync/v3/localTaxonomyOutboxHandler.js +106 -0
  900. package/dist/sync/v3/localTaxonomyOutboxService.d.ts +30 -0
  901. package/dist/sync/v3/localTaxonomyOutboxService.js +181 -0
  902. package/dist/sync/v3/localWorkflowRuntimeOutboxHandler.d.ts +8 -0
  903. package/dist/sync/v3/localWorkflowRuntimeOutboxHandler.js +113 -0
  904. package/dist/sync/v3/localWorkflowRuntimeOutboxService.d.ts +37 -0
  905. package/dist/sync/v3/localWorkflowRuntimeOutboxService.js +330 -0
  906. package/dist/sync/v3/localWorkspaceSyncServerOutboxDispatcher.d.ts +63 -0
  907. package/dist/sync/v3/localWorkspaceSyncServerOutboxDispatcher.js +264 -0
  908. package/dist/sync/v3/localWorkstreamOutboxHandler.d.ts +8 -0
  909. package/dist/sync/v3/localWorkstreamOutboxHandler.js +102 -0
  910. package/dist/sync/v3/localWorkstreamOutboxService.d.ts +52 -0
  911. package/dist/sync/v3/localWorkstreamOutboxService.js +581 -0
  912. package/dist/sync/v3/localWorkstreamTaskOrderOutboxHandler.d.ts +10 -0
  913. package/dist/sync/v3/localWorkstreamTaskOrderOutboxHandler.js +57 -0
  914. package/dist/sync/v3/localWorkstreamTaskOrderOutboxService.d.ts +30 -0
  915. package/dist/sync/v3/localWorkstreamTaskOrderOutboxService.js +128 -0
  916. package/dist/sync/v3/planningActivation.d.ts +13 -0
  917. package/dist/sync/v3/planningActivation.js +33 -0
  918. package/dist/sync/v3/planningAttachmentActivityValidation.d.ts +9 -0
  919. package/dist/sync/v3/planningAttachmentActivityValidation.js +87 -0
  920. package/dist/sync/v3/programScaffoldService.d.ts +143 -0
  921. package/dist/sync/v3/programScaffoldService.js +478 -0
  922. package/dist/sync/v3/syncDurabilityStore.d.ts +781 -0
  923. package/dist/sync/v3/syncDurabilityStore.js +4773 -0
  924. package/dist/sync/v3/taskActivityAuthoritativeRevision.d.ts +16 -0
  925. package/dist/sync/v3/taskActivityAuthoritativeRevision.js +67 -0
  926. package/dist/sync/v3/taskActivityJournal.d.ts +20 -0
  927. package/dist/sync/v3/taskActivityJournal.js +195 -0
  928. package/dist/sync/v3/taskAttachmentLinksActivityIdentity.d.ts +6 -0
  929. package/dist/sync/v3/taskAttachmentLinksActivityIdentity.js +14 -0
  930. package/dist/sync/v3/taskAttachmentLinksMutationService.d.ts +112 -0
  931. package/dist/sync/v3/taskAttachmentLinksMutationService.js +218 -0
  932. package/dist/sync/v3/taskChecklistActivityIdentity.d.ts +6 -0
  933. package/dist/sync/v3/taskChecklistActivityIdentity.js +14 -0
  934. package/dist/sync/v3/taskChecklistMutationService.d.ts +92 -0
  935. package/dist/sync/v3/taskChecklistMutationService.js +156 -0
  936. package/dist/sync/v3/taskCommentActivityIdentity.d.ts +7 -0
  937. package/dist/sync/v3/taskCommentActivityIdentity.js +15 -0
  938. package/dist/sync/v3/taskCommentMutationService.d.ts +150 -0
  939. package/dist/sync/v3/taskCommentMutationService.js +392 -0
  940. package/dist/sync/v3/taskCommentReconcileProvenance.d.ts +58 -0
  941. package/dist/sync/v3/taskCommentReconcileProvenance.js +170 -0
  942. package/dist/sync/v3/taskCreateActivation.d.ts +19 -0
  943. package/dist/sync/v3/taskCreateActivation.js +84 -0
  944. package/dist/sync/v3/taskCreateActivityIdentity.d.ts +7 -0
  945. package/dist/sync/v3/taskCreateActivityIdentity.js +18 -0
  946. package/dist/sync/v3/taskCreateMutationService.d.ts +103 -0
  947. package/dist/sync/v3/taskCreateMutationService.js +283 -0
  948. package/dist/sync/v3/taskDeleteActivation.d.ts +7 -0
  949. package/dist/sync/v3/taskDeleteActivation.js +14 -0
  950. package/dist/sync/v3/taskDeleteMutationService.d.ts +35 -0
  951. package/dist/sync/v3/taskDeleteMutationService.js +133 -0
  952. package/dist/sync/v3/taskLegacyRootAdoptionService.d.ts +78 -0
  953. package/dist/sync/v3/taskLegacyRootAdoptionService.js +175 -0
  954. package/dist/sync/v3/taskLifecycleActivityIdentity.d.ts +9 -0
  955. package/dist/sync/v3/taskLifecycleActivityIdentity.js +18 -0
  956. package/dist/sync/v3/taskLifecycleMutationPayload.d.ts +5 -0
  957. package/dist/sync/v3/taskLifecycleMutationPayload.js +28 -0
  958. package/dist/sync/v3/taskLifecycleMutationService.d.ts +66 -0
  959. package/dist/sync/v3/taskLifecycleMutationService.js +92 -0
  960. package/dist/sync/v3/taskMetadataActivation.d.ts +12 -0
  961. package/dist/sync/v3/taskMetadataActivation.js +38 -0
  962. package/dist/sync/v3/taskMetadataActivityIdentity.d.ts +7 -0
  963. package/dist/sync/v3/taskMetadataActivityIdentity.js +18 -0
  964. package/dist/sync/v3/taskMetadataCoexistence.d.ts +37 -0
  965. package/dist/sync/v3/taskMetadataCoexistence.js +138 -0
  966. package/dist/sync/v3/taskMetadataMutationService.d.ts +71 -0
  967. package/dist/sync/v3/taskMetadataMutationService.js +199 -0
  968. package/dist/sync/v3/taskRelationshipLegacyAdoptionService.d.ts +48 -0
  969. package/dist/sync/v3/taskRelationshipLegacyAdoptionService.js +164 -0
  970. package/dist/sync/v3/taskRelationshipMutationService.d.ts +50 -0
  971. package/dist/sync/v3/taskRelationshipMutationService.js +148 -0
  972. package/dist/sync/v3/taskRestoreMutationService.d.ts +90 -0
  973. package/dist/sync/v3/taskRestoreMutationService.js +179 -0
  974. package/dist/sync/v3/taskStatusActivation.d.ts +7 -0
  975. package/dist/sync/v3/taskStatusActivation.js +15 -0
  976. package/dist/sync/v3/taskStatusMutationService.d.ts +76 -0
  977. package/dist/sync/v3/taskStatusMutationService.js +308 -0
  978. package/dist/sync/v3/taskWorkflowMutationPayload.d.ts +4 -0
  979. package/dist/sync/v3/taskWorkflowMutationPayload.js +22 -0
  980. package/dist/sync/v3/taskWorkflowMutationService.d.ts +64 -0
  981. package/dist/sync/v3/taskWorkflowMutationService.js +102 -0
  982. package/dist/sync/v3/taxonomyCoexistence.d.ts +10 -0
  983. package/dist/sync/v3/taxonomyCoexistence.js +19 -0
  984. package/dist/sync/v3/taxonomyCompositeMutationService.d.ts +110 -0
  985. package/dist/sync/v3/taxonomyCompositeMutationService.js +304 -0
  986. package/dist/sync/v3/taxonomyMutationService.d.ts +57 -0
  987. package/dist/sync/v3/taxonomyMutationService.js +106 -0
  988. package/dist/sync/v3/taxonomyStateMutation.d.ts +22 -0
  989. package/dist/sync/v3/taxonomyStateMutation.js +49 -0
  990. package/dist/sync/v3/taxonomySyncPayload.d.ts +9 -0
  991. package/dist/sync/v3/taxonomySyncPayload.js +199 -0
  992. package/dist/sync/v3/workflowAssignmentSync.d.ts +22 -0
  993. package/dist/sync/v3/workflowAssignmentSync.js +213 -0
  994. package/dist/sync/v3/workflowRuntimeMutationService.d.ts +89 -0
  995. package/dist/sync/v3/workflowRuntimeMutationService.js +359 -0
  996. package/dist/sync/v3/workflowRuntimeOperationIdentity.d.ts +13 -0
  997. package/dist/sync/v3/workflowRuntimeOperationIdentity.js +35 -0
  998. package/dist/sync/v3/workflowRuntimeSync.d.ts +141 -0
  999. package/dist/sync/v3/workflowRuntimeSync.js +485 -0
  1000. package/dist/sync/v3/workspaceSyncJournalReader.d.ts +43 -0
  1001. package/dist/sync/v3/workspaceSyncJournalReader.js +45 -0
  1002. package/dist/sync/v3/workspaceSyncLocalOwnershipSnapshot.d.ts +28 -0
  1003. package/dist/sync/v3/workspaceSyncLocalOwnershipSnapshot.js +81 -0
  1004. package/dist/sync/v3/workspaceSyncPayloadFingerprint.d.ts +1 -0
  1005. package/dist/sync/v3/workspaceSyncPayloadFingerprint.js +5 -0
  1006. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.d.ts +16 -0
  1007. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.js +153 -0
  1008. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.d.ts +83 -0
  1009. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.js +161 -0
  1010. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.d.ts +16 -0
  1011. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.js +90 -0
  1012. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +65 -0
  1013. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +357 -0
  1014. package/dist/sync/v3/workspaceSyncV3CombinedCoverage.d.ts +51 -0
  1015. package/dist/sync/v3/workspaceSyncV3CombinedCoverage.js +171 -0
  1016. package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.d.ts +43 -0
  1017. package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.js +541 -0
  1018. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.d.ts +50 -0
  1019. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +1161 -0
  1020. package/dist/sync/v3/workspaceSyncV3CombinedProjectionState.d.ts +96 -0
  1021. package/dist/sync/v3/workspaceSyncV3CombinedProjectionState.js +672 -0
  1022. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +46 -0
  1023. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +621 -0
  1024. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +66 -0
  1025. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +527 -0
  1026. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +78 -0
  1027. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +566 -0
  1028. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +45 -0
  1029. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +125 -0
  1030. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.d.ts +13 -0
  1031. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +34 -0
  1032. package/dist/sync/v3/workspaceSyncV3CursorEncoding.d.ts +1 -0
  1033. package/dist/sync/v3/workspaceSyncV3CursorEncoding.js +6 -0
  1034. package/dist/sync/v3/workspaceSyncV3DomainAdmission.d.ts +43 -0
  1035. package/dist/sync/v3/workspaceSyncV3DomainAdmission.js +118 -0
  1036. package/dist/sync/v3/workspaceSyncV3Feed.d.ts +95 -0
  1037. package/dist/sync/v3/workspaceSyncV3Feed.js +243 -0
  1038. package/dist/sync/v3/workspaceSyncV3FeedApply.d.ts +13 -0
  1039. package/dist/sync/v3/workspaceSyncV3FeedApply.js +67 -0
  1040. package/dist/sync/v3/workspaceSyncV3FeedClientContract.d.ts +3 -0
  1041. package/dist/sync/v3/workspaceSyncV3FeedClientContract.js +46 -0
  1042. package/dist/sync/v3/workspaceSyncV3FeedCursorKeys.d.ts +10 -0
  1043. package/dist/sync/v3/workspaceSyncV3FeedCursorKeys.js +58 -0
  1044. package/dist/sync/v3/workspaceSyncV3FeedOrchestrator.d.ts +31 -0
  1045. package/dist/sync/v3/workspaceSyncV3FeedOrchestrator.js +228 -0
  1046. package/dist/sync/v3/workspaceSyncV3FeedProfile.d.ts +32 -0
  1047. package/dist/sync/v3/workspaceSyncV3FeedProfile.js +21 -0
  1048. package/dist/sync/v3/workspaceSyncV3InitiativeLocalApply.d.ts +36 -0
  1049. package/dist/sync/v3/workspaceSyncV3InitiativeLocalApply.js +163 -0
  1050. package/dist/sync/v3/workspaceSyncV3InitiativeRepair.d.ts +33 -0
  1051. package/dist/sync/v3/workspaceSyncV3InitiativeRepair.js +118 -0
  1052. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.d.ts +10 -0
  1053. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.js +45 -0
  1054. package/dist/sync/v3/workspaceSyncV3LocalOutboxStatus.d.ts +27 -0
  1055. package/dist/sync/v3/workspaceSyncV3LocalOutboxStatus.js +83 -0
  1056. package/dist/sync/v3/workspaceSyncV3NestedCoverage.d.ts +10 -0
  1057. package/dist/sync/v3/workspaceSyncV3NestedCoverage.js +40 -0
  1058. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.d.ts +83 -0
  1059. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.js +325 -0
  1060. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.d.ts +59 -0
  1061. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.js +302 -0
  1062. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +47 -0
  1063. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +329 -0
  1064. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.d.ts +19 -0
  1065. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.js +41 -0
  1066. package/dist/sync/v3/workspaceSyncV3NestedWireContract.d.ts +6 -0
  1067. package/dist/sync/v3/workspaceSyncV3NestedWireContract.js +16 -0
  1068. package/dist/sync/v3/workspaceSyncV3OperationProjection.d.ts +8 -0
  1069. package/dist/sync/v3/workspaceSyncV3OperationProjection.js +52 -0
  1070. package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +230 -0
  1071. package/dist/sync/v3/workspaceSyncV3OperationProtocol.js +1 -0
  1072. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +165 -0
  1073. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +414 -0
  1074. package/dist/sync/v3/workspaceSyncV3OriginActor.d.ts +36 -0
  1075. package/dist/sync/v3/workspaceSyncV3OriginActor.js +61 -0
  1076. package/dist/sync/v3/workspaceSyncV3OriginAssertion.d.ts +46 -0
  1077. package/dist/sync/v3/workspaceSyncV3OriginAssertion.js +121 -0
  1078. package/dist/sync/v3/workspaceSyncV3OriginAssertionHeader.d.ts +1 -0
  1079. package/dist/sync/v3/workspaceSyncV3OriginAssertionHeader.js +1 -0
  1080. package/dist/sync/v3/workspaceSyncV3PlanningOrderCoverage.d.ts +10 -0
  1081. package/dist/sync/v3/workspaceSyncV3PlanningOrderCoverage.js +34 -0
  1082. package/dist/sync/v3/workspaceSyncV3PlanningOrderWireContract.d.ts +6 -0
  1083. package/dist/sync/v3/workspaceSyncV3PlanningOrderWireContract.js +10 -0
  1084. package/dist/sync/v3/workspaceSyncV3ProjectionState.d.ts +105 -0
  1085. package/dist/sync/v3/workspaceSyncV3ProjectionState.js +467 -0
  1086. package/dist/sync/v3/workspaceSyncV3RepairSqlBatching.d.ts +2 -0
  1087. package/dist/sync/v3/workspaceSyncV3RepairSqlBatching.js +10 -0
  1088. package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.d.ts +56 -0
  1089. package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.js +250 -0
  1090. package/dist/sync/v3/workspaceSyncV3TaskRelationshipProjection.d.ts +30 -0
  1091. package/dist/sync/v3/workspaceSyncV3TaskRelationshipProjection.js +142 -0
  1092. package/dist/sync/v3/workspaceSyncV3TaskRootProjection.d.ts +40 -0
  1093. package/dist/sync/v3/workspaceSyncV3TaskRootProjection.js +246 -0
  1094. package/dist/sync/v3/workspaceSyncV3TaxonomyFeedProjection.d.ts +39 -0
  1095. package/dist/sync/v3/workspaceSyncV3TaxonomyFeedProjection.js +185 -0
  1096. package/dist/sync/v3/workspaceSyncV3WorkflowCoverage.d.ts +10 -0
  1097. package/dist/sync/v3/workspaceSyncV3WorkflowCoverage.js +36 -0
  1098. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.d.ts +17 -0
  1099. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.js +143 -0
  1100. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeProjection.d.ts +9 -0
  1101. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeProjection.js +195 -0
  1102. package/dist/sync/v3/workspaceSyncV3WorkflowWireContract.d.ts +11 -0
  1103. package/dist/sync/v3/workspaceSyncV3WorkflowWireContract.js +12 -0
  1104. package/dist/sync/v3/workspaceSyncV3WorkstreamProjection.d.ts +4 -0
  1105. package/dist/sync/v3/workspaceSyncV3WorkstreamProjection.js +98 -0
  1106. package/dist/sync/v3/workspaceSyncV3WorkstreamTaskOrderProjection.d.ts +9 -0
  1107. package/dist/sync/v3/workspaceSyncV3WorkstreamTaskOrderProjection.js +72 -0
  1108. package/dist/sync/v3/workstreamActivityAuthoritativeRevision.d.ts +11 -0
  1109. package/dist/sync/v3/workstreamActivityAuthoritativeRevision.js +23 -0
  1110. package/dist/sync/v3/workstreamActivityIdentity.d.ts +8 -0
  1111. package/dist/sync/v3/workstreamActivityIdentity.js +14 -0
  1112. package/dist/sync/v3/workstreamCoexistence.d.ts +19 -0
  1113. package/dist/sync/v3/workstreamCoexistence.js +64 -0
  1114. package/dist/sync/v3/workstreamMutationPayload.d.ts +27 -0
  1115. package/dist/sync/v3/workstreamMutationPayload.js +147 -0
  1116. package/dist/sync/v3/workstreamMutationService.d.ts +72 -0
  1117. package/dist/sync/v3/workstreamMutationService.js +256 -0
  1118. package/dist/sync/v3/workstreamTaskOrderMutationService.d.ts +55 -0
  1119. package/dist/sync/v3/workstreamTaskOrderMutationService.js +110 -0
  1120. package/dist/sync/v3/workstreamTaskOrderSync.d.ts +14 -0
  1121. package/dist/sync/v3/workstreamTaskOrderSync.js +25 -0
  1122. package/dist/sync/workspaceContentManifest.d.ts +86 -0
  1123. package/dist/sync/workspaceContentManifest.js +123 -0
  1124. package/dist/sync/workspacePullFeed.d.ts +191 -2
  1125. package/dist/sync/workspacePullFeed.js +523 -135
  1126. package/dist/sync/workspacePushPreparedPlan.d.ts +21 -0
  1127. package/dist/sync/workspacePushPreparedPlan.js +1 -0
  1128. package/dist/sync/workspaceRepair.d.ts +17 -25
  1129. package/dist/sync/workspaceRepair.js +348 -25
  1130. package/dist/sync/workspaceSyncContentDecryption.d.ts +6 -0
  1131. package/dist/sync/workspaceSyncContentDecryption.js +11 -0
  1132. package/dist/sync/workspaceSyncModel.d.ts +227 -5
  1133. package/dist/sync/workspaceSyncModel.js +398 -37
  1134. package/dist/sync/workspaceSyncSnapshotProjection.d.ts +11 -0
  1135. package/dist/sync/workspaceSyncSnapshotProjection.js +101 -0
  1136. package/dist/sync/workspaceSyncState.d.ts +13 -0
  1137. package/dist/sync/workspaceSyncState.js +36 -0
  1138. package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +106 -0
  1139. package/dist/sync/workspaceSyncV2SnapshotBuilder.js +193 -0
  1140. package/dist/types.d.ts +31 -15
  1141. package/dist/types.js +1 -3
  1142. package/dist/ui/ai-profile-clients/amazon-nova.svg +1 -0
  1143. package/dist/ui/ai-profile-clients/antigravity.png +0 -0
  1144. package/dist/ui/ai-profile-clients/chatgpt.svg +10 -0
  1145. package/dist/ui/ai-profile-clients/claude-chat.svg +1 -0
  1146. package/dist/ui/ai-profile-clients/claude-code.svg +15 -0
  1147. package/dist/ui/ai-profile-clients/cline-app-icon-light.png +0 -0
  1148. package/dist/ui/ai-profile-clients/cline.svg +16 -0
  1149. package/dist/ui/ai-profile-clients/codex.svg +1 -0
  1150. package/dist/ui/ai-profile-clients/copilot.png +0 -0
  1151. package/dist/ui/ai-profile-clients/cursor.svg +1 -0
  1152. package/dist/ui/ai-profile-clients/deepseek.svg +1 -0
  1153. package/dist/ui/ai-profile-clients/gemini-cli-icon.png +0 -0
  1154. package/dist/ui/ai-profile-clients/gemini.svg +10 -0
  1155. package/dist/ui/ai-profile-clients/grok.svg +31 -0
  1156. package/dist/ui/ai-profile-clients/kiro.svg +11 -0
  1157. package/dist/ui/ai-profile-clients/llama.svg +1 -0
  1158. package/dist/ui/ai-profile-clients/mistral.svg +1 -0
  1159. package/dist/ui/ai-profile-clients/ms_copilot.jpeg +0 -0
  1160. package/dist/ui/ai-profile-clients/openclaw.png +0 -0
  1161. package/dist/ui/ai-profile-clients/perplexity.svg +1 -0
  1162. package/dist/ui/ai-profile-clients/vscode.svg +41 -0
  1163. package/dist/ui/ai-profile-clients/windsurf.svg +11 -0
  1164. package/dist/ui/assets/AiIdentityRosterCard-MZs7lVED.js +1 -0
  1165. package/dist/ui/assets/AiProfilesModule-C3i0LOxe.js +1 -0
  1166. package/dist/ui/assets/AnnotatedAttachmentWorkspace-CBRZ8rca.css +1 -0
  1167. package/dist/ui/assets/AnnotatedAttachmentWorkspace-DVZk5Tln.js +3 -0
  1168. package/dist/ui/assets/AssetTraySortControl-B9k5caQW.css +1 -0
  1169. package/dist/ui/assets/AssetTraySortControl-Kf1pelSy.js +1 -0
  1170. package/dist/ui/assets/ContextAttachmentManager-B8boOs6Q.js +3 -0
  1171. package/dist/ui/assets/DocumentWorkspace-BIBGBfd7.css +1 -0
  1172. package/dist/ui/assets/DocumentWorkspace-DXH4XUsB.js +261 -0
  1173. package/dist/ui/assets/EntityActivityTimeline-BfJbZRdl.css +1 -0
  1174. package/dist/ui/assets/EntityActivityTimeline-BtSTq0ON.js +1 -0
  1175. package/dist/ui/assets/PlanningModule-BPVyEa-f.js +1 -0
  1176. package/dist/ui/assets/PlanningModule-CoIR9hbV.css +1 -0
  1177. package/dist/ui/assets/PlansPage-C2nkK2Bp.css +1 -0
  1178. package/dist/ui/assets/PlansPage-ChqgxALc.js +1 -0
  1179. package/dist/ui/assets/TaskContextUpload-CB3ol0sN.js +1 -0
  1180. package/dist/ui/assets/TaskContextUpload-qmBeUw3u.css +1 -0
  1181. package/dist/ui/assets/TaskSettings-g4ECKNOz.js +12 -0
  1182. package/dist/ui/assets/TaskforceAgentsModule-BazdUwxZ.js +21 -0
  1183. package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +1 -0
  1184. package/dist/ui/assets/WorkflowManagerModule-DF10XENz.css +1 -0
  1185. package/dist/ui/assets/WorkflowManagerModule-DWFspC-o.js +1 -0
  1186. package/dist/ui/assets/antigravity-DRKQga2U.png +0 -0
  1187. package/dist/ui/assets/cursor-BM_3k4Y4.svg +1 -0
  1188. package/dist/ui/assets/gemini-cli-icon-dBAVjCcn.png +0 -0
  1189. package/dist/ui/assets/grok-BuodbWaG.svg +31 -0
  1190. package/dist/ui/assets/index-BUplSsv_.js +7 -0
  1191. package/dist/ui/assets/index-gz2EXuoK.css +1 -0
  1192. package/dist/ui/assets/{vendor-dnd-DRzYolkg.js → vendor-dnd-CJ-AjP-Y.js} +1 -1
  1193. package/dist/ui/assets/{vendor-icons-CLnehDTw.js → vendor-icons-BkFLXavV.js} +1 -1
  1194. package/dist/ui/assets/{vendor-markdown-BUxTU7dS.js → vendor-markdown-_lhNCyq-.js} +9 -9
  1195. package/dist/ui/assets/vendor-router-AqJMU8Lz.js +3 -0
  1196. package/dist/ui/assets/vscode-C_7wk1WI.svg +41 -0
  1197. package/dist/ui/branding/logos/logo_dark_bg.png +0 -0
  1198. package/dist/ui/branding/logos/logo_favicon_dark.png +0 -0
  1199. package/dist/ui/branding/logos/logo_favicon_dark.svg +56 -0
  1200. package/dist/ui/branding/logos/logo_favicon_light.png +0 -0
  1201. package/dist/ui/branding/logos/logo_light_bg.png +0 -0
  1202. package/dist/ui/images/Taskforce_Van.webp +0 -0
  1203. package/dist/ui/index.html +6 -6
  1204. package/dist/update/uiUpdateService.d.ts +43 -0
  1205. package/dist/update/uiUpdateService.js +149 -0
  1206. package/dist/update/updateCli.d.ts +15 -0
  1207. package/dist/update/updateCli.js +76 -0
  1208. package/dist/update/updateExecutor.d.ts +40 -0
  1209. package/dist/update/updateExecutor.js +474 -0
  1210. package/dist/update/updateStatus.d.ts +83 -0
  1211. package/dist/update/updateStatus.js +703 -0
  1212. package/dist/utils/aiProfileAvatarPaths.d.ts +14 -0
  1213. package/dist/utils/aiProfileAvatarPaths.js +52 -0
  1214. package/dist/utils/aiProfileDefaultLogo.d.ts +7 -0
  1215. package/dist/utils/aiProfileDefaultLogo.js +84 -0
  1216. package/dist/utils/aiProfileEvents.d.ts +9 -1
  1217. package/dist/utils/annotatedAttachments.d.ts +8 -0
  1218. package/dist/utils/annotatedAttachments.js +17 -1
  1219. package/dist/utils/assetTraySorting.d.ts +25 -0
  1220. package/dist/utils/assetTraySorting.js +83 -0
  1221. package/dist/utils/assignees.d.ts +5 -0
  1222. package/dist/utils/assignees.js +14 -9
  1223. package/dist/utils/authLogin.d.ts +10 -0
  1224. package/dist/utils/authLogin.js +8 -0
  1225. package/dist/utils/authSessionEvents.d.ts +2 -0
  1226. package/dist/utils/authSessionEvents.js +6 -0
  1227. package/dist/utils/avatarUpload.js +5 -5
  1228. package/dist/utils/canonicalReferenceAttachments.d.ts +12 -0
  1229. package/dist/utils/canonicalReferenceAttachments.js +42 -0
  1230. package/dist/utils/cloudAssetDisplay.d.ts +2 -0
  1231. package/dist/utils/cloudAssetDisplay.js +8 -0
  1232. package/dist/utils/constants.d.ts +4 -11
  1233. package/dist/utils/constants.js +6 -65
  1234. package/dist/utils/contextAttachmentPreview.d.ts +11 -0
  1235. package/dist/utils/contextAttachmentPreview.js +8 -0
  1236. package/dist/utils/contextAttachmentUpload.d.ts +10 -0
  1237. package/dist/utils/contextAttachmentUpload.js +151 -0
  1238. package/dist/utils/contextFiles.d.ts +1 -1
  1239. package/dist/utils/contextFiles.js +4 -4
  1240. package/dist/utils/documentNames.js +6 -4
  1241. package/dist/utils/entityReferences.d.ts +14 -0
  1242. package/dist/utils/entityReferences.js +21 -0
  1243. package/dist/utils/httpSetCookie.d.ts +3 -0
  1244. package/dist/utils/httpSetCookie.js +22 -0
  1245. package/dist/utils/imageNoteStoragePaths.d.ts +3 -0
  1246. package/dist/utils/imageNoteStoragePaths.js +19 -0
  1247. package/dist/utils/imageReferences.d.ts +6 -0
  1248. package/dist/utils/imageReferences.js +1 -0
  1249. package/dist/utils/planningArchiveOrchestrator.d.ts +23 -0
  1250. package/dist/utils/planningArchiveOrchestrator.js +37 -0
  1251. package/dist/utils/planningArchivePresentation.d.ts +20 -0
  1252. package/dist/utils/planningArchivePresentation.js +23 -0
  1253. package/dist/utils/planningArchiveReadiness.d.ts +26 -0
  1254. package/dist/utils/planningArchiveReadiness.js +30 -0
  1255. package/dist/utils/planningFavorites.d.ts +7 -0
  1256. package/dist/utils/planningFavorites.js +34 -0
  1257. package/dist/utils/syncEventPresentation.js +53 -0
  1258. package/dist/utils/syncStatusPresentation.d.ts +25 -0
  1259. package/dist/utils/syncStatusPresentation.js +86 -5
  1260. package/dist/utils/taskActivity.d.ts +9 -2
  1261. package/dist/utils/taskActivity.js +61 -0
  1262. package/dist/utils/taskDraftDefaults.d.ts +0 -8
  1263. package/dist/utils/taskDraftDefaults.js +0 -4
  1264. package/dist/utils/taskEvents.d.ts +11 -0
  1265. package/dist/utils/taskEvents.js +6 -0
  1266. package/dist/utils/taskHeaderQuickFilter.d.ts +14 -0
  1267. package/dist/utils/taskHeaderQuickFilter.js +32 -0
  1268. package/dist/utils/taskInvalidation.d.ts +23 -0
  1269. package/dist/utils/taskInvalidation.js +67 -0
  1270. package/dist/utils/taskNormalization.d.ts +2 -1
  1271. package/dist/utils/taskNormalization.js +44 -18
  1272. package/dist/utils/taskReferences.d.ts +16 -0
  1273. package/dist/utils/taskReferences.js +63 -0
  1274. package/dist/utils/taskforceAgentEvents.d.ts +8 -0
  1275. package/dist/utils/taskforceAgentEvents.js +6 -0
  1276. package/dist/utils/taskforceAgentSkillEvents.d.ts +7 -0
  1277. package/dist/utils/taskforceAgentSkillEvents.js +8 -0
  1278. package/dist/utils/uiNotice.d.ts +3 -0
  1279. package/dist/utils/uiNotice.js +1 -1
  1280. package/dist/utils/workspaceResourceEvents.d.ts +7 -0
  1281. package/dist/utils/workspaceResourceEvents.js +6 -0
  1282. package/dist/utils/workspaceSyncPresentation.d.ts +24 -0
  1283. package/dist/utils/workspaceSyncPresentation.js +243 -6
  1284. package/package.json +74 -21
  1285. package/dist/components/features/AgentsModule.d.ts +0 -18
  1286. package/dist/components/features/AgentsModule.js +0 -479
  1287. package/dist/components/features/InitiativesModule.d.ts +0 -22
  1288. package/dist/components/features/InitiativesModule.js +0 -33
  1289. package/dist/components/features/WorkflowsModule.d.ts +0 -27
  1290. package/dist/components/features/WorkflowsModule.js +0 -21
  1291. package/dist/components/features/settings/WorkflowEditor.d.ts +0 -15
  1292. package/dist/components/features/settings/WorkflowEditor.js +0 -245
  1293. package/dist/components/views/panels/DocumentFilterToolbar.d.ts +0 -10
  1294. package/dist/components/views/panels/DocumentFilterToolbar.js +0 -7
  1295. package/dist/components/views/standalone/modals/AccountHubModal.d.ts +0 -61
  1296. package/dist/components/views/standalone/modals/AccountHubModal.js +0 -108
  1297. package/dist/components/views/standalone/modals/EditProfileModal.d.ts +0 -19
  1298. package/dist/components/views/standalone/modals/EditProfileModal.js +0 -11
  1299. package/dist/hooks/ui/useResourceExport.d.ts +0 -21
  1300. package/dist/hooks/ui/useResourceExport.js +0 -87
  1301. package/dist/hooks/ui/useWorkflowTemplates.d.ts +0 -37
  1302. package/dist/hooks/ui/useWorkflowTemplates.js +0 -116
  1303. package/dist/mcp/clientProfileDefaults.d.ts +0 -12
  1304. package/dist/mcp/clientProfileDefaults.js +0 -41
  1305. package/dist/resources/templates/WORKFLOW_V2_POLICY.md +0 -55
  1306. package/dist/resources/templates/environments/aider.yaml +0 -14
  1307. package/dist/resources/templates/environments/antigravity.yaml +0 -10
  1308. package/dist/resources/templates/environments/claude.yaml +0 -10
  1309. package/dist/resources/templates/environments/cline.yaml +0 -10
  1310. package/dist/resources/templates/environments/codex.yaml +0 -13
  1311. package/dist/resources/templates/environments/copilot.yaml +0 -10
  1312. package/dist/resources/templates/environments/cursor.yaml +0 -9
  1313. package/dist/resources/templates/environments/gemini.yaml +0 -9
  1314. package/dist/resources/templates/environments/windsurf.yaml +0 -10
  1315. package/dist/resources/templates/workflow-sources/README.md +0 -9
  1316. package/dist/resources/templates/workflow-sources/workflowDocs.mjs +0 -530
  1317. package/dist/resources/templates/workflow-sources/workflowEditorOverrides.json +0 -1
  1318. package/dist/resources/templates/workflows/collaborate.yaml +0 -109
  1319. package/dist/resources/templates/workflows/do.yaml +0 -87
  1320. package/dist/resources/templates/workflows/evaluate.yaml +0 -116
  1321. package/dist/resources/templates/workflows/execute.yaml +0 -156
  1322. package/dist/resources/templates/workflows/plan.yaml +0 -118
  1323. package/dist/resources/templates/workflows/review.yaml +0 -114
  1324. package/dist/services/formatTransformers.d.ts +0 -29
  1325. package/dist/services/formatTransformers.js +0 -56
  1326. package/dist/services/templateEngine.d.ts +0 -46
  1327. package/dist/services/templateEngine.js +0 -148
  1328. package/dist/shared/workflowDefaults.d.ts +0 -9
  1329. package/dist/shared/workflowDefaults.js +0 -11
  1330. package/dist/ui/agent-logos/Gemini CLI.jpeg +0 -0
  1331. package/dist/ui/agent-logos/antigravity.jpeg +0 -0
  1332. package/dist/ui/agent-logos/chatgpt.png +0 -0
  1333. package/dist/ui/agent-logos/claude-code.jpeg +0 -0
  1334. package/dist/ui/agent-logos/codex.jpeg +0 -0
  1335. package/dist/ui/agent-logos/cursor.png +0 -0
  1336. package/dist/ui/agent-logos/openclaw.jpeg +0 -0
  1337. package/dist/ui/agent-logos/windsurf.png +0 -0
  1338. package/dist/ui/assets/AgentsModule-C4LcqhcZ.js +0 -1
  1339. package/dist/ui/assets/AnnotatedAttachmentWorkspace-B-Dq22d2.js +0 -3
  1340. package/dist/ui/assets/AnnotatedAttachmentWorkspace-BVKew-mH.css +0 -1
  1341. package/dist/ui/assets/ContextAttachmentManager-DsXPTvi-.js +0 -3
  1342. package/dist/ui/assets/DocumentWorkspace-CxA1wO3U.js +0 -252
  1343. package/dist/ui/assets/DocumentWorkspace-D4rJKXzd.css +0 -1
  1344. package/dist/ui/assets/EntityActivityTimeline-B8nSe8l3.js +0 -1
  1345. package/dist/ui/assets/EntityActivityTimeline-DyqvvhuF.css +0 -1
  1346. package/dist/ui/assets/InitiativesModule-VY95v38E.js +0 -1
  1347. package/dist/ui/assets/PlansPage-CQbKDv1a.js +0 -1
  1348. package/dist/ui/assets/PlansPage-DeAzWYTb.css +0 -1
  1349. package/dist/ui/assets/TaskContextUpload-DvDlNpHC.js +0 -1
  1350. package/dist/ui/assets/TaskSettings-CUWbYYtP.js +0 -12
  1351. package/dist/ui/assets/WorkflowsModule-CgM3Jako.js +0 -5
  1352. package/dist/ui/assets/documentReferences-Do9YjrS3.js +0 -1
  1353. package/dist/ui/assets/index--mh3pktj.js +0 -5
  1354. package/dist/ui/assets/index-BawaaEXS.css +0 -1
  1355. package/dist/ui/assets/vendor-router-BbWMxlnO.js +0 -3
  1356. package/dist/ui/branding/logos/logo_black_01.png +0 -0
  1357. package/dist/ui/branding/logos/logo_black_02.png +0 -0
  1358. package/dist/ui/branding/logos/logo_white_01.png +0 -0
  1359. package/dist/ui/branding/logos/logo_white_02.png +0 -0
  1360. package/scripts/generate-workflow-templates.mjs +0 -134
  1361. package/src/resources/templates/WORKFLOW_V2_POLICY.md +0 -55
  1362. package/src/resources/templates/environments/aider.yaml +0 -14
  1363. package/src/resources/templates/environments/antigravity.yaml +0 -10
  1364. package/src/resources/templates/environments/claude.yaml +0 -10
  1365. package/src/resources/templates/environments/cline.yaml +0 -10
  1366. package/src/resources/templates/environments/codex.yaml +0 -13
  1367. package/src/resources/templates/environments/copilot.yaml +0 -10
  1368. package/src/resources/templates/environments/cursor.yaml +0 -9
  1369. package/src/resources/templates/environments/gemini.yaml +0 -9
  1370. package/src/resources/templates/environments/windsurf.yaml +0 -10
  1371. package/src/resources/templates/workflow-sources/README.md +0 -9
  1372. package/src/resources/templates/workflow-sources/workflowDocs.mjs +0 -530
  1373. package/src/resources/templates/workflow-sources/workflowEditorOverrides.json +0 -1
  1374. package/src/resources/templates/workflows/collaborate.yaml +0 -109
  1375. package/src/resources/templates/workflows/do.yaml +0 -87
  1376. package/src/resources/templates/workflows/evaluate.yaml +0 -116
  1377. package/src/resources/templates/workflows/execute.yaml +0 -156
  1378. package/src/resources/templates/workflows/plan.yaml +0 -118
  1379. package/src/resources/templates/workflows/review.yaml +0 -114
  1380. /package/dist/ui/branding/logos/{logo_dark.svg → logo_dark_no_bg.svg} +0 -0
  1381. /package/dist/ui/branding/logos/{logo_favicon.svg → logo_favicon_light.svg} +0 -0
  1382. /package/dist/ui/branding/logos/{logo_light.svg → logo_light_no_bg.svg} +0 -0
@@ -13,8 +13,7 @@
13
13
  * === SECTION: Auth State === Line ~426 — isAuthenticated, authBlocked, userId, beta access
14
14
  * === SECTION: Bootstrap State === Line ~442 — bootstrapPhase, setupState, runtimeCapabilities
15
15
  * === SECTION: Fetch Intercept === Line ~490 — window.fetch patch for cloud API routing
16
- * === SECTION: Workflow Templates === Line ~577 — fetchWorkflows, fetchInitiativeTemplates
17
- * === SECTION: Export State === Line ~678 — exportEnvironment, exportWorkflowsPath
16
+ * === SECTION: Initiative Templates === Line ~577 — fetchInitiativeTemplates
18
17
  * === SECTION: Task State === Line ~1065 — tasks, archivedTasks, editingTaskId
19
18
  * === SECTION: Filter & Sort State === Line ~1394 — searchQuery, filterCategories, sortBy, sortOrder
20
19
  * === SECTION: UI State === Line ~1469 — uiStateReady, persisted UI preferences
@@ -40,20 +39,20 @@ import { getSupportedLocales, initializeLocale } from '../localization';
40
39
  import { WORKSPACE_BOOTSTRAP_SCOPE, isReservedWorkspaceId, resolveWorkspaceSelectionScopeForRuntime, resolveWorkspaceUiStateScopeForRuntime } from '../utils/workspaceIdentity';
41
40
  import { resolveRuntimeModeContract } from '../shared/runtimeContract';
42
41
  import { DEFAULT_TYPE_VALUE } from '../shared/taxonomyDefaults.js';
43
- import { cloneDefaultWorkflowDefinitions } from '../shared/workflowDefaults.js';
44
42
  import { resolveClientDeploymentConfig } from '../config/clientDeployment';
45
43
  import { resolveTaskforceMcpBaseUrlFromBaseUrl } from '../config/cloudEnvironment';
46
44
  import { buildBootstrapTraceId, withBootstrapTraceHeader } from '../utils/bootstrapTrace';
45
+ import { buildTaskforceCredentialLoginPayload } from '../utils/authLogin';
47
46
  import { createDefaultAssigneeOptions } from '../utils/assignees';
48
47
  import { persistLocalMutationActorUserId, readLocalMutationActorUserId } from '../utils/taskforceApiClient';
48
+ import { resolveWorkspaceSyncV3CombinedWireContract, } from '../sync/v3/workspaceSyncV3CombinedWireContract.js';
49
49
  import { useSyncOrchestrator } from './useSyncOrchestrator';
50
50
  import { useRealtimeSync } from './useRealtimeSync';
51
51
  import { useUiNotice } from './ui/useUiNotice';
52
- import { useResourceExport } from './ui/useResourceExport';
53
52
  import { useSettingsModel } from './ui/useSettingsModel';
54
53
  import { useSettingsPersistence } from './ui/useSettingsPersistence';
55
54
  import { useSettingsTaxonomyManagement } from './ui/useSettingsTaxonomyManagement';
56
- import { useWorkflowTemplates } from './ui/useWorkflowTemplates';
55
+ import { useInitiativeTemplates } from './ui/useInitiativeTemplates';
57
56
  import { useZenMode } from './ui/useZenMode';
58
57
  import { useTaskData } from './useTaskData';
59
58
  import { useCurrentTaskRelations } from './tasks/useCurrentTaskRelations';
@@ -62,13 +61,25 @@ import { useTaskFilters } from './tasks/useTaskFilters';
62
61
  import { useTaskFormActions } from './tasks/useTaskFormActions';
63
62
  import { useTaskRelationships } from './tasks/useTaskRelationships';
64
63
  import { useTaskActions } from './tasks/useTaskActions';
65
- import { areFilterTaxonomySignaturesEqual, buildFilterTaxonomySignature, clearPersistedWorkspaceId, logBootstrapDebug, persistRemoteUiState, readPersistedAppUiState, readPersistedWorkspaceId, writePersistedAppUiState, writePersistedWorkspaceId } from './workspace/workspaceLocalState';
64
+ import { clearPersistedWorkspaceId, logBootstrapDebug, readPersistedWorkspaceId, writePersistedWorkspaceId } from './workspace/workspaceLocalState';
66
65
  import { useTaskforceApiRouting } from './workspace/useTaskforceApiRouting';
67
66
  import { useTaskforceAuthBootstrap } from './auth/useTaskforceAuthBootstrap';
68
67
  import { deriveAuthGuardPolicy } from './auth/useAuthGuardPolicy';
69
68
  import { useTaskforceWorkspaceBootstrap } from './workspace/useTaskforceWorkspaceBootstrap';
69
+ import { usePersistedAppUiState } from './workspace/usePersistedAppUiState';
70
70
  import { useDataVersionRefresh } from './sync/useDataVersionRefresh';
71
+ import { useDurableTaskMetadataMutation } from './sync/useDurableTaskMetadataMutation';
72
+ import { useDurableTaskCreateMutation } from './sync/useDurableTaskCreateMutation';
73
+ import { useDurableTaskStatusMutation } from './sync/useDurableTaskStatusMutation';
74
+ import { useDurableTaskLifecycleMutation } from './sync/useDurableTaskLifecycleMutation';
75
+ import { useDurableTaskDeleteMutation } from './sync/useDurableTaskDeleteMutation';
76
+ import { useDurableTaskRestoreMutation } from './sync/useDurableTaskRestoreMutation';
71
77
  import { BOOTSTRAP_REQUEST_TIMEOUT_MS } from './bootstrapTimeouts';
78
+ import { TASKFORCE_TASKS_MUTATED_EVENT } from '../utils/taskEvents';
79
+ import { createTaskInvalidationScope, mergeTaskInvalidationScopes, resolveTaskInvalidationHighlightIds, resolveRealtimeTaskInvalidation, } from '../utils/taskInvalidation';
80
+ import { createCloudWorkstreamHttpMutationClient, fetchWorkstreamHttpMutation, isConclusiveWorkstreamHttpResponse, selectCreatedWorkstreamAfterRefresh, } from './workstreams/workstreamHttpMutation';
81
+ import { dispatchTaskforceWorkspaceResourcesInvalidated } from '../utils/workspaceResourceEvents';
82
+ import { dispatchTaskforceAuthSessionChanged } from '../utils/authSessionEvents';
72
83
  function upsertEntityById(items, nextItem) {
73
84
  const existingIndex = items.findIndex((item) => item.id === nextItem.id);
74
85
  if (existingIndex === -1) {
@@ -76,6 +87,17 @@ function upsertEntityById(items, nextItem) {
76
87
  }
77
88
  return items.map((item, index) => (index === existingIndex ? nextItem : item));
78
89
  }
90
+ function createInitialPlanningLoadState() {
91
+ return {
92
+ status: 'loading',
93
+ error: null,
94
+ isRefreshing: false,
95
+ collections: {
96
+ initiatives: 'loading',
97
+ workstreams: 'loading',
98
+ },
99
+ };
100
+ }
79
101
  const ENV_DEPLOYMENT = resolveClientDeploymentConfig(import.meta.env);
80
102
  const DEFAULT_CLOUD_APP_ORIGIN = (() => {
81
103
  const configuredBase = ENV_DEPLOYMENT.baseUrl;
@@ -120,7 +142,7 @@ function createBootstrapTimeoutError(timeoutMs) {
120
142
  timeoutError.name = 'BootstrapTimeoutError';
121
143
  return timeoutError;
122
144
  }
123
- function sanitizePlanningBootstrapPayload(input) {
145
+ export function sanitizePlanningBootstrapPayload(input) {
124
146
  const payload = input && typeof input === 'object' ? input : {};
125
147
  const initiatives = Array.isArray(payload.initiatives)
126
148
  ? payload.initiatives.filter((item) => Boolean(item && typeof item === 'object' && typeof item.id === 'string'))
@@ -147,8 +169,15 @@ function sanitizePlanningBootstrapPayload(input) {
147
169
  .map((task) => ({
148
170
  id: String(task.id || '').trim(),
149
171
  referenceNumber: typeof task.referenceNumber === 'number' ? task.referenceNumber : null,
172
+ localReferenceNumber: typeof task.localReferenceNumber === 'number' ? task.localReferenceNumber : null,
173
+ referenceLabel: typeof task.referenceLabel === 'string'
174
+ ? task.referenceLabel.trim() || undefined
175
+ : undefined,
150
176
  title: String(task.title || '').trim() || 'Untitled Task',
151
177
  status: typeof task.status === 'string' ? task.status : null,
178
+ assignee: typeof task.assignee === 'string' ? task.assignee : null,
179
+ attachmentCount: Math.max(0, Number(task.attachmentCount) || 0),
180
+ isArchived: Boolean(task.isArchived),
152
181
  })),
153
182
  }];
154
183
  })
@@ -159,7 +188,7 @@ function sanitizePlanningBootstrapPayload(input) {
159
188
  workstreamTaskSummaries,
160
189
  };
161
190
  }
162
- export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, onClose }) {
191
+ export function useTaskforce({ config = {}, initialTaskId, initialActivityEntryId, requestedWorkspaceId, onTaskCountChange, onClose }) {
163
192
  const mergedConfig = { ...DEFAULT_CONFIG, ...config };
164
193
  const { categories, types, apiEndpoint, apiBaseUrl, cloudAuthBaseUrl, cloudMcpBaseUrl, wsBaseUrl, shortcut: configShortcut } = mergedConfig;
165
194
  const runtimeHost = typeof window !== 'undefined'
@@ -178,7 +207,18 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
178
207
  cloudAuthViaLocalProxy: false,
179
208
  authSource: '',
180
209
  workspaceMode: '',
181
- workspaceSwitchingEnabled: null
210
+ workspaceSwitchingEnabled: null,
211
+ syncV3TaskMetadataActivation: false,
212
+ syncV3TaskCreateActivation: false,
213
+ syncV3TaskStatusActivation: false,
214
+ syncV3TaskDeleteActivation: false,
215
+ syncV3TaskCloudHttpRootActivation: false,
216
+ syncV3LocalOutboxDispatch: false,
217
+ localCoordinatorBrowserAuthorityGate: false,
218
+ syncV3InitiativeFeedActivation: undefined,
219
+ syncV3CombinedFeedRouteAvailable: undefined,
220
+ syncV3CombinedFeedActivation: undefined,
221
+ syncV3CombinedFeedCoverage: undefined
182
222
  });
183
223
  const [runtimeConfigReady, setRuntimeConfigReady] = useState(false);
184
224
  const normalizeBaseUrl = useCallback((value) => {
@@ -194,7 +234,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
194
234
  try {
195
235
  const res = await fetch('/api/taskforce/auth/runtime-config', {
196
236
  method: 'GET',
197
- credentials: 'include'
237
+ credentials: 'include',
238
+ cache: 'no-store',
198
239
  });
199
240
  if (!res.ok)
200
241
  return;
@@ -209,6 +250,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
209
250
  ? workspaceModeRaw
210
251
  : (runtimeModeHint === 'cloud' ? 'multi-cloud' : 'single-local');
211
252
  setRuntimeMode(runtimeModeHint);
253
+ const combinedFeedWire = resolveWorkspaceSyncV3CombinedWireContract(cfg.syncV3?.combinedFeed?.coverage || {});
212
254
  setRuntimeConfigOverride({
213
255
  cloudEnvironment: typeof cfg.cloudEnvironment === 'string'
214
256
  ? String(cfg.cloudEnvironment).trim().toLowerCase()
@@ -224,7 +266,24 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
224
266
  workspaceMode,
225
267
  workspaceSwitchingEnabled: typeof cfg.workspaceSwitchingEnabled === 'boolean'
226
268
  ? Boolean(cfg.workspaceSwitchingEnabled)
227
- : (workspaceMode === 'multi-cloud')
269
+ : (workspaceMode === 'multi-cloud'),
270
+ syncV3TaskMetadataActivation: cfg.syncV3?.taskMetadataActivation === true,
271
+ syncV3TaskCreateActivation: cfg.syncV3?.taskCreateActivation === true,
272
+ syncV3TaskStatusActivation: cfg.syncV3?.taskStatusActivation === true,
273
+ syncV3TaskDeleteActivation: cfg.syncV3?.taskDeleteActivation === true,
274
+ syncV3TaskCloudHttpRootActivation: cfg.syncV3?.taskCloudHttpRootActivation === true,
275
+ syncV3LocalOutboxDispatch: cfg.syncV3?.localOutboxDispatch === true,
276
+ localCoordinatorBrowserAuthorityGate: cfg.syncV3?.localCoordinatorBrowserAuthorityGate === true,
277
+ syncV3InitiativeFeedActivation: typeof cfg.syncV3?.initiativeFeedActivation === 'boolean'
278
+ ? cfg.syncV3.initiativeFeedActivation
279
+ : undefined,
280
+ syncV3CombinedFeedRouteAvailable: typeof cfg.syncV3?.combinedFeed?.routeAvailable === 'boolean'
281
+ ? cfg.syncV3.combinedFeed.routeAvailable
282
+ : undefined,
283
+ syncV3CombinedFeedActivation: typeof cfg.syncV3?.combinedFeed?.activationReady === 'boolean'
284
+ ? cfg.syncV3.combinedFeed.activationReady
285
+ : undefined,
286
+ syncV3CombinedFeedCoverage: combinedFeedWire?.coverage,
228
287
  });
229
288
  }
230
289
  catch {
@@ -379,6 +438,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
379
438
  const [isOpen, setIsOpen] = useState(false);
380
439
  const [showArchive, setShowArchive] = useState(false);
381
440
  const [taskScope, setTaskScope] = useState('open');
441
+ const [compressedCards, setCompressedCards] = useState(false);
382
442
  // Settings state
383
443
  const [currentTheme, setCurrentTheme] = useState(normalizeTaskforceTheme(mergedConfig.theme) || DEFAULT_TASKFORCE_THEME);
384
444
  const [globalTheme, setGlobalTheme] = useState(normalizeTaskforceTheme(mergedConfig.theme) || DEFAULT_TASKFORCE_THEME);
@@ -442,7 +502,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
442
502
  const authSessionLastCheckedAtRef = useRef(0);
443
503
  const authSessionLastResultRef = useRef(hasOptimisticLocalAuth);
444
504
  const currentWorkspaceIdRef = useRef(currentWorkspaceId);
445
- const pendingPersistedTaxonomyUiStateRef = useRef(null);
446
505
  const explicitWorkspaceSelectionRef = useRef(null);
447
506
  const workspaceTransitionEpochRef = useRef(0);
448
507
  const bootstrapTraceSeedRef = useRef((() => {
@@ -464,7 +523,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
464
523
  if (!nextWorkspaceId)
465
524
  return;
466
525
  const previousWorkspaceId = String(currentWorkspaceIdRef.current || '').trim();
467
- if (previousWorkspaceId && previousWorkspaceId !== nextWorkspaceId) {
526
+ if (!options?.skipTransitionReset && previousWorkspaceId && previousWorkspaceId !== nextWorkspaceId) {
468
527
  workspaceTransitionEpochRef.current += 1;
469
528
  setWorkspaceTransitionEpoch(workspaceTransitionEpochRef.current);
470
529
  }
@@ -495,6 +554,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
495
554
  workspaceId: String(currentWorkspaceIdRef.current || 'default').trim() || 'default',
496
555
  epoch: workspaceTransitionEpochRef.current
497
556
  }), []);
557
+ const getCurrentWorkspaceId = useCallback(() => currentWorkspaceIdRef.current, []);
498
558
  const isWorkspaceRequestStale = useCallback((requestState) => {
499
559
  const liveWorkspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
500
560
  return liveWorkspaceId !== requestState.workspaceId || workspaceTransitionEpochRef.current !== requestState.epoch;
@@ -541,7 +601,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
541
601
  const [buildInfo, setBuildInfo] = useState(null);
542
602
  const [keyShortcut, setKeyShortcut] = useState(mergedConfig.shortcut || 'Alt+T');
543
603
  const [priorities, setPriorities] = useState(mergedConfig.priorities || []);
544
- const [approaches] = useState(cloneDefaultWorkflowDefinitions());
545
604
  const [mcpHostRoot, setMcpHostRoot] = useState('');
546
605
  const [jsonBackupEnabled, setJsonBackupEnabled] = useState(false);
547
606
  const [globalJsonBackupEnabled, setGlobalJsonBackupEnabled] = useState(false);
@@ -559,7 +618,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
559
618
  });
560
619
  const [manualComplexityEnabled, setManualComplexityEnabled] = useState(false);
561
620
  const [checklistDropdownEnabled, setChecklistDropdownEnabled] = useState(true);
562
- const [showTaskCardStatusLabel, setShowTaskCardStatusLabel] = useState(true);
621
+ const [showTaskCardStatusLabel, setShowTaskCardStatusLabel] = useState(false);
563
622
  const [serverHostRoot, setServerHostRoot] = useState('');
564
623
  const [returnTab, setReturnTab] = useState(null);
565
624
  useTaskforceApiRouting({
@@ -567,22 +626,19 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
567
626
  resolveApiUrl,
568
627
  runtimeMode
569
628
  });
570
- const { availableWorkflows, initiativeTemplates, fetchWorkflows, fetchInitiativeTemplates, fetchWorkflowTemplate, fetchWorkflowOverrideNames, saveWorkflowTemplateDraft, resetWorkflowTemplateDraft } = useWorkflowTemplates({
629
+ const { initiativeTemplates, fetchInitiativeTemplates } = useInitiativeTemplates({
571
630
  shouldDeferProtectedApiCalls,
572
631
  shouldBlockProtectedApiCalls
573
632
  });
574
633
  const { zenMode, setZenModeState, toggleZenMode } = useZenMode();
575
- const { exportEnvironment, setExportEnvironment, availableEnvironments, loadAvailableEnvironments, exportWorkflowsPath, setExportWorkflowsPath, exportingResource, exportResult, handleExportWorkflows } = useResourceExport({
576
- storagePath,
577
- shouldDeferProtectedApiCalls,
578
- shouldBlockProtectedApiCalls
579
- });
580
634
  // Unsaved Changes Modal State
581
635
  const [unsavedModalOpen, setUnsavedModalOpen] = useState(false);
582
636
  const [pendingNavigation, setPendingNavigation] = useState(null);
583
637
  // === SECTION: UI Notice ===
584
638
  // Delegated to useUiNotice — see src/hooks/useUiNotice.ts
585
639
  const { uiNotice, pushNotice, clearNotice } = useUiNotice();
640
+ const uiNoticeRef = useRef(uiNotice);
641
+ uiNoticeRef.current = uiNotice;
586
642
  const [taskReturnTrail, setTaskReturnTrail] = useState([]);
587
643
  const tasksScrollRef = useRef(null);
588
644
  const [tasksScrollPos, setTasksScrollPos] = useState(0);
@@ -601,9 +657,21 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
601
657
  const [initiatives, setInitiatives] = useState([]);
602
658
  const [workstreams, setWorkstreams] = useState([]);
603
659
  const [planningBootstrapTaskSummaries, setPlanningBootstrapTaskSummaries] = useState([]);
660
+ const [planningLoadState, setPlanningLoadState] = useState(createInitialPlanningLoadState);
604
661
  const [deletedTasks, setDeletedTasks] = useState([]);
662
+ const [archiveHydratedWorkspaceId, setArchiveHydratedWorkspaceId] = useState(null);
663
+ const [deletedHydratedWorkspaceId, setDeletedHydratedWorkspaceId] = useState(null);
664
+ const [archiveLookupSettledKeys, setArchiveLookupSettledKeys] = useState(() => new Set());
665
+ const archiveHydrationRequestRef = useRef(null);
666
+ const deletedHydrationRequestRef = useRef(null);
605
667
  const [loadingTasks, setLoadingTasks] = useState(false);
606
668
  const [editingTaskId, setEditingTaskId] = useState(null);
669
+ const [pendingOpenTaskId, setPendingOpenTaskId] = useState(null);
670
+ const setPendingOpenTaskIdFromPersistedState = useCallback((taskId) => {
671
+ if (String(initialTaskId || '').trim())
672
+ return;
673
+ setPendingOpenTaskId(taskId);
674
+ }, [initialTaskId]);
607
675
  const [showMarkdownHelp, setShowMarkdownHelp] = useState(false);
608
676
  // copiedId is managed by useTaskMutations below.
609
677
  // Custom categories
@@ -769,6 +837,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
769
837
  // Form state
770
838
  const [loading, setLoading] = useState(false);
771
839
  const [error, setError] = useState('');
840
+ const clearTaskError = useCallback(() => setError(''), []);
772
841
  const AUTH_REQUIRED_ERROR = 'Authentication required. Sign in to continue.';
773
842
  const [referenceDataLoaded, setReferenceDataLoaded] = useState(false);
774
843
  const [assigneeOptionsLoaded, setAssigneeOptionsLoaded] = useState(false);
@@ -789,7 +858,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
789
858
  setTasks,
790
859
  setArchivedTasks,
791
860
  setLoadingTasks,
792
- getCurrentWorkspaceId: () => currentWorkspaceIdRef.current,
861
+ getCurrentWorkspaceId,
793
862
  workspaceResetKey: `${currentWorkspaceId}:${workspaceTransitionEpoch}`,
794
863
  shouldDeferProtectedApiCalls,
795
864
  shouldBlockProtectedApiCalls,
@@ -800,36 +869,37 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
800
869
  if (workspaceTransitionEpoch === 0)
801
870
  return;
802
871
  referenceDataRequestRef.current = null;
803
- lastLoadedUiStateKeyRef.current = '';
804
872
  lastAssigneeOptionsLoadKeyRef.current = '';
805
873
  lastConfigRefreshKeyRef.current = '';
806
874
  lastWorkspaceSyncStateLoadKeyRef.current = '';
807
875
  lastTaskSurfaceLoadKeyRef.current = '';
808
876
  lastSettingsSurfaceLoadKeyRef.current = '';
809
- setUiStateReady(false);
810
877
  setReferenceDataLoaded(false);
811
878
  setAssigneeOptions(createDefaultAssigneeOptions());
812
879
  setAssigneeOptionsLoaded(false);
813
880
  setDeletedTasks([]);
881
+ setArchiveHydratedWorkspaceId(null);
882
+ setDeletedHydratedWorkspaceId(null);
883
+ setArchiveLookupSettledKeys(new Set());
884
+ archiveHydrationRequestRef.current = null;
885
+ deletedHydrationRequestRef.current = null;
814
886
  setTasks([]);
815
887
  setArchivedTasks([]);
888
+ setInitiatives([]);
889
+ setWorkstreams([]);
890
+ setPlanningBootstrapTaskSummaries([]);
891
+ setPlanningLoadState(createInitialPlanningLoadState());
892
+ setPendingOpenTaskId(null);
816
893
  setLoadingTasks(false);
817
- if (cloudRealtimeFollowUpRefreshTimerRef.current !== null && typeof window !== 'undefined') {
818
- window.clearTimeout(cloudRealtimeFollowUpRefreshTimerRef.current);
819
- cloudRealtimeFollowUpRefreshTimerRef.current = null;
820
- }
821
- if (archiveBootstrapTimerRef.current !== null && typeof window !== 'undefined') {
822
- window.clearTimeout(archiveBootstrapTimerRef.current);
823
- archiveBootstrapTimerRef.current = null;
824
- }
825
894
  }, [setArchivedTasks, setLoadingTasks, setTasks, workspaceTransitionEpoch]);
826
895
  const fetchDeletedTasks = useCallback(async (isSilent = false, options) => {
827
896
  const ignoreAuthGuard = options?.ignoreAuthGuard === true;
828
897
  if (!ignoreAuthGuard && (shouldDeferProtectedApiCalls || shouldBlockProtectedApiCalls))
829
- return;
898
+ return false;
830
899
  if (!isSilent)
831
900
  setLoadingTasks(true);
832
901
  const requestState = getWorkspaceRequestState();
902
+ deletedTasksAbortRef.current?.abort('superseded');
833
903
  const abortController = new AbortController();
834
904
  deletedTasksAbortRef.current = abortController;
835
905
  try {
@@ -840,16 +910,20 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
840
910
  if (res.status === 401) {
841
911
  handleUnauthorized();
842
912
  setDeletedTasks([]);
843
- return;
913
+ return false;
844
914
  }
845
915
  if (res.status === 404) {
846
- setDeletedTasks([]);
847
- return;
916
+ if (!isWorkspaceRequestStale(requestState)) {
917
+ setDeletedTasks([]);
918
+ setDeletedHydratedWorkspaceId(requestState.workspaceId);
919
+ return true;
920
+ }
921
+ return false;
848
922
  }
849
923
  if (res.ok) {
850
924
  const data = await res.json();
851
925
  if (isWorkspaceRequestStale(requestState)) {
852
- return;
926
+ return false;
853
927
  }
854
928
  const sanitized = Array.isArray(data?.deleted)
855
929
  ? data.deleted
@@ -867,12 +941,16 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
867
941
  .filter((entry) => Boolean(entry))
868
942
  : [];
869
943
  setDeletedTasks(sanitized);
944
+ setDeletedHydratedWorkspaceId(requestState.workspaceId);
945
+ return true;
870
946
  }
947
+ return false;
871
948
  }
872
949
  catch (err) {
873
950
  if (isExpectedWorkspaceAbortFailure(err, abortController.signal) || isAbortError(err))
874
- return;
951
+ return false;
875
952
  console.error('[Taskforce] Failed to fetch deleted tasks:', err);
953
+ return false;
876
954
  }
877
955
  finally {
878
956
  if (deletedTasksAbortRef.current === abortController) {
@@ -901,6 +979,10 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
901
979
  }
902
980
  const abortController = new AbortController();
903
981
  planningEntitiesAbortRef.current = abortController;
982
+ setPlanningLoadState((current) => ({
983
+ ...current,
984
+ isRefreshing: true,
985
+ }));
904
986
  try {
905
987
  const planningTraceId = buildBootstrapTraceId({
906
988
  workspaceId: requestState.workspaceId,
@@ -937,19 +1019,35 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
937
1019
  }
938
1020
  };
939
1021
  let bootstrapPayload = null;
1022
+ let collectionStatus = {
1023
+ initiatives: 'ready',
1024
+ workstreams: 'ready',
1025
+ };
940
1026
  const bootstrapRes = await fetchPlanningRoute('/api/taskforce/planning/bootstrap');
941
1027
  if (bootstrapRes?.status === 401) {
942
1028
  handleUnauthorized();
943
1029
  setInitiatives([]);
944
1030
  setWorkstreams([]);
945
1031
  setPlanningBootstrapTaskSummaries([]);
1032
+ setPlanningLoadState({
1033
+ status: 'error',
1034
+ error: 'Sign in again to load Planning.',
1035
+ isRefreshing: false,
1036
+ collections: { initiatives: 'error', workstreams: 'error' },
1037
+ });
946
1038
  return;
947
1039
  }
948
1040
  if (bootstrapRes === null) {
949
1041
  throw createBootstrapTimeoutError(PLANNING_BOOTSTRAP_REQUEST_TIMEOUT_MS);
950
1042
  }
951
1043
  if (bootstrapRes.ok) {
952
- bootstrapPayload = sanitizePlanningBootstrapPayload(await bootstrapRes.json().catch(() => ({})));
1044
+ const bootstrapData = await bootstrapRes.json().catch(() => null);
1045
+ if (!bootstrapData
1046
+ || !Array.isArray(bootstrapData.initiatives)
1047
+ || !Array.isArray(bootstrapData.workstreams)) {
1048
+ throw new Error('Planning returned an incomplete response.');
1049
+ }
1050
+ bootstrapPayload = sanitizePlanningBootstrapPayload(bootstrapData);
953
1051
  }
954
1052
  else {
955
1053
  const [initiativesRes, workstreamsRes] = await Promise.all([
@@ -964,15 +1062,41 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
964
1062
  setInitiatives([]);
965
1063
  setWorkstreams([]);
966
1064
  setPlanningBootstrapTaskSummaries([]);
1065
+ setPlanningLoadState({
1066
+ status: 'error',
1067
+ error: 'Sign in again to load Planning.',
1068
+ isRefreshing: false,
1069
+ collections: { initiatives: 'error', workstreams: 'error' },
1070
+ });
967
1071
  return;
968
1072
  }
969
- const [initiativesData, workstreamsData] = await Promise.all([
970
- initiativesRes.ok ? initiativesRes.json().catch(() => []) : [],
971
- workstreamsRes.ok ? workstreamsRes.json().catch(() => []) : [],
1073
+ const readCollection = async (response, key) => {
1074
+ if (!response.ok)
1075
+ return { items: [], status: 'error' };
1076
+ const data = await response.json().catch(() => null);
1077
+ const items = Array.isArray(data)
1078
+ ? data
1079
+ : data && typeof data === 'object' && Array.isArray(data[key])
1080
+ ? data[key]
1081
+ : null;
1082
+ return items
1083
+ ? { items, status: 'ready' }
1084
+ : { items: [], status: 'error' };
1085
+ };
1086
+ const [initiativeResult, workstreamResult] = await Promise.all([
1087
+ readCollection(initiativesRes, 'initiatives'),
1088
+ readCollection(workstreamsRes, 'workstreams'),
972
1089
  ]);
1090
+ collectionStatus = {
1091
+ initiatives: initiativeResult.status,
1092
+ workstreams: workstreamResult.status,
1093
+ };
1094
+ if (collectionStatus.initiatives === 'error' && collectionStatus.workstreams === 'error') {
1095
+ throw new Error('Planning could not be loaded.');
1096
+ }
973
1097
  bootstrapPayload = sanitizePlanningBootstrapPayload({
974
- initiatives: initiativesData,
975
- workstreams: workstreamsData,
1098
+ initiatives: initiativeResult.items,
1099
+ workstreams: workstreamResult.items,
976
1100
  workstreamTaskSummaries: [],
977
1101
  });
978
1102
  }
@@ -982,6 +1106,14 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
982
1106
  setInitiatives(bootstrapPayload.initiatives);
983
1107
  setWorkstreams(bootstrapPayload.workstreams);
984
1108
  setPlanningBootstrapTaskSummaries(bootstrapPayload.workstreamTaskSummaries);
1109
+ const isPartial = collectionStatus.initiatives === 'error' || collectionStatus.workstreams === 'error';
1110
+ const isEmpty = bootstrapPayload.initiatives.length === 0 && bootstrapPayload.workstreams.length === 0;
1111
+ setPlanningLoadState({
1112
+ status: isPartial ? 'partial' : isEmpty ? 'empty' : 'ready',
1113
+ error: isPartial ? 'Some planning data could not be loaded.' : null,
1114
+ isRefreshing: false,
1115
+ collections: collectionStatus,
1116
+ });
985
1117
  }
986
1118
  catch (err) {
987
1119
  if (isExpectedWorkspaceAbortFailure(err, abortController.signal) || isAbortError(err))
@@ -998,6 +1130,19 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
998
1130
  else {
999
1131
  console.error('[Taskforce] Failed to fetch planning entities:', err);
1000
1132
  }
1133
+ if (!isWorkspaceRequestStale(requestState)) {
1134
+ const hasExistingPlanningData = initiatives.length > 0 || workstreams.length > 0;
1135
+ setPlanningLoadState((current) => ({
1136
+ status: hasExistingPlanningData ? 'partial' : 'error',
1137
+ error: err instanceof Error && err.message
1138
+ ? err.message
1139
+ : 'Planning could not be loaded.',
1140
+ isRefreshing: false,
1141
+ collections: hasExistingPlanningData
1142
+ ? current.collections
1143
+ : { initiatives: 'error', workstreams: 'error' },
1144
+ }));
1145
+ }
1001
1146
  if (typeof window !== 'undefined'
1002
1147
  && !isWorkspaceRequestStale(requestState)
1003
1148
  && initiatives.length === 0
@@ -1025,31 +1170,167 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1025
1170
  shouldBlockProtectedApiCalls,
1026
1171
  workstreams.length,
1027
1172
  ]);
1173
+ const fetchPlanningEntityDetail = useCallback(async (entityType, id) => {
1174
+ const normalizedId = String(id || '').trim();
1175
+ if (!normalizedId) {
1176
+ throw new Error(`Cannot load ${entityType} details without an id.`);
1177
+ }
1178
+ const requestState = getWorkspaceRequestState();
1179
+ const res = await fetch(`/api/taskforce/${entityType}/${encodeURIComponent(normalizedId)}`);
1180
+ const data = await res.json().catch(() => ({}));
1181
+ if (!res.ok) {
1182
+ throw new Error(data?.error || `Failed to load ${entityType} details (${res.status})`);
1183
+ }
1184
+ const entity = data;
1185
+ if (!isWorkspaceRequestStale(requestState)) {
1186
+ if (entityType === 'initiative') {
1187
+ setInitiatives((current) => upsertEntityById(current, entity));
1188
+ }
1189
+ else {
1190
+ setWorkstreams((current) => upsertEntityById(current, entity));
1191
+ }
1192
+ }
1193
+ return entity;
1194
+ }, [getWorkspaceRequestState, isWorkspaceRequestStale]);
1028
1195
  const fetchTasks = useCallback(async (isSilent = false, options) => {
1029
1196
  await fetchTasksBase(isSilent, options);
1030
1197
  }, [fetchTasksBase]);
1031
1198
  const fetchArchive = useCallback(async (isSilent = false, options) => {
1032
- await fetchArchiveBase(isSilent, options);
1199
+ const requestWorkspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
1200
+ const loaded = await fetchArchiveBase(isSilent, options);
1201
+ const liveWorkspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
1202
+ if (loaded && liveWorkspaceId === requestWorkspaceId) {
1203
+ setArchiveHydratedWorkspaceId(requestWorkspaceId);
1204
+ }
1205
+ return loaded;
1033
1206
  }, [fetchArchiveBase]);
1207
+ const ensureArchiveHydrated = useCallback((isSilent = true, options) => {
1208
+ const workspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
1209
+ if (archiveHydratedWorkspaceId === workspaceId)
1210
+ return Promise.resolve(true);
1211
+ const pending = archiveHydrationRequestRef.current;
1212
+ if (pending?.workspaceId === workspaceId)
1213
+ return pending.promise;
1214
+ const promise = fetchArchive(isSilent, options).finally(() => {
1215
+ if (archiveHydrationRequestRef.current?.promise === promise) {
1216
+ archiveHydrationRequestRef.current = null;
1217
+ }
1218
+ });
1219
+ archiveHydrationRequestRef.current = { workspaceId, promise };
1220
+ return promise;
1221
+ }, [archiveHydratedWorkspaceId, fetchArchive]);
1222
+ const ensureDeletedTasksHydrated = useCallback((isSilent = true, options) => {
1223
+ const workspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
1224
+ if (deletedHydratedWorkspaceId === workspaceId)
1225
+ return Promise.resolve(true);
1226
+ const pending = deletedHydrationRequestRef.current;
1227
+ if (pending?.workspaceId === workspaceId)
1228
+ return pending.promise;
1229
+ const promise = fetchDeletedTasks(isSilent, options).finally(() => {
1230
+ if (deletedHydrationRequestRef.current?.promise === promise) {
1231
+ deletedHydrationRequestRef.current = null;
1232
+ }
1233
+ });
1234
+ deletedHydrationRequestRef.current = { workspaceId, promise };
1235
+ return promise;
1236
+ }, [deletedHydratedWorkspaceId, fetchDeletedTasks]);
1237
+ const refreshArchiveIfHydrated = useCallback(() => {
1238
+ const workspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
1239
+ if (archiveHydratedWorkspaceId !== workspaceId)
1240
+ return Promise.resolve(false);
1241
+ return fetchArchive(true);
1242
+ }, [archiveHydratedWorkspaceId, fetchArchive]);
1243
+ const refreshDeletedTasksIfHydrated = useCallback((isSilent = true) => {
1244
+ const workspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
1245
+ if (deletedHydratedWorkspaceId !== workspaceId)
1246
+ return Promise.resolve(false);
1247
+ return fetchDeletedTasks(isSilent);
1248
+ }, [deletedHydratedWorkspaceId, fetchDeletedTasks]);
1034
1249
  const refreshTaskCollections = useCallback(async (options) => {
1035
1250
  const isSilent = options?.isSilent !== false;
1036
1251
  const ignoreAuthGuard = options?.ignoreAuthGuard === true;
1252
+ const workspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
1253
+ const includeArchive = archiveHydratedWorkspaceId === workspaceId;
1254
+ const includeDeleted = deletedHydratedWorkspaceId === workspaceId;
1037
1255
  await Promise.all([
1038
- refreshTaskCollectionsBase({ isSilent, ignoreAuthGuard }),
1039
- fetchDeletedTasks(isSilent, { ignoreAuthGuard }),
1256
+ refreshTaskCollectionsBase({
1257
+ isSilent,
1258
+ ignoreAuthGuard,
1259
+ includeArchive,
1260
+ highlightChangedTaskIds: options?.highlightChangedTaskIds,
1261
+ }),
1262
+ includeDeleted
1263
+ ? fetchDeletedTasks(isSilent, { ignoreAuthGuard })
1264
+ : Promise.resolve(false),
1040
1265
  fetchPlanningEntities({ ignoreAuthGuard }),
1041
1266
  ]);
1042
- }, [fetchDeletedTasks, fetchPlanningEntities, refreshTaskCollectionsBase]);
1043
- const refreshTaskCollectionsFromInvalidation = useCallback(async () => {
1044
- await refreshTaskCollectionsFromInvalidationBase();
1045
- await fetchDeletedTasks(true);
1046
- await fetchPlanningEntities();
1047
- }, [fetchDeletedTasks, fetchPlanningEntities, refreshTaskCollectionsFromInvalidationBase]);
1267
+ }, [
1268
+ archiveHydratedWorkspaceId,
1269
+ deletedHydratedWorkspaceId,
1270
+ fetchDeletedTasks,
1271
+ fetchPlanningEntities,
1272
+ refreshTaskCollectionsBase
1273
+ ]);
1274
+ const taskInvalidationInFlightRef = useRef(false);
1275
+ const pendingTaskInvalidationRef = useRef(null);
1276
+ const archiveHydratedWorkspaceIdRef = useRef(archiveHydratedWorkspaceId);
1277
+ const deletedHydratedWorkspaceIdRef = useRef(deletedHydratedWorkspaceId);
1278
+ const invalidationTaskRefreshRef = useRef(refreshTaskCollectionsFromInvalidationBase);
1279
+ const invalidationDeletedRefreshRef = useRef(fetchDeletedTasks);
1280
+ const invalidationPlanningRefreshRef = useRef(fetchPlanningEntities);
1281
+ archiveHydratedWorkspaceIdRef.current = archiveHydratedWorkspaceId;
1282
+ deletedHydratedWorkspaceIdRef.current = deletedHydratedWorkspaceId;
1283
+ invalidationTaskRefreshRef.current = refreshTaskCollectionsFromInvalidationBase;
1284
+ invalidationDeletedRefreshRef.current = fetchDeletedTasks;
1285
+ invalidationPlanningRefreshRef.current = fetchPlanningEntities;
1286
+ const refreshTaskCollectionsFromInvalidation = useCallback(async (scope) => {
1287
+ const workspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
1288
+ const pending = pendingTaskInvalidationRef.current;
1289
+ pendingTaskInvalidationRef.current = {
1290
+ workspaceId,
1291
+ scope: pending?.workspaceId === workspaceId
1292
+ ? mergeTaskInvalidationScopes(pending.scope, scope)
1293
+ : scope,
1294
+ };
1295
+ if (taskInvalidationInFlightRef.current)
1296
+ return;
1297
+ taskInvalidationInFlightRef.current = true;
1298
+ try {
1299
+ while (pendingTaskInvalidationRef.current) {
1300
+ const next = pendingTaskInvalidationRef.current;
1301
+ pendingTaskInvalidationRef.current = null;
1302
+ const requestWorkspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
1303
+ if (next.workspaceId !== requestWorkspaceId)
1304
+ continue;
1305
+ const collections = new Set(next.scope.collections);
1306
+ const includeActive = collections.has('active');
1307
+ const includeArchive = collections.has('archive')
1308
+ && archiveHydratedWorkspaceIdRef.current === requestWorkspaceId;
1309
+ const includeDeleted = collections.has('deleted')
1310
+ && deletedHydratedWorkspaceIdRef.current === requestWorkspaceId;
1311
+ const highlightChangedTaskIds = resolveTaskInvalidationHighlightIds(next.scope);
1312
+ await Promise.all([
1313
+ includeActive || includeArchive
1314
+ ? invalidationTaskRefreshRef.current({
1315
+ includeActive,
1316
+ includeArchive,
1317
+ highlightChangedTaskIds,
1318
+ })
1319
+ : Promise.resolve(),
1320
+ includeDeleted ? invalidationDeletedRefreshRef.current(true) : Promise.resolve(false),
1321
+ collections.has('planning') ? invalidationPlanningRefreshRef.current() : Promise.resolve(),
1322
+ ]);
1323
+ }
1324
+ }
1325
+ finally {
1326
+ taskInvalidationInFlightRef.current = false;
1327
+ }
1328
+ }, []);
1048
1329
  const setUserGlobalSyncStatusRef = useRef(() => undefined);
1049
1330
  const setUserGlobalSyncErrorRef = useRef(() => undefined);
1050
1331
  const checkAuthSessionImplRef = useRef(async () => false);
1051
1332
  const checkAuthSession = useCallback((options) => checkAuthSessionImplRef.current(options), []);
1052
- const { userGlobalSyncStatus, setUserGlobalSyncStatus, userGlobalSyncError, setUserGlobalSyncError, workspaceLastPullAt, workspaceLastPushAt, workspaceLastErrorAt, workspaceLastErrorMessage, workspaceLastSuccessfulSyncAt, workspaceCloudSyncEnabled, workspaceSyncPhase, workspaceSyncSetupIntent, workspaceSyncStatus, workspaceSyncSummary, workspaceSyncRecommendedAction, workspaceSyncBusy, workspaceSyncPendingChanges, workspacePushInFlightRef, workspacePullInFlightRef, workspaceLastPushedSignatureRef, workspacePendingSignatureRef, workspaceLastPushedTaskIdsRef, workspaceDeletedTaskIdsRef, workspaceDeletedTaskWatermarksRef, workspacePullCursorRef, clearWorkspaceRetry, persistWorkspaceSyncPatch, loadWorkspaceSyncState, applyWorkspaceSyncStateSnapshot, syncUserGlobalSettings, buildWorkspaceSyncSignature, pushWorkspaceChangesToCloud, saveWorkspaceCloudSyncSettings, retryUserGlobalSettingsSync, retryWorkspaceCloudSync, resetWorkspaceSyncCursorAndPull, getWorkspaceSyncDiagnostics } = useSyncOrchestrator({
1333
+ const { userGlobalSyncStatus, setUserGlobalSyncStatus, userGlobalSyncError, setUserGlobalSyncError, workspaceLastPullAt, workspaceLastPushAt, workspaceLastErrorAt, workspaceLastErrorMessage, workspaceLastSuccessfulSyncAt, workspaceCloudSyncEnabled, workspaceSyncPhase, workspaceSyncSetupIntent, workspaceSyncStatus, workspaceSyncSummary, workspaceSyncRecommendedAction, workspaceSyncBusy, workspaceSyncPendingChanges, workspaceTaskRelationships, localCoordinatorDataVersion, localCoordinatorStatus, switchLocalCoordinatorWorkspace, transferLocalCoordinatorOwnership, workspacePushInFlightRef, workspacePullInFlightRef, workspaceLastPushedSignatureRef, workspacePendingSignatureRef, workspaceLastPushedTaskIdsRef, workspaceDeletedTaskIdsRef, workspaceDeletedTaskWatermarksRef, workspacePullCursorRef, clearWorkspaceRetry, persistWorkspaceSyncPatch, loadWorkspaceSyncState, applyWorkspaceSyncStateSnapshot, syncUserGlobalSettings, buildWorkspaceSyncSignature, pushWorkspaceChangesToCloud, saveWorkspaceCloudSyncSettings, retryUserGlobalSettingsSync, retryWorkspaceCloudSync, resetWorkspaceSyncCursorAndPull, getWorkspaceSyncDiagnostics } = useSyncOrchestrator({
1053
1334
  currentWorkspaceId,
1054
1335
  cloudAuthConfigured,
1055
1336
  runtimeMode,
@@ -1060,6 +1341,11 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1060
1341
  resolveCloudAuthUrl,
1061
1342
  resolveWebSocketUrl,
1062
1343
  realtimeSyncEnabled,
1344
+ localOutboxDispatchEnabled: runtimeConfigOverride.syncV3LocalOutboxDispatch,
1345
+ localCoordinatorBrowserAuthorityGateEnabled: runtimeConfigOverride.localCoordinatorBrowserAuthorityGate,
1346
+ initiativeFeedActivationEnabled: runtimeConfigOverride.syncV3InitiativeFeedActivation,
1347
+ combinedFeedActivationEnabled: runtimeConfigOverride.syncV3CombinedFeedActivation,
1348
+ combinedFeedCoverage: runtimeConfigOverride.syncV3CombinedFeedCoverage,
1063
1349
  tasks,
1064
1350
  archivedTasks,
1065
1351
  deletedTasks,
@@ -1094,20 +1380,50 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1094
1380
  const [priority, setPriority] = useState(2);
1095
1381
  const [complexity, setComplexity] = useState(3);
1096
1382
  const [status, setStatus] = useState('task');
1097
- const [approach, setApproach] = useState('default');
1098
1383
  const [assignee, setAssignee] = useState('unassigned');
1099
1384
  const [scheduledDate, setScheduledDate] = useState('');
1100
1385
  const [dueDate, setDueDate] = useState('');
1101
1386
  const [workstreamInput, setWorkstreamInput] = useState('');
1102
1387
  const [title, setTitle] = useState('');
1103
1388
  const [description, setDescription] = useState('');
1389
+ const titleDraftRef = useRef(title);
1390
+ const descriptionDraftRef = useRef(description);
1391
+ const textDraftOccupiedRef = useRef(false);
1392
+ const [textDraftOccupied, setTextDraftOccupied] = useState(false);
1393
+ const refreshTextDraftOccupied = useCallback(() => {
1394
+ const occupied = titleDraftRef.current.trim() !== '' || descriptionDraftRef.current.trim() !== '';
1395
+ if (occupied === textDraftOccupiedRef.current)
1396
+ return;
1397
+ textDraftOccupiedRef.current = occupied;
1398
+ setTextDraftOccupied(occupied);
1399
+ }, []);
1400
+ const setTitleDraft = useCallback((value) => {
1401
+ titleDraftRef.current = value;
1402
+ refreshTextDraftOccupied();
1403
+ }, [refreshTextDraftOccupied]);
1404
+ const setDescriptionDraft = useCallback((value) => {
1405
+ descriptionDraftRef.current = value;
1406
+ refreshTextDraftOccupied();
1407
+ }, [refreshTextDraftOccupied]);
1408
+ const getTitleDraft = useCallback(() => titleDraftRef.current, []);
1409
+ const getDescriptionDraft = useCallback(() => descriptionDraftRef.current, []);
1410
+ useEffect(() => {
1411
+ titleDraftRef.current = title;
1412
+ refreshTextDraftOccupied();
1413
+ }, [refreshTextDraftOccupied, title]);
1414
+ useEffect(() => {
1415
+ descriptionDraftRef.current = description;
1416
+ refreshTextDraftOccupied();
1417
+ }, [description, refreshTextDraftOccupied]);
1104
1418
  const [checklistItems, setChecklistItems] = useState([]);
1105
1419
  const [comments, setComments] = useState([]);
1106
1420
  const [newCommentText, setNewCommentText] = useState('');
1107
1421
  const [formTaxonomies, setFormTaxonomies] = useState({});
1108
1422
  const commentsEndRef = useRef(null);
1109
- const [showChecklist, setShowChecklist] = useState(false);
1110
1423
  const [lastUsedCategory, setLastUsedCategory] = useState('');
1424
+ const [taskforceAgentId, setTaskforceAgentId] = useState('');
1425
+ const [taskforceAgentConversationId, setTaskforceAgentConversationId] = useState('');
1426
+ const [taskforceAgentConversationByAgentId, setTaskforceAgentConversationByAgentId] = useState({});
1111
1427
  useEffect(() => {
1112
1428
  if (editingTaskId)
1113
1429
  return;
@@ -1176,37 +1492,63 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1176
1492
  });
1177
1493
  checkAuthSessionImplRef.current = checkAuthSessionImpl;
1178
1494
  const [activeWorkspaceModule, setActiveWorkspaceModuleState] = useState('tasks');
1179
- const [showComments, setShowComments] = useState(false);
1180
1495
  const [descriptionFocused, setDescriptionFocused] = useState(false);
1181
1496
  const [isCapturingScreenshot, setIsCapturingScreenshot] = useState(false);
1182
- const [attachments, setAttachments] = useState([]);
1497
+ const attachmentsDraftRef = useRef([]);
1498
+ const [attachments, setAttachmentsState] = useState([]);
1499
+ const setAttachments = useCallback((next) => {
1500
+ const nextAttachments = typeof next === 'function'
1501
+ ? next(attachmentsDraftRef.current)
1502
+ : next;
1503
+ attachmentsDraftRef.current = nextAttachments;
1504
+ setAttachmentsState(nextAttachments);
1505
+ }, []);
1506
+ const getAttachmentsDraft = useCallback(() => [...attachmentsDraftRef.current], []);
1507
+ const pendingDescriptionImageUploadRef = useRef(null);
1508
+ const [descriptionImageUploadPending, setDescriptionImageUploadPending] = useState(false);
1509
+ const createDescriptionImageDraftId = useCallback(() => (`task-description-${globalThis.crypto?.randomUUID?.() || `${Date.now()}-${Math.random().toString(16).slice(2)}`}`), []);
1510
+ const descriptionImageDraftIdRef = useRef(createDescriptionImageDraftId());
1511
+ const [descriptionImageDraftId, setDescriptionImageDraftId] = useState(descriptionImageDraftIdRef.current);
1512
+ const rotateDescriptionImageDraftId = useCallback(() => {
1513
+ const nextDraftId = createDescriptionImageDraftId();
1514
+ descriptionImageDraftIdRef.current = nextDraftId;
1515
+ setDescriptionImageDraftId(nextDraftId);
1516
+ }, [createDescriptionImageDraftId]);
1517
+ const registerDescriptionImageUpload = useCallback((upload) => {
1518
+ pendingDescriptionImageUploadRef.current = upload;
1519
+ setDescriptionImageUploadPending(true);
1520
+ void upload.then(() => {
1521
+ if (pendingDescriptionImageUploadRef.current !== upload)
1522
+ return;
1523
+ pendingDescriptionImageUploadRef.current = null;
1524
+ setDescriptionImageUploadPending(false);
1525
+ }, () => {
1526
+ if (pendingDescriptionImageUploadRef.current !== upload)
1527
+ return;
1528
+ pendingDescriptionImageUploadRef.current = null;
1529
+ setDescriptionImageUploadPending(false);
1530
+ });
1531
+ }, []);
1532
+ const awaitPendingDescriptionImageUpload = useCallback(async () => {
1533
+ const upload = pendingDescriptionImageUploadRef.current;
1534
+ if (upload)
1535
+ await upload;
1536
+ }, []);
1183
1537
  const [attachmentsDirty, setAttachmentsDirty] = useState(false);
1184
1538
  const dataVersionRef = useRef(null);
1185
- const cloudRealtimeFollowUpRefreshTimerRef = useRef(null);
1186
- const archiveBootstrapTimerRef = useRef(null);
1539
+ const ambiguousRealtimeConfirmationTimerRef = useRef(null);
1187
1540
  const skippedInitialTaskTabRefreshRef = useRef(false);
1188
1541
  const authSessionResolvedRef = useRef(authSessionResolved);
1189
1542
  const authRequiredForApiRef = useRef(authRequiredForApi);
1190
1543
  const isAuthenticatedRef = useRef(isAuthenticated);
1191
- const hasLoadedUiStateRef = useRef(false);
1192
- const lastLoadedUiStateKeyRef = useRef('');
1193
1544
  const lastAssigneeOptionsLoadKeyRef = useRef('');
1194
1545
  const lastConfigRefreshKeyRef = useRef('');
1195
1546
  const lastWorkspaceSyncStateLoadKeyRef = useRef('');
1196
1547
  const lastTaskSurfaceLoadKeyRef = useRef('');
1197
1548
  const lastSettingsSurfaceLoadKeyRef = useRef('');
1198
- const skipNextUiStatePersistRef = useRef(false);
1199
- const activeWorkspaceModuleOverridePendingRef = useRef(false);
1200
1549
  const referenceDataRequestRef = useRef(null);
1201
1550
  const workspaceListHydratedRef = useRef(false);
1202
1551
  const hasBootstrappedDataRef = useRef(false);
1203
- const [uiStateReady, setUiStateReady] = useState(false);
1204
- const setActiveWorkspaceModule = useCallback((nextModule) => {
1205
- if (!uiStateReady) {
1206
- activeWorkspaceModuleOverridePendingRef.current = true;
1207
- }
1208
- setActiveWorkspaceModuleState(nextModule);
1209
- }, [uiStateReady]);
1210
1552
  const { handleSaveSettings, handleSaveTheme, handleSaveGlobalTheme, handleJsonBackupEnabledChange, handleSaveGlobalJsonBackupEnabled, handleSaveGlobalWeekStartsOn, handleSaveLocale, handleManualComplexityEnabledChange, handleChecklistDropdownEnabledChange, handleShowTaskCardStatusLabelChange, handleResetProjectToGlobal } = useSettingsPersistence({
1211
1553
  keyShortcut,
1212
1554
  themeUseGlobalDefault,
@@ -1224,8 +1566,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1224
1566
  setLocale,
1225
1567
  setManualComplexityEnabled,
1226
1568
  setChecklistDropdownEnabled,
1227
- setShowTaskCardStatusLabel,
1228
- setShowChecklist
1569
+ setShowTaskCardStatusLabel
1229
1570
  });
1230
1571
  useEffect(() => {
1231
1572
  if (runtimeMode !== 'cloud')
@@ -1239,233 +1580,63 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1239
1580
  authRequiredForApiRef.current = authRequiredForApi;
1240
1581
  isAuthenticatedRef.current = isAuthenticated;
1241
1582
  }, [authSessionResolved, authRequiredForApi, isAuthenticated]);
1242
- const currentFilterTaxonomySignature = useMemo(() => (referenceDataLoaded
1243
- ? buildFilterTaxonomySignature({
1244
- categories: activeCategories,
1245
- types: activeTypes,
1246
- priorities,
1247
- taxonomies
1248
- })
1249
- : null), [activeCategories, activeTypes, priorities, referenceDataLoaded, taxonomies]);
1250
- const applyPersistedUiState = useCallback((state, options) => {
1251
- if (!state) {
1252
- pendingPersistedTaxonomyUiStateRef.current = null;
1253
- return;
1254
- }
1255
- const hasPersistedTaxonomyFilterState = Array.isArray(state.filterCategories)
1256
- || Array.isArray(state.filterPriorities)
1257
- || Array.isArray(state.filterTypes)
1258
- || (state.filterTaxonomies && typeof state.filterTaxonomies === 'object');
1259
- if (!hasPersistedTaxonomyFilterState) {
1260
- pendingPersistedTaxonomyUiStateRef.current = null;
1261
- }
1262
- const hasPersistedFilterState = Array.isArray(state.filterCategories)
1263
- || Array.isArray(state.filterPriorities)
1264
- || Array.isArray(state.filterTypes)
1265
- || Array.isArray(state.filterStatus)
1266
- || Array.isArray(state.filterAssignees)
1267
- || typeof state.filterAssigneesAllSelected === 'boolean'
1268
- || (state.filterTaxonomies && typeof state.filterTaxonomies === 'object');
1269
- const canCompareTaxonomySignature = currentFilterTaxonomySignature !== null;
1270
- if (hasPersistedTaxonomyFilterState && !canCompareTaxonomySignature) {
1271
- pendingPersistedTaxonomyUiStateRef.current = {
1272
- state,
1273
- skipActiveWorkspaceModule: options?.skipActiveWorkspaceModule
1274
- };
1275
- }
1276
- const canApplyTaxonomyFilters = hasPersistedTaxonomyFilterState
1277
- && canCompareTaxonomySignature
1278
- && areFilterTaxonomySignaturesEqual(state.filterTaxonomySignature, currentFilterTaxonomySignature);
1279
- const shouldResetTaxonomyFilters = hasPersistedTaxonomyFilterState
1280
- && canCompareTaxonomySignature
1281
- && !canApplyTaxonomyFilters;
1282
- const taxonomyFiltersAreReady = !hasPersistedTaxonomyFilterState || canApplyTaxonomyFilters || shouldResetTaxonomyFilters;
1283
- if (!options?.skipActiveWorkspaceModule) {
1284
- if (typeof state.activeWorkspaceModule === 'string') {
1285
- setActiveWorkspaceModuleState(state.activeWorkspaceModule);
1286
- }
1287
- else if (state.groupBy === 'docs') {
1288
- setActiveWorkspaceModuleState('docs');
1289
- }
1290
- }
1291
- if (state.groupBy && state.groupBy !== 'docs')
1292
- setGroupBy(state.groupBy);
1293
- if (state.emptyColumnMode === 'show' || state.emptyColumnMode === 'collapse' || state.emptyColumnMode === 'hide')
1294
- setEmptyColumnMode(state.emptyColumnMode);
1295
- if (typeof state.zenMode === 'boolean')
1296
- setZenModeState(state.zenMode);
1297
- if (typeof state.searchQuery === 'string')
1298
- setSearchQuery(state.searchQuery);
1299
- if (canApplyTaxonomyFilters) {
1300
- if (Array.isArray(state.filterCategories))
1301
- setFilterCategories(state.filterCategories);
1302
- if (Array.isArray(state.filterPriorities))
1303
- setFilterPriorities(state.filterPriorities);
1304
- if (Array.isArray(state.filterTypes))
1305
- setFilterTypes(state.filterTypes);
1306
- if (state.filterTaxonomies && typeof state.filterTaxonomies === 'object')
1307
- setFilterTaxonomies(state.filterTaxonomies);
1308
- }
1309
- else if (shouldResetTaxonomyFilters) {
1310
- setFilterCategories(activeCategories.map((category) => category.value));
1311
- setFilterPriorities(priorities.map((priority) => priority.value));
1312
- setFilterTypes(activeTypes.map((type) => type.value));
1313
- setFilterTaxonomies({});
1314
- }
1315
- if (Array.isArray(state.filterStatus))
1316
- setFilterStatus(state.filterStatus);
1317
- if (Array.isArray(state.filterAssignees))
1318
- setFilterAssignees(state.filterAssignees);
1319
- if (typeof state.filterAssigneesAllSelected === 'boolean')
1320
- setFilterAssigneesAllSelected(state.filterAssigneesAllSelected);
1321
- if (state.sortBy === 'created' || state.sortBy === 'priority' || state.sortBy === 'updated' || state.sortBy === 'complexity')
1322
- setSortBy(state.sortBy);
1323
- if (state.sortOrder === 'asc' || state.sortOrder === 'desc')
1324
- setSortOrder(state.sortOrder);
1325
- if (shouldResetTaxonomyFilters) {
1326
- setHasInitedFilters(true);
1327
- }
1328
- else if (typeof state.hasInitedFilters === 'boolean' && taxonomyFiltersAreReady) {
1329
- setHasInitedFilters(state.hasInitedFilters);
1330
- }
1331
- else if (hasPersistedFilterState && taxonomyFiltersAreReady) {
1332
- setHasInitedFilters(true);
1333
- }
1334
- if (typeof state.showChecklist === 'boolean')
1335
- setShowChecklist(state.showChecklist);
1336
- if (typeof state.lastCategory === 'string')
1337
- setLastUsedCategory(state.lastCategory);
1338
- if (typeof state.exportEnvironment === 'string' && state.exportEnvironment.trim().length > 0) {
1339
- setExportEnvironment(state.exportEnvironment.trim());
1340
- }
1341
- }, [activeCategories, activeTypes, currentFilterTaxonomySignature, priorities]);
1342
- useEffect(() => {
1343
- if (!currentFilterTaxonomySignature || !pendingPersistedTaxonomyUiStateRef.current)
1344
- return;
1345
- const pending = pendingPersistedTaxonomyUiStateRef.current;
1346
- pendingPersistedTaxonomyUiStateRef.current = null;
1347
- applyPersistedUiState(pending.state, {
1348
- skipActiveWorkspaceModule: pending.skipActiveWorkspaceModule
1349
- });
1350
- }, [applyPersistedUiState, currentFilterTaxonomySignature]);
1351
- const loadPersistedUiState = useCallback(async (workspaceIdOverride) => {
1352
- const targetWorkspaceId = String(workspaceIdOverride || currentWorkspaceIdRef.current || currentWorkspaceId || 'default').trim() || 'default';
1353
- const uiStateLoadKey = `${runtimeMode}:${workspaceUiStateScope}:${targetWorkspaceId}`;
1354
- try {
1355
- const res = await fetch(`/api/taskforce/ui-state?key=app&workspaceId=${encodeURIComponent(targetWorkspaceId)}`, {
1356
- method: 'GET',
1357
- credentials: 'include'
1358
- });
1359
- const data = res.ok ? await res.json().catch(() => ({})) : {};
1360
- const serverState = (data?.state && typeof data.state === 'object')
1361
- ? data.state
1362
- : null;
1363
- const localState = readPersistedAppUiState(workspaceUiStateScope);
1364
- const state = serverState || localState
1365
- ? {
1366
- ...(localState || {}),
1367
- ...(serverState || {})
1368
- }
1369
- : null;
1370
- if (currentWorkspaceIdRef.current !== targetWorkspaceId) {
1371
- return;
1372
- }
1373
- applyPersistedUiState(state, {
1374
- skipActiveWorkspaceModule: activeWorkspaceModuleOverridePendingRef.current
1375
- });
1376
- lastLoadedUiStateKeyRef.current = uiStateLoadKey;
1377
- }
1378
- catch {
1379
- const localState = readPersistedAppUiState(workspaceUiStateScope);
1380
- if (currentWorkspaceIdRef.current === targetWorkspaceId) {
1381
- applyPersistedUiState(localState, {
1382
- skipActiveWorkspaceModule: activeWorkspaceModuleOverridePendingRef.current
1383
- });
1384
- lastLoadedUiStateKeyRef.current = uiStateLoadKey;
1385
- }
1386
- }
1387
- finally {
1388
- if (currentWorkspaceIdRef.current !== targetWorkspaceId)
1389
- return;
1390
- activeWorkspaceModuleOverridePendingRef.current = false;
1391
- skipNextUiStatePersistRef.current = true;
1392
- setUiStateReady(true);
1393
- }
1394
- }, [applyPersistedUiState, currentWorkspaceId, runtimeMode, workspaceUiStateScope]);
1395
- useEffect(() => {
1396
- const uiStateLoadKey = `${runtimeMode}:${workspaceUiStateScope}:${currentWorkspaceId}`;
1397
- if (!hasLoadedUiStateRef.current)
1398
- return;
1399
- if (lastLoadedUiStateKeyRef.current === uiStateLoadKey)
1400
- return;
1401
- setUiStateReady(false);
1402
- void loadPersistedUiState(currentWorkspaceId);
1403
- }, [currentWorkspaceId, loadPersistedUiState, runtimeMode, workspaceUiStateScope]);
1404
- useEffect(() => {
1405
- if (!uiStateReady)
1406
- return;
1407
- if (skipNextUiStatePersistRef.current) {
1408
- skipNextUiStatePersistRef.current = false;
1409
- return;
1410
- }
1411
- const uiStateSnapshot = {
1412
- groupBy,
1413
- activeWorkspaceModule,
1414
- emptyColumnMode,
1415
- zenMode,
1416
- searchQuery,
1417
- filterCategories,
1418
- filterPriorities,
1419
- filterTypes,
1420
- filterStatus,
1421
- filterAssignees,
1422
- filterAssigneesAllSelected,
1423
- filterTaxonomies,
1424
- ...(currentFilterTaxonomySignature ? { filterTaxonomySignature: currentFilterTaxonomySignature } : {}),
1425
- sortBy,
1426
- sortOrder,
1427
- hasInitedFilters,
1428
- showChecklist,
1429
- lastCategory: lastUsedCategory || '',
1430
- exportEnvironment
1431
- };
1432
- writePersistedAppUiState(uiStateSnapshot, workspaceUiStateScope);
1433
- const timeoutId = window.setTimeout(async () => {
1434
- try {
1435
- await persistRemoteUiState({
1436
- stateKey: 'app',
1437
- workspaceId: currentWorkspaceIdRef.current,
1438
- patch: uiStateSnapshot
1439
- });
1440
- }
1441
- catch {
1442
- // ignore persistence errors
1443
- }
1444
- }, 250);
1445
- return () => window.clearTimeout(timeoutId);
1446
- }, [
1447
- uiStateReady,
1448
- groupBy,
1583
+ const { hasLoadedUiStateRef, loadPersistedUiState, resetPersistedUiStateLoad, setActiveWorkspaceModule, uiStateReady } = usePersistedAppUiState({
1584
+ runtimeMode,
1585
+ workspaceUiStateScope,
1586
+ currentWorkspaceId,
1587
+ currentWorkspaceIdRef,
1588
+ referenceDataLoaded,
1589
+ activeCategories,
1590
+ activeTypes,
1591
+ priorities,
1592
+ taxonomies,
1449
1593
  activeWorkspaceModule,
1594
+ setActiveWorkspaceModuleState,
1595
+ groupBy,
1596
+ setGroupBy,
1450
1597
  emptyColumnMode,
1598
+ setEmptyColumnMode,
1599
+ taskScope,
1600
+ setTaskScope,
1601
+ openTaskId: editingTaskId,
1602
+ setPendingOpenTaskId: setPendingOpenTaskIdFromPersistedState,
1603
+ compressedCards,
1604
+ setCompressedCards,
1451
1605
  zenMode,
1606
+ setZenModeState,
1452
1607
  searchQuery,
1608
+ setSearchQuery,
1609
+ collapsedCategories,
1610
+ setCollapsedCategories,
1453
1611
  filterCategories,
1612
+ setFilterCategories,
1454
1613
  filterPriorities,
1614
+ setFilterPriorities,
1455
1615
  filterTypes,
1616
+ setFilterTypes,
1456
1617
  filterStatus,
1618
+ setFilterStatus,
1457
1619
  filterAssignees,
1620
+ setFilterAssignees,
1458
1621
  filterAssigneesAllSelected,
1622
+ setFilterAssigneesAllSelected,
1459
1623
  filterTaxonomies,
1460
- currentFilterTaxonomySignature,
1624
+ setFilterTaxonomies,
1461
1625
  sortBy,
1626
+ setSortBy,
1462
1627
  sortOrder,
1628
+ setSortOrder,
1463
1629
  hasInitedFilters,
1464
- showChecklist,
1630
+ setHasInitedFilters,
1465
1631
  lastUsedCategory,
1466
- exportEnvironment,
1467
- workspaceUiStateScope
1468
- ]);
1632
+ setLastUsedCategory,
1633
+ taskforceAgentId,
1634
+ setTaskforceAgentId,
1635
+ taskforceAgentConversationId,
1636
+ setTaskforceAgentConversationId,
1637
+ taskforceAgentConversationByAgentId,
1638
+ setTaskforceAgentConversationByAgentId
1639
+ });
1469
1640
  const applyBootstrapConfig = useCallback((data) => {
1470
1641
  const nextRuntimeMode = data.runtimeMode === 'cloud' ? 'cloud' : 'local';
1471
1642
  const nextAuthRequiredForApi = Boolean(data.authRequiredForApi);
@@ -1488,7 +1659,10 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1488
1659
  if (typeof data.workspaceId === 'string' && data.workspaceId.trim().length > 0) {
1489
1660
  const nextWorkspaceId = data.workspaceId.trim();
1490
1661
  if (nextRuntimeMode === 'local') {
1491
- commitCurrentWorkspaceId(nextWorkspaceId);
1662
+ const previousWorkspaceId = String(currentWorkspaceIdRef.current || '').trim() || 'default';
1663
+ commitCurrentWorkspaceId(nextWorkspaceId, {
1664
+ skipTransitionReset: !configLoaded && previousWorkspaceId === 'default'
1665
+ });
1492
1666
  }
1493
1667
  else {
1494
1668
  applyResolvedWorkspaceId(nextWorkspaceId);
@@ -1591,9 +1765,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1591
1765
  setShowTaskCardStatusLabel(data.showTaskCardStatusLabel);
1592
1766
  }
1593
1767
  else {
1594
- setShowTaskCardStatusLabel(true);
1768
+ setShowTaskCardStatusLabel(false);
1595
1769
  }
1596
- }, [applyResolvedWorkspaceId, commitCurrentWorkspaceId]);
1770
+ }, [applyResolvedWorkspaceId, commitCurrentWorkspaceId, configLoaded, currentWorkspaceIdRef]);
1597
1771
  const fetchBuildInfo = useCallback(async () => {
1598
1772
  const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now();
1599
1773
  try {
@@ -1636,9 +1810,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1636
1810
  fetchBuildInfo,
1637
1811
  markBootstrapPhase,
1638
1812
  markBootstrapStalled,
1639
- fetchWorkflows,
1640
1813
  fetchInitiativeTemplates,
1641
- loadAvailableEnvironments,
1642
1814
  setReferenceDataLoaded,
1643
1815
  setCustomCategories,
1644
1816
  setCustomTypes,
@@ -1689,11 +1861,10 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1689
1861
  settingsSection,
1690
1862
  workspaceBootstrapPending,
1691
1863
  fetchTasks,
1692
- fetchArchive,
1693
1864
  fetchPlanningEntities,
1694
1865
  refreshTaskCollections,
1695
1866
  loadWorkspaceSyncState,
1696
- archiveBootstrapTimerRef,
1867
+ switchLocalCoordinatorWorkspace,
1697
1868
  hasBootstrappedDataRef
1698
1869
  });
1699
1870
  const refreshSetupContext = useCallback(async () => {
@@ -1749,8 +1920,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1749
1920
  const result = await runCloudBootstrap({
1750
1921
  reason: 'post-plans',
1751
1922
  ignoreAuthGuard: true,
1752
- tasksSilent: true,
1753
- includeDeferredArchive: false
1923
+ tasksSilent: true
1754
1924
  });
1755
1925
  if (!result.authenticated) {
1756
1926
  return { success: false, destination: 'login', error: result.error || 'Sign in required.', code: result.code || 'AUTH_REQUIRED' };
@@ -1797,8 +1967,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1797
1967
  const result = await runCloudBootstrap({
1798
1968
  reason,
1799
1969
  ignoreAuthGuard: true,
1800
- tasksSilent: true,
1801
- includeDeferredArchive: false
1970
+ tasksSilent: true
1802
1971
  });
1803
1972
  if (!result.authenticated) {
1804
1973
  return { success: false, error: result.error || 'Sign in required.', code: result.code || 'AUTH_REQUIRED' };
@@ -1979,7 +2148,11 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1979
2148
  method: 'POST',
1980
2149
  headers: { 'Content-Type': 'application/json' },
1981
2150
  credentials: 'include',
1982
- body: JSON.stringify({ email: trimmedEmail, password: rawPassword })
2151
+ body: JSON.stringify(buildTaskforceCredentialLoginPayload({
2152
+ email: trimmedEmail,
2153
+ password: rawPassword,
2154
+ activeWorkspaceId: currentWorkspaceIdRef.current,
2155
+ }))
1983
2156
  });
1984
2157
  const data = await res.json().catch(() => ({}));
1985
2158
  if (!res.ok || !data?.success) {
@@ -1990,24 +2163,34 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1990
2163
  if (!entry.success) {
1991
2164
  return { success: false, error: entry.error || 'Unable to resolve workspace after sign in.', code: entry.code };
1992
2165
  }
2166
+ dispatchTaskforceAuthSessionChanged();
1993
2167
  return { success: true, workspaceSetupRequired: entry.workspaceSetupRequired === true };
1994
2168
  }
1995
2169
  catch {
1996
2170
  return { success: false, error: 'Sign in failed.' };
1997
2171
  }
1998
- }, [resolveCloudAuthUrl, cloudAuthConfigured, resolvePostAuthCloudEntry]);
2172
+ }, [resolveCloudAuthUrl, cloudAuthConfigured, currentWorkspaceIdRef, resolvePostAuthCloudEntry]);
1999
2173
  /**
2000
2174
  * Initiates an OAuth login (or invite-claim) flow by redirecting the browser
2001
2175
  * to the provider's authorisation URL via the server-side start route.
2002
2176
  *
2003
2177
  * @param provider - 'google' | 'github' | 'apple'
2004
2178
  * @param returnTo - Optional relative path to redirect back to after auth (defaults to '/').
2005
- * @param inviteToken - Optional invite token; when provided the flow uses `invite_claim` mode.
2179
+ * @param inviteToken - Optional invite token; when provided the flow uses `invite_claim` mode.
2006
2180
  */
2007
2181
  const beginOAuthLogin = useCallback((provider, returnTo, inviteToken) => {
2008
- const sanitizedReturnTo = returnTo && /^\/[A-Za-z0-9_\-./?=&%]*$/.test(returnTo)
2009
- ? returnTo
2010
- : '/';
2182
+ let sanitizedReturnTo = '/';
2183
+ try {
2184
+ const parsedReturnTo = new URL(String(returnTo || '/'), 'https://taskforce.local');
2185
+ if (parsedReturnTo.origin === 'https://taskforce.local'
2186
+ && String(returnTo || '/').startsWith('/')
2187
+ && !String(returnTo || '/').startsWith('//')) {
2188
+ sanitizedReturnTo = `${parsedReturnTo.pathname}${parsedReturnTo.search}${parsedReturnTo.hash}`;
2189
+ }
2190
+ }
2191
+ catch {
2192
+ sanitizedReturnTo = '/';
2193
+ }
2011
2194
  let path = `/api/taskforce/auth/oauth/${encodeURIComponent(provider)}/start?return_to=${encodeURIComponent(sanitizedReturnTo)}`;
2012
2195
  if (inviteToken) {
2013
2196
  path += `&invite_token=${encodeURIComponent(inviteToken)}`;
@@ -2407,7 +2590,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2407
2590
  if (!cloudAuthConfigured)
2408
2591
  return { success: false, error: 'Cloud auth not configured.' };
2409
2592
  try {
2410
- const res = await fetch(resolveCloudAuthUrl('/api/taskforce/account/login-methods'), {
2593
+ const res = await fetch(resolveCloudAuthUrl('/api/taskforce/auth/login-methods'), {
2411
2594
  credentials: 'include'
2412
2595
  });
2413
2596
  const data = await res.json().catch(() => ({}));
@@ -2424,7 +2607,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2424
2607
  if (!cloudAuthConfigured)
2425
2608
  return { success: false, error: 'Cloud auth not configured.' };
2426
2609
  try {
2427
- const res = await fetch(resolveCloudAuthUrl(`/api/taskforce/account/login-methods/${encodeURIComponent(provider)}`), {
2610
+ const res = await fetch(resolveCloudAuthUrl(`/api/taskforce/auth/login-methods/${encodeURIComponent(provider)}`), {
2428
2611
  method: 'DELETE',
2429
2612
  credentials: 'include'
2430
2613
  });
@@ -2442,7 +2625,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2442
2625
  if (!cloudAuthConfigured)
2443
2626
  return { success: false, error: 'Cloud auth not configured.' };
2444
2627
  try {
2445
- const res = await fetch(resolveCloudAuthUrl('/api/taskforce/account/login-methods/password'), {
2628
+ const res = await fetch(resolveCloudAuthUrl('/api/taskforce/auth/login-methods/password'), {
2446
2629
  method: 'POST',
2447
2630
  headers: { 'Content-Type': 'application/json' },
2448
2631
  credentials: 'include',
@@ -2458,6 +2641,28 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2458
2641
  return { success: false, error: 'Failed to add password.' };
2459
2642
  }
2460
2643
  }, [resolveCloudAuthUrl, cloudAuthConfigured]);
2644
+ const changePassword = useCallback(async (currentPassword, newPassword) => {
2645
+ if (!cloudAuthConfigured)
2646
+ return { success: false, error: 'Cloud auth not configured.' };
2647
+ try {
2648
+ const res = await fetch(resolveCloudAuthUrl('/api/taskforce/auth/password/change'), {
2649
+ method: 'POST',
2650
+ headers: { 'Content-Type': 'application/json' },
2651
+ credentials: 'include',
2652
+ body: JSON.stringify({ currentPassword, newPassword })
2653
+ });
2654
+ const data = await res.json().catch(() => ({}));
2655
+ if (!res.ok || !data?.success) {
2656
+ return { success: false, error: data?.error || 'Failed to change password.', code: data?.code };
2657
+ }
2658
+ await checkAuthSession({ force: true });
2659
+ dispatchTaskforceAuthSessionChanged();
2660
+ return { success: true };
2661
+ }
2662
+ catch {
2663
+ return { success: false, error: 'Failed to change password.' };
2664
+ }
2665
+ }, [resolveCloudAuthUrl, cloudAuthConfigured, checkAuthSession]);
2461
2666
  const beginOAuthLink = useCallback((provider, returnTo) => {
2462
2667
  const sanitizedReturnTo = returnTo && /^\/[A-Za-z0-9_\-./?=&%]*$/.test(returnTo)
2463
2668
  ? returnTo
@@ -2468,13 +2673,12 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2468
2673
  const resetCloudLogoutClientState = useCallback(() => {
2469
2674
  abortWorkspaceScopedRequests();
2470
2675
  referenceDataRequestRef.current = null;
2471
- lastLoadedUiStateKeyRef.current = '';
2472
2676
  lastAssigneeOptionsLoadKeyRef.current = '';
2473
2677
  lastConfigRefreshKeyRef.current = '';
2474
2678
  lastWorkspaceSyncStateLoadKeyRef.current = '';
2475
2679
  lastTaskSurfaceLoadKeyRef.current = '';
2476
2680
  lastSettingsSurfaceLoadKeyRef.current = '';
2477
- setUiStateReady(false);
2681
+ resetPersistedUiStateLoad({ clearLoaded: true });
2478
2682
  setReferenceDataLoaded(false);
2479
2683
  setAssigneeOptions(createDefaultAssigneeOptions());
2480
2684
  setAssigneeOptionsLoaded(false);
@@ -2484,16 +2688,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2484
2688
  setInitiatives([]);
2485
2689
  setWorkstreams([]);
2486
2690
  setPlanningBootstrapTaskSummaries([]);
2691
+ setPlanningLoadState(createInitialPlanningLoadState());
2487
2692
  setLoadingTasks(false);
2488
- if (cloudRealtimeFollowUpRefreshTimerRef.current !== null && typeof window !== 'undefined') {
2489
- window.clearTimeout(cloudRealtimeFollowUpRefreshTimerRef.current);
2490
- cloudRealtimeFollowUpRefreshTimerRef.current = null;
2491
- }
2492
- if (archiveBootstrapTimerRef.current !== null && typeof window !== 'undefined') {
2493
- window.clearTimeout(archiveBootstrapTimerRef.current);
2494
- archiveBootstrapTimerRef.current = null;
2495
- }
2496
- }, [abortWorkspaceScopedRequests, setArchivedTasks, setTasks]);
2693
+ }, [abortWorkspaceScopedRequests, resetPersistedUiStateLoad, setArchivedTasks, setTasks]);
2497
2694
  const logout = useCallback(async () => {
2498
2695
  try {
2499
2696
  if (cloudAuthConfigured) {
@@ -2529,7 +2726,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2529
2726
  setSetupState(null);
2530
2727
  setBootstrapPhase('idle');
2531
2728
  setBootstrapError(null);
2532
- hasLoadedUiStateRef.current = false;
2729
+ resetPersistedUiStateLoad({ clearLoaded: true });
2533
2730
  if (runtimeMode !== 'local') {
2534
2731
  clearPersistedWorkspaceId(workspaceSelectionScope);
2535
2732
  }
@@ -2565,29 +2762,64 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2565
2762
  fetchTasks,
2566
2763
  resetCloudLogoutClientState
2567
2764
  ]);
2765
+ const initiativeTemplateOperationRef = useRef(null);
2766
+ const runInitiativeMutation = useCallback(async (url, init, operationIdOverride) => {
2767
+ if (!globalThis.crypto?.randomUUID)
2768
+ throw new Error('Secure initiative operation identity generation is unavailable.');
2769
+ const operationId = operationIdOverride || `operation-${globalThis.crypto.randomUUID()}`;
2770
+ const requestInit = {
2771
+ ...init,
2772
+ headers: { ...(init.headers || {}), 'x-taskforce-operation-id': operationId },
2773
+ };
2774
+ try {
2775
+ return await fetch(url, requestInit);
2776
+ }
2777
+ catch {
2778
+ return fetch(url, requestInit);
2779
+ }
2780
+ }, []);
2781
+ const workstreamHttpMutationClient = useMemo(() => createCloudWorkstreamHttpMutationClient(), []);
2568
2782
  const createInitiativeFromTemplate = useCallback(async (payload) => {
2569
2783
  try {
2570
- const res = await fetch('/api/taskforce/initiative-templates/create', {
2784
+ const requestBody = JSON.stringify(payload);
2785
+ if (initiativeTemplateOperationRef.current?.requestBody !== requestBody) {
2786
+ if (!globalThis.crypto?.randomUUID) {
2787
+ throw new Error('Secure initiative operation identity generation is unavailable.');
2788
+ }
2789
+ initiativeTemplateOperationRef.current = {
2790
+ requestBody,
2791
+ operationId: `operation-${globalThis.crypto.randomUUID()}`,
2792
+ };
2793
+ }
2794
+ const res = await runInitiativeMutation('/api/taskforce/initiative-templates/create', {
2571
2795
  method: 'POST',
2572
2796
  headers: { 'Content-Type': 'application/json' },
2573
- body: JSON.stringify(payload)
2574
- });
2797
+ body: requestBody
2798
+ }, initiativeTemplateOperationRef.current.operationId);
2575
2799
  const data = await res.json().catch(() => ({}));
2576
2800
  if (!res.ok || !data?.success) {
2577
2801
  return { success: false, error: data?.error || `Create failed (${res.status})` };
2578
2802
  }
2803
+ initiativeTemplateOperationRef.current = null;
2579
2804
  await fetchTasks(true);
2580
2805
  return { success: true, result: data?.results };
2581
2806
  }
2582
2807
  catch (error) {
2583
2808
  return { success: false, error: error.message };
2584
2809
  }
2585
- }, [fetchTasks]);
2810
+ }, [fetchTasks, runInitiativeMutation]);
2586
2811
  const createInitiative = useCallback(async (payload) => {
2587
- const res = await fetch('/api/taskforce/initiative', {
2812
+ if (!globalThis.crypto?.randomUUID)
2813
+ throw new Error('Secure initiative identity generation is unavailable.');
2814
+ const stablePayload = {
2815
+ ...(payload || {}),
2816
+ id: payload?.id || `initiative-${globalThis.crypto.randomUUID()}`,
2817
+ createdAt: payload?.createdAt || new Date().toISOString(),
2818
+ };
2819
+ const res = await runInitiativeMutation('/api/taskforce/initiative', {
2588
2820
  method: 'POST',
2589
2821
  headers: { 'Content-Type': 'application/json' },
2590
- body: JSON.stringify(payload || {})
2822
+ body: JSON.stringify(stablePayload)
2591
2823
  });
2592
2824
  const data = await res.json().catch(() => ({}));
2593
2825
  if (!res.ok) {
@@ -2596,9 +2828,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2596
2828
  await fetchPlanningEntities();
2597
2829
  setInitiatives((current) => upsertEntityById(current, data));
2598
2830
  return data;
2599
- }, [fetchPlanningEntities]);
2831
+ }, [fetchPlanningEntities, runInitiativeMutation]);
2600
2832
  const updateInitiative = useCallback(async (id, payload) => {
2601
- const res = await fetch(`/api/taskforce/initiative/${encodeURIComponent(id)}`, {
2833
+ const res = await runInitiativeMutation(`/api/taskforce/initiative/${encodeURIComponent(id)}`, {
2602
2834
  method: 'PATCH',
2603
2835
  headers: { 'Content-Type': 'application/json' },
2604
2836
  body: JSON.stringify(payload || {})
@@ -2610,12 +2842,30 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2610
2842
  await fetchPlanningEntities();
2611
2843
  setInitiatives((current) => upsertEntityById(current, data));
2612
2844
  return data;
2613
- }, [fetchPlanningEntities]);
2845
+ }, [fetchPlanningEntities, runInitiativeMutation]);
2846
+ const updatePlanningIdentity = useCallback(async (entityType, id, patch) => {
2847
+ const res = await runInitiativeMutation(`/api/taskforce/${entityType}/${encodeURIComponent(id)}/identity`, {
2848
+ method: 'PATCH',
2849
+ headers: { 'Content-Type': 'application/json' },
2850
+ body: JSON.stringify(patch),
2851
+ });
2852
+ const data = await res.json().catch(() => ({}));
2853
+ if (!res.ok)
2854
+ throw new Error(data?.error || `Failed to update ${entityType} identity (${res.status})`);
2855
+ if (entityType === 'initiative') {
2856
+ setInitiatives((current) => upsertEntityById(current, data));
2857
+ }
2858
+ else {
2859
+ setWorkstreams((current) => upsertEntityById(current, data));
2860
+ }
2861
+ void fetchPlanningEntities();
2862
+ return data;
2863
+ }, [fetchPlanningEntities, runInitiativeMutation]);
2614
2864
  const refreshPlanningEntitiesInBackground = useCallback(() => {
2615
2865
  void fetchPlanningEntities();
2616
2866
  }, [fetchPlanningEntities]);
2617
2867
  const archiveInitiative = useCallback(async (id) => {
2618
- const res = await fetch(`/api/taskforce/initiative/${encodeURIComponent(id)}/archive`, {
2868
+ const res = await runInitiativeMutation(`/api/taskforce/initiative/${encodeURIComponent(id)}/archive`, {
2619
2869
  method: 'POST',
2620
2870
  });
2621
2871
  const data = await res.json().catch(() => ({}));
@@ -2625,9 +2875,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2625
2875
  setInitiatives((current) => upsertEntityById(current, data));
2626
2876
  refreshPlanningEntitiesInBackground();
2627
2877
  return data;
2628
- }, [refreshPlanningEntitiesInBackground]);
2878
+ }, [refreshPlanningEntitiesInBackground, runInitiativeMutation]);
2629
2879
  const unarchiveInitiative = useCallback(async (id) => {
2630
- const res = await fetch(`/api/taskforce/initiative/${encodeURIComponent(id)}/unarchive`, {
2880
+ const res = await runInitiativeMutation(`/api/taskforce/initiative/${encodeURIComponent(id)}/unarchive`, {
2631
2881
  method: 'POST',
2632
2882
  });
2633
2883
  const data = await res.json().catch(() => ({}));
@@ -2637,59 +2887,149 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2637
2887
  setInitiatives((current) => upsertEntityById(current, data));
2638
2888
  refreshPlanningEntitiesInBackground();
2639
2889
  return data;
2640
- }, [refreshPlanningEntitiesInBackground]);
2890
+ }, [refreshPlanningEntitiesInBackground, runInitiativeMutation]);
2641
2891
  const createWorkstream = useCallback(async (payload) => {
2642
- const res = await fetch('/api/taskforce/workstream', {
2892
+ const attempt = await workstreamHttpMutationClient.prepareCreate(currentWorkspaceIdRef.current || 'default', (payload || {}));
2893
+ const res = await fetchWorkstreamHttpMutation('/api/taskforce/workstream', {
2643
2894
  method: 'POST',
2644
2895
  headers: { 'Content-Type': 'application/json' },
2645
- body: JSON.stringify(payload || {})
2646
- });
2896
+ body: JSON.stringify(attempt.body)
2897
+ }, attempt.operationId);
2898
+ const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
2647
2899
  const data = await res.json().catch(() => ({}));
2648
2900
  if (!res.ok) {
2649
- throw new Error(data?.error || `Failed to create workstream (${res.status})`);
2901
+ if (conclusiveRejection) {
2902
+ await workstreamHttpMutationClient.abandonCreate(attempt.fingerprint, attempt.operationId);
2903
+ }
2904
+ const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
2905
+ throw new Error(`${data?.error || `Failed to create workstream (${res.status})`}${retryGuidance}`);
2650
2906
  }
2907
+ if (data?.id !== attempt.body.id)
2908
+ throw new Error('Created workstream identity did not match the retained request identity.');
2909
+ await workstreamHttpMutationClient.confirmCreate(attempt.fingerprint, attempt.operationId);
2651
2910
  await fetchPlanningEntities();
2652
- setWorkstreams((current) => upsertEntityById(current, data));
2911
+ setWorkstreams((current) => {
2912
+ const created = selectCreatedWorkstreamAfterRefresh(current, data);
2913
+ return created ? upsertEntityById(current, created) : current;
2914
+ });
2653
2915
  return data;
2654
- }, [fetchPlanningEntities]);
2916
+ }, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient]);
2655
2917
  const updateWorkstream = useCallback(async (id, payload) => {
2656
- const res = await fetch(`/api/taskforce/workstream/${encodeURIComponent(id)}`, {
2918
+ const url = `/api/taskforce/workstream/${encodeURIComponent(id)}`;
2919
+ const body = (payload || {});
2920
+ const observed = workstreams.find((workstream) => workstream.id === id);
2921
+ const observedState = observed ? {
2922
+ updatedAt: observed.updatedAt || null,
2923
+ initiativeId: observed.initiativeId || null,
2924
+ ownerId: observed.ownerId || null,
2925
+ isArchived: Boolean(observed.isArchived),
2926
+ } : null;
2927
+ const attempt = await workstreamHttpMutationClient.prepareMutation(currentWorkspaceIdRef.current || 'default', url, body, observedState);
2928
+ const res = await fetchWorkstreamHttpMutation(url, {
2657
2929
  method: 'PATCH',
2658
2930
  headers: { 'Content-Type': 'application/json' },
2659
- body: JSON.stringify(payload || {})
2660
- });
2931
+ body: JSON.stringify(body)
2932
+ }, attempt.operationId);
2933
+ const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
2661
2934
  const data = await res.json().catch(() => ({}));
2662
2935
  if (!res.ok) {
2663
- throw new Error(data?.error || `Failed to update workstream (${res.status})`);
2936
+ if (conclusiveRejection) {
2937
+ await workstreamHttpMutationClient.abandonMutation(attempt.fingerprint, attempt.operationId);
2938
+ }
2939
+ const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
2940
+ throw new Error(`${data?.error || `Failed to update workstream (${res.status})`}${retryGuidance}`);
2664
2941
  }
2942
+ if (data?.id !== id)
2943
+ throw new Error('Updated workstream identity did not match the requested workstream.');
2944
+ await workstreamHttpMutationClient.confirmMutation(attempt.fingerprint, attempt.operationId);
2665
2945
  await fetchPlanningEntities();
2666
2946
  setWorkstreams((current) => upsertEntityById(current, data));
2667
2947
  return data;
2668
- }, [fetchPlanningEntities]);
2948
+ }, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient, workstreams]);
2949
+ const reorderWorkstreamTasks = useCallback(async (workstreamId, taskIds) => {
2950
+ const url = `/api/taskforce/workstream/${encodeURIComponent(workstreamId)}/task-order`;
2951
+ const body = { taskIds };
2952
+ const observed = workstreams.find((workstream) => workstream.id === workstreamId);
2953
+ const attempt = await workstreamHttpMutationClient.prepareMutation(currentWorkspaceIdRef.current || 'default', url, body, {
2954
+ updatedAt: observed?.updatedAt || null,
2955
+ workstreamId,
2956
+ });
2957
+ const res = await fetchWorkstreamHttpMutation(url, {
2958
+ method: 'POST',
2959
+ headers: { 'Content-Type': 'application/json' },
2960
+ body: JSON.stringify(body),
2961
+ }, attempt.operationId);
2962
+ const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
2963
+ const data = await res.json().catch(() => ({}));
2964
+ if (!res.ok) {
2965
+ if (conclusiveRejection) {
2966
+ await workstreamHttpMutationClient.abandonMutation(attempt.fingerprint, attempt.operationId);
2967
+ }
2968
+ const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
2969
+ throw new Error(`${data?.error || `Failed to reorder workstream tasks (${res.status})`}${retryGuidance}`);
2970
+ }
2971
+ if (data?.workstreamId !== workstreamId || !Array.isArray(data?.taskIds)) {
2972
+ throw new Error('Reordered workstream task response did not match the request.');
2973
+ }
2974
+ await workstreamHttpMutationClient.confirmMutation(attempt.fingerprint, attempt.operationId);
2975
+ const orderById = new Map(data.taskIds.map((taskId, index) => [taskId, (index + 1) * 1024]));
2976
+ setTasks((current) => current.map((task) => orderById.has(task.id)
2977
+ ? { ...task, workstreamOrder: orderById.get(task.id) }
2978
+ : task));
2979
+ await fetchPlanningEntities();
2980
+ }, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient, workstreams]);
2669
2981
  const archiveWorkstream = useCallback(async (id) => {
2670
- const res = await fetch(`/api/taskforce/workstream/${encodeURIComponent(id)}/archive`, {
2982
+ const url = `/api/taskforce/workstream/${encodeURIComponent(id)}/archive`;
2983
+ const observed = workstreams.find((workstream) => workstream.id === id);
2984
+ const attempt = await workstreamHttpMutationClient.prepareMutation(currentWorkspaceIdRef.current || 'default', url, {}, observed ? {
2985
+ updatedAt: observed.updatedAt || null,
2986
+ isArchived: Boolean(observed.isArchived),
2987
+ } : null);
2988
+ const res = await fetchWorkstreamHttpMutation(url, {
2671
2989
  method: 'POST',
2672
- });
2990
+ }, attempt.operationId);
2991
+ const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
2673
2992
  const data = await res.json().catch(() => ({}));
2674
2993
  if (!res.ok) {
2675
- throw new Error(data?.error || `Failed to archive workstream (${res.status})`);
2994
+ if (conclusiveRejection) {
2995
+ await workstreamHttpMutationClient.abandonMutation(attempt.fingerprint, attempt.operationId);
2996
+ }
2997
+ const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
2998
+ throw new Error(`${data?.error || `Failed to archive workstream (${res.status})`}${retryGuidance}`);
2676
2999
  }
3000
+ if (data?.id !== id)
3001
+ throw new Error('Archived workstream identity did not match the requested workstream.');
3002
+ await workstreamHttpMutationClient.confirmMutation(attempt.fingerprint, attempt.operationId);
2677
3003
  await fetchPlanningEntities();
2678
3004
  setWorkstreams((current) => upsertEntityById(current, data));
2679
3005
  return data;
2680
- }, [fetchPlanningEntities]);
3006
+ }, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient, workstreams]);
2681
3007
  const unarchiveWorkstream = useCallback(async (id) => {
2682
- const res = await fetch(`/api/taskforce/workstream/${encodeURIComponent(id)}/unarchive`, {
3008
+ const url = `/api/taskforce/workstream/${encodeURIComponent(id)}/unarchive`;
3009
+ const observed = workstreams.find((workstream) => workstream.id === id);
3010
+ const attempt = await workstreamHttpMutationClient.prepareMutation(currentWorkspaceIdRef.current || 'default', url, {}, observed ? {
3011
+ updatedAt: observed.updatedAt || null,
3012
+ isArchived: Boolean(observed.isArchived),
3013
+ } : null);
3014
+ const res = await fetchWorkstreamHttpMutation(url, {
2683
3015
  method: 'POST',
2684
- });
3016
+ }, attempt.operationId);
3017
+ const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
2685
3018
  const data = await res.json().catch(() => ({}));
2686
3019
  if (!res.ok) {
2687
- throw new Error(data?.error || `Failed to unarchive workstream (${res.status})`);
3020
+ if (conclusiveRejection) {
3021
+ await workstreamHttpMutationClient.abandonMutation(attempt.fingerprint, attempt.operationId);
3022
+ }
3023
+ const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
3024
+ throw new Error(`${data?.error || `Failed to unarchive workstream (${res.status})`}${retryGuidance}`);
2688
3025
  }
3026
+ if (data?.id !== id)
3027
+ throw new Error('Unarchived workstream identity did not match the requested workstream.');
3028
+ await workstreamHttpMutationClient.confirmMutation(attempt.fingerprint, attempt.operationId);
2689
3029
  await fetchPlanningEntities();
2690
3030
  setWorkstreams((current) => upsertEntityById(current, data));
2691
3031
  return data;
2692
- }, [fetchPlanningEntities]);
3032
+ }, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient, workstreams]);
2693
3033
  // Initialize auth once, then bootstrap protected data once auth gates are settled.
2694
3034
  const hasInitializedAuthRef = useRef(false);
2695
3035
  useEffect(() => {
@@ -2765,23 +3105,63 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2765
3105
  onTaskCountChange(tasks.length);
2766
3106
  }
2767
3107
  }, [tasks.length, onTaskCountChange]);
2768
- const handledInitialTaskIdRef = useRef(null);
2769
- // Deep linking handler
3108
+ const deepLinkRouteKey = useMemo(() => {
3109
+ const taskId = String(initialTaskId || '').trim();
3110
+ if (!taskId)
3111
+ return '';
3112
+ return [
3113
+ String(requestedWorkspaceId || '').trim(),
3114
+ taskId,
3115
+ String(initialActivityEntryId || '').trim()
3116
+ ].join(':');
3117
+ }, [initialActivityEntryId, initialTaskId, requestedWorkspaceId]);
3118
+ const deepLinkRouteKeyRef = useRef(deepLinkRouteKey);
3119
+ deepLinkRouteKeyRef.current = deepLinkRouteKey;
3120
+ const handledDeepLinkRouteKeyRef = useRef(null);
3121
+ const failedDeepLinkRouteKeyRef = useRef(null);
3122
+ const deepLinkWorkspaceSwitchRef = useRef(null);
3123
+ const deepLinkFailureNoticeOwnerKeyRef = useRef(null);
3124
+ const deepLinkCollectionLookupRef = useRef(null);
3125
+ const deepLinkArchiveSettledRef = useRef(new Set());
3126
+ const deepLinkDeletedSettledRef = useRef(new Set());
3127
+ const deepLinkRetryCountsRef = useRef(new Map());
3128
+ const deepLinkRetryTimerRef = useRef(null);
3129
+ const deepLinkWorkspaceSwitchRetryTimerRef = useRef(null);
3130
+ const [deepLinkRetryNonce, setDeepLinkRetryNonce] = useState(0);
2770
3131
  useEffect(() => {
2771
- if (!initialTaskId) {
2772
- handledInitialTaskIdRef.current = null;
2773
- return;
2774
- }
2775
- if (handledInitialTaskIdRef.current === initialTaskId || tasks.length === 0) {
2776
- return;
2777
- }
2778
- const task = tasks.find(t => t.id.endsWith(initialTaskId) || t.id === initialTaskId);
2779
- if (task) {
2780
- handledInitialTaskIdRef.current = initialTaskId;
2781
- handleEdit(task);
2782
- setActiveTab('add');
3132
+ const previousFailureNoticeOwnerKey = deepLinkFailureNoticeOwnerKeyRef.current;
3133
+ if (previousFailureNoticeOwnerKey
3134
+ && uiNoticeRef.current?.ownerKey === previousFailureNoticeOwnerKey) {
3135
+ clearNotice();
3136
+ }
3137
+ deepLinkFailureNoticeOwnerKeyRef.current = null;
3138
+ handledDeepLinkRouteKeyRef.current = null;
3139
+ failedDeepLinkRouteKeyRef.current = null;
3140
+ deepLinkWorkspaceSwitchRef.current = null;
3141
+ deepLinkCollectionLookupRef.current = null;
3142
+ deepLinkArchiveSettledRef.current.clear();
3143
+ deepLinkDeletedSettledRef.current.clear();
3144
+ deepLinkRetryCountsRef.current.clear();
3145
+ if (deepLinkRetryTimerRef.current !== null && typeof window !== 'undefined') {
3146
+ window.clearTimeout(deepLinkRetryTimerRef.current);
3147
+ deepLinkRetryTimerRef.current = null;
3148
+ }
3149
+ if (deepLinkWorkspaceSwitchRetryTimerRef.current !== null && typeof window !== 'undefined') {
3150
+ window.clearTimeout(deepLinkWorkspaceSwitchRetryTimerRef.current);
3151
+ deepLinkWorkspaceSwitchRetryTimerRef.current = null;
3152
+ }
3153
+ setDeepLinkRetryNonce((current) => current + 1);
3154
+ }, [clearNotice, deepLinkRouteKey]);
3155
+ useEffect(() => () => {
3156
+ if (deepLinkRetryTimerRef.current !== null && typeof window !== 'undefined') {
3157
+ window.clearTimeout(deepLinkRetryTimerRef.current);
3158
+ deepLinkRetryTimerRef.current = null;
3159
+ }
3160
+ if (deepLinkWorkspaceSwitchRetryTimerRef.current !== null && typeof window !== 'undefined') {
3161
+ window.clearTimeout(deepLinkWorkspaceSwitchRetryTimerRef.current);
3162
+ deepLinkWorkspaceSwitchRetryTimerRef.current = null;
2783
3163
  }
2784
- }, [initialTaskId, tasks]);
3164
+ }, []);
2785
3165
  // Update active category logic
2786
3166
  const hasInitedCategoryRef = useRef(false);
2787
3167
  useEffect(() => {
@@ -2807,7 +3187,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2807
3187
  }, [configLoaded, activeCategories, category, getPreferredCategoryValue, lastUsedCategory]);
2808
3188
  // Sanitize tasks with invalid categories
2809
3189
  useEffect(() => {
2810
- if (!configLoaded || activeCategories.length === 0)
3190
+ if (!configLoaded || !referenceDataLoaded || activeCategories.length === 0)
2811
3191
  return;
2812
3192
  const needsSanitization = (t) => {
2813
3193
  return !activeCategories.some(c => c.value === t.category);
@@ -2824,31 +3204,38 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2824
3204
  setArchivedTasks(prev => prev.map(t => needsSanitization(t) ? { ...t, category: defaultCategory } : t));
2825
3205
  }
2826
3206
  }
2827
- }, [configLoaded, activeCategories, tasks, archivedTasks, getPreferredCategoryValue]);
2828
- useEffect(() => {
2829
- return () => {
2830
- if (archiveBootstrapTimerRef.current !== null && typeof window !== 'undefined') {
2831
- window.clearTimeout(archiveBootstrapTimerRef.current);
2832
- archiveBootstrapTimerRef.current = null;
2833
- }
2834
- if (cloudRealtimeFollowUpRefreshTimerRef.current !== null && typeof window !== 'undefined') {
2835
- window.clearTimeout(cloudRealtimeFollowUpRefreshTimerRef.current);
2836
- cloudRealtimeFollowUpRefreshTimerRef.current = null;
2837
- }
2838
- };
2839
- }, []);
3207
+ }, [configLoaded, referenceDataLoaded, activeCategories, tasks, archivedTasks, getPreferredCategoryValue]);
2840
3208
  // HMR Listener for Real-Time Updates
2841
3209
  useEffect(() => {
2842
3210
  if (import.meta.hot) {
2843
3211
  import.meta.hot.on('taskforce:update', () => {
2844
3212
  // console.log('[Taskforce] Received HMR update, refreshing data...');
2845
- void refreshTaskCollections({ isSilent: true });
3213
+ void refreshTaskCollections({ isSilent: true, highlightChangedTaskIds: [] });
2846
3214
  });
2847
3215
  }
2848
3216
  }, [refreshTaskCollections]);
2849
3217
  const refreshTaskCollectionsForDataVersion = useCallback(async () => {
2850
- await refreshTaskCollectionsFromInvalidation();
3218
+ await refreshTaskCollectionsFromInvalidation(createTaskInvalidationScope(['active', 'archive', 'deleted', 'planning'], { ambiguous: true }));
2851
3219
  }, [refreshTaskCollectionsFromInvalidation]);
3220
+ useEffect(() => {
3221
+ if (typeof window === 'undefined')
3222
+ return;
3223
+ const handleTaskforceTasksMutated = (event) => {
3224
+ const detail = event.detail;
3225
+ const eventWorkspaceId = String(detail?.workspaceId || '').trim() || 'default';
3226
+ if (eventWorkspaceId !== currentWorkspaceId)
3227
+ return;
3228
+ if (detail?.authoritativeTask)
3229
+ return;
3230
+ void refreshTaskCollectionsFromInvalidation(createTaskInvalidationScope(detail?.affectedCollections?.length
3231
+ ? detail.affectedCollections
3232
+ : ['active', 'archive'], { taskIds: detail?.taskId ? [detail.taskId] : [] }));
3233
+ };
3234
+ window.addEventListener(TASKFORCE_TASKS_MUTATED_EVENT, handleTaskforceTasksMutated);
3235
+ return () => {
3236
+ window.removeEventListener(TASKFORCE_TASKS_MUTATED_EVENT, handleTaskforceTasksMutated);
3237
+ };
3238
+ }, [currentWorkspaceId, refreshTaskCollectionsFromInvalidation]);
2852
3239
  const normalizedRealtimeWorkspaceId = String(currentWorkspaceId || '').trim();
2853
3240
  const normalizedRealtimeUserId = String(authUserId || '').trim();
2854
3241
  const realtimeSocketUrl = resolveWebSocketUrl('/taskforce-ws');
@@ -2861,23 +3248,35 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2861
3248
  && normalizedRealtimeWorkspaceId
2862
3249
  && !isReservedWorkspaceId(normalizedRealtimeWorkspaceId)
2863
3250
  && realtimeSocketUrl);
2864
- const handleCloudRealtimeSignal = useCallback(() => {
3251
+ useEffect(() => {
3252
+ return () => {
3253
+ if (ambiguousRealtimeConfirmationTimerRef.current !== null && typeof window !== 'undefined') {
3254
+ window.clearTimeout(ambiguousRealtimeConfirmationTimerRef.current);
3255
+ ambiguousRealtimeConfirmationTimerRef.current = null;
3256
+ }
3257
+ };
3258
+ }, [currentWorkspaceId]);
3259
+ const handleCloudRealtimeSignal = useCallback((signal) => {
2865
3260
  if (runtimeMode !== 'cloud')
2866
3261
  return;
2867
- void refreshTaskCollectionsFromInvalidation();
2868
- if (typeof window === 'undefined')
3262
+ dispatchTaskforceWorkspaceResourcesInvalidated({
3263
+ workspaceId: normalizedRealtimeWorkspaceId,
3264
+ source: 'realtime',
3265
+ });
3266
+ const scope = resolveRealtimeTaskInvalidation(signal.type, signal.invalidations);
3267
+ if (scope.collections.length === 0)
2869
3268
  return;
2870
- if (cloudRealtimeFollowUpRefreshTimerRef.current !== null) {
2871
- window.clearTimeout(cloudRealtimeFollowUpRefreshTimerRef.current);
2872
- }
2873
- // Cloud invalidation events can arrive while the originating push/apply request
2874
- // is still unwinding. A short follow-up refresh closes that race without turning
2875
- // the websocket layer into a full data transport.
2876
- cloudRealtimeFollowUpRefreshTimerRef.current = window.setTimeout(() => {
2877
- cloudRealtimeFollowUpRefreshTimerRef.current = null;
2878
- void refreshTaskCollectionsFromInvalidation();
3269
+ void refreshTaskCollectionsFromInvalidation(scope);
3270
+ if (!scope.ambiguous || typeof window === 'undefined')
3271
+ return;
3272
+ if (ambiguousRealtimeConfirmationTimerRef.current !== null) {
3273
+ window.clearTimeout(ambiguousRealtimeConfirmationTimerRef.current);
3274
+ }
3275
+ ambiguousRealtimeConfirmationTimerRef.current = window.setTimeout(() => {
3276
+ ambiguousRealtimeConfirmationTimerRef.current = null;
3277
+ void refreshTaskCollectionsFromInvalidation(scope);
2879
3278
  }, 250);
2880
- }, [runtimeMode, refreshTaskCollectionsFromInvalidation]);
3279
+ }, [normalizedRealtimeWorkspaceId, runtimeMode, refreshTaskCollectionsFromInvalidation]);
2881
3280
  useRealtimeSync({
2882
3281
  enabled: cloudRealtimeEnabled,
2883
3282
  workspaceId: normalizedRealtimeWorkspaceId,
@@ -2887,6 +3286,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2887
3286
  });
2888
3287
  // Fallback sync for cross-process writes (e.g., MCP tools) that may miss watcher/websocket events.
2889
3288
  useDataVersionRefresh({
3289
+ workspaceId: currentWorkspaceId,
2890
3290
  isOpen,
2891
3291
  authBlocked,
2892
3292
  authRequiredForApi,
@@ -2897,7 +3297,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2897
3297
  authRequiredForApiRef,
2898
3298
  isAuthenticatedRef,
2899
3299
  dataVersionRef,
2900
- refreshTaskCollectionsForDataVersion
3300
+ refreshTaskCollectionsForDataVersion,
3301
+ coordinatorDataVersion: localCoordinatorDataVersion,
2901
3302
  });
2902
3303
  const relationshipTasks = useMemo(() => {
2903
3304
  const byId = new Map();
@@ -2922,21 +3323,31 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2922
3323
  return;
2923
3324
  if (activeTab === 'tasks') {
2924
3325
  const loadKey = `${currentWorkspaceId}:${activeTab}:${showArchive ? 'archive' : 'active'}:${taskScope}`;
3326
+ const requiresArchive = showArchive || taskScope === 'archived';
3327
+ const requiresDeleted = taskScope === 'deleted';
2925
3328
  if (!skippedInitialTaskTabRefreshRef.current) {
2926
3329
  skippedInitialTaskTabRefreshRef.current = true;
2927
3330
  lastTaskSurfaceLoadKeyRef.current = loadKey;
3331
+ if (requiresArchive) {
3332
+ void ensureArchiveHydrated(false);
3333
+ }
3334
+ if (requiresDeleted) {
3335
+ void ensureDeletedTasksHydrated(false);
3336
+ }
2928
3337
  return;
2929
3338
  }
2930
3339
  if (lastTaskSurfaceLoadKeyRef.current === loadKey)
2931
3340
  return;
2932
3341
  lastTaskSurfaceLoadKeyRef.current = loadKey;
2933
- fetchTasks();
3342
+ if (!requiresArchive && !requiresDeleted) {
3343
+ fetchTasks();
3344
+ }
2934
3345
  fetchPlanningEntities();
2935
- if (showArchive || taskScope === 'archived') {
2936
- fetchArchive(true);
3346
+ if (requiresArchive) {
3347
+ void ensureArchiveHydrated(false);
2937
3348
  }
2938
- if (taskScope === 'deleted') {
2939
- fetchDeletedTasks();
3349
+ if (requiresDeleted) {
3350
+ void ensureDeletedTasksHydrated(false);
2940
3351
  }
2941
3352
  return;
2942
3353
  }
@@ -2946,9 +3357,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2946
3357
  return;
2947
3358
  lastSettingsSurfaceLoadKeyRef.current = loadKey;
2948
3359
  fetchConfig();
2949
- if (settingsSection === 'commands' || settingsSection === 'resources') {
2950
- fetchWorkflows();
2951
- }
2952
3360
  }
2953
3361
  }, [
2954
3362
  currentWorkspaceId,
@@ -2959,10 +3367,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2959
3367
  taskScope,
2960
3368
  fetchTasks,
2961
3369
  fetchPlanningEntities,
2962
- fetchArchive,
2963
- fetchDeletedTasks,
3370
+ ensureArchiveHydrated,
3371
+ ensureDeletedTasksHydrated,
2964
3372
  fetchConfig,
2965
- fetchWorkflows,
2966
3373
  shouldDeferProtectedApiCalls,
2967
3374
  shouldBlockProtectedApiCalls,
2968
3375
  workspaceBootstrapPending
@@ -3055,7 +3462,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3055
3462
  }
3056
3463
  setActiveTab__internal(tab);
3057
3464
  }, [activeTab]);
3058
- const flushAutoSaveRef = useRef(async () => { });
3465
+ const flushAutoSaveRef = useRef(async () => true);
3059
3466
  const { handleNavigation, handleClose, resetForm, resolveTaskIdInput, resolveWorkstreamIdInput, handleEdit, handleOpenTaskById, returnToPreviousTask, clearReturnToParentTask } = useTaskEditorNavigation({
3060
3467
  activeCategories,
3061
3468
  activeTypes,
@@ -3066,7 +3473,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3066
3473
  description,
3067
3474
  editingTaskId,
3068
3475
  flushPendingAutoSave: () => flushAutoSaveRef.current(),
3476
+ getDescriptionDraft,
3069
3477
  getPreferredCategoryValue,
3478
+ getTitleDraft,
3070
3479
  lastUsedCategory,
3071
3480
  newCommentText,
3072
3481
  relationshipTasks,
@@ -3074,7 +3483,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3074
3483
  showArchive,
3075
3484
  taxonomies,
3076
3485
  setActiveTab,
3077
- setApproach,
3078
3486
  setAssignee,
3079
3487
  setAttachments,
3080
3488
  setAttachmentsDirty,
@@ -3102,9 +3510,302 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3102
3510
  taskReturnTrail,
3103
3511
  title,
3104
3512
  });
3513
+ useEffect(() => {
3514
+ const normalizedTaskId = String(pendingOpenTaskId || '').trim();
3515
+ if (!uiStateReady || !normalizedTaskId)
3516
+ return;
3517
+ if (editingTaskId === normalizedTaskId) {
3518
+ setPendingOpenTaskId(null);
3519
+ return;
3520
+ }
3521
+ if (loadingTasks || workspaceBootstrapPending)
3522
+ return;
3523
+ const matchesTask = (task) => (task.id === normalizedTaskId || task.id.endsWith(normalizedTaskId));
3524
+ const target = relationshipTasks.find(matchesTask);
3525
+ if (target) {
3526
+ handleOpenTaskById(normalizedTaskId);
3527
+ setPendingOpenTaskId(null);
3528
+ return;
3529
+ }
3530
+ const workspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
3531
+ const archiveLookupKey = `${workspaceId}:${normalizedTaskId}`;
3532
+ if (archiveHydratedWorkspaceId !== workspaceId && !archiveLookupSettledKeys.has(archiveLookupKey)) {
3533
+ void ensureArchiveHydrated(true).finally(() => {
3534
+ const liveWorkspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
3535
+ if (liveWorkspaceId === workspaceId) {
3536
+ setArchiveLookupSettledKeys((current) => {
3537
+ if (current.has(archiveLookupKey))
3538
+ return current;
3539
+ return new Set(current).add(archiveLookupKey);
3540
+ });
3541
+ }
3542
+ });
3543
+ return;
3544
+ }
3545
+ const deletedTarget = deletedRelationshipTasks.find(matchesTask);
3546
+ if (deletedTarget) {
3547
+ handleEdit(deletedTarget);
3548
+ setPendingOpenTaskId(null);
3549
+ return;
3550
+ }
3551
+ if (deletedHydratedWorkspaceId !== workspaceId) {
3552
+ void ensureDeletedTasksHydrated(true);
3553
+ return;
3554
+ }
3555
+ setPendingOpenTaskId(null);
3556
+ }, [
3557
+ archiveHydratedWorkspaceId,
3558
+ archiveLookupSettledKeys,
3559
+ deletedHydratedWorkspaceId,
3560
+ deletedRelationshipTasks,
3561
+ editingTaskId,
3562
+ ensureArchiveHydrated,
3563
+ ensureDeletedTasksHydrated,
3564
+ handleEdit,
3565
+ handleOpenTaskById,
3566
+ loadingTasks,
3567
+ pendingOpenTaskId,
3568
+ relationshipTasks,
3569
+ uiStateReady,
3570
+ workspaceBootstrapPending
3571
+ ]);
3572
+ // Deep links are workspace-scoped. In cloud mode, switch to the explicit
3573
+ // workspace before looking up the task. Local runtimes never cross their
3574
+ // configured workspace boundary.
3575
+ useEffect(() => {
3576
+ const normalizedTaskId = String(initialTaskId || '').trim();
3577
+ if (!normalizedTaskId || !deepLinkRouteKey)
3578
+ return;
3579
+ if (handledDeepLinkRouteKeyRef.current === deepLinkRouteKey
3580
+ || !runtimeConfigReady
3581
+ || !configLoaded
3582
+ || !uiStateReady
3583
+ || loadingTasks
3584
+ || workspaceBootstrapPending) {
3585
+ return;
3586
+ }
3587
+ const explicitWorkspaceId = String(requestedWorkspaceId || '').trim();
3588
+ const activeWorkspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
3589
+ const clearOwnedFailureNotice = () => {
3590
+ const ownerKey = deepLinkFailureNoticeOwnerKeyRef.current;
3591
+ if (ownerKey && uiNoticeRef.current?.ownerKey === ownerKey) {
3592
+ clearNotice();
3593
+ }
3594
+ deepLinkFailureNoticeOwnerKeyRef.current = null;
3595
+ };
3596
+ if (explicitWorkspaceId && explicitWorkspaceId !== activeWorkspaceId) {
3597
+ if (failedDeepLinkRouteKeyRef.current === deepLinkRouteKey)
3598
+ return;
3599
+ if (runtimeMode !== 'cloud' || !workspaceSwitchingEnabled) {
3600
+ if (failedDeepLinkRouteKeyRef.current !== deepLinkRouteKey) {
3601
+ failedDeepLinkRouteKeyRef.current = deepLinkRouteKey;
3602
+ pushNotice('This task is unavailable or you do not have access to it.', 'info', 12_000);
3603
+ }
3604
+ return;
3605
+ }
3606
+ if (!authSessionResolved || !isAuthenticated || authBlocked)
3607
+ return;
3608
+ if (deepLinkWorkspaceSwitchRef.current === deepLinkRouteKey
3609
+ || deepLinkWorkspaceSwitchRetryTimerRef.current !== null) {
3610
+ return;
3611
+ }
3612
+ const routeKeyAtStart = deepLinkRouteKey;
3613
+ const switchRetryKey = `${routeKeyAtStart}:workspace`;
3614
+ deepLinkWorkspaceSwitchRef.current = routeKeyAtStart;
3615
+ void switchWorkspace(explicitWorkspaceId).then((result) => {
3616
+ if (deepLinkRouteKeyRef.current !== routeKeyAtStart)
3617
+ return;
3618
+ if (!result.success) {
3619
+ const attemptCount = (deepLinkRetryCountsRef.current.get(switchRetryKey) || 0) + 1;
3620
+ deepLinkRetryCountsRef.current.set(switchRetryKey, attemptCount);
3621
+ if (attemptCount < 2 && typeof window !== 'undefined') {
3622
+ deepLinkWorkspaceSwitchRetryTimerRef.current = window.setTimeout(() => {
3623
+ deepLinkWorkspaceSwitchRetryTimerRef.current = null;
3624
+ if (deepLinkRouteKeyRef.current === routeKeyAtStart) {
3625
+ setDeepLinkRetryNonce((current) => current + 1);
3626
+ }
3627
+ }, 500);
3628
+ return;
3629
+ }
3630
+ failedDeepLinkRouteKeyRef.current = routeKeyAtStart;
3631
+ const failureNoticeOwnerKey = `deep-link-workspace:${routeKeyAtStart}`;
3632
+ deepLinkFailureNoticeOwnerKeyRef.current = failureNoticeOwnerKey;
3633
+ pushNotice('This task is unavailable or you do not have access to it.', 'info', 12_000, {
3634
+ label: 'Retry',
3635
+ onAction: () => {
3636
+ if (deepLinkRouteKeyRef.current !== routeKeyAtStart)
3637
+ return;
3638
+ deepLinkFailureNoticeOwnerKeyRef.current = null;
3639
+ failedDeepLinkRouteKeyRef.current = null;
3640
+ deepLinkRetryCountsRef.current.delete(switchRetryKey);
3641
+ clearNotice();
3642
+ setDeepLinkRetryNonce((current) => current + 1);
3643
+ },
3644
+ ownerKey: failureNoticeOwnerKey
3645
+ });
3646
+ }
3647
+ }).finally(() => {
3648
+ if (deepLinkWorkspaceSwitchRef.current === routeKeyAtStart) {
3649
+ deepLinkWorkspaceSwitchRef.current = null;
3650
+ }
3651
+ });
3652
+ return;
3653
+ }
3654
+ const resolveTarget = (items) => {
3655
+ const exact = items.find((task) => task.id === normalizedTaskId);
3656
+ if (exact || explicitWorkspaceId)
3657
+ return exact;
3658
+ const legacySuffixMatches = items.filter((task) => task.id.endsWith(normalizedTaskId));
3659
+ return legacySuffixMatches.length === 1 ? legacySuffixMatches[0] : undefined;
3660
+ };
3661
+ const target = resolveTarget(relationshipTasks);
3662
+ if (target) {
3663
+ clearOwnedFailureNotice();
3664
+ handledDeepLinkRouteKeyRef.current = deepLinkRouteKey;
3665
+ failedDeepLinkRouteKeyRef.current = null;
3666
+ if (editingTaskId !== target.id) {
3667
+ if (target.isArchived)
3668
+ setShowArchive(true);
3669
+ handleEdit(target);
3670
+ }
3671
+ return;
3672
+ }
3673
+ const scheduleCollectionLookup = (collection, lookup, settledRoutes) => {
3674
+ const lookupKey = `${deepLinkRouteKey}:${collection}`;
3675
+ if (deepLinkCollectionLookupRef.current === lookupKey
3676
+ || deepLinkRetryTimerRef.current !== null) {
3677
+ return;
3678
+ }
3679
+ deepLinkCollectionLookupRef.current = lookupKey;
3680
+ const routeKeyAtStart = deepLinkRouteKey;
3681
+ void lookup().then((loaded) => {
3682
+ if (deepLinkRouteKeyRef.current !== routeKeyAtStart)
3683
+ return;
3684
+ if (loaded) {
3685
+ setDeepLinkRetryNonce((current) => current + 1);
3686
+ return;
3687
+ }
3688
+ const attemptCount = (deepLinkRetryCountsRef.current.get(lookupKey) || 0) + 1;
3689
+ deepLinkRetryCountsRef.current.set(lookupKey, attemptCount);
3690
+ if (attemptCount >= 2) {
3691
+ settledRoutes.add(routeKeyAtStart);
3692
+ setDeepLinkRetryNonce((current) => current + 1);
3693
+ return;
3694
+ }
3695
+ if (typeof window !== 'undefined') {
3696
+ deepLinkRetryTimerRef.current = window.setTimeout(() => {
3697
+ deepLinkRetryTimerRef.current = null;
3698
+ if (deepLinkRouteKeyRef.current === routeKeyAtStart) {
3699
+ setDeepLinkRetryNonce((current) => current + 1);
3700
+ }
3701
+ }, 500);
3702
+ }
3703
+ }).finally(() => {
3704
+ if (deepLinkCollectionLookupRef.current === lookupKey) {
3705
+ deepLinkCollectionLookupRef.current = null;
3706
+ }
3707
+ });
3708
+ };
3709
+ if (archiveHydratedWorkspaceId !== activeWorkspaceId
3710
+ && !deepLinkArchiveSettledRef.current.has(deepLinkRouteKey)) {
3711
+ scheduleCollectionLookup('archive', () => ensureArchiveHydrated(true), deepLinkArchiveSettledRef.current);
3712
+ return;
3713
+ }
3714
+ const deletedTarget = resolveTarget(deletedRelationshipTasks);
3715
+ if (deletedTarget) {
3716
+ clearOwnedFailureNotice();
3717
+ handledDeepLinkRouteKeyRef.current = deepLinkRouteKey;
3718
+ failedDeepLinkRouteKeyRef.current = null;
3719
+ handleEdit(deletedTarget);
3720
+ return;
3721
+ }
3722
+ if (deletedHydratedWorkspaceId !== activeWorkspaceId
3723
+ && !deepLinkDeletedSettledRef.current.has(deepLinkRouteKey)) {
3724
+ scheduleCollectionLookup('deleted', () => ensureDeletedTasksHydrated(true), deepLinkDeletedSettledRef.current);
3725
+ return;
3726
+ }
3727
+ if (failedDeepLinkRouteKeyRef.current !== deepLinkRouteKey) {
3728
+ failedDeepLinkRouteKeyRef.current = deepLinkRouteKey;
3729
+ pushNotice('This task is unavailable or you do not have access to it.', 'info', 12_000);
3730
+ }
3731
+ }, [
3732
+ archiveHydratedWorkspaceId,
3733
+ authBlocked,
3734
+ authSessionResolved,
3735
+ clearNotice,
3736
+ configLoaded,
3737
+ currentWorkspaceIdRef,
3738
+ deepLinkRetryNonce,
3739
+ deepLinkRouteKey,
3740
+ deletedHydratedWorkspaceId,
3741
+ deletedRelationshipTasks,
3742
+ editingTaskId,
3743
+ ensureArchiveHydrated,
3744
+ ensureDeletedTasksHydrated,
3745
+ handleEdit,
3746
+ initialTaskId,
3747
+ isAuthenticated,
3748
+ loadingTasks,
3749
+ pushNotice,
3750
+ relationshipTasks,
3751
+ requestedWorkspaceId,
3752
+ runtimeConfigReady,
3753
+ runtimeMode,
3754
+ setShowArchive,
3755
+ switchWorkspace,
3756
+ uiStateReady,
3757
+ workspaceBootstrapPending,
3758
+ workspaceSwitchingEnabled
3759
+ ]);
3105
3760
  // === SECTION: Task CRUD ===
3106
3761
  // Pure mutation callbacks are managed by useTaskMutations.
3107
- const { copiedId, handleDelete, handleUpdateTask, handleToggleComplete, handleToggleCancel, handleToggleInProgress, handleToggleReview, handleArchiveTask, handleBulkArchive, handleUnarchive, handleRestoreDeletedTask, handlePermanentlyDeleteDeletedTask, handleEmptyDeletedTasks, handleCopyId, queueWorkspaceSyncFromAuthoritativeTaskState, } = useTaskActions({
3762
+ const mutateTaskMetadata = useDurableTaskMetadataMutation({
3763
+ enabled: runtimeConfigOverride.syncV3TaskMetadataActivation
3764
+ && runtimeMode === 'local',
3765
+ workspaceId: currentWorkspaceId,
3766
+ isAuthenticated,
3767
+ dispatchEnabled: workspaceCloudSyncEnabled,
3768
+ });
3769
+ const createTaskDurably = useDurableTaskCreateMutation({
3770
+ localRuntime: runtimeMode === 'local',
3771
+ enabled: runtimeConfigOverride.syncV3TaskCreateActivation
3772
+ && runtimeMode === 'local',
3773
+ workspaceId: currentWorkspaceId,
3774
+ isAuthenticated,
3775
+ dispatchEnabled: workspaceCloudSyncEnabled,
3776
+ });
3777
+ const taskStatusActivationEnabled = runtimeConfigOverride.syncV3TaskStatusActivation
3778
+ && runtimeMode === 'local';
3779
+ const mutateTaskStatus = useDurableTaskStatusMutation({
3780
+ enabled: taskStatusActivationEnabled,
3781
+ workspaceId: currentWorkspaceId,
3782
+ isAuthenticated,
3783
+ dispatchEnabled: workspaceCloudSyncEnabled,
3784
+ });
3785
+ const mutateTaskLifecycle = useDurableTaskLifecycleMutation({
3786
+ // Always probe the local durable lifecycle boundary. The route returns
3787
+ // an explicit disabled result for v2-owned workspaces, but persisted
3788
+ // v3 ownership must survive a process restart with incomplete flags.
3789
+ enabled: runtimeMode === 'local',
3790
+ workspaceId: currentWorkspaceId,
3791
+ isAuthenticated,
3792
+ dispatchEnabled: workspaceCloudSyncEnabled,
3793
+ });
3794
+ const taskDeleteActivationEnabled = runtimeConfigOverride.syncV3TaskDeleteActivation
3795
+ && runtimeMode === 'local';
3796
+ const mutateTaskDelete = useDurableTaskDeleteMutation({
3797
+ enabled: taskDeleteActivationEnabled,
3798
+ workspaceId: currentWorkspaceId,
3799
+ isAuthenticated,
3800
+ dispatchEnabled: workspaceCloudSyncEnabled,
3801
+ });
3802
+ const mutateTaskRestore = useDurableTaskRestoreMutation({
3803
+ enabled: taskDeleteActivationEnabled,
3804
+ workspaceId: currentWorkspaceId,
3805
+ isAuthenticated,
3806
+ dispatchEnabled: workspaceCloudSyncEnabled,
3807
+ });
3808
+ const { copiedId, handleDelete, handleUpdateTask, handleSetStatus, handleToggleComplete, handleToggleCancel, handleToggleInProgress, handleToggleReview, handleArchiveTask, handleBulkArchive, handleUnarchive, handleRestoreDeletedTask, handleRestoreSelectedDeletedTasks, handlePermanentlyDeleteDeletedTask, handleEmptyDeletedTasks, handleCopyId, queueWorkspaceSyncFromAuthoritativeTaskState, } = useTaskActions({
3108
3809
  tasks,
3109
3810
  archivedTasks,
3110
3811
  editingTaskId,
@@ -3115,8 +3816,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3115
3816
  resetForm,
3116
3817
  setActiveTab,
3117
3818
  fetchTasks,
3118
- fetchArchive,
3119
- fetchDeletedTasks,
3819
+ fetchArchive: refreshArchiveIfHydrated,
3820
+ fetchDeletedTasks: refreshDeletedTasksIfHydrated,
3120
3821
  mergeTaskFromServer,
3121
3822
  pushNotice,
3122
3823
  cloudAuthConfigured,
@@ -3128,12 +3829,38 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3128
3829
  workspacePendingSignatureRef,
3129
3830
  workspaceDeletedTaskIdsRef,
3130
3831
  workspaceDeletedTaskWatermarksRef,
3832
+ mutateTaskMetadata,
3833
+ mutateTaskStatus,
3834
+ mutateTaskLifecycle,
3835
+ mutateTaskDelete,
3836
+ mutateTaskRestore,
3837
+ durableTaskMetadataActivationEnabled: runtimeConfigOverride.syncV3TaskMetadataActivation
3838
+ && runtimeMode === 'local',
3839
+ durableTaskStatusActivationEnabled: taskStatusActivationEnabled,
3840
+ durableTaskDeleteActivationEnabled: taskDeleteActivationEnabled,
3841
+ durableTaskHttpRootActivationEnabled: runtimeConfigOverride.syncV3TaskCloudHttpRootActivation,
3842
+ workspaceId: currentWorkspaceId,
3131
3843
  });
3844
+ const promoteDescriptionImageDraft = useCallback(async () => {
3845
+ const draftId = descriptionImageDraftIdRef.current;
3846
+ const response = await fetch('/api/taskforce/context-upload/draft/promote', {
3847
+ method: 'POST',
3848
+ headers: { 'Content-Type': 'application/json' },
3849
+ body: JSON.stringify({
3850
+ workspaceId: currentWorkspaceId,
3851
+ draftUploadId: draftId,
3852
+ uploadPurpose: 'task-description-draft',
3853
+ }),
3854
+ });
3855
+ if (!response.ok) {
3856
+ throw new Error('Task was created, but its draft upload records could not be finalized.');
3857
+ }
3858
+ rotateDescriptionImageDraftId();
3859
+ }, [currentWorkspaceId, rotateDescriptionImageDraftId]);
3132
3860
  const { autoSaveState, flushAutoSave, scheduleWarningPrompt, handleSubmit, confirmScheduleWarning, cancelScheduleWarning, handleAddComment } = useTaskFormActions({
3133
3861
  activeCategories,
3134
3862
  activeTab,
3135
3863
  apiEndpoint,
3136
- approach,
3137
3864
  assignee,
3138
3865
  attachments,
3139
3866
  attachmentsDirty,
@@ -3143,16 +3870,27 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3143
3870
  complexity,
3144
3871
  description,
3145
3872
  dueDate,
3873
+ createTaskDurably,
3874
+ durableTaskHttpRootActivationEnabled: runtimeConfigOverride.syncV3TaskCloudHttpRootActivation,
3875
+ workspaceId: currentWorkspaceId,
3876
+ updateTask: handleUpdateTask,
3146
3877
  editingTaskId,
3147
3878
  fetchTasks,
3148
3879
  formTaxonomies,
3880
+ getAttachmentsDraft,
3881
+ getDescriptionDraft,
3149
3882
  getPreferredCategoryValue,
3883
+ getTitleDraft,
3884
+ awaitPendingDescriptionImageUpload,
3885
+ onTaskCreateAccepted: promoteDescriptionImageDraft,
3150
3886
  mergeTaskFromServer,
3887
+ onTaskCreated: handleEdit,
3151
3888
  workstreamInput,
3152
3889
  priority,
3153
3890
  pushNotice,
3154
3891
  queueWorkspaceSyncFromAuthoritativeTaskState,
3155
3892
  relationshipTasks,
3893
+ supplementalTasks: deletedRelationshipTasks,
3156
3894
  resetForm,
3157
3895
  resolveWorkstreamIdInput,
3158
3896
  scheduledDate,
@@ -3166,28 +3904,53 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3166
3904
  status,
3167
3905
  title,
3168
3906
  taxonomies,
3907
+ textDraftOccupied,
3169
3908
  type
3170
3909
  });
3910
+ const discardDescriptionImageDraft = useCallback(async () => {
3911
+ const draftId = descriptionImageDraftIdRef.current;
3912
+ rotateDescriptionImageDraftId();
3913
+ try {
3914
+ await awaitPendingDescriptionImageUpload();
3915
+ const response = await fetch('/api/taskforce/context-upload/draft/discard', {
3916
+ method: 'POST',
3917
+ headers: { 'Content-Type': 'application/json' },
3918
+ body: JSON.stringify({
3919
+ workspaceId: currentWorkspaceId,
3920
+ draftUploadId: draftId,
3921
+ uploadPurpose: 'task-description-draft',
3922
+ }),
3923
+ });
3924
+ if (!response.ok)
3925
+ throw new Error('Draft upload cleanup was rejected.');
3926
+ }
3927
+ catch (error) {
3928
+ console.warn('[Taskforce] Failed to clean discarded Description image uploads.', error);
3929
+ }
3930
+ }, [awaitPendingDescriptionImageUpload, currentWorkspaceId, rotateDescriptionImageDraftId]);
3171
3931
  useEffect(() => {
3172
3932
  flushAutoSaveRef.current = flushAutoSave;
3173
3933
  }, [flushAutoSave]);
3174
3934
  const { handleSetWorkstreamForCurrentTask, } = useTaskRelationships({
3175
3935
  editingTaskId,
3176
- mergeTaskFromServer,
3177
3936
  workstreamInput,
3178
3937
  pushNotice,
3179
- queueWorkspaceSyncFromAuthoritativeTaskState,
3180
3938
  relationshipTasks,
3181
3939
  resolveWorkstreamIdInput,
3182
3940
  setError,
3183
- fetchTasks
3941
+ updateTask: handleUpdateTask
3184
3942
  });
3185
3943
  const { currentTask, currentTaskWorkstream, currentTaskInitiative, } = useCurrentTaskRelations({
3186
3944
  editingTaskId,
3187
3945
  relationshipTasks,
3188
3946
  initiatives,
3189
3947
  workstreams,
3948
+ workstreamInput,
3949
+ resolveWorkstreamIdInput,
3190
3950
  supplementalTasks: deletedRelationshipTasks,
3951
+ assignee,
3952
+ setAssignee,
3953
+ setChecklistItems,
3191
3954
  setComments
3192
3955
  });
3193
3956
  const settingsModel = useSettingsModel({
@@ -3211,12 +3974,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3211
3974
  manualComplexityEnabled,
3212
3975
  checklistDropdownEnabled,
3213
3976
  showTaskCardStatusLabel,
3214
- exportWorkflowsPath,
3215
- exportingResource,
3216
- exportResult,
3217
3977
  pathSaved,
3218
3978
  settingsSection,
3219
- exportEnvironment,
3220
3979
  setupState,
3221
3980
  buildInfo,
3222
3981
  saveSetupMode,
@@ -3234,19 +3993,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3234
3993
  handleShowTaskCardStatusLabelChange,
3235
3994
  handleResetProjectToGlobal,
3236
3995
  handleSaveSettings,
3237
- setExportWorkflowsPath,
3238
- setExportEnvironment,
3239
- availableWorkflows,
3240
3996
  initiativeTemplates,
3241
- availableEnvironments,
3242
- fetchWorkflows,
3243
3997
  fetchInitiativeTemplates,
3244
3998
  createInitiativeFromTemplate,
3245
- fetchWorkflowTemplate,
3246
- fetchWorkflowOverrideNames,
3247
- saveWorkflowTemplateDraft,
3248
- resetWorkflowTemplateDraft,
3249
- handleExportWorkflows,
3250
3999
  setShowFolderBrowser,
3251
4000
  setBrowserTarget,
3252
4001
  fetchFolders,
@@ -3403,6 +4152,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3403
4152
  workspaceSyncRecommendedAction,
3404
4153
  workspaceSyncBusy,
3405
4154
  workspaceSyncPendingChanges,
4155
+ localCoordinatorStatus,
4156
+ transferLocalCoordinatorOwnership,
3406
4157
  retryUserGlobalSettingsSync,
3407
4158
  retryWorkspaceCloudSync,
3408
4159
  resetWorkspaceSyncCursorAndPull,
@@ -3439,6 +4190,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3439
4190
  fetchLoginMethods,
3440
4191
  unlinkLoginMethod,
3441
4192
  addPasswordToAccount,
4193
+ changePassword,
3442
4194
  beginOAuthLink,
3443
4195
  registerWithCredentials,
3444
4196
  updateCurrentUserProfile,
@@ -3470,15 +4222,17 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3470
4222
  tasks,
3471
4223
  loadingTasks,
3472
4224
  archivedTasks,
4225
+ archiveHydratedWorkspaceId,
3473
4226
  initiatives,
3474
4227
  workstreams,
3475
4228
  planningBootstrapTaskSummaries,
4229
+ planningLoadState,
4230
+ workspaceTaskRelationships,
3476
4231
  deletedTasks,
3477
4232
  activeCategories,
3478
4233
  activeTypes,
3479
4234
  priorities,
3480
4235
  taxonomyDisplayLabels,
3481
- approaches,
3482
4236
  taxonomies,
3483
4237
  // Filtering
3484
4238
  searchQuery,
@@ -3505,6 +4259,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3505
4259
  setShowArchive,
3506
4260
  taskScope,
3507
4261
  setTaskScope,
4262
+ compressedCards,
4263
+ setCompressedCards,
3508
4264
  clearFilters,
3509
4265
  filteredTasks,
3510
4266
  searchAgnosticTasks,
@@ -3515,17 +4271,21 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3515
4271
  // Actions
3516
4272
  fetchTasks,
3517
4273
  fetchArchive,
4274
+ ensureArchiveHydrated,
3518
4275
  fetchDeletedTasks,
3519
4276
  fetchPlanningEntities,
4277
+ fetchPlanningEntityDetail,
3520
4278
  fetchAssigneeOptions,
3521
4279
  createInitiative,
3522
4280
  updateInitiative,
4281
+ updatePlanningIdentity,
3523
4282
  archiveInitiative,
3524
4283
  unarchiveInitiative,
3525
4284
  createWorkstream,
3526
4285
  updateWorkstream,
3527
4286
  archiveWorkstream,
3528
4287
  unarchiveWorkstream,
4288
+ reorderWorkstreamTasks,
3529
4289
  handleEdit,
3530
4290
  handleDelete,
3531
4291
  handleCopyId,
@@ -3537,17 +4297,22 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3537
4297
  handleBulkArchive,
3538
4298
  handleUnarchive,
3539
4299
  handleRestoreDeletedTask,
4300
+ handleRestoreSelectedDeletedTasks,
3540
4301
  handlePermanentlyDeleteDeletedTask,
3541
4302
  handleEmptyDeletedTasks,
3542
4303
  handleUpdateTask,
4304
+ handleSetStatus,
3543
4305
  // Form State
3544
4306
  editingTaskId,
3545
4307
  loading,
3546
4308
  error,
4309
+ clearTaskError,
3547
4310
  title,
3548
4311
  setTitle,
4312
+ setTitleDraft,
3549
4313
  description,
3550
4314
  setDescription,
4315
+ setDescriptionDraft,
3551
4316
  checklistItems,
3552
4317
  setChecklistItems,
3553
4318
  category,
@@ -3560,8 +4325,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3560
4325
  setComplexity,
3561
4326
  status,
3562
4327
  setStatus,
3563
- approach,
3564
- setApproach,
3565
4328
  assignee,
3566
4329
  setAssignee,
3567
4330
  scheduledDate,
@@ -3579,19 +4342,19 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3579
4342
  setAttachments,
3580
4343
  attachmentsDirty,
3581
4344
  setAttachmentsDirty,
4345
+ descriptionImageUploadPending,
4346
+ descriptionImageDraftId,
4347
+ registerDescriptionImageUpload,
3582
4348
  descriptionFocused,
3583
4349
  setDescriptionFocused,
3584
4350
  showMarkdownHelp,
3585
4351
  setShowMarkdownHelp,
3586
- showChecklist,
3587
- setShowChecklist,
3588
- showComments,
3589
- setShowComments,
3590
4352
  isCapturingScreenshot,
3591
4353
  setIsCapturingScreenshot,
3592
4354
  // Form Actions
3593
4355
  handleSubmit,
3594
4356
  resetForm,
4357
+ discardDescriptionImageDraft,
3595
4358
  handleAddComment,
3596
4359
  handleSetWorkstreamForCurrentTask,
3597
4360
  handleOpenTaskById,
@@ -3618,13 +4381,13 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3618
4381
  cancelScheduleWarning,
3619
4382
  tasksScrollRef,
3620
4383
  setTasksScrollPos, // Export if needed
3621
- // Export
3622
- exportEnvironment,
3623
- setExportEnvironment,
3624
- exportWorkflowsPath,
3625
- setExportWorkflowsPath,
3626
- exportResult,
3627
- exportingResource,
4384
+ taskforceAgentId,
4385
+ setTaskforceAgentId,
4386
+ taskforceAgentConversationId,
4387
+ setTaskforceAgentConversationId,
4388
+ taskforceAgentConversationByAgentId,
4389
+ setTaskforceAgentConversationByAgentId,
4390
+ uiStateReady,
3628
4391
  // Categories & Types & Taxonomies mgmt
3629
4392
  handleUpdateCategory,
3630
4393
  handleRemoveCategory,
@@ -3652,17 +4415,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3652
4415
  currentTask,
3653
4416
  currentTaskWorkstream,
3654
4417
  currentTaskInitiative,
3655
- availableWorkflows,
3656
4418
  initiativeTemplates,
3657
- availableEnvironments,
3658
- fetchWorkflows,
3659
4419
  fetchInitiativeTemplates,
3660
4420
  createInitiativeFromTemplate,
3661
- fetchWorkflowTemplate,
3662
- fetchWorkflowOverrideNames,
3663
- saveWorkflowTemplateDraft,
3664
- resetWorkflowTemplateDraft,
3665
- onExportWorkflows: handleExportWorkflows,
3666
4421
  settingsModel
3667
4422
  };
3668
4423
  }