@taskforcehq/taskforce 0.3.326 → 0.3.328

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1382) hide show
  1. package/LICENSE.md +68 -0
  2. package/README.md +19 -0
  3. package/dist/Taskforce.module.css +2168 -585
  4. package/dist/TaskforceCore.d.ts +1 -0
  5. package/dist/TaskforceCore.js +65 -22
  6. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.d.ts +1 -0
  7. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.js +3 -2
  8. package/dist/annotatedAttachments/commandService.d.ts +68 -0
  9. package/dist/annotatedAttachments/commandService.js +348 -0
  10. package/dist/annotatedAttachments/service.d.ts +2 -0
  11. package/dist/annotatedAttachments/service.js +13 -12
  12. package/dist/cli.js +158 -9
  13. package/dist/cliOpenPort.d.ts +1 -0
  14. package/dist/cliOpenPort.js +4 -0
  15. package/dist/compat/taskforceAgentDefinitionCompat.d.ts +12 -0
  16. package/dist/compat/taskforceAgentDefinitionCompat.js +25 -0
  17. package/dist/compat/workspaceSyncCompat.js +6 -2
  18. package/dist/compat/workspaceSyncV3CombinedCoverageCompat.d.ts +6 -0
  19. package/dist/compat/workspaceSyncV3CombinedCoverageCompat.js +22 -0
  20. package/dist/compat/workspaceSyncV3OperationCompat.d.ts +7 -0
  21. package/dist/compat/workspaceSyncV3OperationCompat.js +30 -0
  22. package/dist/components/activity/EntityActivityTimeline.d.ts +10 -2
  23. package/dist/components/activity/EntityActivityTimeline.js +83 -35
  24. package/dist/components/context/AttachmentPreviewHost.d.ts +6 -0
  25. package/dist/components/context/AttachmentPreviewHost.js +222 -0
  26. package/dist/components/context/ContextAttachmentManager.d.ts +7 -0
  27. package/dist/components/context/ContextAttachmentManager.js +514 -208
  28. package/dist/components/features/AiProfilesModule.d.ts +24 -0
  29. package/dist/components/features/AiProfilesModule.js +744 -0
  30. package/dist/components/features/AnnotatedAttachmentWorkspace.d.ts +4 -1
  31. package/dist/components/features/AnnotatedAttachmentWorkspace.js +351 -79
  32. package/dist/components/features/DocumentGenerateModal.js +23 -5
  33. package/dist/components/features/DocumentIndex.d.ts +19 -1
  34. package/dist/components/features/DocumentIndex.js +104 -15
  35. package/dist/components/features/DocumentViewer.d.ts +9 -1
  36. package/dist/components/features/DocumentViewer.js +721 -100
  37. package/dist/components/features/DocumentWorkspace.d.ts +37 -2
  38. package/dist/components/features/DocumentWorkspace.js +21 -6
  39. package/dist/components/features/TaskSettings.d.ts +6 -27
  40. package/dist/components/features/TaskSettings.js +232 -143
  41. package/dist/components/features/TaskforceAgentsModule.d.ts +36 -0
  42. package/dist/components/features/TaskforceAgentsModule.js +1782 -0
  43. package/dist/components/features/agentBehavior/AgentBehaviorManagerShared.d.ts +94 -0
  44. package/dist/components/features/agentBehavior/AgentBehaviorManagerShared.js +70 -0
  45. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +65 -0
  46. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.js +115 -0
  47. package/dist/components/features/agentRoles/RoleManagerPanel.d.ts +4 -0
  48. package/dist/components/features/agentRoles/RoleManagerPanel.js +382 -0
  49. package/dist/components/features/agentSkills/SkillManagerPanel.d.ts +5 -0
  50. package/dist/components/features/agentSkills/SkillManagerPanel.js +355 -0
  51. package/dist/components/features/documentWorkspaceModel.d.ts +16 -4
  52. package/dist/components/features/documentWorkspaceModel.js +30 -5
  53. package/dist/components/features/planning/PlanningArchiveConfirmation.d.ts +9 -0
  54. package/dist/components/features/planning/PlanningArchiveConfirmation.js +19 -0
  55. package/dist/components/features/planning/PlanningCardIdentity.d.ts +12 -0
  56. package/dist/components/features/planning/PlanningCardIdentity.js +44 -0
  57. package/dist/components/features/planning/PlanningEntityDetails.d.ts +36 -0
  58. package/dist/components/features/planning/PlanningEntityDetails.js +131 -0
  59. package/dist/components/features/planning/PlanningEntitySummary.d.ts +46 -0
  60. package/dist/components/features/planning/PlanningEntitySummary.js +98 -0
  61. package/dist/components/features/planning/PlanningLinkPicker.d.ts +11 -0
  62. package/dist/components/features/planning/PlanningLinkPicker.js +28 -0
  63. package/dist/components/features/planning/PlanningModule.d.ts +6 -0
  64. package/dist/components/features/planning/PlanningModule.js +588 -0
  65. package/dist/components/features/planning/PlanningOwnerDropdown.d.ts +27 -0
  66. package/dist/components/features/planning/PlanningOwnerDropdown.js +80 -0
  67. package/dist/components/features/planning/PlanningTaskArrangeControl.d.ts +5 -0
  68. package/dist/components/features/planning/PlanningTaskArrangeControl.js +11 -0
  69. package/dist/components/features/planning/PlanningTaskCard.d.ts +20 -0
  70. package/dist/components/features/planning/PlanningTaskCard.js +26 -0
  71. package/dist/components/features/planning/PlanningTaskOrderList.d.ts +10 -0
  72. package/dist/components/features/planning/PlanningTaskOrderList.js +52 -0
  73. package/dist/components/features/planning/PlanningUnlinkConfirmation.d.ts +15 -0
  74. package/dist/components/features/planning/PlanningUnlinkConfirmation.js +7 -0
  75. package/dist/components/features/planning/PlanningVisualIdentity.d.ts +14 -0
  76. package/dist/components/features/planning/PlanningVisualIdentity.js +106 -0
  77. package/dist/components/features/planning/planningCreateIntent.d.ts +10 -0
  78. package/dist/components/features/planning/planningCreateIntent.js +16 -0
  79. package/dist/components/features/planning/planningNavigator.d.ts +33 -0
  80. package/dist/components/features/planning/planningNavigator.js +96 -0
  81. package/dist/components/features/planning/planningTaskArrangement.d.ts +18 -0
  82. package/dist/components/features/planning/planningTaskArrangement.js +106 -0
  83. package/dist/components/features/planning/planningWorkspaceModel.d.ts +132 -0
  84. package/dist/components/features/planning/planningWorkspaceModel.js +5 -0
  85. package/dist/components/features/settings/CategoryManager.js +2 -2
  86. package/dist/components/features/settings/TaxonomyEditor.js +1 -1
  87. package/dist/components/features/settings/TaxonomyManager.js +1 -1
  88. package/dist/components/features/settings/TypeManager.js +1 -1
  89. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.d.ts +10 -0
  90. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +175 -0
  91. package/dist/components/features/taskforceAgentAssignments/agentBehaviorCatalogApi.d.ts +27 -0
  92. package/dist/components/features/taskforceAgentAssignments/agentBehaviorCatalogApi.js +24 -0
  93. package/dist/components/features/taskforceAgentEditorModel.d.ts +109 -0
  94. package/dist/components/features/taskforceAgentEditorModel.js +145 -0
  95. package/dist/components/features/useDocumentWorkspaceController.d.ts +20 -1
  96. package/dist/components/features/useDocumentWorkspaceController.js +106 -21
  97. package/dist/components/features/workflowManager/WorkflowManagerModule.d.ts +11 -0
  98. package/dist/components/features/workflowManager/WorkflowManagerModule.js +313 -0
  99. package/dist/components/features/workflowManager/WorkflowPublishDialog.d.ts +11 -0
  100. package/dist/components/features/workflowManager/WorkflowPublishDialog.js +8 -0
  101. package/dist/components/features/workflowManager/types.d.ts +74 -0
  102. package/dist/components/features/workflowManager/types.js +1 -0
  103. package/dist/components/features/workflowManager/useWorkflowManager.d.ts +30 -0
  104. package/dist/components/features/workflowManager/useWorkflowManager.js +213 -0
  105. package/dist/components/features/workflowManager/workflowManagerApi.d.ts +52 -0
  106. package/dist/components/features/workflowManager/workflowManagerApi.js +142 -0
  107. package/dist/components/task/TaskActionHeader.d.ts +7 -3
  108. package/dist/components/task/TaskActionHeader.js +46 -53
  109. package/dist/components/task/TaskCard.d.ts +10 -2
  110. package/dist/components/task/TaskCard.js +138 -56
  111. package/dist/components/task/TaskContextUpload.d.ts +4 -0
  112. package/dist/components/task/TaskContextUpload.js +3 -2
  113. package/dist/components/task/TaskForm.d.ts +16 -17
  114. package/dist/components/task/TaskForm.js +569 -199
  115. package/dist/components/task/TaskImageReviews.d.ts +8 -0
  116. package/dist/components/task/TaskImageReviews.js +47 -0
  117. package/dist/components/task/TaskKanban.d.ts +9 -10
  118. package/dist/components/task/TaskKanban.js +70 -18
  119. package/dist/components/task/TaskList.d.ts +9 -8
  120. package/dist/components/task/TaskList.js +46 -32
  121. package/dist/components/task/TaskReferenceBadge.d.ts +2 -1
  122. package/dist/components/task/TaskReferenceBadge.js +3 -2
  123. package/dist/components/task/TaskStatusActions.d.ts +3 -1
  124. package/dist/components/task/TaskStatusActions.js +27 -7
  125. package/dist/components/task/TaskWorkflowAssignmentField.d.ts +18 -0
  126. package/dist/components/task/TaskWorkflowAssignmentField.js +362 -0
  127. package/dist/components/task/TaskWorkstreamPicker.d.ts +8 -0
  128. package/dist/components/task/TaskWorkstreamPicker.js +25 -0
  129. package/dist/components/task/TrashRestoreControls.d.ts +18 -0
  130. package/dist/components/task/TrashRestoreControls.js +71 -0
  131. package/dist/components/ui/AiIdentityRosterCard.d.ts +20 -0
  132. package/dist/components/ui/AiIdentityRosterCard.js +5 -0
  133. package/dist/components/ui/AssetTraySortControl.d.ts +10 -0
  134. package/dist/components/ui/AssetTraySortControl.js +38 -0
  135. package/dist/components/ui/AssigneeIdentity.d.ts +12 -0
  136. package/dist/components/ui/AssigneeIdentity.js +41 -0
  137. package/dist/components/ui/DiscardChangesDialog.d.ts +10 -0
  138. package/dist/components/ui/DiscardChangesDialog.js +7 -0
  139. package/dist/components/ui/DisclosureSectionHeader.d.ts +4 -1
  140. package/dist/components/ui/DisclosureSectionHeader.js +2 -2
  141. package/dist/components/ui/DocumentTypeIcon.d.ts +7 -0
  142. package/dist/components/ui/DocumentTypeIcon.js +8 -0
  143. package/dist/components/ui/EditableAvatarButton.d.ts +6 -1
  144. package/dist/components/ui/EditableAvatarButton.js +6 -5
  145. package/dist/components/ui/HierarchyActionBadge.d.ts +2 -1
  146. package/dist/components/ui/HierarchyActionBadge.js +2 -2
  147. package/dist/components/ui/Markdown.d.ts +13 -3
  148. package/dist/components/ui/Markdown.fixture.d.ts +1 -0
  149. package/dist/components/ui/Markdown.fixture.js +23 -0
  150. package/dist/components/ui/Markdown.js +158 -68
  151. package/dist/components/ui/Modal.d.ts +3 -1
  152. package/dist/components/ui/Modal.js +85 -19
  153. package/dist/components/ui/MultiSelectFilter.d.ts +9 -2
  154. package/dist/components/ui/MultiSelectFilter.js +26 -5
  155. package/dist/components/ui/ReferenceBadgeButton.js +2 -3
  156. package/dist/components/ui/TaxonomyDropdown.d.ts +18 -1
  157. package/dist/components/ui/TaxonomyDropdown.js +177 -59
  158. package/dist/components/ui/TopNoticeLayer.d.ts +2 -1
  159. package/dist/components/ui/TopNoticeLayer.js +5 -2
  160. package/dist/components/ui/useFallbackImageUrl.d.ts +4 -0
  161. package/dist/components/ui/useFallbackImageUrl.js +20 -0
  162. package/dist/components/views/AppShellHeader.js +2 -2
  163. package/dist/components/views/StandaloneLayout.d.ts +1 -0
  164. package/dist/components/views/StandaloneLayout.js +1717 -600
  165. package/dist/components/views/WidgetView.d.ts +1 -0
  166. package/dist/components/views/WidgetView.js +99 -31
  167. package/dist/components/views/chrome/WorkspaceChromeSections.d.ts +4 -2
  168. package/dist/components/views/chrome/WorkspaceChromeSections.js +3 -6
  169. package/dist/components/views/chrome/workspaceChrome.d.ts +5 -8
  170. package/dist/components/views/chrome/workspaceChrome.js +62 -27
  171. package/dist/components/views/panels/FilterToolbar.d.ts +4 -3
  172. package/dist/components/views/panels/FilterToolbar.js +8 -5
  173. package/dist/components/views/panels/FilterToolbarControls.d.ts +11 -2
  174. package/dist/components/views/panels/FilterToolbarControls.js +35 -20
  175. package/dist/components/views/panels/PlanningDrawer.d.ts +66 -49
  176. package/dist/components/views/panels/PlanningDrawer.js +983 -314
  177. package/dist/components/views/planningScope.js +7 -1
  178. package/dist/components/views/standalone/modals/AccountSettingsModal.d.ts +62 -0
  179. package/dist/components/views/standalone/modals/AccountSettingsModal.js +197 -0
  180. package/dist/components/views/standalone/modals/AvatarImageManagerModal.d.ts +7 -2
  181. package/dist/components/views/standalone/modals/AvatarImageManagerModal.js +56 -9
  182. package/dist/components/views/standalone/modals/HelpModal.d.ts +1 -2
  183. package/dist/components/views/standalone/modals/HelpModal.js +3 -4
  184. package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +8 -9
  185. package/dist/components/views/standalone/modals/SyncStatusModal.js +85 -25
  186. package/dist/components/views/standalone/modals/TeamManagementModal.js +1 -1
  187. package/dist/config/applicationBaseUrl.d.ts +2 -0
  188. package/dist/config/applicationBaseUrl.js +23 -0
  189. package/dist/config/envSchema.d.ts +1 -1
  190. package/dist/config/envSchema.js +167 -5
  191. package/dist/config/localServiceCloudTarget.d.ts +10 -0
  192. package/dist/config/localServiceCloudTarget.js +76 -0
  193. package/dist/core/AdminAuditRetentionService.d.ts +43 -0
  194. package/dist/core/AdminAuditRetentionService.js +126 -0
  195. package/dist/core/AiProfileService.d.ts +35 -0
  196. package/dist/core/AiProfileService.js +511 -251
  197. package/dist/core/AttachmentLinkService.d.ts +10 -2
  198. package/dist/core/AttachmentLinkService.js +50 -15
  199. package/dist/core/AuthIdentityService.d.ts +6 -0
  200. package/dist/core/AuthIdentityService.js +38 -0
  201. package/dist/core/AuthTokenService.d.ts +1 -0
  202. package/dist/core/AuthTokenService.js +13 -0
  203. package/dist/core/DeletedTaskLifecycleService.d.ts +8 -2
  204. package/dist/core/DeletedTaskLifecycleService.js +145 -38
  205. package/dist/core/GlobalSettingsService.d.ts +3 -1
  206. package/dist/core/GlobalSettingsService.js +30 -4
  207. package/dist/core/InitiativeDurableMutationService.d.ts +89 -0
  208. package/dist/core/InitiativeDurableMutationService.js +187 -0
  209. package/dist/core/McpTokenService.d.ts +5 -0
  210. package/dist/core/McpTokenService.js +91 -13
  211. package/dist/core/PlanningCommandPreparationService.d.ts +60 -0
  212. package/dist/core/PlanningCommandPreparationService.js +149 -0
  213. package/dist/core/ScheduleCommandService.d.ts +76 -0
  214. package/dist/core/ScheduleCommandService.js +165 -0
  215. package/dist/core/SyncReconciliationService.d.ts +29 -6
  216. package/dist/core/SyncReconciliationService.js +256 -84
  217. package/dist/core/TaskActivityService.d.ts +22 -2
  218. package/dist/core/TaskActivityService.js +177 -29
  219. package/dist/core/TaskAttachmentLinksDurableMutationService.d.ts +36 -0
  220. package/dist/core/TaskAttachmentLinksDurableMutationService.js +240 -0
  221. package/dist/core/TaskChecklistCommandService.d.ts +50 -0
  222. package/dist/core/TaskChecklistCommandService.js +111 -0
  223. package/dist/core/TaskDurableCreateMutationService.d.ts +38 -0
  224. package/dist/core/TaskDurableCreateMutationService.js +85 -0
  225. package/dist/core/TaskDurableDeleteMutationService.d.ts +47 -0
  226. package/dist/core/TaskDurableDeleteMutationService.js +54 -0
  227. package/dist/core/TaskDurableLifecycleMutationService.d.ts +38 -0
  228. package/dist/core/TaskDurableLifecycleMutationService.js +42 -0
  229. package/dist/core/TaskDurableRelationshipMutationService.d.ts +58 -0
  230. package/dist/core/TaskDurableRelationshipMutationService.js +66 -0
  231. package/dist/core/TaskDurableRestoreMutationService.d.ts +31 -0
  232. package/dist/core/TaskDurableRestoreMutationService.js +33 -0
  233. package/dist/core/TaskDurableStatusMutationService.d.ts +74 -0
  234. package/dist/core/TaskDurableStatusMutationService.js +247 -0
  235. package/dist/core/TaskDurableSyncMutationService.d.ts +34 -0
  236. package/dist/core/TaskDurableSyncMutationService.js +70 -0
  237. package/dist/core/TaskDurableWorkflowMutationService.d.ts +48 -0
  238. package/dist/core/TaskDurableWorkflowMutationService.js +59 -0
  239. package/dist/core/TaskLifecycleCommandService.d.ts +101 -0
  240. package/dist/core/TaskLifecycleCommandService.js +161 -0
  241. package/dist/core/TaskRootCommandPreparationService.d.ts +35 -0
  242. package/dist/core/TaskRootCommandPreparationService.js +103 -0
  243. package/dist/core/Taskforce.d.ts +542 -60
  244. package/dist/core/Taskforce.js +4220 -905
  245. package/dist/core/WorkflowAssignmentService.d.ts +40 -0
  246. package/dist/core/WorkflowAssignmentService.js +158 -0
  247. package/dist/core/WorkflowExecutionService.d.ts +69 -0
  248. package/dist/core/WorkflowExecutionService.js +342 -0
  249. package/dist/core/WorkflowTaskActivationService.d.ts +32 -0
  250. package/dist/core/WorkflowTaskActivationService.js +63 -0
  251. package/dist/core/WorkflowTemplateService.d.ts +64 -0
  252. package/dist/core/WorkflowTemplateService.js +223 -0
  253. package/dist/core/WorkspaceLifecycleService.d.ts +1 -0
  254. package/dist/core/WorkspaceLifecycleService.js +18 -0
  255. package/dist/core/WorkstreamDurableMutationService.d.ts +90 -0
  256. package/dist/core/WorkstreamDurableMutationService.js +184 -0
  257. package/dist/core/planningReferencePolicy.d.ts +14 -0
  258. package/dist/core/planningReferencePolicy.js +53 -0
  259. package/dist/core/taskReferencePolicy.js +24 -3
  260. package/dist/core/types.d.ts +12 -11
  261. package/dist/documentReviews/DocumentReviewCommentStore.d.ts +33 -2
  262. package/dist/documentReviews/DocumentReviewCommentStore.js +125 -8
  263. package/dist/documentReviews/commandService.d.ts +51 -0
  264. package/dist/documentReviews/commandService.js +63 -0
  265. package/dist/documentReviews/service.d.ts +24 -1
  266. package/dist/documentReviews/service.js +354 -49
  267. package/dist/documentReviews/types.d.ts +18 -1
  268. package/dist/hooks/sync/bootstrap.d.ts +3 -7
  269. package/dist/hooks/sync/bootstrap.js +6 -14
  270. package/dist/hooks/sync/browserSyncAuthority.d.ts +21 -0
  271. package/dist/hooks/sync/browserSyncAuthority.js +70 -0
  272. package/dist/hooks/sync/browserSyncRemoteServices.d.ts +29 -0
  273. package/dist/hooks/sync/browserSyncRemoteServices.js +58 -0
  274. package/dist/hooks/sync/controlPlane.d.ts +1 -37
  275. package/dist/hooks/sync/controlPlane.js +1 -78
  276. package/dist/hooks/sync/lifecyclePolicy.d.ts +1 -45
  277. package/dist/hooks/sync/lifecyclePolicy.js +1 -93
  278. package/dist/hooks/sync/orchestratorShared.d.ts +9 -3
  279. package/dist/hooks/sync/orchestratorShared.js +70 -96
  280. package/dist/hooks/sync/pullLifecycle.d.ts +1 -31
  281. package/dist/hooks/sync/pullLifecycle.js +1 -24
  282. package/dist/hooks/sync/realtime.d.ts +4 -1
  283. package/dist/hooks/sync/realtime.js +103 -3
  284. package/dist/hooks/sync/recovery.d.ts +1 -84
  285. package/dist/hooks/sync/recovery.js +1 -245
  286. package/dist/hooks/sync/transfers.d.ts +8 -129
  287. package/dist/hooks/sync/transfers.js +19 -581
  288. package/dist/hooks/sync/useDataVersionRefresh.d.ts +6 -1
  289. package/dist/hooks/sync/useDataVersionRefresh.js +127 -12
  290. package/dist/hooks/sync/useDurableLocalOutboxDrain.d.ts +14 -0
  291. package/dist/hooks/sync/useDurableLocalOutboxDrain.js +208 -0
  292. package/dist/hooks/sync/useDurableTaskCreateMutation.d.ts +15 -0
  293. package/dist/hooks/sync/useDurableTaskCreateMutation.js +152 -0
  294. package/dist/hooks/sync/useDurableTaskDeleteMutation.d.ts +11 -0
  295. package/dist/hooks/sync/useDurableTaskDeleteMutation.js +21 -0
  296. package/dist/hooks/sync/useDurableTaskLifecycleMutation.d.ts +12 -0
  297. package/dist/hooks/sync/useDurableTaskLifecycleMutation.js +22 -0
  298. package/dist/hooks/sync/useDurableTaskMetadataMutation.d.ts +14 -0
  299. package/dist/hooks/sync/useDurableTaskMetadataMutation.js +24 -0
  300. package/dist/hooks/sync/useDurableTaskRestoreMutation.d.ts +12 -0
  301. package/dist/hooks/sync/useDurableTaskRestoreMutation.js +24 -0
  302. package/dist/hooks/sync/useDurableTaskStatusMutation.d.ts +18 -0
  303. package/dist/hooks/sync/useDurableTaskStatusMutation.js +23 -0
  304. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +23 -0
  305. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +414 -0
  306. package/dist/hooks/sync/useSyncStatusActions.d.ts +2 -1
  307. package/dist/hooks/sync/useSyncStatusActions.js +8 -3
  308. package/dist/hooks/tasks/taskHttpMutation.d.ts +25 -0
  309. package/dist/hooks/tasks/taskHttpMutation.js +134 -0
  310. package/dist/hooks/tasks/useCurrentTaskRelations.d.ts +6 -1
  311. package/dist/hooks/tasks/useCurrentTaskRelations.js +32 -6
  312. package/dist/hooks/tasks/useTaskEditorNavigation.d.ts +4 -3
  313. package/dist/hooks/tasks/useTaskEditorNavigation.js +9 -13
  314. package/dist/hooks/tasks/useTaskFormActions.d.ts +20 -2
  315. package/dist/hooks/tasks/useTaskFormActions.js +339 -59
  316. package/dist/hooks/tasks/useTaskReferenceContract.d.ts +5 -0
  317. package/dist/hooks/tasks/useTaskReferenceContract.js +17 -0
  318. package/dist/hooks/tasks/useTaskRelationships.d.ts +1 -3
  319. package/dist/hooks/tasks/useTaskRelationships.js +5 -25
  320. package/dist/hooks/tasks/useTrashSelection.d.ts +12 -0
  321. package/dist/hooks/tasks/useTrashSelection.js +49 -0
  322. package/dist/hooks/ui/useInitiativeTemplates.d.ts +24 -0
  323. package/dist/hooks/ui/useInitiativeTemplates.js +22 -0
  324. package/dist/hooks/ui/useSettingsModel.d.ts +5 -29
  325. package/dist/hooks/ui/useSettingsModel.js +31 -15
  326. package/dist/hooks/ui/useSettingsPersistence.d.ts +0 -1
  327. package/dist/hooks/ui/useSettingsPersistence.js +4 -8
  328. package/dist/hooks/ui/useSettingsTaxonomyManagement.js +31 -0
  329. package/dist/hooks/useFilterSort.d.ts +2 -2
  330. package/dist/hooks/useFilterSort.js +19 -15
  331. package/dist/hooks/useRealtimeSync.d.ts +10 -0
  332. package/dist/hooks/useRealtimeSync.js +57 -4
  333. package/dist/hooks/useSyncOrchestrator.d.ts +32 -1
  334. package/dist/hooks/useSyncOrchestrator.js +963 -287
  335. package/dist/hooks/useTaskData.d.ts +11 -2
  336. package/dist/hooks/useTaskData.js +59 -26
  337. package/dist/hooks/useTaskMutations.d.ts +42 -5
  338. package/dist/hooks/useTaskMutations.js +750 -125
  339. package/dist/hooks/useTaskforce.d.ts +79 -74
  340. package/dist/hooks/useTaskforce.js +1205 -450
  341. package/dist/hooks/useUiNotice.d.ts +5 -1
  342. package/dist/hooks/useUiNotice.js +13 -2
  343. package/dist/hooks/useWorkspaceSyncController.d.ts +9 -0
  344. package/dist/hooks/useWorkspaceSyncController.js +159 -17
  345. package/dist/hooks/workspace/usePersistedAppUiState.d.ts +74 -0
  346. package/dist/hooks/workspace/usePersistedAppUiState.js +325 -0
  347. package/dist/hooks/workspace/usePersistedLayoutUiState.d.ts +76 -0
  348. package/dist/hooks/workspace/usePersistedLayoutUiState.js +479 -0
  349. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.d.ts +2 -7
  350. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +42 -31
  351. package/dist/hooks/workspace/workspaceLocalState.d.ts +17 -6
  352. package/dist/hooks/workspace/workspaceLocalState.js +175 -5
  353. package/dist/hooks/workstreams/workstreamHttpMutation.d.ts +23 -0
  354. package/dist/hooks/workstreams/workstreamHttpMutation.js +134 -0
  355. package/dist/localization/locales/en-US.d.ts +3 -3
  356. package/dist/localization/locales/en-US.js +3 -3
  357. package/dist/localization/locales/es-419.js +3 -3
  358. package/dist/localization/locales/pt-BR.js +3 -3
  359. package/dist/mcp/adminWorkspaceRegistrar.js +2 -30
  360. package/dist/mcp/aiProfileBootstrap.d.ts +3 -0
  361. package/dist/mcp/aiProfileBootstrap.js +4 -0
  362. package/dist/mcp/canonicalAssetHelpers.d.ts +29 -4
  363. package/dist/mcp/canonicalAssetHelpers.js +138 -35
  364. package/dist/mcp/clientIntegrations.d.ts +4 -2
  365. package/dist/mcp/clientIntegrations.js +58 -57
  366. package/dist/mcp/clientRegistry.d.ts +30 -0
  367. package/dist/mcp/clientRegistry.js +134 -0
  368. package/dist/mcp/collaborationRegistrar.js +31 -15
  369. package/dist/mcp/documentAssetRegistrar.js +231 -56
  370. package/dist/mcp/documentContentCommand.d.ts +94 -0
  371. package/dist/mcp/documentContentCommand.js +226 -0
  372. package/dist/mcp/documentHelpers.d.ts +13 -65
  373. package/dist/mcp/documentHelpers.js +49 -62
  374. package/dist/mcp/durableTaskMutationRouter.d.ts +65 -0
  375. package/dist/mcp/durableTaskMutationRouter.js +217 -0
  376. package/dist/mcp/durableTaskRelationshipMutationRouter.d.ts +38 -0
  377. package/dist/mcp/durableTaskRelationshipMutationRouter.js +168 -0
  378. package/dist/mcp/durableTaskRootMutationRouter.d.ts +64 -0
  379. package/dist/mcp/durableTaskRootMutationRouter.js +226 -0
  380. package/dist/mcp/gitWorktreeRoots.d.ts +2 -0
  381. package/dist/mcp/gitWorktreeRoots.js +19 -0
  382. package/dist/mcp/legacyServer.d.ts +1 -0
  383. package/dist/mcp/legacyServer.js +42 -0
  384. package/dist/mcp/localCliHealth.d.ts +56 -0
  385. package/dist/mcp/localCliHealth.js +170 -0
  386. package/dist/mcp/localServiceProxy.d.ts +23 -0
  387. package/dist/mcp/localServiceProxy.js +258 -0
  388. package/dist/mcp/mcpInputValidator.d.ts +17 -0
  389. package/dist/mcp/mcpInputValidator.js +58 -0
  390. package/dist/mcp/planningAttachmentCommandAdapter.d.ts +127 -0
  391. package/dist/mcp/planningAttachmentCommandAdapter.js +188 -0
  392. package/dist/mcp/programScaffoldCommandAdapter.d.ts +6 -0
  393. package/dist/mcp/programScaffoldCommandAdapter.js +39 -0
  394. package/dist/mcp/proxyServer.d.ts +1 -0
  395. package/dist/mcp/proxyServer.js +2 -0
  396. package/dist/mcp/runtime.d.ts +98 -1
  397. package/dist/mcp/runtime.js +4682 -1927
  398. package/dist/mcp/server.js +29 -2
  399. package/dist/mcp/sharedLocalServiceGateD.d.ts +115 -0
  400. package/dist/mcp/sharedLocalServiceGateD.js +344 -0
  401. package/dist/mcp/stdioLifecycle.d.ts +22 -0
  402. package/dist/mcp/stdioLifecycle.js +54 -0
  403. package/dist/mcp/taskAttachmentCommandAdapter.d.ts +192 -0
  404. package/dist/mcp/taskAttachmentCommandAdapter.js +470 -0
  405. package/dist/mcp/taskAttachmentHelpers.d.ts +8 -6
  406. package/dist/mcp/taskAttachmentHelpers.js +74 -2
  407. package/dist/mcp/taskAttachmentTypes.d.ts +26 -5
  408. package/dist/mcp/taskPlanCommand.d.ts +64 -0
  409. package/dist/mcp/taskPlanCommand.js +98 -0
  410. package/dist/mcp/taskPlanningRegistrar.js +240 -44
  411. package/dist/mcp/toolCallCompatibility.d.ts +6 -0
  412. package/dist/mcp/toolCallCompatibility.js +16 -0
  413. package/dist/mcp/toolCatalog.d.ts +3 -1
  414. package/dist/mcp/toolProfiles.d.ts +12 -1
  415. package/dist/mcp/toolProfiles.js +43 -0
  416. package/dist/mcp/toolRegistry.d.ts +17 -2
  417. package/dist/mcp/toolRegistry.js +26 -11
  418. package/dist/mcp/workflowExecutionRegistrar.d.ts +2 -0
  419. package/dist/mcp/workflowExecutionRegistrar.js +51 -0
  420. package/dist/migrations/taskSchemaMigrations.d.ts +35 -0
  421. package/dist/migrations/taskSchemaMigrations.js +1892 -64
  422. package/dist/migrations/taskUpdatedAtSyncDriftMigration.d.ts +20 -0
  423. package/dist/migrations/taskUpdatedAtSyncDriftMigration.js +153 -0
  424. package/dist/migrations/taskforceAgentDefinitionMigration.d.ts +26 -0
  425. package/dist/migrations/taskforceAgentDefinitionMigration.js +116 -0
  426. package/dist/plugins/vite.js +48 -17
  427. package/dist/public/Taskforce_Van.webp +0 -0
  428. package/dist/runtime/appGateDefinitions.d.ts +16 -10
  429. package/dist/runtime/appGateDefinitions.js +16 -10
  430. package/dist/runtime/appGates.d.ts +5 -4
  431. package/dist/runtime/appGates.js +4 -3
  432. package/dist/server/aiProfileAvatarAssets.d.ts +11 -8
  433. package/dist/server/aiProfileAvatarAssets.js +159 -70
  434. package/dist/server/appAccess.d.ts +12 -0
  435. package/dist/server/appAccess.js +21 -0
  436. package/dist/server/auth.js +15 -1
  437. package/dist/server/authorizedWorkspaceAccess.d.ts +12 -0
  438. package/dist/server/authorizedWorkspaceAccess.js +40 -0
  439. package/dist/server/cloudCollectionRead.d.ts +25 -0
  440. package/dist/server/cloudCollectionRead.js +120 -0
  441. package/dist/server/cloudCollectionReadPool.d.ts +52 -0
  442. package/dist/server/cloudCollectionReadPool.js +140 -0
  443. package/dist/server/cloudCollectionReadWorker.d.ts +1 -0
  444. package/dist/server/cloudCollectionReadWorker.js +36 -0
  445. package/dist/server/cors.d.ts +2 -1
  446. package/dist/server/cors.js +45 -8
  447. package/dist/server/email.d.ts +3 -1
  448. package/dist/server/email.js +46 -8
  449. package/dist/server/index.d.ts +27 -12
  450. package/dist/server/index.js +395 -86
  451. package/dist/server/localDataOwnerPermit.d.ts +18 -0
  452. package/dist/server/localDataOwnerPermit.js +58 -0
  453. package/dist/server/localDatabaseIdentity.d.ts +14 -0
  454. package/dist/server/localDatabaseIdentity.js +69 -0
  455. package/dist/server/localRealtimeFileInvalidation.d.ts +1 -0
  456. package/dist/server/localRealtimeFileInvalidation.js +7 -0
  457. package/dist/server/localServiceLease.d.ts +65 -0
  458. package/dist/server/localServiceLease.js +485 -0
  459. package/dist/server/localServiceOwnershipBootstrap.d.ts +19 -0
  460. package/dist/server/localServiceOwnershipBootstrap.js +84 -0
  461. package/dist/server/localServiceSessions.d.ts +87 -0
  462. package/dist/server/localServiceSessions.js +309 -0
  463. package/dist/server/localServiceWindowsAcl.d.ts +8 -0
  464. package/dist/server/localServiceWindowsAcl.js +60 -0
  465. package/dist/server/localSyncProcessLockBootstrap.d.ts +3 -0
  466. package/dist/server/localSyncProcessLockBootstrap.js +16 -0
  467. package/dist/server/localWorkspaceSyncServerComposition.d.ts +59 -0
  468. package/dist/server/localWorkspaceSyncServerComposition.js +91 -0
  469. package/dist/server/localWorkspaceSyncServerRuntime.d.ts +119 -0
  470. package/dist/server/localWorkspaceSyncServerRuntime.js +1163 -0
  471. package/dist/server/rateLimit.d.ts +1 -0
  472. package/dist/server/rateLimit.js +16 -0
  473. package/dist/server/routes/admin.d.ts +2 -4
  474. package/dist/server/routes/admin.js +199 -337
  475. package/dist/server/routes/agentRoles.d.ts +13 -0
  476. package/dist/server/routes/agentRoles.js +273 -0
  477. package/dist/server/routes/agentSkills.d.ts +16 -0
  478. package/dist/server/routes/agentSkills.js +291 -0
  479. package/dist/server/routes/agents.d.ts +49 -0
  480. package/dist/server/routes/agents.js +1455 -0
  481. package/dist/server/routes/annotatedAttachments.js +46 -9
  482. package/dist/server/routes/assetAccess.d.ts +36 -0
  483. package/dist/server/routes/assetAccess.js +93 -0
  484. package/dist/server/routes/auth.d.ts +4 -3
  485. package/dist/server/routes/auth.js +236 -21
  486. package/dist/server/routes/authSupport.d.ts +3 -1
  487. package/dist/server/routes/authSupport.js +22 -8
  488. package/dist/server/routes/documentReviews.d.ts +2 -0
  489. package/dist/server/routes/documentReviews.js +155 -15
  490. package/dist/server/routes/documents.d.ts +6 -2
  491. package/dist/server/routes/documents.js +492 -151
  492. package/dist/server/routes/durableTaskHttpRouters.d.ts +167 -0
  493. package/dist/server/routes/durableTaskHttpRouters.js +89 -0
  494. package/dist/server/routes/localMcpHealth.d.ts +11 -0
  495. package/dist/server/routes/localMcpHealth.js +29 -0
  496. package/dist/server/routes/localService.d.ts +13 -0
  497. package/dist/server/routes/localService.js +446 -0
  498. package/dist/server/routes/localUpdate.d.ts +11 -0
  499. package/dist/server/routes/localUpdate.js +154 -0
  500. package/dist/server/routes/primitives.d.ts +29 -0
  501. package/dist/server/routes/primitives.js +18 -0
  502. package/dist/server/routes/resources.d.ts +1 -10
  503. package/dist/server/routes/resources.js +1 -153
  504. package/dist/server/routes/shared.d.ts +55 -2
  505. package/dist/server/routes/shared.js +506 -16
  506. package/dist/server/routes/sync.d.ts +2 -0
  507. package/dist/server/routes/sync.js +206 -272
  508. package/dist/server/routes/syncAuxRoutes.d.ts +3 -1
  509. package/dist/server/routes/syncAuxRoutes.js +9 -4
  510. package/dist/server/routes/syncCoordinatorLocalRoutes.d.ts +6 -0
  511. package/dist/server/routes/syncCoordinatorLocalRoutes.js +867 -0
  512. package/dist/server/routes/syncPullApplyRoutes.d.ts +29 -1
  513. package/dist/server/routes/syncPullApplyRoutes.js +520 -17
  514. package/dist/server/routes/syncPushRoutes.d.ts +33 -4
  515. package/dist/server/routes/syncPushRoutes.js +251 -62
  516. package/dist/server/routes/syncRouteTypes.d.ts +1 -1
  517. package/dist/server/routes/syncSnapshotRoutes.d.ts +15 -7
  518. package/dist/server/routes/syncSnapshotRoutes.js +95 -17
  519. package/dist/server/routes/syncV3DiagnosticsRoutes.d.ts +14 -0
  520. package/dist/server/routes/syncV3DiagnosticsRoutes.js +72 -0
  521. package/dist/server/routes/syncV3FeedRoutes.d.ts +20 -0
  522. package/dist/server/routes/syncV3FeedRoutes.js +464 -0
  523. package/dist/server/routes/syncV3LocalCaptureRoutes.d.ts +37 -0
  524. package/dist/server/routes/syncV3LocalCaptureRoutes.js +915 -0
  525. package/dist/server/routes/syncV3LocalDispatchRoutes.d.ts +17 -0
  526. package/dist/server/routes/syncV3LocalDispatchRoutes.js +280 -0
  527. package/dist/server/routes/syncV3LocalFeedApplyRoutes.d.ts +17 -0
  528. package/dist/server/routes/syncV3LocalFeedApplyRoutes.js +493 -0
  529. package/dist/server/routes/syncV3LocalOwnershipRoutes.d.ts +10 -0
  530. package/dist/server/routes/syncV3LocalOwnershipRoutes.js +51 -0
  531. package/dist/server/routes/syncV3LocalRecoveryRoutes.d.ts +12 -0
  532. package/dist/server/routes/syncV3LocalRecoveryRoutes.js +78 -0
  533. package/dist/server/routes/syncV3OperationRoutes.d.ts +35 -0
  534. package/dist/server/routes/syncV3OperationRoutes.js +1151 -0
  535. package/dist/server/routes/tasks.d.ts +0 -2
  536. package/dist/server/routes/tasks.js +1083 -236
  537. package/dist/server/routes/workflows.d.ts +26 -0
  538. package/dist/server/routes/workflows.js +500 -0
  539. package/dist/server/routes.d.ts +1 -6
  540. package/dist/server/routes.js +179 -342
  541. package/dist/server/smtpTransport.d.ts +11 -3
  542. package/dist/server/smtpTransport.js +9 -2
  543. package/dist/server/start.js +42 -10
  544. package/dist/service/localServiceCli.d.ts +33 -0
  545. package/dist/service/localServiceCli.js +376 -0
  546. package/dist/service/localServiceClientLifecycle.d.ts +25 -0
  547. package/dist/service/localServiceClientLifecycle.js +189 -0
  548. package/dist/service/localServiceOpen.d.ts +17 -0
  549. package/dist/service/localServiceOpen.js +27 -0
  550. package/dist/services/agentRoleResolver.d.ts +4 -0
  551. package/dist/services/agentRoleResolver.js +7 -0
  552. package/dist/services/aiProfileAvatarGenerationService.d.ts +41 -0
  553. package/dist/services/aiProfileAvatarGenerationService.js +158 -0
  554. package/dist/services/avatarImageProvider.d.ts +33 -0
  555. package/dist/services/avatarImageProvider.js +140 -0
  556. package/dist/services/bedrockAnthropicMessagesModelGateway.d.ts +24 -0
  557. package/dist/services/bedrockAnthropicMessagesModelGateway.js +95 -0
  558. package/dist/services/bedrockMantleModelGateway.d.ts +43 -0
  559. package/dist/services/bedrockMantleModelGateway.js +81 -0
  560. package/dist/services/bedrockModelGateway.d.ts +26 -0
  561. package/dist/services/bedrockModelGateway.js +94 -0
  562. package/dist/services/modelGateway.d.ts +82 -0
  563. package/dist/services/modelGateway.js +61 -0
  564. package/dist/services/taskforceAgentAvatarImageProvider.d.ts +8 -0
  565. package/dist/services/taskforceAgentAvatarImageProvider.js +24 -0
  566. package/dist/services/taskforceAgentMcpBridge.d.ts +77 -0
  567. package/dist/services/taskforceAgentMcpBridge.js +527 -0
  568. package/dist/shared/agentRoleDefinition.d.ts +34 -0
  569. package/dist/shared/agentRoleDefinition.js +207 -0
  570. package/dist/shared/aiProfileAvatarEligibility.d.ts +10 -0
  571. package/dist/shared/aiProfileAvatarEligibility.js +27 -0
  572. package/dist/shared/aiProfileColors.d.ts +7 -0
  573. package/dist/shared/aiProfileColors.js +33 -0
  574. package/dist/shared/colorPalette.d.ts +3 -0
  575. package/dist/shared/colorPalette.js +20 -0
  576. package/dist/shared/commentProvenance.d.ts +4 -0
  577. package/dist/shared/commentProvenance.js +6 -0
  578. package/dist/shared/deletedTaskRetention.d.ts +2 -0
  579. package/dist/shared/deletedTaskRetention.js +7 -0
  580. package/dist/shared/passwordPolicy.d.ts +2 -1
  581. package/dist/shared/passwordPolicy.js +9 -0
  582. package/dist/shared/planningIdentity.d.ts +20 -0
  583. package/dist/shared/planningIdentity.js +79 -0
  584. package/dist/shared/taskDeepLinks.d.ts +28 -0
  585. package/dist/shared/taskDeepLinks.js +48 -0
  586. package/dist/shared/taskRestoreDestination.d.ts +2 -0
  587. package/dist/shared/taskRestoreDestination.js +5 -0
  588. package/dist/shared/taskforceAgentDefinition.d.ts +88 -0
  589. package/dist/shared/taskforceAgentDefinition.js +434 -0
  590. package/dist/shared/taskforceAgentExecutionSnapshot.d.ts +50 -0
  591. package/dist/shared/taskforceAgentExecutionSnapshot.js +68 -0
  592. package/dist/shared/taskforceAgentModels.d.ts +56 -0
  593. package/dist/shared/taskforceAgentModels.js +314 -0
  594. package/dist/shared/taskforceAgentRunContext.d.ts +23 -0
  595. package/dist/shared/taskforceAgentRunContext.js +21 -0
  596. package/dist/shared/taskforceAgentRuntimeResolution.d.ts +31 -0
  597. package/dist/shared/taskforceAgentRuntimeResolution.js +72 -0
  598. package/dist/shared/taskforceAgentSkill.d.ts +33 -0
  599. package/dist/shared/taskforceAgentSkill.js +149 -0
  600. package/dist/storage/agentRoleStore.d.ts +91 -0
  601. package/dist/storage/agentRoleStore.js +385 -0
  602. package/dist/storage/databaseAdapter.d.ts +1 -0
  603. package/dist/storage/databaseAdapter.js +7 -1
  604. package/dist/storage/documentIntegrity.d.ts +12 -3
  605. package/dist/storage/documentIntegrity.js +105 -27
  606. package/dist/storage/objectStorageClient.d.ts +10 -4
  607. package/dist/storage/objectStorageClient.js +73 -43
  608. package/dist/storage/postgresAdapter.d.ts +2 -1
  609. package/dist/storage/postgresAdapter.js +42 -6
  610. package/dist/storage/postgresRequestDiagnostics.d.ts +8 -0
  611. package/dist/storage/postgresRequestDiagnostics.js +24 -0
  612. package/dist/storage/postgresWorker.js +65 -1
  613. package/dist/storage/sqliteAdapter.d.ts +1 -1
  614. package/dist/storage/sqliteAdapter.js +7 -1
  615. package/dist/storage/sqliteWalHealth.d.ts +71 -0
  616. package/dist/storage/sqliteWalHealth.js +176 -0
  617. package/dist/storage/taskDataPath.d.ts +1 -0
  618. package/dist/storage/taskDataPath.js +20 -0
  619. package/dist/storage/taskforceAgentConversationStore.d.ts +66 -0
  620. package/dist/storage/taskforceAgentConversationStore.js +264 -0
  621. package/dist/storage/taskforceAgentSkillStore.d.ts +93 -0
  622. package/dist/storage/taskforceAgentSkillStore.js +355 -0
  623. package/dist/storage/taskforceAgentStore.d.ts +105 -0
  624. package/dist/storage/taskforceAgentStore.js +549 -0
  625. package/dist/storage/workflowStore.d.ts +223 -0
  626. package/dist/storage/workflowStore.js +1032 -0
  627. package/dist/storage/workspaceAssetStore.d.ts +102 -0
  628. package/dist/storage/workspaceAssetStore.js +488 -25
  629. package/dist/sync/aiProfileAvatarSyncPaths.d.ts +14 -0
  630. package/dist/sync/aiProfileAvatarSyncPaths.js +56 -0
  631. package/dist/sync/cloudSyncApi.d.ts +329 -0
  632. package/dist/sync/cloudSyncApi.js +574 -1
  633. package/dist/sync/collaborationSyncPayload.d.ts +5 -1
  634. package/dist/sync/collaborationSyncPayload.js +213 -1
  635. package/dist/sync/collaborationSyncState.d.ts +23 -3
  636. package/dist/sync/collaborationSyncState.js +92 -3
  637. package/dist/sync/contentSyncPayload.d.ts +9 -0
  638. package/dist/sync/contentSyncPayload.js +29 -0
  639. package/dist/sync/contentSyncState.d.ts +79 -4
  640. package/dist/sync/contentSyncState.js +1113 -313
  641. package/dist/sync/coordinator/localSyncBrowserApplyPermitContext.d.ts +39 -0
  642. package/dist/sync/coordinator/localSyncBrowserApplyPermitContext.js +234 -0
  643. package/dist/sync/coordinator/localSyncBrowserAuthorityCapability.d.ts +7 -0
  644. package/dist/sync/coordinator/localSyncBrowserAuthorityCapability.js +10 -0
  645. package/dist/sync/coordinator/localSyncCommittedApplyPolicy.d.ts +7 -0
  646. package/dist/sync/coordinator/localSyncCommittedApplyPolicy.js +41 -0
  647. package/dist/sync/coordinator/localSyncCoordinatorBrowserClient.d.ts +178 -0
  648. package/dist/sync/coordinator/localSyncCoordinatorBrowserClient.js +131 -0
  649. package/dist/sync/coordinator/localSyncCoordinatorCommandLifecycle.d.ts +25 -0
  650. package/dist/sync/coordinator/localSyncCoordinatorCommandLifecycle.js +200 -0
  651. package/dist/sync/coordinator/localSyncCoordinatorHost.d.ts +84 -0
  652. package/dist/sync/coordinator/localSyncCoordinatorHost.js +435 -0
  653. package/dist/sync/coordinator/localSyncCoordinatorRouteServices.d.ts +33 -0
  654. package/dist/sync/coordinator/localSyncCoordinatorRouteServices.js +1 -0
  655. package/dist/sync/coordinator/localSyncCoordinatorStore.d.ts +122 -0
  656. package/dist/sync/coordinator/localSyncCoordinatorStore.js +1039 -0
  657. package/dist/sync/coordinator/localSyncCoordinatorTypes.d.ts +82 -0
  658. package/dist/sync/coordinator/localSyncCoordinatorTypes.js +9 -0
  659. package/dist/sync/coordinator/localSyncDispatchTracker.d.ts +15 -0
  660. package/dist/sync/coordinator/localSyncDispatchTracker.js +68 -0
  661. package/dist/sync/coordinator/localSyncExecutionPermitStore.d.ts +216 -0
  662. package/dist/sync/coordinator/localSyncExecutionPermitStore.js +1436 -0
  663. package/dist/sync/coordinator/localSyncExecutionPermitTypes.d.ts +52 -0
  664. package/dist/sync/coordinator/localSyncExecutionPermitTypes.js +8 -0
  665. package/dist/sync/coordinator/localSyncOwnershipDrainBarrier.d.ts +33 -0
  666. package/dist/sync/coordinator/localSyncOwnershipDrainBarrier.js +83 -0
  667. package/dist/sync/coordinator/localSyncPermitTransactionHooks.d.ts +9 -0
  668. package/dist/sync/coordinator/localSyncPermitTransactionHooks.js +27 -0
  669. package/dist/sync/coordinator/localSyncProcessLock.d.ts +12 -0
  670. package/dist/sync/coordinator/localSyncProcessLock.js +212 -0
  671. package/dist/sync/coordinator/localSyncV3DispatchRecoveryReconciler.d.ts +17 -0
  672. package/dist/sync/coordinator/localSyncV3DispatchRecoveryReconciler.js +82 -0
  673. package/dist/sync/coordinator/localWorkspaceSyncRunner.d.ts +134 -0
  674. package/dist/sync/coordinator/localWorkspaceSyncRunner.js +981 -0
  675. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +189 -0
  676. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +961 -0
  677. package/dist/sync/coordinator/workspaceSyncCloudCredentialValidator.d.ts +19 -0
  678. package/dist/sync/coordinator/workspaceSyncCloudCredentialValidator.js +83 -0
  679. package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +117 -0
  680. package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +323 -0
  681. package/dist/sync/coordinator/workspaceSyncLocalAccessBootstrap.d.ts +11 -0
  682. package/dist/sync/coordinator/workspaceSyncLocalAccessBootstrap.js +51 -0
  683. package/dist/sync/coordinator/workspaceSyncTransportGateway.d.ts +139 -0
  684. package/dist/sync/coordinator/workspaceSyncTransportGateway.js +740 -0
  685. package/dist/sync/engine/localWorkspaceContentManifestService.d.ts +21 -0
  686. package/dist/sync/engine/localWorkspaceContentManifestService.js +44 -0
  687. package/dist/sync/engine/workspaceSyncAtomicLocalPublisher.d.ts +36 -0
  688. package/dist/sync/engine/workspaceSyncAtomicLocalPublisher.js +203 -0
  689. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +21 -0
  690. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.js +13 -0
  691. package/dist/sync/engine/workspaceSyncContentPullObligationStore.d.ts +65 -0
  692. package/dist/sync/engine/workspaceSyncContentPullObligationStore.js +160 -0
  693. package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +216 -0
  694. package/dist/sync/engine/workspaceSyncContentVersionStore.js +1068 -0
  695. package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.d.ts +28 -0
  696. package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.js +543 -0
  697. package/dist/sync/engine/workspaceSyncEngineContracts.d.ts +78 -0
  698. package/dist/sync/engine/workspaceSyncEngineContracts.js +1 -0
  699. package/dist/sync/engine/workspaceSyncEngineControlPlane.d.ts +37 -0
  700. package/dist/sync/engine/workspaceSyncEngineControlPlane.js +79 -0
  701. package/dist/sync/engine/workspaceSyncEngineIdentity.d.ts +1 -0
  702. package/dist/sync/engine/workspaceSyncEngineIdentity.js +4 -0
  703. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.d.ts +68 -0
  704. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +180 -0
  705. package/dist/sync/engine/workspaceSyncEngineLocalApply.d.ts +72 -0
  706. package/dist/sync/engine/workspaceSyncEngineLocalApply.js +132 -0
  707. package/dist/sync/engine/workspaceSyncEngineLocalServices.d.ts +70 -0
  708. package/dist/sync/engine/workspaceSyncEngineLocalServices.js +25 -0
  709. package/dist/sync/engine/workspaceSyncEngineParity.d.ts +8 -0
  710. package/dist/sync/engine/workspaceSyncEngineParity.js +7 -0
  711. package/dist/sync/engine/workspaceSyncEnginePullPolicy.d.ts +32 -0
  712. package/dist/sync/engine/workspaceSyncEnginePullPolicy.js +27 -0
  713. package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +20 -0
  714. package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +87 -0
  715. package/dist/sync/engine/workspaceSyncEngineRecovery.d.ts +56 -0
  716. package/dist/sync/engine/workspaceSyncEngineRecovery.js +288 -0
  717. package/dist/sync/engine/workspaceSyncEngineRemoteServices.d.ts +109 -0
  718. package/dist/sync/engine/workspaceSyncEngineRemoteServices.js +21 -0
  719. package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +61 -0
  720. package/dist/sync/engine/workspaceSyncEngineRuntime.js +59 -0
  721. package/dist/sync/engine/workspaceSyncEngineServerApplyBoundary.d.ts +28 -0
  722. package/dist/sync/engine/workspaceSyncEngineServerApplyBoundary.js +86 -0
  723. package/dist/sync/engine/workspaceSyncEngineServerLocalServices.d.ts +73 -0
  724. package/dist/sync/engine/workspaceSyncEngineServerLocalServices.js +452 -0
  725. package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.d.ts +23 -0
  726. package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.js +466 -0
  727. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.d.ts +125 -0
  728. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +1147 -0
  729. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.d.ts +63 -0
  730. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +276 -0
  731. package/dist/sync/engine/workspaceSyncEngineTransferCompletion.d.ts +20 -0
  732. package/dist/sync/engine/workspaceSyncEngineTransferCompletion.js +37 -0
  733. package/dist/sync/engine/workspaceSyncEngineTransferTypes.d.ts +7 -0
  734. package/dist/sync/engine/workspaceSyncEngineTransferTypes.js +1 -0
  735. package/dist/sync/engine/workspaceSyncEngineTransfers.d.ts +240 -0
  736. package/dist/sync/engine/workspaceSyncEngineTransfers.js +1184 -0
  737. package/dist/sync/engine/workspaceSyncEngineV3LocalFeedApply.d.ts +39 -0
  738. package/dist/sync/engine/workspaceSyncEngineV3LocalFeedApply.js +39 -0
  739. package/dist/sync/engine/workspaceSyncImmutableContentGcRunner.d.ts +25 -0
  740. package/dist/sync/engine/workspaceSyncImmutableContentGcRunner.js +83 -0
  741. package/dist/sync/engine/workspaceSyncImmutableContentProvider.d.ts +71 -0
  742. package/dist/sync/engine/workspaceSyncImmutableContentProvider.js +209 -0
  743. package/dist/sync/engine/workspaceSyncImmutableContentStager.d.ts +32 -0
  744. package/dist/sync/engine/workspaceSyncImmutableContentStager.js +202 -0
  745. package/dist/sync/engine/workspaceSyncPublishedContentResolver.d.ts +43 -0
  746. package/dist/sync/engine/workspaceSyncPublishedContentResolver.js +142 -0
  747. package/dist/sync/engine/workspaceSyncServerContentRuntime.d.ts +26 -0
  748. package/dist/sync/engine/workspaceSyncServerContentRuntime.js +41 -0
  749. package/dist/sync/engine/workspaceSyncServerDataServices.d.ts +44 -0
  750. package/dist/sync/engine/workspaceSyncServerDataServices.js +143 -0
  751. package/dist/sync/engine/workspaceSyncTransferEvidence.d.ts +39 -0
  752. package/dist/sync/engine/workspaceSyncTransferEvidence.js +45 -0
  753. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +44 -0
  754. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +992 -0
  755. package/dist/sync/engine/workspaceSyncV2PreparedContent.d.ts +82 -0
  756. package/dist/sync/engine/workspaceSyncV2PreparedContent.js +219 -0
  757. package/dist/sync/planningCanonicalFields.d.ts +41 -0
  758. package/dist/sync/planningCanonicalFields.js +211 -0
  759. package/dist/sync/planningSyncPayload.d.ts +5 -1
  760. package/dist/sync/planningSyncPayload.js +88 -4
  761. package/dist/sync/syncApplyHandlers.d.ts +100 -8
  762. package/dist/sync/syncApplyHandlers.js +845 -78
  763. package/dist/sync/syncResourceAdapters.d.ts +10 -0
  764. package/dist/sync/syncResourceAdapters.js +21 -1
  765. package/dist/sync/syncService.d.ts +57 -1
  766. package/dist/sync/syncService.js +1094 -138
  767. package/dist/sync/taskNestedContent.d.ts +2 -0
  768. package/dist/sync/taskNestedContent.js +8 -0
  769. package/dist/sync/taskSyncChangeKey.js +0 -1
  770. package/dist/sync/taskSyncPayload.d.ts +1 -1
  771. package/dist/sync/taskSyncPayload.js +20 -3
  772. package/dist/sync/v3/canonicalWorkspaceSyncJson.d.ts +2 -0
  773. package/dist/sync/v3/canonicalWorkspaceSyncJson.js +26 -0
  774. package/dist/sync/v3/combinedFeedCapability.d.ts +21 -0
  775. package/dist/sync/v3/combinedFeedCapability.js +80 -0
  776. package/dist/sync/v3/combinedFeedPrerequisites.d.ts +18 -0
  777. package/dist/sync/v3/combinedFeedPrerequisites.js +184 -0
  778. package/dist/sync/v3/durableInitiativeMutationRouter.d.ts +61 -0
  779. package/dist/sync/v3/durableInitiativeMutationRouter.js +287 -0
  780. package/dist/sync/v3/durableOperationReplay.d.ts +36 -0
  781. package/dist/sync/v3/durableOperationReplay.js +103 -0
  782. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.d.ts +50 -0
  783. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +216 -0
  784. package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +47 -0
  785. package/dist/sync/v3/durableTaskChecklistMutationRouter.js +182 -0
  786. package/dist/sync/v3/durableTaskCommentMutationRouter.d.ts +47 -0
  787. package/dist/sync/v3/durableTaskCommentMutationRouter.js +191 -0
  788. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.d.ts +60 -0
  789. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.js +333 -0
  790. package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +40 -0
  791. package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +518 -0
  792. package/dist/sync/v3/durableTaxonomyMutationRouter.d.ts +63 -0
  793. package/dist/sync/v3/durableTaxonomyMutationRouter.js +289 -0
  794. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +77 -0
  795. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +361 -0
  796. package/dist/sync/v3/durableWorkstreamMutationRouter.d.ts +61 -0
  797. package/dist/sync/v3/durableWorkstreamMutationRouter.js +287 -0
  798. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.d.ts +42 -0
  799. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +122 -0
  800. package/dist/sync/v3/entityEventLegacyAdoptionContract.d.ts +6 -0
  801. package/dist/sync/v3/entityEventLegacyAdoptionContract.js +6 -0
  802. package/dist/sync/v3/entityEventLegacyAdoptionService.d.ts +62 -0
  803. package/dist/sync/v3/entityEventLegacyAdoptionService.js +180 -0
  804. package/dist/sync/v3/initiativeActivityAuthoritativeRevision.d.ts +11 -0
  805. package/dist/sync/v3/initiativeActivityAuthoritativeRevision.js +23 -0
  806. package/dist/sync/v3/initiativeActivityIdentity.d.ts +8 -0
  807. package/dist/sync/v3/initiativeActivityIdentity.js +14 -0
  808. package/dist/sync/v3/initiativeCoexistence.d.ts +26 -0
  809. package/dist/sync/v3/initiativeCoexistence.js +148 -0
  810. package/dist/sync/v3/initiativeFeedActivationCapability.d.ts +6 -0
  811. package/dist/sync/v3/initiativeFeedActivationCapability.js +16 -0
  812. package/dist/sync/v3/initiativeMutationPayload.d.ts +26 -0
  813. package/dist/sync/v3/initiativeMutationPayload.js +144 -0
  814. package/dist/sync/v3/initiativeMutationService.d.ts +62 -0
  815. package/dist/sync/v3/initiativeMutationService.js +206 -0
  816. package/dist/sync/v3/localEntityEventLegacyAdoption.d.ts +31 -0
  817. package/dist/sync/v3/localEntityEventLegacyAdoption.js +607 -0
  818. package/dist/sync/v3/localInitiativeOutboxHandler.d.ts +8 -0
  819. package/dist/sync/v3/localInitiativeOutboxHandler.js +88 -0
  820. package/dist/sync/v3/localInitiativeOutboxService.d.ts +50 -0
  821. package/dist/sync/v3/localInitiativeOutboxService.js +497 -0
  822. package/dist/sync/v3/localOperationIdentityStore.d.ts +81 -0
  823. package/dist/sync/v3/localOperationIdentityStore.js +388 -0
  824. package/dist/sync/v3/localOutboxDispatchCapability.d.ts +7 -0
  825. package/dist/sync/v3/localOutboxDispatchCapability.js +13 -0
  826. package/dist/sync/v3/localOutboxDispatchRuntime.d.ts +16 -0
  827. package/dist/sync/v3/localOutboxDispatchRuntime.js +269 -0
  828. package/dist/sync/v3/localOutboxDispatcher.d.ts +53 -0
  829. package/dist/sync/v3/localOutboxDispatcher.js +366 -0
  830. package/dist/sync/v3/localOutboxDrainClient.d.ts +50 -0
  831. package/dist/sync/v3/localOutboxDrainClient.js +250 -0
  832. package/dist/sync/v3/localOutboxOperationHandler.d.ts +31 -0
  833. package/dist/sync/v3/localOutboxOperationHandler.js +10 -0
  834. package/dist/sync/v3/localOutboxRecoveryClient.d.ts +14 -0
  835. package/dist/sync/v3/localOutboxRecoveryClient.js +45 -0
  836. package/dist/sync/v3/localOutboxRecoveryPreparationService.d.ts +12 -0
  837. package/dist/sync/v3/localOutboxRecoveryPreparationService.js +151 -0
  838. package/dist/sync/v3/localSyncIdentityStore.d.ts +9 -0
  839. package/dist/sync/v3/localSyncIdentityStore.js +43 -0
  840. package/dist/sync/v3/localTaskAttachmentLinksOutboxHandler.d.ts +10 -0
  841. package/dist/sync/v3/localTaskAttachmentLinksOutboxHandler.js +80 -0
  842. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.d.ts +46 -0
  843. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.js +303 -0
  844. package/dist/sync/v3/localTaskChecklistOutboxHandler.d.ts +10 -0
  845. package/dist/sync/v3/localTaskChecklistOutboxHandler.js +54 -0
  846. package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +47 -0
  847. package/dist/sync/v3/localTaskChecklistOutboxService.js +221 -0
  848. package/dist/sync/v3/localTaskCommentOutboxHandler.d.ts +10 -0
  849. package/dist/sync/v3/localTaskCommentOutboxHandler.js +94 -0
  850. package/dist/sync/v3/localTaskCommentOutboxService.d.ts +75 -0
  851. package/dist/sync/v3/localTaskCommentOutboxService.js +391 -0
  852. package/dist/sync/v3/localTaskCreateClient.d.ts +27 -0
  853. package/dist/sync/v3/localTaskCreateClient.js +209 -0
  854. package/dist/sync/v3/localTaskCreateOutboxHandler.d.ts +8 -0
  855. package/dist/sync/v3/localTaskCreateOutboxHandler.js +147 -0
  856. package/dist/sync/v3/localTaskCreateOutboxService.d.ts +77 -0
  857. package/dist/sync/v3/localTaskCreateOutboxService.js +397 -0
  858. package/dist/sync/v3/localTaskDeleteClient.d.ts +10 -0
  859. package/dist/sync/v3/localTaskDeleteClient.js +23 -0
  860. package/dist/sync/v3/localTaskDeleteOutboxHandler.d.ts +8 -0
  861. package/dist/sync/v3/localTaskDeleteOutboxHandler.js +54 -0
  862. package/dist/sync/v3/localTaskDeleteOutboxService.d.ts +38 -0
  863. package/dist/sync/v3/localTaskDeleteOutboxService.js +235 -0
  864. package/dist/sync/v3/localTaskLegacyRootAdoption.d.ts +28 -0
  865. package/dist/sync/v3/localTaskLegacyRootAdoption.js +219 -0
  866. package/dist/sync/v3/localTaskLifecycleClient.d.ts +49 -0
  867. package/dist/sync/v3/localTaskLifecycleClient.js +57 -0
  868. package/dist/sync/v3/localTaskLifecycleOutboxHandler.d.ts +8 -0
  869. package/dist/sync/v3/localTaskLifecycleOutboxHandler.js +94 -0
  870. package/dist/sync/v3/localTaskLifecycleOutboxService.d.ts +60 -0
  871. package/dist/sync/v3/localTaskLifecycleOutboxService.js +304 -0
  872. package/dist/sync/v3/localTaskMetadataClient.d.ts +13 -0
  873. package/dist/sync/v3/localTaskMetadataClient.js +30 -0
  874. package/dist/sync/v3/localTaskMetadataOutboxHandler.d.ts +8 -0
  875. package/dist/sync/v3/localTaskMetadataOutboxHandler.js +70 -0
  876. package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +48 -0
  877. package/dist/sync/v3/localTaskMetadataOutboxService.js +229 -0
  878. package/dist/sync/v3/localTaskOperationClient.d.ts +72 -0
  879. package/dist/sync/v3/localTaskOperationClient.js +195 -0
  880. package/dist/sync/v3/localTaskRelationshipOutboxHandler.d.ts +8 -0
  881. package/dist/sync/v3/localTaskRelationshipOutboxHandler.js +114 -0
  882. package/dist/sync/v3/localTaskRelationshipOutboxService.d.ts +45 -0
  883. package/dist/sync/v3/localTaskRelationshipOutboxService.js +192 -0
  884. package/dist/sync/v3/localTaskRestoreClient.d.ts +13 -0
  885. package/dist/sync/v3/localTaskRestoreClient.js +32 -0
  886. package/dist/sync/v3/localTaskRestoreOutboxHandler.d.ts +8 -0
  887. package/dist/sync/v3/localTaskRestoreOutboxHandler.js +41 -0
  888. package/dist/sync/v3/localTaskRestoreOutboxService.d.ts +56 -0
  889. package/dist/sync/v3/localTaskRestoreOutboxService.js +323 -0
  890. package/dist/sync/v3/localTaskStatusClient.d.ts +17 -0
  891. package/dist/sync/v3/localTaskStatusClient.js +35 -0
  892. package/dist/sync/v3/localTaskStatusOutboxHandler.d.ts +8 -0
  893. package/dist/sync/v3/localTaskStatusOutboxHandler.js +75 -0
  894. package/dist/sync/v3/localTaskStatusOutboxService.d.ts +53 -0
  895. package/dist/sync/v3/localTaskStatusOutboxService.js +422 -0
  896. package/dist/sync/v3/localTaxonomyCompositeOutboxService.d.ts +34 -0
  897. package/dist/sync/v3/localTaxonomyCompositeOutboxService.js +290 -0
  898. package/dist/sync/v3/localTaxonomyOutboxHandler.d.ts +9 -0
  899. package/dist/sync/v3/localTaxonomyOutboxHandler.js +106 -0
  900. package/dist/sync/v3/localTaxonomyOutboxService.d.ts +30 -0
  901. package/dist/sync/v3/localTaxonomyOutboxService.js +181 -0
  902. package/dist/sync/v3/localWorkflowRuntimeOutboxHandler.d.ts +8 -0
  903. package/dist/sync/v3/localWorkflowRuntimeOutboxHandler.js +113 -0
  904. package/dist/sync/v3/localWorkflowRuntimeOutboxService.d.ts +37 -0
  905. package/dist/sync/v3/localWorkflowRuntimeOutboxService.js +330 -0
  906. package/dist/sync/v3/localWorkspaceSyncServerOutboxDispatcher.d.ts +63 -0
  907. package/dist/sync/v3/localWorkspaceSyncServerOutboxDispatcher.js +264 -0
  908. package/dist/sync/v3/localWorkstreamOutboxHandler.d.ts +8 -0
  909. package/dist/sync/v3/localWorkstreamOutboxHandler.js +102 -0
  910. package/dist/sync/v3/localWorkstreamOutboxService.d.ts +52 -0
  911. package/dist/sync/v3/localWorkstreamOutboxService.js +581 -0
  912. package/dist/sync/v3/localWorkstreamTaskOrderOutboxHandler.d.ts +10 -0
  913. package/dist/sync/v3/localWorkstreamTaskOrderOutboxHandler.js +57 -0
  914. package/dist/sync/v3/localWorkstreamTaskOrderOutboxService.d.ts +30 -0
  915. package/dist/sync/v3/localWorkstreamTaskOrderOutboxService.js +128 -0
  916. package/dist/sync/v3/planningActivation.d.ts +13 -0
  917. package/dist/sync/v3/planningActivation.js +33 -0
  918. package/dist/sync/v3/planningAttachmentActivityValidation.d.ts +9 -0
  919. package/dist/sync/v3/planningAttachmentActivityValidation.js +87 -0
  920. package/dist/sync/v3/programScaffoldService.d.ts +143 -0
  921. package/dist/sync/v3/programScaffoldService.js +478 -0
  922. package/dist/sync/v3/syncDurabilityStore.d.ts +781 -0
  923. package/dist/sync/v3/syncDurabilityStore.js +4773 -0
  924. package/dist/sync/v3/taskActivityAuthoritativeRevision.d.ts +16 -0
  925. package/dist/sync/v3/taskActivityAuthoritativeRevision.js +67 -0
  926. package/dist/sync/v3/taskActivityJournal.d.ts +20 -0
  927. package/dist/sync/v3/taskActivityJournal.js +195 -0
  928. package/dist/sync/v3/taskAttachmentLinksActivityIdentity.d.ts +6 -0
  929. package/dist/sync/v3/taskAttachmentLinksActivityIdentity.js +14 -0
  930. package/dist/sync/v3/taskAttachmentLinksMutationService.d.ts +112 -0
  931. package/dist/sync/v3/taskAttachmentLinksMutationService.js +218 -0
  932. package/dist/sync/v3/taskChecklistActivityIdentity.d.ts +6 -0
  933. package/dist/sync/v3/taskChecklistActivityIdentity.js +14 -0
  934. package/dist/sync/v3/taskChecklistMutationService.d.ts +92 -0
  935. package/dist/sync/v3/taskChecklistMutationService.js +156 -0
  936. package/dist/sync/v3/taskCommentActivityIdentity.d.ts +7 -0
  937. package/dist/sync/v3/taskCommentActivityIdentity.js +15 -0
  938. package/dist/sync/v3/taskCommentMutationService.d.ts +150 -0
  939. package/dist/sync/v3/taskCommentMutationService.js +392 -0
  940. package/dist/sync/v3/taskCommentReconcileProvenance.d.ts +58 -0
  941. package/dist/sync/v3/taskCommentReconcileProvenance.js +170 -0
  942. package/dist/sync/v3/taskCreateActivation.d.ts +19 -0
  943. package/dist/sync/v3/taskCreateActivation.js +84 -0
  944. package/dist/sync/v3/taskCreateActivityIdentity.d.ts +7 -0
  945. package/dist/sync/v3/taskCreateActivityIdentity.js +18 -0
  946. package/dist/sync/v3/taskCreateMutationService.d.ts +103 -0
  947. package/dist/sync/v3/taskCreateMutationService.js +283 -0
  948. package/dist/sync/v3/taskDeleteActivation.d.ts +7 -0
  949. package/dist/sync/v3/taskDeleteActivation.js +14 -0
  950. package/dist/sync/v3/taskDeleteMutationService.d.ts +35 -0
  951. package/dist/sync/v3/taskDeleteMutationService.js +133 -0
  952. package/dist/sync/v3/taskLegacyRootAdoptionService.d.ts +78 -0
  953. package/dist/sync/v3/taskLegacyRootAdoptionService.js +175 -0
  954. package/dist/sync/v3/taskLifecycleActivityIdentity.d.ts +9 -0
  955. package/dist/sync/v3/taskLifecycleActivityIdentity.js +18 -0
  956. package/dist/sync/v3/taskLifecycleMutationPayload.d.ts +5 -0
  957. package/dist/sync/v3/taskLifecycleMutationPayload.js +28 -0
  958. package/dist/sync/v3/taskLifecycleMutationService.d.ts +66 -0
  959. package/dist/sync/v3/taskLifecycleMutationService.js +92 -0
  960. package/dist/sync/v3/taskMetadataActivation.d.ts +12 -0
  961. package/dist/sync/v3/taskMetadataActivation.js +38 -0
  962. package/dist/sync/v3/taskMetadataActivityIdentity.d.ts +7 -0
  963. package/dist/sync/v3/taskMetadataActivityIdentity.js +18 -0
  964. package/dist/sync/v3/taskMetadataCoexistence.d.ts +37 -0
  965. package/dist/sync/v3/taskMetadataCoexistence.js +138 -0
  966. package/dist/sync/v3/taskMetadataMutationService.d.ts +71 -0
  967. package/dist/sync/v3/taskMetadataMutationService.js +199 -0
  968. package/dist/sync/v3/taskRelationshipLegacyAdoptionService.d.ts +48 -0
  969. package/dist/sync/v3/taskRelationshipLegacyAdoptionService.js +164 -0
  970. package/dist/sync/v3/taskRelationshipMutationService.d.ts +50 -0
  971. package/dist/sync/v3/taskRelationshipMutationService.js +148 -0
  972. package/dist/sync/v3/taskRestoreMutationService.d.ts +90 -0
  973. package/dist/sync/v3/taskRestoreMutationService.js +179 -0
  974. package/dist/sync/v3/taskStatusActivation.d.ts +7 -0
  975. package/dist/sync/v3/taskStatusActivation.js +15 -0
  976. package/dist/sync/v3/taskStatusMutationService.d.ts +76 -0
  977. package/dist/sync/v3/taskStatusMutationService.js +308 -0
  978. package/dist/sync/v3/taskWorkflowMutationPayload.d.ts +4 -0
  979. package/dist/sync/v3/taskWorkflowMutationPayload.js +22 -0
  980. package/dist/sync/v3/taskWorkflowMutationService.d.ts +64 -0
  981. package/dist/sync/v3/taskWorkflowMutationService.js +102 -0
  982. package/dist/sync/v3/taxonomyCoexistence.d.ts +10 -0
  983. package/dist/sync/v3/taxonomyCoexistence.js +19 -0
  984. package/dist/sync/v3/taxonomyCompositeMutationService.d.ts +110 -0
  985. package/dist/sync/v3/taxonomyCompositeMutationService.js +304 -0
  986. package/dist/sync/v3/taxonomyMutationService.d.ts +57 -0
  987. package/dist/sync/v3/taxonomyMutationService.js +106 -0
  988. package/dist/sync/v3/taxonomyStateMutation.d.ts +22 -0
  989. package/dist/sync/v3/taxonomyStateMutation.js +49 -0
  990. package/dist/sync/v3/taxonomySyncPayload.d.ts +9 -0
  991. package/dist/sync/v3/taxonomySyncPayload.js +199 -0
  992. package/dist/sync/v3/workflowAssignmentSync.d.ts +22 -0
  993. package/dist/sync/v3/workflowAssignmentSync.js +213 -0
  994. package/dist/sync/v3/workflowRuntimeMutationService.d.ts +89 -0
  995. package/dist/sync/v3/workflowRuntimeMutationService.js +359 -0
  996. package/dist/sync/v3/workflowRuntimeOperationIdentity.d.ts +13 -0
  997. package/dist/sync/v3/workflowRuntimeOperationIdentity.js +35 -0
  998. package/dist/sync/v3/workflowRuntimeSync.d.ts +141 -0
  999. package/dist/sync/v3/workflowRuntimeSync.js +485 -0
  1000. package/dist/sync/v3/workspaceSyncJournalReader.d.ts +43 -0
  1001. package/dist/sync/v3/workspaceSyncJournalReader.js +45 -0
  1002. package/dist/sync/v3/workspaceSyncLocalOwnershipSnapshot.d.ts +28 -0
  1003. package/dist/sync/v3/workspaceSyncLocalOwnershipSnapshot.js +81 -0
  1004. package/dist/sync/v3/workspaceSyncPayloadFingerprint.d.ts +1 -0
  1005. package/dist/sync/v3/workspaceSyncPayloadFingerprint.js +5 -0
  1006. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.d.ts +16 -0
  1007. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.js +153 -0
  1008. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.d.ts +83 -0
  1009. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.js +161 -0
  1010. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.d.ts +16 -0
  1011. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.js +90 -0
  1012. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +65 -0
  1013. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +357 -0
  1014. package/dist/sync/v3/workspaceSyncV3CombinedCoverage.d.ts +51 -0
  1015. package/dist/sync/v3/workspaceSyncV3CombinedCoverage.js +171 -0
  1016. package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.d.ts +43 -0
  1017. package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.js +541 -0
  1018. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.d.ts +50 -0
  1019. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +1161 -0
  1020. package/dist/sync/v3/workspaceSyncV3CombinedProjectionState.d.ts +96 -0
  1021. package/dist/sync/v3/workspaceSyncV3CombinedProjectionState.js +672 -0
  1022. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +46 -0
  1023. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +621 -0
  1024. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +66 -0
  1025. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +527 -0
  1026. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +78 -0
  1027. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +566 -0
  1028. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +45 -0
  1029. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +125 -0
  1030. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.d.ts +13 -0
  1031. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +34 -0
  1032. package/dist/sync/v3/workspaceSyncV3CursorEncoding.d.ts +1 -0
  1033. package/dist/sync/v3/workspaceSyncV3CursorEncoding.js +6 -0
  1034. package/dist/sync/v3/workspaceSyncV3DomainAdmission.d.ts +43 -0
  1035. package/dist/sync/v3/workspaceSyncV3DomainAdmission.js +118 -0
  1036. package/dist/sync/v3/workspaceSyncV3Feed.d.ts +95 -0
  1037. package/dist/sync/v3/workspaceSyncV3Feed.js +243 -0
  1038. package/dist/sync/v3/workspaceSyncV3FeedApply.d.ts +13 -0
  1039. package/dist/sync/v3/workspaceSyncV3FeedApply.js +67 -0
  1040. package/dist/sync/v3/workspaceSyncV3FeedClientContract.d.ts +3 -0
  1041. package/dist/sync/v3/workspaceSyncV3FeedClientContract.js +46 -0
  1042. package/dist/sync/v3/workspaceSyncV3FeedCursorKeys.d.ts +10 -0
  1043. package/dist/sync/v3/workspaceSyncV3FeedCursorKeys.js +58 -0
  1044. package/dist/sync/v3/workspaceSyncV3FeedOrchestrator.d.ts +31 -0
  1045. package/dist/sync/v3/workspaceSyncV3FeedOrchestrator.js +228 -0
  1046. package/dist/sync/v3/workspaceSyncV3FeedProfile.d.ts +32 -0
  1047. package/dist/sync/v3/workspaceSyncV3FeedProfile.js +21 -0
  1048. package/dist/sync/v3/workspaceSyncV3InitiativeLocalApply.d.ts +36 -0
  1049. package/dist/sync/v3/workspaceSyncV3InitiativeLocalApply.js +163 -0
  1050. package/dist/sync/v3/workspaceSyncV3InitiativeRepair.d.ts +33 -0
  1051. package/dist/sync/v3/workspaceSyncV3InitiativeRepair.js +118 -0
  1052. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.d.ts +10 -0
  1053. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.js +45 -0
  1054. package/dist/sync/v3/workspaceSyncV3LocalOutboxStatus.d.ts +27 -0
  1055. package/dist/sync/v3/workspaceSyncV3LocalOutboxStatus.js +83 -0
  1056. package/dist/sync/v3/workspaceSyncV3NestedCoverage.d.ts +10 -0
  1057. package/dist/sync/v3/workspaceSyncV3NestedCoverage.js +40 -0
  1058. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.d.ts +83 -0
  1059. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.js +325 -0
  1060. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.d.ts +59 -0
  1061. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.js +302 -0
  1062. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +47 -0
  1063. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +329 -0
  1064. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.d.ts +19 -0
  1065. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.js +41 -0
  1066. package/dist/sync/v3/workspaceSyncV3NestedWireContract.d.ts +6 -0
  1067. package/dist/sync/v3/workspaceSyncV3NestedWireContract.js +16 -0
  1068. package/dist/sync/v3/workspaceSyncV3OperationProjection.d.ts +8 -0
  1069. package/dist/sync/v3/workspaceSyncV3OperationProjection.js +52 -0
  1070. package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +230 -0
  1071. package/dist/sync/v3/workspaceSyncV3OperationProtocol.js +1 -0
  1072. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +165 -0
  1073. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +414 -0
  1074. package/dist/sync/v3/workspaceSyncV3OriginActor.d.ts +36 -0
  1075. package/dist/sync/v3/workspaceSyncV3OriginActor.js +61 -0
  1076. package/dist/sync/v3/workspaceSyncV3OriginAssertion.d.ts +46 -0
  1077. package/dist/sync/v3/workspaceSyncV3OriginAssertion.js +121 -0
  1078. package/dist/sync/v3/workspaceSyncV3OriginAssertionHeader.d.ts +1 -0
  1079. package/dist/sync/v3/workspaceSyncV3OriginAssertionHeader.js +1 -0
  1080. package/dist/sync/v3/workspaceSyncV3PlanningOrderCoverage.d.ts +10 -0
  1081. package/dist/sync/v3/workspaceSyncV3PlanningOrderCoverage.js +34 -0
  1082. package/dist/sync/v3/workspaceSyncV3PlanningOrderWireContract.d.ts +6 -0
  1083. package/dist/sync/v3/workspaceSyncV3PlanningOrderWireContract.js +10 -0
  1084. package/dist/sync/v3/workspaceSyncV3ProjectionState.d.ts +105 -0
  1085. package/dist/sync/v3/workspaceSyncV3ProjectionState.js +467 -0
  1086. package/dist/sync/v3/workspaceSyncV3RepairSqlBatching.d.ts +2 -0
  1087. package/dist/sync/v3/workspaceSyncV3RepairSqlBatching.js +10 -0
  1088. package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.d.ts +56 -0
  1089. package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.js +250 -0
  1090. package/dist/sync/v3/workspaceSyncV3TaskRelationshipProjection.d.ts +30 -0
  1091. package/dist/sync/v3/workspaceSyncV3TaskRelationshipProjection.js +142 -0
  1092. package/dist/sync/v3/workspaceSyncV3TaskRootProjection.d.ts +40 -0
  1093. package/dist/sync/v3/workspaceSyncV3TaskRootProjection.js +246 -0
  1094. package/dist/sync/v3/workspaceSyncV3TaxonomyFeedProjection.d.ts +39 -0
  1095. package/dist/sync/v3/workspaceSyncV3TaxonomyFeedProjection.js +185 -0
  1096. package/dist/sync/v3/workspaceSyncV3WorkflowCoverage.d.ts +10 -0
  1097. package/dist/sync/v3/workspaceSyncV3WorkflowCoverage.js +36 -0
  1098. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.d.ts +17 -0
  1099. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.js +143 -0
  1100. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeProjection.d.ts +9 -0
  1101. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeProjection.js +195 -0
  1102. package/dist/sync/v3/workspaceSyncV3WorkflowWireContract.d.ts +11 -0
  1103. package/dist/sync/v3/workspaceSyncV3WorkflowWireContract.js +12 -0
  1104. package/dist/sync/v3/workspaceSyncV3WorkstreamProjection.d.ts +4 -0
  1105. package/dist/sync/v3/workspaceSyncV3WorkstreamProjection.js +98 -0
  1106. package/dist/sync/v3/workspaceSyncV3WorkstreamTaskOrderProjection.d.ts +9 -0
  1107. package/dist/sync/v3/workspaceSyncV3WorkstreamTaskOrderProjection.js +72 -0
  1108. package/dist/sync/v3/workstreamActivityAuthoritativeRevision.d.ts +11 -0
  1109. package/dist/sync/v3/workstreamActivityAuthoritativeRevision.js +23 -0
  1110. package/dist/sync/v3/workstreamActivityIdentity.d.ts +8 -0
  1111. package/dist/sync/v3/workstreamActivityIdentity.js +14 -0
  1112. package/dist/sync/v3/workstreamCoexistence.d.ts +19 -0
  1113. package/dist/sync/v3/workstreamCoexistence.js +64 -0
  1114. package/dist/sync/v3/workstreamMutationPayload.d.ts +27 -0
  1115. package/dist/sync/v3/workstreamMutationPayload.js +147 -0
  1116. package/dist/sync/v3/workstreamMutationService.d.ts +72 -0
  1117. package/dist/sync/v3/workstreamMutationService.js +256 -0
  1118. package/dist/sync/v3/workstreamTaskOrderMutationService.d.ts +55 -0
  1119. package/dist/sync/v3/workstreamTaskOrderMutationService.js +110 -0
  1120. package/dist/sync/v3/workstreamTaskOrderSync.d.ts +14 -0
  1121. package/dist/sync/v3/workstreamTaskOrderSync.js +25 -0
  1122. package/dist/sync/workspaceContentManifest.d.ts +86 -0
  1123. package/dist/sync/workspaceContentManifest.js +123 -0
  1124. package/dist/sync/workspacePullFeed.d.ts +191 -2
  1125. package/dist/sync/workspacePullFeed.js +523 -135
  1126. package/dist/sync/workspacePushPreparedPlan.d.ts +21 -0
  1127. package/dist/sync/workspacePushPreparedPlan.js +1 -0
  1128. package/dist/sync/workspaceRepair.d.ts +17 -25
  1129. package/dist/sync/workspaceRepair.js +348 -25
  1130. package/dist/sync/workspaceSyncContentDecryption.d.ts +6 -0
  1131. package/dist/sync/workspaceSyncContentDecryption.js +11 -0
  1132. package/dist/sync/workspaceSyncModel.d.ts +227 -5
  1133. package/dist/sync/workspaceSyncModel.js +398 -37
  1134. package/dist/sync/workspaceSyncSnapshotProjection.d.ts +11 -0
  1135. package/dist/sync/workspaceSyncSnapshotProjection.js +101 -0
  1136. package/dist/sync/workspaceSyncState.d.ts +13 -0
  1137. package/dist/sync/workspaceSyncState.js +36 -0
  1138. package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +106 -0
  1139. package/dist/sync/workspaceSyncV2SnapshotBuilder.js +193 -0
  1140. package/dist/types.d.ts +31 -15
  1141. package/dist/types.js +1 -3
  1142. package/dist/ui/ai-profile-clients/amazon-nova.svg +1 -0
  1143. package/dist/ui/ai-profile-clients/antigravity.png +0 -0
  1144. package/dist/ui/ai-profile-clients/chatgpt.svg +10 -0
  1145. package/dist/ui/ai-profile-clients/claude-chat.svg +1 -0
  1146. package/dist/ui/ai-profile-clients/claude-code.svg +15 -0
  1147. package/dist/ui/ai-profile-clients/cline-app-icon-light.png +0 -0
  1148. package/dist/ui/ai-profile-clients/cline.svg +16 -0
  1149. package/dist/ui/ai-profile-clients/codex.svg +1 -0
  1150. package/dist/ui/ai-profile-clients/copilot.png +0 -0
  1151. package/dist/ui/ai-profile-clients/cursor.svg +1 -0
  1152. package/dist/ui/ai-profile-clients/deepseek.svg +1 -0
  1153. package/dist/ui/ai-profile-clients/gemini-cli-icon.png +0 -0
  1154. package/dist/ui/ai-profile-clients/gemini.svg +10 -0
  1155. package/dist/ui/ai-profile-clients/grok.svg +31 -0
  1156. package/dist/ui/ai-profile-clients/kiro.svg +11 -0
  1157. package/dist/ui/ai-profile-clients/llama.svg +1 -0
  1158. package/dist/ui/ai-profile-clients/mistral.svg +1 -0
  1159. package/dist/ui/ai-profile-clients/ms_copilot.jpeg +0 -0
  1160. package/dist/ui/ai-profile-clients/openclaw.png +0 -0
  1161. package/dist/ui/ai-profile-clients/perplexity.svg +1 -0
  1162. package/dist/ui/ai-profile-clients/vscode.svg +41 -0
  1163. package/dist/ui/ai-profile-clients/windsurf.svg +11 -0
  1164. package/dist/ui/assets/AiIdentityRosterCard-MZs7lVED.js +1 -0
  1165. package/dist/ui/assets/AiProfilesModule-C3i0LOxe.js +1 -0
  1166. package/dist/ui/assets/AnnotatedAttachmentWorkspace-CBRZ8rca.css +1 -0
  1167. package/dist/ui/assets/AnnotatedAttachmentWorkspace-DVZk5Tln.js +3 -0
  1168. package/dist/ui/assets/AssetTraySortControl-B9k5caQW.css +1 -0
  1169. package/dist/ui/assets/AssetTraySortControl-Kf1pelSy.js +1 -0
  1170. package/dist/ui/assets/ContextAttachmentManager-B8boOs6Q.js +3 -0
  1171. package/dist/ui/assets/DocumentWorkspace-BIBGBfd7.css +1 -0
  1172. package/dist/ui/assets/DocumentWorkspace-DXH4XUsB.js +261 -0
  1173. package/dist/ui/assets/EntityActivityTimeline-BfJbZRdl.css +1 -0
  1174. package/dist/ui/assets/EntityActivityTimeline-BtSTq0ON.js +1 -0
  1175. package/dist/ui/assets/PlanningModule-BPVyEa-f.js +1 -0
  1176. package/dist/ui/assets/PlanningModule-CoIR9hbV.css +1 -0
  1177. package/dist/ui/assets/PlansPage-C2nkK2Bp.css +1 -0
  1178. package/dist/ui/assets/PlansPage-ChqgxALc.js +1 -0
  1179. package/dist/ui/assets/TaskContextUpload-CB3ol0sN.js +1 -0
  1180. package/dist/ui/assets/TaskContextUpload-qmBeUw3u.css +1 -0
  1181. package/dist/ui/assets/TaskSettings-g4ECKNOz.js +12 -0
  1182. package/dist/ui/assets/TaskforceAgentsModule-BazdUwxZ.js +21 -0
  1183. package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +1 -0
  1184. package/dist/ui/assets/WorkflowManagerModule-DF10XENz.css +1 -0
  1185. package/dist/ui/assets/WorkflowManagerModule-DWFspC-o.js +1 -0
  1186. package/dist/ui/assets/antigravity-DRKQga2U.png +0 -0
  1187. package/dist/ui/assets/cursor-BM_3k4Y4.svg +1 -0
  1188. package/dist/ui/assets/gemini-cli-icon-dBAVjCcn.png +0 -0
  1189. package/dist/ui/assets/grok-BuodbWaG.svg +31 -0
  1190. package/dist/ui/assets/index-BUplSsv_.js +7 -0
  1191. package/dist/ui/assets/index-gz2EXuoK.css +1 -0
  1192. package/dist/ui/assets/{vendor-dnd-DRzYolkg.js → vendor-dnd-CJ-AjP-Y.js} +1 -1
  1193. package/dist/ui/assets/{vendor-icons-CLnehDTw.js → vendor-icons-BkFLXavV.js} +1 -1
  1194. package/dist/ui/assets/{vendor-markdown-BUxTU7dS.js → vendor-markdown-_lhNCyq-.js} +9 -9
  1195. package/dist/ui/assets/vendor-router-AqJMU8Lz.js +3 -0
  1196. package/dist/ui/assets/vscode-C_7wk1WI.svg +41 -0
  1197. package/dist/ui/branding/logos/logo_dark_bg.png +0 -0
  1198. package/dist/ui/branding/logos/logo_favicon_dark.png +0 -0
  1199. package/dist/ui/branding/logos/logo_favicon_dark.svg +56 -0
  1200. package/dist/ui/branding/logos/logo_favicon_light.png +0 -0
  1201. package/dist/ui/branding/logos/logo_light_bg.png +0 -0
  1202. package/dist/ui/images/Taskforce_Van.webp +0 -0
  1203. package/dist/ui/index.html +6 -6
  1204. package/dist/update/uiUpdateService.d.ts +43 -0
  1205. package/dist/update/uiUpdateService.js +149 -0
  1206. package/dist/update/updateCli.d.ts +15 -0
  1207. package/dist/update/updateCli.js +76 -0
  1208. package/dist/update/updateExecutor.d.ts +40 -0
  1209. package/dist/update/updateExecutor.js +474 -0
  1210. package/dist/update/updateStatus.d.ts +83 -0
  1211. package/dist/update/updateStatus.js +703 -0
  1212. package/dist/utils/aiProfileAvatarPaths.d.ts +14 -0
  1213. package/dist/utils/aiProfileAvatarPaths.js +52 -0
  1214. package/dist/utils/aiProfileDefaultLogo.d.ts +7 -0
  1215. package/dist/utils/aiProfileDefaultLogo.js +84 -0
  1216. package/dist/utils/aiProfileEvents.d.ts +9 -1
  1217. package/dist/utils/annotatedAttachments.d.ts +8 -0
  1218. package/dist/utils/annotatedAttachments.js +17 -1
  1219. package/dist/utils/assetTraySorting.d.ts +25 -0
  1220. package/dist/utils/assetTraySorting.js +83 -0
  1221. package/dist/utils/assignees.d.ts +5 -0
  1222. package/dist/utils/assignees.js +14 -9
  1223. package/dist/utils/authLogin.d.ts +10 -0
  1224. package/dist/utils/authLogin.js +8 -0
  1225. package/dist/utils/authSessionEvents.d.ts +2 -0
  1226. package/dist/utils/authSessionEvents.js +6 -0
  1227. package/dist/utils/avatarUpload.js +5 -5
  1228. package/dist/utils/canonicalReferenceAttachments.d.ts +12 -0
  1229. package/dist/utils/canonicalReferenceAttachments.js +42 -0
  1230. package/dist/utils/cloudAssetDisplay.d.ts +2 -0
  1231. package/dist/utils/cloudAssetDisplay.js +8 -0
  1232. package/dist/utils/constants.d.ts +4 -11
  1233. package/dist/utils/constants.js +6 -65
  1234. package/dist/utils/contextAttachmentPreview.d.ts +11 -0
  1235. package/dist/utils/contextAttachmentPreview.js +8 -0
  1236. package/dist/utils/contextAttachmentUpload.d.ts +10 -0
  1237. package/dist/utils/contextAttachmentUpload.js +151 -0
  1238. package/dist/utils/contextFiles.d.ts +1 -1
  1239. package/dist/utils/contextFiles.js +4 -4
  1240. package/dist/utils/documentNames.js +6 -4
  1241. package/dist/utils/entityReferences.d.ts +14 -0
  1242. package/dist/utils/entityReferences.js +21 -0
  1243. package/dist/utils/httpSetCookie.d.ts +3 -0
  1244. package/dist/utils/httpSetCookie.js +22 -0
  1245. package/dist/utils/imageNoteStoragePaths.d.ts +3 -0
  1246. package/dist/utils/imageNoteStoragePaths.js +19 -0
  1247. package/dist/utils/imageReferences.d.ts +6 -0
  1248. package/dist/utils/imageReferences.js +1 -0
  1249. package/dist/utils/planningArchiveOrchestrator.d.ts +23 -0
  1250. package/dist/utils/planningArchiveOrchestrator.js +37 -0
  1251. package/dist/utils/planningArchivePresentation.d.ts +20 -0
  1252. package/dist/utils/planningArchivePresentation.js +23 -0
  1253. package/dist/utils/planningArchiveReadiness.d.ts +26 -0
  1254. package/dist/utils/planningArchiveReadiness.js +30 -0
  1255. package/dist/utils/planningFavorites.d.ts +7 -0
  1256. package/dist/utils/planningFavorites.js +34 -0
  1257. package/dist/utils/syncEventPresentation.js +53 -0
  1258. package/dist/utils/syncStatusPresentation.d.ts +25 -0
  1259. package/dist/utils/syncStatusPresentation.js +86 -5
  1260. package/dist/utils/taskActivity.d.ts +9 -2
  1261. package/dist/utils/taskActivity.js +61 -0
  1262. package/dist/utils/taskDraftDefaults.d.ts +0 -8
  1263. package/dist/utils/taskDraftDefaults.js +0 -4
  1264. package/dist/utils/taskEvents.d.ts +11 -0
  1265. package/dist/utils/taskEvents.js +6 -0
  1266. package/dist/utils/taskHeaderQuickFilter.d.ts +14 -0
  1267. package/dist/utils/taskHeaderQuickFilter.js +32 -0
  1268. package/dist/utils/taskInvalidation.d.ts +23 -0
  1269. package/dist/utils/taskInvalidation.js +67 -0
  1270. package/dist/utils/taskNormalization.d.ts +2 -1
  1271. package/dist/utils/taskNormalization.js +44 -18
  1272. package/dist/utils/taskReferences.d.ts +16 -0
  1273. package/dist/utils/taskReferences.js +63 -0
  1274. package/dist/utils/taskforceAgentEvents.d.ts +8 -0
  1275. package/dist/utils/taskforceAgentEvents.js +6 -0
  1276. package/dist/utils/taskforceAgentSkillEvents.d.ts +7 -0
  1277. package/dist/utils/taskforceAgentSkillEvents.js +8 -0
  1278. package/dist/utils/uiNotice.d.ts +3 -0
  1279. package/dist/utils/uiNotice.js +1 -1
  1280. package/dist/utils/workspaceResourceEvents.d.ts +7 -0
  1281. package/dist/utils/workspaceResourceEvents.js +6 -0
  1282. package/dist/utils/workspaceSyncPresentation.d.ts +24 -0
  1283. package/dist/utils/workspaceSyncPresentation.js +243 -6
  1284. package/package.json +74 -21
  1285. package/dist/components/features/AgentsModule.d.ts +0 -18
  1286. package/dist/components/features/AgentsModule.js +0 -479
  1287. package/dist/components/features/InitiativesModule.d.ts +0 -22
  1288. package/dist/components/features/InitiativesModule.js +0 -33
  1289. package/dist/components/features/WorkflowsModule.d.ts +0 -27
  1290. package/dist/components/features/WorkflowsModule.js +0 -21
  1291. package/dist/components/features/settings/WorkflowEditor.d.ts +0 -15
  1292. package/dist/components/features/settings/WorkflowEditor.js +0 -245
  1293. package/dist/components/views/panels/DocumentFilterToolbar.d.ts +0 -10
  1294. package/dist/components/views/panels/DocumentFilterToolbar.js +0 -7
  1295. package/dist/components/views/standalone/modals/AccountHubModal.d.ts +0 -61
  1296. package/dist/components/views/standalone/modals/AccountHubModal.js +0 -108
  1297. package/dist/components/views/standalone/modals/EditProfileModal.d.ts +0 -19
  1298. package/dist/components/views/standalone/modals/EditProfileModal.js +0 -11
  1299. package/dist/hooks/ui/useResourceExport.d.ts +0 -21
  1300. package/dist/hooks/ui/useResourceExport.js +0 -87
  1301. package/dist/hooks/ui/useWorkflowTemplates.d.ts +0 -37
  1302. package/dist/hooks/ui/useWorkflowTemplates.js +0 -116
  1303. package/dist/mcp/clientProfileDefaults.d.ts +0 -12
  1304. package/dist/mcp/clientProfileDefaults.js +0 -41
  1305. package/dist/resources/templates/WORKFLOW_V2_POLICY.md +0 -55
  1306. package/dist/resources/templates/environments/aider.yaml +0 -14
  1307. package/dist/resources/templates/environments/antigravity.yaml +0 -10
  1308. package/dist/resources/templates/environments/claude.yaml +0 -10
  1309. package/dist/resources/templates/environments/cline.yaml +0 -10
  1310. package/dist/resources/templates/environments/codex.yaml +0 -13
  1311. package/dist/resources/templates/environments/copilot.yaml +0 -10
  1312. package/dist/resources/templates/environments/cursor.yaml +0 -9
  1313. package/dist/resources/templates/environments/gemini.yaml +0 -9
  1314. package/dist/resources/templates/environments/windsurf.yaml +0 -10
  1315. package/dist/resources/templates/workflow-sources/README.md +0 -9
  1316. package/dist/resources/templates/workflow-sources/workflowDocs.mjs +0 -530
  1317. package/dist/resources/templates/workflow-sources/workflowEditorOverrides.json +0 -1
  1318. package/dist/resources/templates/workflows/collaborate.yaml +0 -109
  1319. package/dist/resources/templates/workflows/do.yaml +0 -87
  1320. package/dist/resources/templates/workflows/evaluate.yaml +0 -116
  1321. package/dist/resources/templates/workflows/execute.yaml +0 -156
  1322. package/dist/resources/templates/workflows/plan.yaml +0 -118
  1323. package/dist/resources/templates/workflows/review.yaml +0 -114
  1324. package/dist/services/formatTransformers.d.ts +0 -29
  1325. package/dist/services/formatTransformers.js +0 -56
  1326. package/dist/services/templateEngine.d.ts +0 -46
  1327. package/dist/services/templateEngine.js +0 -148
  1328. package/dist/shared/workflowDefaults.d.ts +0 -9
  1329. package/dist/shared/workflowDefaults.js +0 -11
  1330. package/dist/ui/agent-logos/Gemini CLI.jpeg +0 -0
  1331. package/dist/ui/agent-logos/antigravity.jpeg +0 -0
  1332. package/dist/ui/agent-logos/chatgpt.png +0 -0
  1333. package/dist/ui/agent-logos/claude-code.jpeg +0 -0
  1334. package/dist/ui/agent-logos/codex.jpeg +0 -0
  1335. package/dist/ui/agent-logos/cursor.png +0 -0
  1336. package/dist/ui/agent-logos/openclaw.jpeg +0 -0
  1337. package/dist/ui/agent-logos/windsurf.png +0 -0
  1338. package/dist/ui/assets/AgentsModule-C4LcqhcZ.js +0 -1
  1339. package/dist/ui/assets/AnnotatedAttachmentWorkspace-B-Dq22d2.js +0 -3
  1340. package/dist/ui/assets/AnnotatedAttachmentWorkspace-BVKew-mH.css +0 -1
  1341. package/dist/ui/assets/ContextAttachmentManager-DsXPTvi-.js +0 -3
  1342. package/dist/ui/assets/DocumentWorkspace-CxA1wO3U.js +0 -252
  1343. package/dist/ui/assets/DocumentWorkspace-D4rJKXzd.css +0 -1
  1344. package/dist/ui/assets/EntityActivityTimeline-B8nSe8l3.js +0 -1
  1345. package/dist/ui/assets/EntityActivityTimeline-DyqvvhuF.css +0 -1
  1346. package/dist/ui/assets/InitiativesModule-VY95v38E.js +0 -1
  1347. package/dist/ui/assets/PlansPage-CQbKDv1a.js +0 -1
  1348. package/dist/ui/assets/PlansPage-DeAzWYTb.css +0 -1
  1349. package/dist/ui/assets/TaskContextUpload-DvDlNpHC.js +0 -1
  1350. package/dist/ui/assets/TaskSettings-CUWbYYtP.js +0 -12
  1351. package/dist/ui/assets/WorkflowsModule-CgM3Jako.js +0 -5
  1352. package/dist/ui/assets/documentReferences-Do9YjrS3.js +0 -1
  1353. package/dist/ui/assets/index--mh3pktj.js +0 -5
  1354. package/dist/ui/assets/index-BawaaEXS.css +0 -1
  1355. package/dist/ui/assets/vendor-router-BbWMxlnO.js +0 -3
  1356. package/dist/ui/branding/logos/logo_black_01.png +0 -0
  1357. package/dist/ui/branding/logos/logo_black_02.png +0 -0
  1358. package/dist/ui/branding/logos/logo_white_01.png +0 -0
  1359. package/dist/ui/branding/logos/logo_white_02.png +0 -0
  1360. package/scripts/generate-workflow-templates.mjs +0 -134
  1361. package/src/resources/templates/WORKFLOW_V2_POLICY.md +0 -55
  1362. package/src/resources/templates/environments/aider.yaml +0 -14
  1363. package/src/resources/templates/environments/antigravity.yaml +0 -10
  1364. package/src/resources/templates/environments/claude.yaml +0 -10
  1365. package/src/resources/templates/environments/cline.yaml +0 -10
  1366. package/src/resources/templates/environments/codex.yaml +0 -13
  1367. package/src/resources/templates/environments/copilot.yaml +0 -10
  1368. package/src/resources/templates/environments/cursor.yaml +0 -9
  1369. package/src/resources/templates/environments/gemini.yaml +0 -9
  1370. package/src/resources/templates/environments/windsurf.yaml +0 -10
  1371. package/src/resources/templates/workflow-sources/README.md +0 -9
  1372. package/src/resources/templates/workflow-sources/workflowDocs.mjs +0 -530
  1373. package/src/resources/templates/workflow-sources/workflowEditorOverrides.json +0 -1
  1374. package/src/resources/templates/workflows/collaborate.yaml +0 -109
  1375. package/src/resources/templates/workflows/do.yaml +0 -87
  1376. package/src/resources/templates/workflows/evaluate.yaml +0 -116
  1377. package/src/resources/templates/workflows/execute.yaml +0 -156
  1378. package/src/resources/templates/workflows/plan.yaml +0 -118
  1379. package/src/resources/templates/workflows/review.yaml +0 -114
  1380. /package/dist/ui/branding/logos/{logo_dark.svg → logo_dark_no_bg.svg} +0 -0
  1381. /package/dist/ui/branding/logos/{logo_favicon.svg → logo_favicon_light.svg} +0 -0
  1382. /package/dist/ui/branding/logos/{logo_light.svg → logo_light_no_bg.svg} +0 -0
