@taskforcehq/taskforce 0.3.326 → 0.3.327

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 (1358) hide show
  1. package/LICENSE.md +68 -0
  2. package/README.md +19 -0
  3. package/dist/Taskforce.module.css +2173 -561
  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 +73 -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 +4 -0
  27. package/dist/components/context/ContextAttachmentManager.js +418 -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 +44 -0
  60. package/dist/components/features/planning/PlanningEntitySummary.js +97 -0
  61. package/dist/components/features/planning/PlanningLinkPicker.d.ts +9 -0
  62. package/dist/components/features/planning/PlanningLinkPicker.js +26 -0
  63. package/dist/components/features/planning/PlanningModule.d.ts +6 -0
  64. package/dist/components/features/planning/PlanningModule.js +571 -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/planningCreateIntent.d.ts +10 -0
  76. package/dist/components/features/planning/planningCreateIntent.js +16 -0
  77. package/dist/components/features/planning/planningNavigator.d.ts +33 -0
  78. package/dist/components/features/planning/planningNavigator.js +96 -0
  79. package/dist/components/features/planning/planningTaskArrangement.d.ts +18 -0
  80. package/dist/components/features/planning/planningTaskArrangement.js +106 -0
  81. package/dist/components/features/planning/planningWorkspaceModel.d.ts +121 -0
  82. package/dist/components/features/planning/planningWorkspaceModel.js +5 -0
  83. package/dist/components/features/settings/CategoryManager.js +2 -2
  84. package/dist/components/features/settings/TaxonomyEditor.js +1 -1
  85. package/dist/components/features/settings/TaxonomyManager.js +1 -1
  86. package/dist/components/features/settings/TypeManager.js +1 -1
  87. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.d.ts +10 -0
  88. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +175 -0
  89. package/dist/components/features/taskforceAgentAssignments/agentBehaviorCatalogApi.d.ts +27 -0
  90. package/dist/components/features/taskforceAgentAssignments/agentBehaviorCatalogApi.js +24 -0
  91. package/dist/components/features/taskforceAgentEditorModel.d.ts +109 -0
  92. package/dist/components/features/taskforceAgentEditorModel.js +145 -0
  93. package/dist/components/features/useDocumentWorkspaceController.d.ts +20 -1
  94. package/dist/components/features/useDocumentWorkspaceController.js +106 -21
  95. package/dist/components/features/workflowManager/WorkflowManagerModule.d.ts +11 -0
  96. package/dist/components/features/workflowManager/WorkflowManagerModule.js +313 -0
  97. package/dist/components/features/workflowManager/WorkflowPublishDialog.d.ts +11 -0
  98. package/dist/components/features/workflowManager/WorkflowPublishDialog.js +8 -0
  99. package/dist/components/features/workflowManager/types.d.ts +74 -0
  100. package/dist/components/features/workflowManager/types.js +1 -0
  101. package/dist/components/features/workflowManager/useWorkflowManager.d.ts +30 -0
  102. package/dist/components/features/workflowManager/useWorkflowManager.js +213 -0
  103. package/dist/components/features/workflowManager/workflowManagerApi.d.ts +52 -0
  104. package/dist/components/features/workflowManager/workflowManagerApi.js +142 -0
  105. package/dist/components/task/TaskActionHeader.d.ts +6 -3
  106. package/dist/components/task/TaskActionHeader.js +46 -53
  107. package/dist/components/task/TaskCard.d.ts +10 -2
  108. package/dist/components/task/TaskCard.js +103 -54
  109. package/dist/components/task/TaskContextUpload.d.ts +1 -0
  110. package/dist/components/task/TaskContextUpload.js +3 -2
  111. package/dist/components/task/TaskForm.d.ts +12 -17
  112. package/dist/components/task/TaskForm.js +544 -199
  113. package/dist/components/task/TaskImageReviews.d.ts +8 -0
  114. package/dist/components/task/TaskImageReviews.js +47 -0
  115. package/dist/components/task/TaskKanban.d.ts +9 -10
  116. package/dist/components/task/TaskKanban.js +70 -18
  117. package/dist/components/task/TaskList.d.ts +9 -8
  118. package/dist/components/task/TaskList.js +46 -32
  119. package/dist/components/task/TaskReferenceBadge.d.ts +2 -1
  120. package/dist/components/task/TaskReferenceBadge.js +3 -2
  121. package/dist/components/task/TaskStatusActions.d.ts +3 -1
  122. package/dist/components/task/TaskStatusActions.js +17 -6
  123. package/dist/components/task/TaskWorkflowAssignmentField.d.ts +18 -0
  124. package/dist/components/task/TaskWorkflowAssignmentField.js +362 -0
  125. package/dist/components/task/TaskWorkstreamPicker.d.ts +8 -0
  126. package/dist/components/task/TaskWorkstreamPicker.js +24 -0
  127. package/dist/components/task/TrashRestoreControls.d.ts +18 -0
  128. package/dist/components/task/TrashRestoreControls.js +71 -0
  129. package/dist/components/ui/AiIdentityRosterCard.d.ts +20 -0
  130. package/dist/components/ui/AiIdentityRosterCard.js +5 -0
  131. package/dist/components/ui/AssetTraySortControl.d.ts +10 -0
  132. package/dist/components/ui/AssetTraySortControl.js +38 -0
  133. package/dist/components/ui/AssigneeIdentity.d.ts +12 -0
  134. package/dist/components/ui/AssigneeIdentity.js +41 -0
  135. package/dist/components/ui/DiscardChangesDialog.d.ts +10 -0
  136. package/dist/components/ui/DiscardChangesDialog.js +7 -0
  137. package/dist/components/ui/DisclosureSectionHeader.d.ts +4 -1
  138. package/dist/components/ui/DisclosureSectionHeader.js +2 -2
  139. package/dist/components/ui/EditableAvatarButton.d.ts +6 -1
  140. package/dist/components/ui/EditableAvatarButton.js +6 -5
  141. package/dist/components/ui/HierarchyActionBadge.d.ts +2 -1
  142. package/dist/components/ui/HierarchyActionBadge.js +2 -2
  143. package/dist/components/ui/Markdown.d.ts +13 -3
  144. package/dist/components/ui/Markdown.fixture.d.ts +1 -0
  145. package/dist/components/ui/Markdown.fixture.js +23 -0
  146. package/dist/components/ui/Markdown.js +158 -68
  147. package/dist/components/ui/Modal.d.ts +3 -1
  148. package/dist/components/ui/Modal.js +85 -19
  149. package/dist/components/ui/MultiSelectFilter.d.ts +9 -2
  150. package/dist/components/ui/MultiSelectFilter.js +26 -5
  151. package/dist/components/ui/ReferenceBadgeButton.js +2 -3
  152. package/dist/components/ui/TaxonomyDropdown.d.ts +10 -1
  153. package/dist/components/ui/TaxonomyDropdown.js +149 -58
  154. package/dist/components/ui/TopNoticeLayer.d.ts +2 -1
  155. package/dist/components/ui/TopNoticeLayer.js +5 -2
  156. package/dist/components/ui/useFallbackImageUrl.d.ts +4 -0
  157. package/dist/components/ui/useFallbackImageUrl.js +20 -0
  158. package/dist/components/views/AppShellHeader.js +2 -2
  159. package/dist/components/views/StandaloneLayout.d.ts +1 -0
  160. package/dist/components/views/StandaloneLayout.js +1662 -598
  161. package/dist/components/views/WidgetView.d.ts +1 -0
  162. package/dist/components/views/WidgetView.js +95 -30
  163. package/dist/components/views/chrome/WorkspaceChromeSections.d.ts +4 -2
  164. package/dist/components/views/chrome/WorkspaceChromeSections.js +3 -6
  165. package/dist/components/views/chrome/workspaceChrome.d.ts +5 -8
  166. package/dist/components/views/chrome/workspaceChrome.js +62 -27
  167. package/dist/components/views/panels/FilterToolbar.d.ts +4 -3
  168. package/dist/components/views/panels/FilterToolbar.js +8 -5
  169. package/dist/components/views/panels/FilterToolbarControls.d.ts +11 -2
  170. package/dist/components/views/panels/FilterToolbarControls.js +35 -20
  171. package/dist/components/views/panels/PlanningDrawer.d.ts +60 -49
  172. package/dist/components/views/panels/PlanningDrawer.js +978 -313
  173. package/dist/components/views/planningScope.js +7 -1
  174. package/dist/components/views/standalone/modals/AccountSettingsModal.d.ts +62 -0
  175. package/dist/components/views/standalone/modals/AccountSettingsModal.js +197 -0
  176. package/dist/components/views/standalone/modals/AvatarImageManagerModal.d.ts +7 -2
  177. package/dist/components/views/standalone/modals/AvatarImageManagerModal.js +56 -9
  178. package/dist/components/views/standalone/modals/HelpModal.d.ts +1 -2
  179. package/dist/components/views/standalone/modals/HelpModal.js +3 -4
  180. package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +8 -9
  181. package/dist/components/views/standalone/modals/SyncStatusModal.js +85 -25
  182. package/dist/components/views/standalone/modals/TeamManagementModal.js +1 -1
  183. package/dist/config/applicationBaseUrl.d.ts +2 -0
  184. package/dist/config/applicationBaseUrl.js +23 -0
  185. package/dist/config/envSchema.d.ts +1 -1
  186. package/dist/config/envSchema.js +166 -5
  187. package/dist/core/AdminAuditRetentionService.d.ts +43 -0
  188. package/dist/core/AdminAuditRetentionService.js +126 -0
  189. package/dist/core/AiProfileService.d.ts +34 -0
  190. package/dist/core/AiProfileService.js +510 -251
  191. package/dist/core/AttachmentLinkService.d.ts +10 -2
  192. package/dist/core/AttachmentLinkService.js +44 -12
  193. package/dist/core/AuthIdentityService.d.ts +6 -0
  194. package/dist/core/AuthIdentityService.js +38 -0
  195. package/dist/core/AuthTokenService.d.ts +1 -0
  196. package/dist/core/AuthTokenService.js +13 -0
  197. package/dist/core/DeletedTaskLifecycleService.d.ts +4 -2
  198. package/dist/core/DeletedTaskLifecycleService.js +124 -38
  199. package/dist/core/GlobalSettingsService.d.ts +3 -1
  200. package/dist/core/GlobalSettingsService.js +30 -4
  201. package/dist/core/InitiativeDurableMutationService.d.ts +89 -0
  202. package/dist/core/InitiativeDurableMutationService.js +187 -0
  203. package/dist/core/McpTokenService.d.ts +1 -0
  204. package/dist/core/McpTokenService.js +39 -13
  205. package/dist/core/PlanningCommandPreparationService.d.ts +60 -0
  206. package/dist/core/PlanningCommandPreparationService.js +149 -0
  207. package/dist/core/ScheduleCommandService.d.ts +76 -0
  208. package/dist/core/ScheduleCommandService.js +165 -0
  209. package/dist/core/SyncReconciliationService.d.ts +29 -6
  210. package/dist/core/SyncReconciliationService.js +256 -84
  211. package/dist/core/TaskActivityService.d.ts +22 -2
  212. package/dist/core/TaskActivityService.js +177 -29
  213. package/dist/core/TaskAttachmentLinksDurableMutationService.d.ts +31 -0
  214. package/dist/core/TaskAttachmentLinksDurableMutationService.js +231 -0
  215. package/dist/core/TaskChecklistCommandService.d.ts +50 -0
  216. package/dist/core/TaskChecklistCommandService.js +111 -0
  217. package/dist/core/TaskDurableCreateMutationService.d.ts +38 -0
  218. package/dist/core/TaskDurableCreateMutationService.js +85 -0
  219. package/dist/core/TaskDurableDeleteMutationService.d.ts +47 -0
  220. package/dist/core/TaskDurableDeleteMutationService.js +54 -0
  221. package/dist/core/TaskDurableLifecycleMutationService.d.ts +38 -0
  222. package/dist/core/TaskDurableLifecycleMutationService.js +42 -0
  223. package/dist/core/TaskDurableRelationshipMutationService.d.ts +58 -0
  224. package/dist/core/TaskDurableRelationshipMutationService.js +66 -0
  225. package/dist/core/TaskDurableRestoreMutationService.d.ts +31 -0
  226. package/dist/core/TaskDurableRestoreMutationService.js +33 -0
  227. package/dist/core/TaskDurableStatusMutationService.d.ts +74 -0
  228. package/dist/core/TaskDurableStatusMutationService.js +247 -0
  229. package/dist/core/TaskDurableSyncMutationService.d.ts +34 -0
  230. package/dist/core/TaskDurableSyncMutationService.js +70 -0
  231. package/dist/core/TaskDurableWorkflowMutationService.d.ts +48 -0
  232. package/dist/core/TaskDurableWorkflowMutationService.js +59 -0
  233. package/dist/core/TaskLifecycleCommandService.d.ts +101 -0
  234. package/dist/core/TaskLifecycleCommandService.js +161 -0
  235. package/dist/core/TaskRootCommandPreparationService.d.ts +35 -0
  236. package/dist/core/TaskRootCommandPreparationService.js +103 -0
  237. package/dist/core/Taskforce.d.ts +479 -59
  238. package/dist/core/Taskforce.js +3671 -841
  239. package/dist/core/WorkflowAssignmentService.d.ts +40 -0
  240. package/dist/core/WorkflowAssignmentService.js +158 -0
  241. package/dist/core/WorkflowExecutionService.d.ts +69 -0
  242. package/dist/core/WorkflowExecutionService.js +342 -0
  243. package/dist/core/WorkflowTaskActivationService.d.ts +32 -0
  244. package/dist/core/WorkflowTaskActivationService.js +63 -0
  245. package/dist/core/WorkflowTemplateService.d.ts +64 -0
  246. package/dist/core/WorkflowTemplateService.js +223 -0
  247. package/dist/core/WorkspaceLifecycleService.d.ts +1 -0
  248. package/dist/core/WorkspaceLifecycleService.js +18 -0
  249. package/dist/core/WorkstreamDurableMutationService.d.ts +90 -0
  250. package/dist/core/WorkstreamDurableMutationService.js +184 -0
  251. package/dist/core/planningReferencePolicy.d.ts +14 -0
  252. package/dist/core/planningReferencePolicy.js +53 -0
  253. package/dist/core/taskReferencePolicy.js +24 -3
  254. package/dist/core/types.d.ts +10 -10
  255. package/dist/documentReviews/DocumentReviewCommentStore.d.ts +22 -2
  256. package/dist/documentReviews/DocumentReviewCommentStore.js +92 -8
  257. package/dist/documentReviews/commandService.d.ts +51 -0
  258. package/dist/documentReviews/commandService.js +63 -0
  259. package/dist/documentReviews/service.d.ts +20 -1
  260. package/dist/documentReviews/service.js +234 -24
  261. package/dist/documentReviews/types.d.ts +18 -1
  262. package/dist/hooks/sync/bootstrap.d.ts +3 -7
  263. package/dist/hooks/sync/bootstrap.js +6 -14
  264. package/dist/hooks/sync/browserSyncAuthority.d.ts +21 -0
  265. package/dist/hooks/sync/browserSyncAuthority.js +70 -0
  266. package/dist/hooks/sync/browserSyncRemoteServices.d.ts +29 -0
  267. package/dist/hooks/sync/browserSyncRemoteServices.js +58 -0
  268. package/dist/hooks/sync/controlPlane.d.ts +1 -37
  269. package/dist/hooks/sync/controlPlane.js +1 -78
  270. package/dist/hooks/sync/lifecyclePolicy.d.ts +1 -45
  271. package/dist/hooks/sync/lifecyclePolicy.js +1 -93
  272. package/dist/hooks/sync/orchestratorShared.d.ts +9 -3
  273. package/dist/hooks/sync/orchestratorShared.js +70 -96
  274. package/dist/hooks/sync/pullLifecycle.d.ts +1 -31
  275. package/dist/hooks/sync/pullLifecycle.js +1 -24
  276. package/dist/hooks/sync/realtime.d.ts +4 -1
  277. package/dist/hooks/sync/realtime.js +103 -3
  278. package/dist/hooks/sync/recovery.d.ts +1 -84
  279. package/dist/hooks/sync/recovery.js +1 -245
  280. package/dist/hooks/sync/transfers.d.ts +8 -129
  281. package/dist/hooks/sync/transfers.js +19 -581
  282. package/dist/hooks/sync/useDataVersionRefresh.d.ts +6 -1
  283. package/dist/hooks/sync/useDataVersionRefresh.js +127 -12
  284. package/dist/hooks/sync/useDurableLocalOutboxDrain.d.ts +14 -0
  285. package/dist/hooks/sync/useDurableLocalOutboxDrain.js +208 -0
  286. package/dist/hooks/sync/useDurableTaskCreateMutation.d.ts +15 -0
  287. package/dist/hooks/sync/useDurableTaskCreateMutation.js +152 -0
  288. package/dist/hooks/sync/useDurableTaskDeleteMutation.d.ts +11 -0
  289. package/dist/hooks/sync/useDurableTaskDeleteMutation.js +21 -0
  290. package/dist/hooks/sync/useDurableTaskLifecycleMutation.d.ts +12 -0
  291. package/dist/hooks/sync/useDurableTaskLifecycleMutation.js +22 -0
  292. package/dist/hooks/sync/useDurableTaskMetadataMutation.d.ts +14 -0
  293. package/dist/hooks/sync/useDurableTaskMetadataMutation.js +24 -0
  294. package/dist/hooks/sync/useDurableTaskRestoreMutation.d.ts +12 -0
  295. package/dist/hooks/sync/useDurableTaskRestoreMutation.js +24 -0
  296. package/dist/hooks/sync/useDurableTaskStatusMutation.d.ts +18 -0
  297. package/dist/hooks/sync/useDurableTaskStatusMutation.js +23 -0
  298. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +23 -0
  299. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +414 -0
  300. package/dist/hooks/sync/useSyncStatusActions.d.ts +2 -1
  301. package/dist/hooks/sync/useSyncStatusActions.js +8 -3
  302. package/dist/hooks/tasks/taskHttpMutation.d.ts +25 -0
  303. package/dist/hooks/tasks/taskHttpMutation.js +134 -0
  304. package/dist/hooks/tasks/useCurrentTaskRelations.d.ts +6 -1
  305. package/dist/hooks/tasks/useCurrentTaskRelations.js +32 -6
  306. package/dist/hooks/tasks/useTaskEditorNavigation.d.ts +4 -3
  307. package/dist/hooks/tasks/useTaskEditorNavigation.js +9 -13
  308. package/dist/hooks/tasks/useTaskFormActions.d.ts +17 -2
  309. package/dist/hooks/tasks/useTaskFormActions.js +309 -55
  310. package/dist/hooks/tasks/useTaskReferenceContract.d.ts +5 -0
  311. package/dist/hooks/tasks/useTaskReferenceContract.js +17 -0
  312. package/dist/hooks/tasks/useTaskRelationships.d.ts +1 -3
  313. package/dist/hooks/tasks/useTaskRelationships.js +5 -25
  314. package/dist/hooks/tasks/useTrashSelection.d.ts +12 -0
  315. package/dist/hooks/tasks/useTrashSelection.js +49 -0
  316. package/dist/hooks/ui/useInitiativeTemplates.d.ts +24 -0
  317. package/dist/hooks/ui/useInitiativeTemplates.js +22 -0
  318. package/dist/hooks/ui/useSettingsModel.d.ts +5 -29
  319. package/dist/hooks/ui/useSettingsModel.js +31 -15
  320. package/dist/hooks/ui/useSettingsPersistence.d.ts +0 -1
  321. package/dist/hooks/ui/useSettingsPersistence.js +4 -8
  322. package/dist/hooks/ui/useSettingsTaxonomyManagement.js +31 -0
  323. package/dist/hooks/useFilterSort.d.ts +2 -2
  324. package/dist/hooks/useFilterSort.js +19 -15
  325. package/dist/hooks/useRealtimeSync.d.ts +10 -0
  326. package/dist/hooks/useRealtimeSync.js +57 -4
  327. package/dist/hooks/useSyncOrchestrator.d.ts +32 -1
  328. package/dist/hooks/useSyncOrchestrator.js +963 -287
  329. package/dist/hooks/useTaskData.d.ts +11 -2
  330. package/dist/hooks/useTaskData.js +59 -26
  331. package/dist/hooks/useTaskMutations.d.ts +42 -5
  332. package/dist/hooks/useTaskMutations.js +750 -125
  333. package/dist/hooks/useTaskforce.d.ts +114 -118
  334. package/dist/hooks/useTaskforce.js +1102 -449
  335. package/dist/hooks/useUiNotice.d.ts +5 -1
  336. package/dist/hooks/useUiNotice.js +13 -2
  337. package/dist/hooks/useWorkspaceSyncController.d.ts +9 -0
  338. package/dist/hooks/useWorkspaceSyncController.js +159 -17
  339. package/dist/hooks/workspace/usePersistedAppUiState.d.ts +74 -0
  340. package/dist/hooks/workspace/usePersistedAppUiState.js +325 -0
  341. package/dist/hooks/workspace/usePersistedLayoutUiState.d.ts +76 -0
  342. package/dist/hooks/workspace/usePersistedLayoutUiState.js +479 -0
  343. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.d.ts +2 -7
  344. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +42 -31
  345. package/dist/hooks/workspace/workspaceLocalState.d.ts +17 -6
  346. package/dist/hooks/workspace/workspaceLocalState.js +175 -5
  347. package/dist/hooks/workstreams/workstreamHttpMutation.d.ts +23 -0
  348. package/dist/hooks/workstreams/workstreamHttpMutation.js +134 -0
  349. package/dist/localization/locales/en-US.d.ts +3 -3
  350. package/dist/localization/locales/en-US.js +3 -3
  351. package/dist/localization/locales/es-419.js +3 -3
  352. package/dist/localization/locales/pt-BR.js +3 -3
  353. package/dist/mcp/adminWorkspaceRegistrar.js +2 -30
  354. package/dist/mcp/aiProfileBootstrap.d.ts +3 -0
  355. package/dist/mcp/aiProfileBootstrap.js +4 -0
  356. package/dist/mcp/canonicalAssetHelpers.d.ts +16 -4
  357. package/dist/mcp/canonicalAssetHelpers.js +104 -35
  358. package/dist/mcp/clientIntegrations.d.ts +4 -2
  359. package/dist/mcp/clientIntegrations.js +58 -57
  360. package/dist/mcp/clientRegistry.d.ts +30 -0
  361. package/dist/mcp/clientRegistry.js +134 -0
  362. package/dist/mcp/collaborationRegistrar.js +20 -6
  363. package/dist/mcp/documentAssetRegistrar.js +220 -52
  364. package/dist/mcp/documentContentCommand.d.ts +94 -0
  365. package/dist/mcp/documentContentCommand.js +226 -0
  366. package/dist/mcp/documentHelpers.d.ts +13 -65
  367. package/dist/mcp/documentHelpers.js +49 -62
  368. package/dist/mcp/durableTaskMutationRouter.d.ts +65 -0
  369. package/dist/mcp/durableTaskMutationRouter.js +217 -0
  370. package/dist/mcp/durableTaskRelationshipMutationRouter.d.ts +38 -0
  371. package/dist/mcp/durableTaskRelationshipMutationRouter.js +168 -0
  372. package/dist/mcp/durableTaskRootMutationRouter.d.ts +64 -0
  373. package/dist/mcp/durableTaskRootMutationRouter.js +226 -0
  374. package/dist/mcp/gitWorktreeRoots.d.ts +2 -0
  375. package/dist/mcp/gitWorktreeRoots.js +19 -0
  376. package/dist/mcp/legacyServer.d.ts +1 -0
  377. package/dist/mcp/legacyServer.js +42 -0
  378. package/dist/mcp/localCliHealth.d.ts +56 -0
  379. package/dist/mcp/localCliHealth.js +170 -0
  380. package/dist/mcp/localServiceProxy.d.ts +23 -0
  381. package/dist/mcp/localServiceProxy.js +255 -0
  382. package/dist/mcp/mcpInputValidator.d.ts +17 -0
  383. package/dist/mcp/mcpInputValidator.js +58 -0
  384. package/dist/mcp/planningAttachmentCommandAdapter.d.ts +127 -0
  385. package/dist/mcp/planningAttachmentCommandAdapter.js +188 -0
  386. package/dist/mcp/programScaffoldCommandAdapter.d.ts +6 -0
  387. package/dist/mcp/programScaffoldCommandAdapter.js +39 -0
  388. package/dist/mcp/proxyServer.d.ts +1 -0
  389. package/dist/mcp/proxyServer.js +2 -0
  390. package/dist/mcp/runtime.d.ts +82 -1
  391. package/dist/mcp/runtime.js +4285 -1925
  392. package/dist/mcp/server.js +29 -2
  393. package/dist/mcp/sharedLocalServiceGateD.d.ts +115 -0
  394. package/dist/mcp/sharedLocalServiceGateD.js +344 -0
  395. package/dist/mcp/stdioLifecycle.d.ts +22 -0
  396. package/dist/mcp/stdioLifecycle.js +54 -0
  397. package/dist/mcp/taskAttachmentCommandAdapter.d.ts +190 -0
  398. package/dist/mcp/taskAttachmentCommandAdapter.js +464 -0
  399. package/dist/mcp/taskAttachmentHelpers.d.ts +8 -6
  400. package/dist/mcp/taskAttachmentHelpers.js +74 -2
  401. package/dist/mcp/taskAttachmentTypes.d.ts +26 -5
  402. package/dist/mcp/taskPlanCommand.d.ts +64 -0
  403. package/dist/mcp/taskPlanCommand.js +98 -0
  404. package/dist/mcp/taskPlanningRegistrar.js +215 -27
  405. package/dist/mcp/toolCallCompatibility.d.ts +6 -0
  406. package/dist/mcp/toolCallCompatibility.js +16 -0
  407. package/dist/mcp/toolCatalog.d.ts +3 -1
  408. package/dist/mcp/toolProfiles.d.ts +12 -1
  409. package/dist/mcp/toolProfiles.js +43 -0
  410. package/dist/mcp/toolRegistry.d.ts +17 -2
  411. package/dist/mcp/toolRegistry.js +24 -9
  412. package/dist/mcp/workflowExecutionRegistrar.d.ts +2 -0
  413. package/dist/mcp/workflowExecutionRegistrar.js +51 -0
  414. package/dist/migrations/taskSchemaMigrations.d.ts +35 -0
  415. package/dist/migrations/taskSchemaMigrations.js +1797 -4
  416. package/dist/migrations/taskUpdatedAtSyncDriftMigration.d.ts +20 -0
  417. package/dist/migrations/taskUpdatedAtSyncDriftMigration.js +153 -0
  418. package/dist/migrations/taskforceAgentDefinitionMigration.d.ts +26 -0
  419. package/dist/migrations/taskforceAgentDefinitionMigration.js +116 -0
  420. package/dist/plugins/vite.js +48 -17
  421. package/dist/public/Taskforce_Van.webp +0 -0
  422. package/dist/runtime/appGateDefinitions.d.ts +16 -10
  423. package/dist/runtime/appGateDefinitions.js +16 -10
  424. package/dist/runtime/appGates.d.ts +5 -4
  425. package/dist/runtime/appGates.js +4 -3
  426. package/dist/server/aiProfileAvatarAssets.d.ts +11 -8
  427. package/dist/server/aiProfileAvatarAssets.js +159 -70
  428. package/dist/server/auth.js +15 -1
  429. package/dist/server/cors.d.ts +2 -1
  430. package/dist/server/cors.js +45 -8
  431. package/dist/server/email.d.ts +3 -1
  432. package/dist/server/email.js +46 -8
  433. package/dist/server/index.d.ts +24 -1
  434. package/dist/server/index.js +342 -46
  435. package/dist/server/localDataOwnerPermit.d.ts +18 -0
  436. package/dist/server/localDataOwnerPermit.js +58 -0
  437. package/dist/server/localDatabaseIdentity.d.ts +14 -0
  438. package/dist/server/localDatabaseIdentity.js +69 -0
  439. package/dist/server/localRealtimeFileInvalidation.d.ts +1 -0
  440. package/dist/server/localRealtimeFileInvalidation.js +7 -0
  441. package/dist/server/localServiceLease.d.ts +62 -0
  442. package/dist/server/localServiceLease.js +477 -0
  443. package/dist/server/localServiceOwnershipBootstrap.d.ts +19 -0
  444. package/dist/server/localServiceOwnershipBootstrap.js +84 -0
  445. package/dist/server/localServiceSessions.d.ts +87 -0
  446. package/dist/server/localServiceSessions.js +309 -0
  447. package/dist/server/localServiceWindowsAcl.d.ts +8 -0
  448. package/dist/server/localServiceWindowsAcl.js +60 -0
  449. package/dist/server/localSyncProcessLockBootstrap.d.ts +3 -0
  450. package/dist/server/localSyncProcessLockBootstrap.js +16 -0
  451. package/dist/server/localWorkspaceSyncServerComposition.d.ts +59 -0
  452. package/dist/server/localWorkspaceSyncServerComposition.js +91 -0
  453. package/dist/server/localWorkspaceSyncServerRuntime.d.ts +119 -0
  454. package/dist/server/localWorkspaceSyncServerRuntime.js +1163 -0
  455. package/dist/server/rateLimit.d.ts +1 -0
  456. package/dist/server/rateLimit.js +16 -0
  457. package/dist/server/routes/admin.d.ts +2 -4
  458. package/dist/server/routes/admin.js +199 -337
  459. package/dist/server/routes/agentRoles.d.ts +13 -0
  460. package/dist/server/routes/agentRoles.js +273 -0
  461. package/dist/server/routes/agentSkills.d.ts +16 -0
  462. package/dist/server/routes/agentSkills.js +291 -0
  463. package/dist/server/routes/agents.d.ts +49 -0
  464. package/dist/server/routes/agents.js +1455 -0
  465. package/dist/server/routes/annotatedAttachments.js +46 -9
  466. package/dist/server/routes/assetAccess.d.ts +36 -0
  467. package/dist/server/routes/assetAccess.js +93 -0
  468. package/dist/server/routes/auth.d.ts +4 -3
  469. package/dist/server/routes/auth.js +236 -21
  470. package/dist/server/routes/authSupport.d.ts +3 -1
  471. package/dist/server/routes/authSupport.js +22 -8
  472. package/dist/server/routes/documentReviews.d.ts +2 -0
  473. package/dist/server/routes/documentReviews.js +155 -15
  474. package/dist/server/routes/documents.d.ts +1 -0
  475. package/dist/server/routes/documents.js +335 -141
  476. package/dist/server/routes/durableTaskHttpRouters.d.ts +165 -0
  477. package/dist/server/routes/durableTaskHttpRouters.js +89 -0
  478. package/dist/server/routes/localMcpHealth.d.ts +11 -0
  479. package/dist/server/routes/localMcpHealth.js +29 -0
  480. package/dist/server/routes/localService.d.ts +13 -0
  481. package/dist/server/routes/localService.js +444 -0
  482. package/dist/server/routes/localUpdate.d.ts +11 -0
  483. package/dist/server/routes/localUpdate.js +154 -0
  484. package/dist/server/routes/primitives.d.ts +27 -0
  485. package/dist/server/routes/primitives.js +18 -0
  486. package/dist/server/routes/resources.d.ts +1 -10
  487. package/dist/server/routes/resources.js +1 -153
  488. package/dist/server/routes/shared.d.ts +31 -2
  489. package/dist/server/routes/shared.js +394 -0
  490. package/dist/server/routes/sync.d.ts +2 -0
  491. package/dist/server/routes/sync.js +184 -272
  492. package/dist/server/routes/syncAuxRoutes.d.ts +3 -1
  493. package/dist/server/routes/syncAuxRoutes.js +9 -4
  494. package/dist/server/routes/syncCoordinatorLocalRoutes.d.ts +6 -0
  495. package/dist/server/routes/syncCoordinatorLocalRoutes.js +867 -0
  496. package/dist/server/routes/syncPullApplyRoutes.d.ts +29 -1
  497. package/dist/server/routes/syncPullApplyRoutes.js +520 -17
  498. package/dist/server/routes/syncPushRoutes.d.ts +33 -4
  499. package/dist/server/routes/syncPushRoutes.js +251 -62
  500. package/dist/server/routes/syncRouteTypes.d.ts +1 -1
  501. package/dist/server/routes/syncSnapshotRoutes.d.ts +15 -7
  502. package/dist/server/routes/syncSnapshotRoutes.js +95 -17
  503. package/dist/server/routes/syncV3DiagnosticsRoutes.d.ts +14 -0
  504. package/dist/server/routes/syncV3DiagnosticsRoutes.js +72 -0
  505. package/dist/server/routes/syncV3FeedRoutes.d.ts +20 -0
  506. package/dist/server/routes/syncV3FeedRoutes.js +462 -0
  507. package/dist/server/routes/syncV3LocalCaptureRoutes.d.ts +37 -0
  508. package/dist/server/routes/syncV3LocalCaptureRoutes.js +897 -0
  509. package/dist/server/routes/syncV3LocalDispatchRoutes.d.ts +17 -0
  510. package/dist/server/routes/syncV3LocalDispatchRoutes.js +280 -0
  511. package/dist/server/routes/syncV3LocalFeedApplyRoutes.d.ts +17 -0
  512. package/dist/server/routes/syncV3LocalFeedApplyRoutes.js +493 -0
  513. package/dist/server/routes/syncV3LocalOwnershipRoutes.d.ts +10 -0
  514. package/dist/server/routes/syncV3LocalOwnershipRoutes.js +51 -0
  515. package/dist/server/routes/syncV3LocalRecoveryRoutes.d.ts +12 -0
  516. package/dist/server/routes/syncV3LocalRecoveryRoutes.js +78 -0
  517. package/dist/server/routes/syncV3OperationRoutes.d.ts +35 -0
  518. package/dist/server/routes/syncV3OperationRoutes.js +1136 -0
  519. package/dist/server/routes/tasks.d.ts +0 -2
  520. package/dist/server/routes/tasks.js +932 -195
  521. package/dist/server/routes/workflows.d.ts +26 -0
  522. package/dist/server/routes/workflows.js +500 -0
  523. package/dist/server/routes.d.ts +1 -6
  524. package/dist/server/routes.js +148 -339
  525. package/dist/server/smtpTransport.d.ts +11 -3
  526. package/dist/server/smtpTransport.js +9 -2
  527. package/dist/server/start.js +42 -10
  528. package/dist/service/localServiceCli.d.ts +33 -0
  529. package/dist/service/localServiceCli.js +365 -0
  530. package/dist/service/localServiceClientLifecycle.d.ts +25 -0
  531. package/dist/service/localServiceClientLifecycle.js +128 -0
  532. package/dist/service/localServiceOpen.d.ts +17 -0
  533. package/dist/service/localServiceOpen.js +27 -0
  534. package/dist/services/agentRoleResolver.d.ts +4 -0
  535. package/dist/services/agentRoleResolver.js +7 -0
  536. package/dist/services/aiProfileAvatarGenerationService.d.ts +41 -0
  537. package/dist/services/aiProfileAvatarGenerationService.js +158 -0
  538. package/dist/services/avatarImageProvider.d.ts +33 -0
  539. package/dist/services/avatarImageProvider.js +140 -0
  540. package/dist/services/bedrockAnthropicMessagesModelGateway.d.ts +24 -0
  541. package/dist/services/bedrockAnthropicMessagesModelGateway.js +95 -0
  542. package/dist/services/bedrockMantleModelGateway.d.ts +43 -0
  543. package/dist/services/bedrockMantleModelGateway.js +81 -0
  544. package/dist/services/bedrockModelGateway.d.ts +26 -0
  545. package/dist/services/bedrockModelGateway.js +94 -0
  546. package/dist/services/modelGateway.d.ts +82 -0
  547. package/dist/services/modelGateway.js +61 -0
  548. package/dist/services/taskforceAgentAvatarImageProvider.d.ts +8 -0
  549. package/dist/services/taskforceAgentAvatarImageProvider.js +24 -0
  550. package/dist/services/taskforceAgentMcpBridge.d.ts +77 -0
  551. package/dist/services/taskforceAgentMcpBridge.js +527 -0
  552. package/dist/shared/agentRoleDefinition.d.ts +34 -0
  553. package/dist/shared/agentRoleDefinition.js +207 -0
  554. package/dist/shared/aiProfileAvatarEligibility.d.ts +10 -0
  555. package/dist/shared/aiProfileAvatarEligibility.js +27 -0
  556. package/dist/shared/aiProfileColors.d.ts +7 -0
  557. package/dist/shared/aiProfileColors.js +33 -0
  558. package/dist/shared/colorPalette.d.ts +3 -0
  559. package/dist/shared/colorPalette.js +20 -0
  560. package/dist/shared/commentProvenance.d.ts +4 -0
  561. package/dist/shared/commentProvenance.js +6 -0
  562. package/dist/shared/deletedTaskRetention.d.ts +2 -0
  563. package/dist/shared/deletedTaskRetention.js +7 -0
  564. package/dist/shared/passwordPolicy.d.ts +2 -1
  565. package/dist/shared/passwordPolicy.js +9 -0
  566. package/dist/shared/taskDeepLinks.d.ts +28 -0
  567. package/dist/shared/taskDeepLinks.js +48 -0
  568. package/dist/shared/taskRestoreDestination.d.ts +2 -0
  569. package/dist/shared/taskRestoreDestination.js +5 -0
  570. package/dist/shared/taskforceAgentDefinition.d.ts +88 -0
  571. package/dist/shared/taskforceAgentDefinition.js +434 -0
  572. package/dist/shared/taskforceAgentExecutionSnapshot.d.ts +50 -0
  573. package/dist/shared/taskforceAgentExecutionSnapshot.js +68 -0
  574. package/dist/shared/taskforceAgentModels.d.ts +56 -0
  575. package/dist/shared/taskforceAgentModels.js +314 -0
  576. package/dist/shared/taskforceAgentRunContext.d.ts +23 -0
  577. package/dist/shared/taskforceAgentRunContext.js +21 -0
  578. package/dist/shared/taskforceAgentRuntimeResolution.d.ts +31 -0
  579. package/dist/shared/taskforceAgentRuntimeResolution.js +72 -0
  580. package/dist/shared/taskforceAgentSkill.d.ts +33 -0
  581. package/dist/shared/taskforceAgentSkill.js +149 -0
  582. package/dist/storage/agentRoleStore.d.ts +91 -0
  583. package/dist/storage/agentRoleStore.js +385 -0
  584. package/dist/storage/databaseAdapter.d.ts +1 -0
  585. package/dist/storage/databaseAdapter.js +7 -1
  586. package/dist/storage/documentIntegrity.d.ts +12 -3
  587. package/dist/storage/documentIntegrity.js +105 -27
  588. package/dist/storage/objectStorageClient.d.ts +10 -4
  589. package/dist/storage/objectStorageClient.js +73 -43
  590. package/dist/storage/postgresAdapter.d.ts +2 -1
  591. package/dist/storage/postgresAdapter.js +38 -6
  592. package/dist/storage/postgresWorker.js +65 -1
  593. package/dist/storage/sqliteAdapter.d.ts +1 -1
  594. package/dist/storage/sqliteAdapter.js +7 -1
  595. package/dist/storage/sqliteWalHealth.d.ts +71 -0
  596. package/dist/storage/sqliteWalHealth.js +176 -0
  597. package/dist/storage/taskDataPath.d.ts +1 -0
  598. package/dist/storage/taskDataPath.js +20 -0
  599. package/dist/storage/taskforceAgentConversationStore.d.ts +66 -0
  600. package/dist/storage/taskforceAgentConversationStore.js +264 -0
  601. package/dist/storage/taskforceAgentSkillStore.d.ts +93 -0
  602. package/dist/storage/taskforceAgentSkillStore.js +355 -0
  603. package/dist/storage/taskforceAgentStore.d.ts +105 -0
  604. package/dist/storage/taskforceAgentStore.js +549 -0
  605. package/dist/storage/workflowStore.d.ts +223 -0
  606. package/dist/storage/workflowStore.js +1032 -0
  607. package/dist/storage/workspaceAssetStore.d.ts +70 -0
  608. package/dist/storage/workspaceAssetStore.js +418 -25
  609. package/dist/sync/aiProfileAvatarSyncPaths.d.ts +14 -0
  610. package/dist/sync/aiProfileAvatarSyncPaths.js +56 -0
  611. package/dist/sync/cloudSyncApi.d.ts +329 -0
  612. package/dist/sync/cloudSyncApi.js +574 -1
  613. package/dist/sync/collaborationSyncPayload.d.ts +5 -1
  614. package/dist/sync/collaborationSyncPayload.js +213 -1
  615. package/dist/sync/collaborationSyncState.d.ts +23 -3
  616. package/dist/sync/collaborationSyncState.js +92 -3
  617. package/dist/sync/contentSyncPayload.d.ts +9 -0
  618. package/dist/sync/contentSyncPayload.js +29 -0
  619. package/dist/sync/contentSyncState.d.ts +79 -4
  620. package/dist/sync/contentSyncState.js +1113 -313
  621. package/dist/sync/coordinator/localSyncBrowserApplyPermitContext.d.ts +39 -0
  622. package/dist/sync/coordinator/localSyncBrowserApplyPermitContext.js +234 -0
  623. package/dist/sync/coordinator/localSyncBrowserAuthorityCapability.d.ts +7 -0
  624. package/dist/sync/coordinator/localSyncBrowserAuthorityCapability.js +10 -0
  625. package/dist/sync/coordinator/localSyncCommittedApplyPolicy.d.ts +7 -0
  626. package/dist/sync/coordinator/localSyncCommittedApplyPolicy.js +41 -0
  627. package/dist/sync/coordinator/localSyncCoordinatorBrowserClient.d.ts +178 -0
  628. package/dist/sync/coordinator/localSyncCoordinatorBrowserClient.js +131 -0
  629. package/dist/sync/coordinator/localSyncCoordinatorCommandLifecycle.d.ts +25 -0
  630. package/dist/sync/coordinator/localSyncCoordinatorCommandLifecycle.js +200 -0
  631. package/dist/sync/coordinator/localSyncCoordinatorHost.d.ts +84 -0
  632. package/dist/sync/coordinator/localSyncCoordinatorHost.js +435 -0
  633. package/dist/sync/coordinator/localSyncCoordinatorRouteServices.d.ts +33 -0
  634. package/dist/sync/coordinator/localSyncCoordinatorRouteServices.js +1 -0
  635. package/dist/sync/coordinator/localSyncCoordinatorStore.d.ts +122 -0
  636. package/dist/sync/coordinator/localSyncCoordinatorStore.js +1039 -0
  637. package/dist/sync/coordinator/localSyncCoordinatorTypes.d.ts +82 -0
  638. package/dist/sync/coordinator/localSyncCoordinatorTypes.js +9 -0
  639. package/dist/sync/coordinator/localSyncDispatchTracker.d.ts +15 -0
  640. package/dist/sync/coordinator/localSyncDispatchTracker.js +68 -0
  641. package/dist/sync/coordinator/localSyncExecutionPermitStore.d.ts +200 -0
  642. package/dist/sync/coordinator/localSyncExecutionPermitStore.js +1388 -0
  643. package/dist/sync/coordinator/localSyncExecutionPermitTypes.d.ts +52 -0
  644. package/dist/sync/coordinator/localSyncExecutionPermitTypes.js +8 -0
  645. package/dist/sync/coordinator/localSyncOwnershipDrainBarrier.d.ts +33 -0
  646. package/dist/sync/coordinator/localSyncOwnershipDrainBarrier.js +83 -0
  647. package/dist/sync/coordinator/localSyncPermitTransactionHooks.d.ts +9 -0
  648. package/dist/sync/coordinator/localSyncPermitTransactionHooks.js +27 -0
  649. package/dist/sync/coordinator/localSyncProcessLock.d.ts +12 -0
  650. package/dist/sync/coordinator/localSyncProcessLock.js +212 -0
  651. package/dist/sync/coordinator/localSyncV3DispatchRecoveryReconciler.d.ts +17 -0
  652. package/dist/sync/coordinator/localSyncV3DispatchRecoveryReconciler.js +82 -0
  653. package/dist/sync/coordinator/localWorkspaceSyncRunner.d.ts +134 -0
  654. package/dist/sync/coordinator/localWorkspaceSyncRunner.js +981 -0
  655. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +189 -0
  656. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +961 -0
  657. package/dist/sync/coordinator/workspaceSyncCloudCredentialValidator.d.ts +19 -0
  658. package/dist/sync/coordinator/workspaceSyncCloudCredentialValidator.js +83 -0
  659. package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +117 -0
  660. package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +323 -0
  661. package/dist/sync/coordinator/workspaceSyncLocalAccessBootstrap.d.ts +11 -0
  662. package/dist/sync/coordinator/workspaceSyncLocalAccessBootstrap.js +51 -0
  663. package/dist/sync/coordinator/workspaceSyncTransportGateway.d.ts +139 -0
  664. package/dist/sync/coordinator/workspaceSyncTransportGateway.js +738 -0
  665. package/dist/sync/engine/localWorkspaceContentManifestService.d.ts +21 -0
  666. package/dist/sync/engine/localWorkspaceContentManifestService.js +44 -0
  667. package/dist/sync/engine/workspaceSyncAtomicLocalPublisher.d.ts +36 -0
  668. package/dist/sync/engine/workspaceSyncAtomicLocalPublisher.js +203 -0
  669. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +21 -0
  670. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.js +13 -0
  671. package/dist/sync/engine/workspaceSyncContentPullObligationStore.d.ts +65 -0
  672. package/dist/sync/engine/workspaceSyncContentPullObligationStore.js +160 -0
  673. package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +216 -0
  674. package/dist/sync/engine/workspaceSyncContentVersionStore.js +1068 -0
  675. package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.d.ts +28 -0
  676. package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.js +543 -0
  677. package/dist/sync/engine/workspaceSyncEngineContracts.d.ts +78 -0
  678. package/dist/sync/engine/workspaceSyncEngineContracts.js +1 -0
  679. package/dist/sync/engine/workspaceSyncEngineControlPlane.d.ts +37 -0
  680. package/dist/sync/engine/workspaceSyncEngineControlPlane.js +79 -0
  681. package/dist/sync/engine/workspaceSyncEngineIdentity.d.ts +1 -0
  682. package/dist/sync/engine/workspaceSyncEngineIdentity.js +4 -0
  683. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.d.ts +68 -0
  684. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +180 -0
  685. package/dist/sync/engine/workspaceSyncEngineLocalApply.d.ts +72 -0
  686. package/dist/sync/engine/workspaceSyncEngineLocalApply.js +132 -0
  687. package/dist/sync/engine/workspaceSyncEngineLocalServices.d.ts +70 -0
  688. package/dist/sync/engine/workspaceSyncEngineLocalServices.js +25 -0
  689. package/dist/sync/engine/workspaceSyncEngineParity.d.ts +8 -0
  690. package/dist/sync/engine/workspaceSyncEngineParity.js +7 -0
  691. package/dist/sync/engine/workspaceSyncEnginePullPolicy.d.ts +32 -0
  692. package/dist/sync/engine/workspaceSyncEnginePullPolicy.js +27 -0
  693. package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +20 -0
  694. package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +87 -0
  695. package/dist/sync/engine/workspaceSyncEngineRecovery.d.ts +56 -0
  696. package/dist/sync/engine/workspaceSyncEngineRecovery.js +288 -0
  697. package/dist/sync/engine/workspaceSyncEngineRemoteServices.d.ts +104 -0
  698. package/dist/sync/engine/workspaceSyncEngineRemoteServices.js +21 -0
  699. package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +61 -0
  700. package/dist/sync/engine/workspaceSyncEngineRuntime.js +59 -0
  701. package/dist/sync/engine/workspaceSyncEngineServerApplyBoundary.d.ts +28 -0
  702. package/dist/sync/engine/workspaceSyncEngineServerApplyBoundary.js +86 -0
  703. package/dist/sync/engine/workspaceSyncEngineServerLocalServices.d.ts +73 -0
  704. package/dist/sync/engine/workspaceSyncEngineServerLocalServices.js +452 -0
  705. package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.d.ts +23 -0
  706. package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.js +451 -0
  707. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.d.ts +125 -0
  708. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +1124 -0
  709. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.d.ts +63 -0
  710. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +276 -0
  711. package/dist/sync/engine/workspaceSyncEngineTransferCompletion.d.ts +20 -0
  712. package/dist/sync/engine/workspaceSyncEngineTransferCompletion.js +37 -0
  713. package/dist/sync/engine/workspaceSyncEngineTransferTypes.d.ts +7 -0
  714. package/dist/sync/engine/workspaceSyncEngineTransferTypes.js +1 -0
  715. package/dist/sync/engine/workspaceSyncEngineTransfers.d.ts +240 -0
  716. package/dist/sync/engine/workspaceSyncEngineTransfers.js +1184 -0
  717. package/dist/sync/engine/workspaceSyncEngineV3LocalFeedApply.d.ts +39 -0
  718. package/dist/sync/engine/workspaceSyncEngineV3LocalFeedApply.js +39 -0
  719. package/dist/sync/engine/workspaceSyncImmutableContentGcRunner.d.ts +25 -0
  720. package/dist/sync/engine/workspaceSyncImmutableContentGcRunner.js +83 -0
  721. package/dist/sync/engine/workspaceSyncImmutableContentProvider.d.ts +71 -0
  722. package/dist/sync/engine/workspaceSyncImmutableContentProvider.js +209 -0
  723. package/dist/sync/engine/workspaceSyncImmutableContentStager.d.ts +32 -0
  724. package/dist/sync/engine/workspaceSyncImmutableContentStager.js +202 -0
  725. package/dist/sync/engine/workspaceSyncPublishedContentResolver.d.ts +43 -0
  726. package/dist/sync/engine/workspaceSyncPublishedContentResolver.js +142 -0
  727. package/dist/sync/engine/workspaceSyncServerContentRuntime.d.ts +26 -0
  728. package/dist/sync/engine/workspaceSyncServerContentRuntime.js +41 -0
  729. package/dist/sync/engine/workspaceSyncServerDataServices.d.ts +44 -0
  730. package/dist/sync/engine/workspaceSyncServerDataServices.js +143 -0
  731. package/dist/sync/engine/workspaceSyncTransferEvidence.d.ts +39 -0
  732. package/dist/sync/engine/workspaceSyncTransferEvidence.js +45 -0
  733. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +44 -0
  734. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +990 -0
  735. package/dist/sync/engine/workspaceSyncV2PreparedContent.d.ts +82 -0
  736. package/dist/sync/engine/workspaceSyncV2PreparedContent.js +219 -0
  737. package/dist/sync/planningCanonicalFields.d.ts +41 -0
  738. package/dist/sync/planningCanonicalFields.js +211 -0
  739. package/dist/sync/planningSyncPayload.d.ts +5 -1
  740. package/dist/sync/planningSyncPayload.js +88 -4
  741. package/dist/sync/syncApplyHandlers.d.ts +98 -8
  742. package/dist/sync/syncApplyHandlers.js +816 -78
  743. package/dist/sync/syncResourceAdapters.d.ts +10 -0
  744. package/dist/sync/syncResourceAdapters.js +21 -1
  745. package/dist/sync/syncService.d.ts +57 -1
  746. package/dist/sync/syncService.js +1085 -138
  747. package/dist/sync/taskNestedContent.d.ts +2 -0
  748. package/dist/sync/taskNestedContent.js +8 -0
  749. package/dist/sync/taskSyncChangeKey.js +0 -1
  750. package/dist/sync/taskSyncPayload.d.ts +0 -1
  751. package/dist/sync/taskSyncPayload.js +14 -3
  752. package/dist/sync/v3/canonicalWorkspaceSyncJson.d.ts +2 -0
  753. package/dist/sync/v3/canonicalWorkspaceSyncJson.js +26 -0
  754. package/dist/sync/v3/combinedFeedCapability.d.ts +21 -0
  755. package/dist/sync/v3/combinedFeedCapability.js +80 -0
  756. package/dist/sync/v3/combinedFeedPrerequisites.d.ts +18 -0
  757. package/dist/sync/v3/combinedFeedPrerequisites.js +184 -0
  758. package/dist/sync/v3/durableInitiativeMutationRouter.d.ts +61 -0
  759. package/dist/sync/v3/durableInitiativeMutationRouter.js +287 -0
  760. package/dist/sync/v3/durableOperationReplay.d.ts +36 -0
  761. package/dist/sync/v3/durableOperationReplay.js +103 -0
  762. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.d.ts +49 -0
  763. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +198 -0
  764. package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +47 -0
  765. package/dist/sync/v3/durableTaskChecklistMutationRouter.js +182 -0
  766. package/dist/sync/v3/durableTaskCommentMutationRouter.d.ts +47 -0
  767. package/dist/sync/v3/durableTaskCommentMutationRouter.js +191 -0
  768. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.d.ts +60 -0
  769. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.js +320 -0
  770. package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +40 -0
  771. package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +518 -0
  772. package/dist/sync/v3/durableTaxonomyMutationRouter.d.ts +63 -0
  773. package/dist/sync/v3/durableTaxonomyMutationRouter.js +289 -0
  774. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +77 -0
  775. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +361 -0
  776. package/dist/sync/v3/durableWorkstreamMutationRouter.d.ts +61 -0
  777. package/dist/sync/v3/durableWorkstreamMutationRouter.js +287 -0
  778. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.d.ts +42 -0
  779. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +122 -0
  780. package/dist/sync/v3/entityEventLegacyAdoptionContract.d.ts +6 -0
  781. package/dist/sync/v3/entityEventLegacyAdoptionContract.js +6 -0
  782. package/dist/sync/v3/entityEventLegacyAdoptionService.d.ts +62 -0
  783. package/dist/sync/v3/entityEventLegacyAdoptionService.js +180 -0
  784. package/dist/sync/v3/initiativeActivityAuthoritativeRevision.d.ts +11 -0
  785. package/dist/sync/v3/initiativeActivityAuthoritativeRevision.js +23 -0
  786. package/dist/sync/v3/initiativeActivityIdentity.d.ts +8 -0
  787. package/dist/sync/v3/initiativeActivityIdentity.js +14 -0
  788. package/dist/sync/v3/initiativeCoexistence.d.ts +26 -0
  789. package/dist/sync/v3/initiativeCoexistence.js +148 -0
  790. package/dist/sync/v3/initiativeFeedActivationCapability.d.ts +6 -0
  791. package/dist/sync/v3/initiativeFeedActivationCapability.js +16 -0
  792. package/dist/sync/v3/initiativeMutationPayload.d.ts +26 -0
  793. package/dist/sync/v3/initiativeMutationPayload.js +144 -0
  794. package/dist/sync/v3/initiativeMutationService.d.ts +62 -0
  795. package/dist/sync/v3/initiativeMutationService.js +206 -0
  796. package/dist/sync/v3/localEntityEventLegacyAdoption.d.ts +31 -0
  797. package/dist/sync/v3/localEntityEventLegacyAdoption.js +607 -0
  798. package/dist/sync/v3/localInitiativeOutboxHandler.d.ts +8 -0
  799. package/dist/sync/v3/localInitiativeOutboxHandler.js +88 -0
  800. package/dist/sync/v3/localInitiativeOutboxService.d.ts +50 -0
  801. package/dist/sync/v3/localInitiativeOutboxService.js +495 -0
  802. package/dist/sync/v3/localOperationIdentityStore.d.ts +81 -0
  803. package/dist/sync/v3/localOperationIdentityStore.js +388 -0
  804. package/dist/sync/v3/localOutboxDispatchCapability.d.ts +7 -0
  805. package/dist/sync/v3/localOutboxDispatchCapability.js +13 -0
  806. package/dist/sync/v3/localOutboxDispatchRuntime.d.ts +16 -0
  807. package/dist/sync/v3/localOutboxDispatchRuntime.js +269 -0
  808. package/dist/sync/v3/localOutboxDispatcher.d.ts +53 -0
  809. package/dist/sync/v3/localOutboxDispatcher.js +362 -0
  810. package/dist/sync/v3/localOutboxDrainClient.d.ts +50 -0
  811. package/dist/sync/v3/localOutboxDrainClient.js +250 -0
  812. package/dist/sync/v3/localOutboxOperationHandler.d.ts +31 -0
  813. package/dist/sync/v3/localOutboxOperationHandler.js +10 -0
  814. package/dist/sync/v3/localOutboxRecoveryClient.d.ts +14 -0
  815. package/dist/sync/v3/localOutboxRecoveryClient.js +45 -0
  816. package/dist/sync/v3/localOutboxRecoveryPreparationService.d.ts +12 -0
  817. package/dist/sync/v3/localOutboxRecoveryPreparationService.js +151 -0
  818. package/dist/sync/v3/localSyncIdentityStore.d.ts +9 -0
  819. package/dist/sync/v3/localSyncIdentityStore.js +43 -0
  820. package/dist/sync/v3/localTaskAttachmentLinksOutboxHandler.d.ts +10 -0
  821. package/dist/sync/v3/localTaskAttachmentLinksOutboxHandler.js +70 -0
  822. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.d.ts +45 -0
  823. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.js +291 -0
  824. package/dist/sync/v3/localTaskChecklistOutboxHandler.d.ts +10 -0
  825. package/dist/sync/v3/localTaskChecklistOutboxHandler.js +54 -0
  826. package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +47 -0
  827. package/dist/sync/v3/localTaskChecklistOutboxService.js +221 -0
  828. package/dist/sync/v3/localTaskCommentOutboxHandler.d.ts +10 -0
  829. package/dist/sync/v3/localTaskCommentOutboxHandler.js +94 -0
  830. package/dist/sync/v3/localTaskCommentOutboxService.d.ts +75 -0
  831. package/dist/sync/v3/localTaskCommentOutboxService.js +391 -0
  832. package/dist/sync/v3/localTaskCreateClient.d.ts +27 -0
  833. package/dist/sync/v3/localTaskCreateClient.js +209 -0
  834. package/dist/sync/v3/localTaskCreateOutboxHandler.d.ts +8 -0
  835. package/dist/sync/v3/localTaskCreateOutboxHandler.js +147 -0
  836. package/dist/sync/v3/localTaskCreateOutboxService.d.ts +77 -0
  837. package/dist/sync/v3/localTaskCreateOutboxService.js +397 -0
  838. package/dist/sync/v3/localTaskDeleteClient.d.ts +10 -0
  839. package/dist/sync/v3/localTaskDeleteClient.js +23 -0
  840. package/dist/sync/v3/localTaskDeleteOutboxHandler.d.ts +8 -0
  841. package/dist/sync/v3/localTaskDeleteOutboxHandler.js +54 -0
  842. package/dist/sync/v3/localTaskDeleteOutboxService.d.ts +38 -0
  843. package/dist/sync/v3/localTaskDeleteOutboxService.js +235 -0
  844. package/dist/sync/v3/localTaskLegacyRootAdoption.d.ts +28 -0
  845. package/dist/sync/v3/localTaskLegacyRootAdoption.js +219 -0
  846. package/dist/sync/v3/localTaskLifecycleClient.d.ts +49 -0
  847. package/dist/sync/v3/localTaskLifecycleClient.js +57 -0
  848. package/dist/sync/v3/localTaskLifecycleOutboxHandler.d.ts +8 -0
  849. package/dist/sync/v3/localTaskLifecycleOutboxHandler.js +94 -0
  850. package/dist/sync/v3/localTaskLifecycleOutboxService.d.ts +60 -0
  851. package/dist/sync/v3/localTaskLifecycleOutboxService.js +304 -0
  852. package/dist/sync/v3/localTaskMetadataClient.d.ts +13 -0
  853. package/dist/sync/v3/localTaskMetadataClient.js +30 -0
  854. package/dist/sync/v3/localTaskMetadataOutboxHandler.d.ts +8 -0
  855. package/dist/sync/v3/localTaskMetadataOutboxHandler.js +70 -0
  856. package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +48 -0
  857. package/dist/sync/v3/localTaskMetadataOutboxService.js +229 -0
  858. package/dist/sync/v3/localTaskOperationClient.d.ts +72 -0
  859. package/dist/sync/v3/localTaskOperationClient.js +195 -0
  860. package/dist/sync/v3/localTaskRelationshipOutboxHandler.d.ts +8 -0
  861. package/dist/sync/v3/localTaskRelationshipOutboxHandler.js +114 -0
  862. package/dist/sync/v3/localTaskRelationshipOutboxService.d.ts +45 -0
  863. package/dist/sync/v3/localTaskRelationshipOutboxService.js +192 -0
  864. package/dist/sync/v3/localTaskRestoreClient.d.ts +13 -0
  865. package/dist/sync/v3/localTaskRestoreClient.js +32 -0
  866. package/dist/sync/v3/localTaskRestoreOutboxHandler.d.ts +8 -0
  867. package/dist/sync/v3/localTaskRestoreOutboxHandler.js +41 -0
  868. package/dist/sync/v3/localTaskRestoreOutboxService.d.ts +56 -0
  869. package/dist/sync/v3/localTaskRestoreOutboxService.js +323 -0
  870. package/dist/sync/v3/localTaskStatusClient.d.ts +17 -0
  871. package/dist/sync/v3/localTaskStatusClient.js +35 -0
  872. package/dist/sync/v3/localTaskStatusOutboxHandler.d.ts +8 -0
  873. package/dist/sync/v3/localTaskStatusOutboxHandler.js +75 -0
  874. package/dist/sync/v3/localTaskStatusOutboxService.d.ts +53 -0
  875. package/dist/sync/v3/localTaskStatusOutboxService.js +422 -0
  876. package/dist/sync/v3/localTaxonomyCompositeOutboxService.d.ts +34 -0
  877. package/dist/sync/v3/localTaxonomyCompositeOutboxService.js +290 -0
  878. package/dist/sync/v3/localTaxonomyOutboxHandler.d.ts +9 -0
  879. package/dist/sync/v3/localTaxonomyOutboxHandler.js +106 -0
  880. package/dist/sync/v3/localTaxonomyOutboxService.d.ts +30 -0
  881. package/dist/sync/v3/localTaxonomyOutboxService.js +181 -0
  882. package/dist/sync/v3/localWorkflowRuntimeOutboxHandler.d.ts +8 -0
  883. package/dist/sync/v3/localWorkflowRuntimeOutboxHandler.js +113 -0
  884. package/dist/sync/v3/localWorkflowRuntimeOutboxService.d.ts +37 -0
  885. package/dist/sync/v3/localWorkflowRuntimeOutboxService.js +330 -0
  886. package/dist/sync/v3/localWorkspaceSyncServerOutboxDispatcher.d.ts +63 -0
  887. package/dist/sync/v3/localWorkspaceSyncServerOutboxDispatcher.js +264 -0
  888. package/dist/sync/v3/localWorkstreamOutboxHandler.d.ts +8 -0
  889. package/dist/sync/v3/localWorkstreamOutboxHandler.js +102 -0
  890. package/dist/sync/v3/localWorkstreamOutboxService.d.ts +52 -0
  891. package/dist/sync/v3/localWorkstreamOutboxService.js +579 -0
  892. package/dist/sync/v3/localWorkstreamTaskOrderOutboxHandler.d.ts +10 -0
  893. package/dist/sync/v3/localWorkstreamTaskOrderOutboxHandler.js +57 -0
  894. package/dist/sync/v3/localWorkstreamTaskOrderOutboxService.d.ts +30 -0
  895. package/dist/sync/v3/localWorkstreamTaskOrderOutboxService.js +128 -0
  896. package/dist/sync/v3/planningActivation.d.ts +13 -0
  897. package/dist/sync/v3/planningActivation.js +33 -0
  898. package/dist/sync/v3/planningAttachmentActivityValidation.d.ts +9 -0
  899. package/dist/sync/v3/planningAttachmentActivityValidation.js +87 -0
  900. package/dist/sync/v3/programScaffoldService.d.ts +143 -0
  901. package/dist/sync/v3/programScaffoldService.js +478 -0
  902. package/dist/sync/v3/syncDurabilityStore.d.ts +773 -0
  903. package/dist/sync/v3/syncDurabilityStore.js +4635 -0
  904. package/dist/sync/v3/taskActivityAuthoritativeRevision.d.ts +16 -0
  905. package/dist/sync/v3/taskActivityAuthoritativeRevision.js +67 -0
  906. package/dist/sync/v3/taskActivityJournal.d.ts +20 -0
  907. package/dist/sync/v3/taskActivityJournal.js +195 -0
  908. package/dist/sync/v3/taskAttachmentLinksActivityIdentity.d.ts +6 -0
  909. package/dist/sync/v3/taskAttachmentLinksActivityIdentity.js +14 -0
  910. package/dist/sync/v3/taskAttachmentLinksMutationService.d.ts +111 -0
  911. package/dist/sync/v3/taskAttachmentLinksMutationService.js +202 -0
  912. package/dist/sync/v3/taskChecklistActivityIdentity.d.ts +6 -0
  913. package/dist/sync/v3/taskChecklistActivityIdentity.js +14 -0
  914. package/dist/sync/v3/taskChecklistMutationService.d.ts +92 -0
  915. package/dist/sync/v3/taskChecklistMutationService.js +156 -0
  916. package/dist/sync/v3/taskCommentActivityIdentity.d.ts +7 -0
  917. package/dist/sync/v3/taskCommentActivityIdentity.js +15 -0
  918. package/dist/sync/v3/taskCommentMutationService.d.ts +150 -0
  919. package/dist/sync/v3/taskCommentMutationService.js +392 -0
  920. package/dist/sync/v3/taskCommentReconcileProvenance.d.ts +58 -0
  921. package/dist/sync/v3/taskCommentReconcileProvenance.js +170 -0
  922. package/dist/sync/v3/taskCreateActivation.d.ts +19 -0
  923. package/dist/sync/v3/taskCreateActivation.js +84 -0
  924. package/dist/sync/v3/taskCreateActivityIdentity.d.ts +7 -0
  925. package/dist/sync/v3/taskCreateActivityIdentity.js +18 -0
  926. package/dist/sync/v3/taskCreateMutationService.d.ts +103 -0
  927. package/dist/sync/v3/taskCreateMutationService.js +283 -0
  928. package/dist/sync/v3/taskDeleteActivation.d.ts +7 -0
  929. package/dist/sync/v3/taskDeleteActivation.js +14 -0
  930. package/dist/sync/v3/taskDeleteMutationService.d.ts +35 -0
  931. package/dist/sync/v3/taskDeleteMutationService.js +133 -0
  932. package/dist/sync/v3/taskLegacyRootAdoptionService.d.ts +78 -0
  933. package/dist/sync/v3/taskLegacyRootAdoptionService.js +175 -0
  934. package/dist/sync/v3/taskLifecycleActivityIdentity.d.ts +9 -0
  935. package/dist/sync/v3/taskLifecycleActivityIdentity.js +18 -0
  936. package/dist/sync/v3/taskLifecycleMutationPayload.d.ts +5 -0
  937. package/dist/sync/v3/taskLifecycleMutationPayload.js +28 -0
  938. package/dist/sync/v3/taskLifecycleMutationService.d.ts +66 -0
  939. package/dist/sync/v3/taskLifecycleMutationService.js +92 -0
  940. package/dist/sync/v3/taskMetadataActivation.d.ts +12 -0
  941. package/dist/sync/v3/taskMetadataActivation.js +38 -0
  942. package/dist/sync/v3/taskMetadataActivityIdentity.d.ts +7 -0
  943. package/dist/sync/v3/taskMetadataActivityIdentity.js +18 -0
  944. package/dist/sync/v3/taskMetadataCoexistence.d.ts +37 -0
  945. package/dist/sync/v3/taskMetadataCoexistence.js +134 -0
  946. package/dist/sync/v3/taskMetadataMutationService.d.ts +71 -0
  947. package/dist/sync/v3/taskMetadataMutationService.js +199 -0
  948. package/dist/sync/v3/taskRelationshipLegacyAdoptionService.d.ts +48 -0
  949. package/dist/sync/v3/taskRelationshipLegacyAdoptionService.js +164 -0
  950. package/dist/sync/v3/taskRelationshipMutationService.d.ts +50 -0
  951. package/dist/sync/v3/taskRelationshipMutationService.js +148 -0
  952. package/dist/sync/v3/taskRestoreMutationService.d.ts +90 -0
  953. package/dist/sync/v3/taskRestoreMutationService.js +179 -0
  954. package/dist/sync/v3/taskStatusActivation.d.ts +7 -0
  955. package/dist/sync/v3/taskStatusActivation.js +15 -0
  956. package/dist/sync/v3/taskStatusMutationService.d.ts +76 -0
  957. package/dist/sync/v3/taskStatusMutationService.js +308 -0
  958. package/dist/sync/v3/taskWorkflowMutationPayload.d.ts +4 -0
  959. package/dist/sync/v3/taskWorkflowMutationPayload.js +22 -0
  960. package/dist/sync/v3/taskWorkflowMutationService.d.ts +64 -0
  961. package/dist/sync/v3/taskWorkflowMutationService.js +102 -0
  962. package/dist/sync/v3/taxonomyCoexistence.d.ts +10 -0
  963. package/dist/sync/v3/taxonomyCoexistence.js +19 -0
  964. package/dist/sync/v3/taxonomyCompositeMutationService.d.ts +110 -0
  965. package/dist/sync/v3/taxonomyCompositeMutationService.js +304 -0
  966. package/dist/sync/v3/taxonomyMutationService.d.ts +57 -0
  967. package/dist/sync/v3/taxonomyMutationService.js +106 -0
  968. package/dist/sync/v3/taxonomyStateMutation.d.ts +22 -0
  969. package/dist/sync/v3/taxonomyStateMutation.js +49 -0
  970. package/dist/sync/v3/taxonomySyncPayload.d.ts +9 -0
  971. package/dist/sync/v3/taxonomySyncPayload.js +199 -0
  972. package/dist/sync/v3/workflowAssignmentSync.d.ts +22 -0
  973. package/dist/sync/v3/workflowAssignmentSync.js +213 -0
  974. package/dist/sync/v3/workflowRuntimeMutationService.d.ts +89 -0
  975. package/dist/sync/v3/workflowRuntimeMutationService.js +359 -0
  976. package/dist/sync/v3/workflowRuntimeOperationIdentity.d.ts +13 -0
  977. package/dist/sync/v3/workflowRuntimeOperationIdentity.js +35 -0
  978. package/dist/sync/v3/workflowRuntimeSync.d.ts +141 -0
  979. package/dist/sync/v3/workflowRuntimeSync.js +485 -0
  980. package/dist/sync/v3/workspaceSyncJournalReader.d.ts +43 -0
  981. package/dist/sync/v3/workspaceSyncJournalReader.js +45 -0
  982. package/dist/sync/v3/workspaceSyncLocalOwnershipSnapshot.d.ts +28 -0
  983. package/dist/sync/v3/workspaceSyncLocalOwnershipSnapshot.js +81 -0
  984. package/dist/sync/v3/workspaceSyncPayloadFingerprint.d.ts +1 -0
  985. package/dist/sync/v3/workspaceSyncPayloadFingerprint.js +5 -0
  986. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.d.ts +16 -0
  987. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.js +161 -0
  988. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.d.ts +83 -0
  989. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.js +161 -0
  990. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.d.ts +16 -0
  991. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.js +90 -0
  992. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +65 -0
  993. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +356 -0
  994. package/dist/sync/v3/workspaceSyncV3CombinedCoverage.d.ts +51 -0
  995. package/dist/sync/v3/workspaceSyncV3CombinedCoverage.js +171 -0
  996. package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.d.ts +43 -0
  997. package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.js +535 -0
  998. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.d.ts +50 -0
  999. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +1149 -0
  1000. package/dist/sync/v3/workspaceSyncV3CombinedProjectionState.d.ts +96 -0
  1001. package/dist/sync/v3/workspaceSyncV3CombinedProjectionState.js +672 -0
  1002. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +42 -0
  1003. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +598 -0
  1004. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +65 -0
  1005. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +505 -0
  1006. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +78 -0
  1007. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +511 -0
  1008. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +45 -0
  1009. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +125 -0
  1010. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.d.ts +13 -0
  1011. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +34 -0
  1012. package/dist/sync/v3/workspaceSyncV3CursorEncoding.d.ts +1 -0
  1013. package/dist/sync/v3/workspaceSyncV3CursorEncoding.js +6 -0
  1014. package/dist/sync/v3/workspaceSyncV3DomainAdmission.d.ts +43 -0
  1015. package/dist/sync/v3/workspaceSyncV3DomainAdmission.js +118 -0
  1016. package/dist/sync/v3/workspaceSyncV3Feed.d.ts +95 -0
  1017. package/dist/sync/v3/workspaceSyncV3Feed.js +243 -0
  1018. package/dist/sync/v3/workspaceSyncV3FeedApply.d.ts +13 -0
  1019. package/dist/sync/v3/workspaceSyncV3FeedApply.js +67 -0
  1020. package/dist/sync/v3/workspaceSyncV3FeedClientContract.d.ts +3 -0
  1021. package/dist/sync/v3/workspaceSyncV3FeedClientContract.js +46 -0
  1022. package/dist/sync/v3/workspaceSyncV3FeedCursorKeys.d.ts +10 -0
  1023. package/dist/sync/v3/workspaceSyncV3FeedCursorKeys.js +58 -0
  1024. package/dist/sync/v3/workspaceSyncV3FeedOrchestrator.d.ts +31 -0
  1025. package/dist/sync/v3/workspaceSyncV3FeedOrchestrator.js +228 -0
  1026. package/dist/sync/v3/workspaceSyncV3FeedProfile.d.ts +32 -0
  1027. package/dist/sync/v3/workspaceSyncV3FeedProfile.js +21 -0
  1028. package/dist/sync/v3/workspaceSyncV3InitiativeLocalApply.d.ts +36 -0
  1029. package/dist/sync/v3/workspaceSyncV3InitiativeLocalApply.js +163 -0
  1030. package/dist/sync/v3/workspaceSyncV3InitiativeRepair.d.ts +33 -0
  1031. package/dist/sync/v3/workspaceSyncV3InitiativeRepair.js +118 -0
  1032. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.d.ts +10 -0
  1033. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.js +45 -0
  1034. package/dist/sync/v3/workspaceSyncV3LocalOutboxStatus.d.ts +27 -0
  1035. package/dist/sync/v3/workspaceSyncV3LocalOutboxStatus.js +83 -0
  1036. package/dist/sync/v3/workspaceSyncV3NestedCoverage.d.ts +10 -0
  1037. package/dist/sync/v3/workspaceSyncV3NestedCoverage.js +40 -0
  1038. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.d.ts +83 -0
  1039. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.js +325 -0
  1040. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.d.ts +59 -0
  1041. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.js +302 -0
  1042. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +47 -0
  1043. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +329 -0
  1044. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.d.ts +19 -0
  1045. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.js +41 -0
  1046. package/dist/sync/v3/workspaceSyncV3NestedWireContract.d.ts +6 -0
  1047. package/dist/sync/v3/workspaceSyncV3NestedWireContract.js +16 -0
  1048. package/dist/sync/v3/workspaceSyncV3OperationProjection.d.ts +8 -0
  1049. package/dist/sync/v3/workspaceSyncV3OperationProjection.js +52 -0
  1050. package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +229 -0
  1051. package/dist/sync/v3/workspaceSyncV3OperationProtocol.js +1 -0
  1052. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +165 -0
  1053. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +414 -0
  1054. package/dist/sync/v3/workspaceSyncV3OriginActor.d.ts +36 -0
  1055. package/dist/sync/v3/workspaceSyncV3OriginActor.js +61 -0
  1056. package/dist/sync/v3/workspaceSyncV3OriginAssertion.d.ts +46 -0
  1057. package/dist/sync/v3/workspaceSyncV3OriginAssertion.js +121 -0
  1058. package/dist/sync/v3/workspaceSyncV3OriginAssertionHeader.d.ts +1 -0
  1059. package/dist/sync/v3/workspaceSyncV3OriginAssertionHeader.js +1 -0
  1060. package/dist/sync/v3/workspaceSyncV3PlanningOrderCoverage.d.ts +10 -0
  1061. package/dist/sync/v3/workspaceSyncV3PlanningOrderCoverage.js +34 -0
  1062. package/dist/sync/v3/workspaceSyncV3PlanningOrderWireContract.d.ts +6 -0
  1063. package/dist/sync/v3/workspaceSyncV3PlanningOrderWireContract.js +10 -0
  1064. package/dist/sync/v3/workspaceSyncV3ProjectionState.d.ts +105 -0
  1065. package/dist/sync/v3/workspaceSyncV3ProjectionState.js +467 -0
  1066. package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.d.ts +56 -0
  1067. package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.js +250 -0
  1068. package/dist/sync/v3/workspaceSyncV3TaskRelationshipProjection.d.ts +30 -0
  1069. package/dist/sync/v3/workspaceSyncV3TaskRelationshipProjection.js +142 -0
  1070. package/dist/sync/v3/workspaceSyncV3TaskRootProjection.d.ts +40 -0
  1071. package/dist/sync/v3/workspaceSyncV3TaskRootProjection.js +246 -0
  1072. package/dist/sync/v3/workspaceSyncV3TaxonomyFeedProjection.d.ts +39 -0
  1073. package/dist/sync/v3/workspaceSyncV3TaxonomyFeedProjection.js +185 -0
  1074. package/dist/sync/v3/workspaceSyncV3WorkflowCoverage.d.ts +10 -0
  1075. package/dist/sync/v3/workspaceSyncV3WorkflowCoverage.js +36 -0
  1076. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.d.ts +17 -0
  1077. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.js +143 -0
  1078. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeProjection.d.ts +9 -0
  1079. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeProjection.js +195 -0
  1080. package/dist/sync/v3/workspaceSyncV3WorkflowWireContract.d.ts +11 -0
  1081. package/dist/sync/v3/workspaceSyncV3WorkflowWireContract.js +12 -0
  1082. package/dist/sync/v3/workspaceSyncV3WorkstreamProjection.d.ts +4 -0
  1083. package/dist/sync/v3/workspaceSyncV3WorkstreamProjection.js +98 -0
  1084. package/dist/sync/v3/workspaceSyncV3WorkstreamTaskOrderProjection.d.ts +9 -0
  1085. package/dist/sync/v3/workspaceSyncV3WorkstreamTaskOrderProjection.js +72 -0
  1086. package/dist/sync/v3/workstreamActivityAuthoritativeRevision.d.ts +11 -0
  1087. package/dist/sync/v3/workstreamActivityAuthoritativeRevision.js +23 -0
  1088. package/dist/sync/v3/workstreamActivityIdentity.d.ts +8 -0
  1089. package/dist/sync/v3/workstreamActivityIdentity.js +14 -0
  1090. package/dist/sync/v3/workstreamCoexistence.d.ts +19 -0
  1091. package/dist/sync/v3/workstreamCoexistence.js +64 -0
  1092. package/dist/sync/v3/workstreamMutationPayload.d.ts +27 -0
  1093. package/dist/sync/v3/workstreamMutationPayload.js +147 -0
  1094. package/dist/sync/v3/workstreamMutationService.d.ts +72 -0
  1095. package/dist/sync/v3/workstreamMutationService.js +256 -0
  1096. package/dist/sync/v3/workstreamTaskOrderMutationService.d.ts +55 -0
  1097. package/dist/sync/v3/workstreamTaskOrderMutationService.js +110 -0
  1098. package/dist/sync/v3/workstreamTaskOrderSync.d.ts +14 -0
  1099. package/dist/sync/v3/workstreamTaskOrderSync.js +25 -0
  1100. package/dist/sync/workspaceContentManifest.d.ts +86 -0
  1101. package/dist/sync/workspaceContentManifest.js +123 -0
  1102. package/dist/sync/workspacePullFeed.d.ts +186 -2
  1103. package/dist/sync/workspacePullFeed.js +513 -136
  1104. package/dist/sync/workspacePushPreparedPlan.d.ts +21 -0
  1105. package/dist/sync/workspacePushPreparedPlan.js +1 -0
  1106. package/dist/sync/workspaceRepair.d.ts +17 -25
  1107. package/dist/sync/workspaceRepair.js +348 -25
  1108. package/dist/sync/workspaceSyncContentDecryption.d.ts +6 -0
  1109. package/dist/sync/workspaceSyncContentDecryption.js +11 -0
  1110. package/dist/sync/workspaceSyncModel.d.ts +216 -5
  1111. package/dist/sync/workspaceSyncModel.js +371 -35
  1112. package/dist/sync/workspaceSyncSnapshotProjection.d.ts +11 -0
  1113. package/dist/sync/workspaceSyncSnapshotProjection.js +101 -0
  1114. package/dist/sync/workspaceSyncState.d.ts +13 -0
  1115. package/dist/sync/workspaceSyncState.js +36 -0
  1116. package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +106 -0
  1117. package/dist/sync/workspaceSyncV2SnapshotBuilder.js +193 -0
  1118. package/dist/types.d.ts +23 -15
  1119. package/dist/types.js +1 -3
  1120. package/dist/ui/ai-profile-clients/amazon-nova.svg +1 -0
  1121. package/dist/ui/ai-profile-clients/antigravity.png +0 -0
  1122. package/dist/ui/ai-profile-clients/chatgpt.svg +10 -0
  1123. package/dist/ui/ai-profile-clients/claude-chat.svg +1 -0
  1124. package/dist/ui/ai-profile-clients/claude-code.svg +15 -0
  1125. package/dist/ui/ai-profile-clients/cline-app-icon-light.png +0 -0
  1126. package/dist/ui/ai-profile-clients/cline.svg +16 -0
  1127. package/dist/ui/ai-profile-clients/codex.svg +1 -0
  1128. package/dist/ui/ai-profile-clients/copilot.png +0 -0
  1129. package/dist/ui/ai-profile-clients/cursor.svg +1 -0
  1130. package/dist/ui/ai-profile-clients/deepseek.svg +1 -0
  1131. package/dist/ui/ai-profile-clients/gemini-cli-icon.png +0 -0
  1132. package/dist/ui/ai-profile-clients/gemini.svg +10 -0
  1133. package/dist/ui/ai-profile-clients/grok.svg +31 -0
  1134. package/dist/ui/ai-profile-clients/kiro.svg +11 -0
  1135. package/dist/ui/ai-profile-clients/llama.svg +1 -0
  1136. package/dist/ui/ai-profile-clients/mistral.svg +1 -0
  1137. package/dist/ui/ai-profile-clients/ms_copilot.jpeg +0 -0
  1138. package/dist/ui/ai-profile-clients/openclaw.png +0 -0
  1139. package/dist/ui/ai-profile-clients/perplexity.svg +1 -0
  1140. package/dist/ui/ai-profile-clients/vscode.svg +41 -0
  1141. package/dist/ui/ai-profile-clients/windsurf.svg +11 -0
  1142. package/dist/ui/assets/AiIdentityRosterCard-DB1BLO_j.js +1 -0
  1143. package/dist/ui/assets/AiProfilesModule-DPxQeF9N.js +1 -0
  1144. package/dist/ui/assets/AnnotatedAttachmentWorkspace-CBRZ8rca.css +1 -0
  1145. package/dist/ui/assets/AnnotatedAttachmentWorkspace-DHNYaNg6.js +3 -0
  1146. package/dist/ui/assets/AssetTraySortControl-B9k5caQW.css +1 -0
  1147. package/dist/ui/assets/AssetTraySortControl-DphbyHVc.js +1 -0
  1148. package/dist/ui/assets/ContextAttachmentManager-CMxSzHqc.js +3 -0
  1149. package/dist/ui/assets/DocumentWorkspace-BC7sy5TG.js +261 -0
  1150. package/dist/ui/assets/DocumentWorkspace-BIBGBfd7.css +1 -0
  1151. package/dist/ui/assets/EntityActivityTimeline-BfJbZRdl.css +1 -0
  1152. package/dist/ui/assets/EntityActivityTimeline-pJ2ZjZ-k.js +1 -0
  1153. package/dist/ui/assets/PlanningModule-CeTqXMMz.css +1 -0
  1154. package/dist/ui/assets/PlanningModule-t5GbvVR9.js +1 -0
  1155. package/dist/ui/assets/PlansPage-BVH_NfgT.js +1 -0
  1156. package/dist/ui/assets/PlansPage-C2nkK2Bp.css +1 -0
  1157. package/dist/ui/assets/TaskContextUpload-Ds4LnDzV.css +1 -0
  1158. package/dist/ui/assets/TaskContextUpload-bl4fOOUz.js +1 -0
  1159. package/dist/ui/assets/TaskSettings-xVsxSa0g.js +12 -0
  1160. package/dist/ui/assets/TaskforceAgentsModule-CkAxW19K.js +21 -0
  1161. package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +1 -0
  1162. package/dist/ui/assets/WorkflowManagerModule-BKqIGVnF.js +1 -0
  1163. package/dist/ui/assets/WorkflowManagerModule-DF10XENz.css +1 -0
  1164. package/dist/ui/assets/antigravity-DRKQga2U.png +0 -0
  1165. package/dist/ui/assets/cursor-BM_3k4Y4.svg +1 -0
  1166. package/dist/ui/assets/gemini-cli-icon-dBAVjCcn.png +0 -0
  1167. package/dist/ui/assets/grok-BuodbWaG.svg +31 -0
  1168. package/dist/ui/assets/index-BzJlVnNS.css +1 -0
  1169. package/dist/ui/assets/index-Cx7vZJHL.js +7 -0
  1170. package/dist/ui/assets/{vendor-dnd-DRzYolkg.js → vendor-dnd-CJ-AjP-Y.js} +1 -1
  1171. package/dist/ui/assets/{vendor-icons-CLnehDTw.js → vendor-icons-B8ZNsH1g.js} +1 -1
  1172. package/dist/ui/assets/{vendor-markdown-BUxTU7dS.js → vendor-markdown-_lhNCyq-.js} +9 -9
  1173. package/dist/ui/assets/vendor-router-AqJMU8Lz.js +3 -0
  1174. package/dist/ui/assets/vscode-C_7wk1WI.svg +41 -0
  1175. package/dist/ui/branding/logos/logo_dark_bg.png +0 -0
  1176. package/dist/ui/branding/logos/logo_favicon_dark.png +0 -0
  1177. package/dist/ui/branding/logos/logo_favicon_dark.svg +56 -0
  1178. package/dist/ui/branding/logos/logo_favicon_light.png +0 -0
  1179. package/dist/ui/branding/logos/logo_light_bg.png +0 -0
  1180. package/dist/ui/images/Taskforce_Van.webp +0 -0
  1181. package/dist/ui/index.html +6 -6
  1182. package/dist/update/uiUpdateService.d.ts +43 -0
  1183. package/dist/update/uiUpdateService.js +149 -0
  1184. package/dist/update/updateCli.d.ts +15 -0
  1185. package/dist/update/updateCli.js +76 -0
  1186. package/dist/update/updateExecutor.d.ts +40 -0
  1187. package/dist/update/updateExecutor.js +474 -0
  1188. package/dist/update/updateStatus.d.ts +83 -0
  1189. package/dist/update/updateStatus.js +703 -0
  1190. package/dist/utils/aiProfileAvatarPaths.d.ts +14 -0
  1191. package/dist/utils/aiProfileAvatarPaths.js +52 -0
  1192. package/dist/utils/aiProfileDefaultLogo.d.ts +7 -0
  1193. package/dist/utils/aiProfileDefaultLogo.js +84 -0
  1194. package/dist/utils/aiProfileEvents.d.ts +9 -1
  1195. package/dist/utils/annotatedAttachments.d.ts +8 -0
  1196. package/dist/utils/annotatedAttachments.js +17 -1
  1197. package/dist/utils/assetTraySorting.d.ts +25 -0
  1198. package/dist/utils/assetTraySorting.js +83 -0
  1199. package/dist/utils/assignees.d.ts +5 -0
  1200. package/dist/utils/assignees.js +14 -9
  1201. package/dist/utils/authLogin.d.ts +10 -0
  1202. package/dist/utils/authLogin.js +8 -0
  1203. package/dist/utils/authSessionEvents.d.ts +2 -0
  1204. package/dist/utils/authSessionEvents.js +6 -0
  1205. package/dist/utils/avatarUpload.js +5 -5
  1206. package/dist/utils/canonicalReferenceAttachments.d.ts +12 -0
  1207. package/dist/utils/canonicalReferenceAttachments.js +42 -0
  1208. package/dist/utils/cloudAssetDisplay.d.ts +2 -0
  1209. package/dist/utils/cloudAssetDisplay.js +8 -0
  1210. package/dist/utils/constants.d.ts +4 -11
  1211. package/dist/utils/constants.js +5 -64
  1212. package/dist/utils/contextAttachmentPreview.d.ts +11 -0
  1213. package/dist/utils/contextAttachmentPreview.js +8 -0
  1214. package/dist/utils/contextAttachmentUpload.d.ts +8 -0
  1215. package/dist/utils/contextAttachmentUpload.js +144 -0
  1216. package/dist/utils/documentNames.js +6 -4
  1217. package/dist/utils/entityReferences.d.ts +14 -0
  1218. package/dist/utils/entityReferences.js +21 -0
  1219. package/dist/utils/httpSetCookie.d.ts +3 -0
  1220. package/dist/utils/httpSetCookie.js +22 -0
  1221. package/dist/utils/imageNoteStoragePaths.d.ts +3 -0
  1222. package/dist/utils/imageNoteStoragePaths.js +19 -0
  1223. package/dist/utils/imageReferences.d.ts +6 -0
  1224. package/dist/utils/imageReferences.js +1 -0
  1225. package/dist/utils/planningArchiveOrchestrator.d.ts +23 -0
  1226. package/dist/utils/planningArchiveOrchestrator.js +37 -0
  1227. package/dist/utils/planningArchivePresentation.d.ts +20 -0
  1228. package/dist/utils/planningArchivePresentation.js +23 -0
  1229. package/dist/utils/planningArchiveReadiness.d.ts +26 -0
  1230. package/dist/utils/planningArchiveReadiness.js +30 -0
  1231. package/dist/utils/planningFavorites.d.ts +7 -0
  1232. package/dist/utils/planningFavorites.js +34 -0
  1233. package/dist/utils/syncEventPresentation.js +53 -0
  1234. package/dist/utils/syncStatusPresentation.d.ts +25 -0
  1235. package/dist/utils/syncStatusPresentation.js +86 -5
  1236. package/dist/utils/taskActivity.d.ts +9 -2
  1237. package/dist/utils/taskActivity.js +61 -0
  1238. package/dist/utils/taskDraftDefaults.d.ts +0 -8
  1239. package/dist/utils/taskDraftDefaults.js +0 -4
  1240. package/dist/utils/taskEvents.d.ts +11 -0
  1241. package/dist/utils/taskEvents.js +6 -0
  1242. package/dist/utils/taskHeaderQuickFilter.d.ts +14 -0
  1243. package/dist/utils/taskHeaderQuickFilter.js +32 -0
  1244. package/dist/utils/taskInvalidation.d.ts +23 -0
  1245. package/dist/utils/taskInvalidation.js +67 -0
  1246. package/dist/utils/taskNormalization.d.ts +2 -1
  1247. package/dist/utils/taskNormalization.js +44 -18
  1248. package/dist/utils/taskReferences.d.ts +16 -0
  1249. package/dist/utils/taskReferences.js +63 -0
  1250. package/dist/utils/taskforceAgentEvents.d.ts +8 -0
  1251. package/dist/utils/taskforceAgentEvents.js +6 -0
  1252. package/dist/utils/taskforceAgentSkillEvents.d.ts +7 -0
  1253. package/dist/utils/taskforceAgentSkillEvents.js +8 -0
  1254. package/dist/utils/uiNotice.d.ts +3 -0
  1255. package/dist/utils/uiNotice.js +1 -1
  1256. package/dist/utils/workspaceResourceEvents.d.ts +7 -0
  1257. package/dist/utils/workspaceResourceEvents.js +6 -0
  1258. package/dist/utils/workspaceSyncPresentation.d.ts +24 -0
  1259. package/dist/utils/workspaceSyncPresentation.js +243 -6
  1260. package/package.json +69 -21
  1261. package/dist/components/features/AgentsModule.d.ts +0 -18
  1262. package/dist/components/features/AgentsModule.js +0 -479
  1263. package/dist/components/features/InitiativesModule.d.ts +0 -22
  1264. package/dist/components/features/InitiativesModule.js +0 -33
  1265. package/dist/components/features/WorkflowsModule.d.ts +0 -27
  1266. package/dist/components/features/WorkflowsModule.js +0 -21
  1267. package/dist/components/features/settings/WorkflowEditor.d.ts +0 -15
  1268. package/dist/components/features/settings/WorkflowEditor.js +0 -245
  1269. package/dist/components/views/panels/DocumentFilterToolbar.d.ts +0 -10
  1270. package/dist/components/views/panels/DocumentFilterToolbar.js +0 -7
  1271. package/dist/components/views/standalone/modals/AccountHubModal.d.ts +0 -61
  1272. package/dist/components/views/standalone/modals/AccountHubModal.js +0 -108
  1273. package/dist/components/views/standalone/modals/EditProfileModal.d.ts +0 -19
  1274. package/dist/components/views/standalone/modals/EditProfileModal.js +0 -11
  1275. package/dist/hooks/ui/useResourceExport.d.ts +0 -21
  1276. package/dist/hooks/ui/useResourceExport.js +0 -87
  1277. package/dist/hooks/ui/useWorkflowTemplates.d.ts +0 -37
  1278. package/dist/hooks/ui/useWorkflowTemplates.js +0 -116
  1279. package/dist/mcp/clientProfileDefaults.d.ts +0 -12
  1280. package/dist/mcp/clientProfileDefaults.js +0 -41
  1281. package/dist/resources/templates/WORKFLOW_V2_POLICY.md +0 -55
  1282. package/dist/resources/templates/environments/aider.yaml +0 -14
  1283. package/dist/resources/templates/environments/antigravity.yaml +0 -10
  1284. package/dist/resources/templates/environments/claude.yaml +0 -10
  1285. package/dist/resources/templates/environments/cline.yaml +0 -10
  1286. package/dist/resources/templates/environments/codex.yaml +0 -13
  1287. package/dist/resources/templates/environments/copilot.yaml +0 -10
  1288. package/dist/resources/templates/environments/cursor.yaml +0 -9
  1289. package/dist/resources/templates/environments/gemini.yaml +0 -9
  1290. package/dist/resources/templates/environments/windsurf.yaml +0 -10
  1291. package/dist/resources/templates/workflow-sources/README.md +0 -9
  1292. package/dist/resources/templates/workflow-sources/workflowDocs.mjs +0 -530
  1293. package/dist/resources/templates/workflow-sources/workflowEditorOverrides.json +0 -1
  1294. package/dist/resources/templates/workflows/collaborate.yaml +0 -109
  1295. package/dist/resources/templates/workflows/do.yaml +0 -87
  1296. package/dist/resources/templates/workflows/evaluate.yaml +0 -116
  1297. package/dist/resources/templates/workflows/execute.yaml +0 -156
  1298. package/dist/resources/templates/workflows/plan.yaml +0 -118
  1299. package/dist/resources/templates/workflows/review.yaml +0 -114
  1300. package/dist/services/formatTransformers.d.ts +0 -29
  1301. package/dist/services/formatTransformers.js +0 -56
  1302. package/dist/services/templateEngine.d.ts +0 -46
  1303. package/dist/services/templateEngine.js +0 -148
  1304. package/dist/shared/workflowDefaults.d.ts +0 -9
  1305. package/dist/shared/workflowDefaults.js +0 -11
  1306. package/dist/ui/agent-logos/Gemini CLI.jpeg +0 -0
  1307. package/dist/ui/agent-logos/antigravity.jpeg +0 -0
  1308. package/dist/ui/agent-logos/chatgpt.png +0 -0
  1309. package/dist/ui/agent-logos/claude-code.jpeg +0 -0
  1310. package/dist/ui/agent-logos/codex.jpeg +0 -0
  1311. package/dist/ui/agent-logos/cursor.png +0 -0
  1312. package/dist/ui/agent-logos/openclaw.jpeg +0 -0
  1313. package/dist/ui/agent-logos/windsurf.png +0 -0
  1314. package/dist/ui/assets/AgentsModule-C4LcqhcZ.js +0 -1
  1315. package/dist/ui/assets/AnnotatedAttachmentWorkspace-B-Dq22d2.js +0 -3
  1316. package/dist/ui/assets/AnnotatedAttachmentWorkspace-BVKew-mH.css +0 -1
  1317. package/dist/ui/assets/ContextAttachmentManager-DsXPTvi-.js +0 -3
  1318. package/dist/ui/assets/DocumentWorkspace-CxA1wO3U.js +0 -252
  1319. package/dist/ui/assets/DocumentWorkspace-D4rJKXzd.css +0 -1
  1320. package/dist/ui/assets/EntityActivityTimeline-B8nSe8l3.js +0 -1
  1321. package/dist/ui/assets/EntityActivityTimeline-DyqvvhuF.css +0 -1
  1322. package/dist/ui/assets/InitiativesModule-VY95v38E.js +0 -1
  1323. package/dist/ui/assets/PlansPage-CQbKDv1a.js +0 -1
  1324. package/dist/ui/assets/PlansPage-DeAzWYTb.css +0 -1
  1325. package/dist/ui/assets/TaskContextUpload-DvDlNpHC.js +0 -1
  1326. package/dist/ui/assets/TaskSettings-CUWbYYtP.js +0 -12
  1327. package/dist/ui/assets/WorkflowsModule-CgM3Jako.js +0 -5
  1328. package/dist/ui/assets/documentReferences-Do9YjrS3.js +0 -1
  1329. package/dist/ui/assets/index--mh3pktj.js +0 -5
  1330. package/dist/ui/assets/index-BawaaEXS.css +0 -1
  1331. package/dist/ui/assets/vendor-router-BbWMxlnO.js +0 -3
  1332. package/dist/ui/branding/logos/logo_black_01.png +0 -0
  1333. package/dist/ui/branding/logos/logo_black_02.png +0 -0
  1334. package/dist/ui/branding/logos/logo_white_01.png +0 -0
  1335. package/dist/ui/branding/logos/logo_white_02.png +0 -0
  1336. package/scripts/generate-workflow-templates.mjs +0 -134
  1337. package/src/resources/templates/WORKFLOW_V2_POLICY.md +0 -55
  1338. package/src/resources/templates/environments/aider.yaml +0 -14
  1339. package/src/resources/templates/environments/antigravity.yaml +0 -10
  1340. package/src/resources/templates/environments/claude.yaml +0 -10
  1341. package/src/resources/templates/environments/cline.yaml +0 -10
  1342. package/src/resources/templates/environments/codex.yaml +0 -13
  1343. package/src/resources/templates/environments/copilot.yaml +0 -10
  1344. package/src/resources/templates/environments/cursor.yaml +0 -9
  1345. package/src/resources/templates/environments/gemini.yaml +0 -9
  1346. package/src/resources/templates/environments/windsurf.yaml +0 -10
  1347. package/src/resources/templates/workflow-sources/README.md +0 -9
  1348. package/src/resources/templates/workflow-sources/workflowDocs.mjs +0 -530
  1349. package/src/resources/templates/workflow-sources/workflowEditorOverrides.json +0 -1
  1350. package/src/resources/templates/workflows/collaborate.yaml +0 -109
  1351. package/src/resources/templates/workflows/do.yaml +0 -87
  1352. package/src/resources/templates/workflows/evaluate.yaml +0 -116
  1353. package/src/resources/templates/workflows/execute.yaml +0 -156
  1354. package/src/resources/templates/workflows/plan.yaml +0 -118
  1355. package/src/resources/templates/workflows/review.yaml +0 -114
  1356. /package/dist/ui/branding/logos/{logo_dark.svg → logo_dark_no_bg.svg} +0 -0
  1357. /package/dist/ui/branding/logos/{logo_favicon.svg → logo_favicon_light.svg} +0 -0
  1358. /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,24 @@ 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
