@taskforcehq/taskforce 0.3.326 → 0.3.328

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1382) hide show
  1. package/LICENSE.md +68 -0
  2. package/README.md +19 -0
  3. package/dist/Taskforce.module.css +2168 -585
  4. package/dist/TaskforceCore.d.ts +1 -0
  5. package/dist/TaskforceCore.js +65 -22
  6. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.d.ts +1 -0
  7. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.js +3 -2
  8. package/dist/annotatedAttachments/commandService.d.ts +68 -0
  9. package/dist/annotatedAttachments/commandService.js +348 -0
  10. package/dist/annotatedAttachments/service.d.ts +2 -0
  11. package/dist/annotatedAttachments/service.js +13 -12
  12. package/dist/cli.js +158 -9
  13. package/dist/cliOpenPort.d.ts +1 -0
  14. package/dist/cliOpenPort.js +4 -0
  15. package/dist/compat/taskforceAgentDefinitionCompat.d.ts +12 -0
  16. package/dist/compat/taskforceAgentDefinitionCompat.js +25 -0
  17. package/dist/compat/workspaceSyncCompat.js +6 -2
  18. package/dist/compat/workspaceSyncV3CombinedCoverageCompat.d.ts +6 -0
  19. package/dist/compat/workspaceSyncV3CombinedCoverageCompat.js +22 -0
  20. package/dist/compat/workspaceSyncV3OperationCompat.d.ts +7 -0
  21. package/dist/compat/workspaceSyncV3OperationCompat.js +30 -0
  22. package/dist/components/activity/EntityActivityTimeline.d.ts +10 -2
  23. package/dist/components/activity/EntityActivityTimeline.js +83 -35
  24. package/dist/components/context/AttachmentPreviewHost.d.ts +6 -0
  25. package/dist/components/context/AttachmentPreviewHost.js +222 -0
  26. package/dist/components/context/ContextAttachmentManager.d.ts +7 -0
  27. package/dist/components/context/ContextAttachmentManager.js +514 -208
  28. package/dist/components/features/AiProfilesModule.d.ts +24 -0
  29. package/dist/components/features/AiProfilesModule.js +744 -0
  30. package/dist/components/features/AnnotatedAttachmentWorkspace.d.ts +4 -1
  31. package/dist/components/features/AnnotatedAttachmentWorkspace.js +351 -79
  32. package/dist/components/features/DocumentGenerateModal.js +23 -5
  33. package/dist/components/features/DocumentIndex.d.ts +19 -1
  34. package/dist/components/features/DocumentIndex.js +104 -15
  35. package/dist/components/features/DocumentViewer.d.ts +9 -1
  36. package/dist/components/features/DocumentViewer.js +721 -100
  37. package/dist/components/features/DocumentWorkspace.d.ts +37 -2
  38. package/dist/components/features/DocumentWorkspace.js +21 -6
  39. package/dist/components/features/TaskSettings.d.ts +6 -27
  40. package/dist/components/features/TaskSettings.js +232 -143
  41. package/dist/components/features/TaskforceAgentsModule.d.ts +36 -0
  42. package/dist/components/features/TaskforceAgentsModule.js +1782 -0
  43. package/dist/components/features/agentBehavior/AgentBehaviorManagerShared.d.ts +94 -0
  44. package/dist/components/features/agentBehavior/AgentBehaviorManagerShared.js +70 -0
  45. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +65 -0
  46. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.js +115 -0
  47. package/dist/components/features/agentRoles/RoleManagerPanel.d.ts +4 -0
  48. package/dist/components/features/agentRoles/RoleManagerPanel.js +382 -0
  49. package/dist/components/features/agentSkills/SkillManagerPanel.d.ts +5 -0
  50. package/dist/components/features/agentSkills/SkillManagerPanel.js +355 -0
  51. package/dist/components/features/documentWorkspaceModel.d.ts +16 -4
  52. package/dist/components/features/documentWorkspaceModel.js +30 -5
  53. package/dist/components/features/planning/PlanningArchiveConfirmation.d.ts +9 -0
  54. package/dist/components/features/planning/PlanningArchiveConfirmation.js +19 -0
  55. package/dist/components/features/planning/PlanningCardIdentity.d.ts +12 -0
  56. package/dist/components/features/planning/PlanningCardIdentity.js +44 -0
  57. package/dist/components/features/planning/PlanningEntityDetails.d.ts +36 -0
  58. package/dist/components/features/planning/PlanningEntityDetails.js +131 -0
  59. package/dist/components/features/planning/PlanningEntitySummary.d.ts +46 -0
  60. package/dist/components/features/planning/PlanningEntitySummary.js +98 -0
  61. package/dist/components/features/planning/PlanningLinkPicker.d.ts +11 -0
  62. package/dist/components/features/planning/PlanningLinkPicker.js +28 -0
  63. package/dist/components/features/planning/PlanningModule.d.ts +6 -0
  64. package/dist/components/features/planning/PlanningModule.js +588 -0
  65. package/dist/components/features/planning/PlanningOwnerDropdown.d.ts +27 -0
  66. package/dist/components/features/planning/PlanningOwnerDropdown.js +80 -0
  67. package/dist/components/features/planning/PlanningTaskArrangeControl.d.ts +5 -0
  68. package/dist/components/features/planning/PlanningTaskArrangeControl.js +11 -0
  69. package/dist/components/features/planning/PlanningTaskCard.d.ts +20 -0
  70. package/dist/components/features/planning/PlanningTaskCard.js +26 -0
  71. package/dist/components/features/planning/PlanningTaskOrderList.d.ts +10 -0
  72. package/dist/components/features/planning/PlanningTaskOrderList.js +52 -0
  73. package/dist/components/features/planning/PlanningUnlinkConfirmation.d.ts +15 -0
  74. package/dist/components/features/planning/PlanningUnlinkConfirmation.js +7 -0
  75. package/dist/components/features/planning/PlanningVisualIdentity.d.ts +14 -0
  76. package/dist/components/features/planning/PlanningVisualIdentity.js +106 -0
  77. package/dist/components/features/planning/planningCreateIntent.d.ts +10 -0
  78. package/dist/components/features/planning/planningCreateIntent.js +16 -0
  79. package/dist/components/features/planning/planningNavigator.d.ts +33 -0
  80. package/dist/components/features/planning/planningNavigator.js +96 -0
  81. package/dist/components/features/planning/planningTaskArrangement.d.ts +18 -0
  82. package/dist/components/features/planning/planningTaskArrangement.js +106 -0
  83. package/dist/components/features/planning/planningWorkspaceModel.d.ts +132 -0
  84. package/dist/components/features/planning/planningWorkspaceModel.js +5 -0
  85. package/dist/components/features/settings/CategoryManager.js +2 -2
  86. package/dist/components/features/settings/TaxonomyEditor.js +1 -1
  87. package/dist/components/features/settings/TaxonomyManager.js +1 -1
  88. package/dist/components/features/settings/TypeManager.js +1 -1
  89. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.d.ts +10 -0
  90. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +175 -0
  91. package/dist/components/features/taskforceAgentAssignments/agentBehaviorCatalogApi.d.ts +27 -0
  92. package/dist/components/features/taskforceAgentAssignments/agentBehaviorCatalogApi.js +24 -0
  93. package/dist/components/features/taskforceAgentEditorModel.d.ts +109 -0
  94. package/dist/components/features/taskforceAgentEditorModel.js +145 -0
  95. package/dist/components/features/useDocumentWorkspaceController.d.ts +20 -1
  96. package/dist/components/features/useDocumentWorkspaceController.js +106 -21
  97. package/dist/components/features/workflowManager/WorkflowManagerModule.d.ts +11 -0
  98. package/dist/components/features/workflowManager/WorkflowManagerModule.js +313 -0
  99. package/dist/components/features/workflowManager/WorkflowPublishDialog.d.ts +11 -0
  100. package/dist/components/features/workflowManager/WorkflowPublishDialog.js +8 -0
  101. package/dist/components/features/workflowManager/types.d.ts +74 -0
  102. package/dist/components/features/workflowManager/types.js +1 -0
  103. package/dist/components/features/workflowManager/useWorkflowManager.d.ts +30 -0
  104. package/dist/components/features/workflowManager/useWorkflowManager.js +213 -0
  105. package/dist/components/features/workflowManager/workflowManagerApi.d.ts +52 -0
  106. package/dist/components/features/workflowManager/workflowManagerApi.js +142 -0
  107. package/dist/components/task/TaskActionHeader.d.ts +7 -3
  108. package/dist/components/task/TaskActionHeader.js +46 -53
  109. package/dist/components/task/TaskCard.d.ts +10 -2
  110. package/dist/components/task/TaskCard.js +138 -56
  111. package/dist/components/task/TaskContextUpload.d.ts +4 -0
  112. package/dist/components/task/TaskContextUpload.js +3 -2
  113. package/dist/components/task/TaskForm.d.ts +16 -17
  114. package/dist/components/task/TaskForm.js +569 -199
  115. package/dist/components/task/TaskImageReviews.d.ts +8 -0
  116. package/dist/components/task/TaskImageReviews.js +47 -0
  117. package/dist/components/task/TaskKanban.d.ts +9 -10
  118. package/dist/components/task/TaskKanban.js +70 -18
  119. package/dist/components/task/TaskList.d.ts +9 -8
  120. package/dist/components/task/TaskList.js +46 -32
  121. package/dist/components/task/TaskReferenceBadge.d.ts +2 -1
  122. package/dist/components/task/TaskReferenceBadge.js +3 -2
  123. package/dist/components/task/TaskStatusActions.d.ts +3 -1
  124. package/dist/components/task/TaskStatusActions.js +27 -7
  125. package/dist/components/task/TaskWorkflowAssignmentField.d.ts +18 -0
  126. package/dist/components/task/TaskWorkflowAssignmentField.js +362 -0
  127. package/dist/components/task/TaskWorkstreamPicker.d.ts +8 -0
  128. package/dist/components/task/TaskWorkstreamPicker.js +25 -0
  129. package/dist/components/task/TrashRestoreControls.d.ts +18 -0
  130. package/dist/components/task/TrashRestoreControls.js +71 -0
  131. package/dist/components/ui/AiIdentityRosterCard.d.ts +20 -0
  132. package/dist/components/ui/AiIdentityRosterCard.js +5 -0
  133. package/dist/components/ui/AssetTraySortControl.d.ts +10 -0
  134. package/dist/components/ui/AssetTraySortControl.js +38 -0
  135. package/dist/components/ui/AssigneeIdentity.d.ts +12 -0
  136. package/dist/components/ui/AssigneeIdentity.js +41 -0
  137. package/dist/components/ui/DiscardChangesDialog.d.ts +10 -0
  138. package/dist/components/ui/DiscardChangesDialog.js +7 -0
  139. package/dist/components/ui/DisclosureSectionHeader.d.ts +4 -1
  140. package/dist/components/ui/DisclosureSectionHeader.js +2 -2
  141. package/dist/components/ui/DocumentTypeIcon.d.ts +7 -0
  142. package/dist/components/ui/DocumentTypeIcon.js +8 -0
  143. package/dist/components/ui/EditableAvatarButton.d.ts +6 -1
  144. package/dist/components/ui/EditableAvatarButton.js +6 -5
  145. package/dist/components/ui/HierarchyActionBadge.d.ts +2 -1
  146. package/dist/components/ui/HierarchyActionBadge.js +2 -2
  147. package/dist/components/ui/Markdown.d.ts +13 -3
  148. package/dist/components/ui/Markdown.fixture.d.ts +1 -0
  149. package/dist/components/ui/Markdown.fixture.js +23 -0
  150. package/dist/components/ui/Markdown.js +158 -68
  151. package/dist/components/ui/Modal.d.ts +3 -1
  152. package/dist/components/ui/Modal.js +85 -19
  153. package/dist/components/ui/MultiSelectFilter.d.ts +9 -2
  154. package/dist/components/ui/MultiSelectFilter.js +26 -5
  155. package/dist/components/ui/ReferenceBadgeButton.js +2 -3
  156. package/dist/components/ui/TaxonomyDropdown.d.ts +18 -1
  157. package/dist/components/ui/TaxonomyDropdown.js +177 -59
  158. package/dist/components/ui/TopNoticeLayer.d.ts +2 -1
  159. package/dist/components/ui/TopNoticeLayer.js +5 -2
  160. package/dist/components/ui/useFallbackImageUrl.d.ts +4 -0
  161. package/dist/components/ui/useFallbackImageUrl.js +20 -0
  162. package/dist/components/views/AppShellHeader.js +2 -2
  163. package/dist/components/views/StandaloneLayout.d.ts +1 -0
  164. package/dist/components/views/StandaloneLayout.js +1717 -600
  165. package/dist/components/views/WidgetView.d.ts +1 -0
  166. package/dist/components/views/WidgetView.js +99 -31
  167. package/dist/components/views/chrome/WorkspaceChromeSections.d.ts +4 -2
  168. package/dist/components/views/chrome/WorkspaceChromeSections.js +3 -6
  169. package/dist/components/views/chrome/workspaceChrome.d.ts +5 -8
  170. package/dist/components/views/chrome/workspaceChrome.js +62 -27
  171. package/dist/components/views/panels/FilterToolbar.d.ts +4 -3
  172. package/dist/components/views/panels/FilterToolbar.js +8 -5
  173. package/dist/components/views/panels/FilterToolbarControls.d.ts +11 -2
  174. package/dist/components/views/panels/FilterToolbarControls.js +35 -20
  175. package/dist/components/views/panels/PlanningDrawer.d.ts +66 -49
  176. package/dist/components/views/panels/PlanningDrawer.js +983 -314
  177. package/dist/components/views/planningScope.js +7 -1
  178. package/dist/components/views/standalone/modals/AccountSettingsModal.d.ts +62 -0
  179. package/dist/components/views/standalone/modals/AccountSettingsModal.js +197 -0
  180. package/dist/components/views/standalone/modals/AvatarImageManagerModal.d.ts +7 -2
  181. package/dist/components/views/standalone/modals/AvatarImageManagerModal.js +56 -9
  182. package/dist/components/views/standalone/modals/HelpModal.d.ts +1 -2
  183. package/dist/components/views/standalone/modals/HelpModal.js +3 -4
  184. package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +8 -9
  185. package/dist/components/views/standalone/modals/SyncStatusModal.js +85 -25
  186. package/dist/components/views/standalone/modals/TeamManagementModal.js +1 -1
  187. package/dist/config/applicationBaseUrl.d.ts +2 -0
  188. package/dist/config/applicationBaseUrl.js +23 -0
  189. package/dist/config/envSchema.d.ts +1 -1
  190. package/dist/config/envSchema.js +167 -5
  191. package/dist/config/localServiceCloudTarget.d.ts +10 -0
  192. package/dist/config/localServiceCloudTarget.js +76 -0
  193. package/dist/core/AdminAuditRetentionService.d.ts +43 -0
  194. package/dist/core/AdminAuditRetentionService.js +126 -0
  195. package/dist/core/AiProfileService.d.ts +35 -0
  196. package/dist/core/AiProfileService.js +511 -251
  197. package/dist/core/AttachmentLinkService.d.ts +10 -2
  198. package/dist/core/AttachmentLinkService.js +50 -15
  199. package/dist/core/AuthIdentityService.d.ts +6 -0
  200. package/dist/core/AuthIdentityService.js +38 -0
  201. package/dist/core/AuthTokenService.d.ts +1 -0
  202. package/dist/core/AuthTokenService.js +13 -0
  203. package/dist/core/DeletedTaskLifecycleService.d.ts +8 -2
  204. package/dist/core/DeletedTaskLifecycleService.js +145 -38
  205. package/dist/core/GlobalSettingsService.d.ts +3 -1
  206. package/dist/core/GlobalSettingsService.js +30 -4
  207. package/dist/core/InitiativeDurableMutationService.d.ts +89 -0
  208. package/dist/core/InitiativeDurableMutationService.js +187 -0
  209. package/dist/core/McpTokenService.d.ts +5 -0
  210. package/dist/core/McpTokenService.js +91 -13
  211. package/dist/core/PlanningCommandPreparationService.d.ts +60 -0
  212. package/dist/core/PlanningCommandPreparationService.js +149 -0
  213. package/dist/core/ScheduleCommandService.d.ts +76 -0
  214. package/dist/core/ScheduleCommandService.js +165 -0
  215. package/dist/core/SyncReconciliationService.d.ts +29 -6
  216. package/dist/core/SyncReconciliationService.js +256 -84
  217. package/dist/core/TaskActivityService.d.ts +22 -2
  218. package/dist/core/TaskActivityService.js +177 -29
  219. package/dist/core/TaskAttachmentLinksDurableMutationService.d.ts +36 -0
  220. package/dist/core/TaskAttachmentLinksDurableMutationService.js +240 -0
  221. package/dist/core/TaskChecklistCommandService.d.ts +50 -0
  222. package/dist/core/TaskChecklistCommandService.js +111 -0
  223. package/dist/core/TaskDurableCreateMutationService.d.ts +38 -0
  224. package/dist/core/TaskDurableCreateMutationService.js +85 -0
  225. package/dist/core/TaskDurableDeleteMutationService.d.ts +47 -0
  226. package/dist/core/TaskDurableDeleteMutationService.js +54 -0
  227. package/dist/core/TaskDurableLifecycleMutationService.d.ts +38 -0
  228. package/dist/core/TaskDurableLifecycleMutationService.js +42 -0
  229. package/dist/core/TaskDurableRelationshipMutationService.d.ts +58 -0
  230. package/dist/core/TaskDurableRelationshipMutationService.js +66 -0
  231. package/dist/core/TaskDurableRestoreMutationService.d.ts +31 -0
  232. package/dist/core/TaskDurableRestoreMutationService.js +33 -0
  233. package/dist/core/TaskDurableStatusMutationService.d.ts +74 -0
  234. package/dist/core/TaskDurableStatusMutationService.js +247 -0
  235. package/dist/core/TaskDurableSyncMutationService.d.ts +34 -0
  236. package/dist/core/TaskDurableSyncMutationService.js +70 -0
  237. package/dist/core/TaskDurableWorkflowMutationService.d.ts +48 -0
  238. package/dist/core/TaskDurableWorkflowMutationService.js +59 -0
  239. package/dist/core/TaskLifecycleCommandService.d.ts +101 -0
  240. package/dist/core/TaskLifecycleCommandService.js +161 -0
  241. package/dist/core/TaskRootCommandPreparationService.d.ts +35 -0
  242. package/dist/core/TaskRootCommandPreparationService.js +103 -0
  243. package/dist/core/Taskforce.d.ts +542 -60
  244. package/dist/core/Taskforce.js +4220 -905
  245. package/dist/core/WorkflowAssignmentService.d.ts +40 -0
  246. package/dist/core/WorkflowAssignmentService.js +158 -0
  247. package/dist/core/WorkflowExecutionService.d.ts +69 -0
  248. package/dist/core/WorkflowExecutionService.js +342 -0
  249. package/dist/core/WorkflowTaskActivationService.d.ts +32 -0
  250. package/dist/core/WorkflowTaskActivationService.js +63 -0
  251. package/dist/core/WorkflowTemplateService.d.ts +64 -0
  252. package/dist/core/WorkflowTemplateService.js +223 -0
  253. package/dist/core/WorkspaceLifecycleService.d.ts +1 -0
  254. package/dist/core/WorkspaceLifecycleService.js +18 -0
  255. package/dist/core/WorkstreamDurableMutationService.d.ts +90 -0
  256. package/dist/core/WorkstreamDurableMutationService.js +184 -0
  257. package/dist/core/planningReferencePolicy.d.ts +14 -0
  258. package/dist/core/planningReferencePolicy.js +53 -0
  259. package/dist/core/taskReferencePolicy.js +24 -3
  260. package/dist/core/types.d.ts +12 -11
  261. package/dist/documentReviews/DocumentReviewCommentStore.d.ts +33 -2
  262. package/dist/documentReviews/DocumentReviewCommentStore.js +125 -8
  263. package/dist/documentReviews/commandService.d.ts +51 -0
  264. package/dist/documentReviews/commandService.js +63 -0
  265. package/dist/documentReviews/service.d.ts +24 -1
  266. package/dist/documentReviews/service.js +354 -49
  267. package/dist/documentReviews/types.d.ts +18 -1
  268. package/dist/hooks/sync/bootstrap.d.ts +3 -7
  269. package/dist/hooks/sync/bootstrap.js +6 -14
  270. package/dist/hooks/sync/browserSyncAuthority.d.ts +21 -0
  271. package/dist/hooks/sync/browserSyncAuthority.js +70 -0
  272. package/dist/hooks/sync/browserSyncRemoteServices.d.ts +29 -0
  273. package/dist/hooks/sync/browserSyncRemoteServices.js +58 -0
  274. package/dist/hooks/sync/controlPlane.d.ts +1 -37
  275. package/dist/hooks/sync/controlPlane.js +1 -78
  276. package/dist/hooks/sync/lifecyclePolicy.d.ts +1 -45
  277. package/dist/hooks/sync/lifecyclePolicy.js +1 -93
  278. package/dist/hooks/sync/orchestratorShared.d.ts +9 -3
  279. package/dist/hooks/sync/orchestratorShared.js +70 -96
  280. package/dist/hooks/sync/pullLifecycle.d.ts +1 -31
  281. package/dist/hooks/sync/pullLifecycle.js +1 -24
  282. package/dist/hooks/sync/realtime.d.ts +4 -1
  283. package/dist/hooks/sync/realtime.js +103 -3
  284. package/dist/hooks/sync/recovery.d.ts +1 -84
  285. package/dist/hooks/sync/recovery.js +1 -245
  286. package/dist/hooks/sync/transfers.d.ts +8 -129
  287. package/dist/hooks/sync/transfers.js +19 -581
  288. package/dist/hooks/sync/useDataVersionRefresh.d.ts +6 -1
  289. package/dist/hooks/sync/useDataVersionRefresh.js +127 -12
  290. package/dist/hooks/sync/useDurableLocalOutboxDrain.d.ts +14 -0
  291. package/dist/hooks/sync/useDurableLocalOutboxDrain.js +208 -0
  292. package/dist/hooks/sync/useDurableTaskCreateMutation.d.ts +15 -0
  293. package/dist/hooks/sync/useDurableTaskCreateMutation.js +152 -0
  294. package/dist/hooks/sync/useDurableTaskDeleteMutation.d.ts +11 -0
  295. package/dist/hooks/sync/useDurableTaskDeleteMutation.js +21 -0
  296. package/dist/hooks/sync/useDurableTaskLifecycleMutation.d.ts +12 -0
  297. package/dist/hooks/sync/useDurableTaskLifecycleMutation.js +22 -0
  298. package/dist/hooks/sync/useDurableTaskMetadataMutation.d.ts +14 -0
  299. package/dist/hooks/sync/useDurableTaskMetadataMutation.js +24 -0
  300. package/dist/hooks/sync/useDurableTaskRestoreMutation.d.ts +12 -0
  301. package/dist/hooks/sync/useDurableTaskRestoreMutation.js +24 -0
  302. package/dist/hooks/sync/useDurableTaskStatusMutation.d.ts +18 -0
  303. package/dist/hooks/sync/useDurableTaskStatusMutation.js +23 -0
  304. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +23 -0
  305. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +414 -0
  306. package/dist/hooks/sync/useSyncStatusActions.d.ts +2 -1
  307. package/dist/hooks/sync/useSyncStatusActions.js +8 -3
  308. package/dist/hooks/tasks/taskHttpMutation.d.ts +25 -0
  309. package/dist/hooks/tasks/taskHttpMutation.js +134 -0
  310. package/dist/hooks/tasks/useCurrentTaskRelations.d.ts +6 -1
  311. package/dist/hooks/tasks/useCurrentTaskRelations.js +32 -6
  312. package/dist/hooks/tasks/useTaskEditorNavigation.d.ts +4 -3
  313. package/dist/hooks/tasks/useTaskEditorNavigation.js +9 -13
  314. package/dist/hooks/tasks/useTaskFormActions.d.ts +20 -2
  315. package/dist/hooks/tasks/useTaskFormActions.js +339 -59
  316. package/dist/hooks/tasks/useTaskReferenceContract.d.ts +5 -0
  317. package/dist/hooks/tasks/useTaskReferenceContract.js +17 -0
  318. package/dist/hooks/tasks/useTaskRelationships.d.ts +1 -3
  319. package/dist/hooks/tasks/useTaskRelationships.js +5 -25
  320. package/dist/hooks/tasks/useTrashSelection.d.ts +12 -0
  321. package/dist/hooks/tasks/useTrashSelection.js +49 -0
  322. package/dist/hooks/ui/useInitiativeTemplates.d.ts +24 -0
  323. package/dist/hooks/ui/useInitiativeTemplates.js +22 -0
  324. package/dist/hooks/ui/useSettingsModel.d.ts +5 -29
  325. package/dist/hooks/ui/useSettingsModel.js +31 -15
  326. package/dist/hooks/ui/useSettingsPersistence.d.ts +0 -1
  327. package/dist/hooks/ui/useSettingsPersistence.js +4 -8
  328. package/dist/hooks/ui/useSettingsTaxonomyManagement.js +31 -0
  329. package/dist/hooks/useFilterSort.d.ts +2 -2
  330. package/dist/hooks/useFilterSort.js +19 -15
  331. package/dist/hooks/useRealtimeSync.d.ts +10 -0
  332. package/dist/hooks/useRealtimeSync.js +57 -4
  333. package/dist/hooks/useSyncOrchestrator.d.ts +32 -1
  334. package/dist/hooks/useSyncOrchestrator.js +963 -287
  335. package/dist/hooks/useTaskData.d.ts +11 -2
  336. package/dist/hooks/useTaskData.js +59 -26
  337. package/dist/hooks/useTaskMutations.d.ts +42 -5
  338. package/dist/hooks/useTaskMutations.js +750 -125
  339. package/dist/hooks/useTaskforce.d.ts +79 -74
  340. package/dist/hooks/useTaskforce.js +1205 -450
  341. package/dist/hooks/useUiNotice.d.ts +5 -1
  342. package/dist/hooks/useUiNotice.js +13 -2
  343. package/dist/hooks/useWorkspaceSyncController.d.ts +9 -0
  344. package/dist/hooks/useWorkspaceSyncController.js +159 -17
  345. package/dist/hooks/workspace/usePersistedAppUiState.d.ts +74 -0
  346. package/dist/hooks/workspace/usePersistedAppUiState.js +325 -0
  347. package/dist/hooks/workspace/usePersistedLayoutUiState.d.ts +76 -0
  348. package/dist/hooks/workspace/usePersistedLayoutUiState.js +479 -0
  349. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.d.ts +2 -7
  350. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +42 -31
  351. package/dist/hooks/workspace/workspaceLocalState.d.ts +17 -6
  352. package/dist/hooks/workspace/workspaceLocalState.js +175 -5
  353. package/dist/hooks/workstreams/workstreamHttpMutation.d.ts +23 -0
  354. package/dist/hooks/workstreams/workstreamHttpMutation.js +134 -0
  355. package/dist/localization/locales/en-US.d.ts +3 -3
  356. package/dist/localization/locales/en-US.js +3 -3
  357. package/dist/localization/locales/es-419.js +3 -3
  358. package/dist/localization/locales/pt-BR.js +3 -3
  359. package/dist/mcp/adminWorkspaceRegistrar.js +2 -30
  360. package/dist/mcp/aiProfileBootstrap.d.ts +3 -0
  361. package/dist/mcp/aiProfileBootstrap.js +4 -0
  362. package/dist/mcp/canonicalAssetHelpers.d.ts +29 -4
  363. package/dist/mcp/canonicalAssetHelpers.js +138 -35
  364. package/dist/mcp/clientIntegrations.d.ts +4 -2
  365. package/dist/mcp/clientIntegrations.js +58 -57
  366. package/dist/mcp/clientRegistry.d.ts +30 -0
  367. package/dist/mcp/clientRegistry.js +134 -0
  368. package/dist/mcp/collaborationRegistrar.js +31 -15
  369. package/dist/mcp/documentAssetRegistrar.js +231 -56
  370. package/dist/mcp/documentContentCommand.d.ts +94 -0
  371. package/dist/mcp/documentContentCommand.js +226 -0
  372. package/dist/mcp/documentHelpers.d.ts +13 -65
  373. package/dist/mcp/documentHelpers.js +49 -62
  374. package/dist/mcp/durableTaskMutationRouter.d.ts +65 -0
  375. package/dist/mcp/durableTaskMutationRouter.js +217 -0
  376. package/dist/mcp/durableTaskRelationshipMutationRouter.d.ts +38 -0
  377. package/dist/mcp/durableTaskRelationshipMutationRouter.js +168 -0
  378. package/dist/mcp/durableTaskRootMutationRouter.d.ts +64 -0
  379. package/dist/mcp/durableTaskRootMutationRouter.js +226 -0
  380. package/dist/mcp/gitWorktreeRoots.d.ts +2 -0
  381. package/dist/mcp/gitWorktreeRoots.js +19 -0
  382. package/dist/mcp/legacyServer.d.ts +1 -0
  383. package/dist/mcp/legacyServer.js +42 -0
  384. package/dist/mcp/localCliHealth.d.ts +56 -0
  385. package/dist/mcp/localCliHealth.js +170 -0
  386. package/dist/mcp/localServiceProxy.d.ts +23 -0
  387. package/dist/mcp/localServiceProxy.js +258 -0
  388. package/dist/mcp/mcpInputValidator.d.ts +17 -0
  389. package/dist/mcp/mcpInputValidator.js +58 -0
  390. package/dist/mcp/planningAttachmentCommandAdapter.d.ts +127 -0
  391. package/dist/mcp/planningAttachmentCommandAdapter.js +188 -0
  392. package/dist/mcp/programScaffoldCommandAdapter.d.ts +6 -0
  393. package/dist/mcp/programScaffoldCommandAdapter.js +39 -0
  394. package/dist/mcp/proxyServer.d.ts +1 -0
  395. package/dist/mcp/proxyServer.js +2 -0
  396. package/dist/mcp/runtime.d.ts +98 -1
  397. package/dist/mcp/runtime.js +4682 -1927
  398. package/dist/mcp/server.js +29 -2
  399. package/dist/mcp/sharedLocalServiceGateD.d.ts +115 -0
  400. package/dist/mcp/sharedLocalServiceGateD.js +344 -0
  401. package/dist/mcp/stdioLifecycle.d.ts +22 -0
  402. package/dist/mcp/stdioLifecycle.js +54 -0
  403. package/dist/mcp/taskAttachmentCommandAdapter.d.ts +192 -0
  404. package/dist/mcp/taskAttachmentCommandAdapter.js +470 -0
  405. package/dist/mcp/taskAttachmentHelpers.d.ts +8 -6
  406. package/dist/mcp/taskAttachmentHelpers.js +74 -2
  407. package/dist/mcp/taskAttachmentTypes.d.ts +26 -5
  408. package/dist/mcp/taskPlanCommand.d.ts +64 -0
  409. package/dist/mcp/taskPlanCommand.js +98 -0
  410. package/dist/mcp/taskPlanningRegistrar.js +240 -44
  411. package/dist/mcp/toolCallCompatibility.d.ts +6 -0
  412. package/dist/mcp/toolCallCompatibility.js +16 -0
  413. package/dist/mcp/toolCatalog.d.ts +3 -1
  414. package/dist/mcp/toolProfiles.d.ts +12 -1
  415. package/dist/mcp/toolProfiles.js +43 -0
  416. package/dist/mcp/toolRegistry.d.ts +17 -2
  417. package/dist/mcp/toolRegistry.js +26 -11
  418. package/dist/mcp/workflowExecutionRegistrar.d.ts +2 -0
  419. package/dist/mcp/workflowExecutionRegistrar.js +51 -0
  420. package/dist/migrations/taskSchemaMigrations.d.ts +35 -0
  421. package/dist/migrations/taskSchemaMigrations.js +1892 -64
  422. package/dist/migrations/taskUpdatedAtSyncDriftMigration.d.ts +20 -0
  423. package/dist/migrations/taskUpdatedAtSyncDriftMigration.js +153 -0
  424. package/dist/migrations/taskforceAgentDefinitionMigration.d.ts +26 -0
  425. package/dist/migrations/taskforceAgentDefinitionMigration.js +116 -0
  426. package/dist/plugins/vite.js +48 -17
  427. package/dist/public/Taskforce_Van.webp +0 -0
  428. package/dist/runtime/appGateDefinitions.d.ts +16 -10
  429. package/dist/runtime/appGateDefinitions.js +16 -10
  430. package/dist/runtime/appGates.d.ts +5 -4
  431. package/dist/runtime/appGates.js +4 -3
  432. package/dist/server/aiProfileAvatarAssets.d.ts +11 -8
  433. package/dist/server/aiProfileAvatarAssets.js +159 -70
  434. package/dist/server/appAccess.d.ts +12 -0
  435. package/dist/server/appAccess.js +21 -0
  436. package/dist/server/auth.js +15 -1
  437. package/dist/server/authorizedWorkspaceAccess.d.ts +12 -0
  438. package/dist/server/authorizedWorkspaceAccess.js +40 -0
  439. package/dist/server/cloudCollectionRead.d.ts +25 -0
  440. package/dist/server/cloudCollectionRead.js +120 -0
  441. package/dist/server/cloudCollectionReadPool.d.ts +52 -0
  442. package/dist/server/cloudCollectionReadPool.js +140 -0
  443. package/dist/server/cloudCollectionReadWorker.d.ts +1 -0
  444. package/dist/server/cloudCollectionReadWorker.js +36 -0
  445. package/dist/server/cors.d.ts +2 -1
  446. package/dist/server/cors.js +45 -8
  447. package/dist/server/email.d.ts +3 -1
  448. package/dist/server/email.js +46 -8
  449. package/dist/server/index.d.ts +27 -12
  450. package/dist/server/index.js +395 -86
  451. package/dist/server/localDataOwnerPermit.d.ts +18 -0
  452. package/dist/server/localDataOwnerPermit.js +58 -0
  453. package/dist/server/localDatabaseIdentity.d.ts +14 -0
  454. package/dist/server/localDatabaseIdentity.js +69 -0
  455. package/dist/server/localRealtimeFileInvalidation.d.ts +1 -0
  456. package/dist/server/localRealtimeFileInvalidation.js +7 -0
  457. package/dist/server/localServiceLease.d.ts +65 -0
  458. package/dist/server/localServiceLease.js +485 -0
  459. package/dist/server/localServiceOwnershipBootstrap.d.ts +19 -0
  460. package/dist/server/localServiceOwnershipBootstrap.js +84 -0
  461. package/dist/server/localServiceSessions.d.ts +87 -0
  462. package/dist/server/localServiceSessions.js +309 -0
  463. package/dist/server/localServiceWindowsAcl.d.ts +8 -0
  464. package/dist/server/localServiceWindowsAcl.js +60 -0
  465. package/dist/server/localSyncProcessLockBootstrap.d.ts +3 -0
  466. package/dist/server/localSyncProcessLockBootstrap.js +16 -0
  467. package/dist/server/localWorkspaceSyncServerComposition.d.ts +59 -0
  468. package/dist/server/localWorkspaceSyncServerComposition.js +91 -0
  469. package/dist/server/localWorkspaceSyncServerRuntime.d.ts +119 -0
  470. package/dist/server/localWorkspaceSyncServerRuntime.js +1163 -0
  471. package/dist/server/rateLimit.d.ts +1 -0
  472. package/dist/server/rateLimit.js +16 -0
  473. package/dist/server/routes/admin.d.ts +2 -4
  474. package/dist/server/routes/admin.js +199 -337
  475. package/dist/server/routes/agentRoles.d.ts +13 -0
  476. package/dist/server/routes/agentRoles.js +273 -0
  477. package/dist/server/routes/agentSkills.d.ts +16 -0
  478. package/dist/server/routes/agentSkills.js +291 -0
  479. package/dist/server/routes/agents.d.ts +49 -0
  480. package/dist/server/routes/agents.js +1455 -0
  481. package/dist/server/routes/annotatedAttachments.js +46 -9
  482. package/dist/server/routes/assetAccess.d.ts +36 -0
  483. package/dist/server/routes/assetAccess.js +93 -0
  484. package/dist/server/routes/auth.d.ts +4 -3
  485. package/dist/server/routes/auth.js +236 -21
  486. package/dist/server/routes/authSupport.d.ts +3 -1
  487. package/dist/server/routes/authSupport.js +22 -8
  488. package/dist/server/routes/documentReviews.d.ts +2 -0
  489. package/dist/server/routes/documentReviews.js +155 -15
  490. package/dist/server/routes/documents.d.ts +6 -2
  491. package/dist/server/routes/documents.js +492 -151
  492. package/dist/server/routes/durableTaskHttpRouters.d.ts +167 -0
  493. package/dist/server/routes/durableTaskHttpRouters.js +89 -0
  494. package/dist/server/routes/localMcpHealth.d.ts +11 -0
  495. package/dist/server/routes/localMcpHealth.js +29 -0
  496. package/dist/server/routes/localService.d.ts +13 -0
  497. package/dist/server/routes/localService.js +446 -0
  498. package/dist/server/routes/localUpdate.d.ts +11 -0
  499. package/dist/server/routes/localUpdate.js +154 -0
  500. package/dist/server/routes/primitives.d.ts +29 -0
  501. package/dist/server/routes/primitives.js +18 -0
  502. package/dist/server/routes/resources.d.ts +1 -10
  503. package/dist/server/routes/resources.js +1 -153
  504. package/dist/server/routes/shared.d.ts +55 -2
  505. package/dist/server/routes/shared.js +506 -16
  506. package/dist/server/routes/sync.d.ts +2 -0
  507. package/dist/server/routes/sync.js +206 -272
  508. package/dist/server/routes/syncAuxRoutes.d.ts +3 -1
  509. package/dist/server/routes/syncAuxRoutes.js +9 -4
  510. package/dist/server/routes/syncCoordinatorLocalRoutes.d.ts +6 -0
  511. package/dist/server/routes/syncCoordinatorLocalRoutes.js +867 -0
  512. package/dist/server/routes/syncPullApplyRoutes.d.ts +29 -1
  513. package/dist/server/routes/syncPullApplyRoutes.js +520 -17
  514. package/dist/server/routes/syncPushRoutes.d.ts +33 -4
  515. package/dist/server/routes/syncPushRoutes.js +251 -62
  516. package/dist/server/routes/syncRouteTypes.d.ts +1 -1
  517. package/dist/server/routes/syncSnapshotRoutes.d.ts +15 -7
  518. package/dist/server/routes/syncSnapshotRoutes.js +95 -17
  519. package/dist/server/routes/syncV3DiagnosticsRoutes.d.ts +14 -0
  520. package/dist/server/routes/syncV3DiagnosticsRoutes.js +72 -0
  521. package/dist/server/routes/syncV3FeedRoutes.d.ts +20 -0
  522. package/dist/server/routes/syncV3FeedRoutes.js +464 -0
  523. package/dist/server/routes/syncV3LocalCaptureRoutes.d.ts +37 -0
  524. package/dist/server/routes/syncV3LocalCaptureRoutes.js +915 -0
  525. package/dist/server/routes/syncV3LocalDispatchRoutes.d.ts +17 -0
  526. package/dist/server/routes/syncV3LocalDispatchRoutes.js +280 -0
  527. package/dist/server/routes/syncV3LocalFeedApplyRoutes.d.ts +17 -0
  528. package/dist/server/routes/syncV3LocalFeedApplyRoutes.js +493 -0
  529. package/dist/server/routes/syncV3LocalOwnershipRoutes.d.ts +10 -0
  530. package/dist/server/routes/syncV3LocalOwnershipRoutes.js +51 -0
  531. package/dist/server/routes/syncV3LocalRecoveryRoutes.d.ts +12 -0
  532. package/dist/server/routes/syncV3LocalRecoveryRoutes.js +78 -0
  533. package/dist/server/routes/syncV3OperationRoutes.d.ts +35 -0
  534. package/dist/server/routes/syncV3OperationRoutes.js +1151 -0
  535. package/dist/server/routes/tasks.d.ts +0 -2
  536. package/dist/server/routes/tasks.js +1083 -236
  537. package/dist/server/routes/workflows.d.ts +26 -0
  538. package/dist/server/routes/workflows.js +500 -0
  539. package/dist/server/routes.d.ts +1 -6
  540. package/dist/server/routes.js +179 -342
  541. package/dist/server/smtpTransport.d.ts +11 -3
  542. package/dist/server/smtpTransport.js +9 -2
  543. package/dist/server/start.js +42 -10
  544. package/dist/service/localServiceCli.d.ts +33 -0
  545. package/dist/service/localServiceCli.js +376 -0
  546. package/dist/service/localServiceClientLifecycle.d.ts +25 -0
  547. package/dist/service/localServiceClientLifecycle.js +189 -0
  548. package/dist/service/localServiceOpen.d.ts +17 -0
  549. package/dist/service/localServiceOpen.js +27 -0
  550. package/dist/services/agentRoleResolver.d.ts +4 -0
  551. package/dist/services/agentRoleResolver.js +7 -0
  552. package/dist/services/aiProfileAvatarGenerationService.d.ts +41 -0
  553. package/dist/services/aiProfileAvatarGenerationService.js +158 -0
  554. package/dist/services/avatarImageProvider.d.ts +33 -0
  555. package/dist/services/avatarImageProvider.js +140 -0
  556. package/dist/services/bedrockAnthropicMessagesModelGateway.d.ts +24 -0
  557. package/dist/services/bedrockAnthropicMessagesModelGateway.js +95 -0
  558. package/dist/services/bedrockMantleModelGateway.d.ts +43 -0
  559. package/dist/services/bedrockMantleModelGateway.js +81 -0
  560. package/dist/services/bedrockModelGateway.d.ts +26 -0
  561. package/dist/services/bedrockModelGateway.js +94 -0
  562. package/dist/services/modelGateway.d.ts +82 -0
  563. package/dist/services/modelGateway.js +61 -0
  564. package/dist/services/taskforceAgentAvatarImageProvider.d.ts +8 -0
  565. package/dist/services/taskforceAgentAvatarImageProvider.js +24 -0
  566. package/dist/services/taskforceAgentMcpBridge.d.ts +77 -0
  567. package/dist/services/taskforceAgentMcpBridge.js +527 -0
  568. package/dist/shared/agentRoleDefinition.d.ts +34 -0
  569. package/dist/shared/agentRoleDefinition.js +207 -0
  570. package/dist/shared/aiProfileAvatarEligibility.d.ts +10 -0
  571. package/dist/shared/aiProfileAvatarEligibility.js +27 -0
  572. package/dist/shared/aiProfileColors.d.ts +7 -0
  573. package/dist/shared/aiProfileColors.js +33 -0
  574. package/dist/shared/colorPalette.d.ts +3 -0
  575. package/dist/shared/colorPalette.js +20 -0
  576. package/dist/shared/commentProvenance.d.ts +4 -0
  577. package/dist/shared/commentProvenance.js +6 -0
  578. package/dist/shared/deletedTaskRetention.d.ts +2 -0
  579. package/dist/shared/deletedTaskRetention.js +7 -0
  580. package/dist/shared/passwordPolicy.d.ts +2 -1
  581. package/dist/shared/passwordPolicy.js +9 -0
  582. package/dist/shared/planningIdentity.d.ts +20 -0
  583. package/dist/shared/planningIdentity.js +79 -0
  584. package/dist/shared/taskDeepLinks.d.ts +28 -0
  585. package/dist/shared/taskDeepLinks.js +48 -0
  586. package/dist/shared/taskRestoreDestination.d.ts +2 -0
  587. package/dist/shared/taskRestoreDestination.js +5 -0
  588. package/dist/shared/taskforceAgentDefinition.d.ts +88 -0
  589. package/dist/shared/taskforceAgentDefinition.js +434 -0
  590. package/dist/shared/taskforceAgentExecutionSnapshot.d.ts +50 -0
  591. package/dist/shared/taskforceAgentExecutionSnapshot.js +68 -0
  592. package/dist/shared/taskforceAgentModels.d.ts +56 -0
  593. package/dist/shared/taskforceAgentModels.js +314 -0
  594. package/dist/shared/taskforceAgentRunContext.d.ts +23 -0
  595. package/dist/shared/taskforceAgentRunContext.js +21 -0
  596. package/dist/shared/taskforceAgentRuntimeResolution.d.ts +31 -0
  597. package/dist/shared/taskforceAgentRuntimeResolution.js +72 -0
  598. package/dist/shared/taskforceAgentSkill.d.ts +33 -0
  599. package/dist/shared/taskforceAgentSkill.js +149 -0
  600. package/dist/storage/agentRoleStore.d.ts +91 -0
  601. package/dist/storage/agentRoleStore.js +385 -0
  602. package/dist/storage/databaseAdapter.d.ts +1 -0
  603. package/dist/storage/databaseAdapter.js +7 -1
  604. package/dist/storage/documentIntegrity.d.ts +12 -3
  605. package/dist/storage/documentIntegrity.js +105 -27
  606. package/dist/storage/objectStorageClient.d.ts +10 -4
  607. package/dist/storage/objectStorageClient.js +73 -43
  608. package/dist/storage/postgresAdapter.d.ts +2 -1
  609. package/dist/storage/postgresAdapter.js +42 -6
  610. package/dist/storage/postgresRequestDiagnostics.d.ts +8 -0
  611. package/dist/storage/postgresRequestDiagnostics.js +24 -0
  612. package/dist/storage/postgresWorker.js +65 -1
  613. package/dist/storage/sqliteAdapter.d.ts +1 -1
  614. package/dist/storage/sqliteAdapter.js +7 -1
  615. package/dist/storage/sqliteWalHealth.d.ts +71 -0
  616. package/dist/storage/sqliteWalHealth.js +176 -0
  617. package/dist/storage/taskDataPath.d.ts +1 -0
  618. package/dist/storage/taskDataPath.js +20 -0
  619. package/dist/storage/taskforceAgentConversationStore.d.ts +66 -0
  620. package/dist/storage/taskforceAgentConversationStore.js +264 -0
  621. package/dist/storage/taskforceAgentSkillStore.d.ts +93 -0
  622. package/dist/storage/taskforceAgentSkillStore.js +355 -0
  623. package/dist/storage/taskforceAgentStore.d.ts +105 -0
  624. package/dist/storage/taskforceAgentStore.js +549 -0
  625. package/dist/storage/workflowStore.d.ts +223 -0
  626. package/dist/storage/workflowStore.js +1032 -0
  627. package/dist/storage/workspaceAssetStore.d.ts +102 -0
  628. package/dist/storage/workspaceAssetStore.js +488 -25
  629. package/dist/sync/aiProfileAvatarSyncPaths.d.ts +14 -0
  630. package/dist/sync/aiProfileAvatarSyncPaths.js +56 -0
  631. package/dist/sync/cloudSyncApi.d.ts +329 -0
  632. package/dist/sync/cloudSyncApi.js +574 -1
  633. package/dist/sync/collaborationSyncPayload.d.ts +5 -1
  634. package/dist/sync/collaborationSyncPayload.js +213 -1
  635. package/dist/sync/collaborationSyncState.d.ts +23 -3
  636. package/dist/sync/collaborationSyncState.js +92 -3
  637. package/dist/sync/contentSyncPayload.d.ts +9 -0
  638. package/dist/sync/contentSyncPayload.js +29 -0
  639. package/dist/sync/contentSyncState.d.ts +79 -4
  640. package/dist/sync/contentSyncState.js +1113 -313
  641. package/dist/sync/coordinator/localSyncBrowserApplyPermitContext.d.ts +39 -0
  642. package/dist/sync/coordinator/localSyncBrowserApplyPermitContext.js +234 -0
  643. package/dist/sync/coordinator/localSyncBrowserAuthorityCapability.d.ts +7 -0
  644. package/dist/sync/coordinator/localSyncBrowserAuthorityCapability.js +10 -0
  645. package/dist/sync/coordinator/localSyncCommittedApplyPolicy.d.ts +7 -0
  646. package/dist/sync/coordinator/localSyncCommittedApplyPolicy.js +41 -0
  647. package/dist/sync/coordinator/localSyncCoordinatorBrowserClient.d.ts +178 -0
  648. package/dist/sync/coordinator/localSyncCoordinatorBrowserClient.js +131 -0
  649. package/dist/sync/coordinator/localSyncCoordinatorCommandLifecycle.d.ts +25 -0
  650. package/dist/sync/coordinator/localSyncCoordinatorCommandLifecycle.js +200 -0
  651. package/dist/sync/coordinator/localSyncCoordinatorHost.d.ts +84 -0
  652. package/dist/sync/coordinator/localSyncCoordinatorHost.js +435 -0
  653. package/dist/sync/coordinator/localSyncCoordinatorRouteServices.d.ts +33 -0
  654. package/dist/sync/coordinator/localSyncCoordinatorRouteServices.js +1 -0
  655. package/dist/sync/coordinator/localSyncCoordinatorStore.d.ts +122 -0
  656. package/dist/sync/coordinator/localSyncCoordinatorStore.js +1039 -0
  657. package/dist/sync/coordinator/localSyncCoordinatorTypes.d.ts +82 -0
  658. package/dist/sync/coordinator/localSyncCoordinatorTypes.js +9 -0
  659. package/dist/sync/coordinator/localSyncDispatchTracker.d.ts +15 -0
  660. package/dist/sync/coordinator/localSyncDispatchTracker.js +68 -0
  661. package/dist/sync/coordinator/localSyncExecutionPermitStore.d.ts +216 -0
  662. package/dist/sync/coordinator/localSyncExecutionPermitStore.js +1436 -0
  663. package/dist/sync/coordinator/localSyncExecutionPermitTypes.d.ts +52 -0
  664. package/dist/sync/coordinator/localSyncExecutionPermitTypes.js +8 -0
  665. package/dist/sync/coordinator/localSyncOwnershipDrainBarrier.d.ts +33 -0
  666. package/dist/sync/coordinator/localSyncOwnershipDrainBarrier.js +83 -0
  667. package/dist/sync/coordinator/localSyncPermitTransactionHooks.d.ts +9 -0
  668. package/dist/sync/coordinator/localSyncPermitTransactionHooks.js +27 -0
  669. package/dist/sync/coordinator/localSyncProcessLock.d.ts +12 -0
  670. package/dist/sync/coordinator/localSyncProcessLock.js +212 -0
  671. package/dist/sync/coordinator/localSyncV3DispatchRecoveryReconciler.d.ts +17 -0
  672. package/dist/sync/coordinator/localSyncV3DispatchRecoveryReconciler.js +82 -0
  673. package/dist/sync/coordinator/localWorkspaceSyncRunner.d.ts +134 -0
  674. package/dist/sync/coordinator/localWorkspaceSyncRunner.js +981 -0
  675. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +189 -0
  676. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +961 -0
  677. package/dist/sync/coordinator/workspaceSyncCloudCredentialValidator.d.ts +19 -0
  678. package/dist/sync/coordinator/workspaceSyncCloudCredentialValidator.js +83 -0
  679. package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +117 -0
  680. package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +323 -0
  681. package/dist/sync/coordinator/workspaceSyncLocalAccessBootstrap.d.ts +11 -0
  682. package/dist/sync/coordinator/workspaceSyncLocalAccessBootstrap.js +51 -0
  683. package/dist/sync/coordinator/workspaceSyncTransportGateway.d.ts +139 -0
  684. package/dist/sync/coordinator/workspaceSyncTransportGateway.js +740 -0
  685. package/dist/sync/engine/localWorkspaceContentManifestService.d.ts +21 -0
  686. package/dist/sync/engine/localWorkspaceContentManifestService.js +44 -0
  687. package/dist/sync/engine/workspaceSyncAtomicLocalPublisher.d.ts +36 -0
  688. package/dist/sync/engine/workspaceSyncAtomicLocalPublisher.js +203 -0
  689. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +21 -0
  690. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.js +13 -0
  691. package/dist/sync/engine/workspaceSyncContentPullObligationStore.d.ts +65 -0
  692. package/dist/sync/engine/workspaceSyncContentPullObligationStore.js +160 -0
  693. package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +216 -0
  694. package/dist/sync/engine/workspaceSyncContentVersionStore.js +1068 -0
  695. package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.d.ts +28 -0
  696. package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.js +543 -0
  697. package/dist/sync/engine/workspaceSyncEngineContracts.d.ts +78 -0
  698. package/dist/sync/engine/workspaceSyncEngineContracts.js +1 -0
  699. package/dist/sync/engine/workspaceSyncEngineControlPlane.d.ts +37 -0
  700. package/dist/sync/engine/workspaceSyncEngineControlPlane.js +79 -0
  701. package/dist/sync/engine/workspaceSyncEngineIdentity.d.ts +1 -0
  702. package/dist/sync/engine/workspaceSyncEngineIdentity.js +4 -0
  703. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.d.ts +68 -0
  704. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +180 -0
  705. package/dist/sync/engine/workspaceSyncEngineLocalApply.d.ts +72 -0
  706. package/dist/sync/engine/workspaceSyncEngineLocalApply.js +132 -0
  707. package/dist/sync/engine/workspaceSyncEngineLocalServices.d.ts +70 -0
  708. package/dist/sync/engine/workspaceSyncEngineLocalServices.js +25 -0
  709. package/dist/sync/engine/workspaceSyncEngineParity.d.ts +8 -0
  710. package/dist/sync/engine/workspaceSyncEngineParity.js +7 -0
  711. package/dist/sync/engine/workspaceSyncEnginePullPolicy.d.ts +32 -0
  712. package/dist/sync/engine/workspaceSyncEnginePullPolicy.js +27 -0
  713. package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +20 -0
  714. package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +87 -0
  715. package/dist/sync/engine/workspaceSyncEngineRecovery.d.ts +56 -0
  716. package/dist/sync/engine/workspaceSyncEngineRecovery.js +288 -0
  717. package/dist/sync/engine/workspaceSyncEngineRemoteServices.d.ts +109 -0
  718. package/dist/sync/engine/workspaceSyncEngineRemoteServices.js +21 -0
  719. package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +61 -0
  720. package/dist/sync/engine/workspaceSyncEngineRuntime.js +59 -0
  721. package/dist/sync/engine/workspaceSyncEngineServerApplyBoundary.d.ts +28 -0
  722. package/dist/sync/engine/workspaceSyncEngineServerApplyBoundary.js +86 -0
  723. package/dist/sync/engine/workspaceSyncEngineServerLocalServices.d.ts +73 -0
  724. package/dist/sync/engine/workspaceSyncEngineServerLocalServices.js +452 -0
  725. package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.d.ts +23 -0
  726. package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.js +466 -0
  727. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.d.ts +125 -0
  728. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +1147 -0
  729. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.d.ts +63 -0
  730. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +276 -0
  731. package/dist/sync/engine/workspaceSyncEngineTransferCompletion.d.ts +20 -0
  732. package/dist/sync/engine/workspaceSyncEngineTransferCompletion.js +37 -0
  733. package/dist/sync/engine/workspaceSyncEngineTransferTypes.d.ts +7 -0
  734. package/dist/sync/engine/workspaceSyncEngineTransferTypes.js +1 -0
  735. package/dist/sync/engine/workspaceSyncEngineTransfers.d.ts +240 -0
  736. package/dist/sync/engine/workspaceSyncEngineTransfers.js +1184 -0
  737. package/dist/sync/engine/workspaceSyncEngineV3LocalFeedApply.d.ts +39 -0
  738. package/dist/sync/engine/workspaceSyncEngineV3LocalFeedApply.js +39 -0
  739. package/dist/sync/engine/workspaceSyncImmutableContentGcRunner.d.ts +25 -0
  740. package/dist/sync/engine/workspaceSyncImmutableContentGcRunner.js +83 -0
  741. package/dist/sync/engine/workspaceSyncImmutableContentProvider.d.ts +71 -0
  742. package/dist/sync/engine/workspaceSyncImmutableContentProvider.js +209 -0
  743. package/dist/sync/engine/workspaceSyncImmutableContentStager.d.ts +32 -0
  744. package/dist/sync/engine/workspaceSyncImmutableContentStager.js +202 -0
  745. package/dist/sync/engine/workspaceSyncPublishedContentResolver.d.ts +43 -0
  746. package/dist/sync/engine/workspaceSyncPublishedContentResolver.js +142 -0
  747. package/dist/sync/engine/workspaceSyncServerContentRuntime.d.ts +26 -0
  748. package/dist/sync/engine/workspaceSyncServerContentRuntime.js +41 -0
  749. package/dist/sync/engine/workspaceSyncServerDataServices.d.ts +44 -0
  750. package/dist/sync/engine/workspaceSyncServerDataServices.js +143 -0
  751. package/dist/sync/engine/workspaceSyncTransferEvidence.d.ts +39 -0
  752. package/dist/sync/engine/workspaceSyncTransferEvidence.js +45 -0
  753. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +44 -0
  754. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +992 -0
  755. package/dist/sync/engine/workspaceSyncV2PreparedContent.d.ts +82 -0
  756. package/dist/sync/engine/workspaceSyncV2PreparedContent.js +219 -0
  757. package/dist/sync/planningCanonicalFields.d.ts +41 -0
  758. package/dist/sync/planningCanonicalFields.js +211 -0
  759. package/dist/sync/planningSyncPayload.d.ts +5 -1
  760. package/dist/sync/planningSyncPayload.js +88 -4
  761. package/dist/sync/syncApplyHandlers.d.ts +100 -8
  762. package/dist/sync/syncApplyHandlers.js +845 -78
  763. package/dist/sync/syncResourceAdapters.d.ts +10 -0
  764. package/dist/sync/syncResourceAdapters.js +21 -1
  765. package/dist/sync/syncService.d.ts +57 -1
  766. package/dist/sync/syncService.js +1094 -138
  767. package/dist/sync/taskNestedContent.d.ts +2 -0
  768. package/dist/sync/taskNestedContent.js +8 -0
  769. package/dist/sync/taskSyncChangeKey.js +0 -1
  770. package/dist/sync/taskSyncPayload.d.ts +1 -1
  771. package/dist/sync/taskSyncPayload.js +20 -3
  772. package/dist/sync/v3/canonicalWorkspaceSyncJson.d.ts +2 -0
  773. package/dist/sync/v3/canonicalWorkspaceSyncJson.js +26 -0
  774. package/dist/sync/v3/combinedFeedCapability.d.ts +21 -0
  775. package/dist/sync/v3/combinedFeedCapability.js +80 -0
  776. package/dist/sync/v3/combinedFeedPrerequisites.d.ts +18 -0
  777. package/dist/sync/v3/combinedFeedPrerequisites.js +184 -0
  778. package/dist/sync/v3/durableInitiativeMutationRouter.d.ts +61 -0
  779. package/dist/sync/v3/durableInitiativeMutationRouter.js +287 -0
  780. package/dist/sync/v3/durableOperationReplay.d.ts +36 -0
  781. package/dist/sync/v3/durableOperationReplay.js +103 -0
  782. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.d.ts +50 -0
  783. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +216 -0
  784. package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +47 -0
  785. package/dist/sync/v3/durableTaskChecklistMutationRouter.js +182 -0
  786. package/dist/sync/v3/durableTaskCommentMutationRouter.d.ts +47 -0
  787. package/dist/sync/v3/durableTaskCommentMutationRouter.js +191 -0
  788. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.d.ts +60 -0
  789. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.js +333 -0
  790. package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +40 -0
  791. package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +518 -0
  792. package/dist/sync/v3/durableTaxonomyMutationRouter.d.ts +63 -0
  793. package/dist/sync/v3/durableTaxonomyMutationRouter.js +289 -0
  794. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +77 -0
  795. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +361 -0
  796. package/dist/sync/v3/durableWorkstreamMutationRouter.d.ts +61 -0
  797. package/dist/sync/v3/durableWorkstreamMutationRouter.js +287 -0
  798. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.d.ts +42 -0
  799. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +122 -0
  800. package/dist/sync/v3/entityEventLegacyAdoptionContract.d.ts +6 -0
  801. package/dist/sync/v3/entityEventLegacyAdoptionContract.js +6 -0
  802. package/dist/sync/v3/entityEventLegacyAdoptionService.d.ts +62 -0
  803. package/dist/sync/v3/entityEventLegacyAdoptionService.js +180 -0
  804. package/dist/sync/v3/initiativeActivityAuthoritativeRevision.d.ts +11 -0
  805. package/dist/sync/v3/initiativeActivityAuthoritativeRevision.js +23 -0
  806. package/dist/sync/v3/initiativeActivityIdentity.d.ts +8 -0
  807. package/dist/sync/v3/initiativeActivityIdentity.js +14 -0
  808. package/dist/sync/v3/initiativeCoexistence.d.ts +26 -0
  809. package/dist/sync/v3/initiativeCoexistence.js +148 -0
  810. package/dist/sync/v3/initiativeFeedActivationCapability.d.ts +6 -0
  811. package/dist/sync/v3/initiativeFeedActivationCapability.js +16 -0
  812. package/dist/sync/v3/initiativeMutationPayload.d.ts +26 -0
  813. package/dist/sync/v3/initiativeMutationPayload.js +144 -0
  814. package/dist/sync/v3/initiativeMutationService.d.ts +62 -0
  815. package/dist/sync/v3/initiativeMutationService.js +206 -0
  816. package/dist/sync/v3/localEntityEventLegacyAdoption.d.ts +31 -0
  817. package/dist/sync/v3/localEntityEventLegacyAdoption.js +607 -0
  818. package/dist/sync/v3/localInitiativeOutboxHandler.d.ts +8 -0
  819. package/dist/sync/v3/localInitiativeOutboxHandler.js +88 -0
  820. package/dist/sync/v3/localInitiativeOutboxService.d.ts +50 -0
  821. package/dist/sync/v3/localInitiativeOutboxService.js +497 -0
  822. package/dist/sync/v3/localOperationIdentityStore.d.ts +81 -0
  823. package/dist/sync/v3/localOperationIdentityStore.js +388 -0
  824. package/dist/sync/v3/localOutboxDispatchCapability.d.ts +7 -0
  825. package/dist/sync/v3/localOutboxDispatchCapability.js +13 -0
  826. package/dist/sync/v3/localOutboxDispatchRuntime.d.ts +16 -0
  827. package/dist/sync/v3/localOutboxDispatchRuntime.js +269 -0
  828. package/dist/sync/v3/localOutboxDispatcher.d.ts +53 -0
  829. package/dist/sync/v3/localOutboxDispatcher.js +366 -0
  830. package/dist/sync/v3/localOutboxDrainClient.d.ts +50 -0
  831. package/dist/sync/v3/localOutboxDrainClient.js +250 -0
  832. package/dist/sync/v3/localOutboxOperationHandler.d.ts +31 -0
  833. package/dist/sync/v3/localOutboxOperationHandler.js +10 -0
  834. package/dist/sync/v3/localOutboxRecoveryClient.d.ts +14 -0
  835. package/dist/sync/v3/localOutboxRecoveryClient.js +45 -0
  836. package/dist/sync/v3/localOutboxRecoveryPreparationService.d.ts +12 -0
  837. package/dist/sync/v3/localOutboxRecoveryPreparationService.js +151 -0
  838. package/dist/sync/v3/localSyncIdentityStore.d.ts +9 -0
  839. package/dist/sync/v3/localSyncIdentityStore.js +43 -0
  840. package/dist/sync/v3/localTaskAttachmentLinksOutboxHandler.d.ts +10 -0
  841. package/dist/sync/v3/localTaskAttachmentLinksOutboxHandler.js +80 -0
  842. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.d.ts +46 -0
  843. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.js +303 -0
  844. package/dist/sync/v3/localTaskChecklistOutboxHandler.d.ts +10 -0
  845. package/dist/sync/v3/localTaskChecklistOutboxHandler.js +54 -0
  846. package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +47 -0
  847. package/dist/sync/v3/localTaskChecklistOutboxService.js +221 -0
  848. package/dist/sync/v3/localTaskCommentOutboxHandler.d.ts +10 -0
  849. package/dist/sync/v3/localTaskCommentOutboxHandler.js +94 -0
  850. package/dist/sync/v3/localTaskCommentOutboxService.d.ts +75 -0
  851. package/dist/sync/v3/localTaskCommentOutboxService.js +391 -0
  852. package/dist/sync/v3/localTaskCreateClient.d.ts +27 -0
  853. package/dist/sync/v3/localTaskCreateClient.js +209 -0
  854. package/dist/sync/v3/localTaskCreateOutboxHandler.d.ts +8 -0
  855. package/dist/sync/v3/localTaskCreateOutboxHandler.js +147 -0
  856. package/dist/sync/v3/localTaskCreateOutboxService.d.ts +77 -0
  857. package/dist/sync/v3/localTaskCreateOutboxService.js +397 -0
  858. package/dist/sync/v3/localTaskDeleteClient.d.ts +10 -0
  859. package/dist/sync/v3/localTaskDeleteClient.js +23 -0
  860. package/dist/sync/v3/localTaskDeleteOutboxHandler.d.ts +8 -0
  861. package/dist/sync/v3/localTaskDeleteOutboxHandler.js +54 -0
  862. package/dist/sync/v3/localTaskDeleteOutboxService.d.ts +38 -0
  863. package/dist/sync/v3/localTaskDeleteOutboxService.js +235 -0
  864. package/dist/sync/v3/localTaskLegacyRootAdoption.d.ts +28 -0
  865. package/dist/sync/v3/localTaskLegacyRootAdoption.js +219 -0
  866. package/dist/sync/v3/localTaskLifecycleClient.d.ts +49 -0
  867. package/dist/sync/v3/localTaskLifecycleClient.js +57 -0
  868. package/dist/sync/v3/localTaskLifecycleOutboxHandler.d.ts +8 -0
  869. package/dist/sync/v3/localTaskLifecycleOutboxHandler.js +94 -0
  870. package/dist/sync/v3/localTaskLifecycleOutboxService.d.ts +60 -0
  871. package/dist/sync/v3/localTaskLifecycleOutboxService.js +304 -0
  872. package/dist/sync/v3/localTaskMetadataClient.d.ts +13 -0
  873. package/dist/sync/v3/localTaskMetadataClient.js +30 -0
  874. package/dist/sync/v3/localTaskMetadataOutboxHandler.d.ts +8 -0
  875. package/dist/sync/v3/localTaskMetadataOutboxHandler.js +70 -0
  876. package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +48 -0
  877. package/dist/sync/v3/localTaskMetadataOutboxService.js +229 -0
  878. package/dist/sync/v3/localTaskOperationClient.d.ts +72 -0
  879. package/dist/sync/v3/localTaskOperationClient.js +195 -0
  880. package/dist/sync/v3/localTaskRelationshipOutboxHandler.d.ts +8 -0
  881. package/dist/sync/v3/localTaskRelationshipOutboxHandler.js +114 -0
  882. package/dist/sync/v3/localTaskRelationshipOutboxService.d.ts +45 -0
  883. package/dist/sync/v3/localTaskRelationshipOutboxService.js +192 -0
  884. package/dist/sync/v3/localTaskRestoreClient.d.ts +13 -0
  885. package/dist/sync/v3/localTaskRestoreClient.js +32 -0
  886. package/dist/sync/v3/localTaskRestoreOutboxHandler.d.ts +8 -0
  887. package/dist/sync/v3/localTaskRestoreOutboxHandler.js +41 -0
  888. package/dist/sync/v3/localTaskRestoreOutboxService.d.ts +56 -0
  889. package/dist/sync/v3/localTaskRestoreOutboxService.js +323 -0
  890. package/dist/sync/v3/localTaskStatusClient.d.ts +17 -0
  891. package/dist/sync/v3/localTaskStatusClient.js +35 -0
  892. package/dist/sync/v3/localTaskStatusOutboxHandler.d.ts +8 -0
  893. package/dist/sync/v3/localTaskStatusOutboxHandler.js +75 -0
  894. package/dist/sync/v3/localTaskStatusOutboxService.d.ts +53 -0
  895. package/dist/sync/v3/localTaskStatusOutboxService.js +422 -0
  896. package/dist/sync/v3/localTaxonomyCompositeOutboxService.d.ts +34 -0
  897. package/dist/sync/v3/localTaxonomyCompositeOutboxService.js +290 -0
  898. package/dist/sync/v3/localTaxonomyOutboxHandler.d.ts +9 -0
  899. package/dist/sync/v3/localTaxonomyOutboxHandler.js +106 -0
  900. package/dist/sync/v3/localTaxonomyOutboxService.d.ts +30 -0
  901. package/dist/sync/v3/localTaxonomyOutboxService.js +181 -0
  902. package/dist/sync/v3/localWorkflowRuntimeOutboxHandler.d.ts +8 -0
  903. package/dist/sync/v3/localWorkflowRuntimeOutboxHandler.js +113 -0
  904. package/dist/sync/v3/localWorkflowRuntimeOutboxService.d.ts +37 -0
  905. package/dist/sync/v3/localWorkflowRuntimeOutboxService.js +330 -0
  906. package/dist/sync/v3/localWorkspaceSyncServerOutboxDispatcher.d.ts +63 -0
  907. package/dist/sync/v3/localWorkspaceSyncServerOutboxDispatcher.js +264 -0
  908. package/dist/sync/v3/localWorkstreamOutboxHandler.d.ts +8 -0
  909. package/dist/sync/v3/localWorkstreamOutboxHandler.js +102 -0
  910. package/dist/sync/v3/localWorkstreamOutboxService.d.ts +52 -0
  911. package/dist/sync/v3/localWorkstreamOutboxService.js +581 -0
  912. package/dist/sync/v3/localWorkstreamTaskOrderOutboxHandler.d.ts +10 -0
  913. package/dist/sync/v3/localWorkstreamTaskOrderOutboxHandler.js +57 -0
  914. package/dist/sync/v3/localWorkstreamTaskOrderOutboxService.d.ts +30 -0
  915. package/dist/sync/v3/localWorkstreamTaskOrderOutboxService.js +128 -0
  916. package/dist/sync/v3/planningActivation.d.ts +13 -0
  917. package/dist/sync/v3/planningActivation.js +33 -0
  918. package/dist/sync/v3/planningAttachmentActivityValidation.d.ts +9 -0
  919. package/dist/sync/v3/planningAttachmentActivityValidation.js +87 -0
  920. package/dist/sync/v3/programScaffoldService.d.ts +143 -0
  921. package/dist/sync/v3/programScaffoldService.js +478 -0
  922. package/dist/sync/v3/syncDurabilityStore.d.ts +781 -0
  923. package/dist/sync/v3/syncDurabilityStore.js +4773 -0
  924. package/dist/sync/v3/taskActivityAuthoritativeRevision.d.ts +16 -0
  925. package/dist/sync/v3/taskActivityAuthoritativeRevision.js +67 -0
  926. package/dist/sync/v3/taskActivityJournal.d.ts +20 -0
  927. package/dist/sync/v3/taskActivityJournal.js +195 -0
  928. package/dist/sync/v3/taskAttachmentLinksActivityIdentity.d.ts +6 -0
  929. package/dist/sync/v3/taskAttachmentLinksActivityIdentity.js +14 -0
  930. package/dist/sync/v3/taskAttachmentLinksMutationService.d.ts +112 -0
  931. package/dist/sync/v3/taskAttachmentLinksMutationService.js +218 -0
  932. package/dist/sync/v3/taskChecklistActivityIdentity.d.ts +6 -0
  933. package/dist/sync/v3/taskChecklistActivityIdentity.js +14 -0
  934. package/dist/sync/v3/taskChecklistMutationService.d.ts +92 -0
  935. package/dist/sync/v3/taskChecklistMutationService.js +156 -0
  936. package/dist/sync/v3/taskCommentActivityIdentity.d.ts +7 -0
  937. package/dist/sync/v3/taskCommentActivityIdentity.js +15 -0
  938. package/dist/sync/v3/taskCommentMutationService.d.ts +150 -0
  939. package/dist/sync/v3/taskCommentMutationService.js +392 -0
  940. package/dist/sync/v3/taskCommentReconcileProvenance.d.ts +58 -0
  941. package/dist/sync/v3/taskCommentReconcileProvenance.js +170 -0
  942. package/dist/sync/v3/taskCreateActivation.d.ts +19 -0
  943. package/dist/sync/v3/taskCreateActivation.js +84 -0
  944. package/dist/sync/v3/taskCreateActivityIdentity.d.ts +7 -0
  945. package/dist/sync/v3/taskCreateActivityIdentity.js +18 -0
  946. package/dist/sync/v3/taskCreateMutationService.d.ts +103 -0
  947. package/dist/sync/v3/taskCreateMutationService.js +283 -0
  948. package/dist/sync/v3/taskDeleteActivation.d.ts +7 -0
  949. package/dist/sync/v3/taskDeleteActivation.js +14 -0
  950. package/dist/sync/v3/taskDeleteMutationService.d.ts +35 -0
  951. package/dist/sync/v3/taskDeleteMutationService.js +133 -0
  952. package/dist/sync/v3/taskLegacyRootAdoptionService.d.ts +78 -0
  953. package/dist/sync/v3/taskLegacyRootAdoptionService.js +175 -0
  954. package/dist/sync/v3/taskLifecycleActivityIdentity.d.ts +9 -0
  955. package/dist/sync/v3/taskLifecycleActivityIdentity.js +18 -0
  956. package/dist/sync/v3/taskLifecycleMutationPayload.d.ts +5 -0
  957. package/dist/sync/v3/taskLifecycleMutationPayload.js +28 -0
  958. package/dist/sync/v3/taskLifecycleMutationService.d.ts +66 -0
  959. package/dist/sync/v3/taskLifecycleMutationService.js +92 -0
  960. package/dist/sync/v3/taskMetadataActivation.d.ts +12 -0
  961. package/dist/sync/v3/taskMetadataActivation.js +38 -0
  962. package/dist/sync/v3/taskMetadataActivityIdentity.d.ts +7 -0
  963. package/dist/sync/v3/taskMetadataActivityIdentity.js +18 -0
  964. package/dist/sync/v3/taskMetadataCoexistence.d.ts +37 -0
  965. package/dist/sync/v3/taskMetadataCoexistence.js +138 -0
  966. package/dist/sync/v3/taskMetadataMutationService.d.ts +71 -0
  967. package/dist/sync/v3/taskMetadataMutationService.js +199 -0
  968. package/dist/sync/v3/taskRelationshipLegacyAdoptionService.d.ts +48 -0
  969. package/dist/sync/v3/taskRelationshipLegacyAdoptionService.js +164 -0
  970. package/dist/sync/v3/taskRelationshipMutationService.d.ts +50 -0
  971. package/dist/sync/v3/taskRelationshipMutationService.js +148 -0
  972. package/dist/sync/v3/taskRestoreMutationService.d.ts +90 -0
  973. package/dist/sync/v3/taskRestoreMutationService.js +179 -0
  974. package/dist/sync/v3/taskStatusActivation.d.ts +7 -0
  975. package/dist/sync/v3/taskStatusActivation.js +15 -0
  976. package/dist/sync/v3/taskStatusMutationService.d.ts +76 -0
  977. package/dist/sync/v3/taskStatusMutationService.js +308 -0
  978. package/dist/sync/v3/taskWorkflowMutationPayload.d.ts +4 -0
  979. package/dist/sync/v3/taskWorkflowMutationPayload.js +22 -0
  980. package/dist/sync/v3/taskWorkflowMutationService.d.ts +64 -0
  981. package/dist/sync/v3/taskWorkflowMutationService.js +102 -0
  982. package/dist/sync/v3/taxonomyCoexistence.d.ts +10 -0
  983. package/dist/sync/v3/taxonomyCoexistence.js +19 -0
  984. package/dist/sync/v3/taxonomyCompositeMutationService.d.ts +110 -0
  985. package/dist/sync/v3/taxonomyCompositeMutationService.js +304 -0
  986. package/dist/sync/v3/taxonomyMutationService.d.ts +57 -0
  987. package/dist/sync/v3/taxonomyMutationService.js +106 -0
  988. package/dist/sync/v3/taxonomyStateMutation.d.ts +22 -0
  989. package/dist/sync/v3/taxonomyStateMutation.js +49 -0
  990. package/dist/sync/v3/taxonomySyncPayload.d.ts +9 -0
  991. package/dist/sync/v3/taxonomySyncPayload.js +199 -0
  992. package/dist/sync/v3/workflowAssignmentSync.d.ts +22 -0
  993. package/dist/sync/v3/workflowAssignmentSync.js +213 -0
  994. package/dist/sync/v3/workflowRuntimeMutationService.d.ts +89 -0
  995. package/dist/sync/v3/workflowRuntimeMutationService.js +359 -0
  996. package/dist/sync/v3/workflowRuntimeOperationIdentity.d.ts +13 -0
  997. package/dist/sync/v3/workflowRuntimeOperationIdentity.js +35 -0
  998. package/dist/sync/v3/workflowRuntimeSync.d.ts +141 -0
  999. package/dist/sync/v3/workflowRuntimeSync.js +485 -0
  1000. package/dist/sync/v3/workspaceSyncJournalReader.d.ts +43 -0
  1001. package/dist/sync/v3/workspaceSyncJournalReader.js +45 -0
  1002. package/dist/sync/v3/workspaceSyncLocalOwnershipSnapshot.d.ts +28 -0
  1003. package/dist/sync/v3/workspaceSyncLocalOwnershipSnapshot.js +81 -0
  1004. package/dist/sync/v3/workspaceSyncPayloadFingerprint.d.ts +1 -0
  1005. package/dist/sync/v3/workspaceSyncPayloadFingerprint.js +5 -0
  1006. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.d.ts +16 -0
  1007. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.js +153 -0
  1008. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.d.ts +83 -0
  1009. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.js +161 -0
  1010. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.d.ts +16 -0
  1011. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.js +90 -0
  1012. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +65 -0
  1013. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +357 -0
  1014. package/dist/sync/v3/workspaceSyncV3CombinedCoverage.d.ts +51 -0
  1015. package/dist/sync/v3/workspaceSyncV3CombinedCoverage.js +171 -0
  1016. package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.d.ts +43 -0
  1017. package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.js +541 -0
  1018. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.d.ts +50 -0
  1019. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +1161 -0
  1020. package/dist/sync/v3/workspaceSyncV3CombinedProjectionState.d.ts +96 -0
  1021. package/dist/sync/v3/workspaceSyncV3CombinedProjectionState.js +672 -0
  1022. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +46 -0
  1023. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +621 -0
  1024. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +66 -0
  1025. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +527 -0
  1026. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +78 -0
  1027. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +566 -0
  1028. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +45 -0
  1029. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +125 -0
  1030. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.d.ts +13 -0
  1031. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +34 -0
  1032. package/dist/sync/v3/workspaceSyncV3CursorEncoding.d.ts +1 -0
  1033. package/dist/sync/v3/workspaceSyncV3CursorEncoding.js +6 -0
  1034. package/dist/sync/v3/workspaceSyncV3DomainAdmission.d.ts +43 -0
  1035. package/dist/sync/v3/workspaceSyncV3DomainAdmission.js +118 -0
  1036. package/dist/sync/v3/workspaceSyncV3Feed.d.ts +95 -0
  1037. package/dist/sync/v3/workspaceSyncV3Feed.js +243 -0
  1038. package/dist/sync/v3/workspaceSyncV3FeedApply.d.ts +13 -0
  1039. package/dist/sync/v3/workspaceSyncV3FeedApply.js +67 -0
  1040. package/dist/sync/v3/workspaceSyncV3FeedClientContract.d.ts +3 -0
  1041. package/dist/sync/v3/workspaceSyncV3FeedClientContract.js +46 -0
  1042. package/dist/sync/v3/workspaceSyncV3FeedCursorKeys.d.ts +10 -0
  1043. package/dist/sync/v3/workspaceSyncV3FeedCursorKeys.js +58 -0
  1044. package/dist/sync/v3/workspaceSyncV3FeedOrchestrator.d.ts +31 -0
  1045. package/dist/sync/v3/workspaceSyncV3FeedOrchestrator.js +228 -0
  1046. package/dist/sync/v3/workspaceSyncV3FeedProfile.d.ts +32 -0
  1047. package/dist/sync/v3/workspaceSyncV3FeedProfile.js +21 -0
  1048. package/dist/sync/v3/workspaceSyncV3InitiativeLocalApply.d.ts +36 -0
  1049. package/dist/sync/v3/workspaceSyncV3InitiativeLocalApply.js +163 -0
  1050. package/dist/sync/v3/workspaceSyncV3InitiativeRepair.d.ts +33 -0
  1051. package/dist/sync/v3/workspaceSyncV3InitiativeRepair.js +118 -0
  1052. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.d.ts +10 -0
  1053. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.js +45 -0
  1054. package/dist/sync/v3/workspaceSyncV3LocalOutboxStatus.d.ts +27 -0
  1055. package/dist/sync/v3/workspaceSyncV3LocalOutboxStatus.js +83 -0
  1056. package/dist/sync/v3/workspaceSyncV3NestedCoverage.d.ts +10 -0
  1057. package/dist/sync/v3/workspaceSyncV3NestedCoverage.js +40 -0
  1058. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.d.ts +83 -0
  1059. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.js +325 -0
  1060. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.d.ts +59 -0
  1061. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.js +302 -0
  1062. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +47 -0
  1063. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +329 -0
  1064. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.d.ts +19 -0
  1065. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.js +41 -0
  1066. package/dist/sync/v3/workspaceSyncV3NestedWireContract.d.ts +6 -0
  1067. package/dist/sync/v3/workspaceSyncV3NestedWireContract.js +16 -0
  1068. package/dist/sync/v3/workspaceSyncV3OperationProjection.d.ts +8 -0
  1069. package/dist/sync/v3/workspaceSyncV3OperationProjection.js +52 -0
  1070. package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +230 -0
  1071. package/dist/sync/v3/workspaceSyncV3OperationProtocol.js +1 -0
  1072. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +165 -0
  1073. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +414 -0
  1074. package/dist/sync/v3/workspaceSyncV3OriginActor.d.ts +36 -0
  1075. package/dist/sync/v3/workspaceSyncV3OriginActor.js +61 -0
  1076. package/dist/sync/v3/workspaceSyncV3OriginAssertion.d.ts +46 -0
  1077. package/dist/sync/v3/workspaceSyncV3OriginAssertion.js +121 -0
  1078. package/dist/sync/v3/workspaceSyncV3OriginAssertionHeader.d.ts +1 -0
  1079. package/dist/sync/v3/workspaceSyncV3OriginAssertionHeader.js +1 -0
  1080. package/dist/sync/v3/workspaceSyncV3PlanningOrderCoverage.d.ts +10 -0
  1081. package/dist/sync/v3/workspaceSyncV3PlanningOrderCoverage.js +34 -0
  1082. package/dist/sync/v3/workspaceSyncV3PlanningOrderWireContract.d.ts +6 -0
  1083. package/dist/sync/v3/workspaceSyncV3PlanningOrderWireContract.js +10 -0
  1084. package/dist/sync/v3/workspaceSyncV3ProjectionState.d.ts +105 -0
  1085. package/dist/sync/v3/workspaceSyncV3ProjectionState.js +467 -0
  1086. package/dist/sync/v3/workspaceSyncV3RepairSqlBatching.d.ts +2 -0
  1087. package/dist/sync/v3/workspaceSyncV3RepairSqlBatching.js +10 -0
  1088. package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.d.ts +56 -0
  1089. package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.js +250 -0
  1090. package/dist/sync/v3/workspaceSyncV3TaskRelationshipProjection.d.ts +30 -0
  1091. package/dist/sync/v3/workspaceSyncV3TaskRelationshipProjection.js +142 -0
  1092. package/dist/sync/v3/workspaceSyncV3TaskRootProjection.d.ts +40 -0
  1093. package/dist/sync/v3/workspaceSyncV3TaskRootProjection.js +246 -0
  1094. package/dist/sync/v3/workspaceSyncV3TaxonomyFeedProjection.d.ts +39 -0
  1095. package/dist/sync/v3/workspaceSyncV3TaxonomyFeedProjection.js +185 -0
  1096. package/dist/sync/v3/workspaceSyncV3WorkflowCoverage.d.ts +10 -0
  1097. package/dist/sync/v3/workspaceSyncV3WorkflowCoverage.js +36 -0
  1098. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.d.ts +17 -0
  1099. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.js +143 -0
  1100. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeProjection.d.ts +9 -0
  1101. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeProjection.js +195 -0
  1102. package/dist/sync/v3/workspaceSyncV3WorkflowWireContract.d.ts +11 -0
  1103. package/dist/sync/v3/workspaceSyncV3WorkflowWireContract.js +12 -0
  1104. package/dist/sync/v3/workspaceSyncV3WorkstreamProjection.d.ts +4 -0
  1105. package/dist/sync/v3/workspaceSyncV3WorkstreamProjection.js +98 -0
  1106. package/dist/sync/v3/workspaceSyncV3WorkstreamTaskOrderProjection.d.ts +9 -0
  1107. package/dist/sync/v3/workspaceSyncV3WorkstreamTaskOrderProjection.js +72 -0
  1108. package/dist/sync/v3/workstreamActivityAuthoritativeRevision.d.ts +11 -0
  1109. package/dist/sync/v3/workstreamActivityAuthoritativeRevision.js +23 -0
  1110. package/dist/sync/v3/workstreamActivityIdentity.d.ts +8 -0
  1111. package/dist/sync/v3/workstreamActivityIdentity.js +14 -0
  1112. package/dist/sync/v3/workstreamCoexistence.d.ts +19 -0
  1113. package/dist/sync/v3/workstreamCoexistence.js +64 -0
  1114. package/dist/sync/v3/workstreamMutationPayload.d.ts +27 -0
  1115. package/dist/sync/v3/workstreamMutationPayload.js +147 -0
  1116. package/dist/sync/v3/workstreamMutationService.d.ts +72 -0
  1117. package/dist/sync/v3/workstreamMutationService.js +256 -0
  1118. package/dist/sync/v3/workstreamTaskOrderMutationService.d.ts +55 -0
  1119. package/dist/sync/v3/workstreamTaskOrderMutationService.js +110 -0
  1120. package/dist/sync/v3/workstreamTaskOrderSync.d.ts +14 -0
  1121. package/dist/sync/v3/workstreamTaskOrderSync.js +25 -0
  1122. package/dist/sync/workspaceContentManifest.d.ts +86 -0
  1123. package/dist/sync/workspaceContentManifest.js +123 -0
  1124. package/dist/sync/workspacePullFeed.d.ts +191 -2
  1125. package/dist/sync/workspacePullFeed.js +523 -135
  1126. package/dist/sync/workspacePushPreparedPlan.d.ts +21 -0
  1127. package/dist/sync/workspacePushPreparedPlan.js +1 -0
  1128. package/dist/sync/workspaceRepair.d.ts +17 -25
  1129. package/dist/sync/workspaceRepair.js +348 -25
  1130. package/dist/sync/workspaceSyncContentDecryption.d.ts +6 -0
  1131. package/dist/sync/workspaceSyncContentDecryption.js +11 -0
  1132. package/dist/sync/workspaceSyncModel.d.ts +227 -5
  1133. package/dist/sync/workspaceSyncModel.js +398 -37
  1134. package/dist/sync/workspaceSyncSnapshotProjection.d.ts +11 -0
  1135. package/dist/sync/workspaceSyncSnapshotProjection.js +101 -0
  1136. package/dist/sync/workspaceSyncState.d.ts +13 -0
  1137. package/dist/sync/workspaceSyncState.js +36 -0
  1138. package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +106 -0
  1139. package/dist/sync/workspaceSyncV2SnapshotBuilder.js +193 -0
  1140. package/dist/types.d.ts +31 -15
  1141. package/dist/types.js +1 -3
  1142. package/dist/ui/ai-profile-clients/amazon-nova.svg +1 -0
  1143. package/dist/ui/ai-profile-clients/antigravity.png +0 -0
  1144. package/dist/ui/ai-profile-clients/chatgpt.svg +10 -0
  1145. package/dist/ui/ai-profile-clients/claude-chat.svg +1 -0
  1146. package/dist/ui/ai-profile-clients/claude-code.svg +15 -0
  1147. package/dist/ui/ai-profile-clients/cline-app-icon-light.png +0 -0
  1148. package/dist/ui/ai-profile-clients/cline.svg +16 -0
  1149. package/dist/ui/ai-profile-clients/codex.svg +1 -0
  1150. package/dist/ui/ai-profile-clients/copilot.png +0 -0
  1151. package/dist/ui/ai-profile-clients/cursor.svg +1 -0
  1152. package/dist/ui/ai-profile-clients/deepseek.svg +1 -0
  1153. package/dist/ui/ai-profile-clients/gemini-cli-icon.png +0 -0
  1154. package/dist/ui/ai-profile-clients/gemini.svg +10 -0
  1155. package/dist/ui/ai-profile-clients/grok.svg +31 -0
  1156. package/dist/ui/ai-profile-clients/kiro.svg +11 -0
  1157. package/dist/ui/ai-profile-clients/llama.svg +1 -0
  1158. package/dist/ui/ai-profile-clients/mistral.svg +1 -0
  1159. package/dist/ui/ai-profile-clients/ms_copilot.jpeg +0 -0
  1160. package/dist/ui/ai-profile-clients/openclaw.png +0 -0
  1161. package/dist/ui/ai-profile-clients/perplexity.svg +1 -0
  1162. package/dist/ui/ai-profile-clients/vscode.svg +41 -0
  1163. package/dist/ui/ai-profile-clients/windsurf.svg +11 -0
  1164. package/dist/ui/assets/AiIdentityRosterCard-MZs7lVED.js +1 -0
  1165. package/dist/ui/assets/AiProfilesModule-C3i0LOxe.js +1 -0
  1166. package/dist/ui/assets/AnnotatedAttachmentWorkspace-CBRZ8rca.css +1 -0
  1167. package/dist/ui/assets/AnnotatedAttachmentWorkspace-DVZk5Tln.js +3 -0
  1168. package/dist/ui/assets/AssetTraySortControl-B9k5caQW.css +1 -0
  1169. package/dist/ui/assets/AssetTraySortControl-Kf1pelSy.js +1 -0
  1170. package/dist/ui/assets/ContextAttachmentManager-B8boOs6Q.js +3 -0
  1171. package/dist/ui/assets/DocumentWorkspace-BIBGBfd7.css +1 -0
  1172. package/dist/ui/assets/DocumentWorkspace-DXH4XUsB.js +261 -0
  1173. package/dist/ui/assets/EntityActivityTimeline-BfJbZRdl.css +1 -0
  1174. package/dist/ui/assets/EntityActivityTimeline-BtSTq0ON.js +1 -0
  1175. package/dist/ui/assets/PlanningModule-BPVyEa-f.js +1 -0
  1176. package/dist/ui/assets/PlanningModule-CoIR9hbV.css +1 -0
  1177. package/dist/ui/assets/PlansPage-C2nkK2Bp.css +1 -0
  1178. package/dist/ui/assets/PlansPage-ChqgxALc.js +1 -0
  1179. package/dist/ui/assets/TaskContextUpload-CB3ol0sN.js +1 -0
  1180. package/dist/ui/assets/TaskContextUpload-qmBeUw3u.css +1 -0
  1181. package/dist/ui/assets/TaskSettings-g4ECKNOz.js +12 -0
  1182. package/dist/ui/assets/TaskforceAgentsModule-BazdUwxZ.js +21 -0
  1183. package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +1 -0
  1184. package/dist/ui/assets/WorkflowManagerModule-DF10XENz.css +1 -0
  1185. package/dist/ui/assets/WorkflowManagerModule-DWFspC-o.js +1 -0
  1186. package/dist/ui/assets/antigravity-DRKQga2U.png +0 -0
  1187. package/dist/ui/assets/cursor-BM_3k4Y4.svg +1 -0
  1188. package/dist/ui/assets/gemini-cli-icon-dBAVjCcn.png +0 -0
  1189. package/dist/ui/assets/grok-BuodbWaG.svg +31 -0
  1190. package/dist/ui/assets/index-BUplSsv_.js +7 -0
  1191. package/dist/ui/assets/index-gz2EXuoK.css +1 -0
  1192. package/dist/ui/assets/{vendor-dnd-DRzYolkg.js → vendor-dnd-CJ-AjP-Y.js} +1 -1
  1193. package/dist/ui/assets/{vendor-icons-CLnehDTw.js → vendor-icons-BkFLXavV.js} +1 -1
  1194. package/dist/ui/assets/{vendor-markdown-BUxTU7dS.js → vendor-markdown-_lhNCyq-.js} +9 -9
  1195. package/dist/ui/assets/vendor-router-AqJMU8Lz.js +3 -0
  1196. package/dist/ui/assets/vscode-C_7wk1WI.svg +41 -0
  1197. package/dist/ui/branding/logos/logo_dark_bg.png +0 -0
  1198. package/dist/ui/branding/logos/logo_favicon_dark.png +0 -0
  1199. package/dist/ui/branding/logos/logo_favicon_dark.svg +56 -0
  1200. package/dist/ui/branding/logos/logo_favicon_light.png +0 -0
  1201. package/dist/ui/branding/logos/logo_light_bg.png +0 -0
  1202. package/dist/ui/images/Taskforce_Van.webp +0 -0
  1203. package/dist/ui/index.html +6 -6
  1204. package/dist/update/uiUpdateService.d.ts +43 -0
  1205. package/dist/update/uiUpdateService.js +149 -0
  1206. package/dist/update/updateCli.d.ts +15 -0
  1207. package/dist/update/updateCli.js +76 -0
  1208. package/dist/update/updateExecutor.d.ts +40 -0
  1209. package/dist/update/updateExecutor.js +474 -0
  1210. package/dist/update/updateStatus.d.ts +83 -0
  1211. package/dist/update/updateStatus.js +703 -0
  1212. package/dist/utils/aiProfileAvatarPaths.d.ts +14 -0
  1213. package/dist/utils/aiProfileAvatarPaths.js +52 -0
  1214. package/dist/utils/aiProfileDefaultLogo.d.ts +7 -0
  1215. package/dist/utils/aiProfileDefaultLogo.js +84 -0
  1216. package/dist/utils/aiProfileEvents.d.ts +9 -1
  1217. package/dist/utils/annotatedAttachments.d.ts +8 -0
  1218. package/dist/utils/annotatedAttachments.js +17 -1
  1219. package/dist/utils/assetTraySorting.d.ts +25 -0
  1220. package/dist/utils/assetTraySorting.js +83 -0
  1221. package/dist/utils/assignees.d.ts +5 -0
  1222. package/dist/utils/assignees.js +14 -9
  1223. package/dist/utils/authLogin.d.ts +10 -0
  1224. package/dist/utils/authLogin.js +8 -0
  1225. package/dist/utils/authSessionEvents.d.ts +2 -0
  1226. package/dist/utils/authSessionEvents.js +6 -0
  1227. package/dist/utils/avatarUpload.js +5 -5
  1228. package/dist/utils/canonicalReferenceAttachments.d.ts +12 -0
  1229. package/dist/utils/canonicalReferenceAttachments.js +42 -0
  1230. package/dist/utils/cloudAssetDisplay.d.ts +2 -0
  1231. package/dist/utils/cloudAssetDisplay.js +8 -0
  1232. package/dist/utils/constants.d.ts +4 -11
  1233. package/dist/utils/constants.js +6 -65
  1234. package/dist/utils/contextAttachmentPreview.d.ts +11 -0
  1235. package/dist/utils/contextAttachmentPreview.js +8 -0
  1236. package/dist/utils/contextAttachmentUpload.d.ts +10 -0
  1237. package/dist/utils/contextAttachmentUpload.js +151 -0
  1238. package/dist/utils/contextFiles.d.ts +1 -1
  1239. package/dist/utils/contextFiles.js +4 -4
  1240. package/dist/utils/documentNames.js +6 -4
  1241. package/dist/utils/entityReferences.d.ts +14 -0
  1242. package/dist/utils/entityReferences.js +21 -0
  1243. package/dist/utils/httpSetCookie.d.ts +3 -0
  1244. package/dist/utils/httpSetCookie.js +22 -0
  1245. package/dist/utils/imageNoteStoragePaths.d.ts +3 -0
  1246. package/dist/utils/imageNoteStoragePaths.js +19 -0
  1247. package/dist/utils/imageReferences.d.ts +6 -0
  1248. package/dist/utils/imageReferences.js +1 -0
  1249. package/dist/utils/planningArchiveOrchestrator.d.ts +23 -0
  1250. package/dist/utils/planningArchiveOrchestrator.js +37 -0
  1251. package/dist/utils/planningArchivePresentation.d.ts +20 -0
  1252. package/dist/utils/planningArchivePresentation.js +23 -0
  1253. package/dist/utils/planningArchiveReadiness.d.ts +26 -0
  1254. package/dist/utils/planningArchiveReadiness.js +30 -0
  1255. package/dist/utils/planningFavorites.d.ts +7 -0
  1256. package/dist/utils/planningFavorites.js +34 -0
  1257. package/dist/utils/syncEventPresentation.js +53 -0
  1258. package/dist/utils/syncStatusPresentation.d.ts +25 -0
  1259. package/dist/utils/syncStatusPresentation.js +86 -5
  1260. package/dist/utils/taskActivity.d.ts +9 -2
  1261. package/dist/utils/taskActivity.js +61 -0
  1262. package/dist/utils/taskDraftDefaults.d.ts +0 -8
  1263. package/dist/utils/taskDraftDefaults.js +0 -4
  1264. package/dist/utils/taskEvents.d.ts +11 -0
  1265. package/dist/utils/taskEvents.js +6 -0
  1266. package/dist/utils/taskHeaderQuickFilter.d.ts +14 -0
  1267. package/dist/utils/taskHeaderQuickFilter.js +32 -0
  1268. package/dist/utils/taskInvalidation.d.ts +23 -0
  1269. package/dist/utils/taskInvalidation.js +67 -0
  1270. package/dist/utils/taskNormalization.d.ts +2 -1
  1271. package/dist/utils/taskNormalization.js +44 -18
  1272. package/dist/utils/taskReferences.d.ts +16 -0
  1273. package/dist/utils/taskReferences.js +63 -0
  1274. package/dist/utils/taskforceAgentEvents.d.ts +8 -0
  1275. package/dist/utils/taskforceAgentEvents.js +6 -0
  1276. package/dist/utils/taskforceAgentSkillEvents.d.ts +7 -0
  1277. package/dist/utils/taskforceAgentSkillEvents.js +8 -0
  1278. package/dist/utils/uiNotice.d.ts +3 -0
  1279. package/dist/utils/uiNotice.js +1 -1
  1280. package/dist/utils/workspaceResourceEvents.d.ts +7 -0
  1281. package/dist/utils/workspaceResourceEvents.js +6 -0
  1282. package/dist/utils/workspaceSyncPresentation.d.ts +24 -0
  1283. package/dist/utils/workspaceSyncPresentation.js +243 -6
  1284. package/package.json +74 -21
  1285. package/dist/components/features/AgentsModule.d.ts +0 -18
  1286. package/dist/components/features/AgentsModule.js +0 -479
  1287. package/dist/components/features/InitiativesModule.d.ts +0 -22
  1288. package/dist/components/features/InitiativesModule.js +0 -33
  1289. package/dist/components/features/WorkflowsModule.d.ts +0 -27
  1290. package/dist/components/features/WorkflowsModule.js +0 -21
  1291. package/dist/components/features/settings/WorkflowEditor.d.ts +0 -15
  1292. package/dist/components/features/settings/WorkflowEditor.js +0 -245
  1293. package/dist/components/views/panels/DocumentFilterToolbar.d.ts +0 -10
  1294. package/dist/components/views/panels/DocumentFilterToolbar.js +0 -7
  1295. package/dist/components/views/standalone/modals/AccountHubModal.d.ts +0 -61
  1296. package/dist/components/views/standalone/modals/AccountHubModal.js +0 -108
  1297. package/dist/components/views/standalone/modals/EditProfileModal.d.ts +0 -19
  1298. package/dist/components/views/standalone/modals/EditProfileModal.js +0 -11
  1299. package/dist/hooks/ui/useResourceExport.d.ts +0 -21
  1300. package/dist/hooks/ui/useResourceExport.js +0 -87
  1301. package/dist/hooks/ui/useWorkflowTemplates.d.ts +0 -37
  1302. package/dist/hooks/ui/useWorkflowTemplates.js +0 -116
  1303. package/dist/mcp/clientProfileDefaults.d.ts +0 -12
  1304. package/dist/mcp/clientProfileDefaults.js +0 -41
  1305. package/dist/resources/templates/WORKFLOW_V2_POLICY.md +0 -55
  1306. package/dist/resources/templates/environments/aider.yaml +0 -14
  1307. package/dist/resources/templates/environments/antigravity.yaml +0 -10
  1308. package/dist/resources/templates/environments/claude.yaml +0 -10
  1309. package/dist/resources/templates/environments/cline.yaml +0 -10
  1310. package/dist/resources/templates/environments/codex.yaml +0 -13
  1311. package/dist/resources/templates/environments/copilot.yaml +0 -10
  1312. package/dist/resources/templates/environments/cursor.yaml +0 -9
  1313. package/dist/resources/templates/environments/gemini.yaml +0 -9
  1314. package/dist/resources/templates/environments/windsurf.yaml +0 -10
  1315. package/dist/resources/templates/workflow-sources/README.md +0 -9
  1316. package/dist/resources/templates/workflow-sources/workflowDocs.mjs +0 -530
  1317. package/dist/resources/templates/workflow-sources/workflowEditorOverrides.json +0 -1
  1318. package/dist/resources/templates/workflows/collaborate.yaml +0 -109
  1319. package/dist/resources/templates/workflows/do.yaml +0 -87
  1320. package/dist/resources/templates/workflows/evaluate.yaml +0 -116
  1321. package/dist/resources/templates/workflows/execute.yaml +0 -156
  1322. package/dist/resources/templates/workflows/plan.yaml +0 -118
  1323. package/dist/resources/templates/workflows/review.yaml +0 -114
  1324. package/dist/services/formatTransformers.d.ts +0 -29
  1325. package/dist/services/formatTransformers.js +0 -56
  1326. package/dist/services/templateEngine.d.ts +0 -46
  1327. package/dist/services/templateEngine.js +0 -148
  1328. package/dist/shared/workflowDefaults.d.ts +0 -9
  1329. package/dist/shared/workflowDefaults.js +0 -11
  1330. package/dist/ui/agent-logos/Gemini CLI.jpeg +0 -0
  1331. package/dist/ui/agent-logos/antigravity.jpeg +0 -0
  1332. package/dist/ui/agent-logos/chatgpt.png +0 -0
  1333. package/dist/ui/agent-logos/claude-code.jpeg +0 -0
  1334. package/dist/ui/agent-logos/codex.jpeg +0 -0
  1335. package/dist/ui/agent-logos/cursor.png +0 -0
  1336. package/dist/ui/agent-logos/openclaw.jpeg +0 -0
  1337. package/dist/ui/agent-logos/windsurf.png +0 -0
  1338. package/dist/ui/assets/AgentsModule-C4LcqhcZ.js +0 -1
  1339. package/dist/ui/assets/AnnotatedAttachmentWorkspace-B-Dq22d2.js +0 -3
  1340. package/dist/ui/assets/AnnotatedAttachmentWorkspace-BVKew-mH.css +0 -1
  1341. package/dist/ui/assets/ContextAttachmentManager-DsXPTvi-.js +0 -3
  1342. package/dist/ui/assets/DocumentWorkspace-CxA1wO3U.js +0 -252
  1343. package/dist/ui/assets/DocumentWorkspace-D4rJKXzd.css +0 -1
  1344. package/dist/ui/assets/EntityActivityTimeline-B8nSe8l3.js +0 -1
  1345. package/dist/ui/assets/EntityActivityTimeline-DyqvvhuF.css +0 -1
  1346. package/dist/ui/assets/InitiativesModule-VY95v38E.js +0 -1
  1347. package/dist/ui/assets/PlansPage-CQbKDv1a.js +0 -1
  1348. package/dist/ui/assets/PlansPage-DeAzWYTb.css +0 -1
  1349. package/dist/ui/assets/TaskContextUpload-DvDlNpHC.js +0 -1
  1350. package/dist/ui/assets/TaskSettings-CUWbYYtP.js +0 -12
  1351. package/dist/ui/assets/WorkflowsModule-CgM3Jako.js +0 -5
  1352. package/dist/ui/assets/documentReferences-Do9YjrS3.js +0 -1
  1353. package/dist/ui/assets/index--mh3pktj.js +0 -5
  1354. package/dist/ui/assets/index-BawaaEXS.css +0 -1
  1355. package/dist/ui/assets/vendor-router-BbWMxlnO.js +0 -3
  1356. package/dist/ui/branding/logos/logo_black_01.png +0 -0
  1357. package/dist/ui/branding/logos/logo_black_02.png +0 -0
  1358. package/dist/ui/branding/logos/logo_white_01.png +0 -0
  1359. package/dist/ui/branding/logos/logo_white_02.png +0 -0
  1360. package/scripts/generate-workflow-templates.mjs +0 -134
  1361. package/src/resources/templates/WORKFLOW_V2_POLICY.md +0 -55
  1362. package/src/resources/templates/environments/aider.yaml +0 -14
  1363. package/src/resources/templates/environments/antigravity.yaml +0 -10
  1364. package/src/resources/templates/environments/claude.yaml +0 -10
  1365. package/src/resources/templates/environments/cline.yaml +0 -10
  1366. package/src/resources/templates/environments/codex.yaml +0 -13
  1367. package/src/resources/templates/environments/copilot.yaml +0 -10
  1368. package/src/resources/templates/environments/cursor.yaml +0 -9
  1369. package/src/resources/templates/environments/gemini.yaml +0 -9
  1370. package/src/resources/templates/environments/windsurf.yaml +0 -10
  1371. package/src/resources/templates/workflow-sources/README.md +0 -9
  1372. package/src/resources/templates/workflow-sources/workflowDocs.mjs +0 -530
  1373. package/src/resources/templates/workflow-sources/workflowEditorOverrides.json +0 -1
  1374. package/src/resources/templates/workflows/collaborate.yaml +0 -109
  1375. package/src/resources/templates/workflows/do.yaml +0 -87
  1376. package/src/resources/templates/workflows/evaluate.yaml +0 -116
  1377. package/src/resources/templates/workflows/execute.yaml +0 -156
  1378. package/src/resources/templates/workflows/plan.yaml +0 -118
  1379. package/src/resources/templates/workflows/review.yaml +0 -114
  1380. /package/dist/ui/branding/logos/{logo_dark.svg → logo_dark_no_bg.svg} +0 -0
  1381. /package/dist/ui/branding/logos/{logo_favicon.svg → logo_favicon_light.svg} +0 -0
  1382. /package/dist/ui/branding/logos/{logo_light.svg → logo_light_no_bg.svg} +0 -0