@@ -44,24 +44,90 @@
44
44
  * POST /api/taskforce/types
45
45
  * GET /api/taskforce/priorities
46
46
  * POST /api/taskforce/priorities
47
- * GET /api/taskforce/approaches
48
- * POST /api/taskforce/approaches
49
47
  * GET /api/taskforce/taxonomies
50
48
  * POST /api/taskforce/taxonomies
51
49
  */
50
+ import { createHash, randomUUID } from 'crypto';
52
51
  import { TaskforceRuleError } from '../../core/Taskforce.js';
52
+ import { parseTaskRestoreDestination } from '../../shared/taskRestoreDestination.js';
53
+ import { buildUserGlobalSettingsUpdate } from '../../core/GlobalSettingsService.js';
53
54
  import { toPublicObjectStorageConfig } from '../../storage/objectStorage.js';
54
55
  import { getRuntimeCapabilities } from '../../runtime/capabilities.js';
55
56
  import { resolveBuildInfo } from '../buildInfo.js';
56
57
  import { resolveRealtimeSyncFlag } from '../../sync/realtimeFeature.js';
57
58
  import { parseJsonBody } from './primitives.js';
58
59
  import { resolveRequestAccess } from '../auth.js';
59
- import { getRouteTimingNow, logSlowBootstrapRoute, requestBootstrapTraceId, requestHeader, requestRuntimeMode, resolveErrorStatusCode, serializeJsonWithTiming, setServerTimingHeader } from './shared.js';
60
+ import { currentPerformanceTraceDiagnostics, getRouteTimingNow, logSlowBootstrapRoute, performanceTraceServerTimingMetrics, requestBootstrapTraceId, requestHeader, requestHumanActorRef, requestRuntimeMode, respondWithPerformanceTraceJson, resolveErrorStatusCode, runWithPerformanceTrace, serializeJsonWithTiming, setPerformanceTraceHeaders, setServerTimingHeader } from './shared.js';
60
61
  import { listBuiltInCustomTaxonomyLibraryPacks } from '../../shared/customTaxonomyLibrary.js';