1497
  const [attachments, setAttachments] = useState([]);
1183
1498
  const [attachmentsDirty, setAttachmentsDirty] = useState(false);
1184
1499
  const dataVersionRef = useRef(null);
1185
- const cloudRealtimeFollowUpRefreshTimerRef = useRef(null);
1186
- const archiveBootstrapTimerRef = useRef(null);
1500
+ const ambiguousRealtimeConfirmationTimerRef = useRef(null);
1187
1501
  const skippedInitialTaskTabRefreshRef = useRef(false);
1188
1502
  const authSessionResolvedRef = useRef(authSessionResolved);
1189
1503
  const authRequiredForApiRef = useRef(authRequiredForApi);
1190
1504
  const isAuthenticatedRef = useRef(isAuthenticated);
1191
- const hasLoadedUiStateRef = useRef(false);
1192
- const lastLoadedUiStateKeyRef = useRef('');
1193
1505
  const lastAssigneeOptionsLoadKeyRef = useRef('');
1194
1506
  const lastConfigRefreshKeyRef = useRef('');
1195
1507
  const lastWorkspaceSyncStateLoadKeyRef = useRef('');
1196
1508
  const lastTaskSurfaceLoadKeyRef = useRef('');
1197
1509
  const lastSettingsSurfaceLoadKeyRef = useRef('');