@@ -19,36 +19,47 @@
19
19
  * Key exports: useSyncOrchestrator, UseSyncOrchestratorInput, WorkspaceSyncStatus
20
20
  */
21
21
  // === SECTION: Imports & module-level constants ===
22
- import { useState, useEffect, useCallback, useRef, useMemo } from 'react';
22
+ import { useState, useEffect, useCallback, useRef, useMemo, useLayoutEffect, } from 'react';
23
23
  import { ensureCloudWorkspaceReadyForSyncService, syncUserGlobalSettingsService } from '../sync/syncService';
24
- import { buildWorkspaceSyncPayloadModel, buildWorkspaceSyncSignatureModel } from '../sync/workspaceSyncModel';
24
+ import { buildWorkspaceSyncV2Candidate, buildWorkspaceSyncV2Signature, createWorkspaceSyncV2FrozenSnapshot, } from '../sync/workspaceSyncV2SnapshotBuilder.js';
25
+ import { normalizeAgentRoleSyncPayload, normalizeTaskforceAgentSkillSyncPayload, } from '../sync/collaborationSyncPayload.js';
26
+ import { hasWorkspaceTaxonomyStatePayload } from '../shared/taxonomyState.js';
25
27
  import { useWorkspaceSyncController } from './useWorkspaceSyncController';