61
- import { listBuiltInTaxonomyLibraryPacks } from '../../shared/taxonomyLibrary.js';
62
+ import { getBuiltInTaxonomyLibraryPack, listBuiltInTaxonomyLibraryPacks } from '../../shared/taxonomyLibrary.js';
62
63
  import { shouldUseProvisionalTaskReferences } from '../../utils/taskReferences.js';
64
+ import { createDurableTaxonomyMutationRouter } from '../../sync/v3/durableTaxonomyMutationRouter.js';
65
+ import { buildCanonicalTaxonomyStateMutation, } from '../../sync/v3/taxonomyStateMutation.js';
66
+ import { serializeTaxonomyStateForSync } from '../../sync/v3/taxonomySyncPayload.js';
67
+ import { createDurableInitiativeMutationRouter } from '../../sync/v3/durableInitiativeMutationRouter.js';
68
+ import { createDurableWorkstreamMutationRouter } from '../../sync/v3/durableWorkstreamMutationRouter.js';
69
+ import { createDurableWorkstreamTaskOrderMutationRouter } from '../../sync/v3/durableWorkstreamTaskOrderMutationRouter.js';
70
+ import { serializeCanonicalPlanningAttachmentLinks } from '../../sync/planningCanonicalFields.js';
71
+ import { createTaskHttpDurableRouters } from './durableTaskHttpRouters.js';
63
72
  // === SECTION: Module dependency interface ===