1198
- const skipNextUiStatePersistRef = useRef(false);
1199
- const activeWorkspaceModuleOverridePendingRef = useRef(false);
1200
1510
  const referenceDataRequestRef = useRef(null);
1201
1511
  const workspaceListHydratedRef = useRef(false);
1202
1512
  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
1513
  const { handleSaveSettings, handleSaveTheme, handleSaveGlobalTheme, handleJsonBackupEnabledChange, handleSaveGlobalJsonBackupEnabled, handleSaveGlobalWeekStartsOn, handleSaveLocale, handleManualComplexityEnabledChange, handleChecklistDropdownEnabledChange, handleShowTaskCardStatusLabelChange, handleResetProjectToGlobal } = useSettingsPersistence({
1211
1514
  keyShortcut,
1212
1515
  themeUseGlobalDefault,
@@ -1224,8 +1527,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1224
1527
  setLocale,
1225
1528
  setManualComplexityEnabled,
1226
1529
  setChecklistDropdownEnabled,
1227
- setShowTaskCardStatusLabel,
1228
- setShowChecklist
1530
+ setShowTaskCardStatusLabel
1229
1531
  });
1230
1532
  useEffect(() => {
1231
1533
  if (runtimeMode !== 'cloud')
@@ -1239,233 +1541,63 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1239
1541
  authRequiredForApiRef.current = authRequiredForApi;
1240
1542
  isAuthenticatedRef.current = isAuthenticated;
1241
1543
  }, [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,
1544
+ const { hasLoadedUiStateRef, loadPersistedUiState, resetPersistedUiStateLoad, setActiveWorkspaceModule, uiStateReady } = usePersistedAppUiState({
1545
+ runtimeMode,
1546
+ workspaceUiStateScope,
1547
+ currentWorkspaceId,
1548
+ currentWorkspaceIdRef,
1549
+ referenceDataLoaded,
1550
+ activeCategories,
1551
+ activeTypes,
1552
+ priorities,
1553
+ taxonomies,
1449
1554
  activeWorkspaceModule,
1555
+ setActiveWorkspaceModuleState,
1556
+ groupBy,
1557
+ setGroupBy,
1450
1558
  emptyColumnMode,
1559
+ setEmptyColumnMode,
1560
+ taskScope,
1561
+ setTaskScope,
1562
+ openTaskId: editingTaskId,
1563
+ setPendingOpenTaskId: setPendingOpenTaskIdFromPersistedState,
1564
+ compressedCards,
1565
+ setCompressedCards,
1451
1566
  zenMode,
1567
+ setZenModeState,
1452
1568
  searchQuery,
1569
+ setSearchQuery,
1570
+ collapsedCategories,
1571
+ setCollapsedCategories,
1453
1572
  filterCategories,
1573
+ setFilterCategories,
1454
1574
  filterPriorities,
1575
+ setFilterPriorities,
1455
1576
  filterTypes,
1577
+ setFilterTypes,
1456
1578
  filterStatus,
1579
+ setFilterStatus,
1457
1580
  filterAssignees,
1581
+ setFilterAssignees,
1458
1582
  filterAssigneesAllSelected,
1583
+ setFilterAssigneesAllSelected,
1459
1584
  filterTaxonomies,
1460
- currentFilterTaxonomySignature,
1585
+ setFilterTaxonomies,
1461
1586
  sortBy,
1587
+ setSortBy,
1462
1588
  sortOrder,
1589
+ setSortOrder,
1463
1590
  hasInitedFilters,
1464
- showChecklist,
1591
+ setHasInitedFilters,
1465
1592
  lastUsedCategory,
1466
- exportEnvironment,
1467
- workspaceUiStateScope
1468
- ]);
1593
+ setLastUsedCategory,
1594
+ taskforceAgentId,
1595
+ setTaskforceAgentId,
1596
+ taskforceAgentConversationId,
1597
+ setTaskforceAgentConversationId,
1598
+ taskforceAgentConversationByAgentId,
1599
+ setTaskforceAgentConversationByAgentId
1600
+ });
1469
1601
  const applyBootstrapConfig = useCallback((data) => {
1470
1602
  const nextRuntimeMode = data.runtimeMode === 'cloud' ? 'cloud' : 'local';
1471
1603
  const nextAuthRequiredForApi = Boolean(data.authRequiredForApi);
@@ -1488,7 +1620,10 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1488
1620
  if (typeof data.workspaceId === 'string' && data.workspaceId.trim().length > 0) {
1489
1621
  const nextWorkspaceId = data.workspaceId.trim();
1490
1622
  if (nextRuntimeMode === 'local') {
1491
- commitCurrentWorkspaceId(nextWorkspaceId);
1623
+ const previousWorkspaceId = String(currentWorkspaceIdRef.current || '').trim() || 'default';
1624
+ commitCurrentWorkspaceId(nextWorkspaceId, {
1625
+ skipTransitionReset: !configLoaded && previousWorkspaceId === 'default'
1626
+ });
1492
1627
  }
1493
1628
  else {
1494
1629
  applyResolvedWorkspaceId(nextWorkspaceId);
@@ -1591,9 +1726,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1591
1726
  setShowTaskCardStatusLabel(data.showTaskCardStatusLabel);
1592
1727
  }
1593
1728
  else {
1594
- setShowTaskCardStatusLabel(true);
1729
+ setShowTaskCardStatusLabel(false);
1595
1730
  }
1596
- }, [applyResolvedWorkspaceId, commitCurrentWorkspaceId]);
1731
+ }, [applyResolvedWorkspaceId, commitCurrentWorkspaceId, configLoaded, currentWorkspaceIdRef]);
1597
1732
  const fetchBuildInfo = useCallback(async () => {
1598
1733
  const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now();
1599
1734
  try {
@@ -1636,9 +1771,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1636
1771
  fetchBuildInfo,
1637
1772
  markBootstrapPhase,
1638
1773
  markBootstrapStalled,
1639
- fetchWorkflows,
1640
1774
  fetchInitiativeTemplates,
1641
- loadAvailableEnvironments,
1642
1775
  setReferenceDataLoaded,
1643
1776
  setCustomCategories,
1644
1777
  setCustomTypes,
@@ -1689,11 +1822,10 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1689
1822
  settingsSection,
1690
1823
  workspaceBootstrapPending,
1691
1824
  fetchTasks,
1692
- fetchArchive,
1693
1825
  fetchPlanningEntities,
1694
1826
  refreshTaskCollections,
1695
1827
  loadWorkspaceSyncState,
1696
- archiveBootstrapTimerRef,
1828
+ switchLocalCoordinatorWorkspace,
1697
1829
  hasBootstrappedDataRef
1698
1830
  });
1699
1831
  const refreshSetupContext = useCallback(async () => {
@@ -1749,8 +1881,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1749
1881
  const result = await runCloudBootstrap({
1750
1882
  reason: 'post-plans',
1751
1883
  ignoreAuthGuard: true,
1752
- tasksSilent: true,
1753
- includeDeferredArchive: false
1884
+ tasksSilent: true
1754
1885
  });
1755
1886
  if (!result.authenticated) {
1756
1887
  return { success: false, destination: 'login', error: result.error || 'Sign in required.', code: result.code || 'AUTH_REQUIRED' };
@@ -1797,8 +1928,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1797
1928
  const result = await runCloudBootstrap({
1798
1929
  reason,
1799
1930
  ignoreAuthGuard: true,
1800
- tasksSilent: true,
1801
- includeDeferredArchive: false
1931
+ tasksSilent: true
1802
1932
  });
1803
1933
  if (!result.authenticated) {
1804
1934
  return { success: false, error: result.error || 'Sign in required.', code: result.code || 'AUTH_REQUIRED' };
@@ -1979,7 +2109,11 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1979
2109
  method: 'POST',
1980
2110
  headers: { 'Content-Type': 'application/json' },
1981
2111
  credentials: 'include',
1982
- body: JSON.stringify({ email: trimmedEmail, password: rawPassword })
2112
+ body: JSON.stringify(buildTaskforceCredentialLoginPayload({
2113
+ email: trimmedEmail,
2114
+ password: rawPassword,
2115
+ activeWorkspaceId: currentWorkspaceIdRef.current,
2116
+ }))
1983
2117
  });
1984
2118
  const data = await res.json().catch(() => ({}));
1985
2119
  if (!res.ok || !data?.success) {
@@ -1990,24 +2124,34 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
1990
2124
  if (!entry.success) {
1991
2125
  return { success: false, error: entry.error || 'Unable to resolve workspace after sign in.', code: entry.code };
1992
2126
  }
2127
+ dispatchTaskforceAuthSessionChanged();
1993
2128
  return { success: true, workspaceSetupRequired: entry.workspaceSetupRequired === true };
1994
2129
  }
1995
2130
  catch {
1996
2131
  return { success: false, error: 'Sign in failed.' };
1997
2132
  }
1998
- }, [resolveCloudAuthUrl, cloudAuthConfigured, resolvePostAuthCloudEntry]);
2133
+ }, [resolveCloudAuthUrl, cloudAuthConfigured, currentWorkspaceIdRef, resolvePostAuthCloudEntry]);
1999
2134
  /**
2000
2135
  * Initiates an OAuth login (or invite-claim) flow by redirecting the browser
2001
2136
  * to the provider's authorisation URL via the server-side start route.
2002
2137
  *
2003
2138
  * @param provider - 'google' | 'github' | 'apple'
2004
2139
  * @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.
2140
+ * @param inviteToken - Optional invite token; when provided the flow uses `invite_claim` mode.
2006
2141
  */
