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