64
73
  const UI_STATE_MAX_JSON_BODY_BYTES = 50 * 1024 * 1024;
74
+ function normalizeDurableChecklistItems(input) {
75
+ const existingById = new Map((input.task.checklistItems || []).map((item) => [item.id, item]));
76
+ return input.items.map((raw, index) => {
77
+ const item = raw && typeof raw === 'object' ? raw : {};
78
+ const id = String(item.id || `checklist-${createHash('sha256').update(`${input.operationId}:${input.taskId}:${index}`).digest('hex').slice(0, 32)}`);
79
+ const existing = existingById.get(id);
80
+ const title = String(item.title || '').trim();
81
+ const isCompleted = item.isCompleted === true;
82
+ const order = Number.isFinite(Number(item.order)) ? Number(item.order) : index;
83
+ const unchanged = existing && existing.title === title
84
+ && existing.isCompleted === isCompleted && existing.order === order;
85
+ const createdAt = String(existing?.createdAt || item.createdAt || input.now);
86
+ return {
87
+ id,
88
+ taskId: input.taskId,
89
+ title,
90
+ isCompleted,
91
+ order,
92
+ createdAt,
93
+ updatedAt: String(unchanged ? existing.updatedAt : existing ? input.now : item.updatedAt || createdAt),
94
+ };
95
+ });
96
+ }
97
+ function normalizeDurableTaskAttachmentLinks(input) {
98
+ return input.attachments.map((raw, order) => {
99
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
100
+ throw new TaskforceRuleError('Each durable task attachment must include canonical asset metadata.', 400, 'TASK_ATTACHMENT_LINKS_INVALID');
101
+ }
102
+ const source = raw;
103
+ const assetId = String(source.assetId || '').trim();
104
+ if (!assetId) {
105
+ throw new TaskforceRuleError('Each durable task attachment must include assetId.', 400, 'TASK_ATTACHMENT_LINKS_INVALID');
106
+ }
107
+ const asset = input.core.getWorkspaceAssetStore().get(assetId, input.workspaceId);
108
+ const requestedRole = String(source.linkRole || '').trim();
109
+ const role = requestedRole === 'reference'
110
+ || requestedRole === 'image' || requestedRole === 'attachment'
111
+ ? requestedRole
112
+ : asset?.storageProvider === 'external'
113
+ ? 'reference'
114
+ : asset?.kind === 'image' ? 'image' : 'attachment';
115
+ return {
116
+ assetId,
117
+ role,
118
+ order,
119
+ ...(typeof source.caption === 'string' ? { caption: source.caption } : {}),
120
+ ...(typeof source.displayName === 'string' ? { displayName: source.displayName } : {}),
121
+ ...(typeof source.originalFilename === 'string' ? { originalFilename: source.originalFilename } : {}),
122
+ ...(source.referenceNumber === null || Number.isSafeInteger(source.referenceNumber)
123
+ ? { referenceNumber: source.referenceNumber }
124
+ : {}),
125
+ ...(source.referenceLabel === null || typeof source.referenceLabel === 'string'
126
+ ? { referenceLabel: source.referenceLabel }
127
+ : {}),
128
+ };
129
+ });
130
+ }
65
131
  function createUiStateRequestId() {
66
132
  return `ui-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
67
133
  }
@@ -69,9 +135,102 @@ function attachUiStateDebugHeaders(res, requestId) {
69
135
  res.setHeader('x-taskforce-ui-state-route', 'tasks');
70
136
  res.setHeader('x-taskforce-ui-state-request-id', requestId);
71
137
  }
138
+ function collectTopLevelKeys(value) {
139
+ if (!value || typeof value !== 'object' || Array.isArray(value))
140
+ return [];
141
+ return Object.keys(value).sort();
142
+ }
72
143
  // === SECTION: Registration ===
73
144
  export function registerTaskRoutes(deps) {
74
145
  const { addRoute, core, context, requestWorkspaceId, ensureAppAccess, resolveEffectiveObjectStorageConfig, buildBatchSummary, CLOUD_SAFE_CONFIG_PATHS, } = deps;
146
+ const mutateTaxonomyThroughDurableBoundary = (req, workspaceId, mutation, options) => {
147
+ const runtimeMode = context.authConfig?.runtimeMode === 'cloud' ? 'cloud' : requestRuntimeMode(req);
148
+ const router = createDurableTaxonomyMutationRouter({
149
+ core,
150
+ runtimeMode,
151
+ surface: 'http',
152
+ tenantId: core.getTenantId(),
153
+ workspaceId,
154
+ });
155
+ if (!router.enabled)
156
+ return null;
157
+ return router.mutateState(() => buildCanonicalTaxonomyStateMutation({
158
+ current: core.getTaxonomyState(workspaceId),
159
+ mutation,
160
+ }), options);
161
+ };
162
+ const writeTaxonomyMutationError = (res, error) => {
163
+ const statusCode = resolveErrorStatusCode(error, 400);
164
+ res.writeHead(statusCode, { 'Content-Type': 'application/json' });
165
+ res.end(JSON.stringify({
166
+ success: false,
167
+ error: error instanceof Error ? error.message : 'Taxonomy update failed.',
168
+ ...(error?.code ? { code: String(error.code) } : {}),
169
+ }));
170
+ };
171
+ const createInitiativeRouter = (req, workspaceId) => {
172
+ const runtimeMode = context.authConfig?.runtimeMode === 'cloud' ? 'cloud' : requestRuntimeMode(req);
173
+ const operationId = requestHeader(req, 'x-taskforce-operation-id', '').trim();
174
+ return createDurableInitiativeMutationRouter({
175
+ core,
176
+ runtimeMode,
177
+ surface: 'http',
178
+ tenantId: core.getTenantId(),
179
+ workspaceId,
180
+ actorRef: requestHumanActorRef(req),
181
+ cloudClientId: 'http-cloud',
182
+ ...(operationId ? { createOperationId: () => operationId } : {}),
183
+ });
184
+ };
185
+ const initiativeResult = (result) => (result.state === 'pending' ? result.provisionalInitiative : result.authoritativeInitiative);
186
+ const createWorkstreamRouter = (req, workspaceId) => {
187
+ const runtimeMode = context.authConfig?.runtimeMode === 'cloud' ? 'cloud' : requestRuntimeMode(req);
188
+ const operationId = requestHeader(req, 'x-taskforce-operation-id', '').trim();
189
+ return createDurableWorkstreamMutationRouter({
190
+ core,
191
+ runtimeMode,
192
+ surface: 'http',
193
+ tenantId: core.getTenantId(),
194
+ workspaceId,
195
+ actorRef: requestHumanActorRef(req),
196
+ cloudClientId: 'http-cloud',
197
+ ...(operationId ? { createOperationId: () => operationId } : {}),
198
+ });
199
+ };
200
+ const workstreamResult = (result) => (result.state === 'pending' ? result.provisionalWorkstream : result.authoritativeWorkstream);
201
+ const createTaskHttpRootRouter = (req, workspaceId, operationIdOverride, deferPostCommitNotification) => {
202
+ const routers = createTaskHttpDurableRouters({ core, context, req, workspaceId });
203
+ return operationIdOverride === undefined && !deferPostCommitNotification
204
+ ? routers.root
205
+ : routers.createRootRouter(operationIdOverride, deferPostCommitNotification);
206
+ };
207
+ const createTaskHttpBulkRouter = (req, workspaceId) => (createTaskHttpDurableRouters({ core, context, req, workspaceId }).bulk);
208
+ const writeInitiativeMutationError = (res, error, fallback) => {
209
+ const statusCode = resolveErrorStatusCode(error, 400);
210
+ res.writeHead(statusCode, { 'Content-Type': 'application/json' });
211
+ res.end(JSON.stringify({
212
+ error: error instanceof Error ? error.message : fallback,
213
+ ...(error?.code ? { code: String(error.code) } : {}),
214
+ }));
215
+ };
216
+ const writeWorkstreamMutationError = (res, error, fallback) => {
217
+ const statusCode = resolveErrorStatusCode(error, 400);
218
+ const retryAt = typeof error?.retryAt === 'string'
219
+ ? String(error.retryAt)
220
+ : null;
221
+ const retryAfterSeconds = retryAt && Number.isFinite(Date.parse(retryAt))
222
+ ? Math.max(0, Math.ceil((Date.parse(retryAt) - Date.now()) / 1_000))
223
+ : null;
224
+ res.writeHead(statusCode, {
225
+ 'Content-Type': 'application/json',
226
+ ...(retryAfterSeconds !== null ? { 'Retry-After': String(retryAfterSeconds) } : {}),
227
+ });
228
+ res.end(JSON.stringify({
229
+ error: error instanceof Error ? error.message : fallback,
230
+ ...(error?.code ? { code: String(error.code) } : {}),
231
+ ...(retryAt ? { retryAt } : {}),
232
+ }));
233
+ };
75
234
  // === SECTION: Config and settings ===
76
235
  // GET /api/taskforce/config - Get current configuration
77
236
  addRoute('GET', '/api/taskforce/config', async (req, res) => {
@@ -136,10 +295,17 @@ export function registerTaskRoutes(deps) {
136
295
  if (!ensureAppAccess(req, res))
137
296
  return;
138
297
  const body = await parseJsonBody(req);
298
+ const applied = buildUserGlobalSettingsUpdate(body);
299
+ const requestedKeys = collectTopLevelKeys(body);
300
+ const appliedKeys = collectTopLevelKeys(applied);
301
+ const droppedKeys = requestedKeys.filter((key) => !appliedKeys.includes(key));
302
+ if (droppedKeys.length > 0) {
303
+ console.warn('[Taskforce Settings] Dropped unsupported global settings keys', { droppedKeys });
304
+ }
139
305
  try {
140
- core.updateGlobalSettings(body);
306
+ core.updateGlobalSettings(applied);
141
307
  res.writeHead(200, { 'Content-Type': 'application/json' });
142
- res.end(JSON.stringify({ success: true }));
308
+ res.end(JSON.stringify({ success: true, applied, droppedKeys }));
143
309
  }
144
310
  catch {
145
311
  res.writeHead(500, { 'Content-Type': 'application/json' });
@@ -157,6 +323,7 @@ export function registerTaskRoutes(deps) {
157
323
  const runtimeHeader = String((req.headers['x-taskforce-runtime-mode'] || '')).toLowerCase();
158
324
  const isLocalRuntime = runtimeHeader === 'local';
159
325
  const allowCreate = body?.allowCreate === true;
326
+ const createIfMissing = isLocalRuntime && body?.createIfMissing === true;
160
327
  const explicitWorkspaceId = typeof body?.workspaceId === 'string'
161
328
  ? body.workspaceId.trim()
162
329
  : '';
@@ -164,14 +331,16 @@ export function registerTaskRoutes(deps) {
164
331
  const incomingWorkspaceId = String(explicitWorkspaceId
165
332
  || ((isLocalRuntime && allowCreate && !explicitWorkspaceId) ? '' : headerWorkspaceId)).trim() || 'default';
166
333
  try {
167
- const workspaceExists = Boolean(core.getWorkspaceProfile(incomingWorkspaceId));
334
+ const existingWorkspace = core.getWorkspaceProfile(incomingWorkspaceId);
335
+ const workspaceExists = Boolean(existingWorkspace);
168
336
  const authConfig = context.authConfig;
169
337
  const requestAccess = authConfig?.enabled
170
338
  ? resolveRequestAccess(req, authConfig)
171
339
  : null;
172
340
  const shouldCreateWorkspace = Boolean(name
173
341
  && (incomingWorkspaceId === 'default' || !workspaceExists)
174
- && (isLocalRuntime || allowCreate));
342
+ && (isLocalRuntime || allowCreate)
343
+ && (!createIfMissing || !workspaceExists));
175
344
  const workspace = shouldCreateWorkspace
176
345
  ? (!isLocalRuntime
177
346
  && requestAccess?.authenticated
@@ -190,7 +359,9 @@ export function registerTaskRoutes(deps) {
190
359
  description,
191
360
  slug
192
361
  }))
193
- : core.updateWorkspaceProfile(incomingWorkspaceId, { name, description, slug });
362
+ : (createIfMissing && existingWorkspace
363
+ ? existingWorkspace
364
+ : core.updateWorkspaceProfile(incomingWorkspaceId, { name, description, slug }));
194
365
  res.writeHead(200, { 'Content-Type': 'application/json' });
195
366
  res.end(JSON.stringify({ success: true, workspace }));
196
367
  }
@@ -254,9 +425,9 @@ export function registerTaskRoutes(deps) {
254
425
  : body?.state && typeof body.state === 'object'
255
426
  ? body.state
256
427
  : {};
257
- core.updateUiState(workspaceId, userId, { stateKey, patch });
428
+ const state = core.updateUiState(workspaceId, userId, { stateKey, patch });
258
429
  res.writeHead(200, { 'Content-Type': 'application/json' });
259
- res.end(JSON.stringify({ success: true }));
430
+ res.end(JSON.stringify({ success: true, state }));
260
431
  }
261
432
  catch (error) {
262
433
  const statusCode = resolveErrorStatusCode(error, 400);
@@ -294,17 +465,32 @@ export function registerTaskRoutes(deps) {
294
465
  if (!ensureAppAccess(req, res))
295
466
  return;
296
467
  const workspaceId = requestWorkspaceId(req);
297
- const data = core.listTasks(workspaceId);
468
+ respondWithPerformanceTraceJson({
469
+ req,
470
+ res,
471
+ route: '/api/taskforce/tasks',
472
+ workspaceId,
473
+ load: () => core.listTasks(workspaceId),
474
+ });
475
+ });
476
+ addRoute('GET', '/api/taskforce/task-relationships', async (req, res) => {
477
+ if (!ensureAppAccess(req, res))
478
+ return;
479
+ const workspaceId = requestWorkspaceId(req);
298
480
  res.writeHead(200, { 'Content-Type': 'application/json' });
299
- res.end(JSON.stringify(data));
481
+ res.end(JSON.stringify({ relationships: core.listTaskRelationshipsForSync(workspaceId) }));
300
482
  });
301
483
  const handleListDeletedTasks = async (req, res) => {
302
484
  if (!ensureAppAccess(req, res))
303
485
  return;
304
486
  const workspaceId = requestWorkspaceId(req);
305
- const data = core.listDeletedTasks(workspaceId);
306
- res.writeHead(200, { 'Content-Type': 'application/json' });
307
- res.end(JSON.stringify(data));
487
+ respondWithPerformanceTraceJson({
488
+ req,
489
+ res,
490
+ route: '/api/taskforce/deleted',
491
+ workspaceId,
492
+ load: () => core.listDeletedTasks(workspaceId),
493
+ });
308
494
  };
309
495
  // GET /api/taskforce/deleted - List deleted tasks
310
496
  addRoute('GET', '/api/taskforce/deleted', handleListDeletedTasks);
@@ -408,9 +594,10 @@ export function registerTaskRoutes(deps) {
408
594
  }
409
595
  try {
410
596
  const workspaceId = requestWorkspaceId(req);
411
- const task = core.createTask(taskInput, {
597
+ const durableRouter = createTaskHttpRootRouter(req, workspaceId);
598
+ const task = durableRouter.enabled ? durableRouter.create(taskInput) : core.createTask(taskInput, {
412
599
  workspaceId,
413
- actorRef: 'user',
600
+ actorRef: requestHumanActorRef(req),
414
601
  provisionalLocalReference: shouldUseProvisionalTaskReferences(requestRuntimeMode(req))
415
602
  });
416
603
  res.writeHead(201, { 'Content-Type': 'application/json' });
@@ -441,10 +628,84 @@ export function registerTaskRoutes(deps) {
441
628
  const updates = body && typeof body === 'object'
442
629
  ? Object.fromEntries(Object.entries(body).filter(([key]) => key !== 'saveSource'))
443
630
  : body;
444
- const updated = core.updateTask(params.id, updates, workspaceId, {
445
- actorRef: 'user',
446
- saveSource
447
- });
631
+ const durableRouters = createTaskHttpDurableRouters({ core, context, req, workspaceId });
632
+ const durableRouter = durableRouters.root;
633
+ const hasChecklist = Object.prototype.hasOwnProperty.call(updates || {}, 'checklistItems');
634
+ if (hasChecklist && !Array.isArray(updates.checklistItems)) {
635
+ throw new TaskforceRuleError('checklistItems must be an array.', 400, 'TASK_CHECKLIST_INVALID');
636
+ }
637
+ const hasAttachments = Object.prototype.hasOwnProperty.call(updates || {}, 'attachments');
638
+ if (hasAttachments && !Array.isArray(updates.attachments)) {
639
+ throw new TaskforceRuleError('attachments must be an array.', 400, 'TASK_ATTACHMENT_LINKS_INVALID');
640
+ }
641
+ const hasCardCover = Object.prototype.hasOwnProperty.call(updates || {}, 'cardCoverAssetId');
642
+ if (hasCardCover && updates.cardCoverAssetId !== null
643
+ && (typeof updates.cardCoverAssetId !== 'string' || !updates.cardCoverAssetId.trim())) {
644
+ throw new TaskforceRuleError('cardCoverAssetId must be a non-empty string or null.', 400, 'TASK_CARD_COVER_INVALID');
645
+ }
646
+ const checklistDurable = hasChecklist && durableRouters.checklist.enabled;
647
+ const attachmentLinksDurable = (hasAttachments || hasCardCover) && durableRouters.attachmentLinks.enabled;
648
+ const rawChecklistItems = hasChecklist ? updates.checklistItems : [];
649
+ const rawAttachments = hasAttachments
650
+ ? updates.attachments
651
+ : (core.getTask(params.id, workspaceId)?.attachments || []);
652
+ const remainingUpdates = checklistDurable || attachmentLinksDurable
653
+ ? Object.fromEntries(Object.entries(updates).filter(([key]) => (!(checklistDurable && key === 'checklistItems')
654
+ && !(attachmentLinksDurable && key === 'attachments')
655
+ && !(attachmentLinksDurable && key === 'cardCoverAssetId'))))
656
+ : updates;
657
+ let updated;
658
+ const durableTargetCount = Number(checklistDurable)
659
+ + Number(attachmentLinksDurable)
660
+ + Number(Object.keys(remainingUpdates).length > 0);
661
+ if (durableTargetCount > 1) {
662
+ const aggregate = durableRouters.bulk.updateFields([
663
+ { id: params.id, ...updates },
664
+ ], { saveSource, atomicItemFailures: true });
665
+ const failure = aggregate.errors[0];
666
+ if (failure) {
667
+ throw new TaskforceRuleError(failure.message, failure.statusCode, failure.code || 'TASK_UPDATE_FAILED', failure.details);
668
+ }
669
+ updated = core.getTask(params.id, workspaceId) || aggregate.results[0];
670
+ }
671
+ else {
672
+ updated = Object.keys(remainingUpdates || {}).length > 0
673
+ ? (durableRouter.enabled
674
+ ? durableRouter.update(params.id, remainingUpdates, saveSource)
675
+ : core.updateTask(params.id, remainingUpdates, workspaceId, {
676
+ actorRef: requestHumanActorRef(req),
677
+ saveSource,
678
+ }))
679
+ : core.getTask(params.id, workspaceId);
680
+ if (updated && checklistDurable) {
681
+ const checklistRouter = durableRouters.createChecklistRouter(durableRouters.deriveChildOperationId('task-patch-checklist', 0, params.id));
682
+ const checklistItems = normalizeDurableChecklistItems({
683
+ items: rawChecklistItems,
684
+ task: core.getTask(params.id, workspaceId) || updated,
685
+ taskId: params.id,
686
+ operationId: requestHeader(req, 'x-taskforce-operation-id', '').trim(),
687
+ now: new Date().toISOString(),
688
+ });
689
+ updated = checklistRouter.replace({ taskId: params.id, items: checklistItems }).task;
690
+ }
691
+ if (updated && attachmentLinksDurable) {
692
+ const attachmentLinksRouter = durableRouters.createAttachmentLinksRouter(durableRouters.deriveChildOperationId('task-patch-attachments', 0, params.id));
693
+ const links = normalizeDurableTaskAttachmentLinks({
694
+ attachments: rawAttachments,
695
+ core,
696
+ workspaceId,
697
+ });
698
+ updated = attachmentLinksRouter.replace({
699
+ taskId: params.id,
700
+ links,
701
+ ...(hasCardCover ? {
702
+ cardCoverAssetId: updates.cardCoverAssetId === null
703
+ ? null
704
+ : String(updates.cardCoverAssetId).trim(),
705
+ } : {}),
706
+ }).task;
707
+ }
708
+ }
448
709
  if (!updated) {
449
710
  res.writeHead(404, { 'Content-Type': 'application/json' });
450
711
  res.end(JSON.stringify({ error: 'Task not found' }));
@@ -456,8 +717,10 @@ export function registerTaskRoutes(deps) {
456
717
  catch (error) {
457
718
  const statusCode = resolveErrorStatusCode(error, 400);
458
719
  const message = error instanceof Error ? error.message : 'Failed to update task';
720
+ const errorCode = error instanceof TaskforceRuleError ? error.code : error?.code;
721
+ const errorDetails = error instanceof TaskforceRuleError ? error.details : error?.details;
459
722
  res.writeHead(statusCode, { 'Content-Type': 'application/json' });
460
- res.end(JSON.stringify({ error: message }));
723
+ res.end(JSON.stringify({ error: message, code: errorCode, details: errorDetails }));
461
724
  }
462
725
  });
463
726
  // GET /api/taskforce/task/:id/checklist - Read structured checklist items for one task
@@ -480,8 +743,11 @@ export function registerTaskRoutes(deps) {
480
743
  if (!ensureAppAccess(req, res))
481
744
  return;
482
745
  const body = await parseJsonBody(req);
483
- const items = Array.isArray(body?.items) ? body.items : [];
484
746
  try {
747
+ if (!Array.isArray(body?.items)) {
748
+ throw new TaskforceRuleError('Checklist items must be an array.', 400, 'TASK_CHECKLIST_INVALID');
749
+ }
750
+ const items = body.items;
485
751
  const workspaceId = requestWorkspaceId(req);
486
752
  const task = core.getTask(params.id, workspaceId);
487
753
  if (!task) {
@@ -489,15 +755,26 @@ export function registerTaskRoutes(deps) {
489
755
  res.end(JSON.stringify({ error: 'Task not found' }));
490
756
  return;
491
757
  }
492
- const updated = core.replaceChecklistItems(params.id, items, workspaceId);
758
+ const durableRouter = createTaskHttpDurableRouters({ core, context, req, workspaceId }).checklist;
759
+ const durableItems = durableRouter.enabled ? normalizeDurableChecklistItems({
760
+ items,
761
+ task,
762
+ taskId: params.id,
763
+ operationId: requestHeader(req, 'x-taskforce-operation-id', '').trim(),
764
+ now: new Date().toISOString(),
765
+ }) : items;
766
+ const updated = durableRouter.enabled
767
+ ? durableRouter.replace({ taskId: params.id, items: durableItems }).task.checklistItems || []
768
+ : core.replaceChecklistItems(params.id, items, workspaceId);
493
769
  res.writeHead(200, { 'Content-Type': 'application/json' });
494
770
  res.end(JSON.stringify(updated));
495
771
  }
496
772
  catch (error) {
497
773
  const statusCode = resolveErrorStatusCode(error, 400);
498
774
  const message = error instanceof Error ? error.message : 'Failed to update checklist';
775
+ const errorCode = error instanceof TaskforceRuleError ? error.code : error?.code;
499
776
  res.writeHead(statusCode, { 'Content-Type': 'application/json' });
500
- res.end(JSON.stringify({ error: message }));
777
+ res.end(JSON.stringify({ error: message, code: errorCode }));
501
778
  }
502
779
  });
503
780
  // GET /api/taskforce/initiatives - List initiatives
@@ -513,43 +790,53 @@ export function registerTaskRoutes(deps) {
513
790
  addRoute('GET', '/api/taskforce/planning/bootstrap', async (req, res) => {
514
791
  if (!ensureAppAccess(req, res))
515
792
  return;
516
- const startedAt = getRouteTimingNow();
517
- const workspaceId = requestWorkspaceId(req);
518
- const traceId = requestBootstrapTraceId(req);
519
- const diagnostics = {};
520
- const data = core.listPlanningBootstrap(workspaceId, diagnostics);
521
- const serializeStartedAt = getRouteTimingNow();
522
- const serialized = serializeJsonWithTiming(data, serializeStartedAt);
523
- const totalDurationMs = Math.max(0, getRouteTimingNow() - startedAt);
524
- const details = diagnostics;
525
- setServerTimingHeader(res, [
526
- { name: 'planning-bootstrap', durationMs: totalDurationMs },
527
- { name: 'planning-bootstrap-initiatives', durationMs: details.initiativeLoadMs ?? 0 },
528
- { name: 'planning-bootstrap-workstreams', durationMs: details.workstreamLoadMs ?? 0 },
529
- { name: 'planning-bootstrap-tasks', durationMs: details.taskSummaryQueryMs ?? 0 },
530
- { name: 'planning-bootstrap-build', durationMs: details.taskSummaryBuildMs ?? 0 },
531
- { name: 'planning-bootstrap-json', durationMs: serialized.durationMs },
532
- ]);
533
- logSlowBootstrapRoute({
534
- route: '/api/taskforce/planning/bootstrap',
535
- workspaceId,
536
- traceId,
537
- durationMs: totalDurationMs,
538
- details: {
539
- initiativeCount: details.initiativeCount ?? 0,
540
- workstreamCount: details.workstreamCount ?? 0,
541
- workstreamLinkedTaskCount: details.workstreamLinkedTaskCount ?? 0,
542
- workstreamTaskSummaryCount: details.workstreamTaskSummaryCount ?? 0,
543
- responseBytes: serialized.byteLength,
544
- initiativeLoadMs: details.initiativeLoadMs ?? 0,
545
- workstreamLoadMs: details.workstreamLoadMs ?? 0,
546
- taskSummaryQueryMs: details.taskSummaryQueryMs ?? 0,
547
- taskSummaryBuildMs: details.taskSummaryBuildMs ?? 0,
548
- jsonSerializeMs: serialized.durationMs,
549
- },
793
+ runWithPerformanceTrace(req, () => {
794
+ const startedAt = getRouteTimingNow();
795
+ const workspaceId = requestWorkspaceId(req);
796
+ const traceId = requestBootstrapTraceId(req);
797
+ const diagnostics = {};
798
+ const data = core.listPlanningBootstrap(workspaceId, diagnostics);
799
+ const serializeStartedAt = getRouteTimingNow();
800
+ const serialized = serializeJsonWithTiming(data, serializeStartedAt);
801
+ const totalDurationMs = Math.max(0, getRouteTimingNow() - startedAt);
802
+ const details = diagnostics;
803
+ const performanceDiagnostics = currentPerformanceTraceDiagnostics();
804
+ setServerTimingHeader(res, [
805
+ { name: 'planning-bootstrap', durationMs: totalDurationMs },
806
+ { name: 'planning-bootstrap-initiatives', durationMs: details.initiativeLoadMs ?? 0 },
807
+ { name: 'planning-bootstrap-workstreams', durationMs: details.workstreamLoadMs ?? 0 },
808
+ { name: 'planning-bootstrap-tasks', durationMs: details.taskSummaryQueryMs ?? 0 },
809
+ { name: 'planning-bootstrap-build', durationMs: details.taskSummaryBuildMs ?? 0 },
810
+ { name: 'planning-bootstrap-json', durationMs: serialized.durationMs },
811
+ ...performanceTraceServerTimingMetrics(performanceDiagnostics),
812
+ ]);
813
+ setPerformanceTraceHeaders(res, performanceDiagnostics, serialized.byteLength);
814
+ logSlowBootstrapRoute({
815
+ route: '/api/taskforce/planning/bootstrap',
816
+ workspaceId,
817
+ traceId,
818
+ durationMs: totalDurationMs,
819
+ details: {
820
+ initiativeCount: details.initiativeCount ?? 0,
821
+ workstreamCount: details.workstreamCount ?? 0,
822
+ workstreamLinkedTaskCount: details.workstreamLinkedTaskCount ?? 0,
823
+ workstreamTaskSummaryCount: details.workstreamTaskSummaryCount ?? 0,
824
+ responseBytes: serialized.byteLength,
825
+ initiativeLoadMs: details.initiativeLoadMs ?? 0,
826
+ workstreamLoadMs: details.workstreamLoadMs ?? 0,
827
+ taskSummaryQueryMs: details.taskSummaryQueryMs ?? 0,
828
+ taskSummaryBuildMs: details.taskSummaryBuildMs ?? 0,
829
+ jsonSerializeMs: serialized.durationMs,
830
+ ...(performanceDiagnostics ? {
831
+ postgresQueryCount: performanceDiagnostics.postgresQueryCount,
832
+ postgresWorkerCallCount: performanceDiagnostics.postgresWorkerCallCount,
833
+ postgresWorkerWaitMs: Math.round(performanceDiagnostics.postgresWorkerWaitMs),
834
+ } : {}),
835
+ },
836
+ });
837
+ res.writeHead(200, { 'Content-Type': 'application/json' });
838
+ res.end(serialized.body);
550
839
  });
551
- res.writeHead(200, { 'Content-Type': 'application/json' });
552
- res.end(serialized.body);
553
840
  });
554
841
  // POST /api/taskforce/initiative - Create initiative
555
842
  addRoute('POST', '/api/taskforce/initiative', async (req, res) => {
@@ -558,15 +845,50 @@ export function registerTaskRoutes(deps) {
558
845
  const body = await parseJsonBody(req);
559
846
  try {
560
847
  const workspaceId = requestWorkspaceId(req);
561
- const initiative = core.createInitiative(body || {}, workspaceId, { actorRef: 'user' });
848
+ const router = createInitiativeRouter(req, workspaceId);
849
+ const allowed = new Set(['id', 'title', 'description', 'ownerId', 'order', 'attachments', 'createdAt', 'icon', 'color']);
850
+ const unsupported = Object.keys(body || {}).filter((key) => !allowed.has(key));
851
+ if (router.enabled && unsupported.length > 0) {
852
+ const error = new Error(`Unsupported initiative fields: ${unsupported.sort().join(', ')}`);
853
+ error.code = 'INITIATIVE_MUTATION_INVALID';
854
+ error.statusCode = 400;
855
+ throw error;
856
+ }
857
+ if (router.enabled && (!String(body?.id || '').trim() || !String(body?.createdAt || '').trim())) {
858
+ const error = new Error('Activated initiative create requires stable id and createdAt fields.');
859
+ error.code = 'INITIATIVE_MUTATION_IDENTITY_REQUIRED';
860
+ error.statusCode = 400;
861
+ throw error;
862
+ }
863
+ const initiative = core.getDatabaseAdapter().transaction(() => {
864
+ const created = router.enabled
865
+ ? initiativeResult(router.create(String(body?.id || '').trim() || `initiative-${randomUUID()}`, {
866
+ title: body?.title,
867
+ description: body?.description ?? null,
868
+ ownerId: body?.ownerId ?? null,
869
+ order: body?.order ?? null,
870
+ attachments: serializeCanonicalPlanningAttachmentLinks(body?.attachments ?? []),
871
+ createdAt: String(body?.createdAt || '').trim() || new Date().toISOString(),
872
+ }))
873
+ : core.createInitiative(body || {}, workspaceId, { actorRef: requestHumanActorRef(req) });
874
+ if (!created)
875
+ throw new Error('Durable initiative capture did not return a provisional initiative.');
876
+ const hasIdentity = Object.prototype.hasOwnProperty.call(body || {}, 'icon')
877
+ || Object.prototype.hasOwnProperty.call(body || {}, 'color');
878
+ return hasIdentity
879
+ ? core.updatePlanningEntityIdentity('initiative', created.id, {
880
+ ...(Object.prototype.hasOwnProperty.call(body || {}, 'icon') ? { icon: body.icon } : {}),
881
+ ...(Object.prototype.hasOwnProperty.call(body || {}, 'color') ? { color: body.color } : {}),
882
+ }, workspaceId)
883
+ : created;
884
+ })();
885
+ if (!initiative)
886
+ throw new Error('Durable initiative capture did not return a provisional initiative.');
562
887
  res.writeHead(201, { 'Content-Type': 'application/json' });
563
888
  res.end(JSON.stringify(initiative));
564
889
  }
565
890
  catch (error) {
566
- const statusCode = resolveErrorStatusCode(error, 400);
567
- const message = error instanceof Error ? error.message : 'Failed to create initiative';
568
- res.writeHead(statusCode, { 'Content-Type': 'application/json' });
569
- res.end(JSON.stringify({ error: message }));
891
+ writeInitiativeMutationError(res, error, 'Failed to create initiative');
570
892
  }
571
893
  });
572
894
  // GET /api/taskforce/initiative/:id - Read one initiative
@@ -590,15 +912,55 @@ export function registerTaskRoutes(deps) {
590
912
  const body = await parseJsonBody(req);
591
913
  try {
592
914
  const workspaceId = requestWorkspaceId(req);
593
- const updated = core.updateInitiative(params.id, body || {}, workspaceId, { actorRef: 'user' });
915
+ const router = createInitiativeRouter(req, workspaceId);
916
+ const allowed = new Set(['title', 'description', 'ownerId', 'order', 'attachments']);
917
+ const unsupported = Object.keys(body || {}).filter((key) => !allowed.has(key));
918
+ if (router.enabled && unsupported.length > 0) {
919
+ const error = new Error(`Unsupported initiative fields: ${unsupported.sort().join(', ')}`);
920
+ error.code = 'INITIATIVE_MUTATION_INVALID';
921
+ error.statusCode = 400;
922
+ throw error;
923
+ }
924
+ const durablePatch = {
925
+ ...(body || {}),
926
+ ...(body && Object.prototype.hasOwnProperty.call(body, 'attachments')
927
+ ? { attachments: serializeCanonicalPlanningAttachmentLinks(body.attachments) }
928
+ : {}),
929
+ };
930
+ const updated = router.enabled
931
+ ? initiativeResult(router.updateMetadata(params.id, durablePatch))
932
+ : core.updateInitiative(params.id, body || {}, workspaceId, { actorRef: requestHumanActorRef(req) });
933
+ if (!updated)
934
+ throw new Error('Durable initiative capture did not return a provisional initiative.');
935
+ res.writeHead(200, { 'Content-Type': 'application/json' });
936
+ res.end(JSON.stringify(updated));
937
+ }
938
+ catch (error) {
939
+ writeInitiativeMutationError(res, error, 'Failed to update initiative');
940
+ }
941
+ });
942
+ addRoute('PATCH', '/api/taskforce/initiative/:id/identity', async (req, res, params) => {
943
+ if (!ensureAppAccess(req, res))
944
+ return;
945
+ const body = await parseJsonBody(req);
946
+ try {
947
+ const workspaceId = requestWorkspaceId(req);
948
+ const source = body && typeof body === 'object' && !Array.isArray(body) ? body : {};
949
+ const keys = Object.keys(source);
950
+ if (keys.length === 0 || keys.some((key) => key !== 'icon' && key !== 'color')) {
951
+ throw new TaskforceRuleError('Planning identity update must contain only icon or color.', 400, 'PLANNING_IDENTITY_INVALID');
952
+ }
953
+ const updated = core.updatePlanningEntityIdentity('initiative', params.id, source, workspaceId);
594
954
  res.writeHead(200, { 'Content-Type': 'application/json' });
595
955
  res.end(JSON.stringify(updated));
596
956
  }
597
957
  catch (error) {
598
958
  const statusCode = resolveErrorStatusCode(error, 400);
599
- const message = error instanceof Error ? error.message : 'Failed to update initiative';
600
959
  res.writeHead(statusCode, { 'Content-Type': 'application/json' });
601
- res.end(JSON.stringify({ error: message }));
960
+ res.end(JSON.stringify({
961
+ error: error instanceof Error ? error.message : 'Failed to update initiative identity',
962
+ code: error instanceof TaskforceRuleError ? error.code : undefined,
963
+ }));
602
964
  }
603
965
  });
604
966
  addRoute('POST', '/api/taskforce/initiative/:id/archive', async (req, res, params) => {
@@ -606,15 +968,17 @@ export function registerTaskRoutes(deps) {
606
968
  return;
607
969
  try {
608
970
  const workspaceId = requestWorkspaceId(req);
609
- const archived = core.archiveInitiative(params.id, workspaceId, { actorRef: 'user' });
971
+ const router = createInitiativeRouter(req, workspaceId);
972
+ const archived = router.enabled
973
+ ? initiativeResult(router.archive(params.id))
974
+ : core.archiveInitiative(params.id, workspaceId, { actorRef: requestHumanActorRef(req) });
975
+ if (!archived)
976
+ throw new Error('Durable initiative capture did not return a provisional initiative.');
610
977
  res.writeHead(200, { 'Content-Type': 'application/json' });
611
978
  res.end(JSON.stringify(archived));
612
979
  }
613
980
  catch (error) {
614
- const statusCode = resolveErrorStatusCode(error, 400);
615
- const message = error instanceof Error ? error.message : 'Failed to archive initiative';
616
- res.writeHead(statusCode, { 'Content-Type': 'application/json' });
617
- res.end(JSON.stringify({ error: message }));
981
+ writeInitiativeMutationError(res, error, 'Failed to archive initiative');
618
982
  }
619
983
  });
620
984
  addRoute('POST', '/api/taskforce/initiative/:id/unarchive', async (req, res, params) => {
@@ -622,15 +986,17 @@ export function registerTaskRoutes(deps) {
622
986
  return;
623
987
  try {
624
988
  const workspaceId = requestWorkspaceId(req);
625
- const restored = core.unarchiveInitiative(params.id, workspaceId, { actorRef: 'user' });
989
+ const router = createInitiativeRouter(req, workspaceId);
990
+ const restored = router.enabled
991
+ ? initiativeResult(router.unarchive(params.id))
992
+ : core.unarchiveInitiative(params.id, workspaceId, { actorRef: requestHumanActorRef(req) });
993
+ if (!restored)
994
+ throw new Error('Durable initiative capture did not return a provisional initiative.');
626
995
  res.writeHead(200, { 'Content-Type': 'application/json' });
627
996
  res.end(JSON.stringify(restored));
628
997
  }
629
998
  catch (error) {
630
- const statusCode = resolveErrorStatusCode(error, 400);
631
- const message = error instanceof Error ? error.message : 'Failed to unarchive initiative';
632
- res.writeHead(statusCode, { 'Content-Type': 'application/json' });
633
- res.end(JSON.stringify({ error: message }));
999
+ writeInitiativeMutationError(res, error, 'Failed to unarchive initiative');
634
1000
  }
635
1001
  });
636
1002
  // GET /api/taskforce/workstreams - List workstreams
@@ -649,15 +1015,51 @@ export function registerTaskRoutes(deps) {
649
1015
  const body = await parseJsonBody(req);
650
1016
  try {
651
1017
  const workspaceId = requestWorkspaceId(req);
652
- const workstream = core.createWorkstream(body || {}, workspaceId, { actorRef: 'user' });
1018
+ const router = createWorkstreamRouter(req, workspaceId);
1019
+ const allowed = new Set(['id', 'initiativeId', 'title', 'description', 'ownerId', 'order', 'attachments', 'createdAt', 'icon', 'color']);
1020
+ const unsupported = Object.keys(body || {}).filter((key) => !allowed.has(key));
1021
+ if (router.enabled && unsupported.length > 0) {
1022
+ const error = new Error(`Unsupported workstream fields: ${unsupported.sort().join(', ')}`);
1023
+ error.code = 'WORKSTREAM_MUTATION_INVALID';
1024
+ error.statusCode = 400;
1025
+ throw error;
1026
+ }
1027
+ if (router.enabled && (!String(body?.id || '').trim() || !String(body?.createdAt || '').trim())) {
1028
+ const error = new Error('Activated workstream create requires stable id and createdAt fields.');
1029
+ error.code = 'WORKSTREAM_MUTATION_IDENTITY_REQUIRED';
1030
+ error.statusCode = 400;
1031
+ throw error;
1032
+ }
1033
+ const workstream = core.getDatabaseAdapter().transaction(() => {
1034
+ const created = router.enabled
1035
+ ? workstreamResult(router.create(String(body?.id || '').trim(), {
1036
+ initiativeId: body?.initiativeId ?? null,
1037
+ title: body?.title,
1038
+ description: body?.description ?? null,
1039
+ ownerId: body?.ownerId ?? null,
1040
+ order: body?.order ?? null,
1041
+ attachments: serializeCanonicalPlanningAttachmentLinks(body?.attachments ?? []),
1042
+ createdAt: String(body?.createdAt || '').trim(),
1043
+ }))
1044
+ : core.createWorkstream(body || {}, workspaceId, { actorRef: requestHumanActorRef(req) });
1045
+ if (!created)
1046
+ throw new Error('Durable workstream capture did not return a provisional workstream.');
1047
+ const hasIdentity = Object.prototype.hasOwnProperty.call(body || {}, 'icon')
1048
+ || Object.prototype.hasOwnProperty.call(body || {}, 'color');
1049
+ return hasIdentity
1050
+ ? core.updatePlanningEntityIdentity('workstream', created.id, {
1051
+ ...(Object.prototype.hasOwnProperty.call(body || {}, 'icon') ? { icon: body.icon } : {}),
1052
+ ...(Object.prototype.hasOwnProperty.call(body || {}, 'color') ? { color: body.color } : {}),
1053
+ }, workspaceId)
1054
+ : created;
1055
+ })();
1056
+ if (!workstream)
1057
+ throw new Error('Durable workstream capture did not return a provisional workstream.');
653
1058
  res.writeHead(201, { 'Content-Type': 'application/json' });
654
1059
  res.end(JSON.stringify(workstream));
655
1060
  }
656
1061
  catch (error) {
657
- const statusCode = resolveErrorStatusCode(error, 400);
658
- const message = error instanceof Error ? error.message : 'Failed to create workstream';
659
- res.writeHead(statusCode, { 'Content-Type': 'application/json' });
660
- res.end(JSON.stringify({ error: message }));
1062
+ writeWorkstreamMutationError(res, error, 'Failed to create workstream');
661
1063
  }
662
1064
  });
663
1065
  // GET /api/taskforce/workstream/:id - Read one workstream
@@ -681,15 +1083,55 @@ export function registerTaskRoutes(deps) {
681
1083
  const body = await parseJsonBody(req);
682
1084
  try {
683
1085
  const workspaceId = requestWorkspaceId(req);
684
- const updated = core.updateWorkstream(params.id, body || {}, workspaceId, { actorRef: 'user' });
1086
+ const router = createWorkstreamRouter(req, workspaceId);
1087
+ const allowed = new Set(['initiativeId', 'title', 'description', 'ownerId', 'order', 'attachments']);
1088
+ const unsupported = Object.keys(body || {}).filter((key) => !allowed.has(key));
1089
+ if (router.enabled && unsupported.length > 0) {
1090
+ const error = new Error(`Unsupported workstream fields: ${unsupported.sort().join(', ')}`);
1091
+ error.code = 'WORKSTREAM_MUTATION_INVALID';
1092
+ error.statusCode = 400;
1093
+ throw error;
1094
+ }
1095
+ const durablePatch = {
1096
+ ...(body || {}),
1097
+ ...(body && Object.prototype.hasOwnProperty.call(body, 'attachments')
1098
+ ? { attachments: serializeCanonicalPlanningAttachmentLinks(body.attachments) }
1099
+ : {}),
1100
+ };
1101
+ const updated = router.enabled
1102
+ ? workstreamResult(router.updateMetadata(params.id, durablePatch))
1103
+ : core.updateWorkstream(params.id, body || {}, workspaceId, { actorRef: requestHumanActorRef(req) });
1104
+ if (!updated)
1105
+ throw new Error('Durable workstream capture did not return a provisional workstream.');
1106
+ res.writeHead(200, { 'Content-Type': 'application/json' });
1107
+ res.end(JSON.stringify(updated));
1108
+ }
1109
+ catch (error) {
1110
+ writeWorkstreamMutationError(res, error, 'Failed to update workstream');
1111
+ }
1112
+ });
1113
+ addRoute('PATCH', '/api/taskforce/workstream/:id/identity', async (req, res, params) => {
1114
+ if (!ensureAppAccess(req, res))
1115
+ return;
1116
+ const body = await parseJsonBody(req);
1117
+ try {
1118
+ const workspaceId = requestWorkspaceId(req);
1119
+ const source = body && typeof body === 'object' && !Array.isArray(body) ? body : {};
1120
+ const keys = Object.keys(source);
1121
+ if (keys.length === 0 || keys.some((key) => key !== 'icon' && key !== 'color')) {
1122
+ throw new TaskforceRuleError('Planning identity update must contain only icon or color.', 400, 'PLANNING_IDENTITY_INVALID');
1123
+ }
1124
+ const updated = core.updatePlanningEntityIdentity('workstream', params.id, source, workspaceId);
685
1125
  res.writeHead(200, { 'Content-Type': 'application/json' });
686
1126
  res.end(JSON.stringify(updated));
687
1127
  }
688
1128
  catch (error) {
689
1129
  const statusCode = resolveErrorStatusCode(error, 400);
690
- const message = error instanceof Error ? error.message : 'Failed to update workstream';
691
1130
  res.writeHead(statusCode, { 'Content-Type': 'application/json' });
692
- res.end(JSON.stringify({ error: message }));
1131
+ res.end(JSON.stringify({
1132
+ error: error instanceof Error ? error.message : 'Failed to update workstream identity',
1133
+ code: error instanceof TaskforceRuleError ? error.code : undefined,
1134
+ }));
693
1135
  }
694
1136
  });
695
1137
  addRoute('POST', '/api/taskforce/workstream/:id/archive', async (req, res, params) => {
@@ -697,15 +1139,17 @@ export function registerTaskRoutes(deps) {
697
1139
  return;
698
1140
  try {
699
1141
  const workspaceId = requestWorkspaceId(req);
700
- const archived = core.archiveWorkstream(params.id, workspaceId, { actorRef: 'user' });
1142
+ const router = createWorkstreamRouter(req, workspaceId);
1143
+ const archived = router.enabled
1144
+ ? workstreamResult(router.archive(params.id))
1145
+ : core.archiveWorkstream(params.id, workspaceId, { actorRef: requestHumanActorRef(req) });
1146
+ if (!archived)
1147
+ throw new Error('Durable workstream capture did not return a provisional workstream.');
701
1148
  res.writeHead(200, { 'Content-Type': 'application/json' });
702
1149
  res.end(JSON.stringify(archived));
703
1150
  }
704
1151
  catch (error) {
705
- const statusCode = resolveErrorStatusCode(error, 400);
706
- const message = error instanceof Error ? error.message : 'Failed to archive workstream';
707
- res.writeHead(statusCode, { 'Content-Type': 'application/json' });
708
- res.end(JSON.stringify({ error: message }));
1152
+ writeWorkstreamMutationError(res, error, 'Failed to archive workstream');
709
1153
  }
710
1154
  });
711
1155
  addRoute('POST', '/api/taskforce/workstream/:id/unarchive', async (req, res, params) => {
@@ -713,15 +1157,56 @@ export function registerTaskRoutes(deps) {
713
1157
  return;
714
1158
  try {
715
1159
  const workspaceId = requestWorkspaceId(req);
716
- const restored = core.unarchiveWorkstream(params.id, workspaceId, { actorRef: 'user' });
1160
+ const router = createWorkstreamRouter(req, workspaceId);
1161
+ const restored = router.enabled
1162
+ ? workstreamResult(router.unarchive(params.id))
1163
+ : core.unarchiveWorkstream(params.id, workspaceId, { actorRef: requestHumanActorRef(req) });
1164
+ if (!restored)
1165
+ throw new Error('Durable workstream capture did not return a provisional workstream.');
717
1166
  res.writeHead(200, { 'Content-Type': 'application/json' });
718
1167
  res.end(JSON.stringify(restored));
719
1168
  }
720
1169
  catch (error) {
721
- const statusCode = resolveErrorStatusCode(error, 400);
722
- const message = error instanceof Error ? error.message : 'Failed to unarchive workstream';
723
- res.writeHead(statusCode, { 'Content-Type': 'application/json' });
724
- res.end(JSON.stringify({ error: message }));
1170
+ writeWorkstreamMutationError(res, error, 'Failed to unarchive workstream');
1171
+ }
1172
+ });
1173
+ addRoute('POST', '/api/taskforce/workstream/:id/task-order', async (req, res, params) => {
1174
+ if (!ensureAppAccess(req, res))
1175
+ return;
1176
+ const body = await parseJsonBody(req);
1177
+ try {
1178
+ const workspaceId = requestWorkspaceId(req);
1179
+ if (!Array.isArray(body?.taskIds)) {
1180
+ const error = new Error('taskIds must be an array.');
1181
+ error.code = 'WORKSTREAM_TASK_ORDER_INVALID';
1182
+ error.statusCode = 400;
1183
+ throw error;
1184
+ }
1185
+ const runtimeMode = context.authConfig?.runtimeMode === 'cloud' ? 'cloud' : requestRuntimeMode(req);
1186
+ const operationId = requestHeader(req, 'x-taskforce-operation-id', '').trim();
1187
+ const router = createDurableWorkstreamTaskOrderMutationRouter({
1188
+ core,
1189
+ runtimeMode,
1190
+ tenantId: core.getTenantId(),
1191
+ workspaceId,
1192
+ cloudClientId: 'http-cloud',
1193
+ ...(operationId ? { operationId } : {}),
1194
+ });
1195
+ const taskIds = body.taskIds.map((value) => String(value || '').trim());
1196
+ let orderedTaskIds;
1197
+ if (router.enabled) {
1198
+ orderedTaskIds = router.replace(params.id, taskIds).taskIds;
1199
+ }
1200
+ else {
1201
+ orderedTaskIds = core.replaceWorkstreamTaskOrder(params.id, taskIds, workspaceId)
1202
+ .map((task) => task.id);
1203
+ core.notifyDurableTaskBatchCommitted(workspaceId, orderedTaskIds);
1204
+ }
1205
+ res.writeHead(200, { 'Content-Type': 'application/json' });
1206
+ res.end(JSON.stringify({ success: true, workstreamId: params.id, taskIds: orderedTaskIds }));
1207
+ }
1208
+ catch (error) {
1209
+ writeWorkstreamMutationError(res, error, 'Failed to reorder workstream tasks');
725
1210
  }
726
1211
  });
727
1212
  // PATCH /api/taskforce/task/:id/schedule - Update schedule fields for one task
@@ -731,10 +1216,19 @@ export function registerTaskRoutes(deps) {
731
1216
  const body = await parseJsonBody(req);
732
1217
  try {
733
1218
  const workspaceId = requestWorkspaceId(req);
734
- const result = core.updateTaskSchedule(params.id, {
735
- scheduledDate: body?.scheduledDate ?? null,
736
- orderInDay: body?.orderInDay
737
- }, workspaceId);
1219
+ const durableRouter = createTaskHttpRootRouter(req, workspaceId);
1220
+ const result = durableRouter.enabled
1221
+ ? (() => {
1222
+ const task = durableRouter.update(params.id, {
1223
+ scheduledDate: body?.scheduledDate ?? null,
1224
+ orderInDay: body?.orderInDay,
1225
+ }, 'manual', 'task-schedule-changed');
1226
+ return { task, warnings: core.getTaskSchedulingWarnings(task) };
1227
+ })()
1228
+ : core.updateTaskSchedule(params.id, {
1229
+ scheduledDate: body?.scheduledDate ?? null,
1230
+ orderInDay: body?.orderInDay
1231
+ }, workspaceId);
738
1232
  if (!result) {
739
1233
  res.writeHead(404, { 'Content-Type': 'application/json' });
740
1234
  res.end(JSON.stringify({ error: 'Task not found' }));
@@ -760,7 +1254,21 @@ export function registerTaskRoutes(deps) {
760
1254
  try {
761
1255
  const moves = Array.isArray(body?.moves) ? body.moves : [];
762
1256
  const workspaceId = requestWorkspaceId(req);
763
- const result = core.reorderScheduledTasks(moves, workspaceId);
1257
+ const durableRouters = createTaskHttpDurableRouters({ core, context, req, workspaceId });
1258
+ const rootRouter = durableRouters.root;
1259
+ const result = rootRouter.enabled
1260
+ ? rootRouter.runBatch('schedule/reorder', { moves }, () => (moves.reduce((aggregate, move, index) => {
1261
+ const taskId = String(move?.id || '').trim();
1262
+ const router = durableRouters.createRootRouter(durableRouters.deriveChildOperationId('schedule/reorder', index, taskId));
1263
+ const task = router.update(taskId, {
1264
+ scheduledDate: move?.scheduledDate ?? null,
1265
+ orderInDay: move?.orderInDay,
1266
+ }, 'manual', 'task-schedule-changed');
1267
+ aggregate.tasks.push(task);
1268
+ aggregate.warnings.push(...core.getTaskSchedulingWarnings(task));
1269
+ return aggregate;
1270
+ }, { tasks: [], warnings: [] })))
1271
+ : core.reorderScheduledTasks(moves, workspaceId);
764
1272
  res.writeHead(200, { 'Content-Type': 'application/json' });
765
1273
  res.end(JSON.stringify(result));
766
1274
  }
@@ -778,9 +1286,13 @@ export function registerTaskRoutes(deps) {
778
1286
  if (!ensureAppAccess(req, res))
779
1287
  return;
780
1288
  const workspaceId = requestWorkspaceId(req);
781
- const data = core.listArchive(workspaceId);
782
- res.writeHead(200, { 'Content-Type': 'application/json' });
783
- res.end(JSON.stringify(data));
1289
+ respondWithPerformanceTraceJson({
1290
+ req,
1291
+ res,
1292
+ route: '/api/taskforce/archive',
1293
+ workspaceId,
1294
+ load: () => core.listArchive(workspaceId),
1295
+ });
784
1296
  });
785
1297
  // POST /api/taskforce/task/:id/complete - Archive as complete
786
1298
  addRoute('POST', '/api/taskforce/task/:id/complete', async (req, res, params) => {
@@ -788,7 +1300,10 @@ export function registerTaskRoutes(deps) {
788
1300
  return;
789
1301
  try {
790
1302
  const workspaceId = requestWorkspaceId(req);
791
- const archived = core.archiveTask(params.id, false, undefined, workspaceId, { actorRef: 'user' });
1303
+ const durableRouter = createTaskHttpRootRouter(req, workspaceId);
1304
+ const archived = durableRouter.enabled
1305
+ ? durableRouter.archive(params.id, false, null)
1306
+ : core.archiveTask(params.id, false, undefined, workspaceId, { actorRef: requestHumanActorRef(req) });
792
1307
  if (!archived) {
793
1308
  res.writeHead(404, { 'Content-Type': 'application/json' });
794
1309
  res.end(JSON.stringify({ error: 'Task not found' }));
@@ -800,8 +1315,9 @@ export function registerTaskRoutes(deps) {
800
1315
  catch (error) {
801
1316
  const statusCode = resolveErrorStatusCode(error, 400);
802
1317
  const message = error instanceof Error ? error.message : 'Failed to archive task';
1318
+ const errorCode = error?.code;
803
1319
  res.writeHead(statusCode, { 'Content-Type': 'application/json' });
804
- res.end(JSON.stringify({ error: message }));
1320
+ res.end(JSON.stringify({ error: message, code: errorCode }));
805
1321
  }
806
1322
  });
807
1323
  // POST /api/taskforce/task/:id/cancel - Archive as cancelled
@@ -812,7 +1328,10 @@ export function registerTaskRoutes(deps) {
812
1328
  const reason = body.reason || 'Cancelled';
813
1329
  try {
814
1330
  const workspaceId = requestWorkspaceId(req);
815
- const archived = core.archiveTask(params.id, true, reason, workspaceId, { actorRef: 'user' });
1331
+ const durableRouter = createTaskHttpRootRouter(req, workspaceId);
1332
+ const archived = durableRouter.enabled
1333
+ ? durableRouter.archive(params.id, true, reason)
1334
+ : core.archiveTask(params.id, true, reason, workspaceId, { actorRef: requestHumanActorRef(req) });
816
1335
  if (!archived) {
817
1336
  res.writeHead(404, { 'Content-Type': 'application/json' });
818
1337
  res.end(JSON.stringify({ error: 'Task not found' }));
@@ -824,8 +1343,9 @@ export function registerTaskRoutes(deps) {
824
1343
  catch (error) {
825
1344
  const statusCode = resolveErrorStatusCode(error, 400);
826
1345
  const message = error instanceof Error ? error.message : 'Failed to cancel task';
1346
+ const errorCode = error?.code;
827
1347
  res.writeHead(statusCode, { 'Content-Type': 'application/json' });
828
- res.end(JSON.stringify({ error: message }));
1348
+ res.end(JSON.stringify({ error: message, code: errorCode }));
829
1349
  }
830
1350
  });
831
1351
  // DELETE /api/taskforce/task/:id - Delete a task
@@ -834,7 +1354,10 @@ export function registerTaskRoutes(deps) {
834
1354
  return;
835
1355
  try {
836
1356
  const workspaceId = requestWorkspaceId(req);
837
- const deleted = core.softDeleteTask(params.id, workspaceId, { actorRef: 'user', source: 'ui' });
1357
+ const durableRouter = createTaskHttpRootRouter(req, workspaceId);
1358
+ const deleted = durableRouter.enabled
1359
+ ? durableRouter.delete(params.id)
1360
+ : core.softDeleteTask(params.id, workspaceId, { actorRef: requestHumanActorRef(req), source: 'ui' });
838
1361
  if (!deleted) {
839
1362
  res.writeHead(404, { 'Content-Type': 'application/json' });
840
1363
  res.end(JSON.stringify({ error: 'Task not found' }));
@@ -846,8 +1369,9 @@ export function registerTaskRoutes(deps) {
846
1369
  catch (error) {
847
1370
  const statusCode = resolveErrorStatusCode(error, 400);
848
1371
  const message = error instanceof Error ? error.message : 'Failed to delete task';
1372
+ const errorCode = error?.code;
849
1373
  res.writeHead(statusCode, { 'Content-Type': 'application/json' });
850
- res.end(JSON.stringify({ error: message }));
1374
+ res.end(JSON.stringify({ error: message, code: errorCode }));
851
1375
  }
852
1376
  });
853
1377
  const handleRestoreDeletedTaskRoute = async (req, res, params) => {
@@ -855,7 +1379,10 @@ export function registerTaskRoutes(deps) {
855
1379
  return;
856
1380
  try {
857
1381
  const workspaceId = requestWorkspaceId(req);
858
- const restored = core.restoreDeletedTask(params.id, workspaceId, { actorRef: 'user' });
1382
+ const durableRouter = createTaskHttpRootRouter(req, workspaceId);
1383
+ const restored = durableRouter.enabled
1384
+ ? durableRouter.restore(params.id)
1385
+ : core.restoreDeletedTask(params.id, workspaceId, { actorRef: requestHumanActorRef(req) });
859
1386
  if (!restored) {
860
1387
  res.writeHead(404, { 'Content-Type': 'application/json' });
861
1388
  res.end(JSON.stringify({ error: 'Deleted task not found' }));
@@ -875,6 +1402,136 @@ export function registerTaskRoutes(deps) {
875
1402
  // POST /api/taskforce/deleted/:id/restore - Restore a deleted task
876
1403
  addRoute('POST', '/api/taskforce/deleted/:id/restore', handleRestoreDeletedTaskRoute);
877
1404
  addRoute('POST', '/api/taskforce/trash/:id/restore', handleRestoreDeletedTaskRoute);
1405
+ const handleRestoreDeletedTaskBatch = async (req, res) => {
1406
+ if (!ensureAppAccess(req, res))
1407
+ return;
1408
+ const body = await parseJsonBody(req);
1409
+ if (!Array.isArray(body.ids) || body.ids.length === 0) {
1410
+ res.writeHead(400, { 'Content-Type': 'application/json' });
1411
+ res.end(JSON.stringify({
1412
+ error: 'ids must be a non-empty array of deleted record ids.',
1413
+ code: 'DELETED_TASK_RESTORE_BATCH_INVALID',
1414
+ }));
1415
+ return;
1416
+ }
1417
+ if (body.ids.length > 100) {
1418
+ res.writeHead(400, { 'Content-Type': 'application/json' });
1419
+ res.end(JSON.stringify({
1420
+ error: 'A maximum of 100 deleted tasks can be restored per request.',
1421
+ code: 'DELETED_TASK_RESTORE_BATCH_LIMIT',
1422
+ }));
1423
+ return;
1424
+ }
1425
+ if (body.ids.some((value) => typeof value !== 'string' || !value.trim())) {
1426
+ res.writeHead(400, { 'Content-Type': 'application/json' });
1427
+ res.end(JSON.stringify({
1428
+ error: 'ids must contain unique, non-empty deleted record ids.',
1429
+ code: 'DELETED_TASK_RESTORE_BATCH_INVALID',
1430
+ }));
1431
+ return;
1432
+ }
1433
+ const ids = body.ids.map((value) => value.trim());
1434
+ if (new Set(ids).size !== ids.length) {
1435
+ res.writeHead(400, { 'Content-Type': 'application/json' });
1436
+ res.end(JSON.stringify({
1437
+ error: 'ids must contain unique, non-empty deleted record ids.',
1438
+ code: 'DELETED_TASK_RESTORE_BATCH_INVALID',
1439
+ }));
1440
+ return;
1441
+ }
1442
+ const restoreDestination = parseTaskRestoreDestination(body.restoreDestination);
1443
+ if (!restoreDestination) {
1444
+ res.writeHead(400, { 'Content-Type': 'application/json' });
1445
+ res.end(JSON.stringify({
1446
+ error: 'restoreDestination must be previous or archive.',
1447
+ code: 'DELETED_TASK_RESTORE_DESTINATION_INVALID',
1448
+ }));
1449
+ return;
1450
+ }
1451
+ const workspaceId = requestWorkspaceId(req);
1452
+ const durableRouters = createTaskHttpDurableRouters({ core, context, req, workspaceId });
1453
+ let result;
1454
+ try {
1455
+ result = durableRouters.root.enabled
1456
+ ? createTaskHttpBulkRouter(req, workspaceId).restoreDeleted(ids, restoreDestination)
1457
+ : (() => {
1458
+ const restored = [];
1459
+ const errors = [];
1460
+ for (let index = 0; index < ids.length; index += 1) {
1461
+ const deletedRecordId = ids[index];
1462
+ try {
1463
+ const deleted = core.getDeletedTask(deletedRecordId, workspaceId);
1464
+ if (!deleted || deleted.id !== deletedRecordId) {
1465
+ errors.push({
1466
+ index,
1467
+ id: deletedRecordId,
1468
+ message: 'Deleted task not found.',
1469
+ statusCode: 404,
1470
+ code: 'DELETED_TASK_NOT_FOUND',
1471
+ });
1472
+ continue;
1473
+ }
1474
+ const task = core.restoreDeletedTask(deletedRecordId, workspaceId, {
1475
+ actorRef: requestHumanActorRef(req),
1476
+ restoreDestination,
1477
+ });
1478
+ if (!task) {
1479
+ errors.push({
1480
+ index,
1481
+ id: deletedRecordId,
1482
+ message: 'Deleted task not found.',
1483
+ statusCode: 404,
1484
+ code: 'DELETED_TASK_NOT_FOUND',
1485
+ });
1486
+ continue;
1487
+ }
1488
+ restored.push({
1489
+ deletedRecordId,
1490
+ taskId: task.id,
1491
+ task,
1492
+ restoredTo: task.isArchived === true ? 'archived' : 'active',
1493
+ });
1494
+ }
1495
+ catch (error) {
1496
+ errors.push({
1497
+ index,
1498
+ id: deletedRecordId,
1499
+ message: error instanceof Error ? error.message : 'Failed to restore deleted task.',
1500
+ statusCode: resolveErrorStatusCode(error, 400),
1501
+ code: error instanceof TaskforceRuleError ? error.code : error?.code,
1502
+ });
1503
+ }
1504
+ }
1505
+ return { restored, errors };
1506
+ })();
1507
+ }
1508
+ catch (error) {
1509
+ const statusCode = resolveErrorStatusCode(error, 400);
1510
+ res.writeHead(statusCode, { 'Content-Type': 'application/json' });
1511
+ res.end(JSON.stringify({
1512
+ error: error instanceof Error ? error.message : 'Failed to restore deleted tasks.',
1513
+ code: error?.code,
1514
+ }));
1515
+ return;
1516
+ }
1517
+ const archivedCount = result.restored.filter((item) => item.restoredTo === 'archived').length;
1518
+ const activeCount = result.restored.length - archivedCount;
1519
+ res.writeHead(200, { 'Content-Type': 'application/json' });
1520
+ res.end(JSON.stringify({
1521
+ success: result.errors.length === 0,
1522
+ summary: {
1523
+ requested: ids.length,
1524
+ succeeded: result.restored.length,
1525
+ failed: result.errors.length,
1526
+ restoredToArchived: archivedCount,
1527
+ restoredToActive: activeCount,
1528
+ },
1529
+ results: result.restored,
1530
+ errors: result.errors,
1531
+ }));
1532
+ };
1533
+ addRoute('POST', '/api/taskforce/deleted/restore-batch', handleRestoreDeletedTaskBatch);
1534
+ addRoute('POST', '/api/taskforce/trash/restore-batch', handleRestoreDeletedTaskBatch);
878
1535
  const handlePermanentlyDeleteDeletedTaskRoute = async (req, res, params) => {
879
1536
  if (!ensureAppAccess(req, res))
880
1537
  return;
@@ -922,36 +1579,86 @@ export function registerTaskRoutes(deps) {
922
1579
  addRoute('POST', '/api/taskforce/task/:id/comment', async (req, res, params) => {
923
1580
  if (!ensureAppAccess(req, res))
924
1581
  return;
925
- const body = await parseJsonBody(req);
926
- const { text, author = 'user' } = body;
927
- if (!text) {
928
- res.writeHead(400, { 'Content-Type': 'application/json' });
929
- res.end(JSON.stringify({ error: 'Comment text is required' }));
930
- return;
1582
+ try {
1583
+ const body = await parseJsonBody(req);
1584
+ const { text, commentId, timestamp } = body;
1585
+ if (!text) {
1586
+ res.writeHead(400, { 'Content-Type': 'application/json' });
1587
+ res.end(JSON.stringify({ error: 'Comment text is required', code: 'TASK_COMMENT_INVALID' }));
1588
+ return;
1589
+ }
1590
+ const workspaceId = requestWorkspaceId(req);
1591
+ const durableRouters = createTaskHttpDurableRouters({ core, context, req, workspaceId });
1592
+ const { comments: durableRouter, actorRef } = durableRouters;
1593
+ let updated;
1594
+ if (durableRouter.enabled) {
1595
+ const result = durableRouter.append({
1596
+ taskId: params.id,
1597
+ comment: {
1598
+ id: String(commentId || `comment-${randomUUID()}`),
1599
+ author: actorRef,
1600
+ submittedAuthor: actorRef,
1601
+ text: String(text),
1602
+ timestamp: String(timestamp || new Date().toISOString()),
1603
+ },
1604
+ });
1605
+ updated = result.task;
1606
+ }
1607
+ else {
1608
+ updated = core.addComment(params.id, String(text), actorRef, workspaceId, { actorRef });
1609
+ }
1610
+ if (!updated) {
1611
+ res.writeHead(404, { 'Content-Type': 'application/json' });
1612
+ res.end(JSON.stringify({ error: 'Task not found', code: 'TASK_NOT_FOUND' }));
1613
+ return;
1614
+ }
1615
+ res.writeHead(200, { 'Content-Type': 'application/json' });
1616
+ res.end(JSON.stringify(updated));
931
1617
  }
932
- const workspaceId = requestWorkspaceId(req);
933
- const updated = core.addComment(params.id, text, author, workspaceId, { actorRef: author || 'user' });
934
- if (!updated) {
935
- res.writeHead(404, { 'Content-Type': 'application/json' });
936
- res.end(JSON.stringify({ error: 'Task not found' }));
937
- return;
1618
+ catch (error) {
1619
+ const statusCode = resolveErrorStatusCode(error, 400);
1620
+ const retryAt = typeof error?.retryAt === 'string'
1621
+ ? String(error.retryAt)
1622
+ : null;
1623
+ const retryAfterSeconds = retryAt && Number.isFinite(Date.parse(retryAt))
1624
+ ? Math.max(0, Math.ceil((Date.parse(retryAt) - Date.now()) / 1_000))
1625
+ : null;
1626
+ res.writeHead(statusCode, {
1627
+ 'Content-Type': 'application/json',
1628
+ ...(retryAfterSeconds !== null ? { 'Retry-After': String(retryAfterSeconds) } : {}),
1629
+ });
1630
+ res.end(JSON.stringify({
1631
+ error: error instanceof Error ? error.message : 'Failed to add comment.',
1632
+ ...(error?.code ? { code: String(error.code) } : {}),
1633
+ ...(retryAt ? { retryAt } : {}),
1634
+ }));
938
1635
  }
939
- res.writeHead(200, { 'Content-Type': 'application/json' });
940
- res.end(JSON.stringify(updated));
941
1636
  });
942
1637
  // POST /api/taskforce/task/:id/unarchive - Restore an archived task
943
1638
  addRoute('POST', '/api/taskforce/task/:id/unarchive', async (req, res, params) => {
944
1639
  if (!ensureAppAccess(req, res))
945
1640
  return;
946
- const workspaceId = requestWorkspaceId(req);
947
- const restored = core.unarchiveTask(params.id, workspaceId, { actorRef: 'user' });
948
- if (!restored) {
949
- res.writeHead(404, { 'Content-Type': 'application/json' });
950
- res.end(JSON.stringify({ error: 'Archived task not found' }));
951
- return;
1641
+ try {
1642
+ const workspaceId = requestWorkspaceId(req);
1643
+ const durableRouter = createTaskHttpRootRouter(req, workspaceId);
1644
+ const restored = durableRouter.enabled
1645
+ ? durableRouter.unarchive(params.id)
1646
+ : core.unarchiveTask(params.id, workspaceId, { actorRef: requestHumanActorRef(req) });
1647
+ if (!restored) {
1648
+ res.writeHead(404, { 'Content-Type': 'application/json' });
1649
+ res.end(JSON.stringify({ error: 'Archived task not found' }));
1650
+ return;
1651
+ }
1652
+ res.writeHead(200, { 'Content-Type': 'application/json' });
1653
+ res.end(JSON.stringify(restored));
1654
+ }
1655
+ catch (error) {
1656
+ const statusCode = resolveErrorStatusCode(error, 400);
1657
+ const message = error instanceof Error ? error.message : 'Failed to unarchive task';
1658
+ const errorCode = error?.code;
1659
+ res.writeHead(statusCode, { 'Content-Type': 'application/json' });
1660
+ res.end(JSON.stringify({ error: message, code: errorCode }));
952
1661
  }
953
- res.writeHead(200, { 'Content-Type': 'application/json' });
954
- res.end(JSON.stringify(restored));
955
1662
  });
956
1663
  // === SECTION: Bulk operations ===
957
1664
  // POST /api/taskforce/bulk-create - Create multiple tasks with optional atomic + validate-only behavior
@@ -966,12 +1673,27 @@ export function registerTaskRoutes(deps) {
966
1673
  return;
967
1674
  }
968
1675
  const workspaceId = requestWorkspaceId(req);
969
- const result = core.bulkCreateTasks(tasks, {
970
- atomic: atomic !== false,
971
- validateOnly: validate_only === true,
972
- workspaceId,
973
- provisionalLocalReference: shouldUseProvisionalTaskReferences(requestRuntimeMode(req))
974
- });
1676
+ const durableRouters = createTaskHttpDurableRouters({ core, context, req, workspaceId });
1677
+ let result;
1678
+ try {
1679
+ result = !durableRouters.root.enabled || validate_only === true
1680
+ ? core.bulkCreateTasks(tasks, {
1681
+ atomic: atomic !== false,
1682
+ validateOnly: validate_only === true,
1683
+ workspaceId,
1684
+ provisionalLocalReference: shouldUseProvisionalTaskReferences(requestRuntimeMode(req))
1685
+ })
1686
+ : createTaskHttpBulkRouter(req, workspaceId).create(tasks, atomic !== false);
1687
+ }
1688
+ catch (error) {
1689
+ const statusCode = resolveErrorStatusCode(error, 400);
1690
+ res.writeHead(statusCode, { 'Content-Type': 'application/json' });
1691
+ res.end(JSON.stringify({
1692
+ error: error instanceof Error ? error.message : 'Failed to create tasks',
1693
+ code: error?.code,
1694
+ }));
1695
+ return;
1696
+ }
975
1697
  const hasErrors = result.errors.length > 0;
976
1698
  const succeeded = validate_only ? (hasErrors ? 0 : result.total) : result.created.length;
977
1699
  const summary = buildBatchSummary({
@@ -1004,29 +1726,45 @@ export function registerTaskRoutes(deps) {
1004
1726
  return;
1005
1727
  }
1006
1728
  const isCancellation = status === 'cancelled';
1007
- const archived = [];
1008
- const errors = [];
1009
- for (let i = 0; i < ids.length; i++) {
1010
- const taskId = ids[i];
1011
- try {
1012
- const workspaceId = requestWorkspaceId(req);
1013
- const item = core.archiveTask(taskId, isCancellation, undefined, workspaceId);
1014
- if (!item) {
1015
- errors.push({ index: i, id: taskId, message: 'Task not found', statusCode: 404, code: 'TASK_NOT_FOUND' });
1016
- continue;
1017
- }
1018
- archived.push(item);
1019
- }
1020
- catch (error) {
1021
- errors.push({
1022
- index: i,
1023
- id: taskId,
1024
- message: error instanceof Error ? error.message : 'Failed to archive task',
1025
- statusCode: resolveErrorStatusCode(error, 400),
1026
- code: error instanceof TaskforceRuleError ? error.code : error?.code
1027
- });
1028
- }
1729
+ const workspaceId = requestWorkspaceId(req);
1730
+ const durableRouters = createTaskHttpDurableRouters({ core, context, req, workspaceId });
1731
+ let batchResult;
1732
+ try {
1733
+ batchResult = durableRouters.root.enabled
1734
+ ? createTaskHttpBulkRouter(req, workspaceId).archive(ids, status)
1735
+ : (() => {
1736
+ const archived = [];
1737
+ const errors = [];
1738
+ for (let i = 0; i < ids.length; i += 1) {
1739
+ const taskId = ids[i];
1740
+ try {
1741
+ const item = core.archiveTask(taskId, isCancellation, undefined, workspaceId);
1742
+ if (!item) {
1743
+ errors.push({ index: i, id: taskId, message: 'Task not found', statusCode: 404, code: 'TASK_NOT_FOUND' });
1744
+ continue;
1745
+ }
1746
+ archived.push(item);
1747
+ }
1748
+ catch (error) {
1749
+ errors.push({
1750
+ index: i,
1751
+ id: taskId,
1752
+ message: error instanceof Error ? error.message : 'Failed to archive task',
1753
+ statusCode: resolveErrorStatusCode(error, 400),
1754
+ code: error instanceof TaskforceRuleError ? error.code : error?.code
1755
+ });
1756
+ }
1757
+ }
1758
+ return { archived, errors };
1759
+ })();
1760
+ }
1761
+ catch (error) {
1762
+ const statusCode = resolveErrorStatusCode(error, 400);
1763
+ res.writeHead(statusCode, { 'Content-Type': 'application/json' });
1764
+ res.end(JSON.stringify({ error: error instanceof Error ? error.message : 'Failed to archive tasks', code: error?.code }));
1765
+ return;
1029
1766
  }
1767
+ const { archived, errors } = batchResult;
1030
1768
  const summary = buildBatchSummary({
1031
1769
  operation: 'bulk-archive',
1032
1770
  total: ids.length,
@@ -1054,41 +1792,51 @@ export function registerTaskRoutes(deps) {
1054
1792
  return;
1055
1793
  }
1056
1794
  const workspaceId = requestWorkspaceId(req);
1057
- const preview = core.bulkUpdateFieldsPreview(updates, workspaceId);
1058
- const results = [];
1059
- const errors = [];
1060
- for (const skipped of preview.skipped) {
1061
- if (skipped.statusCode >= 400) {
1062
- errors.push({
1063
- index: skipped.index,
1064
- id: skipped.id,
1065
- message: skipped.message,
1066
- statusCode: skipped.statusCode,
1067
- code: skipped.code
1068
- });
1069
- }
1795
+ const durableRouters = createTaskHttpDurableRouters({ core, context, req, workspaceId });
1796
+ let batchResult;
1797
+ try {
1798
+ batchResult = durableRouters.root.enabled || durableRouters.checklist.enabled || durableRouters.attachmentLinks.enabled
1799
+ ? durableRouters.bulk.updateFields(updates)
1800
+ : (() => {
1801
+ const preview = core.bulkUpdateFieldsPreview(updates, workspaceId);
1802
+ const results = [];
1803
+ const errors = [];
1804
+ for (const skipped of preview.skipped) {
1805
+ if (skipped.statusCode >= 400)
1806
+ errors.push({
1807
+ index: skipped.index, ...(skipped.id ? { id: skipped.id } : {}),
1808
+ message: skipped.message, statusCode: skipped.statusCode,
1809
+ ...(skipped.code ? { code: skipped.code } : {}),
1810
+ });
1811
+ }
1812
+ for (const item of preview.toApply) {
1813
+ try {
1814
+ const updated = core.updateTask(item.id, item.fields, workspaceId);
1815
+ if (updated)
1816
+ results.push(updated);
1817
+ else
1818
+ errors.push({ index: item.index, id: item.id, message: 'Task not found', statusCode: 404, code: 'TASK_NOT_FOUND' });
1819
+ }
1820
+ catch (error) {
1821
+ errors.push({
1822
+ index: item.index,
1823
+ id: item.id,
1824
+ message: error instanceof Error ? error.message : 'Failed to update task',
1825
+ statusCode: resolveErrorStatusCode(error, 400),
1826
+ code: error instanceof TaskforceRuleError ? error.code : error?.code
1827
+ });
1828
+ }
1829
+ }
1830
+ return { preview, results, errors };
1831
+ })();
1070
1832
  }
1071
- for (const item of preview.toApply) {
1072
- const { id, fields } = item;
1073
- try {
1074
- const updated = core.updateTask(id, fields, workspaceId);
1075
- if (updated) {
1076
- results.push(updated);
1077
- }
1078
- else {
1079
- errors.push({ index: item.index, id, message: 'Task not found', statusCode: 404, code: 'TASK_NOT_FOUND' });
1080
- }
1081
- }
1082
- catch (error) {
1083
- errors.push({
1084
- index: item.index,
1085
- id,
1086
- message: error instanceof Error ? error.message : 'Failed to update task',
1087
- statusCode: resolveErrorStatusCode(error, 400),
1088
- code: error instanceof TaskforceRuleError ? error.code : error?.code
1089
- });
1090
- }
1833
+ catch (error) {
1834
+ const statusCode = resolveErrorStatusCode(error, 400);
1835
+ res.writeHead(statusCode, { 'Content-Type': 'application/json' });
1836
+ res.end(JSON.stringify({ error: error instanceof Error ? error.message : 'Failed to update tasks', code: error?.code }));
1837
+ return;
1091
1838
  }
1839
+ const { preview, results, errors } = batchResult;
1092
1840
  const summary = buildBatchSummary({
1093
1841
  operation: 'bulk-update-fields',
1094
1842
  total: updates.length,
@@ -1165,7 +1913,22 @@ export function registerTaskRoutes(deps) {
1165
1913
  }
1166
1914
  try {
1167
1915
  const workspaceId = requestWorkspaceId(req);
1168
- const result = core.createInitiativeFromTemplate(body, workspaceId);
1916
+ const rootRouter = createTaskHttpRootRouter(req, workspaceId);
1917
+ const result = rootRouter.enabled
1918
+ ? (() => {
1919
+ const prepared = core.buildInitiativeTemplateTaskInputs(body, workspaceId);
1920
+ const batch = createTaskHttpBulkRouter(req, workspaceId).create(prepared.tasks, true, 'initiative-template-create');
1921
+ if (batch.errors.length > 0 || batch.created.length !== prepared.tasks.length) {
1922
+ const first = batch.errors[0];
1923
+ throw new TaskforceRuleError(first?.message || 'Failed to create initiative from template.', first?.statusCode || 400, first?.code || 'INITIATIVE_TEMPLATE_CREATE_FAILED', first?.details);
1924
+ }
1925
+ return {
1926
+ templateId: prepared.templateId,
1927
+ initiative: batch.created[0],
1928
+ milestones: batch.created.slice(1),
1929
+ };
1930
+ })()
1931
+ : core.createInitiativeFromTemplate(body, workspaceId);
1169
1932
  res.writeHead(201, { 'Content-Type': 'application/json' });
1170
1933
  res.end(JSON.stringify({
1171
1934
  success: true,
@@ -1201,6 +1964,77 @@ export function registerTaskRoutes(deps) {
1201
1964
  res.writeHead(200, { 'Content-Type': 'application/json' });
1202
1965
  res.end(JSON.stringify({ packs }));
1203
1966
  });
1967
+ addRoute('POST', '/api/taskforce/taxonomy-library/apply', async (req, res) => {
1968
+ if (!ensureAppAccess(req, res))
1969
+ return;
1970
+ try {
1971
+ const workspaceId = requestWorkspaceId(req);
1972
+ const body = await parseJsonBody(req);
1973
+ const pack = getBuiltInTaxonomyLibraryPack(String(body?.packId || ''));
1974
+ if (!pack)
1975
+ throw new TaskforceRuleError('Taxonomy library pack not found.', 404, 'TAXONOMY_LIBRARY_PACK_NOT_FOUND');
1976
+ const sections = body?.sections;
1977
+ if (!sections || typeof sections !== 'object' || Array.isArray(sections)) {
1978
+ throw new TaskforceRuleError('Taxonomy library sections are required.', 400, 'TAXONOMY_LIBRARY_REQUEST_INVALID');
1979
+ }
1980
+ const sectionKeys = Object.keys(sections);
1981
+ if (sectionKeys.some((key) => !['categories', 'types', 'priorities'].includes(key))
1982
+ || sectionKeys.some((key) => typeof sections[key] !== 'boolean')
1983
+ || (body?.remapExistingValuesToDefault !== undefined && typeof body.remapExistingValuesToDefault !== 'boolean')) {
1984
+ throw new TaskforceRuleError('Taxonomy library request contains invalid fields.', 400, 'TAXONOMY_LIBRARY_REQUEST_INVALID');
1985
+ }
1986
+ const selected = {
1987
+ categories: sections.categories === true,
1988
+ types: sections.types === true,
1989
+ priorities: sections.priorities === true,
1990
+ };
1991
+ if (!selected.categories && !selected.types && !selected.priorities) {
1992
+ throw new TaskforceRuleError('Select at least one taxonomy library section.', 400, 'TAXONOMY_LIBRARY_REQUEST_INVALID');
1993
+ }
1994
+ const remap = body?.remapExistingValuesToDefault === true;
1995
+ const runtimeMode = context.authConfig?.runtimeMode === 'cloud' ? 'cloud' : requestRuntimeMode(req);
1996
+ const router = createDurableTaxonomyMutationRouter({
1997
+ core,
1998
+ runtimeMode,
1999
+ surface: 'http',
2000
+ tenantId: core.getTenantId(),
2001
+ workspaceId,
2002
+ });
2003
+ if (!router.enabled) {
2004
+ throw new TaskforceRuleError('Atomic taxonomy library application is not enabled yet.', 409, 'WORKSPACE_SYNC_V3_TAXONOMY_ACTIVATION_DISABLED');
2005
+ }
2006
+ const result = router.mutateState(() => {
2007
+ const current = serializeTaxonomyStateForSync(core.getTaxonomyState(workspaceId));
2008
+ const nextCategories = selected.categories
2009
+ ? (remap ? pack.categories : [
2010
+ ...pack.categories,
2011
+ ...current.categories.filter((entry) => !pack.categories.some((candidate) => candidate.value === entry.value))
2012
+ .map((entry) => ({ ...entry, disabled: true })),
2013
+ ])
2014
+ : current.categories;
2015
+ const nextTypes = selected.types
2016
+ ? (remap ? pack.types : [
2017
+ ...pack.types,
2018
+ ...current.types.filter((entry) => !pack.types.some((candidate) => candidate.value === entry.value))
2019
+ .map((entry) => ({ ...entry, status: 'retired' })),
2020
+ ])
2021
+ : current.types;
2022
+ return {
2023
+ ...current,
2024
+ categories: nextCategories,
2025
+ types: nextTypes,
2026
+ priorities: selected.priorities
2027
+ ? pack.priorities.map((entry) => ({ ...entry, value: Number(entry.value) }))
2028
+ : current.priorities,
2029
+ };
2030
+ }, { remapIncompatibleTasks: remap });
2031
+ res.writeHead(200, { 'Content-Type': 'application/json' });
2032
+ res.end(JSON.stringify({ success: true, taxonomyState: result.taxonomyState }));
2033
+ }
2034
+ catch (error) {
2035
+ writeTaxonomyMutationError(res, error);
2036
+ }
2037
+ });
1204
2038
  // GET /api/taskforce/custom-taxonomy-library - List built-in custom taxonomy library packs
1205
2039
  addRoute('GET', '/api/taskforce/custom-taxonomy-library', async (req, res) => {
1206
2040
  if (!ensureAppAccess(req, res))
@@ -1221,11 +2055,19 @@ export function registerTaskRoutes(deps) {
1221
2055
  addRoute('POST', '/api/taskforce/taxonomy-display-labels', async (req, res) => {
1222
2056
  if (!ensureAppAccess(req, res))
1223
2057
  return;
1224
- const workspaceId = requestWorkspaceId(req);
1225
- const body = await parseJsonBody(req);
1226
- const displayLabels = core.updateTaxonomyDisplayLabels(body?.displayLabels || {}, workspaceId);
1227
- res.writeHead(200, { 'Content-Type': 'application/json' });
1228
- res.end(JSON.stringify({ success: true, displayLabels }));
2058
+ try {
2059
+ const workspaceId = requestWorkspaceId(req);
2060
+ const body = await parseJsonBody(req);
2061
+ const requested = body?.displayLabels || {};
2062
+ const durable = mutateTaxonomyThroughDurableBoundary(req, workspaceId, { field: 'displayLabels', value: requested });
2063
+ const displayLabels = durable?.taxonomyState.displayLabels
2064
+ || core.updateTaxonomyDisplayLabels(requested, workspaceId);
2065
+ res.writeHead(200, { 'Content-Type': 'application/json' });
2066
+ res.end(JSON.stringify({ success: true, displayLabels }));
2067
+ }
2068
+ catch (error) {
2069
+ writeTaxonomyMutationError(res, error);
2070
+ }
1229
2071
  });
1230
2072
  // GET /api/taskforce/categories - Get project categories
1231
2073
  addRoute('GET', '/api/taskforce/categories', async (req, res) => {
@@ -1248,9 +2090,16 @@ export function registerTaskRoutes(deps) {
1248
2090
  res.end(JSON.stringify({ error: 'categories array is required' }));
1249
2091
  return;
1250
2092
  }
1251
- core.updateCategories(categories, workspaceId);
1252
- res.writeHead(200, { 'Content-Type': 'application/json' });
1253
- res.end(JSON.stringify({ success: true, categories: core.getCategories(workspaceId) }));
2093
+ try {
2094
+ const durable = mutateTaxonomyThroughDurableBoundary(req, workspaceId, { field: 'categories', value: categories }, { remapIncompatibleTasks: true });
2095
+ if (!durable)
2096
+ core.updateCategories(categories, workspaceId);
2097
+ res.writeHead(200, { 'Content-Type': 'application/json' });
2098
+ res.end(JSON.stringify({ success: true, categories: durable?.taxonomyState.categories || core.getCategories(workspaceId) }));
2099
+ }
2100
+ catch (error) {
2101
+ writeTaxonomyMutationError(res, error);
2102
+ }
1254
2103
  });
1255
2104
  // GET /api/taskforce/types - Get project task types
1256
2105
  addRoute('GET', '/api/taskforce/types', async (req, res) => {
@@ -1273,9 +2122,16 @@ export function registerTaskRoutes(deps) {
1273
2122
  res.end(JSON.stringify({ error: 'types array is required' }));
1274
2123
  return;
1275
2124
  }
1276
- core.updateTypes(types, workspaceId);
1277
- res.writeHead(200, { 'Content-Type': 'application/json' });
1278
- res.end(JSON.stringify({ success: true, types: core.getTypes(workspaceId) }));
2125
+ try {
2126
+ const durable = mutateTaxonomyThroughDurableBoundary(req, workspaceId, { field: 'types', value: types });
2127
+ if (!durable)
2128
+ core.updateTypes(types, workspaceId);
2129
+ res.writeHead(200, { 'Content-Type': 'application/json' });
2130
+ res.end(JSON.stringify({ success: true, types: durable?.taxonomyState.types || core.getTypes(workspaceId) }));
2131
+ }
2132
+ catch (error) {
2133
+ writeTaxonomyMutationError(res, error);
2134
+ }
1279
2135
  });
1280
2136
  // GET /api/taskforce/priorities - Get project priority levels
1281
2137
  addRoute('GET', '/api/taskforce/priorities', async (req, res) => {
@@ -1298,32 +2154,16 @@ export function registerTaskRoutes(deps) {
1298
2154
  res.end(JSON.stringify({ error: 'priorities array is required' }));
1299
2155
  return;
1300
2156
  }
1301
- core.updatePriorities(priorities, workspaceId);
1302
- res.writeHead(200, { 'Content-Type': 'application/json' });
1303
- res.end(JSON.stringify({ success: true, priorities: core.getPriorities(workspaceId) }));
1304
- });
1305
- // GET /api/taskforce/approaches - Get project approach options
1306
- addRoute('GET', '/api/taskforce/approaches', async (req, res) => {
1307
- if (!ensureAppAccess(req, res))
1308
- return;
1309
- const approaches = core.getApproaches();
1310
- res.writeHead(200, { 'Content-Type': 'application/json' });
1311
- res.end(JSON.stringify({ approaches }));
1312
- });
1313
- // POST /api/taskforce/approaches - Update project approach options
1314
- addRoute('POST', '/api/taskforce/approaches', async (req, res) => {
1315
- if (!ensureAppAccess(req, res))
1316
- return;
1317
- const body = await parseJsonBody(req);
1318
- const { approaches } = body;
1319
- if (!approaches || !Array.isArray(approaches)) {
1320
- res.writeHead(400, { 'Content-Type': 'application/json' });
1321
- res.end(JSON.stringify({ error: 'approaches array is required' }));
1322
- return;
2157
+ try {
2158
+ const durable = mutateTaxonomyThroughDurableBoundary(req, workspaceId, { field: 'priorities', value: priorities });
2159
+ if (!durable)
2160
+ core.updatePriorities(priorities, workspaceId);
2161
+ res.writeHead(200, { 'Content-Type': 'application/json' });
2162
+ res.end(JSON.stringify({ success: true, priorities: durable?.taxonomyState.priorities || core.getPriorities(workspaceId) }));
2163
+ }
2164
+ catch (error) {
2165
+ writeTaxonomyMutationError(res, error);
1323
2166
  }
1324
- core.updateApproaches(approaches);
1325
- res.writeHead(200, { 'Content-Type': 'application/json' });
1326
- res.end(JSON.stringify({ success: true, approaches: core.getApproaches() }));
1327
2167
  });
1328
2168
  // GET /api/taskforce/taxonomies - Get project taxonomies
1329
2169
  addRoute('GET', '/api/taskforce/taxonomies', async (req, res) => {
@@ -1346,8 +2186,15 @@ export function registerTaskRoutes(deps) {
1346
2186
  res.end(JSON.stringify({ error: 'taxonomies array is required' }));
1347
2187
  return;
1348
2188
  }
1349
- core.updateTaxonomies(taxonomies, workspaceId);
1350
- res.writeHead(200, { 'Content-Type': 'application/json' });
1351
- res.end(JSON.stringify({ success: true, taxonomies: core.getTaxonomies(workspaceId) }));
2189
+ try {
2190
+ const durable = mutateTaxonomyThroughDurableBoundary(req, workspaceId, { field: 'taxonomies', value: taxonomies });
2191
+ if (!durable)
2192
+ core.updateTaxonomies(taxonomies, workspaceId);
2193
+ res.writeHead(200, { 'Content-Type': 'application/json' });
2194
+ res.end(JSON.stringify({ success: true, taxonomies: durable?.taxonomyState.taxonomies || core.getTaxonomies(workspaceId) }));
2195
+ }
2196
+ catch (error) {
2197
+ writeTaxonomyMutationError(res, error);
2198
+ }
1352
2199
  });
1353
2200
  }