26
28
  import { normalizeTaskforceTheme } from '../utils/theme';
27
29
  import { useRealtimeSync } from './useRealtimeSync';
28
30
  import { TASKFORCE_CONTEXT_ASSETS_MUTATED_EVENT } from '../utils/contextAssetEvents';
29
- import { TASKFORCE_AI_PROFILES_MUTATED_EVENT } from '../utils/aiProfileEvents';
31
+ import { dispatchTaskforceAiProfilesMutated, TASKFORCE_AI_PROFILES_MUTATED_EVENT, } from '../utils/aiProfileEvents';
32
+ import { dispatchTaskforceAgentsMutated, TASKFORCE_AGENTS_MUTATED_EVENT, } from '../utils/taskforceAgentEvents';
33
+ import { dispatchTaskforceAgentSkillsMutated, TASKFORCE_AGENT_SKILLS_MUTATED_EVENT, } from '../utils/taskforceAgentSkillEvents';
30
34
  import { setLocale as setAppLocale } from '../localization';
31
35
  import { normalizeTaskFromApi } from '../utils/taskNormalization.js';
32
36
  import { normalizeSyncEventDetails } from '../utils/syncEventDetails';
33
37
  import { createSyncAuthCoordinator } from './sync/auth';
34
38
  import { createBootstrapTimeoutMonitor, syncBootstrapPhaseTracking } from './sync/bootstrap';