2007
2142
  const beginOAuthLogin = useCallback((provider, returnTo, inviteToken) => {
2008
- const sanitizedReturnTo = returnTo && /^\/[A-Za-z0-9_\-./?=&%]*$/.test(returnTo)
2009
- ? returnTo
2010
- : '/';
2143
+ let sanitizedReturnTo = '/';
2144
+ try {
2145
+ const parsedReturnTo = new URL(String(returnTo || '/'), 'https://taskforce.local');
2146
+ if (parsedReturnTo.origin === 'https://taskforce.local'
2147
+ && String(returnTo || '/').startsWith('/')
2148
+ && !String(returnTo || '/').startsWith('//')) {
2149
+ sanitizedReturnTo = `${parsedReturnTo.pathname}${parsedReturnTo.search}${parsedReturnTo.hash}`;
2150
+ }
2151
+ }
2152
+ catch {
2153
+ sanitizedReturnTo = '/';
2154
+ }
2011
2155
  let path = `/api/taskforce/auth/oauth/${encodeURIComponent(provider)}/start?return_to=${encodeURIComponent(sanitizedReturnTo)}`;
2012
2156
  if (inviteToken) {
2013
2157
  path += `&invite_token=${encodeURIComponent(inviteToken)}`;
@@ -2407,7 +2551,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2407
2551
  if (!cloudAuthConfigured)
2408
2552
  return { success: false, error: 'Cloud auth not configured.' };
2409
2553
  try {
2410
- const res = await fetch(resolveCloudAuthUrl('/api/taskforce/account/login-methods'), {
2554
+ const res = await fetch(resolveCloudAuthUrl('/api/taskforce/auth/login-methods'), {
2411
2555
  credentials: 'include'
2412
2556
  });
2413
2557
  const data = await res.json().catch(() => ({}));
@@ -2424,7 +2568,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2424
2568
  if (!cloudAuthConfigured)
2425
2569
  return { success: false, error: 'Cloud auth not configured.' };
2426
2570
  try {
2427
- const res = await fetch(resolveCloudAuthUrl(`/api/taskforce/account/login-methods/${encodeURIComponent(provider)}`), {
2571
+ const res = await fetch(resolveCloudAuthUrl(`/api/taskforce/auth/login-methods/${encodeURIComponent(provider)}`), {
2428
2572
  method: 'DELETE',
2429
2573
  credentials: 'include'
2430
2574
  });
@@ -2442,7 +2586,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2442
2586
  if (!cloudAuthConfigured)
2443
2587
  return { success: false, error: 'Cloud auth not configured.' };
2444
2588
  try {
2445
- const res = await fetch(resolveCloudAuthUrl('/api/taskforce/account/login-methods/password'), {
2589
+ const res = await fetch(resolveCloudAuthUrl('/api/taskforce/auth/login-methods/password'), {
2446
2590
  method: 'POST',
2447
2591
  headers: { 'Content-Type': 'application/json' },
2448
2592
  credentials: 'include',
@@ -2458,6 +2602,28 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2458
2602
  return { success: false, error: 'Failed to add password.' };
2459
2603
  }
2460
2604
  }, [resolveCloudAuthUrl, cloudAuthConfigured]);
2605
+ const changePassword = useCallback(async (currentPassword, newPassword) => {
2606
+ if (!cloudAuthConfigured)
2607
+ return { success: false, error: 'Cloud auth not configured.' };
2608
+ try {
2609
+ const res = await fetch(resolveCloudAuthUrl('/api/taskforce/auth/password/change'), {
2610
+ method: 'POST',
2611
+ headers: { 'Content-Type': 'application/json' },
2612
+ credentials: 'include',
2613
+ body: JSON.stringify({ currentPassword, newPassword })
2614
+ });
2615
+ const data = await res.json().catch(() => ({}));
2616
+ if (!res.ok || !data?.success) {
2617
+ return { success: false, error: data?.error || 'Failed to change password.', code: data?.code };
2618
+ }
2619
+ await checkAuthSession({ force: true });
2620
+ dispatchTaskforceAuthSessionChanged();
2621
+ return { success: true };
2622
+ }
2623
+ catch {
2624
+ return { success: false, error: 'Failed to change password.' };
2625
+ }
2626
+ }, [resolveCloudAuthUrl, cloudAuthConfigured, checkAuthSession]);
2461
2627
  const beginOAuthLink = useCallback((provider, returnTo) => {
2462
2628
  const sanitizedReturnTo = returnTo && /^\/[A-Za-z0-9_\-./?=&%]*$/.test(returnTo)
2463
2629
  ? returnTo
@@ -2468,13 +2634,12 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2468
2634
  const resetCloudLogoutClientState = useCallback(() => {
2469
2635
  abortWorkspaceScopedRequests();
2470
2636
  referenceDataRequestRef.current = null;
2471
- lastLoadedUiStateKeyRef.current = '';
2472
2637
  lastAssigneeOptionsLoadKeyRef.current = '';
2473
2638
  lastConfigRefreshKeyRef.current = '';
2474
2639
  lastWorkspaceSyncStateLoadKeyRef.current = '';
2475
2640
  lastTaskSurfaceLoadKeyRef.current = '';
2476
2641
  lastSettingsSurfaceLoadKeyRef.current = '';
2477
- setUiStateReady(false);
2642
+ resetPersistedUiStateLoad({ clearLoaded: true });
2478
2643
  setReferenceDataLoaded(false);
2479
2644
  setAssigneeOptions(createDefaultAssigneeOptions());
2480
2645
  setAssigneeOptionsLoaded(false);
@@ -2484,16 +2649,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2484
2649
  setInitiatives([]);
2485
2650
  setWorkstreams([]);
2486
2651
  setPlanningBootstrapTaskSummaries([]);
2652
+ setPlanningLoadState(createInitialPlanningLoadState());
2487
2653
  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]);
2654
+ }, [abortWorkspaceScopedRequests, resetPersistedUiStateLoad, setArchivedTasks, setTasks]);
2497
2655
  const logout = useCallback(async () => {
2498
2656
  try {
2499
2657
  if (cloudAuthConfigured) {
@@ -2529,7 +2687,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2529
2687
  setSetupState(null);
2530
2688
  setBootstrapPhase('idle');
2531
2689
  setBootstrapError(null);
2532
- hasLoadedUiStateRef.current = false;
2690
+ resetPersistedUiStateLoad({ clearLoaded: true });
2533
2691
  if (runtimeMode !== 'local') {
2534
2692
  clearPersistedWorkspaceId(workspaceSelectionScope);
2535
2693
  }
@@ -2565,29 +2723,64 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2565
2723
  fetchTasks,
2566
2724
  resetCloudLogoutClientState
2567
2725
  ]);
2726
+ const initiativeTemplateOperationRef = useRef(null);
2727
+ const runInitiativeMutation = useCallback(async (url, init, operationIdOverride) => {
2728
+ if (!globalThis.crypto?.randomUUID)
2729
+ throw new Error('Secure initiative operation identity generation is unavailable.');
2730
+ const operationId = operationIdOverride || `operation-${globalThis.crypto.randomUUID()}`;
2731
+ const requestInit = {
2732
+ ...init,
2733
+ headers: { ...(init.headers || {}), 'x-taskforce-operation-id': operationId },
2734
+ };
2735
+ try {
2736
+ return await fetch(url, requestInit);
2737
+ }
2738
+ catch {
2739
+ return fetch(url, requestInit);
2740
+ }
2741
+ }, []);
2742
+ const workstreamHttpMutationClient = useMemo(() => createCloudWorkstreamHttpMutationClient(), []);
2568
2743
  const createInitiativeFromTemplate = useCallback(async (payload) => {
2569
2744
  try {
2570
- const res = await fetch('/api/taskforce/initiative-templates/create', {
2745
+ const requestBody = JSON.stringify(payload);
2746
+ if (initiativeTemplateOperationRef.current?.requestBody !== requestBody) {
2747
+ if (!globalThis.crypto?.randomUUID) {
2748
+ throw new Error('Secure initiative operation identity generation is unavailable.');
2749
+ }
2750
+ initiativeTemplateOperationRef.current = {
2751
+ requestBody,
2752
+ operationId: `operation-${globalThis.crypto.randomUUID()}`,
2753
+ };
2754
+ }
2755
+ const res = await runInitiativeMutation('/api/taskforce/initiative-templates/create', {
2571
2756
  method: 'POST',
2572
2757
  headers: { 'Content-Type': 'application/json' },
2573
- body: JSON.stringify(payload)
2574
- });
2758
+ body: requestBody
2759
+ }, initiativeTemplateOperationRef.current.operationId);
2575
2760
  const data = await res.json().catch(() => ({}));
2576
2761
  if (!res.ok || !data?.success) {
2577
2762
  return { success: false, error: data?.error || `Create failed (${res.status})` };
2578
2763
  }
2764
+ initiativeTemplateOperationRef.current = null;
2579
2765
  await fetchTasks(true);
2580
2766
  return { success: true, result: data?.results };
2581
2767
  }
2582
2768
  catch (error) {
2583
2769
  return { success: false, error: error.message };
2584
2770
  }
2585
- }, [fetchTasks]);
2771
+ }, [fetchTasks, runInitiativeMutation]);
2586
2772
  const createInitiative = useCallback(async (payload) => {
2587
- const res = await fetch('/api/taskforce/initiative', {
2773
+ if (!globalThis.crypto?.randomUUID)
2774
+ throw new Error('Secure initiative identity generation is unavailable.');
2775
+ const stablePayload = {
2776
+ ...(payload || {}),
2777
+ id: payload?.id || `initiative-${globalThis.crypto.randomUUID()}`,
2778
+ createdAt: payload?.createdAt || new Date().toISOString(),
2779
+ };
2780
+ const res = await runInitiativeMutation('/api/taskforce/initiative', {
2588
2781
  method: 'POST',
2589
2782
  headers: { 'Content-Type': 'application/json' },
2590
- body: JSON.stringify(payload || {})
2783
+ body: JSON.stringify(stablePayload)
2591
2784
  });
2592
2785
  const data = await res.json().catch(() => ({}));
2593
2786
  if (!res.ok) {
@@ -2596,9 +2789,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2596
2789
  await fetchPlanningEntities();
2597
2790
  setInitiatives((current) => upsertEntityById(current, data));
2598
2791
  return data;
2599
- }, [fetchPlanningEntities]);
2792
+ }, [fetchPlanningEntities, runInitiativeMutation]);
2600
2793
  const updateInitiative = useCallback(async (id, payload) => {
2601
- const res = await fetch(`/api/taskforce/initiative/${encodeURIComponent(id)}`, {
2794
+ const res = await runInitiativeMutation(`/api/taskforce/initiative/${encodeURIComponent(id)}`, {
2602
2795
  method: 'PATCH',
2603
2796
  headers: { 'Content-Type': 'application/json' },
2604
2797
  body: JSON.stringify(payload || {})
@@ -2610,12 +2803,12 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2610
2803
  await fetchPlanningEntities();
2611
2804
  setInitiatives((current) => upsertEntityById(current, data));
2612
2805
  return data;
2613
- }, [fetchPlanningEntities]);
2806
+ }, [fetchPlanningEntities, runInitiativeMutation]);
2614
2807
  const refreshPlanningEntitiesInBackground = useCallback(() => {
2615
2808
  void fetchPlanningEntities();
2616
2809
  }, [fetchPlanningEntities]);
2617
2810
  const archiveInitiative = useCallback(async (id) => {
2618
- const res = await fetch(`/api/taskforce/initiative/${encodeURIComponent(id)}/archive`, {
2811
+ const res = await runInitiativeMutation(`/api/taskforce/initiative/${encodeURIComponent(id)}/archive`, {
2619
2812
  method: 'POST',
2620
2813
  });
2621
2814
  const data = await res.json().catch(() => ({}));
@@ -2625,9 +2818,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2625
2818
  setInitiatives((current) => upsertEntityById(current, data));
2626
2819
  refreshPlanningEntitiesInBackground();
2627
2820
  return data;
2628
- }, [refreshPlanningEntitiesInBackground]);
2821
+ }, [refreshPlanningEntitiesInBackground, runInitiativeMutation]);
2629
2822
  const unarchiveInitiative = useCallback(async (id) => {
2630
- const res = await fetch(`/api/taskforce/initiative/${encodeURIComponent(id)}/unarchive`, {
2823
+ const res = await runInitiativeMutation(`/api/taskforce/initiative/${encodeURIComponent(id)}/unarchive`, {
2631
2824
  method: 'POST',
2632
2825
  });
2633
2826
  const data = await res.json().catch(() => ({}));
@@ -2637,59 +2830,149 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2637
2830
  setInitiatives((current) => upsertEntityById(current, data));
2638
2831
  refreshPlanningEntitiesInBackground();
2639
2832
  return data;
2640
- }, [refreshPlanningEntitiesInBackground]);
2833
+ }, [refreshPlanningEntitiesInBackground, runInitiativeMutation]);
2641
2834
  const createWorkstream = useCallback(async (payload) => {
2642
- const res = await fetch('/api/taskforce/workstream', {
2835
+ const attempt = await workstreamHttpMutationClient.prepareCreate(currentWorkspaceIdRef.current || 'default', (payload || {}));
2836
+ const res = await fetchWorkstreamHttpMutation('/api/taskforce/workstream', {
2643
2837
  method: 'POST',
2644
2838
  headers: { 'Content-Type': 'application/json' },
2645
- body: JSON.stringify(payload || {})
2646
- });
2839
+ body: JSON.stringify(attempt.body)
2840
+ }, attempt.operationId);
2841
+ const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
2647
2842
  const data = await res.json().catch(() => ({}));
2648
2843
  if (!res.ok) {
2649
- throw new Error(data?.error || `Failed to create workstream (${res.status})`);
2844
+ if (conclusiveRejection) {
2845
+ await workstreamHttpMutationClient.abandonCreate(attempt.fingerprint, attempt.operationId);
2846
+ }
2847
+ const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
2848
+ throw new Error(`${data?.error || `Failed to create workstream (${res.status})`}${retryGuidance}`);
2650
2849
  }
2850
+ if (data?.id !== attempt.body.id)
2851
+ throw new Error('Created workstream identity did not match the retained request identity.');
2852
+ await workstreamHttpMutationClient.confirmCreate(attempt.fingerprint, attempt.operationId);
2651
2853
  await fetchPlanningEntities();
2652
- setWorkstreams((current) => upsertEntityById(current, data));
2854
+ setWorkstreams((current) => {
2855
+ const created = selectCreatedWorkstreamAfterRefresh(current, data);
2856
+ return created ? upsertEntityById(current, created) : current;
2857
+ });
2653
2858
  return data;
2654
- }, [fetchPlanningEntities]);
2859
+ }, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient]);
2655
2860
  const updateWorkstream = useCallback(async (id, payload) => {
2656
- const res = await fetch(`/api/taskforce/workstream/${encodeURIComponent(id)}`, {
2861
+ const url = `/api/taskforce/workstream/${encodeURIComponent(id)}`;
2862
+ const body = (payload || {});
2863
+ const observed = workstreams.find((workstream) => workstream.id === id);
2864
+ const observedState = observed ? {
2865
+ updatedAt: observed.updatedAt || null,
2866
+ initiativeId: observed.initiativeId || null,
2867
+ ownerId: observed.ownerId || null,
2868
+ isArchived: Boolean(observed.isArchived),
2869
+ } : null;
2870
+ const attempt = await workstreamHttpMutationClient.prepareMutation(currentWorkspaceIdRef.current || 'default', url, body, observedState);
2871
+ const res = await fetchWorkstreamHttpMutation(url, {
2657
2872
  method: 'PATCH',
2658
2873
  headers: { 'Content-Type': 'application/json' },
2659
- body: JSON.stringify(payload || {})
2660
- });
2874
+ body: JSON.stringify(body)
2875
+ }, attempt.operationId);
2876
+ const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
2661
2877
  const data = await res.json().catch(() => ({}));
2662
2878
  if (!res.ok) {
2663
- throw new Error(data?.error || `Failed to update workstream (${res.status})`);
2879
+ if (conclusiveRejection) {
2880
+ await workstreamHttpMutationClient.abandonMutation(attempt.fingerprint, attempt.operationId);
2881
+ }
2882
+ const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
2883
+ throw new Error(`${data?.error || `Failed to update workstream (${res.status})`}${retryGuidance}`);
2664
2884
  }
2885
+ if (data?.id !== id)
2886
+ throw new Error('Updated workstream identity did not match the requested workstream.');
2887
+ await workstreamHttpMutationClient.confirmMutation(attempt.fingerprint, attempt.operationId);
2665
2888
  await fetchPlanningEntities();
2666
2889
  setWorkstreams((current) => upsertEntityById(current, data));
2667
2890
  return data;
2668
- }, [fetchPlanningEntities]);
2891
+ }, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient, workstreams]);
2892
+ const reorderWorkstreamTasks = useCallback(async (workstreamId, taskIds) => {
2893
+ const url = `/api/taskforce/workstream/${encodeURIComponent(workstreamId)}/task-order`;
2894
+ const body = { taskIds };
2895
+ const observed = workstreams.find((workstream) => workstream.id === workstreamId);
2896
+ const attempt = await workstreamHttpMutationClient.prepareMutation(currentWorkspaceIdRef.current || 'default', url, body, {
2897
+ updatedAt: observed?.updatedAt || null,
2898
+ workstreamId,
2899
+ });
2900
+ const res = await fetchWorkstreamHttpMutation(url, {
2901
+ method: 'POST',
2902
+ headers: { 'Content-Type': 'application/json' },
2903
+ body: JSON.stringify(body),
2904
+ }, attempt.operationId);
2905
+ const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
2906
+ const data = await res.json().catch(() => ({}));
2907
+ if (!res.ok) {
2908
+ if (conclusiveRejection) {
2909
+ await workstreamHttpMutationClient.abandonMutation(attempt.fingerprint, attempt.operationId);
2910
+ }
2911
+ const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
2912
+ throw new Error(`${data?.error || `Failed to reorder workstream tasks (${res.status})`}${retryGuidance}`);
2913
+ }
2914
+ if (data?.workstreamId !== workstreamId || !Array.isArray(data?.taskIds)) {
2915
+ throw new Error('Reordered workstream task response did not match the request.');
2916
+ }
2917
+ await workstreamHttpMutationClient.confirmMutation(attempt.fingerprint, attempt.operationId);
2918
+ const orderById = new Map(data.taskIds.map((taskId, index) => [taskId, (index + 1) * 1024]));
2919
+ setTasks((current) => current.map((task) => orderById.has(task.id)
2920
+ ? { ...task, workstreamOrder: orderById.get(task.id) }
2921
+ : task));
2922
+ await fetchPlanningEntities();
2923
+ }, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient, workstreams]);
2669
2924
  const archiveWorkstream = useCallback(async (id) => {
2670
- const res = await fetch(`/api/taskforce/workstream/${encodeURIComponent(id)}/archive`, {
2925
+ const url = `/api/taskforce/workstream/${encodeURIComponent(id)}/archive`;
2926
+ const observed = workstreams.find((workstream) => workstream.id === id);
2927
+ const attempt = await workstreamHttpMutationClient.prepareMutation(currentWorkspaceIdRef.current || 'default', url, {}, observed ? {
2928
+ updatedAt: observed.updatedAt || null,
2929
+ isArchived: Boolean(observed.isArchived),
2930
+ } : null);
2931
+ const res = await fetchWorkstreamHttpMutation(url, {
2671
2932
  method: 'POST',
2672
- });
2933
+ }, attempt.operationId);
2934
+ const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
2673
2935
  const data = await res.json().catch(() => ({}));
2674
2936
  if (!res.ok) {
2675
- throw new Error(data?.error || `Failed to archive workstream (${res.status})`);
2937
+ if (conclusiveRejection) {
2938
+ await workstreamHttpMutationClient.abandonMutation(attempt.fingerprint, attempt.operationId);
2939
+ }
2940
+ const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
2941
+ throw new Error(`${data?.error || `Failed to archive workstream (${res.status})`}${retryGuidance}`);
2676
2942
  }
2943
+ if (data?.id !== id)
2944
+ throw new Error('Archived workstream identity did not match the requested workstream.');
2945
+ await workstreamHttpMutationClient.confirmMutation(attempt.fingerprint, attempt.operationId);
2677
2946
  await fetchPlanningEntities();
2678
2947
  setWorkstreams((current) => upsertEntityById(current, data));
2679
2948
  return data;
2680
- }, [fetchPlanningEntities]);
2949
+ }, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient, workstreams]);
2681
2950
  const unarchiveWorkstream = useCallback(async (id) => {
2682
- const res = await fetch(`/api/taskforce/workstream/${encodeURIComponent(id)}/unarchive`, {
2951
+ const url = `/api/taskforce/workstream/${encodeURIComponent(id)}/unarchive`;
2952
+ const observed = workstreams.find((workstream) => workstream.id === id);
2953
+ const attempt = await workstreamHttpMutationClient.prepareMutation(currentWorkspaceIdRef.current || 'default', url, {}, observed ? {
2954
+ updatedAt: observed.updatedAt || null,
2955
+ isArchived: Boolean(observed.isArchived),
2956
+ } : null);
2957
+ const res = await fetchWorkstreamHttpMutation(url, {
2683
2958
  method: 'POST',
2684
- });
2959
+ }, attempt.operationId);
2960
+ const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
2685
2961
  const data = await res.json().catch(() => ({}));
2686
2962
  if (!res.ok) {
2687
- throw new Error(data?.error || `Failed to unarchive workstream (${res.status})`);
2963
+ if (conclusiveRejection) {
2964
+ await workstreamHttpMutationClient.abandonMutation(attempt.fingerprint, attempt.operationId);
2965
+ }
2966
+ const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
2967
+ throw new Error(`${data?.error || `Failed to unarchive workstream (${res.status})`}${retryGuidance}`);
2688
2968
  }
2969
+ if (data?.id !== id)
2970
+ throw new Error('Unarchived workstream identity did not match the requested workstream.');
2971
+ await workstreamHttpMutationClient.confirmMutation(attempt.fingerprint, attempt.operationId);
2689
2972
  await fetchPlanningEntities();
2690
2973
  setWorkstreams((current) => upsertEntityById(current, data));
2691
2974
  return data;
2692
- }, [fetchPlanningEntities]);
2975
+ }, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient, workstreams]);
2693
2976
  // Initialize auth once, then bootstrap protected data once auth gates are settled.
2694
2977
  const hasInitializedAuthRef = useRef(false);
2695
2978
  useEffect(() => {
@@ -2765,23 +3048,63 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2765
3048
  onTaskCountChange(tasks.length);
2766
3049
  }
2767
3050
  }, [tasks.length, onTaskCountChange]);
