@taskforcehq/taskforce 0.3.326 → 0.3.327

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1358) hide show
  1. package/LICENSE.md +68 -0
  2. package/README.md +19 -0
  3. package/dist/Taskforce.module.css +2173 -561
  4. package/dist/TaskforceCore.d.ts +1 -0
  5. package/dist/TaskforceCore.js +65 -22
  6. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.d.ts +1 -0
  7. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.js +3 -2
  8. package/dist/annotatedAttachments/commandService.d.ts +68 -0
  9. package/dist/annotatedAttachments/commandService.js +348 -0
  10. package/dist/annotatedAttachments/service.d.ts +2 -0
  11. package/dist/annotatedAttachments/service.js +13 -12
  12. package/dist/cli.js +158 -9
  13. package/dist/cliOpenPort.d.ts +1 -0
  14. package/dist/cliOpenPort.js +4 -0
  15. package/dist/compat/taskforceAgentDefinitionCompat.d.ts +12 -0
  16. package/dist/compat/taskforceAgentDefinitionCompat.js +25 -0
  17. package/dist/compat/workspaceSyncCompat.js +6 -2
  18. package/dist/compat/workspaceSyncV3CombinedCoverageCompat.d.ts +6 -0
  19. package/dist/compat/workspaceSyncV3CombinedCoverageCompat.js +22 -0
  20. package/dist/compat/workspaceSyncV3OperationCompat.d.ts +7 -0
  21. package/dist/compat/workspaceSyncV3OperationCompat.js +30 -0
  22. package/dist/components/activity/EntityActivityTimeline.d.ts +10 -2
  23. package/dist/components/activity/EntityActivityTimeline.js +73 -35
  24. package/dist/components/context/AttachmentPreviewHost.d.ts +6 -0
  25. package/dist/components/context/AttachmentPreviewHost.js +222 -0
  26. package/dist/components/context/ContextAttachmentManager.d.ts +4 -0
  27. package/dist/components/context/ContextAttachmentManager.js +418 -208
  28. package/dist/components/features/AiProfilesModule.d.ts +24 -0
  29. package/dist/components/features/AiProfilesModule.js +744 -0
  30. package/dist/components/features/AnnotatedAttachmentWorkspace.d.ts +4 -1
  31. package/dist/components/features/AnnotatedAttachmentWorkspace.js +351 -79
  32. package/dist/components/features/DocumentGenerateModal.js +23 -5
  33. package/dist/components/features/DocumentIndex.d.ts +19 -1
  34. package/dist/components/features/DocumentIndex.js +104 -15
  35. package/dist/components/features/DocumentViewer.d.ts +9 -1
  36. package/dist/components/features/DocumentViewer.js +721 -100
  37. package/dist/components/features/DocumentWorkspace.d.ts +37 -2
  38. package/dist/components/features/DocumentWorkspace.js +21 -6
  39. package/dist/components/features/TaskSettings.d.ts +6 -27
  40. package/dist/components/features/TaskSettings.js +232 -143
  41. package/dist/components/features/TaskforceAgentsModule.d.ts +36 -0
  42. package/dist/components/features/TaskforceAgentsModule.js +1782 -0
  43. package/dist/components/features/agentBehavior/AgentBehaviorManagerShared.d.ts +94 -0
  44. package/dist/components/features/agentBehavior/AgentBehaviorManagerShared.js +70 -0
  45. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +65 -0
  46. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.js +115 -0
  47. package/dist/components/features/agentRoles/RoleManagerPanel.d.ts +4 -0
  48. package/dist/components/features/agentRoles/RoleManagerPanel.js +382 -0
  49. package/dist/components/features/agentSkills/SkillManagerPanel.d.ts +5 -0
  50. package/dist/components/features/agentSkills/SkillManagerPanel.js +355 -0
  51. package/dist/components/features/documentWorkspaceModel.d.ts +16 -4
  52. package/dist/components/features/documentWorkspaceModel.js +30 -5
  53. package/dist/components/features/planning/PlanningArchiveConfirmation.d.ts +9 -0
  54. package/dist/components/features/planning/PlanningArchiveConfirmation.js +19 -0
  55. package/dist/components/features/planning/PlanningCardIdentity.d.ts +12 -0
  56. package/dist/components/features/planning/PlanningCardIdentity.js +44 -0
  57. package/dist/components/features/planning/PlanningEntityDetails.d.ts +36 -0
  58. package/dist/components/features/planning/PlanningEntityDetails.js +131 -0
  59. package/dist/components/features/planning/PlanningEntitySummary.d.ts +44 -0
  60. package/dist/components/features/planning/PlanningEntitySummary.js +97 -0
  61. package/dist/components/features/planning/PlanningLinkPicker.d.ts +9 -0
  62. package/dist/components/features/planning/PlanningLinkPicker.js +26 -0
  63. package/dist/components/features/planning/PlanningModule.d.ts +6 -0
  64. package/dist/components/features/planning/PlanningModule.js +571 -0
  65. package/dist/components/features/planning/PlanningOwnerDropdown.d.ts +27 -0
  66. package/dist/components/features/planning/PlanningOwnerDropdown.js +80 -0
  67. package/dist/components/features/planning/PlanningTaskArrangeControl.d.ts +5 -0
  68. package/dist/components/features/planning/PlanningTaskArrangeControl.js +11 -0
  69. package/dist/components/features/planning/PlanningTaskCard.d.ts +20 -0
  70. package/dist/components/features/planning/PlanningTaskCard.js +26 -0
  71. package/dist/components/features/planning/PlanningTaskOrderList.d.ts +10 -0
  72. package/dist/components/features/planning/PlanningTaskOrderList.js +52 -0
  73. package/dist/components/features/planning/PlanningUnlinkConfirmation.d.ts +15 -0
  74. package/dist/components/features/planning/PlanningUnlinkConfirmation.js +7 -0
  75. package/dist/components/features/planning/planningCreateIntent.d.ts +10 -0
  76. package/dist/components/features/planning/planningCreateIntent.js +16 -0
  77. package/dist/components/features/planning/planningNavigator.d.ts +33 -0
  78. package/dist/components/features/planning/planningNavigator.js +96 -0
  79. package/dist/components/features/planning/planningTaskArrangement.d.ts +18 -0
  80. package/dist/components/features/planning/planningTaskArrangement.js +106 -0
  81. package/dist/components/features/planning/planningWorkspaceModel.d.ts +121 -0
  82. package/dist/components/features/planning/planningWorkspaceModel.js +5 -0
  83. package/dist/components/features/settings/CategoryManager.js +2 -2
  84. package/dist/components/features/settings/TaxonomyEditor.js +1 -1
  85. package/dist/components/features/settings/TaxonomyManager.js +1 -1
  86. package/dist/components/features/settings/TypeManager.js +1 -1
  87. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.d.ts +10 -0
  88. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +175 -0
  89. package/dist/components/features/taskforceAgentAssignments/agentBehaviorCatalogApi.d.ts +27 -0
  90. package/dist/components/features/taskforceAgentAssignments/agentBehaviorCatalogApi.js +24 -0
  91. package/dist/components/features/taskforceAgentEditorModel.d.ts +109 -0
  92. package/dist/components/features/taskforceAgentEditorModel.js +145 -0
  93. package/dist/components/features/useDocumentWorkspaceController.d.ts +20 -1
  94. package/dist/components/features/useDocumentWorkspaceController.js +106 -21
  95. package/dist/components/features/workflowManager/WorkflowManagerModule.d.ts +11 -0
  96. package/dist/components/features/workflowManager/WorkflowManagerModule.js +313 -0
  97. package/dist/components/features/workflowManager/WorkflowPublishDialog.d.ts +11 -0
  98. package/dist/components/features/workflowManager/WorkflowPublishDialog.js +8 -0
  99. package/dist/components/features/workflowManager/types.d.ts +74 -0
  100. package/dist/components/features/workflowManager/types.js +1 -0
  101. package/dist/components/features/workflowManager/useWorkflowManager.d.ts +30 -0
  102. package/dist/components/features/workflowManager/useWorkflowManager.js +213 -0
  103. package/dist/components/features/workflowManager/workflowManagerApi.d.ts +52 -0
  104. package/dist/components/features/workflowManager/workflowManagerApi.js +142 -0
  105. package/dist/components/task/TaskActionHeader.d.ts +6 -3
  106. package/dist/components/task/TaskActionHeader.js +46 -53
  107. package/dist/components/task/TaskCard.d.ts +10 -2
  108. package/dist/components/task/TaskCard.js +103 -54
  109. package/dist/components/task/TaskContextUpload.d.ts +1 -0
  110. package/dist/components/task/TaskContextUpload.js +3 -2
  111. package/dist/components/task/TaskForm.d.ts +12 -17
  112. package/dist/components/task/TaskForm.js +544 -199
  113. package/dist/components/task/TaskImageReviews.d.ts +8 -0
  114. package/dist/components/task/TaskImageReviews.js +47 -0
  115. package/dist/components/task/TaskKanban.d.ts +9 -10
  116. package/dist/components/task/TaskKanban.js +70 -18
  117. package/dist/components/task/TaskList.d.ts +9 -8
  118. package/dist/components/task/TaskList.js +46 -32
  119. package/dist/components/task/TaskReferenceBadge.d.ts +2 -1
  120. package/dist/components/task/TaskReferenceBadge.js +3 -2
  121. package/dist/components/task/TaskStatusActions.d.ts +3 -1
  122. package/dist/components/task/TaskStatusActions.js +17 -6
  123. package/dist/components/task/TaskWorkflowAssignmentField.d.ts +18 -0
  124. package/dist/components/task/TaskWorkflowAssignmentField.js +362 -0
  125. package/dist/components/task/TaskWorkstreamPicker.d.ts +8 -0
  126. package/dist/components/task/TaskWorkstreamPicker.js +24 -0
  127. package/dist/components/task/TrashRestoreControls.d.ts +18 -0
  128. package/dist/components/task/TrashRestoreControls.js +71 -0
  129. package/dist/components/ui/AiIdentityRosterCard.d.ts +20 -0
  130. package/dist/components/ui/AiIdentityRosterCard.js +5 -0
  131. package/dist/components/ui/AssetTraySortControl.d.ts +10 -0
  132. package/dist/components/ui/AssetTraySortControl.js +38 -0
  133. package/dist/components/ui/AssigneeIdentity.d.ts +12 -0
  134. package/dist/components/ui/AssigneeIdentity.js +41 -0
  135. package/dist/components/ui/DiscardChangesDialog.d.ts +10 -0
  136. package/dist/components/ui/DiscardChangesDialog.js +7 -0
  137. package/dist/components/ui/DisclosureSectionHeader.d.ts +4 -1
  138. package/dist/components/ui/DisclosureSectionHeader.js +2 -2
  139. package/dist/components/ui/EditableAvatarButton.d.ts +6 -1
  140. package/dist/components/ui/EditableAvatarButton.js +6 -5
  141. package/dist/components/ui/HierarchyActionBadge.d.ts +2 -1
  142. package/dist/components/ui/HierarchyActionBadge.js +2 -2
  143. package/dist/components/ui/Markdown.d.ts +13 -3
  144. package/dist/components/ui/Markdown.fixture.d.ts +1 -0
  145. package/dist/components/ui/Markdown.fixture.js +23 -0
  146. package/dist/components/ui/Markdown.js +158 -68
  147. package/dist/components/ui/Modal.d.ts +3 -1
  148. package/dist/components/ui/Modal.js +85 -19
  149. package/dist/components/ui/MultiSelectFilter.d.ts +9 -2
  150. package/dist/components/ui/MultiSelectFilter.js +26 -5
  151. package/dist/components/ui/ReferenceBadgeButton.js +2 -3
  152. package/dist/components/ui/TaxonomyDropdown.d.ts +10 -1
  153. package/dist/components/ui/TaxonomyDropdown.js +149 -58
  154. package/dist/components/ui/TopNoticeLayer.d.ts +2 -1
  155. package/dist/components/ui/TopNoticeLayer.js +5 -2
  156. package/dist/components/ui/useFallbackImageUrl.d.ts +4 -0
  157. package/dist/components/ui/useFallbackImageUrl.js +20 -0
  158. package/dist/components/views/AppShellHeader.js +2 -2
  159. package/dist/components/views/StandaloneLayout.d.ts +1 -0
  160. package/dist/components/views/StandaloneLayout.js +1662 -598
  161. package/dist/components/views/WidgetView.d.ts +1 -0
  162. package/dist/components/views/WidgetView.js +95 -30
  163. package/dist/components/views/chrome/WorkspaceChromeSections.d.ts +4 -2
  164. package/dist/components/views/chrome/WorkspaceChromeSections.js +3 -6
  165. package/dist/components/views/chrome/workspaceChrome.d.ts +5 -8
  166. package/dist/components/views/chrome/workspaceChrome.js +62 -27
  167. package/dist/components/views/panels/FilterToolbar.d.ts +4 -3
  168. package/dist/components/views/panels/FilterToolbar.js +8 -5
  169. package/dist/components/views/panels/FilterToolbarControls.d.ts +11 -2
  170. package/dist/components/views/panels/FilterToolbarControls.js +35 -20
  171. package/dist/components/views/panels/PlanningDrawer.d.ts +60 -49
  172. package/dist/components/views/panels/PlanningDrawer.js +978 -313
  173. package/dist/components/views/planningScope.js +7 -1
  174. package/dist/components/views/standalone/modals/AccountSettingsModal.d.ts +62 -0
  175. package/dist/components/views/standalone/modals/AccountSettingsModal.js +197 -0
  176. package/dist/components/views/standalone/modals/AvatarImageManagerModal.d.ts +7 -2
  177. package/dist/components/views/standalone/modals/AvatarImageManagerModal.js +56 -9
  178. package/dist/components/views/standalone/modals/HelpModal.d.ts +1 -2
  179. package/dist/components/views/standalone/modals/HelpModal.js +3 -4
  180. package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +8 -9
  181. package/dist/components/views/standalone/modals/SyncStatusModal.js +85 -25
  182. package/dist/components/views/standalone/modals/TeamManagementModal.js +1 -1
  183. package/dist/config/applicationBaseUrl.d.ts +2 -0
  184. package/dist/config/applicationBaseUrl.js +23 -0
  185. package/dist/config/envSchema.d.ts +1 -1
  186. package/dist/config/envSchema.js +166 -5
  187. package/dist/core/AdminAuditRetentionService.d.ts +43 -0
  188. package/dist/core/AdminAuditRetentionService.js +126 -0
  189. package/dist/core/AiProfileService.d.ts +34 -0
  190. package/dist/core/AiProfileService.js +510 -251
  191. package/dist/core/AttachmentLinkService.d.ts +10 -2
  192. package/dist/core/AttachmentLinkService.js +44 -12
  193. package/dist/core/AuthIdentityService.d.ts +6 -0
  194. package/dist/core/AuthIdentityService.js +38 -0
  195. package/dist/core/AuthTokenService.d.ts +1 -0
  196. package/dist/core/AuthTokenService.js +13 -0
  197. package/dist/core/DeletedTaskLifecycleService.d.ts +4 -2
  198. package/dist/core/DeletedTaskLifecycleService.js +124 -38
  199. package/dist/core/GlobalSettingsService.d.ts +3 -1
  200. package/dist/core/GlobalSettingsService.js +30 -4
  201. package/dist/core/InitiativeDurableMutationService.d.ts +89 -0
  202. package/dist/core/InitiativeDurableMutationService.js +187 -0
  203. package/dist/core/McpTokenService.d.ts +1 -0
  204. package/dist/core/McpTokenService.js +39 -13
  205. package/dist/core/PlanningCommandPreparationService.d.ts +60 -0
  206. package/dist/core/PlanningCommandPreparationService.js +149 -0
  207. package/dist/core/ScheduleCommandService.d.ts +76 -0
  208. package/dist/core/ScheduleCommandService.js +165 -0
  209. package/dist/core/SyncReconciliationService.d.ts +29 -6
  210. package/dist/core/SyncReconciliationService.js +256 -84
  211. package/dist/core/TaskActivityService.d.ts +22 -2
  212. package/dist/core/TaskActivityService.js +177 -29
  213. package/dist/core/TaskAttachmentLinksDurableMutationService.d.ts +31 -0
  214. package/dist/core/TaskAttachmentLinksDurableMutationService.js +231 -0
  215. package/dist/core/TaskChecklistCommandService.d.ts +50 -0
  216. package/dist/core/TaskChecklistCommandService.js +111 -0
  217. package/dist/core/TaskDurableCreateMutationService.d.ts +38 -0
  218. package/dist/core/TaskDurableCreateMutationService.js +85 -0
  219. package/dist/core/TaskDurableDeleteMutationService.d.ts +47 -0
  220. package/dist/core/TaskDurableDeleteMutationService.js +54 -0
  221. package/dist/core/TaskDurableLifecycleMutationService.d.ts +38 -0
  222. package/dist/core/TaskDurableLifecycleMutationService.js +42 -0
  223. package/dist/core/TaskDurableRelationshipMutationService.d.ts +58 -0
  224. package/dist/core/TaskDurableRelationshipMutationService.js +66 -0
  225. package/dist/core/TaskDurableRestoreMutationService.d.ts +31 -0
  226. package/dist/core/TaskDurableRestoreMutationService.js +33 -0
  227. package/dist/core/TaskDurableStatusMutationService.d.ts +74 -0
  228. package/dist/core/TaskDurableStatusMutationService.js +247 -0
  229. package/dist/core/TaskDurableSyncMutationService.d.ts +34 -0
  230. package/dist/core/TaskDurableSyncMutationService.js +70 -0
  231. package/dist/core/TaskDurableWorkflowMutationService.d.ts +48 -0
  232. package/dist/core/TaskDurableWorkflowMutationService.js +59 -0
  233. package/dist/core/TaskLifecycleCommandService.d.ts +101 -0
  234. package/dist/core/TaskLifecycleCommandService.js +161 -0
  235. package/dist/core/TaskRootCommandPreparationService.d.ts +35 -0
  236. package/dist/core/TaskRootCommandPreparationService.js +103 -0
  237. package/dist/core/Taskforce.d.ts +479 -59
  238. package/dist/core/Taskforce.js +3671 -841
  239. package/dist/core/WorkflowAssignmentService.d.ts +40 -0
  240. package/dist/core/WorkflowAssignmentService.js +158 -0
  241. package/dist/core/WorkflowExecutionService.d.ts +69 -0
  242. package/dist/core/WorkflowExecutionService.js +342 -0
  243. package/dist/core/WorkflowTaskActivationService.d.ts +32 -0
  244. package/dist/core/WorkflowTaskActivationService.js +63 -0
  245. package/dist/core/WorkflowTemplateService.d.ts +64 -0
  246. package/dist/core/WorkflowTemplateService.js +223 -0
  247. package/dist/core/WorkspaceLifecycleService.d.ts +1 -0
  248. package/dist/core/WorkspaceLifecycleService.js +18 -0
  249. package/dist/core/WorkstreamDurableMutationService.d.ts +90 -0
  250. package/dist/core/WorkstreamDurableMutationService.js +184 -0
  251. package/dist/core/planningReferencePolicy.d.ts +14 -0
  252. package/dist/core/planningReferencePolicy.js +53 -0
  253. package/dist/core/taskReferencePolicy.js +24 -3
  254. package/dist/core/types.d.ts +10 -10
  255. package/dist/documentReviews/DocumentReviewCommentStore.d.ts +22 -2
  256. package/dist/documentReviews/DocumentReviewCommentStore.js +92 -8
  257. package/dist/documentReviews/commandService.d.ts +51 -0
  258. package/dist/documentReviews/commandService.js +63 -0
  259. package/dist/documentReviews/service.d.ts +20 -1
  260. package/dist/documentReviews/service.js +234 -24
  261. package/dist/documentReviews/types.d.ts +18 -1
  262. package/dist/hooks/sync/bootstrap.d.ts +3 -7
  263. package/dist/hooks/sync/bootstrap.js +6 -14
  264. package/dist/hooks/sync/browserSyncAuthority.d.ts +21 -0
  265. package/dist/hooks/sync/browserSyncAuthority.js +70 -0
  266. package/dist/hooks/sync/browserSyncRemoteServices.d.ts +29 -0
  267. package/dist/hooks/sync/browserSyncRemoteServices.js +58 -0
  268. package/dist/hooks/sync/controlPlane.d.ts +1 -37
  269. package/dist/hooks/sync/controlPlane.js +1 -78
  270. package/dist/hooks/sync/lifecyclePolicy.d.ts +1 -45
  271. package/dist/hooks/sync/lifecyclePolicy.js +1 -93
  272. package/dist/hooks/sync/orchestratorShared.d.ts +9 -3
  273. package/dist/hooks/sync/orchestratorShared.js +70 -96
  274. package/dist/hooks/sync/pullLifecycle.d.ts +1 -31
  275. package/dist/hooks/sync/pullLifecycle.js +1 -24
  276. package/dist/hooks/sync/realtime.d.ts +4 -1
  277. package/dist/hooks/sync/realtime.js +103 -3
  278. package/dist/hooks/sync/recovery.d.ts +1 -84
  279. package/dist/hooks/sync/recovery.js +1 -245
  280. package/dist/hooks/sync/transfers.d.ts +8 -129
  281. package/dist/hooks/sync/transfers.js +19 -581
  282. package/dist/hooks/sync/useDataVersionRefresh.d.ts +6 -1
  283. package/dist/hooks/sync/useDataVersionRefresh.js +127 -12
  284. package/dist/hooks/sync/useDurableLocalOutboxDrain.d.ts +14 -0
  285. package/dist/hooks/sync/useDurableLocalOutboxDrain.js +208 -0
  286. package/dist/hooks/sync/useDurableTaskCreateMutation.d.ts +15 -0
  287. package/dist/hooks/sync/useDurableTaskCreateMutation.js +152 -0
  288. package/dist/hooks/sync/useDurableTaskDeleteMutation.d.ts +11 -0
  289. package/dist/hooks/sync/useDurableTaskDeleteMutation.js +21 -0
  290. package/dist/hooks/sync/useDurableTaskLifecycleMutation.d.ts +12 -0
  291. package/dist/hooks/sync/useDurableTaskLifecycleMutation.js +22 -0
  292. package/dist/hooks/sync/useDurableTaskMetadataMutation.d.ts +14 -0
  293. package/dist/hooks/sync/useDurableTaskMetadataMutation.js +24 -0
  294. package/dist/hooks/sync/useDurableTaskRestoreMutation.d.ts +12 -0
  295. package/dist/hooks/sync/useDurableTaskRestoreMutation.js +24 -0
  296. package/dist/hooks/sync/useDurableTaskStatusMutation.d.ts +18 -0
  297. package/dist/hooks/sync/useDurableTaskStatusMutation.js +23 -0
  298. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +23 -0
  299. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +414 -0
  300. package/dist/hooks/sync/useSyncStatusActions.d.ts +2 -1
  301. package/dist/hooks/sync/useSyncStatusActions.js +8 -3
  302. package/dist/hooks/tasks/taskHttpMutation.d.ts +25 -0
  303. package/dist/hooks/tasks/taskHttpMutation.js +134 -0
  304. package/dist/hooks/tasks/useCurrentTaskRelations.d.ts +6 -1
  305. package/dist/hooks/tasks/useCurrentTaskRelations.js +32 -6
  306. package/dist/hooks/tasks/useTaskEditorNavigation.d.ts +4 -3
  307. package/dist/hooks/tasks/useTaskEditorNavigation.js +9 -13
  308. package/dist/hooks/tasks/useTaskFormActions.d.ts +17 -2
  309. package/dist/hooks/tasks/useTaskFormActions.js +309 -55
  310. package/dist/hooks/tasks/useTaskReferenceContract.d.ts +5 -0
  311. package/dist/hooks/tasks/useTaskReferenceContract.js +17 -0
  312. package/dist/hooks/tasks/useTaskRelationships.d.ts +1 -3
  313. package/dist/hooks/tasks/useTaskRelationships.js +5 -25
  314. package/dist/hooks/tasks/useTrashSelection.d.ts +12 -0
  315. package/dist/hooks/tasks/useTrashSelection.js +49 -0
  316. package/dist/hooks/ui/useInitiativeTemplates.d.ts +24 -0
  317. package/dist/hooks/ui/useInitiativeTemplates.js +22 -0
  318. package/dist/hooks/ui/useSettingsModel.d.ts +5 -29
  319. package/dist/hooks/ui/useSettingsModel.js +31 -15
  320. package/dist/hooks/ui/useSettingsPersistence.d.ts +0 -1
  321. package/dist/hooks/ui/useSettingsPersistence.js +4 -8
  322. package/dist/hooks/ui/useSettingsTaxonomyManagement.js +31 -0
  323. package/dist/hooks/useFilterSort.d.ts +2 -2
  324. package/dist/hooks/useFilterSort.js +19 -15
  325. package/dist/hooks/useRealtimeSync.d.ts +10 -0
  326. package/dist/hooks/useRealtimeSync.js +57 -4
  327. package/dist/hooks/useSyncOrchestrator.d.ts +32 -1
  328. package/dist/hooks/useSyncOrchestrator.js +963 -287
  329. package/dist/hooks/useTaskData.d.ts +11 -2
  330. package/dist/hooks/useTaskData.js +59 -26
  331. package/dist/hooks/useTaskMutations.d.ts +42 -5
  332. package/dist/hooks/useTaskMutations.js +750 -125
  333. package/dist/hooks/useTaskforce.d.ts +114 -118
  334. package/dist/hooks/useTaskforce.js +1102 -449
  335. package/dist/hooks/useUiNotice.d.ts +5 -1
  336. package/dist/hooks/useUiNotice.js +13 -2
  337. package/dist/hooks/useWorkspaceSyncController.d.ts +9 -0
  338. package/dist/hooks/useWorkspaceSyncController.js +159 -17
  339. package/dist/hooks/workspace/usePersistedAppUiState.d.ts +74 -0
  340. package/dist/hooks/workspace/usePersistedAppUiState.js +325 -0
  341. package/dist/hooks/workspace/usePersistedLayoutUiState.d.ts +76 -0
  342. package/dist/hooks/workspace/usePersistedLayoutUiState.js +479 -0
  343. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.d.ts +2 -7
  344. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +42 -31
  345. package/dist/hooks/workspace/workspaceLocalState.d.ts +17 -6
  346. package/dist/hooks/workspace/workspaceLocalState.js +175 -5
  347. package/dist/hooks/workstreams/workstreamHttpMutation.d.ts +23 -0
  348. package/dist/hooks/workstreams/workstreamHttpMutation.js +134 -0
  349. package/dist/localization/locales/en-US.d.ts +3 -3
  350. package/dist/localization/locales/en-US.js +3 -3
  351. package/dist/localization/locales/es-419.js +3 -3
  352. package/dist/localization/locales/pt-BR.js +3 -3
  353. package/dist/mcp/adminWorkspaceRegistrar.js +2 -30
  354. package/dist/mcp/aiProfileBootstrap.d.ts +3 -0
  355. package/dist/mcp/aiProfileBootstrap.js +4 -0
  356. package/dist/mcp/canonicalAssetHelpers.d.ts +16 -4
  357. package/dist/mcp/canonicalAssetHelpers.js +104 -35
  358. package/dist/mcp/clientIntegrations.d.ts +4 -2
  359. package/dist/mcp/clientIntegrations.js +58 -57
  360. package/dist/mcp/clientRegistry.d.ts +30 -0
  361. package/dist/mcp/clientRegistry.js +134 -0
  362. package/dist/mcp/collaborationRegistrar.js +20 -6
  363. package/dist/mcp/documentAssetRegistrar.js +220 -52
  364. package/dist/mcp/documentContentCommand.d.ts +94 -0
  365. package/dist/mcp/documentContentCommand.js +226 -0
  366. package/dist/mcp/documentHelpers.d.ts +13 -65
  367. package/dist/mcp/documentHelpers.js +49 -62
  368. package/dist/mcp/durableTaskMutationRouter.d.ts +65 -0
  369. package/dist/mcp/durableTaskMutationRouter.js +217 -0
  370. package/dist/mcp/durableTaskRelationshipMutationRouter.d.ts +38 -0
  371. package/dist/mcp/durableTaskRelationshipMutationRouter.js +168 -0
  372. package/dist/mcp/durableTaskRootMutationRouter.d.ts +64 -0
  373. package/dist/mcp/durableTaskRootMutationRouter.js +226 -0
  374. package/dist/mcp/gitWorktreeRoots.d.ts +2 -0
  375. package/dist/mcp/gitWorktreeRoots.js +19 -0
  376. package/dist/mcp/legacyServer.d.ts +1 -0
  377. package/dist/mcp/legacyServer.js +42 -0
  378. package/dist/mcp/localCliHealth.d.ts +56 -0
  379. package/dist/mcp/localCliHealth.js +170 -0
  380. package/dist/mcp/localServiceProxy.d.ts +23 -0
  381. package/dist/mcp/localServiceProxy.js +255 -0
  382. package/dist/mcp/mcpInputValidator.d.ts +17 -0
  383. package/dist/mcp/mcpInputValidator.js +58 -0
  384. package/dist/mcp/planningAttachmentCommandAdapter.d.ts +127 -0
  385. package/dist/mcp/planningAttachmentCommandAdapter.js +188 -0
  386. package/dist/mcp/programScaffoldCommandAdapter.d.ts +6 -0
  387. package/dist/mcp/programScaffoldCommandAdapter.js +39 -0
  388. package/dist/mcp/proxyServer.d.ts +1 -0
  389. package/dist/mcp/proxyServer.js +2 -0
  390. package/dist/mcp/runtime.d.ts +82 -1
  391. package/dist/mcp/runtime.js +4285 -1925
  392. package/dist/mcp/server.js +29 -2
  393. package/dist/mcp/sharedLocalServiceGateD.d.ts +115 -0
  394. package/dist/mcp/sharedLocalServiceGateD.js +344 -0
  395. package/dist/mcp/stdioLifecycle.d.ts +22 -0
  396. package/dist/mcp/stdioLifecycle.js +54 -0
  397. package/dist/mcp/taskAttachmentCommandAdapter.d.ts +190 -0
  398. package/dist/mcp/taskAttachmentCommandAdapter.js +464 -0
  399. package/dist/mcp/taskAttachmentHelpers.d.ts +8 -6
  400. package/dist/mcp/taskAttachmentHelpers.js +74 -2
  401. package/dist/mcp/taskAttachmentTypes.d.ts +26 -5
  402. package/dist/mcp/taskPlanCommand.d.ts +64 -0
  403. package/dist/mcp/taskPlanCommand.js +98 -0
  404. package/dist/mcp/taskPlanningRegistrar.js +215 -27
  405. package/dist/mcp/toolCallCompatibility.d.ts +6 -0
  406. package/dist/mcp/toolCallCompatibility.js +16 -0
  407. package/dist/mcp/toolCatalog.d.ts +3 -1
  408. package/dist/mcp/toolProfiles.d.ts +12 -1
  409. package/dist/mcp/toolProfiles.js +43 -0
  410. package/dist/mcp/toolRegistry.d.ts +17 -2
  411. package/dist/mcp/toolRegistry.js +24 -9
  412. package/dist/mcp/workflowExecutionRegistrar.d.ts +2 -0
  413. package/dist/mcp/workflowExecutionRegistrar.js +51 -0
  414. package/dist/migrations/taskSchemaMigrations.d.ts +35 -0
  415. package/dist/migrations/taskSchemaMigrations.js +1797 -4
  416. package/dist/migrations/taskUpdatedAtSyncDriftMigration.d.ts +20 -0
  417. package/dist/migrations/taskUpdatedAtSyncDriftMigration.js +153 -0
  418. package/dist/migrations/taskforceAgentDefinitionMigration.d.ts +26 -0
  419. package/dist/migrations/taskforceAgentDefinitionMigration.js +116 -0
  420. package/dist/plugins/vite.js +48 -17
  421. package/dist/public/Taskforce_Van.webp +0 -0
  422. package/dist/runtime/appGateDefinitions.d.ts +16 -10
  423. package/dist/runtime/appGateDefinitions.js +16 -10
  424. package/dist/runtime/appGates.d.ts +5 -4
  425. package/dist/runtime/appGates.js +4 -3
  426. package/dist/server/aiProfileAvatarAssets.d.ts +11 -8
  427. package/dist/server/aiProfileAvatarAssets.js +159 -70
  428. package/dist/server/auth.js +15 -1
  429. package/dist/server/cors.d.ts +2 -1
  430. package/dist/server/cors.js +45 -8
  431. package/dist/server/email.d.ts +3 -1
  432. package/dist/server/email.js +46 -8
  433. package/dist/server/index.d.ts +24 -1
  434. package/dist/server/index.js +342 -46
  435. package/dist/server/localDataOwnerPermit.d.ts +18 -0
  436. package/dist/server/localDataOwnerPermit.js +58 -0
  437. package/dist/server/localDatabaseIdentity.d.ts +14 -0
  438. package/dist/server/localDatabaseIdentity.js +69 -0
  439. package/dist/server/localRealtimeFileInvalidation.d.ts +1 -0
  440. package/dist/server/localRealtimeFileInvalidation.js +7 -0
  441. package/dist/server/localServiceLease.d.ts +62 -0
  442. package/dist/server/localServiceLease.js +477 -0
  443. package/dist/server/localServiceOwnershipBootstrap.d.ts +19 -0
  444. package/dist/server/localServiceOwnershipBootstrap.js +84 -0
  445. package/dist/server/localServiceSessions.d.ts +87 -0
  446. package/dist/server/localServiceSessions.js +309 -0
  447. package/dist/server/localServiceWindowsAcl.d.ts +8 -0
  448. package/dist/server/localServiceWindowsAcl.js +60 -0
  449. package/dist/server/localSyncProcessLockBootstrap.d.ts +3 -0
  450. package/dist/server/localSyncProcessLockBootstrap.js +16 -0
  451. package/dist/server/localWorkspaceSyncServerComposition.d.ts +59 -0
  452. package/dist/server/localWorkspaceSyncServerComposition.js +91 -0
  453. package/dist/server/localWorkspaceSyncServerRuntime.d.ts +119 -0
  454. package/dist/server/localWorkspaceSyncServerRuntime.js +1163 -0
  455. package/dist/server/rateLimit.d.ts +1 -0
  456. package/dist/server/rateLimit.js +16 -0
  457. package/dist/server/routes/admin.d.ts +2 -4
  458. package/dist/server/routes/admin.js +199 -337
  459. package/dist/server/routes/agentRoles.d.ts +13 -0
  460. package/dist/server/routes/agentRoles.js +273 -0
  461. package/dist/server/routes/agentSkills.d.ts +16 -0
  462. package/dist/server/routes/agentSkills.js +291 -0
  463. package/dist/server/routes/agents.d.ts +49 -0
  464. package/dist/server/routes/agents.js +1455 -0
  465. package/dist/server/routes/annotatedAttachments.js +46 -9
  466. package/dist/server/routes/assetAccess.d.ts +36 -0
  467. package/dist/server/routes/assetAccess.js +93 -0
  468. package/dist/server/routes/auth.d.ts +4 -3
  469. package/dist/server/routes/auth.js +236 -21
  470. package/dist/server/routes/authSupport.d.ts +3 -1
  471. package/dist/server/routes/authSupport.js +22 -8
  472. package/dist/server/routes/documentReviews.d.ts +2 -0
  473. package/dist/server/routes/documentReviews.js +155 -15
  474. package/dist/server/routes/documents.d.ts +1 -0
  475. package/dist/server/routes/documents.js +335 -141
  476. package/dist/server/routes/durableTaskHttpRouters.d.ts +165 -0
  477. package/dist/server/routes/durableTaskHttpRouters.js +89 -0
  478. package/dist/server/routes/localMcpHealth.d.ts +11 -0
  479. package/dist/server/routes/localMcpHealth.js +29 -0
  480. package/dist/server/routes/localService.d.ts +13 -0
  481. package/dist/server/routes/localService.js +444 -0
  482. package/dist/server/routes/localUpdate.d.ts +11 -0
  483. package/dist/server/routes/localUpdate.js +154 -0
  484. package/dist/server/routes/primitives.d.ts +27 -0
  485. package/dist/server/routes/primitives.js +18 -0
  486. package/dist/server/routes/resources.d.ts +1 -10
  487. package/dist/server/routes/resources.js +1 -153
  488. package/dist/server/routes/shared.d.ts +31 -2
  489. package/dist/server/routes/shared.js +394 -0
  490. package/dist/server/routes/sync.d.ts +2 -0
  491. package/dist/server/routes/sync.js +184 -272
  492. package/dist/server/routes/syncAuxRoutes.d.ts +3 -1
  493. package/dist/server/routes/syncAuxRoutes.js +9 -4
  494. package/dist/server/routes/syncCoordinatorLocalRoutes.d.ts +6 -0
  495. package/dist/server/routes/syncCoordinatorLocalRoutes.js +867 -0
  496. package/dist/server/routes/syncPullApplyRoutes.d.ts +29 -1
  497. package/dist/server/routes/syncPullApplyRoutes.js +520 -17
  498. package/dist/server/routes/syncPushRoutes.d.ts +33 -4
  499. package/dist/server/routes/syncPushRoutes.js +251 -62
  500. package/dist/server/routes/syncRouteTypes.d.ts +1 -1
  501. package/dist/server/routes/syncSnapshotRoutes.d.ts +15 -7
  502. package/dist/server/routes/syncSnapshotRoutes.js +95 -17
  503. package/dist/server/routes/syncV3DiagnosticsRoutes.d.ts +14 -0
  504. package/dist/server/routes/syncV3DiagnosticsRoutes.js +72 -0
  505. package/dist/server/routes/syncV3FeedRoutes.d.ts +20 -0
  506. package/dist/server/routes/syncV3FeedRoutes.js +462 -0
  507. package/dist/server/routes/syncV3LocalCaptureRoutes.d.ts +37 -0
  508. package/dist/server/routes/syncV3LocalCaptureRoutes.js +897 -0
  509. package/dist/server/routes/syncV3LocalDispatchRoutes.d.ts +17 -0
  510. package/dist/server/routes/syncV3LocalDispatchRoutes.js +280 -0
  511. package/dist/server/routes/syncV3LocalFeedApplyRoutes.d.ts +17 -0
  512. package/dist/server/routes/syncV3LocalFeedApplyRoutes.js +493 -0
  513. package/dist/server/routes/syncV3LocalOwnershipRoutes.d.ts +10 -0
  514. package/dist/server/routes/syncV3LocalOwnershipRoutes.js +51 -0
  515. package/dist/server/routes/syncV3LocalRecoveryRoutes.d.ts +12 -0
  516. package/dist/server/routes/syncV3LocalRecoveryRoutes.js +78 -0
  517. package/dist/server/routes/syncV3OperationRoutes.d.ts +35 -0
  518. package/dist/server/routes/syncV3OperationRoutes.js +1136 -0
  519. package/dist/server/routes/tasks.d.ts +0 -2
  520. package/dist/server/routes/tasks.js +932 -195
  521. package/dist/server/routes/workflows.d.ts +26 -0
  522. package/dist/server/routes/workflows.js +500 -0
  523. package/dist/server/routes.d.ts +1 -6
  524. package/dist/server/routes.js +148 -339
  525. package/dist/server/smtpTransport.d.ts +11 -3
  526. package/dist/server/smtpTransport.js +9 -2
  527. package/dist/server/start.js +42 -10
  528. package/dist/service/localServiceCli.d.ts +33 -0
  529. package/dist/service/localServiceCli.js +365 -0
  530. package/dist/service/localServiceClientLifecycle.d.ts +25 -0
  531. package/dist/service/localServiceClientLifecycle.js +128 -0
  532. package/dist/service/localServiceOpen.d.ts +17 -0
  533. package/dist/service/localServiceOpen.js +27 -0
  534. package/dist/services/agentRoleResolver.d.ts +4 -0
  535. package/dist/services/agentRoleResolver.js +7 -0
  536. package/dist/services/aiProfileAvatarGenerationService.d.ts +41 -0
  537. package/dist/services/aiProfileAvatarGenerationService.js +158 -0
  538. package/dist/services/avatarImageProvider.d.ts +33 -0
  539. package/dist/services/avatarImageProvider.js +140 -0
  540. package/dist/services/bedrockAnthropicMessagesModelGateway.d.ts +24 -0
  541. package/dist/services/bedrockAnthropicMessagesModelGateway.js +95 -0
  542. package/dist/services/bedrockMantleModelGateway.d.ts +43 -0
  543. package/dist/services/bedrockMantleModelGateway.js +81 -0
  544. package/dist/services/bedrockModelGateway.d.ts +26 -0
  545. package/dist/services/bedrockModelGateway.js +94 -0
  546. package/dist/services/modelGateway.d.ts +82 -0
  547. package/dist/services/modelGateway.js +61 -0
  548. package/dist/services/taskforceAgentAvatarImageProvider.d.ts +8 -0
  549. package/dist/services/taskforceAgentAvatarImageProvider.js +24 -0
  550. package/dist/services/taskforceAgentMcpBridge.d.ts +77 -0
  551. package/dist/services/taskforceAgentMcpBridge.js +527 -0
  552. package/dist/shared/agentRoleDefinition.d.ts +34 -0
  553. package/dist/shared/agentRoleDefinition.js +207 -0
  554. package/dist/shared/aiProfileAvatarEligibility.d.ts +10 -0
  555. package/dist/shared/aiProfileAvatarEligibility.js +27 -0
  556. package/dist/shared/aiProfileColors.d.ts +7 -0
  557. package/dist/shared/aiProfileColors.js +33 -0
  558. package/dist/shared/colorPalette.d.ts +3 -0
  559. package/dist/shared/colorPalette.js +20 -0
  560. package/dist/shared/commentProvenance.d.ts +4 -0
  561. package/dist/shared/commentProvenance.js +6 -0
  562. package/dist/shared/deletedTaskRetention.d.ts +2 -0
  563. package/dist/shared/deletedTaskRetention.js +7 -0
  564. package/dist/shared/passwordPolicy.d.ts +2 -1
  565. package/dist/shared/passwordPolicy.js +9 -0
  566. package/dist/shared/taskDeepLinks.d.ts +28 -0
  567. package/dist/shared/taskDeepLinks.js +48 -0
  568. package/dist/shared/taskRestoreDestination.d.ts +2 -0
  569. package/dist/shared/taskRestoreDestination.js +5 -0
  570. package/dist/shared/taskforceAgentDefinition.d.ts +88 -0
  571. package/dist/shared/taskforceAgentDefinition.js +434 -0
  572. package/dist/shared/taskforceAgentExecutionSnapshot.d.ts +50 -0
  573. package/dist/shared/taskforceAgentExecutionSnapshot.js +68 -0
  574. package/dist/shared/taskforceAgentModels.d.ts +56 -0
  575. package/dist/shared/taskforceAgentModels.js +314 -0
  576. package/dist/shared/taskforceAgentRunContext.d.ts +23 -0
  577. package/dist/shared/taskforceAgentRunContext.js +21 -0
  578. package/dist/shared/taskforceAgentRuntimeResolution.d.ts +31 -0
  579. package/dist/shared/taskforceAgentRuntimeResolution.js +72 -0
  580. package/dist/shared/taskforceAgentSkill.d.ts +33 -0
  581. package/dist/shared/taskforceAgentSkill.js +149 -0
  582. package/dist/storage/agentRoleStore.d.ts +91 -0
  583. package/dist/storage/agentRoleStore.js +385 -0
  584. package/dist/storage/databaseAdapter.d.ts +1 -0
  585. package/dist/storage/databaseAdapter.js +7 -1
  586. package/dist/storage/documentIntegrity.d.ts +12 -3
  587. package/dist/storage/documentIntegrity.js +105 -27
  588. package/dist/storage/objectStorageClient.d.ts +10 -4
  589. package/dist/storage/objectStorageClient.js +73 -43
  590. package/dist/storage/postgresAdapter.d.ts +2 -1
  591. package/dist/storage/postgresAdapter.js +38 -6
  592. package/dist/storage/postgresWorker.js +65 -1
  593. package/dist/storage/sqliteAdapter.d.ts +1 -1
  594. package/dist/storage/sqliteAdapter.js +7 -1
  595. package/dist/storage/sqliteWalHealth.d.ts +71 -0
  596. package/dist/storage/sqliteWalHealth.js +176 -0
  597. package/dist/storage/taskDataPath.d.ts +1 -0
  598. package/dist/storage/taskDataPath.js +20 -0
  599. package/dist/storage/taskforceAgentConversationStore.d.ts +66 -0
  600. package/dist/storage/taskforceAgentConversationStore.js +264 -0
  601. package/dist/storage/taskforceAgentSkillStore.d.ts +93 -0
  602. package/dist/storage/taskforceAgentSkillStore.js +355 -0
  603. package/dist/storage/taskforceAgentStore.d.ts +105 -0
  604. package/dist/storage/taskforceAgentStore.js +549 -0
  605. package/dist/storage/workflowStore.d.ts +223 -0
  606. package/dist/storage/workflowStore.js +1032 -0
  607. package/dist/storage/workspaceAssetStore.d.ts +70 -0
  608. package/dist/storage/workspaceAssetStore.js +418 -25
  609. package/dist/sync/aiProfileAvatarSyncPaths.d.ts +14 -0
  610. package/dist/sync/aiProfileAvatarSyncPaths.js +56 -0
  611. package/dist/sync/cloudSyncApi.d.ts +329 -0
  612. package/dist/sync/cloudSyncApi.js +574 -1
  613. package/dist/sync/collaborationSyncPayload.d.ts +5 -1
  614. package/dist/sync/collaborationSyncPayload.js +213 -1
  615. package/dist/sync/collaborationSyncState.d.ts +23 -3
  616. package/dist/sync/collaborationSyncState.js +92 -3
  617. package/dist/sync/contentSyncPayload.d.ts +9 -0
  618. package/dist/sync/contentSyncPayload.js +29 -0
  619. package/dist/sync/contentSyncState.d.ts +79 -4
  620. package/dist/sync/contentSyncState.js +1113 -313
  621. package/dist/sync/coordinator/localSyncBrowserApplyPermitContext.d.ts +39 -0
  622. package/dist/sync/coordinator/localSyncBrowserApplyPermitContext.js +234 -0
  623. package/dist/sync/coordinator/localSyncBrowserAuthorityCapability.d.ts +7 -0
  624. package/dist/sync/coordinator/localSyncBrowserAuthorityCapability.js +10 -0
  625. package/dist/sync/coordinator/localSyncCommittedApplyPolicy.d.ts +7 -0
  626. package/dist/sync/coordinator/localSyncCommittedApplyPolicy.js +41 -0
  627. package/dist/sync/coordinator/localSyncCoordinatorBrowserClient.d.ts +178 -0
  628. package/dist/sync/coordinator/localSyncCoordinatorBrowserClient.js +131 -0
  629. package/dist/sync/coordinator/localSyncCoordinatorCommandLifecycle.d.ts +25 -0
  630. package/dist/sync/coordinator/localSyncCoordinatorCommandLifecycle.js +200 -0
  631. package/dist/sync/coordinator/localSyncCoordinatorHost.d.ts +84 -0
  632. package/dist/sync/coordinator/localSyncCoordinatorHost.js +435 -0
  633. package/dist/sync/coordinator/localSyncCoordinatorRouteServices.d.ts +33 -0
  634. package/dist/sync/coordinator/localSyncCoordinatorRouteServices.js +1 -0
  635. package/dist/sync/coordinator/localSyncCoordinatorStore.d.ts +122 -0
  636. package/dist/sync/coordinator/localSyncCoordinatorStore.js +1039 -0
  637. package/dist/sync/coordinator/localSyncCoordinatorTypes.d.ts +82 -0
  638. package/dist/sync/coordinator/localSyncCoordinatorTypes.js +9 -0
  639. package/dist/sync/coordinator/localSyncDispatchTracker.d.ts +15 -0
  640. package/dist/sync/coordinator/localSyncDispatchTracker.js +68 -0
  641. package/dist/sync/coordinator/localSyncExecutionPermitStore.d.ts +200 -0
  642. package/dist/sync/coordinator/localSyncExecutionPermitStore.js +1388 -0
  643. package/dist/sync/coordinator/localSyncExecutionPermitTypes.d.ts +52 -0
  644. package/dist/sync/coordinator/localSyncExecutionPermitTypes.js +8 -0
  645. package/dist/sync/coordinator/localSyncOwnershipDrainBarrier.d.ts +33 -0
  646. package/dist/sync/coordinator/localSyncOwnershipDrainBarrier.js +83 -0
  647. package/dist/sync/coordinator/localSyncPermitTransactionHooks.d.ts +9 -0
  648. package/dist/sync/coordinator/localSyncPermitTransactionHooks.js +27 -0
  649. package/dist/sync/coordinator/localSyncProcessLock.d.ts +12 -0
  650. package/dist/sync/coordinator/localSyncProcessLock.js +212 -0
  651. package/dist/sync/coordinator/localSyncV3DispatchRecoveryReconciler.d.ts +17 -0
  652. package/dist/sync/coordinator/localSyncV3DispatchRecoveryReconciler.js +82 -0
  653. package/dist/sync/coordinator/localWorkspaceSyncRunner.d.ts +134 -0
  654. package/dist/sync/coordinator/localWorkspaceSyncRunner.js +981 -0
  655. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +189 -0
  656. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +961 -0
  657. package/dist/sync/coordinator/workspaceSyncCloudCredentialValidator.d.ts +19 -0
  658. package/dist/sync/coordinator/workspaceSyncCloudCredentialValidator.js +83 -0
  659. package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +117 -0
  660. package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +323 -0
  661. package/dist/sync/coordinator/workspaceSyncLocalAccessBootstrap.d.ts +11 -0
  662. package/dist/sync/coordinator/workspaceSyncLocalAccessBootstrap.js +51 -0
  663. package/dist/sync/coordinator/workspaceSyncTransportGateway.d.ts +139 -0
  664. package/dist/sync/coordinator/workspaceSyncTransportGateway.js +738 -0
  665. package/dist/sync/engine/localWorkspaceContentManifestService.d.ts +21 -0
  666. package/dist/sync/engine/localWorkspaceContentManifestService.js +44 -0
  667. package/dist/sync/engine/workspaceSyncAtomicLocalPublisher.d.ts +36 -0
  668. package/dist/sync/engine/workspaceSyncAtomicLocalPublisher.js +203 -0
  669. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +21 -0
  670. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.js +13 -0
  671. package/dist/sync/engine/workspaceSyncContentPullObligationStore.d.ts +65 -0
  672. package/dist/sync/engine/workspaceSyncContentPullObligationStore.js +160 -0
  673. package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +216 -0
  674. package/dist/sync/engine/workspaceSyncContentVersionStore.js +1068 -0
  675. package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.d.ts +28 -0
  676. package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.js +543 -0
  677. package/dist/sync/engine/workspaceSyncEngineContracts.d.ts +78 -0
  678. package/dist/sync/engine/workspaceSyncEngineContracts.js +1 -0
  679. package/dist/sync/engine/workspaceSyncEngineControlPlane.d.ts +37 -0
  680. package/dist/sync/engine/workspaceSyncEngineControlPlane.js +79 -0
  681. package/dist/sync/engine/workspaceSyncEngineIdentity.d.ts +1 -0
  682. package/dist/sync/engine/workspaceSyncEngineIdentity.js +4 -0
  683. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.d.ts +68 -0
  684. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +180 -0
  685. package/dist/sync/engine/workspaceSyncEngineLocalApply.d.ts +72 -0
  686. package/dist/sync/engine/workspaceSyncEngineLocalApply.js +132 -0
  687. package/dist/sync/engine/workspaceSyncEngineLocalServices.d.ts +70 -0
  688. package/dist/sync/engine/workspaceSyncEngineLocalServices.js +25 -0
  689. package/dist/sync/engine/workspaceSyncEngineParity.d.ts +8 -0
  690. package/dist/sync/engine/workspaceSyncEngineParity.js +7 -0
  691. package/dist/sync/engine/workspaceSyncEnginePullPolicy.d.ts +32 -0
  692. package/dist/sync/engine/workspaceSyncEnginePullPolicy.js +27 -0
  693. package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +20 -0
  694. package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +87 -0
  695. package/dist/sync/engine/workspaceSyncEngineRecovery.d.ts +56 -0
  696. package/dist/sync/engine/workspaceSyncEngineRecovery.js +288 -0
  697. package/dist/sync/engine/workspaceSyncEngineRemoteServices.d.ts +104 -0
  698. package/dist/sync/engine/workspaceSyncEngineRemoteServices.js +21 -0
  699. package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +61 -0
  700. package/dist/sync/engine/workspaceSyncEngineRuntime.js +59 -0
  701. package/dist/sync/engine/workspaceSyncEngineServerApplyBoundary.d.ts +28 -0
  702. package/dist/sync/engine/workspaceSyncEngineServerApplyBoundary.js +86 -0
  703. package/dist/sync/engine/workspaceSyncEngineServerLocalServices.d.ts +73 -0
  704. package/dist/sync/engine/workspaceSyncEngineServerLocalServices.js +452 -0
  705. package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.d.ts +23 -0
  706. package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.js +451 -0
  707. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.d.ts +125 -0
  708. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +1124 -0
  709. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.d.ts +63 -0
  710. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +276 -0
  711. package/dist/sync/engine/workspaceSyncEngineTransferCompletion.d.ts +20 -0
  712. package/dist/sync/engine/workspaceSyncEngineTransferCompletion.js +37 -0
  713. package/dist/sync/engine/workspaceSyncEngineTransferTypes.d.ts +7 -0
  714. package/dist/sync/engine/workspaceSyncEngineTransferTypes.js +1 -0
  715. package/dist/sync/engine/workspaceSyncEngineTransfers.d.ts +240 -0
  716. package/dist/sync/engine/workspaceSyncEngineTransfers.js +1184 -0
  717. package/dist/sync/engine/workspaceSyncEngineV3LocalFeedApply.d.ts +39 -0
  718. package/dist/sync/engine/workspaceSyncEngineV3LocalFeedApply.js +39 -0
  719. package/dist/sync/engine/workspaceSyncImmutableContentGcRunner.d.ts +25 -0
  720. package/dist/sync/engine/workspaceSyncImmutableContentGcRunner.js +83 -0
  721. package/dist/sync/engine/workspaceSyncImmutableContentProvider.d.ts +71 -0
  722. package/dist/sync/engine/workspaceSyncImmutableContentProvider.js +209 -0
  723. package/dist/sync/engine/workspaceSyncImmutableContentStager.d.ts +32 -0
  724. package/dist/sync/engine/workspaceSyncImmutableContentStager.js +202 -0
  725. package/dist/sync/engine/workspaceSyncPublishedContentResolver.d.ts +43 -0
  726. package/dist/sync/engine/workspaceSyncPublishedContentResolver.js +142 -0
  727. package/dist/sync/engine/workspaceSyncServerContentRuntime.d.ts +26 -0
  728. package/dist/sync/engine/workspaceSyncServerContentRuntime.js +41 -0
  729. package/dist/sync/engine/workspaceSyncServerDataServices.d.ts +44 -0
  730. package/dist/sync/engine/workspaceSyncServerDataServices.js +143 -0
  731. package/dist/sync/engine/workspaceSyncTransferEvidence.d.ts +39 -0
  732. package/dist/sync/engine/workspaceSyncTransferEvidence.js +45 -0
  733. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +44 -0
  734. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +990 -0
  735. package/dist/sync/engine/workspaceSyncV2PreparedContent.d.ts +82 -0
  736. package/dist/sync/engine/workspaceSyncV2PreparedContent.js +219 -0
  737. package/dist/sync/planningCanonicalFields.d.ts +41 -0
  738. package/dist/sync/planningCanonicalFields.js +211 -0
  739. package/dist/sync/planningSyncPayload.d.ts +5 -1
  740. package/dist/sync/planningSyncPayload.js +88 -4
  741. package/dist/sync/syncApplyHandlers.d.ts +98 -8
  742. package/dist/sync/syncApplyHandlers.js +816 -78
  743. package/dist/sync/syncResourceAdapters.d.ts +10 -0
  744. package/dist/sync/syncResourceAdapters.js +21 -1
  745. package/dist/sync/syncService.d.ts +57 -1
  746. package/dist/sync/syncService.js +1085 -138
  747. package/dist/sync/taskNestedContent.d.ts +2 -0
  748. package/dist/sync/taskNestedContent.js +8 -0
  749. package/dist/sync/taskSyncChangeKey.js +0 -1
  750. package/dist/sync/taskSyncPayload.d.ts +0 -1
  751. package/dist/sync/taskSyncPayload.js +14 -3
  752. package/dist/sync/v3/canonicalWorkspaceSyncJson.d.ts +2 -0
  753. package/dist/sync/v3/canonicalWorkspaceSyncJson.js +26 -0
  754. package/dist/sync/v3/combinedFeedCapability.d.ts +21 -0
  755. package/dist/sync/v3/combinedFeedCapability.js +80 -0
  756. package/dist/sync/v3/combinedFeedPrerequisites.d.ts +18 -0
  757. package/dist/sync/v3/combinedFeedPrerequisites.js +184 -0
  758. package/dist/sync/v3/durableInitiativeMutationRouter.d.ts +61 -0
  759. package/dist/sync/v3/durableInitiativeMutationRouter.js +287 -0
  760. package/dist/sync/v3/durableOperationReplay.d.ts +36 -0
  761. package/dist/sync/v3/durableOperationReplay.js +103 -0
  762. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.d.ts +49 -0
  763. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +198 -0
  764. package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +47 -0
  765. package/dist/sync/v3/durableTaskChecklistMutationRouter.js +182 -0
  766. package/dist/sync/v3/durableTaskCommentMutationRouter.d.ts +47 -0
  767. package/dist/sync/v3/durableTaskCommentMutationRouter.js +191 -0
  768. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.d.ts +60 -0
  769. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.js +320 -0
  770. package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +40 -0
  771. package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +518 -0
  772. package/dist/sync/v3/durableTaxonomyMutationRouter.d.ts +63 -0
  773. package/dist/sync/v3/durableTaxonomyMutationRouter.js +289 -0
  774. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +77 -0
  775. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +361 -0
  776. package/dist/sync/v3/durableWorkstreamMutationRouter.d.ts +61 -0
  777. package/dist/sync/v3/durableWorkstreamMutationRouter.js +287 -0
  778. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.d.ts +42 -0
  779. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +122 -0
  780. package/dist/sync/v3/entityEventLegacyAdoptionContract.d.ts +6 -0
  781. package/dist/sync/v3/entityEventLegacyAdoptionContract.js +6 -0
  782. package/dist/sync/v3/entityEventLegacyAdoptionService.d.ts +62 -0
  783. package/dist/sync/v3/entityEventLegacyAdoptionService.js +180 -0
  784. package/dist/sync/v3/initiativeActivityAuthoritativeRevision.d.ts +11 -0
  785. package/dist/sync/v3/initiativeActivityAuthoritativeRevision.js +23 -0
  786. package/dist/sync/v3/initiativeActivityIdentity.d.ts +8 -0
  787. package/dist/sync/v3/initiativeActivityIdentity.js +14 -0
  788. package/dist/sync/v3/initiativeCoexistence.d.ts +26 -0
  789. package/dist/sync/v3/initiativeCoexistence.js +148 -0
  790. package/dist/sync/v3/initiativeFeedActivationCapability.d.ts +6 -0
  791. package/dist/sync/v3/initiativeFeedActivationCapability.js +16 -0
  792. package/dist/sync/v3/initiativeMutationPayload.d.ts +26 -0
  793. package/dist/sync/v3/initiativeMutationPayload.js +144 -0
  794. package/dist/sync/v3/initiativeMutationService.d.ts +62 -0
  795. package/dist/sync/v3/initiativeMutationService.js +206 -0
  796. package/dist/sync/v3/localEntityEventLegacyAdoption.d.ts +31 -0
  797. package/dist/sync/v3/localEntityEventLegacyAdoption.js +607 -0
  798. package/dist/sync/v3/localInitiativeOutboxHandler.d.ts +8 -0
  799. package/dist/sync/v3/localInitiativeOutboxHandler.js +88 -0
  800. package/dist/sync/v3/localInitiativeOutboxService.d.ts +50 -0
  801. package/dist/sync/v3/localInitiativeOutboxService.js +495 -0
  802. package/dist/sync/v3/localOperationIdentityStore.d.ts +81 -0
  803. package/dist/sync/v3/localOperationIdentityStore.js +388 -0
  804. package/dist/sync/v3/localOutboxDispatchCapability.d.ts +7 -0
  805. package/dist/sync/v3/localOutboxDispatchCapability.js +13 -0
  806. package/dist/sync/v3/localOutboxDispatchRuntime.d.ts +16 -0
  807. package/dist/sync/v3/localOutboxDispatchRuntime.js +269 -0
  808. package/dist/sync/v3/localOutboxDispatcher.d.ts +53 -0
  809. package/dist/sync/v3/localOutboxDispatcher.js +362 -0
  810. package/dist/sync/v3/localOutboxDrainClient.d.ts +50 -0
  811. package/dist/sync/v3/localOutboxDrainClient.js +250 -0
  812. package/dist/sync/v3/localOutboxOperationHandler.d.ts +31 -0
  813. package/dist/sync/v3/localOutboxOperationHandler.js +10 -0
  814. package/dist/sync/v3/localOutboxRecoveryClient.d.ts +14 -0
  815. package/dist/sync/v3/localOutboxRecoveryClient.js +45 -0
  816. package/dist/sync/v3/localOutboxRecoveryPreparationService.d.ts +12 -0
  817. package/dist/sync/v3/localOutboxRecoveryPreparationService.js +151 -0
  818. package/dist/sync/v3/localSyncIdentityStore.d.ts +9 -0
  819. package/dist/sync/v3/localSyncIdentityStore.js +43 -0
  820. package/dist/sync/v3/localTaskAttachmentLinksOutboxHandler.d.ts +10 -0
  821. package/dist/sync/v3/localTaskAttachmentLinksOutboxHandler.js +70 -0
  822. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.d.ts +45 -0
  823. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.js +291 -0
  824. package/dist/sync/v3/localTaskChecklistOutboxHandler.d.ts +10 -0
  825. package/dist/sync/v3/localTaskChecklistOutboxHandler.js +54 -0
  826. package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +47 -0
  827. package/dist/sync/v3/localTaskChecklistOutboxService.js +221 -0
  828. package/dist/sync/v3/localTaskCommentOutboxHandler.d.ts +10 -0
  829. package/dist/sync/v3/localTaskCommentOutboxHandler.js +94 -0
  830. package/dist/sync/v3/localTaskCommentOutboxService.d.ts +75 -0
  831. package/dist/sync/v3/localTaskCommentOutboxService.js +391 -0
  832. package/dist/sync/v3/localTaskCreateClient.d.ts +27 -0
  833. package/dist/sync/v3/localTaskCreateClient.js +209 -0
  834. package/dist/sync/v3/localTaskCreateOutboxHandler.d.ts +8 -0
  835. package/dist/sync/v3/localTaskCreateOutboxHandler.js +147 -0
  836. package/dist/sync/v3/localTaskCreateOutboxService.d.ts +77 -0
  837. package/dist/sync/v3/localTaskCreateOutboxService.js +397 -0
  838. package/dist/sync/v3/localTaskDeleteClient.d.ts +10 -0
  839. package/dist/sync/v3/localTaskDeleteClient.js +23 -0
  840. package/dist/sync/v3/localTaskDeleteOutboxHandler.d.ts +8 -0
  841. package/dist/sync/v3/localTaskDeleteOutboxHandler.js +54 -0
  842. package/dist/sync/v3/localTaskDeleteOutboxService.d.ts +38 -0
  843. package/dist/sync/v3/localTaskDeleteOutboxService.js +235 -0
  844. package/dist/sync/v3/localTaskLegacyRootAdoption.d.ts +28 -0
  845. package/dist/sync/v3/localTaskLegacyRootAdoption.js +219 -0
  846. package/dist/sync/v3/localTaskLifecycleClient.d.ts +49 -0
  847. package/dist/sync/v3/localTaskLifecycleClient.js +57 -0
  848. package/dist/sync/v3/localTaskLifecycleOutboxHandler.d.ts +8 -0
  849. package/dist/sync/v3/localTaskLifecycleOutboxHandler.js +94 -0
  850. package/dist/sync/v3/localTaskLifecycleOutboxService.d.ts +60 -0
  851. package/dist/sync/v3/localTaskLifecycleOutboxService.js +304 -0
  852. package/dist/sync/v3/localTaskMetadataClient.d.ts +13 -0
  853. package/dist/sync/v3/localTaskMetadataClient.js +30 -0
  854. package/dist/sync/v3/localTaskMetadataOutboxHandler.d.ts +8 -0
  855. package/dist/sync/v3/localTaskMetadataOutboxHandler.js +70 -0
  856. package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +48 -0
  857. package/dist/sync/v3/localTaskMetadataOutboxService.js +229 -0
  858. package/dist/sync/v3/localTaskOperationClient.d.ts +72 -0
  859. package/dist/sync/v3/localTaskOperationClient.js +195 -0
  860. package/dist/sync/v3/localTaskRelationshipOutboxHandler.d.ts +8 -0
  861. package/dist/sync/v3/localTaskRelationshipOutboxHandler.js +114 -0
  862. package/dist/sync/v3/localTaskRelationshipOutboxService.d.ts +45 -0
  863. package/dist/sync/v3/localTaskRelationshipOutboxService.js +192 -0
  864. package/dist/sync/v3/localTaskRestoreClient.d.ts +13 -0
  865. package/dist/sync/v3/localTaskRestoreClient.js +32 -0
  866. package/dist/sync/v3/localTaskRestoreOutboxHandler.d.ts +8 -0
  867. package/dist/sync/v3/localTaskRestoreOutboxHandler.js +41 -0
  868. package/dist/sync/v3/localTaskRestoreOutboxService.d.ts +56 -0
  869. package/dist/sync/v3/localTaskRestoreOutboxService.js +323 -0
  870. package/dist/sync/v3/localTaskStatusClient.d.ts +17 -0
  871. package/dist/sync/v3/localTaskStatusClient.js +35 -0
  872. package/dist/sync/v3/localTaskStatusOutboxHandler.d.ts +8 -0
  873. package/dist/sync/v3/localTaskStatusOutboxHandler.js +75 -0
  874. package/dist/sync/v3/localTaskStatusOutboxService.d.ts +53 -0
  875. package/dist/sync/v3/localTaskStatusOutboxService.js +422 -0
  876. package/dist/sync/v3/localTaxonomyCompositeOutboxService.d.ts +34 -0
  877. package/dist/sync/v3/localTaxonomyCompositeOutboxService.js +290 -0
  878. package/dist/sync/v3/localTaxonomyOutboxHandler.d.ts +9 -0
  879. package/dist/sync/v3/localTaxonomyOutboxHandler.js +106 -0
  880. package/dist/sync/v3/localTaxonomyOutboxService.d.ts +30 -0
  881. package/dist/sync/v3/localTaxonomyOutboxService.js +181 -0
  882. package/dist/sync/v3/localWorkflowRuntimeOutboxHandler.d.ts +8 -0
  883. package/dist/sync/v3/localWorkflowRuntimeOutboxHandler.js +113 -0
  884. package/dist/sync/v3/localWorkflowRuntimeOutboxService.d.ts +37 -0
  885. package/dist/sync/v3/localWorkflowRuntimeOutboxService.js +330 -0
  886. package/dist/sync/v3/localWorkspaceSyncServerOutboxDispatcher.d.ts +63 -0
  887. package/dist/sync/v3/localWorkspaceSyncServerOutboxDispatcher.js +264 -0
  888. package/dist/sync/v3/localWorkstreamOutboxHandler.d.ts +8 -0
  889. package/dist/sync/v3/localWorkstreamOutboxHandler.js +102 -0
  890. package/dist/sync/v3/localWorkstreamOutboxService.d.ts +52 -0
  891. package/dist/sync/v3/localWorkstreamOutboxService.js +579 -0
  892. package/dist/sync/v3/localWorkstreamTaskOrderOutboxHandler.d.ts +10 -0
  893. package/dist/sync/v3/localWorkstreamTaskOrderOutboxHandler.js +57 -0
  894. package/dist/sync/v3/localWorkstreamTaskOrderOutboxService.d.ts +30 -0
  895. package/dist/sync/v3/localWorkstreamTaskOrderOutboxService.js +128 -0
  896. package/dist/sync/v3/planningActivation.d.ts +13 -0
  897. package/dist/sync/v3/planningActivation.js +33 -0
  898. package/dist/sync/v3/planningAttachmentActivityValidation.d.ts +9 -0
  899. package/dist/sync/v3/planningAttachmentActivityValidation.js +87 -0
  900. package/dist/sync/v3/programScaffoldService.d.ts +143 -0
  901. package/dist/sync/v3/programScaffoldService.js +478 -0
  902. package/dist/sync/v3/syncDurabilityStore.d.ts +773 -0
  903. package/dist/sync/v3/syncDurabilityStore.js +4635 -0
  904. package/dist/sync/v3/taskActivityAuthoritativeRevision.d.ts +16 -0
  905. package/dist/sync/v3/taskActivityAuthoritativeRevision.js +67 -0
  906. package/dist/sync/v3/taskActivityJournal.d.ts +20 -0
  907. package/dist/sync/v3/taskActivityJournal.js +195 -0
  908. package/dist/sync/v3/taskAttachmentLinksActivityIdentity.d.ts +6 -0
  909. package/dist/sync/v3/taskAttachmentLinksActivityIdentity.js +14 -0
  910. package/dist/sync/v3/taskAttachmentLinksMutationService.d.ts +111 -0
  911. package/dist/sync/v3/taskAttachmentLinksMutationService.js +202 -0
  912. package/dist/sync/v3/taskChecklistActivityIdentity.d.ts +6 -0
  913. package/dist/sync/v3/taskChecklistActivityIdentity.js +14 -0
  914. package/dist/sync/v3/taskChecklistMutationService.d.ts +92 -0
  915. package/dist/sync/v3/taskChecklistMutationService.js +156 -0
  916. package/dist/sync/v3/taskCommentActivityIdentity.d.ts +7 -0
  917. package/dist/sync/v3/taskCommentActivityIdentity.js +15 -0
  918. package/dist/sync/v3/taskCommentMutationService.d.ts +150 -0
  919. package/dist/sync/v3/taskCommentMutationService.js +392 -0
  920. package/dist/sync/v3/taskCommentReconcileProvenance.d.ts +58 -0
  921. package/dist/sync/v3/taskCommentReconcileProvenance.js +170 -0
  922. package/dist/sync/v3/taskCreateActivation.d.ts +19 -0
  923. package/dist/sync/v3/taskCreateActivation.js +84 -0
  924. package/dist/sync/v3/taskCreateActivityIdentity.d.ts +7 -0
  925. package/dist/sync/v3/taskCreateActivityIdentity.js +18 -0
  926. package/dist/sync/v3/taskCreateMutationService.d.ts +103 -0
  927. package/dist/sync/v3/taskCreateMutationService.js +283 -0
  928. package/dist/sync/v3/taskDeleteActivation.d.ts +7 -0
  929. package/dist/sync/v3/taskDeleteActivation.js +14 -0
  930. package/dist/sync/v3/taskDeleteMutationService.d.ts +35 -0
  931. package/dist/sync/v3/taskDeleteMutationService.js +133 -0
  932. package/dist/sync/v3/taskLegacyRootAdoptionService.d.ts +78 -0
  933. package/dist/sync/v3/taskLegacyRootAdoptionService.js +175 -0
  934. package/dist/sync/v3/taskLifecycleActivityIdentity.d.ts +9 -0
  935. package/dist/sync/v3/taskLifecycleActivityIdentity.js +18 -0
  936. package/dist/sync/v3/taskLifecycleMutationPayload.d.ts +5 -0
  937. package/dist/sync/v3/taskLifecycleMutationPayload.js +28 -0
  938. package/dist/sync/v3/taskLifecycleMutationService.d.ts +66 -0
  939. package/dist/sync/v3/taskLifecycleMutationService.js +92 -0
  940. package/dist/sync/v3/taskMetadataActivation.d.ts +12 -0
  941. package/dist/sync/v3/taskMetadataActivation.js +38 -0
  942. package/dist/sync/v3/taskMetadataActivityIdentity.d.ts +7 -0
  943. package/dist/sync/v3/taskMetadataActivityIdentity.js +18 -0
  944. package/dist/sync/v3/taskMetadataCoexistence.d.ts +37 -0
  945. package/dist/sync/v3/taskMetadataCoexistence.js +134 -0
  946. package/dist/sync/v3/taskMetadataMutationService.d.ts +71 -0
  947. package/dist/sync/v3/taskMetadataMutationService.js +199 -0
  948. package/dist/sync/v3/taskRelationshipLegacyAdoptionService.d.ts +48 -0
  949. package/dist/sync/v3/taskRelationshipLegacyAdoptionService.js +164 -0
  950. package/dist/sync/v3/taskRelationshipMutationService.d.ts +50 -0
  951. package/dist/sync/v3/taskRelationshipMutationService.js +148 -0
  952. package/dist/sync/v3/taskRestoreMutationService.d.ts +90 -0
  953. package/dist/sync/v3/taskRestoreMutationService.js +179 -0
  954. package/dist/sync/v3/taskStatusActivation.d.ts +7 -0
  955. package/dist/sync/v3/taskStatusActivation.js +15 -0
  956. package/dist/sync/v3/taskStatusMutationService.d.ts +76 -0
  957. package/dist/sync/v3/taskStatusMutationService.js +308 -0
  958. package/dist/sync/v3/taskWorkflowMutationPayload.d.ts +4 -0
  959. package/dist/sync/v3/taskWorkflowMutationPayload.js +22 -0
  960. package/dist/sync/v3/taskWorkflowMutationService.d.ts +64 -0
  961. package/dist/sync/v3/taskWorkflowMutationService.js +102 -0
  962. package/dist/sync/v3/taxonomyCoexistence.d.ts +10 -0
  963. package/dist/sync/v3/taxonomyCoexistence.js +19 -0
  964. package/dist/sync/v3/taxonomyCompositeMutationService.d.ts +110 -0
  965. package/dist/sync/v3/taxonomyCompositeMutationService.js +304 -0
  966. package/dist/sync/v3/taxonomyMutationService.d.ts +57 -0
  967. package/dist/sync/v3/taxonomyMutationService.js +106 -0
  968. package/dist/sync/v3/taxonomyStateMutation.d.ts +22 -0
  969. package/dist/sync/v3/taxonomyStateMutation.js +49 -0
  970. package/dist/sync/v3/taxonomySyncPayload.d.ts +9 -0
  971. package/dist/sync/v3/taxonomySyncPayload.js +199 -0
  972. package/dist/sync/v3/workflowAssignmentSync.d.ts +22 -0
  973. package/dist/sync/v3/workflowAssignmentSync.js +213 -0
  974. package/dist/sync/v3/workflowRuntimeMutationService.d.ts +89 -0
  975. package/dist/sync/v3/workflowRuntimeMutationService.js +359 -0
  976. package/dist/sync/v3/workflowRuntimeOperationIdentity.d.ts +13 -0
  977. package/dist/sync/v3/workflowRuntimeOperationIdentity.js +35 -0
  978. package/dist/sync/v3/workflowRuntimeSync.d.ts +141 -0
  979. package/dist/sync/v3/workflowRuntimeSync.js +485 -0
  980. package/dist/sync/v3/workspaceSyncJournalReader.d.ts +43 -0
  981. package/dist/sync/v3/workspaceSyncJournalReader.js +45 -0
  982. package/dist/sync/v3/workspaceSyncLocalOwnershipSnapshot.d.ts +28 -0
  983. package/dist/sync/v3/workspaceSyncLocalOwnershipSnapshot.js +81 -0
  984. package/dist/sync/v3/workspaceSyncPayloadFingerprint.d.ts +1 -0
  985. package/dist/sync/v3/workspaceSyncPayloadFingerprint.js +5 -0
  986. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.d.ts +16 -0
  987. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.js +161 -0
  988. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.d.ts +83 -0
  989. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.js +161 -0
  990. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.d.ts +16 -0
  991. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.js +90 -0
  992. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +65 -0
  993. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +356 -0
  994. package/dist/sync/v3/workspaceSyncV3CombinedCoverage.d.ts +51 -0
  995. package/dist/sync/v3/workspaceSyncV3CombinedCoverage.js +171 -0
  996. package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.d.ts +43 -0
  997. package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.js +535 -0
  998. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.d.ts +50 -0
  999. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +1149 -0
  1000. package/dist/sync/v3/workspaceSyncV3CombinedProjectionState.d.ts +96 -0
  1001. package/dist/sync/v3/workspaceSyncV3CombinedProjectionState.js +672 -0
  1002. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +42 -0
  1003. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +598 -0
  1004. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +65 -0
  1005. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +505 -0
  1006. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +78 -0
  1007. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +511 -0
  1008. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +45 -0
  1009. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +125 -0
  1010. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.d.ts +13 -0
  1011. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +34 -0
  1012. package/dist/sync/v3/workspaceSyncV3CursorEncoding.d.ts +1 -0
  1013. package/dist/sync/v3/workspaceSyncV3CursorEncoding.js +6 -0
  1014. package/dist/sync/v3/workspaceSyncV3DomainAdmission.d.ts +43 -0
  1015. package/dist/sync/v3/workspaceSyncV3DomainAdmission.js +118 -0
  1016. package/dist/sync/v3/workspaceSyncV3Feed.d.ts +95 -0
  1017. package/dist/sync/v3/workspaceSyncV3Feed.js +243 -0
  1018. package/dist/sync/v3/workspaceSyncV3FeedApply.d.ts +13 -0
  1019. package/dist/sync/v3/workspaceSyncV3FeedApply.js +67 -0
  1020. package/dist/sync/v3/workspaceSyncV3FeedClientContract.d.ts +3 -0
  1021. package/dist/sync/v3/workspaceSyncV3FeedClientContract.js +46 -0
  1022. package/dist/sync/v3/workspaceSyncV3FeedCursorKeys.d.ts +10 -0
  1023. package/dist/sync/v3/workspaceSyncV3FeedCursorKeys.js +58 -0
  1024. package/dist/sync/v3/workspaceSyncV3FeedOrchestrator.d.ts +31 -0
  1025. package/dist/sync/v3/workspaceSyncV3FeedOrchestrator.js +228 -0
  1026. package/dist/sync/v3/workspaceSyncV3FeedProfile.d.ts +32 -0
  1027. package/dist/sync/v3/workspaceSyncV3FeedProfile.js +21 -0
  1028. package/dist/sync/v3/workspaceSyncV3InitiativeLocalApply.d.ts +36 -0
  1029. package/dist/sync/v3/workspaceSyncV3InitiativeLocalApply.js +163 -0
  1030. package/dist/sync/v3/workspaceSyncV3InitiativeRepair.d.ts +33 -0
  1031. package/dist/sync/v3/workspaceSyncV3InitiativeRepair.js +118 -0
  1032. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.d.ts +10 -0
  1033. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.js +45 -0
  1034. package/dist/sync/v3/workspaceSyncV3LocalOutboxStatus.d.ts +27 -0
  1035. package/dist/sync/v3/workspaceSyncV3LocalOutboxStatus.js +83 -0
  1036. package/dist/sync/v3/workspaceSyncV3NestedCoverage.d.ts +10 -0
  1037. package/dist/sync/v3/workspaceSyncV3NestedCoverage.js +40 -0
  1038. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.d.ts +83 -0
  1039. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.js +325 -0
  1040. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.d.ts +59 -0
  1041. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.js +302 -0
  1042. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +47 -0
  1043. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +329 -0
  1044. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.d.ts +19 -0
  1045. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.js +41 -0
  1046. package/dist/sync/v3/workspaceSyncV3NestedWireContract.d.ts +6 -0
  1047. package/dist/sync/v3/workspaceSyncV3NestedWireContract.js +16 -0
  1048. package/dist/sync/v3/workspaceSyncV3OperationProjection.d.ts +8 -0
  1049. package/dist/sync/v3/workspaceSyncV3OperationProjection.js +52 -0
  1050. package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +229 -0
  1051. package/dist/sync/v3/workspaceSyncV3OperationProtocol.js +1 -0
  1052. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +165 -0
  1053. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +414 -0
  1054. package/dist/sync/v3/workspaceSyncV3OriginActor.d.ts +36 -0
  1055. package/dist/sync/v3/workspaceSyncV3OriginActor.js +61 -0
  1056. package/dist/sync/v3/workspaceSyncV3OriginAssertion.d.ts +46 -0
  1057. package/dist/sync/v3/workspaceSyncV3OriginAssertion.js +121 -0
  1058. package/dist/sync/v3/workspaceSyncV3OriginAssertionHeader.d.ts +1 -0
  1059. package/dist/sync/v3/workspaceSyncV3OriginAssertionHeader.js +1 -0
  1060. package/dist/sync/v3/workspaceSyncV3PlanningOrderCoverage.d.ts +10 -0
  1061. package/dist/sync/v3/workspaceSyncV3PlanningOrderCoverage.js +34 -0
  1062. package/dist/sync/v3/workspaceSyncV3PlanningOrderWireContract.d.ts +6 -0
  1063. package/dist/sync/v3/workspaceSyncV3PlanningOrderWireContract.js +10 -0
  1064. package/dist/sync/v3/workspaceSyncV3ProjectionState.d.ts +105 -0
  1065. package/dist/sync/v3/workspaceSyncV3ProjectionState.js +467 -0
  1066. package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.d.ts +56 -0
  1067. package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.js +250 -0
  1068. package/dist/sync/v3/workspaceSyncV3TaskRelationshipProjection.d.ts +30 -0
  1069. package/dist/sync/v3/workspaceSyncV3TaskRelationshipProjection.js +142 -0
  1070. package/dist/sync/v3/workspaceSyncV3TaskRootProjection.d.ts +40 -0
  1071. package/dist/sync/v3/workspaceSyncV3TaskRootProjection.js +246 -0
  1072. package/dist/sync/v3/workspaceSyncV3TaxonomyFeedProjection.d.ts +39 -0
  1073. package/dist/sync/v3/workspaceSyncV3TaxonomyFeedProjection.js +185 -0
  1074. package/dist/sync/v3/workspaceSyncV3WorkflowCoverage.d.ts +10 -0
  1075. package/dist/sync/v3/workspaceSyncV3WorkflowCoverage.js +36 -0
  1076. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.d.ts +17 -0
  1077. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.js +143 -0
  1078. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeProjection.d.ts +9 -0
  1079. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeProjection.js +195 -0
  1080. package/dist/sync/v3/workspaceSyncV3WorkflowWireContract.d.ts +11 -0
  1081. package/dist/sync/v3/workspaceSyncV3WorkflowWireContract.js +12 -0
  1082. package/dist/sync/v3/workspaceSyncV3WorkstreamProjection.d.ts +4 -0
  1083. package/dist/sync/v3/workspaceSyncV3WorkstreamProjection.js +98 -0
  1084. package/dist/sync/v3/workspaceSyncV3WorkstreamTaskOrderProjection.d.ts +9 -0
  1085. package/dist/sync/v3/workspaceSyncV3WorkstreamTaskOrderProjection.js +72 -0
  1086. package/dist/sync/v3/workstreamActivityAuthoritativeRevision.d.ts +11 -0
  1087. package/dist/sync/v3/workstreamActivityAuthoritativeRevision.js +23 -0
  1088. package/dist/sync/v3/workstreamActivityIdentity.d.ts +8 -0
  1089. package/dist/sync/v3/workstreamActivityIdentity.js +14 -0
  1090. package/dist/sync/v3/workstreamCoexistence.d.ts +19 -0
  1091. package/dist/sync/v3/workstreamCoexistence.js +64 -0
  1092. package/dist/sync/v3/workstreamMutationPayload.d.ts +27 -0
  1093. package/dist/sync/v3/workstreamMutationPayload.js +147 -0
  1094. package/dist/sync/v3/workstreamMutationService.d.ts +72 -0
  1095. package/dist/sync/v3/workstreamMutationService.js +256 -0
  1096. package/dist/sync/v3/workstreamTaskOrderMutationService.d.ts +55 -0
  1097. package/dist/sync/v3/workstreamTaskOrderMutationService.js +110 -0
  1098. package/dist/sync/v3/workstreamTaskOrderSync.d.ts +14 -0
  1099. package/dist/sync/v3/workstreamTaskOrderSync.js +25 -0
  1100. package/dist/sync/workspaceContentManifest.d.ts +86 -0
  1101. package/dist/sync/workspaceContentManifest.js +123 -0
  1102. package/dist/sync/workspacePullFeed.d.ts +186 -2
  1103. package/dist/sync/workspacePullFeed.js +513 -136
  1104. package/dist/sync/workspacePushPreparedPlan.d.ts +21 -0
  1105. package/dist/sync/workspacePushPreparedPlan.js +1 -0
  1106. package/dist/sync/workspaceRepair.d.ts +17 -25
  1107. package/dist/sync/workspaceRepair.js +348 -25
  1108. package/dist/sync/workspaceSyncContentDecryption.d.ts +6 -0
  1109. package/dist/sync/workspaceSyncContentDecryption.js +11 -0
  1110. package/dist/sync/workspaceSyncModel.d.ts +216 -5
  1111. package/dist/sync/workspaceSyncModel.js +371 -35
  1112. package/dist/sync/workspaceSyncSnapshotProjection.d.ts +11 -0
  1113. package/dist/sync/workspaceSyncSnapshotProjection.js +101 -0
  1114. package/dist/sync/workspaceSyncState.d.ts +13 -0
  1115. package/dist/sync/workspaceSyncState.js +36 -0
  1116. package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +106 -0
  1117. package/dist/sync/workspaceSyncV2SnapshotBuilder.js +193 -0
  1118. package/dist/types.d.ts +23 -15
  1119. package/dist/types.js +1 -3
  1120. package/dist/ui/ai-profile-clients/amazon-nova.svg +1 -0
  1121. package/dist/ui/ai-profile-clients/antigravity.png +0 -0
  1122. package/dist/ui/ai-profile-clients/chatgpt.svg +10 -0
  1123. package/dist/ui/ai-profile-clients/claude-chat.svg +1 -0
  1124. package/dist/ui/ai-profile-clients/claude-code.svg +15 -0
  1125. package/dist/ui/ai-profile-clients/cline-app-icon-light.png +0 -0
  1126. package/dist/ui/ai-profile-clients/cline.svg +16 -0
  1127. package/dist/ui/ai-profile-clients/codex.svg +1 -0
  1128. package/dist/ui/ai-profile-clients/copilot.png +0 -0
  1129. package/dist/ui/ai-profile-clients/cursor.svg +1 -0
  1130. package/dist/ui/ai-profile-clients/deepseek.svg +1 -0
  1131. package/dist/ui/ai-profile-clients/gemini-cli-icon.png +0 -0
  1132. package/dist/ui/ai-profile-clients/gemini.svg +10 -0
  1133. package/dist/ui/ai-profile-clients/grok.svg +31 -0
  1134. package/dist/ui/ai-profile-clients/kiro.svg +11 -0
  1135. package/dist/ui/ai-profile-clients/llama.svg +1 -0
  1136. package/dist/ui/ai-profile-clients/mistral.svg +1 -0
  1137. package/dist/ui/ai-profile-clients/ms_copilot.jpeg +0 -0
  1138. package/dist/ui/ai-profile-clients/openclaw.png +0 -0
  1139. package/dist/ui/ai-profile-clients/perplexity.svg +1 -0
  1140. package/dist/ui/ai-profile-clients/vscode.svg +41 -0
  1141. package/dist/ui/ai-profile-clients/windsurf.svg +11 -0
  1142. package/dist/ui/assets/AiIdentityRosterCard-DB1BLO_j.js +1 -0
  1143. package/dist/ui/assets/AiProfilesModule-DPxQeF9N.js +1 -0
  1144. package/dist/ui/assets/AnnotatedAttachmentWorkspace-CBRZ8rca.css +1 -0
  1145. package/dist/ui/assets/AnnotatedAttachmentWorkspace-DHNYaNg6.js +3 -0
  1146. package/dist/ui/assets/AssetTraySortControl-B9k5caQW.css +1 -0
  1147. package/dist/ui/assets/AssetTraySortControl-DphbyHVc.js +1 -0
  1148. package/dist/ui/assets/ContextAttachmentManager-CMxSzHqc.js +3 -0
  1149. package/dist/ui/assets/DocumentWorkspace-BC7sy5TG.js +261 -0
  1150. package/dist/ui/assets/DocumentWorkspace-BIBGBfd7.css +1 -0
  1151. package/dist/ui/assets/EntityActivityTimeline-BfJbZRdl.css +1 -0
  1152. package/dist/ui/assets/EntityActivityTimeline-pJ2ZjZ-k.js +1 -0
  1153. package/dist/ui/assets/PlanningModule-CeTqXMMz.css +1 -0
  1154. package/dist/ui/assets/PlanningModule-t5GbvVR9.js +1 -0
  1155. package/dist/ui/assets/PlansPage-BVH_NfgT.js +1 -0
  1156. package/dist/ui/assets/PlansPage-C2nkK2Bp.css +1 -0
  1157. package/dist/ui/assets/TaskContextUpload-Ds4LnDzV.css +1 -0
  1158. package/dist/ui/assets/TaskContextUpload-bl4fOOUz.js +1 -0
  1159. package/dist/ui/assets/TaskSettings-xVsxSa0g.js +12 -0
  1160. package/dist/ui/assets/TaskforceAgentsModule-CkAxW19K.js +21 -0
  1161. package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +1 -0
  1162. package/dist/ui/assets/WorkflowManagerModule-BKqIGVnF.js +1 -0
  1163. package/dist/ui/assets/WorkflowManagerModule-DF10XENz.css +1 -0
  1164. package/dist/ui/assets/antigravity-DRKQga2U.png +0 -0
  1165. package/dist/ui/assets/cursor-BM_3k4Y4.svg +1 -0
  1166. package/dist/ui/assets/gemini-cli-icon-dBAVjCcn.png +0 -0
  1167. package/dist/ui/assets/grok-BuodbWaG.svg +31 -0
  1168. package/dist/ui/assets/index-BzJlVnNS.css +1 -0
  1169. package/dist/ui/assets/index-Cx7vZJHL.js +7 -0
  1170. package/dist/ui/assets/{vendor-dnd-DRzYolkg.js → vendor-dnd-CJ-AjP-Y.js} +1 -1
  1171. package/dist/ui/assets/{vendor-icons-CLnehDTw.js → vendor-icons-B8ZNsH1g.js} +1 -1
  1172. package/dist/ui/assets/{vendor-markdown-BUxTU7dS.js → vendor-markdown-_lhNCyq-.js} +9 -9
  1173. package/dist/ui/assets/vendor-router-AqJMU8Lz.js +3 -0
  1174. package/dist/ui/assets/vscode-C_7wk1WI.svg +41 -0
  1175. package/dist/ui/branding/logos/logo_dark_bg.png +0 -0
  1176. package/dist/ui/branding/logos/logo_favicon_dark.png +0 -0
  1177. package/dist/ui/branding/logos/logo_favicon_dark.svg +56 -0
  1178. package/dist/ui/branding/logos/logo_favicon_light.png +0 -0
  1179. package/dist/ui/branding/logos/logo_light_bg.png +0 -0
  1180. package/dist/ui/images/Taskforce_Van.webp +0 -0
  1181. package/dist/ui/index.html +6 -6
  1182. package/dist/update/uiUpdateService.d.ts +43 -0
  1183. package/dist/update/uiUpdateService.js +149 -0
  1184. package/dist/update/updateCli.d.ts +15 -0
  1185. package/dist/update/updateCli.js +76 -0
  1186. package/dist/update/updateExecutor.d.ts +40 -0
  1187. package/dist/update/updateExecutor.js +474 -0
  1188. package/dist/update/updateStatus.d.ts +83 -0
  1189. package/dist/update/updateStatus.js +703 -0
  1190. package/dist/utils/aiProfileAvatarPaths.d.ts +14 -0
  1191. package/dist/utils/aiProfileAvatarPaths.js +52 -0
  1192. package/dist/utils/aiProfileDefaultLogo.d.ts +7 -0
  1193. package/dist/utils/aiProfileDefaultLogo.js +84 -0
  1194. package/dist/utils/aiProfileEvents.d.ts +9 -1
  1195. package/dist/utils/annotatedAttachments.d.ts +8 -0
  1196. package/dist/utils/annotatedAttachments.js +17 -1
  1197. package/dist/utils/assetTraySorting.d.ts +25 -0
  1198. package/dist/utils/assetTraySorting.js +83 -0
  1199. package/dist/utils/assignees.d.ts +5 -0
  1200. package/dist/utils/assignees.js +14 -9
  1201. package/dist/utils/authLogin.d.ts +10 -0
  1202. package/dist/utils/authLogin.js +8 -0
  1203. package/dist/utils/authSessionEvents.d.ts +2 -0
  1204. package/dist/utils/authSessionEvents.js +6 -0
  1205. package/dist/utils/avatarUpload.js +5 -5
  1206. package/dist/utils/canonicalReferenceAttachments.d.ts +12 -0
  1207. package/dist/utils/canonicalReferenceAttachments.js +42 -0
  1208. package/dist/utils/cloudAssetDisplay.d.ts +2 -0
  1209. package/dist/utils/cloudAssetDisplay.js +8 -0
  1210. package/dist/utils/constants.d.ts +4 -11
  1211. package/dist/utils/constants.js +5 -64
  1212. package/dist/utils/contextAttachmentPreview.d.ts +11 -0
  1213. package/dist/utils/contextAttachmentPreview.js +8 -0
  1214. package/dist/utils/contextAttachmentUpload.d.ts +8 -0
  1215. package/dist/utils/contextAttachmentUpload.js +144 -0
  1216. package/dist/utils/documentNames.js +6 -4
  1217. package/dist/utils/entityReferences.d.ts +14 -0
  1218. package/dist/utils/entityReferences.js +21 -0
  1219. package/dist/utils/httpSetCookie.d.ts +3 -0
  1220. package/dist/utils/httpSetCookie.js +22 -0
  1221. package/dist/utils/imageNoteStoragePaths.d.ts +3 -0
  1222. package/dist/utils/imageNoteStoragePaths.js +19 -0
  1223. package/dist/utils/imageReferences.d.ts +6 -0
  1224. package/dist/utils/imageReferences.js +1 -0
  1225. package/dist/utils/planningArchiveOrchestrator.d.ts +23 -0
  1226. package/dist/utils/planningArchiveOrchestrator.js +37 -0
  1227. package/dist/utils/planningArchivePresentation.d.ts +20 -0
  1228. package/dist/utils/planningArchivePresentation.js +23 -0
  1229. package/dist/utils/planningArchiveReadiness.d.ts +26 -0
  1230. package/dist/utils/planningArchiveReadiness.js +30 -0
  1231. package/dist/utils/planningFavorites.d.ts +7 -0
  1232. package/dist/utils/planningFavorites.js +34 -0
  1233. package/dist/utils/syncEventPresentation.js +53 -0
  1234. package/dist/utils/syncStatusPresentation.d.ts +25 -0
  1235. package/dist/utils/syncStatusPresentation.js +86 -5
  1236. package/dist/utils/taskActivity.d.ts +9 -2
  1237. package/dist/utils/taskActivity.js +61 -0
  1238. package/dist/utils/taskDraftDefaults.d.ts +0 -8
  1239. package/dist/utils/taskDraftDefaults.js +0 -4
  1240. package/dist/utils/taskEvents.d.ts +11 -0
  1241. package/dist/utils/taskEvents.js +6 -0
  1242. package/dist/utils/taskHeaderQuickFilter.d.ts +14 -0
  1243. package/dist/utils/taskHeaderQuickFilter.js +32 -0
  1244. package/dist/utils/taskInvalidation.d.ts +23 -0
  1245. package/dist/utils/taskInvalidation.js +67 -0
  1246. package/dist/utils/taskNormalization.d.ts +2 -1
  1247. package/dist/utils/taskNormalization.js +44 -18
  1248. package/dist/utils/taskReferences.d.ts +16 -0
  1249. package/dist/utils/taskReferences.js +63 -0
  1250. package/dist/utils/taskforceAgentEvents.d.ts +8 -0
  1251. package/dist/utils/taskforceAgentEvents.js +6 -0
  1252. package/dist/utils/taskforceAgentSkillEvents.d.ts +7 -0
  1253. package/dist/utils/taskforceAgentSkillEvents.js +8 -0
  1254. package/dist/utils/uiNotice.d.ts +3 -0
  1255. package/dist/utils/uiNotice.js +1 -1
  1256. package/dist/utils/workspaceResourceEvents.d.ts +7 -0
  1257. package/dist/utils/workspaceResourceEvents.js +6 -0
  1258. package/dist/utils/workspaceSyncPresentation.d.ts +24 -0
  1259. package/dist/utils/workspaceSyncPresentation.js +243 -6
  1260. package/package.json +69 -21
  1261. package/dist/components/features/AgentsModule.d.ts +0 -18
  1262. package/dist/components/features/AgentsModule.js +0 -479
  1263. package/dist/components/features/InitiativesModule.d.ts +0 -22
  1264. package/dist/components/features/InitiativesModule.js +0 -33
  1265. package/dist/components/features/WorkflowsModule.d.ts +0 -27
  1266. package/dist/components/features/WorkflowsModule.js +0 -21
  1267. package/dist/components/features/settings/WorkflowEditor.d.ts +0 -15
  1268. package/dist/components/features/settings/WorkflowEditor.js +0 -245
  1269. package/dist/components/views/panels/DocumentFilterToolbar.d.ts +0 -10
  1270. package/dist/components/views/panels/DocumentFilterToolbar.js +0 -7
  1271. package/dist/components/views/standalone/modals/AccountHubModal.d.ts +0 -61
  1272. package/dist/components/views/standalone/modals/AccountHubModal.js +0 -108
  1273. package/dist/components/views/standalone/modals/EditProfileModal.d.ts +0 -19
  1274. package/dist/components/views/standalone/modals/EditProfileModal.js +0 -11
  1275. package/dist/hooks/ui/useResourceExport.d.ts +0 -21
  1276. package/dist/hooks/ui/useResourceExport.js +0 -87
  1277. package/dist/hooks/ui/useWorkflowTemplates.d.ts +0 -37
  1278. package/dist/hooks/ui/useWorkflowTemplates.js +0 -116
  1279. package/dist/mcp/clientProfileDefaults.d.ts +0 -12
  1280. package/dist/mcp/clientProfileDefaults.js +0 -41
  1281. package/dist/resources/templates/WORKFLOW_V2_POLICY.md +0 -55
  1282. package/dist/resources/templates/environments/aider.yaml +0 -14
  1283. package/dist/resources/templates/environments/antigravity.yaml +0 -10
  1284. package/dist/resources/templates/environments/claude.yaml +0 -10
  1285. package/dist/resources/templates/environments/cline.yaml +0 -10
  1286. package/dist/resources/templates/environments/codex.yaml +0 -13
  1287. package/dist/resources/templates/environments/copilot.yaml +0 -10
  1288. package/dist/resources/templates/environments/cursor.yaml +0 -9
  1289. package/dist/resources/templates/environments/gemini.yaml +0 -9
  1290. package/dist/resources/templates/environments/windsurf.yaml +0 -10
  1291. package/dist/resources/templates/workflow-sources/README.md +0 -9
  1292. package/dist/resources/templates/workflow-sources/workflowDocs.mjs +0 -530
  1293. package/dist/resources/templates/workflow-sources/workflowEditorOverrides.json +0 -1
  1294. package/dist/resources/templates/workflows/collaborate.yaml +0 -109
  1295. package/dist/resources/templates/workflows/do.yaml +0 -87
  1296. package/dist/resources/templates/workflows/evaluate.yaml +0 -116
  1297. package/dist/resources/templates/workflows/execute.yaml +0 -156
  1298. package/dist/resources/templates/workflows/plan.yaml +0 -118
  1299. package/dist/resources/templates/workflows/review.yaml +0 -114
  1300. package/dist/services/formatTransformers.d.ts +0 -29
  1301. package/dist/services/formatTransformers.js +0 -56
  1302. package/dist/services/templateEngine.d.ts +0 -46
  1303. package/dist/services/templateEngine.js +0 -148
  1304. package/dist/shared/workflowDefaults.d.ts +0 -9
  1305. package/dist/shared/workflowDefaults.js +0 -11
  1306. package/dist/ui/agent-logos/Gemini CLI.jpeg +0 -0
  1307. package/dist/ui/agent-logos/antigravity.jpeg +0 -0
  1308. package/dist/ui/agent-logos/chatgpt.png +0 -0
  1309. package/dist/ui/agent-logos/claude-code.jpeg +0 -0
  1310. package/dist/ui/agent-logos/codex.jpeg +0 -0
  1311. package/dist/ui/agent-logos/cursor.png +0 -0
  1312. package/dist/ui/agent-logos/openclaw.jpeg +0 -0
  1313. package/dist/ui/agent-logos/windsurf.png +0 -0
  1314. package/dist/ui/assets/AgentsModule-C4LcqhcZ.js +0 -1
  1315. package/dist/ui/assets/AnnotatedAttachmentWorkspace-B-Dq22d2.js +0 -3
  1316. package/dist/ui/assets/AnnotatedAttachmentWorkspace-BVKew-mH.css +0 -1
  1317. package/dist/ui/assets/ContextAttachmentManager-DsXPTvi-.js +0 -3
  1318. package/dist/ui/assets/DocumentWorkspace-CxA1wO3U.js +0 -252
  1319. package/dist/ui/assets/DocumentWorkspace-D4rJKXzd.css +0 -1
  1320. package/dist/ui/assets/EntityActivityTimeline-B8nSe8l3.js +0 -1
  1321. package/dist/ui/assets/EntityActivityTimeline-DyqvvhuF.css +0 -1
  1322. package/dist/ui/assets/InitiativesModule-VY95v38E.js +0 -1
  1323. package/dist/ui/assets/PlansPage-CQbKDv1a.js +0 -1
  1324. package/dist/ui/assets/PlansPage-DeAzWYTb.css +0 -1
  1325. package/dist/ui/assets/TaskContextUpload-DvDlNpHC.js +0 -1
  1326. package/dist/ui/assets/TaskSettings-CUWbYYtP.js +0 -12
  1327. package/dist/ui/assets/WorkflowsModule-CgM3Jako.js +0 -5
  1328. package/dist/ui/assets/documentReferences-Do9YjrS3.js +0 -1
  1329. package/dist/ui/assets/index--mh3pktj.js +0 -5
  1330. package/dist/ui/assets/index-BawaaEXS.css +0 -1
  1331. package/dist/ui/assets/vendor-router-BbWMxlnO.js +0 -3
  1332. package/dist/ui/branding/logos/logo_black_01.png +0 -0
  1333. package/dist/ui/branding/logos/logo_black_02.png +0 -0
  1334. package/dist/ui/branding/logos/logo_white_01.png +0 -0
  1335. package/dist/ui/branding/logos/logo_white_02.png +0 -0
  1336. package/scripts/generate-workflow-templates.mjs +0 -134
  1337. package/src/resources/templates/WORKFLOW_V2_POLICY.md +0 -55
  1338. package/src/resources/templates/environments/aider.yaml +0 -14
  1339. package/src/resources/templates/environments/antigravity.yaml +0 -10
  1340. package/src/resources/templates/environments/claude.yaml +0 -10
  1341. package/src/resources/templates/environments/cline.yaml +0 -10
  1342. package/src/resources/templates/environments/codex.yaml +0 -13
  1343. package/src/resources/templates/environments/copilot.yaml +0 -10
  1344. package/src/resources/templates/environments/cursor.yaml +0 -9
  1345. package/src/resources/templates/environments/gemini.yaml +0 -9
  1346. package/src/resources/templates/environments/windsurf.yaml +0 -10
  1347. package/src/resources/templates/workflow-sources/README.md +0 -9
  1348. package/src/resources/templates/workflow-sources/workflowDocs.mjs +0 -530
  1349. package/src/resources/templates/workflow-sources/workflowEditorOverrides.json +0 -1
  1350. package/src/resources/templates/workflows/collaborate.yaml +0 -109
  1351. package/src/resources/templates/workflows/do.yaml +0 -87
  1352. package/src/resources/templates/workflows/evaluate.yaml +0 -116
  1353. package/src/resources/templates/workflows/execute.yaml +0 -156
  1354. package/src/resources/templates/workflows/plan.yaml +0 -118
  1355. package/src/resources/templates/workflows/review.yaml +0 -114
  1356. /package/dist/ui/branding/logos/{logo_dark.svg → logo_dark_no_bg.svg} +0 -0
  1357. /package/dist/ui/branding/logos/{logo_favicon.svg → logo_favicon_light.svg} +0 -0
  1358. /package/dist/ui/branding/logos/{logo_light.svg → logo_light_no_bg.svg} +0 -0