35
39
  import { resolvePullSyncReadiness, resolvePushSyncReadiness, resolveRetrySyncReadiness } from './sync/controlPlane';
36
- import { resolveWorkspaceAutomaticPullPolicy, resolveWorkspaceSyncPresentation, shouldRunWorkspaceStartupRepair, shouldScheduleWorkspaceReactivePush, shouldStartWorkspacePeriodicFullReconcile, shouldStartWorkspacePushWatchdog, } from './sync/lifecyclePolicy';
37
- import { buildPersistedSyncWatermarksSnapshot, buildTaxonomyStateFingerprint, flattenDocumentReviewComments, flattenTaskEvents, isValidWorkspaceKey, logSyncDebug, normalizeWorkspaceSyncAiProfileSnapshotEntry, parsePersistedSyncWatermarksSnapshot, readPersistedSyncWatermarks, readUserGlobalSyncMeta, savePersistedSyncWatermarks, WORKSPACE_CONCURRENT_WINDOW_MESSAGE, WORKSPACE_FULL_RECONCILE_INTERVAL_MS, writeUserGlobalSyncMeta } from './sync/orchestratorShared';
40
+ import { resolveWorkspaceAutomaticPullPolicy, resolveWorkspaceSyncPresentation, shouldRunWorkspaceStartupRepair, shouldScheduleWorkspaceReactivePush, shouldStartWorkspacePeriodicFullReconcile, shouldStartWorkspacePushWatchdog, WORKSPACE_SYNC_PULL_FRESHNESS_WINDOW_MS, } from './sync/lifecyclePolicy';
41
+ import { buildPersistedSyncWatermarksSnapshot, buildTaxonomyStateFingerprint, flattenDocumentReviewComments, flattenTaskEvents, isValidWorkspaceKey, logSyncDebug, normalizeWorkspaceSyncAiProfileSnapshotEntry, normalizeWorkspaceSyncAgentConversationSnapshotEntry, normalizeWorkspaceSyncTaskforceAgentSnapshotEntry, parsePersistedSyncWatermarksSnapshot, readPersistedSyncWatermarks, readUserGlobalSyncMeta, savePersistedSyncWatermarks, WORKSPACE_CONCURRENT_WINDOW_MESSAGE, WORKSPACE_FULL_RECONCILE_INTERVAL_MS, writeUserGlobalSyncMeta } from './sync/orchestratorShared';
38
42
  import { createRealtimeSyncBridge } from './sync/realtime';
39
43
  import { createSyncRecoveryCoordinator } from './sync/recovery';
40
44
  import { createWorkspaceTransferCoordinator } from './sync/transfers';
41
- import { aiProfileSyncResourceAdapter, taskSyncResourceAdapter } from '../sync/syncResourceAdapters.js';
45
+ import { aiProfileSyncResourceAdapter, getAiProfileSyncSnapshotFingerprint, getTaskRelationshipSyncChangeKey, getTaxonomySyncChangeKey, taskSyncResourceAdapter, } from '../sync/syncResourceAdapters.js';
46
+ import { useDurableLocalOutboxDrain } from './sync/useDurableLocalOutboxDrain.js';
47
+ import { createBrowserWorkspaceSyncEngineLocalServices } from '../sync/engine/workspaceSyncEngineLocalServices.js';
48
+ import { useLocalSyncCoordinatorSnapshot } from './sync/useLocalSyncCoordinatorSnapshot.js';
49
+ import { isServerOwnedBrowserSyncAuthority, resolveBrowserSyncAuthority, shouldAttachLocalSyncCoordinator, } from './sync/browserSyncAuthority.js';
50
+ import { LocalSyncCoordinatorBrowserClient, LocalSyncCoordinatorBrowserClientError, } from '../sync/coordinator/localSyncCoordinatorBrowserClient.js';
51
+ import { isBrowserSyncRemoteServicesSelectionAuthorized, selectBrowserSyncRemoteServices, } from './sync/browserSyncRemoteServices.js';
42
52
  const EMPTY_WORKSPACE_SYNC_REFERENCE_SNAPSHOT_STATUS = {
43
53
  documents: false,
44
54
  aiProfiles: false,
45
55
  assets: false,
46
56
  documentReviewSessions: false,
47
- annotatedAttachmentSessions: false
57
+ annotatedAttachmentSessions: false,
58
+ taskforceAgents: false
48
59
  };
49
60
  export { normalizeWorkspaceSyncAiProfileSnapshotEntry };
