@taskforcehq/taskforce 0.3.324 → 0.3.327

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