2768
- const handledInitialTaskIdRef = useRef(null);
2769
- // Deep linking handler
3051
+ const deepLinkRouteKey = useMemo(() => {
3052
+ const taskId = String(initialTaskId || '').trim();
3053
+ if (!taskId)
3054
+ return '';
3055
+ return [
3056
+ String(requestedWorkspaceId || '').trim(),
3057
+ taskId,
3058
+ String(initialActivityEntryId || '').trim()
3059
+ ].join(':');
3060
+ }, [initialActivityEntryId, initialTaskId, requestedWorkspaceId]);
3061
+ const deepLinkRouteKeyRef = useRef(deepLinkRouteKey);
3062
+ deepLinkRouteKeyRef.current = deepLinkRouteKey;
3063
+ const handledDeepLinkRouteKeyRef = useRef(null);
3064
+ const failedDeepLinkRouteKeyRef = useRef(null);
3065
+ const deepLinkWorkspaceSwitchRef = useRef(null);
3066
+ const deepLinkFailureNoticeOwnerKeyRef = useRef(null);
3067
+ const deepLinkCollectionLookupRef = useRef(null);
3068
+ const deepLinkArchiveSettledRef = useRef(new Set());
3069
+ const deepLinkDeletedSettledRef = useRef(new Set());
3070
+ const deepLinkRetryCountsRef = useRef(new Map());
3071
+ const deepLinkRetryTimerRef = useRef(null);
3072
+ const deepLinkWorkspaceSwitchRetryTimerRef = useRef(null);
3073
+ const [deepLinkRetryNonce, setDeepLinkRetryNonce] = useState(0);
2770
3074
  useEffect(() => {
2771
- if (!initialTaskId) {
2772
- handledInitialTaskIdRef.current = null;
2773
- return;
2774
- }
2775
- if (handledInitialTaskIdRef.current === initialTaskId || tasks.length === 0) {
2776
- return;
3075
+ const previousFailureNoticeOwnerKey = deepLinkFailureNoticeOwnerKeyRef.current;
3076
+ if (previousFailureNoticeOwnerKey
3077
+ && uiNoticeRef.current?.ownerKey === previousFailureNoticeOwnerKey) {
3078
+ clearNotice();
3079
+ }
3080
+ deepLinkFailureNoticeOwnerKeyRef.current = null;
3081
+ handledDeepLinkRouteKeyRef.current = null;
3082
+ failedDeepLinkRouteKeyRef.current = null;
3083
+ deepLinkWorkspaceSwitchRef.current = null;
3084
+ deepLinkCollectionLookupRef.current = null;
3085
+ deepLinkArchiveSettledRef.current.clear();
3086
+ deepLinkDeletedSettledRef.current.clear();
3087
+ deepLinkRetryCountsRef.current.clear();
3088
+ if (deepLinkRetryTimerRef.current !== null && typeof window !== 'undefined') {
3089
+ window.clearTimeout(deepLinkRetryTimerRef.current);
3090
+ deepLinkRetryTimerRef.current = null;
3091
+ }
3092
+ if (deepLinkWorkspaceSwitchRetryTimerRef.current !== null && typeof window !== 'undefined') {
3093
+ window.clearTimeout(deepLinkWorkspaceSwitchRetryTimerRef.current);
3094
+ deepLinkWorkspaceSwitchRetryTimerRef.current = null;
3095
+ }
3096
+ setDeepLinkRetryNonce((current) => current + 1);
3097
+ }, [clearNotice, deepLinkRouteKey]);
3098
+ useEffect(() => () => {
3099
+ if (deepLinkRetryTimerRef.current !== null && typeof window !== 'undefined') {
3100
+ window.clearTimeout(deepLinkRetryTimerRef.current);
3101
+ deepLinkRetryTimerRef.current = null;
3102
+ }
3103
+ if (deepLinkWorkspaceSwitchRetryTimerRef.current !== null && typeof window !== 'undefined') {
3104
+ window.clearTimeout(deepLinkWorkspaceSwitchRetryTimerRef.current);
3105
+ deepLinkWorkspaceSwitchRetryTimerRef.current = null;
2777
3106
  }
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');
2783
- }
2784
- }, [initialTaskId, tasks]);
3107
+ }, []);
2785
3108
  // Update active category logic