50
61
  export function useSyncOrchestrator(input) {
51
- const { currentWorkspaceId, cloudAuthConfigured, runtimeMode, authSessionResolved, isAuthenticated, authUserId, projectName, resolveCloudAuthUrl, resolveWebSocketUrl, realtimeSyncEnabled, tasks, archivedTasks, deletedTasks = [], initiatives, workstreams, taxonomies, taxonomyState, setupState, globalTheme, locale, globalWeekStartsOn, themeUseGlobalDefault, setTasks, setArchivedTasks, setAuthBlocked, setIsAuthenticated, checkAuthSession, setGlobalTheme, setCurrentTheme, setSetupState, setLocale, setGlobalWeekStartsOn, fetchPlanningEntities } = input;
62
+ const { currentWorkspaceId, cloudAuthConfigured, runtimeMode, authSessionResolved, isAuthenticated, authUserId, projectName, resolveCloudAuthUrl, resolveWebSocketUrl, realtimeSyncEnabled, localOutboxDispatchEnabled, localCoordinatorBrowserAuthorityGateEnabled = false, localCoordinatorClient, initiativeFeedActivationEnabled, combinedFeedActivationEnabled, combinedFeedCoverage, tasks, archivedTasks, deletedTasks = [], initiatives, workstreams, taxonomies, taxonomyState, setupState, globalTheme, locale, globalWeekStartsOn, themeUseGlobalDefault, setTasks, setArchivedTasks, setAuthBlocked, setIsAuthenticated, checkAuthSession, setGlobalTheme, setCurrentTheme, setSetupState, setLocale, setGlobalWeekStartsOn, fetchPlanningEntities } = input;
52
63
  const taxonomyStateFingerprint = useMemo(() => buildTaxonomyStateFingerprint(taxonomyState), [taxonomyState]);
53
64
  // === SECTION: State initialization ===
54
65
  const [userGlobalSyncStatus, setUserGlobalSyncStatus] = useState('disconnected');
@@ -62,14 +73,29 @@ export function useSyncOrchestrator(input) {
62
73
  const [workspaceSyncSetupIntent, setWorkspaceSyncSetupIntent] = useState(null);
63
74
  const [workspaceSyncBusy, setWorkspaceSyncBusy] = useState(false);
64
75
  const [workspaceSyncPendingChanges, setWorkspaceSyncPendingChanges] = useState(0);
76
+ const [workspaceSyncV3OutboxStatus, setWorkspaceSyncV3OutboxStatus] = useState(null);
77
+ const workspaceSyncV3OutboxStatusRef = useRef(null);
78
+ const handleWorkspaceSyncV3OutboxStatus = useCallback((status) => {
79
+ workspaceSyncV3OutboxStatusRef.current = status;
80
+ setWorkspaceSyncV3OutboxStatus(status);
81
+ }, []);
65
82
  const [workspaceSyncMarkdownDocuments, setWorkspaceSyncMarkdownDocuments] = useState([]);
66
83
  const [workspaceSyncMarkdownDocumentsFingerprint, setWorkspaceSyncMarkdownDocumentsFingerprint] = useState('');
67
84
  // Ref mirror kept in sync with state — readable synchronously inside callbacks to avoid
68
85
  // stale-closure issues when buildWorkspaceSyncPayload is called after an async refresh.
69
86
  const workspaceTasksRef = useRef(tasks || []);
70
87
  const workspaceArchivedTasksRef = useRef(archivedTasks || []);
88
+ const workspaceDeletedTasksRef = useRef(deletedTasks || []);
89
+ const workspaceTaskRelationshipsRef = useRef([]);
90
+ const [workspaceTaskRelationships, setWorkspaceTaskRelationships] = useState([]);
91
+ const updateWorkspaceTaskRelationships = useCallback((relationships) => {
92
+ workspaceTaskRelationshipsRef.current = relationships;
93
+ setWorkspaceTaskRelationships(relationships);
94
+ }, []);
71
95
  const workspaceInitiativesRef = useRef(initiatives || []);
72
96
  const workspaceWorkstreamsRef = useRef(workstreams || []);
97
+ const workspaceTaxonomyStateRef = useRef(taxonomyState);
98
+ const workspaceTaxonomiesRef = useRef(taxonomies || []);
73
99
  const workspaceSyncMarkdownDocumentsRef = useRef([]);
74
100
  const workspaceSyncKnownDocumentPathsRef = useRef(new Set());
75
101
  const [workspaceSyncAiProfiles, setWorkspaceSyncAiProfiles] = useState([]);
@@ -90,6 +116,12 @@ export function useSyncOrchestrator(input) {
90
116
  const [workspaceSyncAnnotatedAttachmentSessions, setWorkspaceSyncAnnotatedAttachmentSessions] = useState([]);
91
117
  const [workspaceSyncAnnotatedAttachmentSessionsFingerprint, setWorkspaceSyncAnnotatedAttachmentSessionsFingerprint] = useState('');
92
118
  const workspaceSyncAnnotatedAttachmentSessionsRef = useRef([]);
119
+ const [workspaceSyncTaskforceAgents, setWorkspaceSyncTaskforceAgents] = useState([]);
120
+ const [workspaceSyncTaskforceAgentsFingerprint, setWorkspaceSyncTaskforceAgentsFingerprint] = useState('');
121
+ const workspaceSyncTaskforceAgentsRef = useRef([]);
122
+ const workspaceSyncAgentRolesRef = useRef([]);
123
+ const workspaceSyncTaskforceAgentSkillsRef = useRef([]);
124
+ const workspaceSyncAgentConversationsRef = useRef([]);
93
125
  const [workspaceSyncReferenceSnapshotStatus, setWorkspaceSyncReferenceSnapshotStatus] = useState(EMPTY_WORKSPACE_SYNC_REFERENCE_SNAPSHOT_STATUS);
94
126
  const [realtimeConnectionState, setRealtimeConnectionState] = useState('degraded-fallback');
95
127
  const [realtimeTelemetry, setRealtimeTelemetry] = useState({
@@ -111,12 +143,15 @@ export function useSyncOrchestrator(input) {
111
143
  const workspaceSyncAssetsFingerprintRef = useRef('');
112
144
  const workspaceSyncDocumentReviewSessionsFingerprintRef = useRef('');
113
145
  const workspaceSyncAnnotatedAttachmentSessionsFingerprintRef = useRef('');
146
+ const workspaceSyncTaskforceAgentsFingerprintRef = useRef('');
114
147
  const syncInFlightRef = useRef(false);
115
148
  const realtimePullDebounceRef = useRef(null);
116
149
  const realtimeSuppressedEventIdsRef = useRef(new Set());
117
150
  const realtimeSuppressedEventQueueRef = useRef([]);
118
151
  const workspacePendingPushReplayRef = useRef(null);
152
+ const workspaceBlockedPushSignatureRef = useRef('');
119
153
  const retryWorkspaceSyncRef = useRef(() => Promise.resolve(false));
154
+ const browserExecutionFenceDiagnosticEpochRef = useRef('');
120
155
  const syncUserGlobalSettingsRef = useRef(async () => { });
121
156
  const bootstrapPhaseStartedAtRef = useRef(null);
122
157
  const bootstrapLastProgressAtRef = useRef(null);
@@ -153,14 +188,55 @@ export function useSyncOrchestrator(input) {
153
188
  }));
154
189
  }, []);
155
190
  const workspaceSyncReferenceSnapshotsReady = Object.values(workspaceSyncReferenceSnapshotStatus).every(Boolean);
156
- const { workspaceRetryAt, isWorkspaceRetryPending, workspacePushInFlightRef, workspacePullInFlightRef, workspaceLastPushedSignatureRef, workspacePendingSignatureRef, workspaceLastPushedTaskIdsRef, workspaceDeletedTaskIdsRef, workspaceDeletedTaskWatermarksRef, workspacePullCursorRef, clearWorkspaceRetry, scheduleWorkspaceRetry, persistWorkspaceSyncPatch, applyWorkspaceSyncPatchLocally, readWorkspaceSyncStateSnapshot, loadWorkspaceSyncState, applyWorkspaceSyncStateSnapshot: applyWorkspaceSyncStateSnapshotBase, saveWorkspaceCloudSyncSettings: saveWorkspaceCloudSyncSettingsBase, acquireWorkspaceSyncLease, releaseWorkspaceSyncLease, forceClearWorkspaceSyncLease } = useWorkspaceSyncController({
191
+ const effectiveLocalCoordinatorClient = useMemo(() => localCoordinatorClient || new LocalSyncCoordinatorBrowserClient(), [localCoordinatorClient]);
192
+ const localCoordinatorAttachmentEnabled = shouldAttachLocalSyncCoordinator({
193
+ runtimeMode,
194
+ });
195
+ const localCoordinator = useLocalSyncCoordinatorSnapshot({
196
+ // Durable dispatch must be able to reattach after a local server restart
197
+ // even when the browser's derived auth state is stale. The coordinator
198
+ // route remains the authority and validates the session cookie itself.
199
+ enabled: localCoordinatorAttachmentEnabled,
200
+ workspaceId: currentWorkspaceId,
201
+ client: effectiveLocalCoordinatorClient,
202
+ });
203
+ const browserSyncAuthority = useMemo(() => resolveBrowserSyncAuthority({
204
+ enforcementEnabled: localCoordinatorBrowserAuthorityGateEnabled,
205
+ workspaceId: currentWorkspaceId,
206
+ phase: localCoordinator.phase,
207
+ snapshot: localCoordinator.snapshot,
208
+ }), [
209
+ currentWorkspaceId,
210
+ localCoordinator.phase,
211
+ localCoordinator.snapshot,
212
+ localCoordinatorBrowserAuthorityGateEnabled,
213
+ ]);
214
+ // Durable dispatch, like every browser transfer, uses the permit-backed
215
+ // coordinator gateway and waits for an exact attached browser owner.
216
+ const localOutboxCoordinatorAuthority = useMemo(() => resolveBrowserSyncAuthority({
217
+ enforcementEnabled: true,
218
+ workspaceId: currentWorkspaceId,
219
+ phase: localCoordinator.phase,
220
+ snapshot: localCoordinator.snapshot,
221
+ }), [
222
+ currentWorkspaceId,
223
+ localCoordinator.phase,
224
+ localCoordinator.snapshot,
225
+ ]);
226
+ const browserSyncAuthorityRef = useRef(browserSyncAuthority);
227
+ useLayoutEffect(() => {
228
+ browserSyncAuthorityRef.current = browserSyncAuthority;
229
+ }, [browserSyncAuthority]);
230
+ const isBrowserWorkspaceSyncAuthorized = useCallback(() => browserSyncAuthorityRef.current.browserSchedulingAllowed, []);
231
+ const { workspaceRetryAt, isWorkspaceRetryPending, workspacePushInFlightRef, workspacePullInFlightRef, workspaceLastPushedSignatureRef, workspacePendingSignatureRef, workspaceLastPushedTaskIdsRef, workspaceDeletedTaskIdsRef, workspaceDeletedTaskWatermarksRef, workspacePullCursorRef, clearWorkspaceRetry, scheduleWorkspaceRetry, persistWorkspaceSyncPatch, applyWorkspaceSyncPatchLocally, readWorkspaceSyncStateSnapshot, loadWorkspaceSyncState, applyWorkspaceSyncStateSnapshot: applyWorkspaceSyncStateSnapshotBase, saveWorkspaceCloudSyncSettings: saveWorkspaceCloudSyncSettingsBase, acquireWorkspaceSyncLease, releaseWorkspaceSyncLease, forceClearWorkspaceSyncLease, recordWorkspaceSyncCompletion, wasWorkspaceSyncOperationCompletedRecently } = useWorkspaceSyncController({
157
232
  currentWorkspaceId,
158
233
  setWorkspaceCloudSyncEnabled,
159
234
  setWorkspaceSyncPhase,
160
235
  setWorkspaceSyncSetupIntent,
161
236
  setWorkspaceLastPullAt,
162
237
  setWorkspaceLastPushAt,
163
- setWorkspaceLastErrorMessage
238
+ setWorkspaceLastErrorMessage,
239
+ isWorkspaceOperationAuthorized: isBrowserWorkspaceSyncAuthorized,
164
240
  });
165
241
  const applyWorkspaceSyncStateSnapshot = useCallback((nextState) => {
166
242
  if (nextState.phase === 'attach-cloud' || nextState.phase === 'provision-local') {
@@ -174,6 +250,8 @@ export function useSyncOrchestrator(input) {
174
250
  }, [applyWorkspaceSyncStateSnapshotBase]);
175
251
  const workspaceLastPushedWatermarksRef = useRef(new Map());
176
252
  const workspaceLastPushedTaskChangeKeysRef = useRef(new Map());
253
+ const workspaceLastPushedTaskRelationshipChangeKeysRef = useRef(new Map());
254
+ const workspaceLastPushedTaxonomyChangeKeyRef = useRef('');
177
255
  const workspaceLastPushedInitiativeIdsRef = useRef(new Set());
178
256
  const workspaceLastPushedInitiativeWatermarksRef = useRef(new Map());
179
257
  const workspaceLastPushedWorkstreamIdsRef = useRef(new Set());
@@ -191,6 +269,12 @@ export function useSyncOrchestrator(input) {
191
269
  const workspaceLastPushedDocumentReviewCommentWatermarksRef = useRef(new Map());
192
270
  const workspaceLastPushedAnnotatedAttachmentSessionIdsRef = useRef(new Set());
193
271
  const workspaceLastPushedAnnotatedAttachmentSessionWatermarksRef = useRef(new Map());
272
+ const workspaceLastPushedTaskforceAgentIdsRef = useRef(new Set());
273
+ const workspaceLastPushedTaskforceAgentWatermarksRef = useRef(new Map());
274
+ const workspaceLastPushedTaskforceAgentSkillIdsRef = useRef(new Set());
275
+ const workspaceLastPushedTaskforceAgentSkillWatermarksRef = useRef(new Map());
276
+ const workspaceLastPushedAgentConversationIdsRef = useRef(new Set());
277
+ const workspaceLastPushedAgentConversationWatermarksRef = useRef(new Map());
194
278
  const workspaceLastPushedTaskEventWatermarksRef = useRef(new Map());
195
279
  const hydrateWorkspacePushBaselines = useCallback((persisted) => {
196
280
  if (!persisted)
@@ -198,6 +282,8 @@ export function useSyncOrchestrator(input) {
198
282
  workspaceLastPushedTaskIdsRef.current = new Set(persisted.taskIds);
199
283
  workspaceLastPushedWatermarksRef.current = persisted.taskWatermarks;
200
284
  workspaceLastPushedTaskChangeKeysRef.current = persisted.taskChangeKeys || new Map();
285
+ workspaceLastPushedTaskRelationshipChangeKeysRef.current = persisted.taskRelationshipChangeKeys || new Map();
286
+ workspaceLastPushedTaxonomyChangeKeyRef.current = persisted.taxonomyChangeKey || '';
201
287
  workspaceLastPushedInitiativeIdsRef.current = new Set(Array.from(persisted.initiativeWatermarks.keys()));
202
288
  workspaceLastPushedInitiativeWatermarksRef.current = persisted.initiativeWatermarks;
203
289
  workspaceLastPushedWorkstreamIdsRef.current = new Set(Array.from(persisted.workstreamWatermarks.keys()));
@@ -205,6 +291,12 @@ export function useSyncOrchestrator(input) {
205
291
  workspaceLastPushedAiProfileIdsRef.current = new Set(Array.from(persisted.aiProfileWatermarks.keys()));
206
292
  workspaceLastPushedAiProfileWatermarksRef.current = persisted.aiProfileWatermarks;
207
293
  workspaceLastPushedAiProfileChangeKeysRef.current = persisted.aiProfileChangeKeys || new Map();
294
+ workspaceLastPushedTaskforceAgentIdsRef.current = new Set(Array.from((persisted.taskforceAgentWatermarks || new Map()).keys()));
295
+ workspaceLastPushedTaskforceAgentWatermarksRef.current = persisted.taskforceAgentWatermarks || new Map();
296
+ workspaceLastPushedTaskforceAgentSkillIdsRef.current = new Set(Array.from((persisted.taskforceAgentSkillWatermarks || new Map()).keys()));
297
+ workspaceLastPushedTaskforceAgentSkillWatermarksRef.current = persisted.taskforceAgentSkillWatermarks || new Map();
298
+ workspaceLastPushedAgentConversationIdsRef.current = new Set(Array.from((persisted.agentConversationWatermarks || new Map()).keys()));
299
+ workspaceLastPushedAgentConversationWatermarksRef.current = persisted.agentConversationWatermarks || new Map();
208
300
  workspaceLastPushedDocumentPathsRef.current = new Set(Array.from(persisted.documentWatermarks.keys()));
209
301
  workspaceLastPushedDocumentWatermarksRef.current = persisted.documentWatermarks;
210
302
  workspaceLastPushedAssetPathsRef.current = new Set(Array.from(persisted.assetWatermarks.keys()));
@@ -223,10 +315,15 @@ export function useSyncOrchestrator(input) {
223
315
  taskIds: workspaceLastPushedTaskIdsRef.current,
224
316
  taskWatermarks: workspaceLastPushedWatermarksRef.current,
225
317
  taskChangeKeys: workspaceLastPushedTaskChangeKeysRef.current,
318
+ taskRelationshipChangeKeys: workspaceLastPushedTaskRelationshipChangeKeysRef.current,
319
+ taxonomyChangeKey: workspaceLastPushedTaxonomyChangeKeyRef.current,
226
320
  initiativeWatermarks: workspaceLastPushedInitiativeWatermarksRef.current,
227
321
  workstreamWatermarks: workspaceLastPushedWorkstreamWatermarksRef.current,
228
322
  aiProfileWatermarks: workspaceLastPushedAiProfileWatermarksRef.current,
229
323
  aiProfileChangeKeys: workspaceLastPushedAiProfileChangeKeysRef.current,
324
+ taskforceAgentWatermarks: workspaceLastPushedTaskforceAgentWatermarksRef.current,
325
+ taskforceAgentSkillWatermarks: workspaceLastPushedTaskforceAgentSkillWatermarksRef.current,
326
+ agentConversationWatermarks: workspaceLastPushedAgentConversationWatermarksRef.current,
230
327
  documentWatermarks: workspaceLastPushedDocumentWatermarksRef.current,
231
328
  assetWatermarks: workspaceLastPushedAssetWatermarksRef.current,
232
329
  documentReviewSessionWatermarks: workspaceLastPushedDocumentReviewSessionWatermarksRef.current,
@@ -234,14 +331,44 @@ export function useSyncOrchestrator(input) {
234
331
  annotatedAttachmentSessionWatermarks: workspaceLastPushedAnnotatedAttachmentSessionWatermarksRef.current,
235
332
  taskEventWatermarks: workspaceLastPushedTaskEventWatermarksRef.current,
236
333
  }), []);
334
+ const refreshWorkspaceAiProfilePushBaselineFromPersistence = useCallback(() => {
335
+ if (workspaceBaselineResetReasonRef.current === 'repair-reset'
336
+ || workspaceBaselineResetReasonRef.current === 'storage-write-failed')
337
+ return false;
338
+ const persisted = readPersistedSyncWatermarks(currentWorkspaceId, taxonomyStateFingerprint);
339
+ if (!persisted || persisted.aiProfileWatermarks.size === 0)
340
+ return false;
341
+ workspaceLastPushedAiProfileIdsRef.current = new Set(persisted.aiProfileWatermarks.keys());
342
+ workspaceLastPushedAiProfileWatermarksRef.current = new Map(persisted.aiProfileWatermarks);
343
+ workspaceLastPushedAiProfileChangeKeysRef.current = new Map(persisted.aiProfileChangeKeys || []);
344
+ return true;
345
+ }, [currentWorkspaceId, taxonomyStateFingerprint]);
237
346
  const workspaceStartupRepairRanRef = useRef(false);
238
347
  const workspaceStartupFullReconcileRanRef = useRef(false);
348
+ const workspaceStartupFullReconcileRequestedRef = useRef(false);
239
349
  const workspaceRepairModeRef = useRef(false);
350
+ const workspacePullAfterPushRequestedRef = useRef(false);
240
351
  const workspaceAttachBootstrapBaselineSignatureRef = useRef('');
241
352
  const workspaceCaptureAttachBootstrapBaselineRef = useRef(false);
242
353
  const workspaceDocumentsRefreshIntervalMs = 30_000;
243
354
  const workspacePullIntervalMs = realtimeSyncEnabled ? 30_000 : 15_000;
244
355
  const workspacePushWatchdogIntervalMs = Math.max(30_000, workspacePullIntervalMs);
356
+ const [workspaceSyncHealthDeadlineNowMs, setWorkspaceSyncHealthDeadlineNowMs] = useState(null);
357
+ useEffect(() => {
358
+ const nowMs = Date.now();
359
+ if (runtimeMode !== 'local' || !workspaceCloudSyncEnabled || workspaceSyncPhase !== 'active')
360
+ return;
361
+ const lastPullMs = workspaceLastPullAt ? Date.parse(workspaceLastPullAt) : NaN;
362
+ if (!Number.isFinite(lastPullMs))
363
+ return;
364
+ const remainingMs = lastPullMs + WORKSPACE_SYNC_PULL_FRESHNESS_WINDOW_MS - nowMs;
365
+ if (remainingMs <= 0)
366
+ return;
367
+ const timeoutId = window.setTimeout(() => {
368
+ setWorkspaceSyncHealthDeadlineNowMs(Date.now());
369
+ }, remainingMs + 50);
370
+ return () => window.clearTimeout(timeoutId);
371
+ }, [runtimeMode, workspaceCloudSyncEnabled, workspaceSyncPhase, workspaceLastPullAt]);
245
372
  const workspaceLastSuccessfulSyncAt = useMemo(() => {
246
373
  const pullMs = workspaceLastPullAt ? Date.parse(workspaceLastPullAt) : NaN;
247
374
  const pushMs = workspaceLastPushAt ? Date.parse(workspaceLastPushAt) : NaN;
@@ -254,19 +381,19 @@ export function useSyncOrchestrator(input) {
254
381
  return workspaceLastPushAt;
255
382
  return null;
256
383
  }, [workspaceLastPullAt, workspaceLastPushAt]);
257
- const workspaceSyncPresentation = useMemo(() => resolveWorkspaceSyncPresentation({
384
+ const workspaceSyncPresentation = resolveWorkspaceSyncPresentation({
258
385
  enabled: workspaceCloudSyncEnabled,
259
386
  phase: workspaceSyncPhase,
260
387
  busy: workspaceSyncBusy,
261
388
  retryAt: workspaceRetryAt,
262
- lastErrorMessage: workspaceLastErrorMessage
263
- }), [
264
- workspaceCloudSyncEnabled,
265
- workspaceSyncPhase,
266
- workspaceSyncBusy,
267
- workspaceRetryAt,
268
- workspaceLastErrorMessage
269
- ]);
389
+ lastErrorMessage: workspaceLastErrorMessage,
390
+ lastErrorAt: workspaceLastErrorAt,
391
+ lastPullAt: workspaceLastPullAt,
392
+ lastPushAt: workspaceLastPushAt,
393
+ nowMs: workspaceSyncHealthDeadlineNowMs ?? Date.now(),
394
+ pendingChanges: workspaceSyncPendingChanges,
395
+ durableOutbox: workspaceSyncV3OutboxStatus,
396
+ });
270
397
  const workspaceSyncStatus = workspaceSyncPresentation.status;
271
398
  const workspaceSyncSummary = workspaceSyncPresentation.summary;
272
399
  const workspaceSyncRecommendedAction = workspaceSyncPresentation.recommendedAction;
@@ -482,6 +609,7 @@ export function useSyncOrchestrator(input) {
482
609
  workspaceSyncAssetsFingerprintRef.current = '';
483
610
  workspaceSyncDocumentReviewSessionsFingerprintRef.current = '';
484
611
  workspaceSyncAnnotatedAttachmentSessionsFingerprintRef.current = '';
612
+ workspaceSyncTaskforceAgentsFingerprintRef.current = '';
485
613
  workspaceAttachBootstrapBaselineSignatureRef.current = '';
486
614
  workspaceCaptureAttachBootstrapBaselineRef.current = false;
487
615
  setWorkspaceSyncMarkdownDocuments([]);
@@ -498,6 +626,11 @@ export function useSyncOrchestrator(input) {
498
626
  workspaceSyncAnnotatedAttachmentSessionsRef.current = [];
499
627
  setWorkspaceSyncAnnotatedAttachmentSessions([]);
500
628
  setWorkspaceSyncAnnotatedAttachmentSessionsFingerprint('');
629
+ workspaceSyncTaskforceAgentsRef.current = [];
630
+ workspaceSyncAgentRolesRef.current = [];
631
+ workspaceSyncAgentConversationsRef.current = [];
632
+ setWorkspaceSyncTaskforceAgents([]);
633
+ setWorkspaceSyncTaskforceAgentsFingerprint('');
501
634
  setWorkspaceSyncReferenceSnapshotStatus(EMPTY_WORKSPACE_SYNC_REFERENCE_SNAPSHOT_STATUS);
502
635
  setWorkspaceLastErrorMessage(null);
503
636
  setWorkspaceLastErrorAt(null);
@@ -509,6 +642,8 @@ export function useSyncOrchestrator(input) {
509
642
  // changes that happened while the app was closed.
510
643
  workspaceLastPushedWatermarksRef.current = new Map();
511
644
  workspaceLastPushedTaskChangeKeysRef.current = new Map();
645
+ workspaceLastPushedTaskRelationshipChangeKeysRef.current = new Map();
646
+ workspaceLastPushedTaxonomyChangeKeyRef.current = '';
512
647
  workspaceLastPushedInitiativeIdsRef.current = new Set();
513
648
  workspaceLastPushedInitiativeWatermarksRef.current = new Map();
514
649
  workspaceLastPushedWorkstreamIdsRef.current = new Set();
@@ -526,6 +661,12 @@ export function useSyncOrchestrator(input) {
526
661
  workspaceLastPushedDocumentReviewCommentWatermarksRef.current = new Map();
527
662
  workspaceLastPushedAnnotatedAttachmentSessionIdsRef.current = new Set();
528
663
  workspaceLastPushedAnnotatedAttachmentSessionWatermarksRef.current = new Map();
664
+ workspaceLastPushedTaskforceAgentIdsRef.current = new Set();
665
+ workspaceLastPushedTaskforceAgentWatermarksRef.current = new Map();
666
+ workspaceLastPushedTaskforceAgentSkillIdsRef.current = new Set();
667
+ workspaceLastPushedTaskforceAgentSkillWatermarksRef.current = new Map();
668
+ workspaceLastPushedAgentConversationIdsRef.current = new Set();
669
+ workspaceLastPushedAgentConversationWatermarksRef.current = new Map();
529
670
  workspaceLastPushedTaskEventWatermarksRef.current = new Map();
530
671
  workspaceStartupFullReconcileRanRef.current = Boolean(readWorkspaceSyncStateSnapshot().startupFullReconcileCompletedAt);
531
672
  workspaceFullReconcileInFlightRef.current = false;
@@ -584,6 +725,7 @@ export function useSyncOrchestrator(input) {
584
725
  workspacePushInFlightRef,
585
726
  bootstrapPhaseStartedAtRef,
586
727
  bootstrapLastProgressAtRef,
728
+ isExecutionAuthorized: isBrowserWorkspaceSyncAuthorized,
587
729
  setWorkspaceLastErrorMessage: (value) => setWorkspaceLastErrorMessage(value),
588
730
  setWorkspaceLastErrorAt: (value) => setWorkspaceLastErrorAt(value),
589
731
  setUserGlobalSyncStatus,
@@ -597,26 +739,9 @@ export function useSyncOrchestrator(input) {
597
739
  workspaceSyncPhase,
598
740
  persistWorkspaceSyncPatchSafely,
599
741
  workspacePullInFlightRef,
600
- workspacePushInFlightRef
601
- ]);
602
- const ensureCloudWorkspaceReadyForSync = useCallback(async () => {
603
- return ensureCloudWorkspaceReadyForSyncService({
604
- cloudAuthConfigured,
605
- runtimeMode,
606
- isAuthenticated,
607
- resolveCloudAuthUrl,
608
- workspaceId: currentWorkspaceId,
609
- workspaceName: projectName || currentWorkspaceId,
610
- allowProvisionOnMismatch: workspaceSyncPhase !== 'attach-cloud'
611
- });
612
- }, [
613
- cloudAuthConfigured,
614
- runtimeMode,
615
- isAuthenticated,
616
- resolveCloudAuthUrl,
617
- currentWorkspaceId,
618
- projectName,
619
- workspaceSyncPhase
742
+ workspacePushInFlightRef,
743
+ browserSyncAuthority.authorityEpoch,
744
+ isBrowserWorkspaceSyncAuthorized,
620
745
  ]);
621
746
  useEffect(() => {
622
747
  workspaceTasksRef.current = tasks || [];
@@ -625,6 +750,18 @@ export function useSyncOrchestrator(input) {
625
750
  workspaceArchivedTasksRef.current = archivedTasks || [];
626
751
  }, [archivedTasks]);
627
752
  useEffect(() => {
753
+ let cancelled = false;
754
+ void fetch('/api/taskforce/task-relationships', { method: 'GET', credentials: 'include' })
755
+ .then((response) => response.ok ? response.json() : null)
756
+ .then((payload) => {
757
+ if (!cancelled && Array.isArray(payload?.relationships))
758
+ updateWorkspaceTaskRelationships(payload.relationships);
759
+ })
760
+ .catch(() => undefined);
761
+ return () => { cancelled = true; };
762
+ }, [archivedTasks, currentWorkspaceId, tasks, updateWorkspaceTaskRelationships]);
763
+ useEffect(() => {
764
+ workspaceDeletedTasksRef.current = deletedTasks || [];
628
765
  workspaceDeletedTaskIdsRef.current = new Set((deletedTasks || [])
629
766
  .map((entry) => String(entry?.taskId || '').trim())
630
767
  .filter((taskId) => taskId.length > 0));
@@ -641,32 +778,161 @@ export function useSyncOrchestrator(input) {
641
778
  useEffect(() => {
642
779
  workspaceWorkstreamsRef.current = workstreams || [];
643
780
  }, [workstreams]);
781
+ useEffect(() => {
782
+ workspaceTaxonomyStateRef.current = taxonomyState;
783
+ workspaceTaxonomiesRef.current = taxonomies || [];
784
+ }, [taxonomies, taxonomyState]);
644
785
  const workspaceForceFullAiProfilePushRef = useRef(false);
645
786
  const workspaceFullReconcileInFlightRef = useRef(false);
646
- const buildWorkspaceSyncPayload = useCallback((options) => {
647
- const forceAllAiProfiles = options?.forceAllAiProfiles === true;
648
- // Read documents and assets from refs rather than state so that the freshest data
649
- // fetched by an immediately-preceding async refresh is used, even when React has not
650
- // yet committed the corresponding state update (stale-closure guard).
651
- return buildWorkspaceSyncPayloadModel({
787
+ const workspaceSyncEngineRuntime = useMemo(() => ({
788
+ repairMode: workspaceRepairModeRef,
789
+ forceFullAiProfilePush: workspaceForceFullAiProfilePushRef,
790
+ pushInFlight: workspacePushInFlightRef,
791
+ pullInFlight: workspacePullInFlightRef,
792
+ pullAfterPushRequested: workspacePullAfterPushRequestedRef,
793
+ pendingPushReplay: workspacePendingPushReplayRef,
794
+ blockedPushSignature: workspaceBlockedPushSignatureRef,
795
+ lastPushedSignature: workspaceLastPushedSignatureRef,
796
+ pendingSignature: workspacePendingSignatureRef,
797
+ lastPushedTaskIds: workspaceLastPushedTaskIdsRef,
798
+ deletedTaskIds: workspaceDeletedTaskIdsRef,
799
+ deletedTaskWatermarks: workspaceDeletedTaskWatermarksRef,
800
+ pullCursor: workspacePullCursorRef,
801
+ lastPushedWatermarks: workspaceLastPushedWatermarksRef,
802
+ lastPushedTaskChangeKeys: workspaceLastPushedTaskChangeKeysRef,
803
+ lastPushedTaskRelationshipChangeKeys: workspaceLastPushedTaskRelationshipChangeKeysRef,
804
+ lastPushedTaxonomyChangeKey: workspaceLastPushedTaxonomyChangeKeyRef,
805
+ lastPushedInitiativeIds: workspaceLastPushedInitiativeIdsRef,
806
+ lastPushedInitiativeWatermarks: workspaceLastPushedInitiativeWatermarksRef,
807
+ lastPushedWorkstreamIds: workspaceLastPushedWorkstreamIdsRef,
808
+ lastPushedWorkstreamWatermarks: workspaceLastPushedWorkstreamWatermarksRef,
809
+ lastPushedAiProfileIds: workspaceLastPushedAiProfileIdsRef,
810
+ lastPushedAiProfileWatermarks: workspaceLastPushedAiProfileWatermarksRef,
811
+ lastPushedAiProfileChangeKeys: workspaceLastPushedAiProfileChangeKeysRef,
812
+ lastPushedDocumentPaths: workspaceLastPushedDocumentPathsRef,
813
+ lastPushedDocumentWatermarks: workspaceLastPushedDocumentWatermarksRef,
814
+ lastPushedAssetPaths: workspaceLastPushedAssetPathsRef,
815
+ lastPushedAssetWatermarks: workspaceLastPushedAssetWatermarksRef,
816
+ lastPushedDocumentReviewSessionIds: workspaceLastPushedDocumentReviewSessionIdsRef,
817
+ lastPushedDocumentReviewSessionWatermarks: workspaceLastPushedDocumentReviewSessionWatermarksRef,
818
+ lastPushedDocumentReviewCommentIds: workspaceLastPushedDocumentReviewCommentIdsRef,
819
+ lastPushedDocumentReviewCommentWatermarks: workspaceLastPushedDocumentReviewCommentWatermarksRef,
820
+ lastPushedAnnotatedAttachmentSessionIds: workspaceLastPushedAnnotatedAttachmentSessionIdsRef,
821
+ lastPushedAnnotatedAttachmentSessionWatermarks: workspaceLastPushedAnnotatedAttachmentSessionWatermarksRef,
822
+ lastPushedTaskforceAgentIds: workspaceLastPushedTaskforceAgentIdsRef,
823
+ lastPushedTaskforceAgentWatermarks: workspaceLastPushedTaskforceAgentWatermarksRef,
824
+ lastPushedTaskforceAgentSkillIds: workspaceLastPushedTaskforceAgentSkillIdsRef,
825
+ lastPushedTaskforceAgentSkillWatermarks: workspaceLastPushedTaskforceAgentSkillWatermarksRef,
826
+ lastPushedAgentConversationIds: workspaceLastPushedAgentConversationIdsRef,
827
+ lastPushedAgentConversationWatermarks: workspaceLastPushedAgentConversationWatermarksRef,
828
+ lastPushedTaskEventWatermarks: workspaceLastPushedTaskEventWatermarksRef,
829
+ baselineResetReason: workspaceBaselineResetReasonRef,
830
+ captureAttachBootstrapBaseline: workspaceCaptureAttachBootstrapBaselineRef,
831
+ attachBootstrapBaselineSignature: workspaceAttachBootstrapBaselineSignatureRef,
832
+ startupRepairRan: workspaceStartupRepairRanRef,
833
+ startupFullReconcileRan: workspaceStartupFullReconcileRanRef,
834
+ startupFullReconcileRequested: workspaceStartupFullReconcileRequestedRef,
835
+ fullReconcileInFlight: workspaceFullReconcileInFlightRef,
836
+ lastBootstrapPhase: lastBootstrapPhaseRef,
837
+ bootstrapPhaseStartedAtMs: bootstrapPhaseStartedAtRef,
838
+ bootstrapLastProgressAtMs: bootstrapLastProgressAtRef,
839
+ realtimeSuppressedEventQueue: realtimeSuppressedEventQueueRef,
840
+ }), []);
841
+ const workspaceSyncEngineLocalServices = useMemo(() => createBrowserWorkspaceSyncEngineLocalServices(), []);
842
+ const workspaceSyncRemoteServicesSelectionRef = useRef(null);
843
+ const workspaceSyncRemoteServicesSelection = useMemo(() => selectBrowserSyncRemoteServices({
844
+ workspaceId: currentWorkspaceId,
845
+ phase: localCoordinator.phase,
846
+ snapshot: localCoordinator.snapshot,
847
+ authority: browserSyncAuthority,
848
+ client: effectiveLocalCoordinatorClient,
849
+ isSelectionAuthorized: (selection) => (workspaceSyncRemoteServicesSelectionRef.current === selection
850
+ && isBrowserWorkspaceSyncAuthorized()),
851
+ }), [
852
+ browserSyncAuthority.authorityEpoch,
853
+ browserSyncAuthority.browserSchedulingAllowed,
854
+ browserSyncAuthority.reason,
855
+ currentWorkspaceId,
856
+ effectiveLocalCoordinatorClient,
857
+ localCoordinator.phase,
858
+ localCoordinator.snapshot?.credential.coordinatorGeneration,
859
+ localCoordinator.snapshot?.credential.status,
860
+ localCoordinator.snapshot?.credential.workspaceId,
861
+ localCoordinator.snapshot?.serverInstanceId,
862
+ localCoordinator.snapshot?.state.activeWorkspaceId,
863
+ localCoordinator.snapshot?.state.coordinatorGeneration,
864
+ localCoordinator.snapshot?.state.ownershipMode,
865
+ localCoordinator.snapshot?.state.transitionState,
866
+ localCoordinatorBrowserAuthorityGateEnabled,
867
+ ]);
868
+ const workspaceSyncEngineRemoteServices = workspaceSyncRemoteServicesSelection.remoteServices;
869
+ useLayoutEffect(() => {
870
+ workspaceSyncRemoteServicesSelectionRef.current =
871
+ workspaceSyncRemoteServicesSelection;
872
+ return () => {
873
+ if (workspaceSyncRemoteServicesSelectionRef.current
874
+ === workspaceSyncRemoteServicesSelection) {
875
+ workspaceSyncRemoteServicesSelectionRef.current = null;
876
+ }
877
+ };
878
+ }, [workspaceSyncRemoteServicesSelection]);
879
+ const ensureCloudWorkspaceReadyForSync = useCallback(async () => {
880
+ const capturedSelection = workspaceSyncRemoteServicesSelection;
881
+ const currentSelection = workspaceSyncRemoteServicesSelectionRef.current
882
+ ?? { mode: 'blocked', remoteServices: null };
883
+ if (!workspaceSyncEngineRemoteServices
884
+ || !isBrowserSyncRemoteServicesSelectionAuthorized({
885
+ current: currentSelection,
886
+ captured: capturedSelection,
887
+ browserSchedulingAllowed: isBrowserWorkspaceSyncAuthorized(),
888
+ })) {
889
+ return {
890
+ success: false,
891
+ statusCode: 409,
892
+ transient: true,
893
+ error: 'Browser workspace sync authority changed before cloud readiness validation.',
894
+ };
895
+ }
896
+ return ensureCloudWorkspaceReadyForSyncService({
897
+ cloudAuthConfigured,
898
+ runtimeMode,
899
+ isAuthenticated,
900
+ resolveCloudAuthUrl,
901
+ workspaceId: currentWorkspaceId,
902
+ workspaceName: projectName || currentWorkspaceId,
903
+ allowProvisionOnMismatch: workspaceSyncPhase !== 'attach-cloud',
904
+ remoteServices: workspaceSyncEngineRemoteServices,
905
+ });
906
+ }, [
907
+ cloudAuthConfigured,
908
+ currentWorkspaceId,
909
+ isAuthenticated,
910
+ isBrowserWorkspaceSyncAuthorized,
911
+ projectName,
912
+ resolveCloudAuthUrl,
913
+ runtimeMode,
914
+ workspaceSyncEngineRemoteServices,
915
+ workspaceSyncPhase,
916
+ workspaceSyncRemoteServicesSelection,
917
+ ]);
918
+ const currentWorkspaceIdRef = useRef(currentWorkspaceId);
919
+ currentWorkspaceIdRef.current = currentWorkspaceId;
920
+ const createWorkspaceSyncV2Snapshot = useCallback(() => {
921
+ // Read every collection from refs once so payload and signature construction
922
+ // share one coherent browser snapshot even after an immediately-preceding refresh.
923
+ return createWorkspaceSyncV2FrozenSnapshot({
924
+ workspaceId: currentWorkspaceIdRef.current,
652
925
  tasks: workspaceTasksRef.current,
653
926
  archivedTasks: workspaceArchivedTasksRef.current,
654
- taskEvents: flattenTaskEvents(workspaceTasksRef.current, workspaceArchivedTasksRef.current, workspaceInitiativesRef.current, workspaceWorkstreamsRef.current),
655
- lastPushedTaskIds: workspaceLastPushedTaskIdsRef.current,
927
+ taskRelationships: workspaceTaskRelationshipsRef.current,
928
+ deletedTasks: workspaceDeletedTasksRef.current,
656
929
  pendingDeletedTaskIds: workspaceDeletedTaskIdsRef.current,
657
930
  pendingDeletedTaskWatermarks: workspaceDeletedTaskWatermarksRef.current,
658
931
  initiatives: workspaceInitiativesRef.current,
659
932
  workstreams: workspaceWorkstreamsRef.current,
660
- taxonomies: taxonomies || [],
661
- taxonomyState,
662
- lastPushedInitiativeIds: workspaceLastPushedInitiativeIdsRef.current,
663
- lastPushedInitiativeWatermarks: workspaceLastPushedInitiativeWatermarksRef.current,
664
- lastPushedWorkstreamIds: workspaceLastPushedWorkstreamIdsRef.current,
665
- lastPushedWorkstreamWatermarks: workspaceLastPushedWorkstreamWatermarksRef.current,
933
+ taxonomies: workspaceTaxonomiesRef.current,
934
+ taxonomyState: workspaceTaxonomyStateRef.current,
666
935
  aiProfiles: workspaceSyncAiProfilesRef.current,
667
- lastPushedAiProfileIds: forceAllAiProfiles ? new Set() : workspaceLastPushedAiProfileIdsRef.current,
668
- lastPushedAiProfileWatermarks: forceAllAiProfiles ? new Map() : workspaceLastPushedAiProfileWatermarksRef.current,
669
- lastPushedAiProfileChangeKeys: forceAllAiProfiles ? new Map() : workspaceLastPushedAiProfileChangeKeysRef.current,
670
936
  documents: workspaceSyncMarkdownDocumentsRef.current,
671
937
  assets: workspaceSyncAssetsRef.current,
672
938
  currentDocumentPaths: workspaceSyncKnownDocumentPathsRef.current,
@@ -674,22 +940,54 @@ export function useSyncOrchestrator(input) {
674
940
  documentReviewSessions: workspaceSyncDocumentReviewSessionsRef.current,
675
941
  documentReviewComments: workspaceSyncDocumentReviewCommentsRef.current,
676
942
  annotatedAttachmentSessions: workspaceSyncAnnotatedAttachmentSessionsRef.current,
677
- lastPushedDocumentPaths: workspaceLastPushedDocumentPathsRef.current,
678
- lastPushedDocumentWatermarks: workspaceLastPushedDocumentWatermarksRef.current,
679
- lastPushedAssetPaths: workspaceLastPushedAssetPathsRef.current,
680
- lastPushedAssetWatermarks: workspaceLastPushedAssetWatermarksRef.current,
681
- lastPushedDocumentReviewSessionIds: workspaceLastPushedDocumentReviewSessionIdsRef.current,
682
- lastPushedDocumentReviewSessionWatermarks: workspaceLastPushedDocumentReviewSessionWatermarksRef.current,
683
- lastPushedDocumentReviewCommentIds: workspaceLastPushedDocumentReviewCommentIdsRef.current,
684
- lastPushedDocumentReviewCommentWatermarks: workspaceLastPushedDocumentReviewCommentWatermarksRef.current,
685
- lastPushedAnnotatedAttachmentSessionIds: workspaceLastPushedAnnotatedAttachmentSessionIdsRef.current,
686
- lastPushedAnnotatedAttachmentSessionWatermarks: workspaceLastPushedAnnotatedAttachmentSessionWatermarksRef.current,
687
- lastPushedTaskEventWatermarks: workspaceLastPushedTaskEventWatermarksRef.current,
688
- baselineResetReason: workspaceBaselineResetReasonRef.current,
689
- lastPushedWatermarks: workspaceLastPushedWatermarksRef.current,
690
- lastPushedTaskChangeKeys: workspaceLastPushedTaskChangeKeysRef.current
943
+ taskforceAgents: workspaceSyncTaskforceAgentsRef.current,
944
+ agentRoles: workspaceSyncAgentRolesRef.current,
945
+ taskforceAgentSkills: workspaceSyncTaskforceAgentSkillsRef.current,
946
+ agentConversations: workspaceSyncAgentConversationsRef.current,
691
947
  });
692
- }, [taxonomies, taxonomyState]);
948
+ }, []);
949
+ const createWorkspaceSyncV2Candidate = useCallback((options) => {
950
+ const snapshot = createWorkspaceSyncV2Snapshot();
951
+ return buildWorkspaceSyncV2Candidate({
952
+ snapshot,
953
+ forceAllAiProfiles: options?.forceAllAiProfiles === true,
954
+ baseline: {
955
+ lastPushedTaskIds: workspaceLastPushedTaskIdsRef.current,
956
+ lastPushedWatermarks: workspaceLastPushedWatermarksRef.current,
957
+ lastPushedTaskChangeKeys: workspaceLastPushedTaskChangeKeysRef.current,
958
+ lastPushedTaskRelationshipChangeKeys: workspaceLastPushedTaskRelationshipChangeKeysRef.current,
959
+ lastPushedTaxonomyChangeKey: workspaceLastPushedTaxonomyChangeKeyRef.current,
960
+ lastPushedInitiativeIds: workspaceLastPushedInitiativeIdsRef.current,
961
+ lastPushedInitiativeWatermarks: workspaceLastPushedInitiativeWatermarksRef.current,
962
+ lastPushedWorkstreamIds: workspaceLastPushedWorkstreamIdsRef.current,
963
+ lastPushedWorkstreamWatermarks: workspaceLastPushedWorkstreamWatermarksRef.current,
964
+ lastPushedAiProfileIds: workspaceLastPushedAiProfileIdsRef.current,
965
+ lastPushedAiProfileWatermarks: workspaceLastPushedAiProfileWatermarksRef.current,
966
+ lastPushedAiProfileChangeKeys: workspaceLastPushedAiProfileChangeKeysRef.current,
967
+ lastPushedDocumentPaths: workspaceLastPushedDocumentPathsRef.current,
968
+ lastPushedDocumentWatermarks: workspaceLastPushedDocumentWatermarksRef.current,
969
+ lastPushedAssetPaths: workspaceLastPushedAssetPathsRef.current,
970
+ lastPushedAssetWatermarks: workspaceLastPushedAssetWatermarksRef.current,
971
+ lastPushedDocumentReviewSessionIds: workspaceLastPushedDocumentReviewSessionIdsRef.current,
972
+ lastPushedDocumentReviewSessionWatermarks: workspaceLastPushedDocumentReviewSessionWatermarksRef.current,
973
+ lastPushedDocumentReviewCommentIds: workspaceLastPushedDocumentReviewCommentIdsRef.current,
974
+ lastPushedDocumentReviewCommentWatermarks: workspaceLastPushedDocumentReviewCommentWatermarksRef.current,
975
+ lastPushedAnnotatedAttachmentSessionIds: workspaceLastPushedAnnotatedAttachmentSessionIdsRef.current,
976
+ lastPushedAnnotatedAttachmentSessionWatermarks: workspaceLastPushedAnnotatedAttachmentSessionWatermarksRef.current,
977
+ lastPushedTaskforceAgentIds: workspaceLastPushedTaskforceAgentIdsRef.current,
978
+ lastPushedTaskforceAgentWatermarks: workspaceLastPushedTaskforceAgentWatermarksRef.current,
979
+ lastPushedTaskforceAgentSkillIds: workspaceLastPushedTaskforceAgentSkillIdsRef.current,
980
+ lastPushedTaskforceAgentSkillWatermarks: workspaceLastPushedTaskforceAgentSkillWatermarksRef.current,
981
+ lastPushedAgentConversationIds: workspaceLastPushedAgentConversationIdsRef.current,
982
+ lastPushedAgentConversationWatermarks: workspaceLastPushedAgentConversationWatermarksRef.current,
983
+ lastPushedTaskEventWatermarks: workspaceLastPushedTaskEventWatermarksRef.current,
984
+ baselineResetReason: workspaceBaselineResetReasonRef.current,
985
+ },
986
+ });
987
+ }, [createWorkspaceSyncV2Snapshot]);
988
+ const buildWorkspaceSyncPayload = useCallback((options) => {
989
+ return createWorkspaceSyncV2Candidate(options).payload;
990
+ }, [createWorkspaceSyncV2Candidate]);
693
991
  const reportSyncEvent = useCallback((workspaceId, event) => {
694
992
  if (runtimeMode !== 'local')
695
993
  return;
@@ -723,25 +1021,8 @@ export function useSyncOrchestrator(input) {
723
1021
  }
724
1022
  }, [runtimeMode]);
725
1023
  const buildWorkspaceSyncSignature = useCallback(() => {
726
- // Read documents and assets from refs for the same stale-closure reason as
727
- // buildWorkspaceSyncPayload — the signature must reflect the freshest known data.
728
- return buildWorkspaceSyncSignatureModel({
729
- workspaceId: currentWorkspaceId,
730
- tasks: workspaceTasksRef.current,
731
- archivedTasks: workspaceArchivedTasksRef.current,
732
- taskEvents: flattenTaskEvents(workspaceTasksRef.current, workspaceArchivedTasksRef.current, workspaceInitiativesRef.current, workspaceWorkstreamsRef.current),
733
- pendingDeletedTaskIds: workspaceDeletedTaskIdsRef.current,
734
- initiatives: workspaceInitiativesRef.current,
735
- workstreams: workspaceWorkstreamsRef.current,
736
- taxonomies: taxonomies || [],
737
- aiProfiles: workspaceSyncAiProfilesRef.current,
738
- documents: workspaceSyncMarkdownDocumentsRef.current,
739
- assets: workspaceSyncAssetsRef.current,
740
- documentReviewSessions: workspaceSyncDocumentReviewSessionsRef.current,
741
- documentReviewComments: workspaceSyncDocumentReviewCommentsRef.current,
742
- annotatedAttachmentSessions: workspaceSyncAnnotatedAttachmentSessionsRef.current
743
- });
744
- }, [currentWorkspaceId, taxonomies, taxonomyState]);
1024
+ return buildWorkspaceSyncV2Signature(createWorkspaceSyncV2Snapshot());
1025
+ }, [createWorkspaceSyncV2Snapshot]);
745
1026
  const workspaceCoreSyncFingerprint = useMemo(() => JSON.stringify({
746
1027
  tasks: (tasks || [])
747
1028
  .map((task) => ({
@@ -795,6 +1076,29 @@ export function useSyncOrchestrator(input) {
795
1076
  taxonomies: Array.isArray(taxonomies) ? taxonomies : [],
796
1077
  taxonomyState: taxonomyState && typeof taxonomyState === 'object' ? taxonomyState : null
797
1078
  }), [tasks, archivedTasks, deletedTasks, initiatives, workstreams, taxonomies, taxonomyState]);
1079
+ useDurableLocalOutboxDrain({
1080
+ enabled: localOutboxDispatchEnabled === true
1081
+ && runtimeMode === 'local'
1082
+ && localOutboxCoordinatorAuthority.browserSchedulingAllowed
1083
+ && workspaceCloudSyncEnabled,
1084
+ workspaceId: currentWorkspaceId,
1085
+ mutationFingerprint: workspaceCoreSyncFingerprint,
1086
+ authorityScope: workspaceSyncRemoteServicesSelection,
1087
+ remoteServices: workspaceSyncEngineRemoteServices,
1088
+ localServices: workspaceSyncEngineLocalServices,
1089
+ isAuthorityCurrent: (authorityScope) => (workspaceSyncRemoteServicesSelectionRef.current === authorityScope
1090
+ && isBrowserWorkspaceSyncAuthorized()),
1091
+ onHydratedEventIds: (eventIds) => {
1092
+ realtimeBridgeRef.current.recordSuppressedEventIds(eventIds, { ttlMs: 60_000 });
1093
+ },
1094
+ onOutboxStatus: handleWorkspaceSyncV3OutboxStatus,
1095
+ });
1096
+ const isDurableRecoveryBlockingOrdinaryPush = useCallback(() => {
1097
+ if (localOutboxDispatchEnabled !== true)
1098
+ return false;
1099
+ const status = workspaceSyncV3OutboxStatusRef.current;
1100
+ return status === null || (status.recovery !== null && status.recovery.state !== 'completed');
1101
+ }, [localOutboxDispatchEnabled]);
798
1102
  // Fingerprint of per-task attachment counts — changes when the MCP tool saves a new
799
1103
  // attachment and the React app polls the updated task. Used to trigger an immediate
800
1104
  // asset snapshot refresh without requiring a cross-process DOM event.
@@ -828,21 +1132,49 @@ export function useSyncOrchestrator(input) {
828
1132
  workspaceAttachBootstrapBaselineSignatureRef.current = '';
829
1133
  return false;
830
1134
  }, []);
1135
+ const refreshWorkspaceSyncTaxonomySnapshot = useCallback(async () => {
1136
+ if (runtimeMode !== 'local')
1137
+ return false;
1138
+ if (!isValidWorkspaceKey(currentWorkspaceId))
1139
+ return false;
1140
+ if (cloudAuthConfigured && (!authSessionResolved || !isAuthenticated))
1141
+ return false;
1142
+ try {
1143
+ const res = await fetch(`/api/taskforce/taxonomy-state?workspaceId=${encodeURIComponent(currentWorkspaceId)}`, { method: 'GET', credentials: 'include' });
1144
+ if (!res.ok)
1145
+ return false;
1146
+ const data = await res.json();
1147
+ if (!hasWorkspaceTaxonomyStatePayload(data))
1148
+ return false;
1149
+ workspaceTaxonomyStateRef.current = data;
1150
+ workspaceTaxonomiesRef.current = Array.isArray(data.taxonomies) ? data.taxonomies : [];
1151
+ return true;
1152
+ }
1153
+ catch (error) {
1154
+ logSyncDebug('taxonomy_snapshot_refresh_failed', {
1155
+ workspaceId: currentWorkspaceId,
1156
+ error: String(error?.message || error || '')
1157
+ });
1158
+ return false;
1159
+ }
1160
+ }, [runtimeMode, currentWorkspaceId, cloudAuthConfigured, authSessionResolved, isAuthenticated]);
831
1161
  const refreshWorkspaceSyncMarkdownDocumentsSnapshot = useCallback(async () => {
832
1162
  if (runtimeMode !== 'local')
833
- return;
1163
+ return false;
834
1164
  if (!isValidWorkspaceKey(currentWorkspaceId))
835
- return;
1165
+ return false;
836
1166
  if (cloudAuthConfigured && (!authSessionResolved || !isAuthenticated))
837
- return;
1167
+ return false;
838
1168
  try {
839
1169
  const res = await fetch(`/api/taskforce/sync/workspace/documents?workspaceId=${encodeURIComponent(currentWorkspaceId)}`, {
840
1170
  method: 'GET',
841
1171
  credentials: 'include'
842
1172
  });
843
1173
  if (!res.ok)
844
- return;
845
- const data = await res.json().catch(() => ({}));
1174
+ return false;
1175
+ const data = await res.json();
1176
+ if (!Array.isArray(data?.documents))
1177
+ return false;
846
1178
  const docs = Array.isArray(data?.documents)
847
1179
  ? data.documents
848
1180
  .map((entry) => ({
@@ -870,18 +1202,20 @@ export function useSyncOrchestrator(input) {
870
1202
  ? data.fingerprint
871
1203
  : JSON.stringify(docs.map((entry) => `${entry.path}:${entry.updatedAt}:${entry.content.length}`).sort());
872
1204
  if (fingerprint === workspaceSyncMarkdownDocumentsFingerprintRef.current)
873
- return;
1205
+ return true;
874
1206
  workspaceSyncMarkdownDocumentsFingerprintRef.current = fingerprint;
875
1207
  workspaceSyncMarkdownDocumentsRef.current = docs;
876
1208
  workspaceSyncKnownDocumentPathsRef.current = knownDocumentPaths;
877
1209
  setWorkspaceSyncMarkdownDocuments(docs);
878
1210
  setWorkspaceSyncMarkdownDocumentsFingerprint(fingerprint);
1211
+ return true;
879
1212
  }
880
1213
  catch (error) {
881
1214
  logSyncDebug('documents_snapshot_refresh_failed', {
882
1215
  workspaceId: currentWorkspaceId,
883
1216
  error: String(error?.message || error || '')
884
1217
  });
1218
+ return false;
885
1219
  }
886
1220
  finally {
887
1221
  markWorkspaceSyncReferenceSnapshotReady('documents');
@@ -890,15 +1224,15 @@ export function useSyncOrchestrator(input) {
890
1224
  const refreshWorkspaceSyncAiProfilesSnapshot = useCallback(async () => {
891
1225
  if (runtimeMode !== 'local') {
892
1226
  setWorkspaceSyncAiProfilesLastSkipReason('runtime-not-local');
893
- return;
1227
+ return false;
894
1228
  }
895
1229
  if (!isValidWorkspaceKey(currentWorkspaceId)) {
896
1230
  setWorkspaceSyncAiProfilesLastSkipReason('workspace-id-invalid');
897
- return;
1231
+ return false;
898
1232
  }
899
1233
  if (cloudAuthConfigured && (!authSessionResolved || !isAuthenticated)) {
900
1234
  setWorkspaceSyncAiProfilesLastSkipReason(!authSessionResolved ? 'auth-unresolved' : 'auth-required');
901
- return;
1235
+ return false;
902
1236
  }
903
1237
  setWorkspaceSyncAiProfilesLastSkipReason(null);
904
1238
  try {
@@ -909,9 +1243,11 @@ export function useSyncOrchestrator(input) {
909
1243
  if (!res.ok) {
910
1244
  setWorkspaceSyncAiProfilesLastFetchError(`HTTP ${res.status}`);
911
1245
  setWorkspaceSyncAiProfilesLastFetchAt(new Date().toISOString());
912
- return;
1246
+ return false;
913
1247
  }
914
- const data = await res.json().catch(() => ({}));
1248
+ const data = await res.json();
1249
+ if (!Array.isArray(data?.aiProfiles))
1250
+ return false;
915
1251
  const rawAiProfiles = Array.isArray(data?.aiProfiles) ? data.aiProfiles : [];
916
1252
  setWorkspaceSyncAiProfilesRawCount(rawAiProfiles.length);
917
1253
  const aiProfiles = Array.isArray(data?.aiProfiles)
@@ -923,22 +1259,14 @@ export function useSyncOrchestrator(input) {
923
1259
  setWorkspaceSyncAiProfilesLastFetchAt(new Date().toISOString());
924
1260
  const fingerprint = typeof data?.fingerprint === 'string'
925
1261
  ? data.fingerprint
926
- : JSON.stringify(aiProfiles.map((entry) => [
927
- entry.id,
928
- entry.updatedAt,
929
- entry.name,
930
- entry.username,
931
- entry.archivedAt ?? '',
932
- entry.archivedReason ?? '',
933
- entry.mergedIntoProfileId ?? '',
934
- entry.rosterStateUpdatedAt ?? ''
935
- ].join(':')).sort());
1262
+ : getAiProfileSyncSnapshotFingerprint(aiProfiles);
936
1263
  if (fingerprint === workspaceSyncAiProfilesFingerprintRef.current)
937
- return;
1264
+ return true;
938
1265
  workspaceSyncAiProfilesFingerprintRef.current = fingerprint;
939
1266
  workspaceSyncAiProfilesRef.current = aiProfiles;
940
1267
  setWorkspaceSyncAiProfiles(aiProfiles);
941
1268
  setWorkspaceSyncAiProfilesFingerprint(fingerprint);
1269
+ return true;
942
1270
  }
943
1271
  catch (error) {
944
1272
  setWorkspaceSyncAiProfilesLastFetchError(String(error?.message || error || 'unknown-error'));
@@ -947,6 +1275,7 @@ export function useSyncOrchestrator(input) {
947
1275
  workspaceId: currentWorkspaceId,
948
1276
  error: String(error?.message || error || '')
949
1277
  });
1278
+ return false;
950
1279
  }
951
1280
  finally {
952
1281
  markWorkspaceSyncReferenceSnapshotReady('aiProfiles');
@@ -954,19 +1283,21 @@ export function useSyncOrchestrator(input) {
954
1283
  }, [runtimeMode, currentWorkspaceId, cloudAuthConfigured, authSessionResolved, isAuthenticated, markWorkspaceSyncReferenceSnapshotReady]);
955
1284
  const refreshWorkspaceSyncAssetsSnapshot = useCallback(async () => {
956
1285
  if (runtimeMode !== 'local')
957
- return;
1286
+ return false;
958
1287
  if (!isValidWorkspaceKey(currentWorkspaceId))
959
- return;
1288
+ return false;
960
1289
  if (cloudAuthConfigured && (!authSessionResolved || !isAuthenticated))
961
- return;
1290
+ return false;
962
1291
  try {
963
1292
  const res = await fetch(`/api/taskforce/sync/workspace/assets?workspaceId=${encodeURIComponent(currentWorkspaceId)}`, {
964
1293
  method: 'GET',
965
1294
  credentials: 'include'
966
1295
  });
967
1296
  if (!res.ok)
968
- return;
969
- const data = await res.json().catch(() => ({}));
1297
+ return false;
1298
+ const data = await res.json();
1299
+ if (!Array.isArray(data?.assets))
1300
+ return false;
970
1301
  const assets = Array.isArray(data?.assets)
971
1302
  ? data.assets
972
1303
  .map((entry) => ({
@@ -998,18 +1329,20 @@ export function useSyncOrchestrator(input) {
998
1329
  ? data.fingerprint
999
1330
  : JSON.stringify(assets.map((entry) => `${entry.path}:${entry.updatedAt}:${entry.contentBase64.length}`).sort());
1000
1331
  if (fingerprint === workspaceSyncAssetsFingerprintRef.current)
1001
- return;
1332
+ return true;
1002
1333
  workspaceSyncAssetsFingerprintRef.current = fingerprint;
1003
1334
  workspaceSyncAssetsRef.current = assets;
1004
1335
  workspaceSyncKnownAssetPathsRef.current = knownAssetPaths;
1005
1336
  setWorkspaceSyncAssets(assets);
1006
1337
  setWorkspaceSyncAssetsFingerprint(fingerprint);
1338
+ return true;
1007
1339
  }
1008
1340
  catch (error) {
1009
1341
  logSyncDebug('assets_snapshot_refresh_failed', {
1010
1342
  workspaceId: currentWorkspaceId,
1011
1343
  error: String(error?.message || error || '')
1012
1344
  });
1345
+ return false;
1013
1346
  }
1014
1347
  finally {
1015
1348
  markWorkspaceSyncReferenceSnapshotReady('assets');
@@ -1017,19 +1350,21 @@ export function useSyncOrchestrator(input) {
1017
1350
  }, [runtimeMode, currentWorkspaceId, cloudAuthConfigured, authSessionResolved, isAuthenticated, markWorkspaceSyncReferenceSnapshotReady]);
1018
1351
  const refreshWorkspaceSyncPlanningEntitiesSnapshot = useCallback(async () => {
1019
1352
  if (runtimeMode !== 'local')
1020
- return;
1353
+ return false;
1021
1354
  if (!isValidWorkspaceKey(currentWorkspaceId))
1022
- return;
1355
+ return false;
1023
1356
  if (cloudAuthConfigured && (!authSessionResolved || !isAuthenticated))
1024
- return;
1357
+ return false;
1025
1358
  try {
1026
1359
  const res = await fetch(`/api/taskforce/planning/bootstrap?workspaceId=${encodeURIComponent(currentWorkspaceId)}`, {
1027
1360
  method: 'GET',
1028
1361
  credentials: 'include'
1029
1362
  });
1030
1363
  if (!res.ok)
1031
- return;
1032
- const data = await res.json().catch(() => ({}));
1364
+ return false;
1365
+ const data = await res.json();
1366
+ if (!Array.isArray(data?.initiatives) || !Array.isArray(data?.workstreams))
1367
+ return false;
1033
1368
  const nextInitiatives = Array.isArray(data?.initiatives)
1034
1369
  ? data.initiatives.filter((entry) => (Boolean(entry && typeof entry === 'object' && typeof entry.id === 'string')))
1035
1370
  : [];
@@ -1038,29 +1373,33 @@ export function useSyncOrchestrator(input) {
1038
1373
  : [];
1039
1374
  workspaceInitiativesRef.current = nextInitiatives;
1040
1375
  workspaceWorkstreamsRef.current = nextWorkstreams;
1376
+ return true;
1041
1377
  }
1042
1378
  catch (error) {
1043
1379
  logSyncDebug('planning_snapshot_refresh_failed', {
1044
1380
  workspaceId: currentWorkspaceId,
1045
1381
  error: String(error?.message || error || '')
1046
1382
  });
1383
+ return false;
1047
1384
  }
1048
1385
  }, [runtimeMode, currentWorkspaceId, cloudAuthConfigured, authSessionResolved, isAuthenticated]);
1049
1386
  const refreshWorkspaceSyncDocumentReviewSessionsSnapshot = useCallback(async () => {
1050
1387
  if (runtimeMode !== 'local')
1051
- return;
1388
+ return false;
1052
1389
  if (!isValidWorkspaceKey(currentWorkspaceId))
1053
- return;
1390
+ return false;
1054
1391
  if (cloudAuthConfigured && (!authSessionResolved || !isAuthenticated))
1055
- return;
1392
+ return false;
1056
1393
  try {
1057
1394
  const res = await fetch(`/api/taskforce/sync/workspace/document-reviews?workspaceId=${encodeURIComponent(currentWorkspaceId)}`, {
1058
1395
  method: 'GET',
1059
1396
  credentials: 'include'
1060
1397
  });
1061
1398
  if (!res.ok)
1062
- return;
1063
- const data = await res.json().catch(() => ({}));
1399
+ return false;
1400
+ const data = await res.json();
1401
+ if (!Array.isArray(data?.sessions))
1402
+ return false;
1064
1403
  const sessions = Array.isArray(data?.sessions)
1065
1404
  ? data.sessions
1066
1405
  .map((entry) => ({
@@ -1088,6 +1427,8 @@ export function useSyncOrchestrator(input) {
1088
1427
  anchor: entry?.anchor ?? null,
1089
1428
  order: Number.isFinite(Number(entry?.order)) ? Math.max(0, Math.floor(Number(entry.order))) : 0,
1090
1429
  authorActorId: typeof entry?.authorActorId === 'string' && entry.authorActorId.trim().length > 0 ? entry.authorActorId.trim() : null,
1430
+ updatedByActorId: typeof entry?.updatedByActorId === 'string' && entry.updatedByActorId.trim().length > 0 ? entry.updatedByActorId.trim() : null,
1431
+ deletedByActorId: typeof entry?.deletedByActorId === 'string' && entry.deletedByActorId.trim().length > 0 ? entry.deletedByActorId.trim() : null,
1091
1432
  createdAt: String(entry?.createdAt || '').trim(),
1092
1433
  updatedAt: String(entry?.updatedAt || entry?.createdAt || '').trim(),
1093
1434
  deletedAt: typeof entry?.deletedAt === 'string' && entry.deletedAt.trim().length > 0 ? entry.deletedAt.trim() : null
@@ -1101,18 +1442,20 @@ export function useSyncOrchestrator(input) {
1101
1442
  ...comments.map((entry) => `${entry.id}:${entry.sessionId}:${entry.updatedAt}:${entry.deletedAt || ''}`).sort()
1102
1443
  ]);
1103
1444
  if (fingerprint === workspaceSyncDocumentReviewSessionsFingerprintRef.current)
1104
- return;
1445
+ return true;
1105
1446
  workspaceSyncDocumentReviewSessionsFingerprintRef.current = fingerprint;
1106
1447
  workspaceSyncDocumentReviewSessionsRef.current = sessions;
1107
1448
  workspaceSyncDocumentReviewCommentsRef.current = comments;
1108
1449
  setWorkspaceSyncDocumentReviewSessions(sessions);
1109
1450
  setWorkspaceSyncDocumentReviewSessionsFingerprint(fingerprint);
1451
+ return true;
1110
1452
  }
1111
1453
  catch (error) {
1112
1454
  logSyncDebug('document_review_sessions_snapshot_refresh_failed', {
1113
1455
  workspaceId: currentWorkspaceId,
1114
1456
  error: String(error?.message || error || '')
1115
1457
  });
1458
+ return false;
1116
1459
  }
1117
1460
  finally {
1118
1461
  markWorkspaceSyncReferenceSnapshotReady('documentReviewSessions');
@@ -1120,19 +1463,21 @@ export function useSyncOrchestrator(input) {
1120
1463
  }, [runtimeMode, currentWorkspaceId, cloudAuthConfigured, authSessionResolved, isAuthenticated, markWorkspaceSyncReferenceSnapshotReady]);
1121
1464
  const refreshWorkspaceSyncAnnotatedAttachmentSessionsSnapshot = useCallback(async () => {
1122
1465
  if (runtimeMode !== 'local')
1123
- return;
1466
+ return false;
1124
1467
  if (!isValidWorkspaceKey(currentWorkspaceId))
1125
- return;
1468
+ return false;
1126
1469
  if (cloudAuthConfigured && (!authSessionResolved || !isAuthenticated))
1127
- return;
1470
+ return false;
1128
1471
  try {
1129
1472
  const res = await fetch(`/api/taskforce/sync/workspace/annotated-attachments?workspaceId=${encodeURIComponent(currentWorkspaceId)}`, {
1130
1473
  method: 'GET',
1131
1474
  credentials: 'include'
1132
1475
  });
1133
1476
  if (!res.ok)
1134
- return;
1135
- const data = await res.json().catch(() => ({}));
1477
+ return false;
1478
+ const data = await res.json();
1479
+ if (!Array.isArray(data?.sessions))
1480
+ return false;
1136
1481
  const sessions = Array.isArray(data?.sessions)
1137
1482
  ? data.sessions
1138
1483
  .map((entry) => ({
@@ -1158,22 +1503,94 @@ export function useSyncOrchestrator(input) {
1158
1503
  ? data.fingerprint
1159
1504
  : JSON.stringify(sessions.map((entry) => `${entry.id}:${entry.updatedAt}:${entry.taskId}:${entry.baseImageAssetId}:${entry.annotations.length}:${entry.deletedAt || ''}`).sort());
1160
1505
  if (fingerprint === workspaceSyncAnnotatedAttachmentSessionsFingerprintRef.current)
1161
- return;
1506
+ return true;
1162
1507
  workspaceSyncAnnotatedAttachmentSessionsFingerprintRef.current = fingerprint;
1163
1508
  workspaceSyncAnnotatedAttachmentSessionsRef.current = sessions;
1164
1509
  setWorkspaceSyncAnnotatedAttachmentSessions(sessions);
1165
1510
  setWorkspaceSyncAnnotatedAttachmentSessionsFingerprint(fingerprint);
1511
+ return true;
1166
1512
  }
1167
1513
  catch (error) {
1168
1514
  logSyncDebug('annotated_attachment_sessions_snapshot_refresh_failed', {
1169
1515
  workspaceId: currentWorkspaceId,
1170
1516
  error: String(error?.message || error || '')
1171
1517
  });
1518
+ return false;
1172
1519
  }
1173
1520
  finally {
1174
1521
  markWorkspaceSyncReferenceSnapshotReady('annotatedAttachmentSessions');
1175
1522
  }
1176
1523
  }, [runtimeMode, currentWorkspaceId, cloudAuthConfigured, authSessionResolved, isAuthenticated, markWorkspaceSyncReferenceSnapshotReady]);
1524
+ const refreshWorkspaceSyncTaskforceAgentsSnapshot = useCallback(async () => {
1525
+ if (runtimeMode !== 'local')
1526
+ return false;
1527
+ if (!isValidWorkspaceKey(currentWorkspaceId))
1528
+ return false;
1529
+ if (cloudAuthConfigured && (!authSessionResolved || !isAuthenticated))
1530
+ return false;
1531
+ try {
1532
+ const res = await fetch(`/api/taskforce/sync/workspace/taskforce-agents?workspaceId=${encodeURIComponent(currentWorkspaceId)}`, {
1533
+ method: 'GET',
1534
+ credentials: 'include'
1535
+ });
1536
+ if (!res.ok)
1537
+ return false;
1538
+ const data = await res.json();
1539
+ if (!Array.isArray(data?.agents)
1540
+ || !Array.isArray(data?.roles)
1541
+ || !Array.isArray(data?.skills)
1542
+ || !Array.isArray(data?.conversations))
1543
+ return false;
1544
+ const agents = Array.isArray(data?.agents)
1545
+ ? data.agents
1546
+ .map((entry) => normalizeWorkspaceSyncTaskforceAgentSnapshotEntry(entry))
1547
+ .filter((entry) => entry.id.length > 0 && entry.workspaceId.length > 0)
1548
+ : [];
1549
+ const conversations = Array.isArray(data?.conversations)
1550
+ ? data.conversations
1551
+ .map((entry) => normalizeWorkspaceSyncAgentConversationSnapshotEntry(entry))
1552
+ .filter((entry) => (entry.id.length > 0
1553
+ && entry.workspaceId.length > 0
1554
+ && entry.agentId.length > 0))
1555
+ : [];
1556
+ const roles = Array.isArray(data?.roles)
1557
+ ? data.roles
1558
+ .map((entry) => normalizeAgentRoleSyncPayload(entry, currentWorkspaceId))
1559
+ .filter((entry) => Boolean(entry))
1560
+ : [];
1561
+ const skills = data.skills
1562
+ .map((entry) => normalizeTaskforceAgentSkillSyncPayload(entry, currentWorkspaceId))
1563
+ .filter((entry) => (Boolean(entry && entry.id.length > 0 && entry.workspaceId.length > 0)));
1564
+ const fingerprint = typeof data?.fingerprint === 'string'
1565
+ ? data.fingerprint
1566
+ : JSON.stringify([
1567
+ ...agents.map((entry) => `${entry.id}:${entry.updatedAt}:${entry.deletedAt || ''}:${entry.name}:${entry.modelTier}`).sort(),
1568
+ ...roles.map((entry) => `${entry.id}:${entry.updatedAt}:${entry.deletedAt || ''}:${entry.currentRevision}:${entry.currentContentHash}`).sort(),
1569
+ ...skills.map((entry) => `${entry.id}:${entry.updatedAt}:${entry.revision}:${entry.contentHash}:${entry.lifecycleStatus}`).sort(),
1570
+ ...conversations.map((entry) => `${entry.id}:${entry.agentId}:${entry.updatedAt}:${entry.deletedAt || ''}:${entry.messages.length}`).sort()
1571
+ ]);
1572
+ if (fingerprint === workspaceSyncTaskforceAgentsFingerprintRef.current)
1573
+ return true;
1574
+ workspaceSyncTaskforceAgentsFingerprintRef.current = fingerprint;
1575
+ workspaceSyncTaskforceAgentsRef.current = agents;
1576
+ workspaceSyncAgentRolesRef.current = roles;
1577
+ workspaceSyncTaskforceAgentSkillsRef.current = skills;
1578
+ workspaceSyncAgentConversationsRef.current = conversations;
1579
+ setWorkspaceSyncTaskforceAgents(agents);
1580
+ setWorkspaceSyncTaskforceAgentsFingerprint(fingerprint);
1581
+ return true;
1582
+ }
1583
+ catch (error) {
1584
+ logSyncDebug('taskforce_agents_snapshot_refresh_failed', {
1585
+ workspaceId: currentWorkspaceId,
1586
+ error: String(error?.message || error || '')
1587
+ });
1588
+ return false;
1589
+ }
1590
+ finally {
1591
+ markWorkspaceSyncReferenceSnapshotReady('taskforceAgents');
1592
+ }
1593
+ }, [runtimeMode, currentWorkspaceId, cloudAuthConfigured, authSessionResolved, isAuthenticated, markWorkspaceSyncReferenceSnapshotReady]);
1177
1594
  const seedWorkspaceSnapshotPushBaseline = useCallback(() => {
1178
1595
  workspaceLastPushedTaskIdsRef.current = new Set([...workspaceTasksRef.current, ...workspaceArchivedTasksRef.current]
1179
1596
  .map((entry) => String(entry?.id || '').trim())
@@ -1186,6 +1603,13 @@ export function useSyncOrchestrator(input) {
1186
1603
  ...workspaceArchivedTasksRef.current.map((entry) => [String(entry?.id || '').trim(), taskSyncResourceAdapter.getChangeKey({ ...entry, isArchived: true })])
1187
1604
  ]
1188
1605
  .filter(([id]) => id.length > 0));
1606
+ workspaceLastPushedTaskRelationshipChangeKeysRef.current = new Map(workspaceTaskRelationshipsRef.current
1607
+ .map((entry) => [String(entry?.id || '').trim(), getTaskRelationshipSyncChangeKey(entry)])
1608
+ .filter(([id]) => id.length > 0));
1609
+ workspaceLastPushedTaxonomyChangeKeyRef.current = getTaxonomySyncChangeKey({
1610
+ taxonomyState: workspaceTaxonomyStateRef.current,
1611
+ taxonomies: workspaceTaxonomiesRef.current,
1612
+ });
1189
1613
  workspaceLastPushedInitiativeIdsRef.current = new Set(workspaceInitiativesRef.current
1190
1614
  .map((entry) => String(entry?.id || '').trim())
1191
1615
  .filter((id) => id.length > 0));
@@ -1237,6 +1661,38 @@ export function useSyncOrchestrator(input) {
1237
1661
  workspaceLastPushedAnnotatedAttachmentSessionWatermarksRef.current = new Map(workspaceSyncAnnotatedAttachmentSessionsRef.current
1238
1662
  .map((entry) => [String(entry?.id || '').trim(), String(entry?.updatedAt || entry?.createdAt || '').trim()])
1239
1663
  .filter(([id]) => id.length > 0));
1664
+ workspaceLastPushedTaskforceAgentIdsRef.current = new Set([
1665
+ ...workspaceSyncTaskforceAgentsRef.current
1666
+ .map((entry) => String(entry?.id || '').trim()),
1667
+ ...workspaceSyncAgentRolesRef.current
1668
+ .map((entry) => `agent-role:${String(entry?.id || '').trim()}`),
1669
+ ]
1670
+ .filter((id) => id.length > 0));
1671
+ workspaceLastPushedTaskforceAgentWatermarksRef.current = new Map([
1672
+ ...workspaceSyncTaskforceAgentsRef.current
1673
+ .map((entry) => [
1674
+ String(entry?.id || '').trim(),
1675
+ String(entry?.deletedAt || entry?.updatedAt || entry?.createdAt || '').trim(),
1676
+ ]),
1677
+ ...workspaceSyncAgentRolesRef.current
1678
+ .map((entry) => [
1679
+ `agent-role:${String(entry?.id || '').trim()}`,
1680
+ String(entry?.deletedAt || entry?.updatedAt || entry?.createdAt || '').trim(),
1681
+ ]),
1682
+ ]
1683
+ .filter(([id]) => id.length > 0));
1684
+ workspaceLastPushedTaskforceAgentSkillIdsRef.current = new Set(workspaceSyncTaskforceAgentSkillsRef.current
1685
+ .map((entry) => String(entry?.id || '').trim())
1686
+ .filter((id) => id.length > 0));
1687
+ workspaceLastPushedTaskforceAgentSkillWatermarksRef.current = new Map(workspaceSyncTaskforceAgentSkillsRef.current
1688
+ .map((entry) => [String(entry?.id || '').trim(), String(entry?.updatedAt || entry?.createdAt || '').trim()])
1689
+ .filter(([id]) => id.length > 0));
1690
+ workspaceLastPushedAgentConversationIdsRef.current = new Set(workspaceSyncAgentConversationsRef.current
1691
+ .map((entry) => String(entry?.id || '').trim())
1692
+ .filter((id) => id.length > 0));
1693
+ workspaceLastPushedAgentConversationWatermarksRef.current = new Map(workspaceSyncAgentConversationsRef.current
1694
+ .map((entry) => [String(entry?.id || '').trim(), String(entry?.deletedAt || entry?.updatedAt || entry?.createdAt || '').trim()])
1695
+ .filter(([id]) => id.length > 0));
1240
1696
  workspaceLastPushedTaskEventWatermarksRef.current = new Map(flattenTaskEvents(workspaceTasksRef.current, workspaceArchivedTasksRef.current, workspaceInitiativesRef.current, workspaceWorkstreamsRef.current)
1241
1697
  .map((entry) => [String(entry?.id || '').trim(), String(entry?.createdAt || '').trim()])
1242
1698
  .filter(([id]) => id.length > 0));
@@ -1244,7 +1700,7 @@ export function useSyncOrchestrator(input) {
1244
1700
  workspaceBaselineResetReasonRef.current = persisted ? null : 'storage-write-failed';
1245
1701
  }, [persistWorkspaceSyncWatermarksSnapshotBestEffort]);
1246
1702
  const refreshLocalWorkspaceTaskCollections = useCallback(async () => {
1247
- const [tasksRes, archiveRes] = await Promise.all([
1703
+ const [tasksRes, archiveRes, relationshipsRes] = await Promise.all([
1248
1704
  fetch('/api/taskforce/tasks', {
1249
1705
  method: 'GET',
1250
1706
  credentials: 'include'
@@ -1252,31 +1708,41 @@ export function useSyncOrchestrator(input) {
1252
1708
  fetch('/api/taskforce/archive', {
1253
1709
  method: 'GET',
1254
1710
  credentials: 'include'
1711
+ }),
1712
+ fetch('/api/taskforce/task-relationships', {
1713
+ method: 'GET',
1714
+ credentials: 'include'
1255
1715
  })
1256
1716
  ]);
1257
- if (tasksRes.ok) {
1258
- const tasksPayload = await tasksRes.json().catch(() => ({}));
1259
- const normalizedTasks = Array.isArray(tasksPayload?.tasks)
1260
- ? tasksPayload.tasks.map((task) => normalizeTaskFromApi(task))
1261
- : [];
1262
- setTasks(normalizedTasks);
1717
+ if (!tasksRes.ok || !archiveRes.ok || !relationshipsRes.ok) {
1718
+ throw new Error('Required task collection refresh failed.');
1263
1719
  }
1264
- if (archiveRes.ok) {
1265
- const archivePayload = await archiveRes.json().catch(() => ({}));
1266
- const normalizedArchive = Array.isArray(archivePayload?.archived)
1267
- ? archivePayload.archived.map((task) => ({
1268
- ...normalizeTaskFromApi(task),
1269
- isArchived: true
1270
- }))
1271
- : [];
1272
- setArchivedTasks(normalizedArchive);
1720
+ const [tasksPayload, archivePayload, relationshipPayload] = await Promise.all([
1721
+ tasksRes.json(),
1722
+ archiveRes.json(),
1723
+ relationshipsRes.json()
1724
+ ]);
1725
+ if (!Array.isArray(tasksPayload?.tasks)
1726
+ || !Array.isArray(archivePayload?.archived)
1727
+ || !Array.isArray(relationshipPayload?.relationships)) {
1728
+ throw new Error('Required task collection refresh returned an invalid response.');
1273
1729
  }
1730
+ const normalizedTasks = tasksPayload.tasks.map((task) => normalizeTaskFromApi(task));
1731
+ const normalizedArchive = archivePayload.archived.map((task) => ({
1732
+ ...normalizeTaskFromApi(task),
1733
+ isArchived: true
1734
+ }));
1735
+ workspaceTasksRef.current = normalizedTasks;
1736
+ workspaceArchivedTasksRef.current = normalizedArchive;
1737
+ updateWorkspaceTaskRelationships(relationshipPayload.relationships);
1738
+ setTasks(normalizedTasks);
1739
+ setArchivedTasks(normalizedArchive);
1274
1740
  await fetchPlanningEntities().catch(() => {
1275
1741
  logSyncDebug('refresh_planning_entities_failed', {
1276
1742
  workspaceId: currentWorkspaceId
1277
1743
  });
1278
1744
  });
1279
- }, [currentWorkspaceId, fetchPlanningEntities, setArchivedTasks, setTasks]);
1745
+ }, [currentWorkspaceId, fetchPlanningEntities, setArchivedTasks, setTasks, updateWorkspaceTaskRelationships]);
1280
1746
  // === SECTION: Auth failure handling & sync readiness ===
1281
1747
  const { handleSyncAuthFailure, ensureWorkspaceSyncReady } = useMemo(() => createSyncAuthCoordinator({
1282
1748
  currentWorkspaceId,
@@ -1307,91 +1773,107 @@ export function useSyncOrchestrator(input) {
1307
1773
  persistWorkspaceSyncPatchSafely
1308
1774
  ]);
1309
1775
  // === SECTION: Push/Pull sync ===
1310
- const transferCoordinator = useMemo(() => createWorkspaceTransferCoordinator({
1311
- cloudAuthConfigured,
1312
- runtimeMode,
1313
- workspaceCloudSyncEnabled,
1314
- currentWorkspaceId,
1315
- workspaceSyncPhase,
1316
- isAuthenticated,
1317
- checkAuthSession,
1318
- resolveCloudAuthUrl,
1319
- ensureCloudWorkspaceReadyForSync,
1320
- ensureWorkspaceSyncReady,
1321
- handleSyncAuthFailure,
1322
- clearWorkspaceRetry,
1323
- clearWorkspaceIssue,
1324
- isWorkspaceRetryPending,
1325
- scheduleWorkspaceSyncRetry,
1326
- persistWorkspaceSyncPatchSafely,
1327
- persistWorkspaceSyncPatchBestEffort,
1328
- persistWorkspaceSyncWatermarksSnapshotBestEffort,
1329
- reportSyncEvent,
1330
- acquireWorkspaceSyncLease,
1331
- releaseWorkspaceSyncLease,
1332
- reportWorkspaceWindowContention,
1333
- refreshWorkspaceSyncMarkdownDocumentsSnapshot,
1334
- refreshWorkspaceSyncAiProfilesSnapshot,
1335
- refreshWorkspaceSyncAssetsSnapshot,
1336
- refreshWorkspaceSyncPlanningEntitiesSnapshot,
1337
- refreshWorkspaceSyncDocumentReviewSessionsSnapshot,
1338
- refreshWorkspaceSyncAnnotatedAttachmentSessionsSnapshot,
1339
- refreshLocalWorkspaceTaskCollections,
1340
- buildWorkspaceSyncPayload,
1341
- buildWorkspaceSyncSignature,
1342
- seedWorkspaceSnapshotPushBaseline,
1343
- shouldSuppressAttachBootstrapPush,
1344
- recordSuppressedEventIds: (...args) => realtimeBridgeRef.current.recordSuppressedEventIds(...args),
1345
- workspaceRepairModeRef,
1346
- workspaceForceFullAiProfilePushRef,
1347
- workspacePushInFlightRef,
1348
- workspacePullInFlightRef,
1349
- workspacePendingPushReplayRef,
1350
- workspaceLastPushedSignatureRef,
1351
- workspacePendingSignatureRef,
1352
- workspaceLastPushedTaskIdsRef,
1353
- workspaceDeletedTaskIdsRef,
1354
- workspaceDeletedTaskWatermarksRef,
1355
- workspacePullCursorRef,
1356
- workspaceLastPushedWatermarksRef,
1357
- workspaceLastPushedTaskChangeKeysRef,
1358
- workspaceLastPushedInitiativeIdsRef,
1359
- workspaceLastPushedInitiativeWatermarksRef,
1360
- workspaceLastPushedWorkstreamIdsRef,
1361
- workspaceLastPushedWorkstreamWatermarksRef,
1362
- workspaceLastPushedAiProfileIdsRef,
1363
- workspaceLastPushedAiProfileWatermarksRef,
1364
- workspaceLastPushedAiProfileChangeKeysRef,
1365
- workspaceLastPushedDocumentPathsRef,
1366
- workspaceLastPushedDocumentWatermarksRef,
1367
- workspaceLastPushedAssetPathsRef,
1368
- workspaceLastPushedAssetWatermarksRef,
1369
- workspaceLastPushedDocumentReviewSessionIdsRef,
1370
- workspaceLastPushedDocumentReviewSessionWatermarksRef,
1371
- workspaceLastPushedDocumentReviewCommentIdsRef,
1372
- workspaceLastPushedDocumentReviewCommentWatermarksRef,
1373
- workspaceLastPushedAnnotatedAttachmentSessionIdsRef,
1374
- workspaceLastPushedAnnotatedAttachmentSessionWatermarksRef,
1375
- workspaceLastPushedTaskEventWatermarksRef,
1376
- workspaceBaselineResetReasonRef,
1377
- workspaceCaptureAttachBootstrapBaselineRef,
1378
- workspaceStartupFullReconcileRanRef,
1379
- workspaceFullReconcileInFlightRef,
1380
- bootstrapLastProgressAtRef,
1381
- realtimeSuppressedEventQueueRef,
1382
- setWorkspaceSyncBusy,
1383
- setUserGlobalSyncStatus,
1384
- setUserGlobalSyncError,
1385
- setWorkspaceLastErrorMessage,
1386
- setWorkspaceLastErrorAt,
1387
- setWorkspaceLastPullAt,
1388
- setWorkspaceLastPushAt,
1389
- setWorkspaceSyncPendingChanges,
1390
- setTasks,
1391
- setArchivedTasks
1392
- }), [
1776
+ const transferCoordinator = useMemo(() => {
1777
+ const capturedSelection = workspaceSyncRemoteServicesSelection;
1778
+ if (!workspaceSyncEngineRemoteServices)
1779
+ return null;
1780
+ return createWorkspaceTransferCoordinator({
1781
+ cloudAuthConfigured,
1782
+ runtimeMode,
1783
+ initiativeFeedActivationEnabled,
1784
+ combinedFeedActivationEnabled,
1785
+ combinedFeedCoverage,
1786
+ workspaceCloudSyncEnabled,
1787
+ currentWorkspaceId,
1788
+ workspaceSyncPhase,
1789
+ isAuthenticated,
1790
+ checkAuthSession,
1791
+ resolveCloudAuthUrl,
1792
+ ensureCloudWorkspaceReadyForSync,
1793
+ ensureWorkspaceSyncReady,
1794
+ handleSyncAuthFailure,
1795
+ clearWorkspaceRetry,
1796
+ clearWorkspaceIssue,
1797
+ isWorkspaceRetryPending,
1798
+ isDurableRecoveryBlockingOrdinaryPush,
1799
+ isExecutionAuthorized: () => (isBrowserSyncRemoteServicesSelectionAuthorized({
1800
+ current: workspaceSyncRemoteServicesSelectionRef.current
1801
+ ?? { mode: 'blocked', remoteServices: null },
1802
+ captured: capturedSelection,
1803
+ browserSchedulingAllowed: isBrowserWorkspaceSyncAuthorized(),
1804
+ onDenied: () => {
1805
+ const authority = browserSyncAuthorityRef.current;
1806
+ if (!authority.serverCommandMode
1807
+ || browserExecutionFenceDiagnosticEpochRef.current
1808
+ === authority.authorityEpoch)
1809
+ return;
1810
+ browserExecutionFenceDiagnosticEpochRef.current =
1811
+ authority.authorityEpoch;
1812
+ reportSyncEvent(currentWorkspaceId, {
1813
+ eventType: 'handshake',
1814
+ status: 'error',
1815
+ statusCode: 409,
1816
+ errorMessage: 'Browser cloud execution was blocked by persisted server ownership.',
1817
+ details: {
1818
+ errorCode: 'SYNC_BROWSER_EXECUTION_FENCED_BY_SERVER_OWNER',
1819
+ authorityEpoch: authority.authorityEpoch,
1820
+ capturedTransportMode: capturedSelection.mode,
1821
+ },
1822
+ });
1823
+ },
1824
+ })),
1825
+ scheduleWorkspaceSyncRetry,
1826
+ persistWorkspaceSyncPatchSafely,
1827
+ persistWorkspaceSyncPatchBestEffort,
1828
+ persistWorkspaceSyncWatermarksSnapshotBestEffort,
1829
+ refreshWorkspaceAiProfilePushBaselineFromPersistence,
1830
+ reportSyncEvent,
1831
+ acquireWorkspaceSyncLease,
1832
+ releaseWorkspaceSyncLease,
1833
+ recordWorkspaceSyncCompletion,
1834
+ reportWorkspaceWindowContention,
1835
+ refreshWorkspaceSyncMarkdownDocumentsSnapshot,
1836
+ refreshWorkspaceSyncAiProfilesSnapshot,
1837
+ refreshWorkspaceSyncAssetsSnapshot,
1838
+ refreshWorkspaceSyncTaxonomySnapshot,
1839
+ refreshWorkspaceSyncPlanningEntitiesSnapshot,
1840
+ refreshWorkspaceSyncDocumentReviewSessionsSnapshot,
1841
+ refreshWorkspaceSyncAnnotatedAttachmentSessionsSnapshot,
1842
+ refreshWorkspaceSyncTaskforceAgentsSnapshot,
1843
+ refreshLocalWorkspaceTaskCollections,
1844
+ buildWorkspaceSyncPayload,
1845
+ buildWorkspaceSyncSignature,
1846
+ seedWorkspaceSnapshotPushBaseline,
1847
+ shouldSuppressAttachBootstrapPush,
1848
+ recordSuppressedEventIds: (...args) => (realtimeBridgeRef.current.recordSuppressedEventIds(...args)),
1849
+ runtime: workspaceSyncEngineRuntime,
1850
+ localServices: workspaceSyncEngineLocalServices,
1851
+ remoteServices: workspaceSyncEngineRemoteServices,
1852
+ setWorkspaceSyncBusy,
1853
+ setUserGlobalSyncStatus,
1854
+ setUserGlobalSyncError,
1855
+ setWorkspaceLastErrorMessage,
1856
+ setWorkspaceLastErrorAt,
1857
+ setWorkspaceLastPullAt,
1858
+ setWorkspaceLastPushAt,
1859
+ setWorkspaceSyncPendingChanges,
1860
+ setTasks,
1861
+ setArchivedTasks,
1862
+ scheduleTask: (callback, delayMs) => {
1863
+ const timeoutId = window.setTimeout(callback, delayMs);
1864
+ return { cancel: () => window.clearTimeout(timeoutId) };
1865
+ },
1866
+ logDebug: logSyncDebug,
1867
+ notifyAiProfilesMutated: dispatchTaskforceAiProfilesMutated,
1868
+ notifyAgentsMutated: dispatchTaskforceAgentsMutated,
1869
+ notifyAgentSkillsMutated: dispatchTaskforceAgentSkillsMutated
1870
+ });
1871
+ }, [
1393
1872
  cloudAuthConfigured,
1394
1873
  runtimeMode,
1874
+ initiativeFeedActivationEnabled,
1875
+ combinedFeedActivationEnabled,
1876
+ combinedFeedCoverage,
1395
1877
  workspaceCloudSyncEnabled,
1396
1878
  currentWorkspaceId,
1397
1879
  workspaceSyncPhase,
@@ -1404,29 +1886,47 @@ export function useSyncOrchestrator(input) {
1404
1886
  handleSyncAuthFailure,
1405
1887
  clearWorkspaceRetry,
1406
1888
  clearWorkspaceIssue,
1889
+ isDurableRecoveryBlockingOrdinaryPush,
1407
1890
  scheduleWorkspaceSyncRetry,
1408
1891
  persistWorkspaceSyncPatchSafely,
1409
1892
  persistWorkspaceSyncPatchBestEffort,
1410
1893
  persistWorkspaceSyncWatermarksSnapshotBestEffort,
1894
+ refreshWorkspaceAiProfilePushBaselineFromPersistence,
1411
1895
  reportSyncEvent,
1412
1896
  acquireWorkspaceSyncLease,
1413
1897
  releaseWorkspaceSyncLease,
1898
+ recordWorkspaceSyncCompletion,
1414
1899
  reportWorkspaceWindowContention,
1415
1900
  refreshWorkspaceSyncMarkdownDocumentsSnapshot,
1416
1901
  refreshWorkspaceSyncAiProfilesSnapshot,
1417
1902
  refreshWorkspaceSyncAssetsSnapshot,
1903
+ refreshWorkspaceSyncTaxonomySnapshot,
1418
1904
  refreshWorkspaceSyncPlanningEntitiesSnapshot,
1419
1905
  refreshWorkspaceSyncDocumentReviewSessionsSnapshot,
1420
1906
  refreshWorkspaceSyncAnnotatedAttachmentSessionsSnapshot,
1907
+ refreshWorkspaceSyncTaskforceAgentsSnapshot,
1421
1908
  refreshLocalWorkspaceTaskCollections,
1422
1909
  buildWorkspaceSyncPayload,
1423
1910
  buildWorkspaceSyncSignature,
1424
1911
  seedWorkspaceSnapshotPushBaseline,
1425
1912
  shouldSuppressAttachBootstrapPush,
1913
+ workspaceSyncRemoteServicesSelection,
1914
+ workspaceSyncEngineRemoteServices,
1426
1915
  setTasks,
1427
1916
  setArchivedTasks
1428
1917
  ]);
1429
- const { pushWorkspaceChangesToCloud, pullWorkspaceChangesFromCloud } = transferCoordinator;
1918
+ useEffect(() => {
1919
+ transferCoordinator?.resumeDeferredWork();
1920
+ }, [browserSyncAuthority.authorityEpoch, transferCoordinator]);
1921
+ useEffect(() => () => transferCoordinator?.dispose(), [transferCoordinator]);
1922
+ const pushWorkspaceChangesToCloud = useCallback((signature, options) => (transferCoordinator
1923
+ ? transferCoordinator.pushWorkspaceChangesToCloud(signature, options)
1924
+ : Promise.resolve(false)), [transferCoordinator]);
1925
+ const pullWorkspaceChangesFromCloud = useCallback((options) => (transferCoordinator
1926
+ ? transferCoordinator.pullWorkspaceChangesFromCloud(options)
1927
+ : Promise.resolve(false)), [transferCoordinator]);
1928
+ const pullWorkspaceChangesFromCloudRef = useRef(pullWorkspaceChangesFromCloud);
1929
+ pullWorkspaceChangesFromCloudRef.current = pullWorkspaceChangesFromCloud;
1430
1930
  const realtimeBridgeRef = useRef({
1431
1931
  handleRealtimeSignal: () => { },
1432
1932
  recordSuppressedEventIds: () => { },
@@ -1442,6 +1942,9 @@ export function useSyncOrchestrator(input) {
1442
1942
  realtimeSuppressedEventIdsRef,
1443
1943
  clearWorkspaceRetry,
1444
1944
  isWorkspaceRetryPending,
1945
+ isExecutionAuthorized: isBrowserWorkspaceSyncAuthorized,
1946
+ isServerOwned: () => (isServerOwnedBrowserSyncAuthority(browserSyncAuthorityRef.current)),
1947
+ signalServerWake: (eventIds) => localCoordinator.signalWake('realtime', eventIds),
1445
1948
  pullWorkspaceChangesFromCloud
1446
1949
  }), [
1447
1950
  cloudAuthConfigured,
@@ -1450,12 +1953,16 @@ export function useSyncOrchestrator(input) {
1450
1953
  workspaceSyncPhase,
1451
1954
  clearWorkspaceRetry,
1452
1955
  isWorkspaceRetryPending,
1956
+ isBrowserWorkspaceSyncAuthorized,
1957
+ localCoordinator.signalWake,
1453
1958
  pullWorkspaceChangesFromCloud
1454
1959
  ]);
1455
1960
  realtimeBridgeRef.current = realtimeBridge;
1456
1961
  const realtimeSocketUrl = resolveWebSocketUrl('/taskforce-ws');
1457
1962
  const normalizedRealtimeUserId = String(authUserId || '').trim();
1458
1963
  const realtimeEnabled = Boolean(realtimeSyncEnabled
1964
+ && (isBrowserWorkspaceSyncAuthorized()
1965
+ || browserSyncAuthority.serverCommandMode)
1459
1966
  && cloudAuthConfigured
1460
1967
  && runtimeMode === 'local'
1461
1968
  && workspaceCloudSyncEnabled
@@ -1478,8 +1985,28 @@ export function useSyncOrchestrator(input) {
1478
1985
  useEffect(() => {
1479
1986
  return () => realtimeBridge.clearRealtimePullDebounce();
1480
1987
  }, [realtimeBridge]);
1988
+ useEffect(() => {
1989
+ if (browserSyncAuthority.browserSchedulingAllowed)
1990
+ return;
1991
+ clearWorkspaceRetry();
1992
+ realtimeBridgeRef.current.clearRealtimePullDebounce();
1993
+ }, [
1994
+ browserSyncAuthority.authorityEpoch,
1995
+ browserSyncAuthority.browserSchedulingAllowed,
1996
+ clearWorkspaceRetry,
1997
+ ]);
1481
1998
  // === SECTION: Repair & manual retry ===
1482
1999
  const saveWorkspaceCloudSyncSettings = useCallback(async (settings) => {
2000
+ if (browserSyncAuthority.serverCommandMode) {
2001
+ await localCoordinator.issueCommand(settings.enabled ? 'EnableSync' : 'DisableSync');
2002
+ return { success: true };
2003
+ }
2004
+ if (!isBrowserWorkspaceSyncAuthorized()) {
2005
+ return {
2006
+ success: false,
2007
+ error: 'Workspace sync ownership is changing. Wait for the coordinator to become ready.',
2008
+ };
2009
+ }
1483
2010
  return saveWorkspaceCloudSyncSettingsBase(settings, {
1484
2011
  cloudAuthConfigured,
1485
2012
  isAuthenticated,
@@ -1489,7 +2016,10 @@ export function useSyncOrchestrator(input) {
1489
2016
  saveWorkspaceCloudSyncSettingsBase,
1490
2017
  cloudAuthConfigured,
1491
2018
  isAuthenticated,
1492
- ensureCloudWorkspaceReadyForSync
2019
+ ensureCloudWorkspaceReadyForSync,
2020
+ browserSyncAuthority.serverCommandMode,
2021
+ isBrowserWorkspaceSyncAuthorized,
2022
+ localCoordinator,
1493
2023
  ]);
1494
2024
  const retryUserGlobalSettingsSync = useCallback(async () => {
1495
2025
  await syncUserGlobalSettings({ preferCloudOnFirstSync: false });
@@ -1499,40 +2029,8 @@ export function useSyncOrchestrator(input) {
1499
2029
  workspaceCloudSyncEnabled,
1500
2030
  workspaceSyncPhase,
1501
2031
  workspaceLastPullAt,
1502
- lastBootstrapPhaseRef,
1503
- workspaceRepairModeRef,
1504
- workspaceForceFullAiProfilePushRef,
1505
- workspaceStartupRepairRanRef,
1506
- workspaceStartupFullReconcileRanRef,
1507
- workspaceFullReconcileInFlightRef,
1508
- workspacePullCursorRef,
1509
- workspaceAttachBootstrapBaselineSignatureRef,
1510
- workspaceCaptureAttachBootstrapBaselineRef,
1511
- workspacePendingSignatureRef,
1512
- workspaceLastPushedSignatureRef,
1513
- workspaceLastPushedWatermarksRef,
1514
- workspaceLastPushedTaskChangeKeysRef,
1515
- workspaceLastPushedInitiativeIdsRef,
1516
- workspaceLastPushedInitiativeWatermarksRef,
1517
- workspaceLastPushedWorkstreamIdsRef,
1518
- workspaceLastPushedWorkstreamWatermarksRef,
1519
- workspaceLastPushedAiProfileIdsRef,
1520
- workspaceLastPushedAiProfileWatermarksRef,
1521
- workspaceLastPushedAiProfileChangeKeysRef,
1522
- workspaceLastPushedDocumentPathsRef,
1523
- workspaceLastPushedDocumentWatermarksRef,
1524
- workspaceLastPushedAssetPathsRef,
1525
- workspaceLastPushedAssetWatermarksRef,
1526
- workspaceLastPushedDocumentReviewSessionIdsRef,
1527
- workspaceLastPushedDocumentReviewSessionWatermarksRef,
1528
- workspaceLastPushedDocumentReviewCommentIdsRef,
1529
- workspaceLastPushedDocumentReviewCommentWatermarksRef,
1530
- workspaceLastPushedAnnotatedAttachmentSessionIdsRef,
1531
- workspaceLastPushedAnnotatedAttachmentSessionWatermarksRef,
1532
- workspaceLastPushedTaskEventWatermarksRef,
1533
- workspaceBaselineResetReasonRef,
1534
- bootstrapPhaseStartedAtRef,
1535
- bootstrapLastProgressAtRef,
2032
+ runtime: workspaceSyncEngineRuntime,
2033
+ localServices: workspaceSyncEngineLocalServices,
1536
2034
  acquireWorkspaceSyncLease,
1537
2035
  releaseWorkspaceSyncLease,
1538
2036
  forceClearWorkspaceSyncLease,
@@ -1548,13 +2046,17 @@ export function useSyncOrchestrator(input) {
1548
2046
  cloudAuthConfigured,
1549
2047
  runtimeMode,
1550
2048
  isAuthenticated,
1551
- checkAuthSession
2049
+ checkAuthSession,
2050
+ isExecutionAuthorized: isBrowserWorkspaceSyncAuthorized,
2051
+ coordinatorGeneration: localCoordinator.snapshot?.state?.coordinatorGeneration ?? null,
1552
2052
  }), [
1553
2053
  currentWorkspaceId,
1554
2054
  taxonomyStateFingerprint,
1555
2055
  workspaceCloudSyncEnabled,
1556
2056
  workspaceSyncPhase,
1557
2057
  workspaceLastPullAt,
2058
+ workspaceSyncEngineRuntime,
2059
+ workspaceSyncEngineLocalServices,
1558
2060
  acquireWorkspaceSyncLease,
1559
2061
  releaseWorkspaceSyncLease,
1560
2062
  forceClearWorkspaceSyncLease,
@@ -1570,9 +2072,45 @@ export function useSyncOrchestrator(input) {
1570
2072
  cloudAuthConfigured,
1571
2073
  runtimeMode,
1572
2074
  isAuthenticated,
1573
- checkAuthSession
2075
+ checkAuthSession,
2076
+ isBrowserWorkspaceSyncAuthorized,
2077
+ localCoordinator.snapshot?.state?.coordinatorGeneration,
2078
+ ]);
2079
+ const retryWorkspaceCloudSync = useCallback(async () => {
2080
+ if (browserSyncAuthority.serverCommandMode) {
2081
+ const coordinatorSnapshot = localCoordinator.snapshot
2082
+ || await localCoordinator.refresh();
2083
+ if (!coordinatorSnapshot || coordinatorSnapshot.credential.status !== 'ready') {
2084
+ return false;
2085
+ }
2086
+ await localCoordinator.issueCommand('Retry');
2087
+ return true;
2088
+ }
2089
+ if (!isBrowserWorkspaceSyncAuthorized())
2090
+ return false;
2091
+ return recoveryCoordinator.retryWorkspaceCloudSync();
2092
+ }, [
2093
+ browserSyncAuthority.serverCommandMode,
2094
+ isBrowserWorkspaceSyncAuthorized,
2095
+ localCoordinator,
2096
+ recoveryCoordinator,
2097
+ ]);
2098
+ const resetWorkspaceSyncCursorAndPull = useCallback(async () => {
2099
+ if (browserSyncAuthority.serverCommandMode) {
2100
+ void localCoordinator.issueCommand('Repair').catch(() => {
2101
+ // Coordinator status owns durable error and retry presentation.
2102
+ });
2103
+ return;
2104
+ }
2105
+ if (!isBrowserWorkspaceSyncAuthorized())
2106
+ return;
2107
+ await recoveryCoordinator.resetWorkspaceSyncCursorAndPull();
2108
+ }, [
2109
+ browserSyncAuthority.serverCommandMode,
2110
+ isBrowserWorkspaceSyncAuthorized,
2111
+ localCoordinator,
2112
+ recoveryCoordinator,
1574
2113
  ]);
1575
- const { retryWorkspaceCloudSync, resetWorkspaceSyncCursorAndPull } = recoveryCoordinator;
1576
2114
  // === SECTION: Diagnostics & reactive effects ===
1577
2115
  const getWorkspaceSyncDiagnostics = useCallback(() => {
1578
2116
  const pushReadiness = resolvePushSyncReadiness({
@@ -1618,7 +2156,7 @@ export function useSyncOrchestrator(input) {
1618
2156
  lastPullAt: workspaceLastPullAt,
1619
2157
  lastPushAt: workspaceLastPushAt,
1620
2158
  lastErrorAt: workspaceLastErrorAt,
1621
- pendingChanges: workspaceSyncPendingChanges,
2159
+ pendingChanges: workspaceSyncPendingChanges + (workspaceSyncV3OutboxStatus?.activeDepth || 0),
1622
2160
  lastErrorMessage: workspaceLastErrorMessage,
1623
2161
  recommendedAction: workspaceSyncRecommendedAction,
1624
2162
  pushBlockedReason: pushReadiness.allowed ? null : pushReadiness.reason,
@@ -1639,9 +2177,16 @@ export function useSyncOrchestrator(input) {
1639
2177
  documentReviewSessionSnapshotFingerprint: workspaceSyncDocumentReviewSessionsFingerprint,
1640
2178
  annotatedAttachmentSessionSnapshotCount: workspaceSyncAnnotatedAttachmentSessions.length,
1641
2179
  annotatedAttachmentSessionSnapshotFingerprint: workspaceSyncAnnotatedAttachmentSessionsFingerprint,
2180
+ taskforceAgentSnapshotCount: workspaceSyncTaskforceAgents.length,
2181
+ taskforceAgentSnapshotFingerprint: workspaceSyncTaskforceAgentsFingerprint,
1642
2182
  lastPushedAiProfileCount: workspaceLastPushedAiProfileIdsRef.current.size,
1643
2183
  lastPushedAiProfileWatermarkCount: workspaceLastPushedAiProfileWatermarksRef.current.size,
1644
- forceFullAiProfilePushQueued: workspaceForceFullAiProfilePushRef.current === true
2184
+ lastPushedTaskforceAgentCount: workspaceLastPushedTaskforceAgentIdsRef.current.size,
2185
+ lastPushedTaskforceAgentWatermarkCount: workspaceLastPushedTaskforceAgentWatermarksRef.current.size,
2186
+ lastPushedAgentConversationCount: workspaceLastPushedAgentConversationIdsRef.current.size,
2187
+ lastPushedAgentConversationWatermarkCount: workspaceLastPushedAgentConversationWatermarksRef.current.size,
2188
+ forceFullAiProfilePushQueued: workspaceForceFullAiProfilePushRef.current === true,
2189
+ durableOutbox: workspaceSyncV3OutboxStatus
1645
2190
  };
1646
2191
  }, [
1647
2192
  cloudAuthConfigured,
@@ -1657,6 +2202,7 @@ export function useSyncOrchestrator(input) {
1657
2202
  workspaceLastPushAt,
1658
2203
  workspaceLastErrorAt,
1659
2204
  workspaceSyncPendingChanges,
2205
+ workspaceSyncV3OutboxStatus,
1660
2206
  workspaceLastErrorMessage,
1661
2207
  workspaceSyncRecommendedAction,
1662
2208
  workspaceSyncMarkdownDocuments.length,
@@ -1670,6 +2216,8 @@ export function useSyncOrchestrator(input) {
1670
2216
  workspaceSyncDocumentReviewSessionsFingerprint,
1671
2217
  workspaceSyncAnnotatedAttachmentSessions.length,
1672
2218
  workspaceSyncAnnotatedAttachmentSessionsFingerprint,
2219
+ workspaceSyncTaskforceAgents.length,
2220
+ workspaceSyncTaskforceAgentsFingerprint,
1673
2221
  isWorkspaceRetryPending
1674
2222
  ]);
1675
2223
  useEffect(() => {
@@ -1692,6 +2240,7 @@ export function useSyncOrchestrator(input) {
1692
2240
  void refreshWorkspaceSyncAssetsSnapshot();
1693
2241
  void refreshWorkspaceSyncDocumentReviewSessionsSnapshot();
1694
2242
  void refreshWorkspaceSyncAnnotatedAttachmentSessionsSnapshot();
2243
+ void refreshWorkspaceSyncTaskforceAgentsSnapshot();
1695
2244
  const handleContextAssetsMutated = (event) => {
1696
2245
  const detail = event.detail;
1697
2246
  const eventWorkspaceId = String(detail?.workspaceId || '').trim() || 'default';
@@ -1707,8 +2256,28 @@ export function useSyncOrchestrator(input) {
1707
2256
  void refreshWorkspaceSyncAiProfilesSnapshot();
1708
2257
  void refreshWorkspaceSyncAssetsSnapshot();
1709
2258
  };
2259
+ const handleTaskforceAgentsMutated = (event) => {
2260
+ const detail = event.detail;
2261
+ const eventWorkspaceId = String(detail?.workspaceId || '').trim() || 'default';
2262
+ if (eventWorkspaceId !== currentWorkspaceId)
2263
+ return;
2264
+ if (String(detail?.reason || '').trim() === 'sync-apply')
2265
+ return;
2266
+ void refreshWorkspaceSyncTaskforceAgentsSnapshot();
2267
+ };
2268
+ const handleTaskforceAgentSkillsMutated = (event) => {
2269
+ const detail = event.detail;
2270
+ const eventWorkspaceId = String(detail?.workspaceId || '').trim() || 'default';
2271
+ if (eventWorkspaceId !== currentWorkspaceId)
2272
+ return;
2273
+ if (String(detail?.reason || '').trim() === 'sync-apply')
2274
+ return;
2275
+ void refreshWorkspaceSyncTaskforceAgentsSnapshot();
2276
+ };
1710
2277
  window.addEventListener(TASKFORCE_CONTEXT_ASSETS_MUTATED_EVENT, handleContextAssetsMutated);
1711
2278
  window.addEventListener(TASKFORCE_AI_PROFILES_MUTATED_EVENT, handleAiProfilesMutated);
2279
+ window.addEventListener(TASKFORCE_AGENTS_MUTATED_EVENT, handleTaskforceAgentsMutated);
2280
+ window.addEventListener(TASKFORCE_AGENT_SKILLS_MUTATED_EVENT, handleTaskforceAgentSkillsMutated);
1712
2281
  const docsIntervalId = window.setInterval(() => {
1713
2282
  void refreshWorkspaceSyncMarkdownDocumentsSnapshot();
1714
2283
  }, workspaceDocumentsRefreshIntervalMs);
@@ -1724,14 +2293,20 @@ export function useSyncOrchestrator(input) {
1724
2293
  const annotatedAttachmentSessionsIntervalId = window.setInterval(() => {
1725
2294
  void refreshWorkspaceSyncAnnotatedAttachmentSessionsSnapshot();
1726
2295
  }, workspaceDocumentsRefreshIntervalMs);
2296
+ const taskforceAgentsIntervalId = window.setInterval(() => {
2297
+ void refreshWorkspaceSyncTaskforceAgentsSnapshot();
2298
+ }, workspaceDocumentsRefreshIntervalMs);
1727
2299
  return () => {
1728
2300
  window.removeEventListener(TASKFORCE_CONTEXT_ASSETS_MUTATED_EVENT, handleContextAssetsMutated);
1729
2301
  window.removeEventListener(TASKFORCE_AI_PROFILES_MUTATED_EVENT, handleAiProfilesMutated);
2302
+ window.removeEventListener(TASKFORCE_AGENTS_MUTATED_EVENT, handleTaskforceAgentsMutated);
2303
+ window.removeEventListener(TASKFORCE_AGENT_SKILLS_MUTATED_EVENT, handleTaskforceAgentSkillsMutated);
1730
2304
  window.clearInterval(docsIntervalId);
1731
2305
  window.clearInterval(aiProfilesIntervalId);
1732
2306
  window.clearInterval(assetsIntervalId);
1733
2307
  window.clearInterval(documentReviewSessionsIntervalId);
1734
2308
  window.clearInterval(annotatedAttachmentSessionsIntervalId);
2309
+ window.clearInterval(taskforceAgentsIntervalId);
1735
2310
  };
1736
2311
  }, [
1737
2312
  cloudAuthConfigured,
@@ -1746,6 +2321,7 @@ export function useSyncOrchestrator(input) {
1746
2321
  refreshWorkspaceSyncAssetsSnapshot,
1747
2322
  refreshWorkspaceSyncDocumentReviewSessionsSnapshot,
1748
2323
  refreshWorkspaceSyncAnnotatedAttachmentSessionsSnapshot,
2324
+ refreshWorkspaceSyncTaskforceAgentsSnapshot,
1749
2325
  workspaceDocumentsRefreshIntervalMs
1750
2326
  ]);
1751
2327
  // When task attachments change (e.g., after the MCP save_task_attachment tool writes a
@@ -1762,6 +2338,8 @@ export function useSyncOrchestrator(input) {
1762
2338
  refreshWorkspaceSyncContextAssetSnapshots();
1763
2339
  }, [cloudAuthConfigured, runtimeMode, workspaceCloudSyncEnabled, authSessionResolved, isAuthenticated, taskAttachmentsFingerprint, refreshWorkspaceSyncContextAssetSnapshots]);
1764
2340
  useEffect(() => {
2341
+ if (!isBrowserWorkspaceSyncAuthorized())
2342
+ return;
1765
2343
  if (!shouldScheduleWorkspaceReactivePush({
1766
2344
  cloudAuthConfigured,
1767
2345
  runtimeMode,
@@ -1776,6 +2354,9 @@ export function useSyncOrchestrator(input) {
1776
2354
  return;
1777
2355
  if (!signature || signature === workspaceLastPushedSignatureRef.current)
1778
2356
  return;
2357
+ if (workspaceBlockedPushSignatureRef.current === signature)
2358
+ return;
2359
+ workspaceBlockedPushSignatureRef.current = '';
1779
2360
  const pendingPayload = buildWorkspaceSyncPayload();
1780
2361
  setWorkspaceSyncPendingChanges(pendingPayload.changes.length);
1781
2362
  if (workspacePushInFlightRef.current || workspacePullInFlightRef.current) {
@@ -1783,6 +2364,12 @@ export function useSyncOrchestrator(input) {
1783
2364
  return;
1784
2365
  }
1785
2366
  const timeoutId = window.setTimeout(() => {
2367
+ if (!isBrowserWorkspaceSyncAuthorized())
2368
+ return;
2369
+ if (workspacePushInFlightRef.current || workspacePullInFlightRef.current) {
2370
+ workspacePendingSignatureRef.current = buildWorkspaceSyncSignature();
2371
+ return;
2372
+ }
1786
2373
  void pushWorkspaceChangesToCloud(signature);
1787
2374
  }, 1500);
1788
2375
  return () => window.clearTimeout(timeoutId);
@@ -1802,11 +2389,16 @@ export function useSyncOrchestrator(input) {
1802
2389
  workspaceSyncAssetsFingerprint,
1803
2390
  workspaceSyncDocumentReviewSessionsFingerprint,
1804
2391
  workspaceSyncAnnotatedAttachmentSessionsFingerprint,
2392
+ workspaceSyncTaskforceAgentsFingerprint,
1805
2393
  pushWorkspaceChangesToCloud,
1806
2394
  workspacePushInFlightRef,
1807
- workspacePullInFlightRef
2395
+ workspacePullInFlightRef,
2396
+ browserSyncAuthority.authorityEpoch,
2397
+ isBrowserWorkspaceSyncAuthorized,
1808
2398
  ]);
1809
2399
  useEffect(() => {
2400
+ if (!isBrowserWorkspaceSyncAuthorized())
2401
+ return;
1810
2402
  if (!shouldStartWorkspacePushWatchdog({
1811
2403
  cloudAuthConfigured,
1812
2404
  runtimeMode,
@@ -1817,13 +2409,18 @@ export function useSyncOrchestrator(input) {
1817
2409
  }))
1818
2410
  return;
1819
2411
  const intervalId = window.setInterval(() => {
2412
+ if (!isBrowserWorkspaceSyncAuthorized())
2413
+ return;
1820
2414
  if (workspacePushInFlightRef.current || workspacePullInFlightRef.current)
1821
2415
  return;
1822
2416
  if (isWorkspaceRetryPending())
1823
2417
  return;
1824
- const signature = workspacePendingSignatureRef.current || buildWorkspaceSyncSignature();
2418
+ const signature = buildWorkspaceSyncSignature();
1825
2419
  if (!signature || signature === workspaceLastPushedSignatureRef.current)
1826
2420
  return;
2421
+ if (workspaceBlockedPushSignatureRef.current === signature)
2422
+ return;
2423
+ workspaceBlockedPushSignatureRef.current = '';
1827
2424
  const pendingPayload = buildWorkspaceSyncPayload();
1828
2425
  setWorkspaceSyncPendingChanges(pendingPayload.changes.length);
1829
2426
  if (pendingPayload.changes.length === 0)
@@ -1842,7 +2439,9 @@ export function useSyncOrchestrator(input) {
1842
2439
  buildWorkspaceSyncPayload,
1843
2440
  pushWorkspaceChangesToCloud,
1844
2441
  isWorkspaceRetryPending,
1845
- workspacePushWatchdogIntervalMs
2442
+ workspacePushWatchdogIntervalMs,
2443
+ browserSyncAuthority.authorityEpoch,
2444
+ isBrowserWorkspaceSyncAuthorized,
1846
2445
  ]);
1847
2446
  useEffect(() => {
1848
2447
  if (cloudAuthConfigured && runtimeMode === 'local' && workspaceCloudSyncEnabled)
@@ -1856,6 +2455,8 @@ export function useSyncOrchestrator(input) {
1856
2455
  clearWorkspaceRetry
1857
2456
  ]);
1858
2457
  useEffect(() => {
2458
+ if (!isBrowserWorkspaceSyncAuthorized())
2459
+ return;
1859
2460
  const pullPolicy = resolveWorkspaceAutomaticPullPolicy({
1860
2461
  cloudAuthConfigured,
1861
2462
  runtimeMode,
@@ -1868,10 +2469,14 @@ export function useSyncOrchestrator(input) {
1868
2469
  if (!pullPolicy.shouldStart)
1869
2470
  return;
1870
2471
  if (pullPolicy.shouldKickOffImmediately) {
1871
- void pullWorkspaceChangesFromCloud();
2472
+ void pullWorkspaceChangesFromCloudRef.current();
1872
2473
  }
1873
2474
  const intervalId = window.setInterval(() => {
1874
- void pullWorkspaceChangesFromCloud();
2475
+ if (!isBrowserWorkspaceSyncAuthorized())
2476
+ return;
2477
+ if (wasWorkspaceSyncOperationCompletedRecently(currentWorkspaceId, 'pull', workspacePullIntervalMs))
2478
+ return;
2479
+ void pullWorkspaceChangesFromCloudRef.current();
1875
2480
  }, workspacePullIntervalMs);
1876
2481
  return () => {
1877
2482
  window.clearInterval(intervalId);
@@ -1883,11 +2488,16 @@ export function useSyncOrchestrator(input) {
1883
2488
  authSessionResolved,
1884
2489
  workspaceSyncPhase,
1885
2490
  workspaceLastPullAt,
2491
+ currentWorkspaceId,
1886
2492
  isWorkspaceRetryPending,
1887
- pullWorkspaceChangesFromCloud,
1888
- workspacePullIntervalMs
2493
+ wasWorkspaceSyncOperationCompletedRecently,
2494
+ workspacePullIntervalMs,
2495
+ browserSyncAuthority.authorityEpoch,
2496
+ isBrowserWorkspaceSyncAuthorized,
1889
2497
  ]);
1890
2498
  useEffect(() => {
2499
+ if (!isBrowserWorkspaceSyncAuthorized())
2500
+ return;
1891
2501
  if (!shouldStartWorkspacePeriodicFullReconcile({
1892
2502
  cloudAuthConfigured,
1893
2503
  runtimeMode,
@@ -1898,10 +2508,12 @@ export function useSyncOrchestrator(input) {
1898
2508
  }))
1899
2509
  return;
1900
2510
  const intervalId = window.setInterval(() => {
2511
+ if (!isBrowserWorkspaceSyncAuthorized())
2512
+ return;
1901
2513
  if (workspaceFullReconcileInFlightRef.current)
1902
2514
  return;
1903
2515
  workspaceFullReconcileInFlightRef.current = true;
1904
- void pullWorkspaceChangesFromCloud({ forceCursorNull: true }).finally(() => {
2516
+ void pullWorkspaceChangesFromCloudRef.current({ forceCursorNull: true }).finally(() => {
1905
2517
  workspaceFullReconcileInFlightRef.current = false;
1906
2518
  });
1907
2519
  }, WORKSPACE_FULL_RECONCILE_INTERVAL_MS);
@@ -1913,7 +2525,8 @@ export function useSyncOrchestrator(input) {
1913
2525
  authSessionResolved,
1914
2526
  isAuthenticated,
1915
2527
  workspaceSyncPhase,
1916
- pullWorkspaceChangesFromCloud
2528
+ browserSyncAuthority.authorityEpoch,
2529
+ isBrowserWorkspaceSyncAuthorized,
1917
2530
  ]);
1918
2531
  useEffect(() => {
1919
2532
  if (runtimeMode !== 'local' || !isAuthenticated)
@@ -1958,6 +2571,8 @@ export function useSyncOrchestrator(input) {
1958
2571
  // missing or stale-tombstoned metadata — a common result of a crash between file write
1959
2572
  // and DB upsert. The repair only adds missing records; it never deletes files.
1960
2573
  useEffect(() => {
2574
+ if (!isBrowserWorkspaceSyncAuthorized())
2575
+ return;
1961
2576
  if (!shouldRunWorkspaceStartupRepair({
1962
2577
  cloudAuthConfigured,
1963
2578
  runtimeMode,
@@ -2003,9 +2618,65 @@ export function useSyncOrchestrator(input) {
2003
2618
  refreshWorkspaceSyncMarkdownDocumentsSnapshot,
2004
2619
  refreshWorkspaceSyncAiProfilesSnapshot,
2005
2620
  refreshWorkspaceSyncAssetsSnapshot,
2006
- refreshWorkspaceSyncDocumentReviewSessionsSnapshot
2621
+ refreshWorkspaceSyncDocumentReviewSessionsSnapshot,
2622
+ browserSyncAuthority.authorityEpoch,
2623
+ isBrowserWorkspaceSyncAuthorized,
2007
2624
  ]);
2008
2625
  // === SECTION: Return value ===
2626
+ const localCoordinatorDataVersion = (localCoordinatorAttachmentEnabled
2627
+ && localCoordinator.phase === 'ready'
2628
+ && localCoordinator.snapshot?.state.activeWorkspaceId === currentWorkspaceId)
2629
+ ? {
2630
+ coordinatorGeneration: localCoordinator.snapshot.state.coordinatorGeneration,
2631
+ localDataVersion: localCoordinator.snapshot.state.localDataVersion,
2632
+ }
2633
+ : null;
2634
+ const localCoordinatorStatus = localCoordinatorAttachmentEnabled
2635
+ ? {
2636
+ phase: localCoordinator.phase,
2637
+ snapshot: localCoordinator.snapshot,
2638
+ errorMessage: localCoordinator.error?.message || null,
2639
+ }
2640
+ : null;
2641
+ const switchLocalCoordinatorWorkspace = useCallback(async (targetWorkspaceId) => {
2642
+ if (runtimeMode !== 'local'
2643
+ || !localCoordinatorAttachmentEnabled)
2644
+ return false;
2645
+ if (localCoordinator.phase !== 'ready'
2646
+ || !localCoordinator.snapshot) {
2647
+ throw new LocalSyncCoordinatorBrowserClientError('The local sync coordinator is not ready to switch workspaces.', 'SYNC_COORDINATOR_UNAVAILABLE', 409);
2648
+ }
2649
+ await localCoordinator.switchWorkspace(targetWorkspaceId);
2650
+ return true;
2651
+ }, [
2652
+ localCoordinator,
2653
+ localCoordinatorAttachmentEnabled,
2654
+ runtimeMode,
2655
+ ]);
2656
+ const transferLocalCoordinatorOwnership = useCallback(async (targetMode) => {
2657
+ if (runtimeMode !== 'local'
2658
+ || !localCoordinatorAttachmentEnabled)
2659
+ return false;
2660
+ if (localCoordinator.phase !== 'ready'
2661
+ || !localCoordinator.snapshot) {
2662
+ throw new LocalSyncCoordinatorBrowserClientError('The local sync coordinator is not ready to transfer ownership.', 'SYNC_COORDINATOR_UNAVAILABLE', 409);
2663
+ }
2664
+ await localCoordinator.transferOwnership(targetMode);
2665
+ if (targetMode === 'server') {
2666
+ await localCoordinator.issueCommand(workspaceCloudSyncEnabled ? 'EnableSync' : 'DisableSync');
2667
+ if (workspaceCloudSyncEnabled) {
2668
+ void localCoordinator.issueCommand('Sync').catch(() => {
2669
+ // Coordinator status owns durable error and retry presentation.
2670
+ });
2671
+ }
2672
+ }
2673
+ return true;
2674
+ }, [
2675
+ localCoordinator,
2676
+ localCoordinatorAttachmentEnabled,
2677
+ runtimeMode,
2678
+ workspaceCloudSyncEnabled,
2679
+ ]);
2009
2680
  return {
2010
2681
  userGlobalSyncStatus,
2011
2682
  setUserGlobalSyncStatus,
@@ -2023,7 +2694,12 @@ export function useSyncOrchestrator(input) {
2023
2694
  workspaceSyncSummary,
2024
2695
  workspaceSyncRecommendedAction,
2025
2696
  workspaceSyncBusy,
2026
- workspaceSyncPendingChanges,
2697
+ workspaceSyncPendingChanges: workspaceSyncPendingChanges + (workspaceSyncV3OutboxStatus?.activeDepth || 0),
2698
+ workspaceTaskRelationships,
2699
+ localCoordinatorDataVersion,
2700
+ localCoordinatorStatus,
2701
+ switchLocalCoordinatorWorkspace,
2702
+ transferLocalCoordinatorOwnership,
2027
2703
  syncInFlightRef,
2028
2704
  workspaceRetryAt,
2029
2705
  isWorkspaceRetryPending,