@@ -0,0 +1,1388 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { assertSynchronousTransactionResult, } from '../../storage/databaseAdapter.js';
3
+ import { validateWorkspaceSyncEngineTransferCompletionGroup, } from '../engine/workspaceSyncEngineTransferCompletion.js';
4
+ import { canonicalWorkspaceSyncJson } from '../v3/canonicalWorkspaceSyncJson.js';
5
+ import { LOCAL_SYNC_COORDINATOR_ID } from './localSyncCoordinatorTypes.js';
6
+ import { LocalSyncExecutionPermitError, } from './localSyncExecutionPermitTypes.js';
7
+ const TERMINAL_STATES = [
8
+ 'released',
9
+ 'abandoned-reconcile-required',
10
+ 'abandoned-clean',
11
+ ];
12
+ const APPLYING_OPERATION_CLASSES = new Set([
13
+ 'pull',
14
+ 'repair',
15
+ ]);
16
+ const NON_APPLYING_OPERATION_CLASSES = new Set([
17
+ 'handshake',
18
+ 'bootstrap',
19
+ 'push',
20
+ ]);
21
+ const MAX_DRAIN_INSPECTION_LIMIT = 500;
22
+ export const LOCAL_SYNC_PERMIT_RETENTION_MIN_AGE_MS = 7 * 24 * 60 * 60 * 1000;
23
+ export const LOCAL_SYNC_PERMIT_RETENTION_SOFT_LIMIT = 1_000;
24
+ export const LOCAL_SYNC_PERMIT_RETENTION_DELETE_BATCH = 250;
25
+ export const LOCAL_SYNC_PERMIT_RETENTION_SWEEP_LIMIT = 5_000;
26
+ const LOCAL_SYNC_PERMIT_RETENTION_CHECK_INTERVAL_MS = 60 * 60 * 1000;
27
+ function mapPermit(row) {
28
+ return {
29
+ permitId: String(row.permit_id || ''),
30
+ workspaceId: String(row.workspace_id || ''),
31
+ coordinatorGeneration: Number(row.coordinator_generation || 0),
32
+ serverInstanceId: String(row.server_instance_id || ''),
33
+ ownerMode: row.owner_mode || 'browser-gateway',
34
+ operationClass: row.operation_class || 'pull',
35
+ operationIdentity: row.operation_identity || null,
36
+ lastCommittedCursor: row.last_committed_cursor_json
37
+ ? JSON.parse(row.last_committed_cursor_json)
38
+ : null,
39
+ state: row.state || 'abandoned-reconcile-required',
40
+ upstreamDisposition: row.upstream_disposition || null,
41
+ issuedAt: String(row.issued_at || ''),
42
+ deadlineAt: String(row.deadline_at || ''),
43
+ lastTransitionAt: String(row.last_transition_at || ''),
44
+ completedAt: row.completed_at || null,
45
+ errorCode: row.error_code || null,
46
+ };
47
+ }
48
+ function mapObligation(row) {
49
+ return {
50
+ obligationId: String(row.obligation_id || ''),
51
+ permitId: String(row.permit_id || ''),
52
+ workspaceId: String(row.workspace_id || ''),
53
+ operationClass: row.operation_class || 'pull',
54
+ operationIdentity: row.operation_identity || null,
55
+ upstreamDisposition: row.upstream_disposition || 'unknown',
56
+ lastCommittedCursor: row.last_committed_cursor_json
57
+ ? JSON.parse(row.last_committed_cursor_json)
58
+ : null,
59
+ requiredAction: row.required_action || 'refetch-from-committed-cursor',
60
+ createdAt: String(row.created_at || ''),
61
+ resolvedAt: row.resolved_at || null,
62
+ resolvedBoundary: row.resolved_boundary_json
63
+ ? JSON.parse(row.resolved_boundary_json)
64
+ : null,
65
+ };
66
+ }
67
+ export class LocalSyncExecutionPermitStore {
68
+ db;
69
+ now;
70
+ createId;
71
+ invariantBlockedWorkspaces = new Set();
72
+ lastRetentionCheckAtMs = Number.NEGATIVE_INFINITY;
73
+ constructor(db, now = () => new Date().toISOString(), createId = randomUUID) {
74
+ this.db = db;
75
+ this.now = now;
76
+ this.createId = createId;
77
+ }
78
+ issue(input) {
79
+ return this.issueForOwner('browser-gateway', input);
80
+ }
81
+ issueServer(input) {
82
+ return this.issueForOwner('server', input);
83
+ }
84
+ issueForOwner(ownerMode, input) {
85
+ this.assertNoLocalCommitInvariant(input.workspaceId);
86
+ this.maybePruneTerminalHistory();
87
+ return this.db.transaction(() => {
88
+ if (input.operationIdentity
89
+ && input.operationClass !== 'push'
90
+ && input.operationClass !== 'v3-dispatch') {
91
+ throw new LocalSyncExecutionPermitError(`Execution permits for ${input.operationClass} cannot carry a replay identity.`, 'SYNC_COORDINATOR_PERMIT_IDENTITY_CONFLICT');
92
+ }
93
+ const permitId = input.permitId || this.createId();
94
+ const existing = this.read(permitId);
95
+ if (existing) {
96
+ if (existing.workspaceId !== input.workspaceId
97
+ || existing.coordinatorGeneration !== input.coordinatorGeneration
98
+ || existing.serverInstanceId !== input.serverInstanceId
99
+ || existing.ownerMode !== ownerMode
100
+ || existing.operationClass !== input.operationClass
101
+ || existing.operationIdentity !== (input.operationIdentity || null)
102
+ || JSON.stringify(existing.lastCommittedCursor)
103
+ !== JSON.stringify(input.lastCommittedCursor ?? null)
104
+ || existing.deadlineAt !== input.deadlineAt) {
105
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permitId} was reused with different input.`, 'SYNC_COORDINATOR_PERMIT_IDENTITY_CONFLICT');
106
+ }
107
+ return existing;
108
+ }
109
+ const deadlineMs = Date.parse(input.deadlineAt);
110
+ if (!Number.isFinite(deadlineMs) || deadlineMs <= Date.parse(this.now())) {
111
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permitId} has an invalid or expired deadline.`, 'SYNC_COORDINATOR_PERMIT_EXPIRED');
112
+ }
113
+ const state = this.db.prepare(`
114
+ SELECT active_workspace_id, coordinator_generation, ownership_mode, transition_state
115
+ FROM local_sync_coordinator_state
116
+ WHERE coordinator_id = ?
117
+ `).get(LOCAL_SYNC_COORDINATOR_ID);
118
+ if (!state
119
+ || Number(state.coordinator_generation || 0) !== input.coordinatorGeneration) {
120
+ throw new LocalSyncExecutionPermitError('The coordinator generation changed before the execution permit was issued.', 'SYNC_COORDINATOR_STALE_GENERATION');
121
+ }
122
+ if (String(state.active_workspace_id || '') !== input.workspaceId) {
123
+ throw new LocalSyncExecutionPermitError(`Workspace ${input.workspaceId} is not the active local sync workspace.`, 'SYNC_COORDINATOR_INACTIVE_WORKSPACE');
124
+ }
125
+ if (state.ownership_mode !== ownerMode || state.transition_state !== 'idle') {
126
+ throw new LocalSyncExecutionPermitError(`${ownerMode} execution permits are not available in the current coordinator mode.`, 'SYNC_COORDINATOR_PERMITS_DISABLED');
127
+ }
128
+ const at = this.now();
129
+ this.db.prepare(`
130
+ INSERT INTO local_sync_execution_permits (
131
+ permit_id, workspace_id, coordinator_generation, server_instance_id,
132
+ owner_mode, operation_class, operation_identity, state, upstream_disposition,
133
+ last_committed_cursor_json, issued_at, deadline_at, last_transition_at
134
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, 'issued-idle', 'not-started', ?, ?, ?, ?)
135
+ `).run(permitId, input.workspaceId, input.coordinatorGeneration, input.serverInstanceId, ownerMode, input.operationClass, input.operationIdentity || null, input.lastCommittedCursor === undefined || input.lastCommittedCursor === null
136
+ ? null
137
+ : JSON.stringify(input.lastCommittedCursor), at, input.deadlineAt, at);
138
+ return this.read(permitId);
139
+ })();
140
+ }
141
+ read(permitId) {
142
+ const row = this.db.prepare(`
143
+ SELECT * FROM local_sync_execution_permits WHERE permit_id = ?
144
+ `).get(permitId);
145
+ return row ? mapPermit(row) : null;
146
+ }
147
+ summarize(workspaceId) {
148
+ const rows = this.db.prepare(`
149
+ SELECT state, COUNT(*) AS count
150
+ FROM local_sync_execution_permits
151
+ WHERE workspace_id = ?
152
+ AND state NOT IN ('released', 'abandoned-clean', 'abandoned-reconcile-required')
153
+ GROUP BY state
154
+ `).all(workspaceId);
155
+ const byState = {};
156
+ let active = 0;
157
+ for (const row of rows) {
158
+ if (!row.state)
159
+ continue;
160
+ const count = Number(row.count || 0);
161
+ byState[row.state] = count;
162
+ active += count;
163
+ }
164
+ const obligation = this.db.prepare(`
165
+ SELECT COUNT(*) AS count
166
+ FROM local_sync_recovery_obligations
167
+ WHERE workspace_id = ? AND resolved_at IS NULL
168
+ `).get(workspaceId);
169
+ return {
170
+ active,
171
+ byState,
172
+ recoveryObligations: Number(obligation?.count || 0),
173
+ localCommitInvariantViolation: this.invariantBlockedWorkspaces.has(workspaceId),
174
+ };
175
+ }
176
+ inspectGenerationDrain(input) {
177
+ const limit = this.normalizeDrainLimit(input.limit);
178
+ return this.db.transaction(() => {
179
+ const rows = this.db.prepare(`
180
+ SELECT state, COUNT(*) AS count
181
+ FROM local_sync_execution_permits
182
+ WHERE workspace_id = ?
183
+ AND coordinator_generation = ?
184
+ AND state NOT IN ('released', 'abandoned-clean', 'abandoned-reconcile-required')
185
+ GROUP BY state
186
+ `).all(input.workspaceId, input.coordinatorGeneration);
187
+ const byState = {};
188
+ let active = 0;
189
+ for (const row of rows) {
190
+ if (!row.state)
191
+ continue;
192
+ const count = Number(row.count || 0);
193
+ byState[row.state] = count;
194
+ active += count;
195
+ }
196
+ const permits = this.db.prepare(`
197
+ SELECT *
198
+ FROM local_sync_execution_permits
199
+ WHERE workspace_id = ?
200
+ AND coordinator_generation = ?
201
+ AND state NOT IN ('released', 'abandoned-clean', 'abandoned-reconcile-required')
202
+ ORDER BY issued_at ASC, permit_id ASC
203
+ LIMIT ?
204
+ `).all(input.workspaceId, input.coordinatorGeneration, limit).map(mapPermit);
205
+ const cleanEligible = this.db.prepare(`
206
+ SELECT COUNT(*) AS count
207
+ FROM local_sync_execution_permits
208
+ WHERE workspace_id = ?
209
+ AND coordinator_generation = ?
210
+ AND state = 'issued-idle'
211
+ AND upstream_disposition = 'not-started'
212
+ `).get(input.workspaceId, input.coordinatorGeneration);
213
+ const obligations = this.db.prepare(`
214
+ SELECT COUNT(*) AS count
215
+ FROM local_sync_recovery_obligations AS obligation
216
+ INNER JOIN local_sync_execution_permits AS permit
217
+ ON permit.permit_id = obligation.permit_id
218
+ WHERE permit.workspace_id = ?
219
+ AND permit.coordinator_generation = ?
220
+ AND obligation.resolved_at IS NULL
221
+ `).get(input.workspaceId, input.coordinatorGeneration);
222
+ return {
223
+ workspaceId: input.workspaceId,
224
+ coordinatorGeneration: input.coordinatorGeneration,
225
+ active,
226
+ byState,
227
+ permits,
228
+ truncated: active > permits.length,
229
+ cleanAbandonEligible: Number(cleanEligible?.count || 0),
230
+ recoveryObligations: Number(obligations?.count || 0),
231
+ };
232
+ })();
233
+ }
234
+ abandonNeverStartedForDrain(input) {
235
+ const limit = this.normalizeDrainLimit(input.limit);
236
+ return this.db.transaction(() => {
237
+ const rows = this.db.prepare(`
238
+ SELECT permit_id
239
+ FROM local_sync_execution_permits
240
+ WHERE workspace_id = ?
241
+ AND coordinator_generation = ?
242
+ AND state = 'issued-idle'
243
+ AND upstream_disposition = 'not-started'
244
+ ORDER BY issued_at ASC, permit_id ASC
245
+ LIMIT ?
246
+ `).all(input.workspaceId, input.coordinatorGeneration, limit);
247
+ const abandonedPermitIds = [];
248
+ const at = this.now();
249
+ for (const row of rows) {
250
+ const permitId = String(row.permit_id || '');
251
+ if (!permitId)
252
+ continue;
253
+ const result = this.db.prepare(`
254
+ UPDATE local_sync_execution_permits
255
+ SET state = 'abandoned-clean',
256
+ upstream_disposition = 'not-started',
257
+ last_transition_at = ?,
258
+ completed_at = ?,
259
+ error_code = ?
260
+ WHERE permit_id = ?
261
+ AND workspace_id = ?
262
+ AND coordinator_generation = ?
263
+ AND state = 'issued-idle'
264
+ AND upstream_disposition = 'not-started'
265
+ `).run(at, at, input.errorCode || 'SYNC_COORDINATOR_PERMIT_DRAINED_NOT_STARTED', permitId, input.workspaceId, input.coordinatorGeneration);
266
+ if (Number(result?.changes || 0) === 1) {
267
+ abandonedPermitIds.push(permitId);
268
+ }
269
+ }
270
+ const remaining = this.db.prepare(`
271
+ SELECT COUNT(*) AS count
272
+ FROM local_sync_execution_permits
273
+ WHERE workspace_id = ?
274
+ AND coordinator_generation = ?
275
+ AND state = 'issued-idle'
276
+ AND upstream_disposition = 'not-started'
277
+ `).get(input.workspaceId, input.coordinatorGeneration);
278
+ return {
279
+ abandonedPermitIds,
280
+ remainingEligible: Number(remaining?.count || 0),
281
+ };
282
+ })();
283
+ }
284
+ transition(input) {
285
+ return this.db.transaction(() => {
286
+ const current = this.requirePermit(input.permitId);
287
+ this.assertFence(current, input);
288
+ if (current.state === input.nextState)
289
+ return current;
290
+ if (current.state !== input.expectedState) {
291
+ throw new LocalSyncExecutionPermitError(`Execution permit ${input.permitId} is ${current.state}, not ${input.expectedState}.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
292
+ }
293
+ if (input.nextState === 'gateway-in-flight') {
294
+ this.assertCoordinatorEntryFence(current);
295
+ if (Date.parse(current.deadlineAt) <= Date.parse(this.now())) {
296
+ throw new LocalSyncExecutionPermitError(`Execution permit ${input.permitId} has expired.`, 'SYNC_COORDINATOR_PERMIT_EXPIRED');
297
+ }
298
+ }
299
+ if (input.nextState === 'local-commit-entered') {
300
+ this.assertLocalCommitEntryFence(current);
301
+ }
302
+ const requestedIdentity = input.operationIdentity ?? current.operationIdentity;
303
+ if (current.operationIdentity
304
+ && requestedIdentity
305
+ && current.operationIdentity !== requestedIdentity) {
306
+ throw new LocalSyncExecutionPermitError(`Execution permit ${input.permitId} operation identity changed.`, 'SYNC_COORDINATOR_PERMIT_IDENTITY_CONFLICT');
307
+ }
308
+ const at = this.now();
309
+ const terminal = TERMINAL_STATES.includes(input.nextState);
310
+ const upstreamDisposition = input.upstreamDisposition
311
+ ?? (input.nextState === 'gateway-in-flight' ? 'unknown' : null);
312
+ const result = this.db.prepare(`
313
+ UPDATE local_sync_execution_permits
314
+ SET state = ?,
315
+ operation_identity = COALESCE(operation_identity, ?),
316
+ upstream_disposition = COALESCE(?, upstream_disposition),
317
+ error_code = ?,
318
+ last_transition_at = ?,
319
+ completed_at = ?
320
+ WHERE permit_id = ?
321
+ AND workspace_id = ?
322
+ AND coordinator_generation = ?
323
+ AND server_instance_id = ?
324
+ AND state = ?
325
+ `).run(input.nextState, requestedIdentity || null, upstreamDisposition, input.errorCode || null, at, terminal ? at : null, input.permitId, input.workspaceId, input.coordinatorGeneration, input.serverInstanceId, input.expectedState);
326
+ if (Number(result?.changes || 0) !== 1) {
327
+ throw new LocalSyncExecutionPermitError(`Execution permit ${input.permitId} changed before the transition committed.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
328
+ }
329
+ return this.read(input.permitId);
330
+ })();
331
+ }
332
+ release(input) {
333
+ const current = this.requirePermit(input.permitId);
334
+ this.assertFence(current, input);
335
+ if (current.state === 'released')
336
+ return current;
337
+ if (current.state === 'abandoned-clean' || current.state === 'abandoned-reconcile-required') {
338
+ throw new LocalSyncExecutionPermitError(`Execution permit ${input.permitId} is already abandoned.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
339
+ }
340
+ if (current.state === 'gateway-in-flight') {
341
+ throw new LocalSyncExecutionPermitError(`Execution permit ${input.permitId} still has a gateway request in flight.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
342
+ }
343
+ if (current.state === 'local-commit-entered') {
344
+ throw new LocalSyncExecutionPermitError(`Execution permit ${input.permitId} is owned by the server local commit.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
345
+ }
346
+ if (current.state === 'gateway-complete-awaiting-apply'
347
+ && (!['handshake', 'bootstrap', 'push'].includes(current.operationClass)
348
+ || current.upstreamDisposition === 'unknown')) {
349
+ throw new LocalSyncExecutionPermitError(`Execution permit ${input.permitId} cannot be released from its current gateway disposition.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
350
+ }
351
+ return this.transition({
352
+ ...input,
353
+ expectedState: current.state,
354
+ nextState: 'released',
355
+ });
356
+ }
357
+ enterLocalCommit(input) {
358
+ const current = this.requirePermit(input.permitId);
359
+ this.assertFence(current, input);
360
+ if (current.state === 'local-commit-entered')
361
+ return current;
362
+ const expectedState = current.operationClass === 'local-apply'
363
+ ? 'issued-idle'
364
+ : 'gateway-complete-awaiting-apply';
365
+ return this.transition({
366
+ ...input,
367
+ expectedState,
368
+ nextState: 'local-commit-entered',
369
+ });
370
+ }
371
+ enterLocalCommitGroup(input) {
372
+ return this.db.transaction(() => {
373
+ const permits = this.requireCompletionGroup(input, 'gateway-complete-awaiting-apply');
374
+ for (const permit of permits) {
375
+ this.assertLocalCommitEntryFence(permit);
376
+ }
377
+ this.persistCompletionGroupTransition(input, 'gateway-complete-awaiting-apply', 'local-commit-entered');
378
+ return input.permitIds.map((permitId) => this.read(permitId));
379
+ })();
380
+ }
381
+ completeLocalCommit(input) {
382
+ return this.transition({
383
+ ...input,
384
+ expectedState: 'local-commit-entered',
385
+ nextState: 'released',
386
+ });
387
+ }
388
+ completeLocalCommitGroup(input, beforeRelease) {
389
+ return this.db.transaction(() => {
390
+ this.requireCompletionGroup(input, 'local-commit-entered');
391
+ beforeRelease();
392
+ this.persistCompletionGroupTransition(input, 'local-commit-entered', 'released');
393
+ return input.permitIds.map((permitId) => this.read(permitId));
394
+ })();
395
+ }
396
+ acknowledgeNonApplyingCompletion(input) {
397
+ return this.db.transaction(() => {
398
+ const current = this.requirePermit(input.permitId);
399
+ this.assertFence(current, input);
400
+ if (current.ownerMode !== input.ownerMode) {
401
+ throw new LocalSyncExecutionPermitError(`Execution permit ${input.permitId} belongs to ${current.ownerMode}, not ${input.ownerMode}.`, 'SYNC_COORDINATOR_PERMIT_IDENTITY_CONFLICT');
402
+ }
403
+ if (!NON_APPLYING_OPERATION_CLASSES.has(current.operationClass)) {
404
+ throw new LocalSyncExecutionPermitError(`Execution permit ${input.permitId} requires an atomic local apply.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
405
+ }
406
+ if (current.state !== 'gateway-complete-awaiting-apply'
407
+ || current.upstreamDisposition !== 'accepted') {
408
+ throw new LocalSyncExecutionPermitError(`Execution permit ${input.permitId} has no accepted non-applying completion to acknowledge.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
409
+ }
410
+ return this.transition({
411
+ permitId: input.permitId,
412
+ workspaceId: input.workspaceId,
413
+ coordinatorGeneration: input.coordinatorGeneration,
414
+ serverInstanceId: input.serverInstanceId,
415
+ expectedState: 'gateway-complete-awaiting-apply',
416
+ nextState: 'released',
417
+ });
418
+ })();
419
+ }
420
+ completeAcceptedV3Dispatch(input, applyAuthoritativeAndAck) {
421
+ return this.db.transaction(() => {
422
+ const current = this.requirePermit(input.permitId);
423
+ this.assertFence(current, input);
424
+ if (current.ownerMode !== input.ownerMode) {
425
+ throw new LocalSyncExecutionPermitError(`Execution permit ${input.permitId} belongs to ${current.ownerMode}, not ${input.ownerMode}.`, 'SYNC_COORDINATOR_PERMIT_IDENTITY_CONFLICT');
426
+ }
427
+ if (!input.operationIdentity
428
+ || current.operationIdentity !== input.operationIdentity) {
429
+ throw new LocalSyncExecutionPermitError(`Execution permit ${input.permitId} belongs to a different operation identity.`, 'SYNC_COORDINATOR_PERMIT_IDENTITY_CONFLICT');
430
+ }
431
+ if (current.operationClass !== 'v3-dispatch') {
432
+ throw new LocalSyncExecutionPermitError(`Execution permit ${input.permitId} is not a v3 dispatch operation.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
433
+ }
434
+ if (current.state !== 'gateway-complete-awaiting-apply'
435
+ || current.upstreamDisposition !== 'accepted') {
436
+ throw new LocalSyncExecutionPermitError(`Execution permit ${input.permitId} is not an accepted v3 dispatch awaiting authoritative apply.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
437
+ }
438
+ this.assertLocalCommitEntryFence(current);
439
+ this.persistAcceptedV3DispatchTransition(input, 'gateway-complete-awaiting-apply', 'local-commit-entered');
440
+ const result = applyAuthoritativeAndAck();
441
+ assertSynchronousTransactionResult(result);
442
+ this.resolveMatchingV3DispatchRecoveryObligations({
443
+ workspaceId: input.workspaceId,
444
+ coordinatorGeneration: input.coordinatorGeneration,
445
+ ownerMode: input.ownerMode,
446
+ operationIdentity: input.operationIdentity,
447
+ resolvedBoundary: {
448
+ version: 1,
449
+ kind: 'accepted-v3-dispatch',
450
+ operationIdentity: input.operationIdentity,
451
+ },
452
+ });
453
+ this.persistAcceptedV3DispatchTransition(input, 'local-commit-entered', 'released');
454
+ return result;
455
+ })();
456
+ }
457
+ resolveV3DispatchRecoveryObligations(input) {
458
+ return this.db.transaction(() => {
459
+ this.assertRecoveryResolutionCoordinatorFence(input);
460
+ const obligationIds = this.normalizeIdentityGroup(input.resolutions.map((resolution) => resolution.obligationId), 'A v3 dispatch recovery resolution');
461
+ const resolutions = new Map(input.resolutions.map((resolution) => [
462
+ resolution.obligationId,
463
+ resolution,
464
+ ]));
465
+ for (const obligationId of obligationIds) {
466
+ const resolution = resolutions.get(obligationId);
467
+ const row = this.db.prepare(`
468
+ SELECT obligation.*,
469
+ permit.workspace_id AS permit_workspace_id,
470
+ permit.coordinator_generation AS permit_generation,
471
+ permit.operation_class AS permit_operation_class,
472
+ permit.operation_identity AS permit_operation_identity
473
+ FROM local_sync_recovery_obligations AS obligation
474
+ INNER JOIN local_sync_execution_permits AS permit
475
+ ON permit.permit_id = obligation.permit_id
476
+ WHERE obligation.obligation_id = ?
477
+ `).get(obligationId);
478
+ if (!row) {
479
+ throw new LocalSyncExecutionPermitError(`Recovery obligation ${obligationId} was not found.`, 'SYNC_COORDINATOR_PERMIT_NOT_FOUND');
480
+ }
481
+ const obligation = mapObligation(row);
482
+ if (obligation.workspaceId !== input.workspaceId
483
+ || String(row.permit_workspace_id || '') !== input.workspaceId
484
+ || Number(row.permit_generation || 0) > input.coordinatorGeneration) {
485
+ throw new LocalSyncExecutionPermitError(`Recovery obligation ${obligationId} belongs to a different workspace or future generation.`, Number(row.permit_generation || 0) > input.coordinatorGeneration
486
+ ? 'SYNC_COORDINATOR_STALE_GENERATION'
487
+ : 'SYNC_COORDINATOR_INACTIVE_WORKSPACE');
488
+ }
489
+ if (obligation.operationClass !== 'v3-dispatch'
490
+ || row.permit_operation_class !== 'v3-dispatch'
491
+ || obligation.requiredAction !== 'replay-operation-then-reconcile'
492
+ || !resolution.operationIdentity
493
+ || obligation.operationIdentity !== resolution.operationIdentity
494
+ || row.permit_operation_identity !== resolution.operationIdentity) {
495
+ throw new LocalSyncExecutionPermitError(`Recovery obligation ${obligationId} does not match the settled v3 dispatch operation.`, 'SYNC_COORDINATOR_PERMIT_IDENTITY_CONFLICT');
496
+ }
497
+ const resolvedBoundary = canonicalWorkspaceSyncJson(resolution.resolvedBoundary);
498
+ if (obligation.resolvedAt) {
499
+ if (canonicalWorkspaceSyncJson(obligation.resolvedBoundary)
500
+ !== resolvedBoundary) {
501
+ throw new LocalSyncExecutionPermitError(`Recovery obligation ${obligationId} was resolved by different evidence.`, 'SYNC_COORDINATOR_PERMIT_IDENTITY_CONFLICT');
502
+ }
503
+ continue;
504
+ }
505
+ const result = this.db.prepare(`
506
+ UPDATE local_sync_recovery_obligations
507
+ SET resolved_at = ?, resolved_boundary_json = ?
508
+ WHERE obligation_id = ? AND workspace_id = ?
509
+ AND resolved_at IS NULL
510
+ `).run(this.now(), resolvedBoundary, obligationId, input.workspaceId);
511
+ if (Number(result?.changes || 0) !== 1) {
512
+ throw new LocalSyncExecutionPermitError(`Recovery obligation ${obligationId} changed before v3 dispatch recovery committed.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
513
+ }
514
+ }
515
+ return obligationIds.map((obligationId) => mapObligation(this.db.prepare(`
516
+ SELECT *
517
+ FROM local_sync_recovery_obligations
518
+ WHERE obligation_id = ?
519
+ `).get(obligationId)));
520
+ })();
521
+ }
522
+ completeAcceptedPushEchoGroup(input, applyAuthoritativeEchoes) {
523
+ return this.db.transaction(() => {
524
+ const permits = this.requireAcceptedPushEchoGroup(input);
525
+ const completionFence = this.snapshotAcceptedPushEchoCompletionFence(input);
526
+ for (const permit of permits) {
527
+ this.assertLocalCommitEntryFence(permit);
528
+ }
529
+ this.persistAcceptedPushEchoGroupTransition(completionFence, 'gateway-complete-awaiting-apply', 'local-commit-entered');
530
+ const result = applyAuthoritativeEchoes();
531
+ assertSynchronousTransactionResult(result);
532
+ this.resolveAcceptedPushRecoveryObligations(completionFence, permits);
533
+ this.persistAcceptedPushEchoGroupTransition(completionFence, 'local-commit-entered', 'released');
534
+ return result;
535
+ })();
536
+ }
537
+ completeAcceptedPushWithoutEcho(input) {
538
+ return this.db.transaction(() => {
539
+ const permits = this.requireAcceptedPushEchoGroup(input);
540
+ const completionFence = this.snapshotAcceptedPushEchoCompletionFence(input);
541
+ if (permits.length !== 1) {
542
+ throw new LocalSyncExecutionPermitError('A zero-echo push completion requires exactly one accepted permit.', 'SYNC_COORDINATOR_PERMIT_IDENTITY_CONFLICT');
543
+ }
544
+ this.assertLocalCommitEntryFence(permits[0]);
545
+ this.persistAcceptedPushEchoGroupTransition(completionFence, 'gateway-complete-awaiting-apply', 'local-commit-entered');
546
+ this.resolveAcceptedPushRecoveryObligations(completionFence, permits);
547
+ this.persistAcceptedPushEchoGroupTransition(completionFence, 'local-commit-entered', 'released');
548
+ return this.read(permits[0].permitId);
549
+ })();
550
+ }
551
+ abandonPermit(input) {
552
+ return this.db.transaction(() => {
553
+ const current = this.requirePermit(input.permitId);
554
+ this.assertFence(current, input);
555
+ if (current.state === 'released'
556
+ || current.state === 'abandoned-clean'
557
+ || current.state === 'abandoned-reconcile-required') {
558
+ return current;
559
+ }
560
+ if (current.state === 'gateway-in-flight') {
561
+ throw new LocalSyncExecutionPermitError(`Execution permit ${input.permitId} still has a gateway request in flight.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
562
+ }
563
+ if (current.state === 'local-commit-entered') {
564
+ throw new LocalSyncExecutionPermitError(`Execution permit ${input.permitId} is owned by the server local commit.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
565
+ }
566
+ const clean = current.state === 'issued-idle'
567
+ || (current.state === 'gateway-complete-awaiting-apply'
568
+ && current.upstreamDisposition === 'rejected');
569
+ const disposition = current.upstreamDisposition === 'accepted'
570
+ ? 'accepted'
571
+ : current.upstreamDisposition === 'rejected'
572
+ ? 'rejected'
573
+ : current.state === 'issued-idle'
574
+ ? 'not-started'
575
+ : 'unknown';
576
+ this.persistAbandon(current, clean ? 'abandoned-clean' : 'abandoned-reconcile-required', disposition, input.errorCode || 'SYNC_COORDINATOR_PERMIT_ABANDONED');
577
+ if (!clean)
578
+ this.createRecoveryObligation(current, disposition, input.errorCode || 'SYNC_COORDINATOR_PERMIT_ABANDONED');
579
+ return this.read(input.permitId);
580
+ })();
581
+ }
582
+ recoverExpiredPermits(input) {
583
+ return this.db.transaction(() => {
584
+ const excluded = new Set(input.excludePermitIds || []);
585
+ const rows = this.db.prepare(`
586
+ SELECT *
587
+ FROM local_sync_execution_permits
588
+ WHERE server_instance_id = ?
589
+ AND workspace_id = ?
590
+ AND deadline_at <= ?
591
+ AND state <> 'local-commit-entered'
592
+ AND state NOT IN ('released', 'abandoned-clean', 'abandoned-reconcile-required')
593
+ ORDER BY issued_at ASC
594
+ `).all(input.currentServerInstanceId, input.workspaceId, this.now());
595
+ let clean = 0;
596
+ let reconcileRequired = 0;
597
+ for (const row of rows) {
598
+ const permit = mapPermit(row);
599
+ if (excluded.has(permit.permitId))
600
+ continue;
601
+ if (permit.state === 'gateway-in-flight') {
602
+ this.persistAbandon(permit, 'abandoned-reconcile-required', 'unknown', 'SYNC_COORDINATOR_PERMIT_EXPIRED');
603
+ this.createRecoveryObligation(permit, 'unknown', 'SYNC_COORDINATOR_PERMIT_EXPIRED');
604
+ reconcileRequired += 1;
605
+ continue;
606
+ }
607
+ const result = this.abandonPermit({
608
+ permitId: permit.permitId,
609
+ workspaceId: permit.workspaceId,
610
+ coordinatorGeneration: permit.coordinatorGeneration,
611
+ serverInstanceId: permit.serverInstanceId,
612
+ errorCode: 'SYNC_COORDINATOR_PERMIT_EXPIRED',
613
+ });
614
+ if (result.state === 'abandoned-clean')
615
+ clean += 1;
616
+ if (result.state === 'abandoned-reconcile-required')
617
+ reconcileRequired += 1;
618
+ }
619
+ return { clean, reconcileRequired };
620
+ })();
621
+ }
622
+ recoverPriorServerPermits(input) {
623
+ const recovered = this.db.transaction(() => {
624
+ const params = [input.currentServerInstanceId];
625
+ let workspaceClause = '';
626
+ if (input.workspaceId) {
627
+ workspaceClause = 'AND workspace_id = ?';
628
+ params.push(input.workspaceId);
629
+ }
630
+ const rows = this.db.prepare(`
631
+ SELECT *
632
+ FROM local_sync_execution_permits
633
+ WHERE server_instance_id <> ?
634
+ ${workspaceClause}
635
+ AND state NOT IN ('released', 'abandoned-clean', 'abandoned-reconcile-required')
636
+ ORDER BY issued_at ASC
637
+ `).all(...params);
638
+ let clean = 0;
639
+ let reconcileRequired = 0;
640
+ let localCommitPending = 0;
641
+ for (const row of rows) {
642
+ const permit = mapPermit(row);
643
+ if (permit.state === 'local-commit-entered') {
644
+ this.invariantBlockedWorkspaces.add(permit.workspaceId);
645
+ localCommitPending += 1;
646
+ continue;
647
+ }
648
+ if (permit.state === 'issued-idle') {
649
+ this.persistAbandon(permit, 'abandoned-clean', 'not-started', 'SYNC_COORDINATOR_SERVER_RESTARTED');
650
+ clean += 1;
651
+ continue;
652
+ }
653
+ const disposition = permit.upstreamDisposition === 'rejected'
654
+ ? 'rejected'
655
+ : permit.upstreamDisposition === 'accepted'
656
+ ? 'accepted'
657
+ : 'unknown';
658
+ this.persistAbandon(permit, 'abandoned-reconcile-required', disposition, 'SYNC_COORDINATOR_SERVER_RESTARTED');
659
+ this.createRecoveryObligation(permit, disposition, 'SYNC_COORDINATOR_SERVER_RESTARTED');
660
+ reconcileRequired += 1;
661
+ }
662
+ return { clean, reconcileRequired, localCommitPending };
663
+ })();
664
+ this.pruneTerminalHistory();
665
+ return recovered;
666
+ }
667
+ pruneTerminalHistory(deleteLimit = LOCAL_SYNC_PERMIT_RETENTION_DELETE_BATCH) {
668
+ const nowMs = Date.parse(this.now());
669
+ if (!Number.isFinite(nowMs))
670
+ return { permits: 0, obligations: 0 };
671
+ const boundedDeleteLimit = Math.max(1, Math.min(LOCAL_SYNC_PERMIT_RETENTION_SWEEP_LIMIT, Math.floor(Number(deleteLimit) || 0)));
672
+ const cutoff = new Date(nowMs - LOCAL_SYNC_PERMIT_RETENTION_MIN_AGE_MS).toISOString();
673
+ return this.db.transaction(() => {
674
+ const resolvedObligations = this.db.prepare(`
675
+ SELECT *
676
+ FROM local_sync_recovery_obligations
677
+ WHERE resolved_at IS NOT NULL
678
+ ORDER BY resolved_at DESC, obligation_id DESC
679
+ `).all().map(mapObligation);
680
+ const protectedObligationIds = new Set(resolvedObligations
681
+ .slice(0, LOCAL_SYNC_PERMIT_RETENTION_SOFT_LIMIT)
682
+ .map((obligation) => obligation.obligationId));
683
+ for (const obligation of resolvedObligations) {
684
+ if (obligation.resolvedAt && obligation.resolvedAt >= cutoff) {
685
+ protectedObligationIds.add(obligation.obligationId);
686
+ }
687
+ }
688
+ const obligationCandidates = resolvedObligations
689
+ .filter((obligation) => (obligation.resolvedAt
690
+ && obligation.resolvedAt < cutoff
691
+ && !protectedObligationIds.has(obligation.obligationId)))
692
+ .reverse()
693
+ .slice(0, boundedDeleteLimit);
694
+ const removeObligation = this.db.prepare(`
695
+ DELETE FROM local_sync_recovery_obligations
696
+ WHERE obligation_id = ? AND resolved_at IS NOT NULL
697
+ `);
698
+ let obligations = 0;
699
+ for (const obligation of obligationCandidates) {
700
+ const result = removeObligation.run(obligation.obligationId);
701
+ obligations += Number(result?.changes || 0);
702
+ }
703
+ const terminalPermits = this.db.prepare(`
704
+ SELECT *
705
+ FROM local_sync_execution_permits
706
+ WHERE state IN ('released', 'abandoned-clean', 'abandoned-reconcile-required')
707
+ AND completed_at IS NOT NULL
708
+ ORDER BY completed_at DESC, permit_id DESC
709
+ `).all().map(mapPermit);
710
+ const protectedPermitIds = new Set(terminalPermits
711
+ .slice(0, LOCAL_SYNC_PERMIT_RETENTION_SOFT_LIMIT)
712
+ .map((permit) => permit.permitId));
713
+ for (const permit of terminalPermits) {
714
+ if (permit.completedAt && permit.completedAt >= cutoff) {
715
+ protectedPermitIds.add(permit.permitId);
716
+ }
717
+ }
718
+ const referencedPermitRows = this.db.prepare(`
719
+ SELECT permit_id
720
+ FROM local_sync_recovery_obligations
721
+ `).all();
722
+ for (const row of referencedPermitRows) {
723
+ if (row.permit_id)
724
+ protectedPermitIds.add(row.permit_id);
725
+ }
726
+ const permitCandidates = terminalPermits
727
+ .filter((permit) => (permit.completedAt
728
+ && permit.completedAt < cutoff
729
+ && !protectedPermitIds.has(permit.permitId)))
730
+ .reverse()
731
+ .slice(0, boundedDeleteLimit);
732
+ const removePermit = this.db.prepare(`
733
+ DELETE FROM local_sync_execution_permits
734
+ WHERE permit_id = ?
735
+ AND state IN ('released', 'abandoned-clean', 'abandoned-reconcile-required')
736
+ `);
737
+ let permits = 0;
738
+ for (const permit of permitCandidates) {
739
+ const result = removePermit.run(permit.permitId);
740
+ permits += Number(result?.changes || 0);
741
+ }
742
+ return { permits, obligations };
743
+ })();
744
+ }
745
+ listOpenRecoveryObligations(workspaceId) {
746
+ return this.db.prepare(`
747
+ SELECT *
748
+ FROM local_sync_recovery_obligations
749
+ WHERE workspace_id = ? AND resolved_at IS NULL
750
+ ORDER BY created_at ASC
751
+ `).all(workspaceId).map(mapObligation);
752
+ }
753
+ inspectAuthoritativeRepairRecoveryObligations(workspaceId) {
754
+ const result = this.db.prepare(`
755
+ SELECT
756
+ COUNT(*) AS count,
757
+ SUM(
758
+ CASE
759
+ WHEN operation_class = 'push'
760
+ AND required_action = 'replay-operation-then-reconcile'
761
+ THEN 1
762
+ ELSE 0
763
+ END
764
+ ) AS push_replay_count
765
+ FROM local_sync_recovery_obligations
766
+ WHERE workspace_id = ?
767
+ AND resolved_at IS NULL
768
+ AND (
769
+ (
770
+ operation_class IN ('pull', 'repair')
771
+ AND required_action = 'refetch-from-committed-cursor'
772
+ )
773
+ OR (
774
+ operation_class = 'push'
775
+ AND required_action = 'replay-operation-then-reconcile'
776
+ )
777
+ )
778
+ `).get(workspaceId);
779
+ return {
780
+ total: Number(result?.count || 0),
781
+ requiresV2PushReplay: Number(result?.push_replay_count || 0) > 0,
782
+ };
783
+ }
784
+ resolveAuthoritativeRepairRecoveryObligations(input) {
785
+ return this.db.transaction(() => {
786
+ const state = this.db.prepare(`
787
+ SELECT active_workspace_id, coordinator_generation, ownership_mode, transition_state
788
+ FROM local_sync_coordinator_state
789
+ WHERE coordinator_id = ?
790
+ `).get(LOCAL_SYNC_COORDINATOR_ID);
791
+ if (!state || Number(state.coordinator_generation || 0) !== input.coordinatorGeneration) {
792
+ throw new LocalSyncExecutionPermitError('The coordinator generation changed before authoritative repair completed.', 'SYNC_COORDINATOR_STALE_GENERATION');
793
+ }
794
+ if (String(state.active_workspace_id || '') !== input.workspaceId) {
795
+ throw new LocalSyncExecutionPermitError('Authoritative repair completed for an inactive workspace.', 'SYNC_COORDINATOR_INACTIVE_WORKSPACE');
796
+ }
797
+ if (state.ownership_mode !== input.ownerMode
798
+ || state.transition_state !== 'idle') {
799
+ throw new LocalSyncExecutionPermitError('Authoritative repair cannot settle recovery during an ownership transition.', 'SYNC_COORDINATOR_PERMITS_DISABLED');
800
+ }
801
+ const activePermit = this.db.prepare(`
802
+ SELECT permit_id
803
+ FROM local_sync_execution_permits
804
+ WHERE workspace_id = ?
805
+ AND state NOT IN ('released', 'abandoned-clean', 'abandoned-reconcile-required')
806
+ LIMIT 1
807
+ `).get(input.workspaceId);
808
+ if (activePermit?.permit_id) {
809
+ throw new LocalSyncExecutionPermitError('Authoritative repair cannot settle recovery while execution permits are active.', 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
810
+ }
811
+ const unresolvedDispatch = this.db.prepare(`
812
+ SELECT obligation_id
813
+ FROM local_sync_recovery_obligations
814
+ WHERE workspace_id = ?
815
+ AND resolved_at IS NULL
816
+ AND operation_class = 'v3-dispatch'
817
+ LIMIT 1
818
+ `).get(input.workspaceId);
819
+ if (unresolvedDispatch?.obligation_id) {
820
+ throw new LocalSyncExecutionPermitError('Authoritative repair cannot supersede unresolved durable dispatch recovery.', 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
821
+ }
822
+ const resolvedAt = this.now();
823
+ const resolvedBoundary = canonicalWorkspaceSyncJson({
824
+ version: 1,
825
+ kind: 'authoritative-repair',
826
+ repairId: input.repairId,
827
+ stateSignatureSha256: input.stateSignatureSha256,
828
+ coordinatorGeneration: input.coordinatorGeneration,
829
+ completedAt: resolvedAt,
830
+ });
831
+ const result = this.db.prepare(`
832
+ UPDATE local_sync_recovery_obligations
833
+ SET resolved_at = ?,
834
+ resolved_boundary_json = ?
835
+ WHERE workspace_id = ?
836
+ AND resolved_at IS NULL
837
+ AND permit_id IN (
838
+ SELECT permit_id
839
+ FROM local_sync_execution_permits
840
+ WHERE workspace_id = ?
841
+ AND coordinator_generation <= ?
842
+ AND (
843
+ (
844
+ operation_class IN ('pull', 'repair')
845
+ AND local_sync_recovery_obligations.required_action =
846
+ 'refetch-from-committed-cursor'
847
+ )
848
+ OR (
849
+ operation_class = 'push'
850
+ AND local_sync_recovery_obligations.required_action =
851
+ 'replay-operation-then-reconcile'
852
+ )
853
+ )
854
+ )
855
+ `).run(resolvedAt, resolvedBoundary, input.workspaceId, input.workspaceId, input.coordinatorGeneration);
856
+ const remaining = this.db.prepare(`
857
+ SELECT COUNT(*) AS count
858
+ FROM local_sync_recovery_obligations
859
+ WHERE workspace_id = ? AND resolved_at IS NULL
860
+ `).get(input.workspaceId);
861
+ return {
862
+ resolved: Number(result?.changes || 0),
863
+ remaining: Number(remaining?.count || 0),
864
+ };
865
+ })();
866
+ }
867
+ listResolvableRecoveryObligations(completionGroup) {
868
+ validateWorkspaceSyncEngineTransferCompletionGroup(completionGroup);
869
+ this.assertRecoveryResolutionCoordinatorFence(completionGroup);
870
+ const completionPermits = this.requireCompletionGroup(completionGroup, 'local-commit-entered');
871
+ const operationClasses = new Set(completionPermits.map((permit) => permit.operationClass));
872
+ if (operationClasses.size !== 1)
873
+ return [];
874
+ const [operationClass] = [...operationClasses];
875
+ const previousBoundary = canonicalWorkspaceSyncJson(completionGroup.previousBoundary);
876
+ return this.db.prepare(`
877
+ SELECT obligation.*
878
+ FROM local_sync_recovery_obligations AS obligation
879
+ INNER JOIN local_sync_execution_permits AS permit
880
+ ON permit.permit_id = obligation.permit_id
881
+ WHERE obligation.workspace_id = ?
882
+ AND obligation.resolved_at IS NULL
883
+ AND obligation.required_action = 'refetch-from-committed-cursor'
884
+ AND obligation.operation_class = ?
885
+ AND permit.workspace_id = ?
886
+ AND permit.coordinator_generation <= ?
887
+ AND permit.operation_class = ?
888
+ ORDER BY obligation.created_at ASC, obligation.obligation_id ASC
889
+ `).all(completionGroup.workspaceId, operationClass, completionGroup.workspaceId, completionGroup.coordinatorGeneration, operationClass).filter((row) => (canonicalWorkspaceSyncJson(mapObligation(row).lastCommittedCursor)
890
+ === previousBoundary)).map(mapObligation);
891
+ }
892
+ resolveRecoveryObligations(input, commitBoundary) {
893
+ return this.db.transaction(() => {
894
+ validateWorkspaceSyncEngineTransferCompletionGroup(input.completionGroup);
895
+ const obligationIds = this.normalizeIdentityGroup(input.obligationIds, 'A recovery obligation resolution');
896
+ const completionGroup = input.completionGroup;
897
+ this.assertRecoveryResolutionCoordinatorFence(completionGroup);
898
+ const completionPermits = this.requireCompletionGroup(completionGroup, 'local-commit-entered');
899
+ const obligations = obligationIds.map((obligationId) => {
900
+ const row = this.db.prepare(`
901
+ SELECT obligation.*,
902
+ permit.workspace_id AS permit_workspace_id,
903
+ permit.coordinator_generation AS permit_generation,
904
+ permit.operation_class AS permit_operation_class,
905
+ permit.last_committed_cursor_json AS permit_last_committed_cursor_json
906
+ FROM local_sync_recovery_obligations AS obligation
907
+ INNER JOIN local_sync_execution_permits AS permit
908
+ ON permit.permit_id = obligation.permit_id
909
+ WHERE obligation.obligation_id = ?
910
+ `).get(obligationId);
911
+ if (!row) {
912
+ throw new LocalSyncExecutionPermitError(`Recovery obligation ${obligationId} was not found.`, 'SYNC_COORDINATOR_PERMIT_NOT_FOUND');
913
+ }
914
+ if (String(row.workspace_id || '') !== completionGroup.workspaceId
915
+ || String(row.permit_workspace_id || '') !== completionGroup.workspaceId
916
+ || Number(row.permit_generation || 0)
917
+ > completionGroup.coordinatorGeneration) {
918
+ throw new LocalSyncExecutionPermitError(`Recovery obligation ${obligationId} belongs to a different workspace or future generation.`, String(row.workspace_id || '') === completionGroup.workspaceId
919
+ && String(row.permit_workspace_id || '')
920
+ === completionGroup.workspaceId
921
+ ? Number(row.permit_generation || 0)
922
+ > completionGroup.coordinatorGeneration
923
+ ? 'SYNC_COORDINATOR_STALE_GENERATION'
924
+ : 'SYNC_COORDINATOR_INACTIVE_WORKSPACE'
925
+ : 'SYNC_COORDINATOR_INACTIVE_WORKSPACE');
926
+ }
927
+ const obligation = mapObligation(row);
928
+ const originBoundary = row.permit_last_committed_cursor_json
929
+ ? JSON.parse(row.permit_last_committed_cursor_json)
930
+ : null;
931
+ if (obligation.requiredAction !== 'refetch-from-committed-cursor') {
932
+ throw new LocalSyncExecutionPermitError(`Recovery obligation ${obligationId} requires operation replay before reconciliation.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
933
+ }
934
+ if (row.permit_operation_class !== obligation.operationClass
935
+ || completionPermits.some((permit) => (permit.operationClass !== obligation.operationClass))) {
936
+ throw new LocalSyncExecutionPermitError(`Recovery obligation ${obligationId} does not match the completion group's operation class.`, 'SYNC_COORDINATOR_PERMIT_IDENTITY_CONFLICT');
937
+ }
938
+ if (canonicalWorkspaceSyncJson(obligation.lastCommittedCursor)
939
+ !== canonicalWorkspaceSyncJson(completionGroup.previousBoundary)
940
+ || canonicalWorkspaceSyncJson(originBoundary)
941
+ !== canonicalWorkspaceSyncJson(completionGroup.previousBoundary)) {
942
+ throw new LocalSyncExecutionPermitError(`Recovery obligation ${obligationId} does not start at the resolved boundary.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
943
+ }
944
+ return obligation;
945
+ });
946
+ const openObligations = obligations.filter((obligation) => !obligation.resolvedAt);
947
+ if (obligations.some((obligation) => (obligation.resolvedAt
948
+ && (canonicalWorkspaceSyncJson(obligation.resolvedBoundary)
949
+ !== canonicalWorkspaceSyncJson(completionGroup.expectedBoundary))))) {
950
+ throw new LocalSyncExecutionPermitError('The resolved recovery boundary does not match this replay.', 'SYNC_COORDINATOR_PERMIT_IDENTITY_CONFLICT');
951
+ }
952
+ if (openObligations.length === 0)
953
+ return obligations;
954
+ const committedBoundary = commitBoundary({
955
+ previousBoundary: JSON.parse(canonicalWorkspaceSyncJson(completionGroup.previousBoundary)),
956
+ expectedBoundary: JSON.parse(canonicalWorkspaceSyncJson(completionGroup.expectedBoundary)),
957
+ });
958
+ if (canonicalWorkspaceSyncJson(committedBoundary)
959
+ !== canonicalWorkspaceSyncJson(completionGroup.expectedBoundary)) {
960
+ throw new LocalSyncExecutionPermitError('The committed recovery boundary does not match the expected boundary.', 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
961
+ }
962
+ const at = this.now();
963
+ const resolve = this.db.prepare(`
964
+ UPDATE local_sync_recovery_obligations
965
+ SET resolved_at = ?,
966
+ resolved_boundary_json = ?
967
+ WHERE obligation_id = ?
968
+ AND workspace_id = ?
969
+ AND resolved_at IS NULL
970
+ `);
971
+ for (const obligation of openObligations) {
972
+ const result = resolve.run(at, canonicalWorkspaceSyncJson(completionGroup.expectedBoundary), obligation.obligationId, completionGroup.workspaceId);
973
+ if (Number(result?.changes || 0) !== 1) {
974
+ throw new LocalSyncExecutionPermitError(`Recovery obligation ${obligation.obligationId} changed before resolution committed.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
975
+ }
976
+ }
977
+ return obligationIds.map((obligationId) => mapObligation(this.db.prepare(`
978
+ SELECT *
979
+ FROM local_sync_recovery_obligations
980
+ WHERE obligation_id = ?
981
+ `).get(obligationId)));
982
+ })();
983
+ }
984
+ requirePermit(permitId) {
985
+ const permit = this.read(permitId);
986
+ if (!permit) {
987
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permitId} was not found.`, 'SYNC_COORDINATOR_PERMIT_NOT_FOUND');
988
+ }
989
+ return permit;
990
+ }
991
+ assertFence(permit, input) {
992
+ if (permit.serverInstanceId !== input.serverInstanceId) {
993
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permit.permitId} belongs to a different server instance.`, 'SYNC_COORDINATOR_PERMIT_SERVER_MISMATCH');
994
+ }
995
+ if (permit.coordinatorGeneration !== input.coordinatorGeneration) {
996
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permit.permitId} belongs to a stale coordinator generation.`, 'SYNC_COORDINATOR_STALE_GENERATION');
997
+ }
998
+ if (permit.workspaceId !== input.workspaceId) {
999
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permit.permitId} belongs to a different workspace.`, 'SYNC_COORDINATOR_INACTIVE_WORKSPACE');
1000
+ }
1001
+ }
1002
+ assertCoordinatorEntryFence(permit) {
1003
+ const state = this.db.prepare(`
1004
+ SELECT active_workspace_id, coordinator_generation, ownership_mode, transition_state
1005
+ FROM local_sync_coordinator_state
1006
+ WHERE coordinator_id = ?
1007
+ `).get(LOCAL_SYNC_COORDINATOR_ID);
1008
+ if (!state || Number(state.coordinator_generation || 0) !== permit.coordinatorGeneration) {
1009
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permit.permitId} belongs to a stale coordinator generation.`, 'SYNC_COORDINATOR_STALE_GENERATION');
1010
+ }
1011
+ if (String(state.active_workspace_id || '') !== permit.workspaceId) {
1012
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permit.permitId} belongs to an inactive workspace.`, 'SYNC_COORDINATOR_INACTIVE_WORKSPACE');
1013
+ }
1014
+ if (state.ownership_mode !== permit.ownerMode || state.transition_state !== 'idle') {
1015
+ throw new LocalSyncExecutionPermitError(`${permit.ownerMode} execution permits cannot enter work during an ownership transition.`, 'SYNC_COORDINATOR_PERMITS_DISABLED');
1016
+ }
1017
+ }
1018
+ assertLocalCommitEntryFence(permit) {
1019
+ const state = this.db.prepare(`
1020
+ SELECT active_workspace_id, coordinator_generation, ownership_mode,
1021
+ transition_state, transfer_target_mode, transfer_phase
1022
+ FROM local_sync_coordinator_state
1023
+ WHERE coordinator_id = ?
1024
+ `).get(LOCAL_SYNC_COORDINATOR_ID);
1025
+ if (!state || String(state.active_workspace_id || '') !== permit.workspaceId) {
1026
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permit.permitId} belongs to an inactive workspace.`, 'SYNC_COORDINATOR_INACTIVE_WORKSPACE');
1027
+ }
1028
+ const stateGeneration = Number(state.coordinator_generation || 0);
1029
+ const steadySourceOwner = (stateGeneration === permit.coordinatorGeneration
1030
+ && state.ownership_mode === permit.ownerMode
1031
+ && state.transition_state === 'idle');
1032
+ const targetMode = permit.ownerMode === 'browser-gateway'
1033
+ ? 'server'
1034
+ : 'browser-gateway';
1035
+ const transitionMode = permit.ownerMode === 'browser-gateway'
1036
+ ? 'transitioning-to-server'
1037
+ : 'transitioning-to-browser';
1038
+ const drainingSourceOwner = (stateGeneration === permit.coordinatorGeneration
1039
+ && state.ownership_mode === transitionMode
1040
+ && state.transition_state === 'transferring-ownership'
1041
+ && state.transfer_target_mode === targetMode
1042
+ && (state.transfer_phase === 'preparing' || state.transfer_phase === 'draining'));
1043
+ if (!steadySourceOwner && !drainingSourceOwner) {
1044
+ throw new LocalSyncExecutionPermitError(`The permit cannot enter local commit outside its ${permit.ownerMode} drain window.`, stateGeneration === permit.coordinatorGeneration
1045
+ ? 'SYNC_COORDINATOR_PERMITS_DISABLED'
1046
+ : 'SYNC_COORDINATOR_STALE_GENERATION');
1047
+ }
1048
+ if (Date.parse(permit.deadlineAt) <= Date.parse(this.now())) {
1049
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permit.permitId} has expired.`, 'SYNC_COORDINATOR_PERMIT_EXPIRED');
1050
+ }
1051
+ }
1052
+ requireCompletionGroup(input, expectedState) {
1053
+ const normalizedIds = this.normalizeIdentityGroup(input.permitIds, 'A local commit completion group');
1054
+ const permits = normalizedIds.map((permitId) => this.requirePermit(permitId));
1055
+ for (const permit of permits) {
1056
+ this.assertFence(permit, input);
1057
+ if (permit.ownerMode !== input.ownerMode) {
1058
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permit.permitId} belongs to ${permit.ownerMode}, not ${input.ownerMode}.`, 'SYNC_COORDINATOR_PERMIT_IDENTITY_CONFLICT');
1059
+ }
1060
+ if (!APPLYING_OPERATION_CLASSES.has(permit.operationClass)) {
1061
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permit.permitId} is not an applying operation.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
1062
+ }
1063
+ if (canonicalWorkspaceSyncJson(permit.lastCommittedCursor)
1064
+ !== canonicalWorkspaceSyncJson(input.previousBoundary)) {
1065
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permit.permitId} does not start at the completion group's previous boundary.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
1066
+ }
1067
+ if (permit.state !== expectedState
1068
+ || permit.upstreamDisposition !== 'accepted') {
1069
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permit.permitId} is not an accepted ${expectedState} permit.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
1070
+ }
1071
+ }
1072
+ return permits;
1073
+ }
1074
+ snapshotAcceptedPushEchoCompletionFence(input) {
1075
+ const pushBoundary = JSON.parse(canonicalWorkspaceSyncJson(input.pushBoundary));
1076
+ return Object.freeze({
1077
+ workspaceId: input.workspaceId,
1078
+ coordinatorGeneration: input.coordinatorGeneration,
1079
+ ownerMode: input.ownerMode,
1080
+ serverInstanceId: input.serverInstanceId,
1081
+ permitIds: Object.freeze([...input.permitIds]),
1082
+ pushBoundary: Object.freeze({
1083
+ ...pushBoundary,
1084
+ batchOperationIdentities: Object.freeze([
1085
+ ...pushBoundary.batchOperationIdentities,
1086
+ ]),
1087
+ }),
1088
+ });
1089
+ }
1090
+ requireAcceptedPushEchoGroup(input) {
1091
+ const normalizedIds = this.normalizeIdentityGroup(input.permitIds, 'An accepted push echo completion group');
1092
+ const pushBoundary = input.pushBoundary;
1093
+ const batchOperationIdentities = Array.isArray(pushBoundary?.batchOperationIdentities)
1094
+ ? pushBoundary.batchOperationIdentities
1095
+ : [];
1096
+ if (!pushBoundary
1097
+ || pushBoundary.version !== 1
1098
+ || pushBoundary.projection !== 'v2-push'
1099
+ || batchOperationIdentities.length === 0
1100
+ || batchOperationIdentities.some((operationIdentity, index) => (typeof operationIdentity !== 'string'
1101
+ || !operationIdentity
1102
+ || operationIdentity !== operationIdentity.trim()
1103
+ || batchOperationIdentities.indexOf(operationIdentity) !== index))
1104
+ || Object.keys(pushBoundary).length !== 3) {
1105
+ throw new LocalSyncExecutionPermitError('An accepted push echo completion group requires an exact V2 push boundary.', 'SYNC_COORDINATOR_PERMIT_IDENTITY_CONFLICT');
1106
+ }
1107
+ const canonicalPushBoundary = canonicalWorkspaceSyncJson(pushBoundary);
1108
+ const permits = normalizedIds.map((permitId) => this.requirePermit(permitId));
1109
+ const permitOperationIdentities = new Set();
1110
+ for (const permit of permits) {
1111
+ this.assertFence(permit, input);
1112
+ if (permit.ownerMode !== input.ownerMode) {
1113
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permit.permitId} belongs to ${permit.ownerMode}, not ${input.ownerMode}.`, 'SYNC_COORDINATOR_PERMIT_IDENTITY_CONFLICT');
1114
+ }
1115
+ if (permit.operationClass !== 'push') {
1116
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permit.permitId} is not a push operation.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
1117
+ }
1118
+ if (!permit.operationIdentity?.trim()) {
1119
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permit.permitId} has no stable push operation identity.`, 'SYNC_COORDINATOR_PERMIT_IDENTITY_CONFLICT');
1120
+ }
1121
+ if (permit.operationIdentity !== permit.operationIdentity.trim()
1122
+ || permitOperationIdentities.has(permit.operationIdentity)
1123
+ || !batchOperationIdentities.includes(permit.operationIdentity)) {
1124
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permit.permitId} does not have a unique identity in the push attempt boundary.`, 'SYNC_COORDINATOR_PERMIT_IDENTITY_CONFLICT');
1125
+ }
1126
+ permitOperationIdentities.add(permit.operationIdentity);
1127
+ if (canonicalWorkspaceSyncJson(permit.lastCommittedCursor)
1128
+ !== canonicalPushBoundary) {
1129
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permit.permitId} belongs to a different push attempt boundary.`, 'SYNC_COORDINATOR_PERMIT_IDENTITY_CONFLICT');
1130
+ }
1131
+ if (permit.state !== 'gateway-complete-awaiting-apply'
1132
+ || permit.upstreamDisposition !== 'accepted') {
1133
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permit.permitId} is not an accepted push awaiting authoritative echo apply.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
1134
+ }
1135
+ }
1136
+ return permits;
1137
+ }
1138
+ normalizeIdentityGroup(ids, label) {
1139
+ if (!Array.isArray(ids) || ids.length === 0) {
1140
+ throw new LocalSyncExecutionPermitError(`${label} requires at least one ID.`, 'SYNC_COORDINATOR_PERMIT_IDENTITY_CONFLICT');
1141
+ }
1142
+ const normalizedIds = ids.map((id) => id.trim());
1143
+ if (normalizedIds.some((id, index) => !id || id !== ids[index])
1144
+ || new Set(normalizedIds).size !== normalizedIds.length) {
1145
+ throw new LocalSyncExecutionPermitError(`${label} contains invalid or duplicate IDs.`, 'SYNC_COORDINATOR_PERMIT_IDENTITY_CONFLICT');
1146
+ }
1147
+ return normalizedIds;
1148
+ }
1149
+ assertRecoveryResolutionCoordinatorFence(input) {
1150
+ const state = this.db.prepare(`
1151
+ SELECT active_workspace_id, coordinator_generation,
1152
+ ownership_mode, transition_state
1153
+ FROM local_sync_coordinator_state
1154
+ WHERE coordinator_id = ?
1155
+ `).get(LOCAL_SYNC_COORDINATOR_ID);
1156
+ if (!state || Number(state.coordinator_generation || 0) !== input.coordinatorGeneration) {
1157
+ throw new LocalSyncExecutionPermitError('The coordinator generation changed before recovery obligations were resolved.', 'SYNC_COORDINATOR_STALE_GENERATION');
1158
+ }
1159
+ if (String(state.active_workspace_id || '') !== input.workspaceId) {
1160
+ throw new LocalSyncExecutionPermitError(`Workspace ${input.workspaceId} is not the active local sync workspace.`, 'SYNC_COORDINATOR_INACTIVE_WORKSPACE');
1161
+ }
1162
+ if (state.ownership_mode !== input.ownerMode || state.transition_state !== 'idle') {
1163
+ throw new LocalSyncExecutionPermitError('Recovery obligations can resolve only for the steady-state coordinator owner.', 'SYNC_COORDINATOR_PERMITS_DISABLED');
1164
+ }
1165
+ }
1166
+ persistCompletionGroupTransition(input, expectedState, nextState) {
1167
+ const at = this.now();
1168
+ const update = this.db.prepare(`
1169
+ UPDATE local_sync_execution_permits
1170
+ SET state = ?,
1171
+ error_code = NULL,
1172
+ last_transition_at = ?,
1173
+ completed_at = ?
1174
+ WHERE permit_id = ?
1175
+ AND workspace_id = ?
1176
+ AND coordinator_generation = ?
1177
+ AND server_instance_id = ?
1178
+ AND owner_mode = ?
1179
+ AND state = ?
1180
+ AND upstream_disposition = 'accepted'
1181
+ `);
1182
+ for (const permitId of input.permitIds) {
1183
+ const result = update.run(nextState, at, nextState === 'released' ? at : null, permitId, input.workspaceId, input.coordinatorGeneration, input.serverInstanceId, input.ownerMode, expectedState);
1184
+ if (Number(result?.changes || 0) !== 1) {
1185
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permitId} changed before the completion group committed.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
1186
+ }
1187
+ }
1188
+ }
1189
+ persistAcceptedV3DispatchTransition(input, expectedState, nextState) {
1190
+ const at = this.now();
1191
+ const result = this.db.prepare(`
1192
+ UPDATE local_sync_execution_permits
1193
+ SET state = ?,
1194
+ error_code = NULL,
1195
+ last_transition_at = ?,
1196
+ completed_at = ?
1197
+ WHERE permit_id = ?
1198
+ AND workspace_id = ?
1199
+ AND coordinator_generation = ?
1200
+ AND server_instance_id = ?
1201
+ AND owner_mode = ?
1202
+ AND operation_class = 'v3-dispatch'
1203
+ AND operation_identity = ?
1204
+ AND state = ?
1205
+ AND upstream_disposition = 'accepted'
1206
+ `).run(nextState, at, nextState === 'released' ? at : null, input.permitId, input.workspaceId, input.coordinatorGeneration, input.serverInstanceId, input.ownerMode, input.operationIdentity, expectedState);
1207
+ if (Number(result?.changes || 0) !== 1) {
1208
+ throw new LocalSyncExecutionPermitError(`Execution permit ${input.permitId} changed before the v3 dispatch completion committed.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
1209
+ }
1210
+ }
1211
+ persistAcceptedPushEchoGroupTransition(input, expectedState, nextState) {
1212
+ const at = this.now();
1213
+ const update = this.db.prepare(`
1214
+ UPDATE local_sync_execution_permits
1215
+ SET state = ?,
1216
+ error_code = NULL,
1217
+ last_transition_at = ?,
1218
+ completed_at = ?
1219
+ WHERE permit_id = ?
1220
+ AND workspace_id = ?
1221
+ AND coordinator_generation = ?
1222
+ AND server_instance_id = ?
1223
+ AND owner_mode = ?
1224
+ AND operation_class = 'push'
1225
+ AND operation_identity IS NOT NULL
1226
+ AND operation_identity <> ''
1227
+ AND state = ?
1228
+ AND upstream_disposition = 'accepted'
1229
+ `);
1230
+ for (const permitId of input.permitIds) {
1231
+ const result = update.run(nextState, at, nextState === 'released' ? at : null, permitId, input.workspaceId, input.coordinatorGeneration, input.serverInstanceId, input.ownerMode, expectedState);
1232
+ if (Number(result?.changes || 0) !== 1) {
1233
+ throw new LocalSyncExecutionPermitError(`Execution permit ${permitId} changed before the push echo completion committed.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
1234
+ }
1235
+ }
1236
+ }
1237
+ resolveAcceptedPushRecoveryObligations(input, permits) {
1238
+ const operationIdentities = new Set(permits.map((permit) => permit.operationIdentity).filter((identity) => Boolean(identity)));
1239
+ const canonicalBoundary = canonicalWorkspaceSyncJson(input.pushBoundary);
1240
+ const obligations = this.db.prepare(`
1241
+ SELECT obligation.*,
1242
+ permit.operation_identity AS permit_operation_identity,
1243
+ permit.last_committed_cursor_json AS permit_last_committed_cursor_json
1244
+ FROM local_sync_recovery_obligations AS obligation
1245
+ INNER JOIN local_sync_execution_permits AS permit
1246
+ ON permit.permit_id = obligation.permit_id
1247
+ WHERE obligation.workspace_id = ?
1248
+ AND obligation.resolved_at IS NULL
1249
+ AND obligation.operation_class = 'push'
1250
+ AND obligation.required_action = 'replay-operation-then-reconcile'
1251
+ AND permit.workspace_id = ?
1252
+ AND permit.coordinator_generation <= ?
1253
+ AND permit.operation_class = 'push'
1254
+ ORDER BY obligation.created_at ASC, obligation.obligation_id ASC
1255
+ `).all(input.workspaceId, input.workspaceId, input.coordinatorGeneration).filter((row) => {
1256
+ const obligation = mapObligation(row);
1257
+ const originOperationIdentity = String(row.permit_operation_identity || '');
1258
+ return (Boolean(obligation.operationIdentity)
1259
+ && obligation.operationIdentity === originOperationIdentity
1260
+ && operationIdentities.has(obligation.operationIdentity)
1261
+ && canonicalWorkspaceSyncJson(row.permit_last_committed_cursor_json
1262
+ ? JSON.parse(row.permit_last_committed_cursor_json)
1263
+ : null) === canonicalBoundary
1264
+ && canonicalWorkspaceSyncJson(obligation.lastCommittedCursor) === canonicalBoundary);
1265
+ });
1266
+ if (obligations.length === 0)
1267
+ return;
1268
+ const at = this.now();
1269
+ const update = this.db.prepare(`
1270
+ UPDATE local_sync_recovery_obligations
1271
+ SET resolved_at = ?,
1272
+ resolved_boundary_json = ?
1273
+ WHERE obligation_id = ?
1274
+ AND workspace_id = ?
1275
+ AND resolved_at IS NULL
1276
+ AND operation_class = 'push'
1277
+ AND operation_identity = ?
1278
+ AND required_action = 'replay-operation-then-reconcile'
1279
+ AND (
1280
+ last_committed_cursor_json = ?
1281
+ OR (
1282
+ last_committed_cursor_json IS NULL
1283
+ AND ? IS NULL
1284
+ )
1285
+ )
1286
+ `);
1287
+ for (const obligation of obligations) {
1288
+ const result = update.run(at, canonicalBoundary, obligation.obligation_id, input.workspaceId, obligation.operation_identity, obligation.last_committed_cursor_json || null, obligation.last_committed_cursor_json || null);
1289
+ if (Number(result?.changes || 0) !== 1) {
1290
+ throw new LocalSyncExecutionPermitError(`Recovery obligation ${obligation.obligation_id} changed before push replay committed.`, 'SYNC_COORDINATOR_PERMIT_STATE_CONFLICT');
1291
+ }
1292
+ }
1293
+ }
1294
+ resolveMatchingV3DispatchRecoveryObligations(input) {
1295
+ const rows = this.db.prepare(`
1296
+ SELECT obligation_id
1297
+ FROM local_sync_recovery_obligations
1298
+ WHERE workspace_id = ? AND resolved_at IS NULL
1299
+ AND operation_class = 'v3-dispatch'
1300
+ AND operation_identity = ?
1301
+ AND required_action = 'replay-operation-then-reconcile'
1302
+ ORDER BY created_at, obligation_id
1303
+ `).all(input.workspaceId, input.operationIdentity);
1304
+ if (rows.length === 0)
1305
+ return;
1306
+ this.resolveV3DispatchRecoveryObligations({
1307
+ workspaceId: input.workspaceId,
1308
+ coordinatorGeneration: input.coordinatorGeneration,
1309
+ ownerMode: input.ownerMode,
1310
+ resolutions: rows.map((row) => ({
1311
+ obligationId: String(row.obligation_id || ''),
1312
+ operationIdentity: input.operationIdentity,
1313
+ resolvedBoundary: input.resolvedBoundary,
1314
+ })),
1315
+ });
1316
+ }
1317
+ normalizeDrainLimit(limit) {
1318
+ const resolved = limit ?? 100;
1319
+ if (!Number.isSafeInteger(resolved)
1320
+ || resolved < 1
1321
+ || resolved > MAX_DRAIN_INSPECTION_LIMIT) {
1322
+ throw new RangeError(`Permit drain limit must be an integer between 1 and ${MAX_DRAIN_INSPECTION_LIMIT}.`);
1323
+ }
1324
+ return resolved;
1325
+ }
1326
+ assertNoLocalCommitInvariant(workspaceId) {
1327
+ if (!this.invariantBlockedWorkspaces.has(workspaceId))
1328
+ return;
1329
+ throw new LocalSyncExecutionPermitError('Cloud sync is blocked because a prior server left a local commit in an impossible intermediate state.', 'SYNC_COORDINATOR_LOCAL_COMMIT_INVARIANT');
1330
+ }
1331
+ maybePruneTerminalHistory() {
1332
+ const nowMs = Date.parse(this.now());
1333
+ if (!Number.isFinite(nowMs)
1334
+ || nowMs - this.lastRetentionCheckAtMs
1335
+ < LOCAL_SYNC_PERMIT_RETENTION_CHECK_INTERVAL_MS) {
1336
+ return;
1337
+ }
1338
+ this.lastRetentionCheckAtMs = nowMs;
1339
+ this.pruneTerminalHistory(LOCAL_SYNC_PERMIT_RETENTION_SWEEP_LIMIT);
1340
+ }
1341
+ persistAbandon(permit, state, disposition, errorCode) {
1342
+ const at = this.now();
1343
+ this.db.prepare(`
1344
+ UPDATE local_sync_execution_permits
1345
+ SET state = ?, upstream_disposition = ?, last_transition_at = ?,
1346
+ completed_at = ?, error_code = ?
1347
+ WHERE permit_id = ? AND state = ?
1348
+ `).run(state, disposition, at, at, errorCode, permit.permitId, permit.state);
1349
+ }
1350
+ createRecoveryObligation(permit, disposition, errorCode) {
1351
+ const mutationReplay = (permit.operationClass === 'push'
1352
+ || permit.operationClass === 'v3-dispatch') && Boolean(permit.operationIdentity);
1353
+ const requiredAction = mutationReplay
1354
+ ? 'replay-operation-then-reconcile'
1355
+ : 'refetch-from-committed-cursor';
1356
+ const coalescesRepeatedApplyFailure = errorCode === 'WORKSPACE_SYNC_V3_APPLY_NOT_COMMITTED'
1357
+ || errorCode === 'WORKSPACE_SYNC_V3_ATTACHMENT_HYDRATION_NOT_COMMITTED';
1358
+ if (coalescesRepeatedApplyFailure) {
1359
+ const committedBoundary = canonicalWorkspaceSyncJson(permit.lastCommittedCursor);
1360
+ const equivalentOpenObligation = this.db.prepare(`
1361
+ SELECT obligation.*
1362
+ FROM local_sync_recovery_obligations AS obligation
1363
+ INNER JOIN local_sync_execution_permits AS origin
1364
+ ON origin.permit_id = obligation.permit_id
1365
+ WHERE obligation.workspace_id = ?
1366
+ AND obligation.operation_class = ?
1367
+ AND obligation.upstream_disposition = ?
1368
+ AND obligation.required_action = ?
1369
+ AND obligation.resolved_at IS NULL
1370
+ AND origin.error_code = ?
1371
+ ORDER BY obligation.created_at ASC
1372
+ `).all(permit.workspaceId, permit.operationClass, disposition, requiredAction, errorCode).map(mapObligation).some((obligation) => ((obligation.operationIdentity || null) === (permit.operationIdentity || null)
1373
+ && canonicalWorkspaceSyncJson(obligation.lastCommittedCursor) === committedBoundary));
1374
+ if (equivalentOpenObligation)
1375
+ return;
1376
+ }
1377
+ this.db.prepare(`
1378
+ INSERT INTO local_sync_recovery_obligations (
1379
+ obligation_id, permit_id, workspace_id, operation_class,
1380
+ operation_identity, upstream_disposition, last_committed_cursor_json,
1381
+ required_action, created_at, resolved_at
1382
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NULL)
1383
+ ON CONFLICT (permit_id) DO NOTHING
1384
+ `).run(this.createId(), permit.permitId, permit.workspaceId, permit.operationClass, permit.operationIdentity, disposition, permit.lastCommittedCursor === null
1385
+ ? null
1386
+ : JSON.stringify(permit.lastCommittedCursor), requiredAction, this.now());
1387
+ }
1388
+ }