2786
3109
  const hasInitedCategoryRef = useRef(false);
2787
3110
  useEffect(() => {
@@ -2807,7 +3130,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2807
3130
  }, [configLoaded, activeCategories, category, getPreferredCategoryValue, lastUsedCategory]);
2808
3131
  // Sanitize tasks with invalid categories
2809
3132
  useEffect(() => {
2810
- if (!configLoaded || activeCategories.length === 0)
3133
+ if (!configLoaded || !referenceDataLoaded || activeCategories.length === 0)
2811
3134
  return;
2812
3135
  const needsSanitization = (t) => {
2813
3136
  return !activeCategories.some(c => c.value === t.category);
@@ -2824,31 +3147,38 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2824
3147
  setArchivedTasks(prev => prev.map(t => needsSanitization(t) ? { ...t, category: defaultCategory } : t));
2825
3148
  }
2826
3149
  }
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
- }, []);
3150
+ }, [configLoaded, referenceDataLoaded, activeCategories, tasks, archivedTasks, getPreferredCategoryValue]);
2840
3151
  // HMR Listener for Real-Time Updates
2841
3152
  useEffect(() => {
2842
3153
  if (import.meta.hot) {
2843
3154
  import.meta.hot.on('taskforce:update', () => {
2844
3155
  // console.log('[Taskforce] Received HMR update, refreshing data...');
2845
- void refreshTaskCollections({ isSilent: true });
3156
+ void refreshTaskCollections({ isSilent: true, highlightChangedTaskIds: [] });
2846
3157
  });
2847
3158
  }
2848
3159
  }, [refreshTaskCollections]);
2849
3160
  const refreshTaskCollectionsForDataVersion = useCallback(async () => {
2850
- await refreshTaskCollectionsFromInvalidation();
3161
+ await refreshTaskCollectionsFromInvalidation(createTaskInvalidationScope(['active', 'archive', 'deleted', 'planning'], { ambiguous: true }));
2851
3162
  }, [refreshTaskCollectionsFromInvalidation]);
3163
+ useEffect(() => {
3164
+ if (typeof window === 'undefined')
3165
+ return;
3166
+ const handleTaskforceTasksMutated = (event) => {
3167
+ const detail = event.detail;
3168
+ const eventWorkspaceId = String(detail?.workspaceId || '').trim() || 'default';
3169
+ if (eventWorkspaceId !== currentWorkspaceId)
3170
+ return;
3171
+ if (detail?.authoritativeTask)
3172
+ return;
3173
+ void refreshTaskCollectionsFromInvalidation(createTaskInvalidationScope(detail?.affectedCollections?.length
3174
+ ? detail.affectedCollections
3175
+ : ['active', 'archive'], { taskIds: detail?.taskId ? [detail.taskId] : [] }));
3176
+ };
3177
+ window.addEventListener(TASKFORCE_TASKS_MUTATED_EVENT, handleTaskforceTasksMutated);
3178
+ return () => {
3179
+ window.removeEventListener(TASKFORCE_TASKS_MUTATED_EVENT, handleTaskforceTasksMutated);
3180
+ };
3181
+ }, [currentWorkspaceId, refreshTaskCollectionsFromInvalidation]);
2852
3182
  const normalizedRealtimeWorkspaceId = String(currentWorkspaceId || '').trim();
2853
3183
  const normalizedRealtimeUserId = String(authUserId || '').trim();
2854
3184
  const realtimeSocketUrl = resolveWebSocketUrl('/taskforce-ws');
@@ -2861,23 +3191,35 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2861
3191
  && normalizedRealtimeWorkspaceId
2862
3192
  && !isReservedWorkspaceId(normalizedRealtimeWorkspaceId)
2863
3193
  && realtimeSocketUrl);
2864
- const handleCloudRealtimeSignal = useCallback(() => {
3194
+ useEffect(() => {
3195
+ return () => {
3196
+ if (ambiguousRealtimeConfirmationTimerRef.current !== null && typeof window !== 'undefined') {
3197
+ window.clearTimeout(ambiguousRealtimeConfirmationTimerRef.current);
3198
+ ambiguousRealtimeConfirmationTimerRef.current = null;
3199
+ }
3200
+ };
3201
+ }, [currentWorkspaceId]);
3202
+ const handleCloudRealtimeSignal = useCallback((signal) => {
2865
3203
  if (runtimeMode !== 'cloud')
2866
3204
  return;
2867
- void refreshTaskCollectionsFromInvalidation();
2868
- if (typeof window === 'undefined')
3205
+ dispatchTaskforceWorkspaceResourcesInvalidated({
3206
+ workspaceId: normalizedRealtimeWorkspaceId,
3207
+ source: 'realtime',
3208
+ });
3209
+ const scope = resolveRealtimeTaskInvalidation(signal.type, signal.invalidations);
3210
+ if (scope.collections.length === 0)
3211
+ return;
3212
+ void refreshTaskCollectionsFromInvalidation(scope);
3213
+ if (!scope.ambiguous || typeof window === 'undefined')
2869
3214
  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();
3215
+ if (ambiguousRealtimeConfirmationTimerRef.current !== null) {
3216
+ window.clearTimeout(ambiguousRealtimeConfirmationTimerRef.current);
3217
+ }
3218
+ ambiguousRealtimeConfirmationTimerRef.current = window.setTimeout(() => {
3219
+ ambiguousRealtimeConfirmationTimerRef.current = null;
3220
+ void refreshTaskCollectionsFromInvalidation(scope);
2879
3221
  }, 250);
2880
- }, [runtimeMode, refreshTaskCollectionsFromInvalidation]);
3222
+ }, [normalizedRealtimeWorkspaceId, runtimeMode, refreshTaskCollectionsFromInvalidation]);
2881
3223
  useRealtimeSync({
2882
3224
  enabled: cloudRealtimeEnabled,
2883
3225
  workspaceId: normalizedRealtimeWorkspaceId,
@@ -2887,6 +3229,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2887
3229
  });
2888
3230
  // Fallback sync for cross-process writes (e.g., MCP tools) that may miss watcher/websocket events.
2889
3231
  useDataVersionRefresh({
3232
+ workspaceId: currentWorkspaceId,
2890
3233
  isOpen,
2891
3234
  authBlocked,
2892
3235
  authRequiredForApi,
@@ -2897,7 +3240,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2897
3240
  authRequiredForApiRef,
2898
3241
  isAuthenticatedRef,
2899
3242
  dataVersionRef,
2900
- refreshTaskCollectionsForDataVersion
3243
+ refreshTaskCollectionsForDataVersion,
3244
+ coordinatorDataVersion: localCoordinatorDataVersion,
2901
3245
  });
2902
3246
  const relationshipTasks = useMemo(() => {
2903
3247
  const byId = new Map();
@@ -2922,21 +3266,31 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2922
3266
  return;
2923
3267
  if (activeTab === 'tasks') {
2924
3268
  const loadKey = `${currentWorkspaceId}:${activeTab}:${showArchive ? 'archive' : 'active'}:${taskScope}`;
3269
+ const requiresArchive = showArchive || taskScope === 'archived';
3270
+ const requiresDeleted = taskScope === 'deleted';
2925
3271
  if (!skippedInitialTaskTabRefreshRef.current) {
2926
3272
  skippedInitialTaskTabRefreshRef.current = true;
2927
3273
  lastTaskSurfaceLoadKeyRef.current = loadKey;
3274
+ if (requiresArchive) {
3275
+ void ensureArchiveHydrated(false);
3276
+ }
3277
+ if (requiresDeleted) {
3278
+ void ensureDeletedTasksHydrated(false);
3279
+ }
2928
3280
  return;
2929
3281
  }
2930
3282
  if (lastTaskSurfaceLoadKeyRef.current === loadKey)
2931
3283
  return;
2932
3284
  lastTaskSurfaceLoadKeyRef.current = loadKey;
2933
- fetchTasks();
3285
+ if (!requiresArchive && !requiresDeleted) {
3286
+ fetchTasks();
3287
+ }
2934
3288
  fetchPlanningEntities();
2935
- if (showArchive || taskScope === 'archived') {
2936
- fetchArchive(true);
3289
+ if (requiresArchive) {
3290
+ void ensureArchiveHydrated(false);
2937
3291
  }
2938
- if (taskScope === 'deleted') {
2939
- fetchDeletedTasks();
3292
+ if (requiresDeleted) {
3293
+ void ensureDeletedTasksHydrated(false);
2940
3294
  }
2941
3295
  return;
2942
3296
  }
@@ -2946,9 +3300,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2946
3300
  return;
2947
3301
  lastSettingsSurfaceLoadKeyRef.current = loadKey;
2948
3302
  fetchConfig();
2949
- if (settingsSection === 'commands' || settingsSection === 'resources') {
2950
- fetchWorkflows();
2951
- }
2952
3303
  }
2953
3304
  }, [
2954
3305
  currentWorkspaceId,
@@ -2959,10 +3310,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
2959
3310
  taskScope,
2960
3311
  fetchTasks,
2961
3312
  fetchPlanningEntities,
2962
- fetchArchive,
2963
- fetchDeletedTasks,
3313
+ ensureArchiveHydrated,
3314
+ ensureDeletedTasksHydrated,
2964
3315
  fetchConfig,
2965
- fetchWorkflows,
2966
3316
  shouldDeferProtectedApiCalls,
2967
3317
  shouldBlockProtectedApiCalls,
2968
3318
  workspaceBootstrapPending
@@ -3055,7 +3405,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3055
3405
  }
3056
3406
  setActiveTab__internal(tab);
3057
3407
  }, [activeTab]);
3058
- const flushAutoSaveRef = useRef(async () => { });
3408
+ const flushAutoSaveRef = useRef(async () => true);
3059
3409
  const { handleNavigation, handleClose, resetForm, resolveTaskIdInput, resolveWorkstreamIdInput, handleEdit, handleOpenTaskById, returnToPreviousTask, clearReturnToParentTask } = useTaskEditorNavigation({
3060
3410
  activeCategories,
3061
3411
  activeTypes,
@@ -3066,7 +3416,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3066
3416
  description,
3067
3417
  editingTaskId,
3068
3418
  flushPendingAutoSave: () => flushAutoSaveRef.current(),
3419
+ getDescriptionDraft,
3069
3420
  getPreferredCategoryValue,
3421
+ getTitleDraft,
3070
3422
  lastUsedCategory,
3071
3423
  newCommentText,
3072
3424
  relationshipTasks,
@@ -3074,7 +3426,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3074
3426
  showArchive,
3075
3427
  taxonomies,
3076
3428
  setActiveTab,
3077
- setApproach,
3078
3429
  setAssignee,
3079
3430
  setAttachments,
3080
3431
  setAttachmentsDirty,
@@ -3102,9 +3453,302 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3102
3453
  taskReturnTrail,
3103
3454
  title,
3104
3455
  });
3456
+ useEffect(() => {
3457
+ const normalizedTaskId = String(pendingOpenTaskId || '').trim();
3458
+ if (!uiStateReady || !normalizedTaskId)
3459
+ return;
3460
+ if (editingTaskId === normalizedTaskId) {
3461
+ setPendingOpenTaskId(null);
3462
+ return;
3463
+ }
3464
+ if (loadingTasks || workspaceBootstrapPending)
3465
+ return;
3466
+ const matchesTask = (task) => (task.id === normalizedTaskId || task.id.endsWith(normalizedTaskId));
3467
+ const target = relationshipTasks.find(matchesTask);
3468
+ if (target) {
3469
+ handleOpenTaskById(normalizedTaskId);
3470
+ setPendingOpenTaskId(null);
3471
+ return;
3472
+ }
3473
+ const workspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
3474
+ const archiveLookupKey = `${workspaceId}:${normalizedTaskId}`;
3475
+ if (archiveHydratedWorkspaceId !== workspaceId && !archiveLookupSettledKeys.has(archiveLookupKey)) {
3476
+ void ensureArchiveHydrated(true).finally(() => {
3477
+ const liveWorkspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
3478
+ if (liveWorkspaceId === workspaceId) {
3479
+ setArchiveLookupSettledKeys((current) => {
3480
+ if (current.has(archiveLookupKey))
3481
+ return current;
3482
+ return new Set(current).add(archiveLookupKey);
3483
+ });
3484
+ }
3485
+ });
3486
+ return;
3487
+ }
3488
+ const deletedTarget = deletedRelationshipTasks.find(matchesTask);
3489
+ if (deletedTarget) {
3490
+ handleEdit(deletedTarget);
3491
+ setPendingOpenTaskId(null);
3492
+ return;
3493
+ }
3494
+ if (deletedHydratedWorkspaceId !== workspaceId) {
3495
+ void ensureDeletedTasksHydrated(true);
3496
+ return;
3497
+ }
3498
+ setPendingOpenTaskId(null);
3499
+ }, [
3500
+ archiveHydratedWorkspaceId,
3501
+ archiveLookupSettledKeys,
3502
+ deletedHydratedWorkspaceId,
3503
+ deletedRelationshipTasks,
3504
+ editingTaskId,
3505
+ ensureArchiveHydrated,
3506
+ ensureDeletedTasksHydrated,
3507
+ handleEdit,
3508
+ handleOpenTaskById,
3509
+ loadingTasks,
3510
+ pendingOpenTaskId,
3511
+ relationshipTasks,
3512
+ uiStateReady,
3513
+ workspaceBootstrapPending
3514
+ ]);
3515
+ // Deep links are workspace-scoped. In cloud mode, switch to the explicit
3516
+ // workspace before looking up the task. Local runtimes never cross their
3517
+ // configured workspace boundary.
3518
+ useEffect(() => {
3519
+ const normalizedTaskId = String(initialTaskId || '').trim();
3520
+ if (!normalizedTaskId || !deepLinkRouteKey)
3521
+ return;
3522
+ if (handledDeepLinkRouteKeyRef.current === deepLinkRouteKey
3523
+ || !runtimeConfigReady
3524
+ || !configLoaded
3525
+ || !uiStateReady
3526
+ || loadingTasks
3527
+ || workspaceBootstrapPending) {
3528
+ return;
3529
+ }
3530
+ const explicitWorkspaceId = String(requestedWorkspaceId || '').trim();
3531
+ const activeWorkspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
3532
+ const clearOwnedFailureNotice = () => {
3533
+ const ownerKey = deepLinkFailureNoticeOwnerKeyRef.current;
3534
+ if (ownerKey && uiNoticeRef.current?.ownerKey === ownerKey) {
3535
+ clearNotice();
3536
+ }
3537
+ deepLinkFailureNoticeOwnerKeyRef.current = null;
3538
+ };
3539
+ if (explicitWorkspaceId && explicitWorkspaceId !== activeWorkspaceId) {
3540
+ if (failedDeepLinkRouteKeyRef.current === deepLinkRouteKey)
3541
+ return;
3542
+ if (runtimeMode !== 'cloud' || !workspaceSwitchingEnabled) {
3543
+ if (failedDeepLinkRouteKeyRef.current !== deepLinkRouteKey) {
3544
+ failedDeepLinkRouteKeyRef.current = deepLinkRouteKey;
3545
+ pushNotice('This task is unavailable or you do not have access to it.', 'info', 12_000);
3546
+ }
3547
+ return;
3548
+ }
3549
+ if (!authSessionResolved || !isAuthenticated || authBlocked)
3550
+ return;
3551
+ if (deepLinkWorkspaceSwitchRef.current === deepLinkRouteKey
3552
+ || deepLinkWorkspaceSwitchRetryTimerRef.current !== null) {
3553
+ return;
3554
+ }
3555
+ const routeKeyAtStart = deepLinkRouteKey;
3556
+ const switchRetryKey = `${routeKeyAtStart}:workspace`;
3557
+ deepLinkWorkspaceSwitchRef.current = routeKeyAtStart;
3558
+ void switchWorkspace(explicitWorkspaceId).then((result) => {
3559
+ if (deepLinkRouteKeyRef.current !== routeKeyAtStart)
3560
+ return;
3561
+ if (!result.success) {
3562
+ const attemptCount = (deepLinkRetryCountsRef.current.get(switchRetryKey) || 0) + 1;
3563
+ deepLinkRetryCountsRef.current.set(switchRetryKey, attemptCount);
3564
+ if (attemptCount < 2 && typeof window !== 'undefined') {
3565
+ deepLinkWorkspaceSwitchRetryTimerRef.current = window.setTimeout(() => {
3566
+ deepLinkWorkspaceSwitchRetryTimerRef.current = null;
3567
+ if (deepLinkRouteKeyRef.current === routeKeyAtStart) {
3568
+ setDeepLinkRetryNonce((current) => current + 1);
3569
+ }
3570
+ }, 500);
3571
+ return;
3572
+ }
3573
+ failedDeepLinkRouteKeyRef.current = routeKeyAtStart;
3574
+ const failureNoticeOwnerKey = `deep-link-workspace:${routeKeyAtStart}`;
3575
+ deepLinkFailureNoticeOwnerKeyRef.current = failureNoticeOwnerKey;
3576
+ pushNotice('This task is unavailable or you do not have access to it.', 'info', 12_000, {
3577
+ label: 'Retry',
3578
+ onAction: () => {
3579
+ if (deepLinkRouteKeyRef.current !== routeKeyAtStart)
3580
+ return;
3581
+ deepLinkFailureNoticeOwnerKeyRef.current = null;
3582
+ failedDeepLinkRouteKeyRef.current = null;
3583
+ deepLinkRetryCountsRef.current.delete(switchRetryKey);
3584
+ clearNotice();
3585
+ setDeepLinkRetryNonce((current) => current + 1);
3586
+ },
3587
+ ownerKey: failureNoticeOwnerKey
3588
+ });
3589
+ }
3590
+ }).finally(() => {
3591
+ if (deepLinkWorkspaceSwitchRef.current === routeKeyAtStart) {
3592
+ deepLinkWorkspaceSwitchRef.current = null;
3593
+ }
3594
+ });
3595
+ return;
3596
+ }
3597
+ const resolveTarget = (items) => {
3598
+ const exact = items.find((task) => task.id === normalizedTaskId);
3599
+ if (exact || explicitWorkspaceId)
3600
+ return exact;
3601
+ const legacySuffixMatches = items.filter((task) => task.id.endsWith(normalizedTaskId));
3602
+ return legacySuffixMatches.length === 1 ? legacySuffixMatches[0] : undefined;
3603
+ };
3604
+ const target = resolveTarget(relationshipTasks);
3605
+ if (target) {
3606
+ clearOwnedFailureNotice();
3607
+ handledDeepLinkRouteKeyRef.current = deepLinkRouteKey;
3608
+ failedDeepLinkRouteKeyRef.current = null;
3609
+ if (editingTaskId !== target.id) {
3610
+ if (target.isArchived)
3611
+ setShowArchive(true);
3612
+ handleEdit(target);
3613
+ }
3614
+ return;
3615
+ }
3616
+ const scheduleCollectionLookup = (collection, lookup, settledRoutes) => {
3617
+ const lookupKey = `${deepLinkRouteKey}:${collection}`;
3618
+ if (deepLinkCollectionLookupRef.current === lookupKey
3619
+ || deepLinkRetryTimerRef.current !== null) {
3620
+ return;
3621
+ }
3622
+ deepLinkCollectionLookupRef.current = lookupKey;
3623
+ const routeKeyAtStart = deepLinkRouteKey;
3624
+ void lookup().then((loaded) => {
3625
+ if (deepLinkRouteKeyRef.current !== routeKeyAtStart)
3626
+ return;
3627
+ if (loaded) {
3628
+ setDeepLinkRetryNonce((current) => current + 1);
3629
+ return;
3630
+ }
3631
+ const attemptCount = (deepLinkRetryCountsRef.current.get(lookupKey) || 0) + 1;
3632
+ deepLinkRetryCountsRef.current.set(lookupKey, attemptCount);
3633
+ if (attemptCount >= 2) {
3634
+ settledRoutes.add(routeKeyAtStart);
3635
+ setDeepLinkRetryNonce((current) => current + 1);
3636
+ return;
3637
+ }
3638
+ if (typeof window !== 'undefined') {
3639
+ deepLinkRetryTimerRef.current = window.setTimeout(() => {
3640
+ deepLinkRetryTimerRef.current = null;
3641
+ if (deepLinkRouteKeyRef.current === routeKeyAtStart) {
3642
+ setDeepLinkRetryNonce((current) => current + 1);
3643
+ }
3644
+ }, 500);
3645
+ }
3646
+ }).finally(() => {
3647
+ if (deepLinkCollectionLookupRef.current === lookupKey) {
3648
+ deepLinkCollectionLookupRef.current = null;
3649
+ }
3650
+ });
3651
+ };
3652
+ if (archiveHydratedWorkspaceId !== activeWorkspaceId
3653
+ && !deepLinkArchiveSettledRef.current.has(deepLinkRouteKey)) {
3654
+ scheduleCollectionLookup('archive', () => ensureArchiveHydrated(true), deepLinkArchiveSettledRef.current);
3655
+ return;
3656
+ }
3657
+ const deletedTarget = resolveTarget(deletedRelationshipTasks);
3658
+ if (deletedTarget) {
3659
+ clearOwnedFailureNotice();
3660
+ handledDeepLinkRouteKeyRef.current = deepLinkRouteKey;
3661
+ failedDeepLinkRouteKeyRef.current = null;
3662
+ handleEdit(deletedTarget);
3663
+ return;
3664
+ }
3665
+ if (deletedHydratedWorkspaceId !== activeWorkspaceId
3666
+ && !deepLinkDeletedSettledRef.current.has(deepLinkRouteKey)) {
3667
+ scheduleCollectionLookup('deleted', () => ensureDeletedTasksHydrated(true), deepLinkDeletedSettledRef.current);
3668
+ return;
3669
+ }
3670
+ if (failedDeepLinkRouteKeyRef.current !== deepLinkRouteKey) {
3671
+ failedDeepLinkRouteKeyRef.current = deepLinkRouteKey;
3672
+ pushNotice('This task is unavailable or you do not have access to it.', 'info', 12_000);
3673
+ }
3674
+ }, [
3675
+ archiveHydratedWorkspaceId,
3676
+ authBlocked,
3677
+ authSessionResolved,
3678
+ clearNotice,
3679
+ configLoaded,
3680
+ currentWorkspaceIdRef,
3681
+ deepLinkRetryNonce,
3682
+ deepLinkRouteKey,
3683
+ deletedHydratedWorkspaceId,
3684
+ deletedRelationshipTasks,
3685
+ editingTaskId,
3686
+ ensureArchiveHydrated,
3687
+ ensureDeletedTasksHydrated,
3688
+ handleEdit,
3689
+ initialTaskId,
3690
+ isAuthenticated,
3691
+ loadingTasks,
3692
+ pushNotice,
3693
+ relationshipTasks,
3694
+ requestedWorkspaceId,
3695
+ runtimeConfigReady,
3696
+ runtimeMode,
3697
+ setShowArchive,
3698
+ switchWorkspace,
3699
+ uiStateReady,
3700
+ workspaceBootstrapPending,
3701
+ workspaceSwitchingEnabled
3702
+ ]);
3105
3703
  // === SECTION: Task CRUD ===
3106
3704
  // 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({
3705
+ const mutateTaskMetadata = useDurableTaskMetadataMutation({
3706
+ enabled: runtimeConfigOverride.syncV3TaskMetadataActivation
3707
+ && runtimeMode === 'local',
3708
+ workspaceId: currentWorkspaceId,
3709
+ isAuthenticated,
3710
+ dispatchEnabled: workspaceCloudSyncEnabled,
3711
+ });
3712
+ const createTaskDurably = useDurableTaskCreateMutation({
3713
+ localRuntime: runtimeMode === 'local',
3714
+ enabled: runtimeConfigOverride.syncV3TaskCreateActivation
3715
+ && runtimeMode === 'local',
3716
+ workspaceId: currentWorkspaceId,
3717
+ isAuthenticated,
3718
+ dispatchEnabled: workspaceCloudSyncEnabled,
3719
+ });
3720
+ const taskStatusActivationEnabled = runtimeConfigOverride.syncV3TaskStatusActivation
3721
+ && runtimeMode === 'local';
3722
+ const mutateTaskStatus = useDurableTaskStatusMutation({
3723
+ enabled: taskStatusActivationEnabled,
3724
+ workspaceId: currentWorkspaceId,
3725
+ isAuthenticated,
3726
+ dispatchEnabled: workspaceCloudSyncEnabled,
3727
+ });
3728
+ const mutateTaskLifecycle = useDurableTaskLifecycleMutation({
3729
+ // Always probe the local durable lifecycle boundary. The route returns
3730
+ // an explicit disabled result for v2-owned workspaces, but persisted
3731
+ // v3 ownership must survive a process restart with incomplete flags.
3732
+ enabled: runtimeMode === 'local',
3733
+ workspaceId: currentWorkspaceId,
3734
+ isAuthenticated,
3735
+ dispatchEnabled: workspaceCloudSyncEnabled,
3736
+ });
3737
+ const taskDeleteActivationEnabled = runtimeConfigOverride.syncV3TaskDeleteActivation
3738
+ && runtimeMode === 'local';
3739
+ const mutateTaskDelete = useDurableTaskDeleteMutation({
3740
+ enabled: taskDeleteActivationEnabled,
3741
+ workspaceId: currentWorkspaceId,
3742
+ isAuthenticated,
3743
+ dispatchEnabled: workspaceCloudSyncEnabled,
3744
+ });
3745
+ const mutateTaskRestore = useDurableTaskRestoreMutation({
3746
+ enabled: taskDeleteActivationEnabled,
3747
+ workspaceId: currentWorkspaceId,
3748
+ isAuthenticated,
3749
+ dispatchEnabled: workspaceCloudSyncEnabled,
3750
+ });
3751
+ const { copiedId, handleDelete, handleUpdateTask, handleSetStatus, handleToggleComplete, handleToggleCancel, handleToggleInProgress, handleToggleReview, handleArchiveTask, handleBulkArchive, handleUnarchive, handleRestoreDeletedTask, handleRestoreSelectedDeletedTasks, handlePermanentlyDeleteDeletedTask, handleEmptyDeletedTasks, handleCopyId, queueWorkspaceSyncFromAuthoritativeTaskState, } = useTaskActions({
3108
3752
  tasks,
3109
3753
  archivedTasks,
3110
3754
  editingTaskId,
@@ -3115,8 +3759,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3115
3759
  resetForm,
3116
3760
  setActiveTab,
3117
3761
  fetchTasks,
3118
- fetchArchive,
3119
- fetchDeletedTasks,
3762
+ fetchArchive: refreshArchiveIfHydrated,
3763
+ fetchDeletedTasks: refreshDeletedTasksIfHydrated,
3120
3764
  mergeTaskFromServer,
3121
3765
  pushNotice,
3122
3766
  cloudAuthConfigured,
@@ -3128,12 +3772,22 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3128
3772
  workspacePendingSignatureRef,
3129
3773
  workspaceDeletedTaskIdsRef,
3130
3774
  workspaceDeletedTaskWatermarksRef,
3775
+ mutateTaskMetadata,
3776
+ mutateTaskStatus,
3777
+ mutateTaskLifecycle,
3778
+ mutateTaskDelete,
3779
+ mutateTaskRestore,
3780
+ durableTaskMetadataActivationEnabled: runtimeConfigOverride.syncV3TaskMetadataActivation
3781
+ && runtimeMode === 'local',
3782
+ durableTaskStatusActivationEnabled: taskStatusActivationEnabled,
3783
+ durableTaskDeleteActivationEnabled: taskDeleteActivationEnabled,
3784
+ durableTaskHttpRootActivationEnabled: runtimeConfigOverride.syncV3TaskCloudHttpRootActivation,
3785
+ workspaceId: currentWorkspaceId,
3131
3786
  });
3132
3787
  const { autoSaveState, flushAutoSave, scheduleWarningPrompt, handleSubmit, confirmScheduleWarning, cancelScheduleWarning, handleAddComment } = useTaskFormActions({
3133
3788
  activeCategories,
3134
3789
  activeTab,
3135
3790
  apiEndpoint,
3136
- approach,
3137
3791
  assignee,
3138
3792
  attachments,
3139
3793
  attachmentsDirty,
@@ -3143,16 +3797,24 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3143
3797
  complexity,
3144
3798
  description,
3145
3799
  dueDate,
3800
+ createTaskDurably,
3801
+ durableTaskHttpRootActivationEnabled: runtimeConfigOverride.syncV3TaskCloudHttpRootActivation,
3802
+ workspaceId: currentWorkspaceId,
3803
+ updateTask: handleUpdateTask,
3146
3804
  editingTaskId,
3147
3805
  fetchTasks,
3148
3806
  formTaxonomies,
3807
+ getDescriptionDraft,
3149
3808
  getPreferredCategoryValue,
3809
+ getTitleDraft,
3150
3810
  mergeTaskFromServer,
3811
+ onTaskCreated: handleEdit,
3151
3812
  workstreamInput,
3152
3813
  priority,
3153
3814
  pushNotice,
3154
3815
  queueWorkspaceSyncFromAuthoritativeTaskState,
3155
3816
  relationshipTasks,
3817
+ supplementalTasks: deletedRelationshipTasks,
3156
3818
  resetForm,
3157
3819
  resolveWorkstreamIdInput,
3158
3820
  scheduledDate,
@@ -3166,6 +3828,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3166
3828
  status,
3167
3829
  title,
3168
3830
  taxonomies,
3831
+ textDraftOccupied,
3169
3832
  type
3170
3833
  });
3171
3834
  useEffect(() => {
@@ -3173,21 +3836,24 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3173
3836
  }, [flushAutoSave]);
3174
3837
  const { handleSetWorkstreamForCurrentTask, } = useTaskRelationships({
3175
3838
  editingTaskId,
3176
- mergeTaskFromServer,
3177
3839
  workstreamInput,
3178
3840
  pushNotice,
3179
- queueWorkspaceSyncFromAuthoritativeTaskState,
3180
3841
  relationshipTasks,
3181
3842
  resolveWorkstreamIdInput,
3182
3843
  setError,
3183
- fetchTasks
3844
+ updateTask: handleUpdateTask
3184
3845
  });
3185
3846
  const { currentTask, currentTaskWorkstream, currentTaskInitiative, } = useCurrentTaskRelations({
3186
3847
  editingTaskId,
3187
3848
  relationshipTasks,
3188
3849
  initiatives,
3189
3850
  workstreams,
3851
+ workstreamInput,
3852
+ resolveWorkstreamIdInput,
3190
3853
  supplementalTasks: deletedRelationshipTasks,
3854
+ assignee,
3855
+ setAssignee,
3856
+ setChecklistItems,
3191
3857
  setComments
3192
3858
  });
3193
3859
  const settingsModel = useSettingsModel({
@@ -3211,12 +3877,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3211
3877
  manualComplexityEnabled,
3212
3878
  checklistDropdownEnabled,
3213
3879
  showTaskCardStatusLabel,
3214
- exportWorkflowsPath,
3215
- exportingResource,
3216
- exportResult,
3217
3880
  pathSaved,
3218
3881
  settingsSection,
3219
- exportEnvironment,
3220
3882
  setupState,
3221
3883
  buildInfo,
3222
3884
  saveSetupMode,
@@ -3234,19 +3896,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3234
3896
  handleShowTaskCardStatusLabelChange,
3235
3897
  handleResetProjectToGlobal,
3236
3898
  handleSaveSettings,
3237
- setExportWorkflowsPath,
3238
- setExportEnvironment,
3239
- availableWorkflows,
3240
3899
  initiativeTemplates,
3241
- availableEnvironments,
3242
- fetchWorkflows,
3243
3900
  fetchInitiativeTemplates,
3244
3901
  createInitiativeFromTemplate,
3245
- fetchWorkflowTemplate,
3246
- fetchWorkflowOverrideNames,
3247
- saveWorkflowTemplateDraft,
3248
- resetWorkflowTemplateDraft,
3249
- handleExportWorkflows,
3250
3902
  setShowFolderBrowser,
3251
3903
  setBrowserTarget,
3252
3904
  fetchFolders,
@@ -3403,6 +4055,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3403
4055
  workspaceSyncRecommendedAction,
3404
4056
  workspaceSyncBusy,
3405
4057
  workspaceSyncPendingChanges,
4058
+ localCoordinatorStatus,
4059
+ transferLocalCoordinatorOwnership,
3406
4060
  retryUserGlobalSettingsSync,
3407
4061
  retryWorkspaceCloudSync,
3408
4062
  resetWorkspaceSyncCursorAndPull,
@@ -3439,6 +4093,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3439
4093
  fetchLoginMethods,
3440
4094
  unlinkLoginMethod,
3441
4095
  addPasswordToAccount,
4096
+ changePassword,
3442
4097
  beginOAuthLink,
3443
4098
  registerWithCredentials,
3444
4099
  updateCurrentUserProfile,
@@ -3470,15 +4125,17 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3470
4125
  tasks,
3471
4126
  loadingTasks,
3472
4127
  archivedTasks,
4128
+ archiveHydratedWorkspaceId,
3473
4129
  initiatives,
3474
4130
  workstreams,
3475
4131
  planningBootstrapTaskSummaries,
4132
+ planningLoadState,
4133
+ workspaceTaskRelationships,
3476
4134
  deletedTasks,
3477
4135
  activeCategories,
3478
4136
  activeTypes,
3479
4137
  priorities,
3480
4138
  taxonomyDisplayLabels,
3481
- approaches,
3482
4139
  taxonomies,
3483
4140
  // Filtering
3484
4141
  searchQuery,
@@ -3505,6 +4162,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3505
4162
  setShowArchive,
3506
4163
  taskScope,
3507
4164
  setTaskScope,
4165
+ compressedCards,
4166
+ setCompressedCards,
3508
4167
  clearFilters,
3509
4168
  filteredTasks,
3510
4169
  searchAgnosticTasks,
@@ -3515,8 +4174,10 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3515
4174
  // Actions
3516
4175
  fetchTasks,
3517
4176
  fetchArchive,
4177
+ ensureArchiveHydrated,
3518
4178
  fetchDeletedTasks,
3519
4179
  fetchPlanningEntities,
4180
+ fetchPlanningEntityDetail,
3520
4181
  fetchAssigneeOptions,
3521
4182
  createInitiative,
3522
4183
  updateInitiative,
@@ -3526,6 +4187,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3526
4187
  updateWorkstream,
3527
4188
  archiveWorkstream,
3528
4189
  unarchiveWorkstream,
4190
+ reorderWorkstreamTasks,
3529
4191
  handleEdit,
3530
4192
  handleDelete,
3531
4193
  handleCopyId,
@@ -3537,17 +4199,22 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3537
4199
  handleBulkArchive,
3538
4200
  handleUnarchive,
3539
4201
  handleRestoreDeletedTask,
4202
+ handleRestoreSelectedDeletedTasks,
3540
4203
  handlePermanentlyDeleteDeletedTask,
3541
4204
  handleEmptyDeletedTasks,
3542
4205
  handleUpdateTask,
4206
+ handleSetStatus,
3543
4207
  // Form State
3544
4208
  editingTaskId,
3545
4209
  loading,
3546
4210
  error,
4211
+ clearTaskError,
3547
4212
  title,
3548
4213
  setTitle,
4214
+ setTitleDraft,
3549
4215
  description,
3550
4216
  setDescription,
4217
+ setDescriptionDraft,
3551
4218
  checklistItems,
3552
4219
  setChecklistItems,
3553
4220
  category,
@@ -3560,8 +4227,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3560
4227
  setComplexity,
3561
4228
  status,
3562
4229
  setStatus,
3563
- approach,
3564
- setApproach,
3565
4230
  assignee,
3566
4231
  setAssignee,
3567
4232
  scheduledDate,
@@ -3583,10 +4248,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3583
4248
  setDescriptionFocused,
3584
4249
  showMarkdownHelp,
3585
4250
  setShowMarkdownHelp,
3586
- showChecklist,
3587
- setShowChecklist,
3588
- showComments,
3589
- setShowComments,
3590
4251
  isCapturingScreenshot,
3591
4252
  setIsCapturingScreenshot,
3592
4253
  // Form Actions
@@ -3618,13 +4279,13 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3618
4279
  cancelScheduleWarning,
3619
4280
  tasksScrollRef,
3620
4281
  setTasksScrollPos, // Export if needed
3621
- // Export
3622
- exportEnvironment,
3623
- setExportEnvironment,
3624
- exportWorkflowsPath,
3625
- setExportWorkflowsPath,
3626
- exportResult,
3627
- exportingResource,
4282
+ taskforceAgentId,
4283
+ setTaskforceAgentId,
4284
+ taskforceAgentConversationId,
4285
+ setTaskforceAgentConversationId,
4286
+ taskforceAgentConversationByAgentId,
4287
+ setTaskforceAgentConversationByAgentId,
4288
+ uiStateReady,
3628
4289
  // Categories & Types & Taxonomies mgmt
3629
4290
  handleUpdateCategory,
3630
4291
  handleRemoveCategory,
@@ -3652,17 +4313,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
3652
4313
  currentTask,
3653
4314
  currentTaskWorkstream,
3654
4315
  currentTaskInitiative,
3655
- availableWorkflows,
3656
4316
  initiativeTemplates,
3657
- availableEnvironments,
3658
- fetchWorkflows,
3659
4317
  fetchInitiativeTemplates,
3660
4318
  createInitiativeFromTemplate,
3661
- fetchWorkflowTemplate,
3662
- fetchWorkflowOverrideNames,
3663
- saveWorkflowTemplateDraft,
3664
- resetWorkflowTemplateDraft,
3665
- onExportWorkflows: handleExportWorkflows,
3666
4319
  settingsModel
3667
4320
  };
3668
4321
  }