@taskforcehq/taskforce 0.3.328 → 0.3.330
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/dist/Taskforce.module.css +523 -79
- package/dist/TaskforceCore.js +237 -230
- package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.js +1 -1
- package/dist/cli.js +34 -0
- package/dist/cliCloudTargetGuard.d.ts +5 -0
- package/dist/cliCloudTargetGuard.js +11 -0
- package/dist/components/features/AiProfilesModule.js +3 -5
- package/dist/components/features/AnnotatedAttachmentWorkspace.js +24 -8
- package/dist/components/features/TaskSettings.d.ts +12 -1
- package/dist/components/features/TaskSettings.js +217 -54
- package/dist/components/features/TaskforceAgentsModule.d.ts +1 -2
- package/dist/components/features/TaskforceAgentsModule.js +586 -116
- package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +1 -1
- package/dist/components/features/agentConnections/AgentConnectionControl.d.ts +15 -0
- package/dist/components/features/agentConnections/AgentConnectionControl.js +125 -0
- package/dist/components/features/agentConnections/ModelConnectionsPanel.d.ts +18 -0
- package/dist/components/features/agentConnections/ModelConnectionsPanel.js +393 -0
- package/dist/components/features/agentConnections/modelConnectionsApi.d.ts +65 -0
- package/dist/components/features/agentConnections/modelConnectionsApi.js +129 -0
- package/dist/components/features/planning/PlanningModule.js +2 -5
- package/dist/components/features/planning/PlanningTaskOrderList.d.ts +1 -1
- package/dist/components/features/planning/PlanningTaskOrderList.js +17 -6
- package/dist/components/features/planning/planningTaskArrangement.d.ts +1 -0
- package/dist/components/features/planning/planningTaskArrangement.js +5 -5
- package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +15 -24
- package/dist/components/features/taskforceAgentEditorModel.d.ts +2 -1
- package/dist/components/features/taskforceAgentEditorModel.js +5 -1
- package/dist/components/features/workflowManager/workflowManagerApi.d.ts +1 -1
- package/dist/components/features/workflowManager/workflowManagerApi.js +3 -0
- package/dist/components/task/TaskCard.d.ts +5 -0
- package/dist/components/task/TaskCard.js +65 -10
- package/dist/components/task/TaskImageReviews.js +14 -5
- package/dist/components/task/TaskKanban.d.ts +6 -1
- package/dist/components/task/TaskKanban.js +152 -6
- package/dist/components/task/TaskList.d.ts +5 -0
- package/dist/components/task/TaskList.js +3 -3
- package/dist/components/task/TaskWorkflowAssignmentField.js +68 -10
- package/dist/components/ui/PasswordInput.d.ts +6 -0
- package/dist/components/ui/PasswordInput.js +11 -0
- package/dist/components/ui/TopNoticeLayer.js +1 -1
- package/dist/components/views/AppShellHeader.js +32 -11
- package/dist/components/views/PlanComparisonPage.js +12 -0
- package/dist/components/views/StandaloneLayout.js +32 -55
- package/dist/components/views/WidgetView.js +3 -3
- package/dist/components/views/panels/PlanningDrawer.js +5 -12
- package/dist/components/views/standalone/modals/AccountSettingsModal.js +26 -17
- package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +4 -3
- package/dist/components/views/standalone/modals/SyncStatusModal.js +33 -38
- package/dist/config/envSchema.js +60 -1
- package/dist/config/localServiceRuntimeContract.d.ts +13 -0
- package/dist/config/localServiceRuntimeContract.js +135 -0
- package/dist/core/AiProfileService.js +46 -8
- package/dist/core/DeletedTaskLifecycleService.d.ts +1 -0
- package/dist/core/DeletedTaskLifecycleService.js +37 -6
- package/dist/core/McpTokenService.d.ts +23 -1
- package/dist/core/McpTokenService.js +93 -10
- package/dist/core/TaskAttachmentLinksDurableMutationService.d.ts +3 -2
- package/dist/core/TaskAttachmentLinksDurableMutationService.js +33 -9
- package/dist/core/TaskChecklistCommandService.d.ts +27 -0
- package/dist/core/TaskChecklistCommandService.js +83 -5
- package/dist/core/TaskLifecycleCommandService.d.ts +3 -1
- package/dist/core/TaskLifecycleCommandService.js +6 -2
- package/dist/core/Taskforce.d.ts +94 -2
- package/dist/core/Taskforce.js +760 -36
- package/dist/core/types.d.ts +14 -0
- package/dist/documentReviews/commandService.d.ts +2 -1
- package/dist/documentReviews/commandService.js +6 -3
- package/dist/hooks/sync/orchestratorShared.d.ts +1 -0
- package/dist/hooks/sync/orchestratorShared.js +2 -0
- package/dist/hooks/sync/useDurableLocalOutboxDrain.d.ts +1 -1
- package/dist/hooks/sync/useDurableTaskCreateMutation.js +1 -1
- package/dist/hooks/sync/useDurableTaskMetadataMutation.d.ts +1 -0
- package/dist/hooks/sync/useDurableTaskMetadataMutation.js +1 -0
- package/dist/hooks/sync/useDurableTaskStatusMutation.d.ts +1 -0
- package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +3 -0
- package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +85 -9
- package/dist/hooks/sync/useSyncStatusControls.d.ts +4 -1
- package/dist/hooks/sync/useSyncStatusControls.js +47 -11
- package/dist/hooks/tasks/taskHttpMutation.js +1 -0
- package/dist/hooks/tasks/useCloudTaskSearch.d.ts +12 -0
- package/dist/hooks/tasks/useCloudTaskSearch.js +71 -0
- package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.d.ts +16 -0
- package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.js +197 -0
- package/dist/hooks/tasks/useTaskEditorNavigation.d.ts +16 -3
- package/dist/hooks/tasks/useTaskEditorNavigation.js +72 -13
- package/dist/hooks/tasks/useTaskFormActions.d.ts +6 -0
- package/dist/hooks/tasks/useTaskFormActions.js +65 -12
- package/dist/hooks/ui/useSettingsModel.d.ts +24 -2
- package/dist/hooks/ui/useSettingsModel.js +13 -2
- package/dist/hooks/ui/useSettingsPersistence.d.ts +12 -1
- package/dist/hooks/ui/useSettingsPersistence.js +74 -47
- package/dist/hooks/useFilterSort.d.ts +7 -3
- package/dist/hooks/useFilterSort.js +15 -5
- package/dist/hooks/useSyncOrchestrator.d.ts +3 -0
- package/dist/hooks/useSyncOrchestrator.js +111 -2
- package/dist/hooks/useTaskData.d.ts +40 -1
- package/dist/hooks/useTaskData.js +240 -9
- package/dist/hooks/useTaskMutations.d.ts +12 -2
- package/dist/hooks/useTaskMutations.js +266 -52
- package/dist/hooks/useTaskforce.d.ts +39 -9
- package/dist/hooks/useTaskforce.js +359 -40
- package/dist/hooks/useUiNotice.d.ts +4 -0
- package/dist/hooks/useUiNotice.js +4 -0
- package/dist/mcp/adminWorkspaceRegistrar.js +3 -3
- package/dist/mcp/clientRegistry.d.ts +2 -2
- package/dist/mcp/clientRegistry.js +1 -1
- package/dist/mcp/documentAssetRegistrar.js +53 -41
- package/dist/mcp/documentHelpers.d.ts +1 -0
- package/dist/mcp/documentHelpers.js +7 -3
- package/dist/mcp/durableTaskMutationRouter.d.ts +4 -1
- package/dist/mcp/durableTaskMutationRouter.js +10 -0
- package/dist/mcp/durableTaskRelationshipMutationRouter.js +4 -0
- package/dist/mcp/httpProtocolRouting.d.ts +10 -0
- package/dist/mcp/httpProtocolRouting.js +19 -0
- package/dist/mcp/localCliHealth.d.ts +2 -2
- package/dist/mcp/localCliHealth.js +2 -2
- package/dist/mcp/localServiceProxy.d.ts +1 -0
- package/dist/mcp/localServiceProxy.js +530 -68
- package/dist/mcp/planningAttachmentCommandAdapter.d.ts +3 -1
- package/dist/mcp/planningAttachmentCommandAdapter.js +20 -2
- package/dist/mcp/runtime.d.ts +54 -79
- package/dist/mcp/runtime.js +556 -139
- package/dist/mcp/taskPlanningRegistrar.js +64 -42
- package/dist/mcp/toolCallCompatibility.js +38 -1
- package/dist/mcp/toolCatalog.d.ts +1 -0
- package/dist/mcp/toolProfiles.d.ts +2 -0
- package/dist/mcp/toolProfiles.js +10 -0
- package/dist/mcp/toolRegistry.d.ts +1 -0
- package/dist/mcp/toolRegistry.js +1 -0
- package/dist/mcp/workflowExecutionRegistrar.js +4 -4
- package/dist/migrations/taskSchemaMigrations.d.ts +5 -0
- package/dist/migrations/taskSchemaMigrations.js +427 -0
- package/dist/runtime/appGateDefinitions.d.ts +30 -6
- package/dist/runtime/appGateDefinitions.js +6 -6
- package/dist/runtime/appGates.d.ts +13 -13
- package/dist/runtime/appGates.js +36 -13
- package/dist/runtime/nodeAppGates.d.ts +8 -0
- package/dist/runtime/nodeAppGates.js +27 -0
- package/dist/server/cloudCollectionRead.d.ts +1 -1
- package/dist/server/cloudCollectionRead.js +2 -2
- package/dist/server/index.d.ts +6 -0
- package/dist/server/index.js +123 -14
- package/dist/server/localDatabaseIdentity.js +4 -1
- package/dist/server/localServiceLease.d.ts +3 -0
- package/dist/server/localServiceLease.js +11 -2
- package/dist/server/localServiceSessions.d.ts +14 -17
- package/dist/server/localServiceSessions.js +308 -94
- package/dist/server/localWorkspaceSyncServerRuntime.js +12 -7
- package/dist/server/rateLimit.d.ts +1 -0
- package/dist/server/rateLimit.js +4 -0
- package/dist/server/realtimeSyncWs.js +36 -12
- package/dist/server/routes/admin.d.ts +4 -0
- package/dist/server/routes/admin.js +113 -3
- package/dist/server/routes/agentRoles.js +3 -2
- package/dist/server/routes/agentSkills.js +3 -2
- package/dist/server/routes/agents.d.ts +7 -0
- package/dist/server/routes/agents.js +394 -39
- package/dist/server/routes/annotatedAttachments.js +3 -2
- package/dist/server/routes/auth.js +3 -1
- package/dist/server/routes/billing.js +5 -1
- package/dist/server/routes/durableTaskHttpRouters.d.ts +11 -2
- package/dist/server/routes/executorPhaseAApprovals.d.ts +19 -0
- package/dist/server/routes/executorPhaseAApprovals.js +140 -0
- package/dist/server/routes/executorPhaseAIssuerRedemptions.d.ts +11 -0
- package/dist/server/routes/executorPhaseAIssuerRedemptions.js +24 -0
- package/dist/server/routes/githubReviewEvidence.d.ts +19 -0
- package/dist/server/routes/githubReviewEvidence.js +116 -0
- package/dist/server/routes/localService.d.ts +15 -4
- package/dist/server/routes/localService.js +138 -40
- package/dist/server/routes/modelConnections.d.ts +24 -0
- package/dist/server/routes/modelConnections.js +205 -0
- package/dist/server/routes/primitives.d.ts +2 -0
- package/dist/server/routes/shared.d.ts +19 -0
- package/dist/server/routes/shared.js +95 -19
- package/dist/server/routes/sync.js +1 -0
- package/dist/server/routes/syncAuxRoutes.js +9 -2
- package/dist/server/routes/syncPullApplyRoutes.js +23 -4
- package/dist/server/routes/syncPushRoutes.d.ts +1 -0
- package/dist/server/routes/syncPushRoutes.js +1 -0
- package/dist/server/routes/syncV3FeedRoutes.js +27 -16
- package/dist/server/routes/syncV3LocalCaptureRoutes.js +28 -2
- package/dist/server/routes/syncV3LocalFeedApplyRoutes.d.ts +1 -0
- package/dist/server/routes/syncV3LocalFeedApplyRoutes.js +26 -0
- package/dist/server/routes/syncV3OperationRoutes.js +45 -9
- package/dist/server/routes/tasks.js +124 -13
- package/dist/server/routes/workflows.js +9 -1
- package/dist/server/routes/workspaces.js +43 -1
- package/dist/server/routes.js +59 -0
- package/dist/server/workspaceDeletionAdmission.d.ts +23 -0
- package/dist/server/workspaceDeletionAdmission.js +50 -0
- package/dist/service/localServiceCli.js +16 -0
- package/dist/service/localServiceClientLifecycle.js +36 -10
- package/dist/services/codexAppServerModelGateway.d.ts +161 -0
- package/dist/services/codexAppServerModelGateway.js +663 -0
- package/dist/services/codexDeviceCodeLoginManager.d.ts +39 -0
- package/dist/services/codexDeviceCodeLoginManager.js +265 -0
- package/dist/services/codexModelProviderConnectionLifecycle.d.ts +8 -0
- package/dist/services/codexModelProviderConnectionLifecycle.js +73 -0
- package/dist/services/executorPhaseAApprovalRuntime.d.ts +14 -0
- package/dist/services/executorPhaseAApprovalRuntime.js +24 -0
- package/dist/services/executorPhaseAApprovalService.d.ts +40 -0
- package/dist/services/executorPhaseAApprovalService.js +609 -0
- package/dist/services/executorPhaseADriftEvaluator.d.ts +78 -0
- package/dist/services/executorPhaseADriftEvaluator.js +93 -0
- package/dist/services/executorPhaseAIssuerCore.d.ts +126 -0
- package/dist/services/executorPhaseAIssuerCore.js +295 -0
- package/dist/services/executorPhaseAIssuerRedemptionService.d.ts +34 -0
- package/dist/services/executorPhaseAIssuerRedemptionService.js +158 -0
- package/dist/services/githubReviewEvidenceRuntime.d.ts +14 -0
- package/dist/services/githubReviewEvidenceRuntime.js +30 -0
- package/dist/services/githubReviewEvidenceService.d.ts +93 -0
- package/dist/services/githubReviewEvidenceService.js +336 -0
- package/dist/services/modelGateway.d.ts +7 -0
- package/dist/services/modelProviderConnectionService.d.ts +71 -0
- package/dist/services/modelProviderConnectionService.js +279 -0
- package/dist/services/modelProviderCredentialHome.d.ts +32 -0
- package/dist/services/modelProviderCredentialHome.js +271 -0
- package/dist/services/ownerScopedModelConnectionGateway.d.ts +12 -0
- package/dist/services/ownerScopedModelConnectionGateway.js +30 -0
- package/dist/services/taskforceAgentConnectionBindingService.d.ts +66 -0
- package/dist/services/taskforceAgentConnectionBindingService.js +185 -0
- package/dist/services/taskforceAgentMcpBridge.d.ts +8 -2
- package/dist/services/taskforceAgentMcpBridge.js +30 -27
- package/dist/shared/adminEdgeProxy.d.ts +5 -0
- package/dist/shared/adminEdgeProxy.js +94 -0
- package/dist/shared/adminProxySessionCookies.d.ts +16 -0
- package/dist/shared/adminProxySessionCookies.js +86 -0
- package/dist/shared/aiProfileColors.d.ts +31 -1
- package/dist/shared/aiProfileColors.js +14 -6
- package/dist/shared/executorPhaseAApprovalGoldenVector.json +269 -0
- package/dist/shared/executorPhaseAApprovalReceipt.d.ts +112 -0
- package/dist/shared/executorPhaseAApprovalReceipt.js +58 -0
- package/dist/shared/executorPhaseAApprovalTrustPolicy.json +10 -0
- package/dist/shared/executorPhaseADriftContracts.d.ts +37 -0
- package/dist/shared/executorPhaseADriftContracts.js +63 -0
- package/dist/shared/executorPhaseAIssuerContracts.d.ts +75 -0
- package/dist/shared/executorPhaseAIssuerContracts.js +90 -0
- package/dist/shared/executorPhaseARunAuthorization.d.ts +120 -0
- package/dist/shared/executorPhaseARunAuthorization.js +232 -0
- package/dist/shared/executorPhaseASchemaValidation.d.ts +7 -0
- package/dist/shared/executorPhaseASchemaValidation.js +53 -0
- package/dist/shared/executorPhaseASchemas/approval-receipt.schema.json +106 -0
- package/dist/shared/executorPhaseASchemas/drift-attestation.schema.json +54 -0
- package/dist/shared/executorPhaseASchemas/drift-request.schema.json +47 -0
- package/dist/shared/executorPhaseASchemas/foundation-manifest.schema.json +29 -0
- package/dist/shared/executorPhaseASchemas/issuer-audit-record.schema.json +24 -0
- package/dist/shared/executorPhaseASchemas/issuer-proof.schema.json +43 -0
- package/dist/shared/executorPhaseASchemas/issuer-redemption-request.schema.json +18 -0
- package/dist/shared/executorPhaseASchemas/issuer-redemption-response.schema.json +39 -0
- package/dist/shared/executorPhaseASchemas/logical-envelope.schema.json +149 -0
- package/dist/shared/executorPhaseASchemas/preflight-report.schema.json +216 -0
- package/dist/shared/executorPhaseASchemas/run-capability.schema.json +111 -0
- package/dist/shared/executorPhaseASchemas/sender-proof.schema.json +37 -0
- package/dist/shared/executorPhaseASchemas/workload-grant.schema.json +68 -0
- package/dist/shared/executorPhaseASchemas/workload-jwt-claims.schema.json +67 -0
- package/dist/shared/executorPhaseATiming.d.ts +1 -0
- package/dist/shared/executorPhaseATiming.js +1 -0
- package/dist/shared/planningIdentity.js +1 -1
- package/dist/shared/productLogoKeys.d.ts +2 -0
- package/dist/shared/productLogoKeys.js +18 -0
- package/dist/shared/taskforceAgentDefinition.d.ts +0 -1
- package/dist/shared/taskforceAgentDefinition.js +6 -3
- package/dist/shared/taskforceAgentModels.d.ts +1 -0
- package/dist/shared/taskforceAgentModels.js +36 -3
- package/dist/shared/userFeatureGrants.d.ts +4 -0
- package/dist/shared/userFeatureGrants.js +7 -0
- package/dist/storage/executorPhaseAApprovalReceiptStore.d.ts +37 -0
- package/dist/storage/executorPhaseAApprovalReceiptStore.js +81 -0
- package/dist/storage/executorPhaseARunAuthorizationStore.d.ts +103 -0
- package/dist/storage/executorPhaseARunAuthorizationStore.js +492 -0
- package/dist/storage/githubReviewEvidenceInstallationStore.d.ts +26 -0
- package/dist/storage/githubReviewEvidenceInstallationStore.js +89 -0
- package/dist/storage/modelProviderConnectionStore.d.ts +99 -0
- package/dist/storage/modelProviderConnectionStore.js +446 -0
- package/dist/storage/postgresAdapter.d.ts +24 -3
- package/dist/storage/postgresAdapter.js +117 -14
- package/dist/storage/postgresWorker.js +22 -5
- package/dist/storage/postgresWorkerProtocol.d.ts +30 -0
- package/dist/storage/postgresWorkerProtocol.js +30 -0
- package/dist/storage/taskforceAgentConnectionBindingStore.d.ts +31 -0
- package/dist/storage/taskforceAgentConnectionBindingStore.js +84 -0
- package/dist/sync/cloudSyncApi.d.ts +4 -1
- package/dist/sync/cloudSyncApi.js +7 -2
- package/dist/sync/contentSyncState.d.ts +1 -1
- package/dist/sync/coordinator/localSyncExecutionPermitStore.d.ts +1 -0
- package/dist/sync/coordinator/localSyncExecutionPermitStore.js +67 -30
- package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.d.ts +10 -0
- package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.js +29 -0
- package/dist/sync/coordinator/localWorkspaceSyncRunner.js +6 -2
- package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +15 -1
- package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +99 -2
- package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +1 -0
- package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +33 -4
- package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +2 -1
- package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +38 -0
- package/dist/sync/engine/workspaceSyncContentVersionStore.js +50 -1
- package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.js +20 -2
- package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +6 -6
- package/dist/sync/engine/workspaceSyncEngineLocalServices.d.ts +4 -0
- package/dist/sync/engine/workspaceSyncEngineLocalServices.js +11 -0
- package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +14 -0
- package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +84 -0
- package/dist/sync/engine/workspaceSyncEngineRecovery.js +1 -0
- package/dist/sync/engine/workspaceSyncEngineRemoteServices.d.ts +11 -0
- package/dist/sync/engine/workspaceSyncEngineRemoteServices.js +2 -1
- package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +1 -0
- package/dist/sync/engine/workspaceSyncEngineRuntime.js +1 -0
- package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.js +31 -4
- package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.d.ts +3 -1
- package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +134 -43
- package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +6 -0
- package/dist/sync/engine/workspaceSyncEngineTransfers.d.ts +1 -1
- package/dist/sync/engine/workspaceSyncEngineTransfers.js +11 -4
- package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +1 -0
- package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +29 -0
- package/dist/sync/syncApplyHandlers.d.ts +2 -0
- package/dist/sync/syncApplyHandlers.js +10 -1
- package/dist/sync/syncService.d.ts +17 -0
- package/dist/sync/syncService.js +87 -19
- package/dist/sync/taskforceAgentSyncAuthorization.d.ts +16 -0
- package/dist/sync/taskforceAgentSyncAuthorization.js +20 -0
- package/dist/sync/v3/combinedFeedCapability.js +8 -0
- package/dist/sync/v3/durableInitiativeMutationRouter.js +18 -10
- package/dist/sync/v3/durableOperationReplay.d.ts +14 -0
- package/dist/sync/v3/durableOperationReplay.js +18 -0
- package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.d.ts +2 -0
- package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +14 -1
- package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +4 -1
- package/dist/sync/v3/durableTaskChecklistMutationRouter.js +62 -15
- package/dist/sync/v3/durableTaskCommentMutationRouter.js +3 -0
- package/dist/sync/v3/durableTaskHttpBulkMutationRouter.d.ts +1 -0
- package/dist/sync/v3/durableTaskHttpBulkMutationRouter.js +30 -8
- package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +5 -3
- package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +37 -2
- package/dist/sync/v3/durableTaxonomyMutationRouter.js +5 -0
- package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +11 -0
- package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +39 -10
- package/dist/sync/v3/durableWorkstreamMutationRouter.js +18 -10
- package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +16 -5
- package/dist/sync/v3/localOutboxDispatchRuntime.js +2 -2
- package/dist/sync/v3/localTaskAttachmentLinksOutboxService.d.ts +2 -0
- package/dist/sync/v3/localTaskAttachmentLinksOutboxService.js +47 -7
- package/dist/sync/v3/localTaskChecklistOutboxHandler.js +16 -2
- package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +4 -0
- package/dist/sync/v3/localTaskChecklistOutboxService.js +14 -1
- package/dist/sync/v3/localTaskCreateOutboxService.js +15 -6
- package/dist/sync/v3/localTaskMetadataClient.d.ts +1 -0
- package/dist/sync/v3/localTaskMetadataClient.js +1 -0
- package/dist/sync/v3/localTaskMetadataOutboxHandler.js +5 -1
- package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +2 -0
- package/dist/sync/v3/localTaskMetadataOutboxService.js +7 -0
- package/dist/sync/v3/localTaskRestoreOutboxService.js +14 -6
- package/dist/sync/v3/localTaskStatusClient.d.ts +1 -0
- package/dist/sync/v3/localTaskStatusClient.js +6 -1
- package/dist/sync/v3/localTaskStatusOutboxService.d.ts +10 -0
- package/dist/sync/v3/localTaskStatusOutboxService.js +272 -24
- package/dist/sync/v3/syncDurabilityStore.d.ts +41 -0
- package/dist/sync/v3/syncDurabilityStore.js +199 -13
- package/dist/sync/v3/taskAttachmentLinksMutationService.d.ts +6 -4
- package/dist/sync/v3/taskAttachmentLinksMutationService.js +19 -10
- package/dist/sync/v3/taskChecklistMutationService.d.ts +15 -2
- package/dist/sync/v3/taskChecklistMutationService.js +48 -1
- package/dist/sync/v3/taskCreateMutationService.d.ts +2 -2
- package/dist/sync/v3/taskCreateMutationService.js +7 -4
- package/dist/sync/v3/taskMetadataMutationService.d.ts +3 -0
- package/dist/sync/v3/taskMetadataMutationService.js +4 -0
- package/dist/sync/v3/taskRestoreMutationService.d.ts +2 -2
- package/dist/sync/v3/taskRestoreMutationService.js +7 -4
- package/dist/sync/v3/taskStatusMutationService.d.ts +31 -1
- package/dist/sync/v3/taskStatusMutationService.js +123 -3
- package/dist/sync/v3/workflowAssignmentSync.d.ts +6 -0
- package/dist/sync/v3/workflowAssignmentSync.js +30 -0
- package/dist/sync/v3/workspaceSyncJournalReader.js +1 -1
- package/dist/sync/v3/workspaceSyncOperationRetentionService.d.ts +16 -0
- package/dist/sync/v3/workspaceSyncOperationRetentionService.js +83 -0
- package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.d.ts +1 -1
- package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.js +13 -3
- package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.d.ts +11 -0
- package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.js +27 -10
- package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.d.ts +2 -1
- package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.js +52 -10
- package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +18 -3
- package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.js +8 -3
- package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +51 -10
- package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +14 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +49 -25
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +13 -4
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +124 -57
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +20 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +106 -30
- package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +4 -1
- package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +34 -0
- package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +12 -0
- package/dist/sync/v3/workspaceSyncV3FeedProfile.d.ts +1 -1
- package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.js +23 -10
- package/dist/sync/v3/workspaceSyncV3NestedTaskApply.d.ts +3 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskApply.js +64 -13
- package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.d.ts +9 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.js +26 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +15 -5
- package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +50 -14
- package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.d.ts +2 -1
- package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.js +11 -3
- package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +5 -0
- package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +55 -9
- package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.d.ts +17 -0
- package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.js +64 -0
- package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.js +9 -2
- package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.js +37 -0
- package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.d.ts +6 -0
- package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.js +9 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.js +33 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.js +8 -0
- package/dist/sync/workspacePullFeed.js +2 -1
- package/dist/sync/workspaceRepair.d.ts +8 -2
- package/dist/sync/workspaceRepair.js +222 -6
- package/dist/sync/workspaceSyncModel.d.ts +21 -0
- package/dist/sync/workspaceSyncModel.js +35 -7
- package/dist/sync/workspaceSyncState.d.ts +1 -0
- package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +6 -0
- package/dist/sync/workspaceSyncV2SnapshotBuilder.js +5 -0
- package/dist/types.d.ts +47 -1
- package/dist/types.js +6 -0
- package/dist/ui/assets/AiIdentityRosterCard-OcSz1PkK.js +1 -0
- package/dist/ui/assets/AiProfilesModule-ByhYW5Xi.js +1 -0
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-BTM6nIg_.js +3 -0
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-TzYu7pkG.css +1 -0
- package/dist/ui/assets/{AssetTraySortControl-Kf1pelSy.js → AssetTraySortControl-DabEG8L4.js} +1 -1
- package/dist/ui/assets/{ContextAttachmentManager-B8boOs6Q.js → ContextAttachmentManager-Coa8yVGM.js} +2 -2
- package/dist/ui/assets/{DocumentWorkspace-DXH4XUsB.js → DocumentWorkspace-BB0qhdix.js} +1 -1
- package/dist/ui/assets/{EntityActivityTimeline-BtSTq0ON.js → EntityActivityTimeline-CZ8x4UJE.js} +1 -1
- package/dist/ui/assets/PlanningModule-pRPjR7v5.js +1 -0
- package/dist/ui/assets/PlansPage-D86pZSSl.js +1 -0
- package/dist/ui/assets/TaskContextUpload-BVIkU9yT.js +1 -0
- package/dist/ui/assets/TaskSettings-Cv1mNhv_.js +12 -0
- package/dist/ui/assets/TaskforceAgentsModule-b-8R25cJ.css +1 -0
- package/dist/ui/assets/TaskforceAgentsModule-gmH-PD2q.js +24 -0
- package/dist/ui/assets/{WorkflowManagerModule-DWFspC-o.js → WorkflowManagerModule-DbfnHJ-f.js} +1 -1
- package/dist/ui/assets/index-BZ-hdZSk.css +1 -0
- package/dist/ui/assets/index-CTsDBaef.js +7 -0
- package/dist/ui/assets/{vendor-icons-BkFLXavV.js → vendor-icons-Bsq-mcEn.js} +1 -1
- package/dist/ui/branding/logos/letterhead_dark.png +0 -0
- package/dist/ui/branding/logos/letterhead_light.png +0 -0
- package/dist/ui/branding/logos/signature_dark.png +0 -0
- package/dist/ui/branding/logos/signature_light.png +0 -0
- package/dist/ui/index.html +3 -3
- package/dist/utils/aiProfileDefaultLogo.js +16 -48
- package/dist/utils/httpSetCookie.d.ts +1 -0
- package/dist/utils/httpSetCookie.js +4 -1
- package/dist/utils/localRuntimeUrl.d.ts +1 -0
- package/dist/utils/localRuntimeUrl.js +14 -0
- package/dist/utils/productLogoRegistry.d.ts +2 -0
- package/dist/utils/productLogoRegistry.js +36 -0
- package/dist/utils/syncStatusPresentation.d.ts +4 -0
- package/dist/utils/syncStatusPresentation.js +17 -0
- package/dist/utils/taskActivity.d.ts +3 -2
- package/dist/utils/taskActivity.js +19 -2
- package/dist/utils/taskEditorReconciliation.d.ts +40 -0
- package/dist/utils/taskEditorReconciliation.js +217 -0
- package/dist/utils/taskEvents.d.ts +2 -0
- package/dist/utils/taskNormalization.d.ts +1 -0
- package/dist/utils/taskNormalization.js +39 -0
- package/dist/utils/taskSearch.js +2 -2
- package/dist/utils/uiNotice.d.ts +4 -0
- package/dist/utils/workspaceSyncPresentation.d.ts +1 -1
- package/dist/utils/workspaceSyncPresentation.js +23 -17
- package/package.json +36 -6
- package/dist/ui/assets/AiIdentityRosterCard-MZs7lVED.js +0 -1
- package/dist/ui/assets/AiProfilesModule-C3i0LOxe.js +0 -1
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-CBRZ8rca.css +0 -1
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-DVZk5Tln.js +0 -3
- package/dist/ui/assets/PlanningModule-BPVyEa-f.js +0 -1
- package/dist/ui/assets/PlansPage-ChqgxALc.js +0 -1
- package/dist/ui/assets/TaskContextUpload-CB3ol0sN.js +0 -1
- package/dist/ui/assets/TaskSettings-g4ECKNOz.js +0 -12
- package/dist/ui/assets/TaskforceAgentsModule-BazdUwxZ.js +0 -21
- package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +0 -1
- package/dist/ui/assets/index-BUplSsv_.js +0 -7
- package/dist/ui/assets/index-gz2EXuoK.css +0 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { canonicalWorkspaceSyncJson } from '../v3/canonicalWorkspaceSyncJson.js';
|
|
1
2
|
export const WORKSPACE_SYNC_ENGINE_V2_PUSH_BOUNDARY_VERSION = 1;
|
|
2
3
|
export function createWorkspaceSyncEngineV2PushBoundary(batchOperationIdentities) {
|
|
3
4
|
if (!Array.isArray(batchOperationIdentities)
|
|
@@ -85,3 +86,86 @@ export function parseWorkspaceSyncEngineAppliedTaskUpserts(value, expectedTaskId
|
|
|
85
86
|
}
|
|
86
87
|
return normalized;
|
|
87
88
|
}
|
|
89
|
+
function taskSettlementProjection(task, preserveReferenceNumber) {
|
|
90
|
+
const { updatedAt: _updatedAt, ...stableTask } = structuredClone(task);
|
|
91
|
+
if (!preserveReferenceNumber)
|
|
92
|
+
delete stableTask.referenceNumber;
|
|
93
|
+
return stableTask;
|
|
94
|
+
}
|
|
95
|
+
function taskSettlementOwnedProjection(input) {
|
|
96
|
+
// The cloud echo is authoritative for the complete task row, but this V2
|
|
97
|
+
// page may own only carrier fields. Validate exactly that remaining V2
|
|
98
|
+
// surface; V3-owned fields are checked by their own acknowledgement/feed.
|
|
99
|
+
const task = taskSettlementProjection(input.task, input.preserveReferenceNumber);
|
|
100
|
+
const rootOwnedByV3 = input.excludedProjections.has('task/root-v1');
|
|
101
|
+
const commentsOwnedByV3 = input.excludedProjections.has('task-comments/full-v1');
|
|
102
|
+
const checklistOwnedByV3 = input.excludedProjections.has('task-checklist/full-v1');
|
|
103
|
+
const attachmentLinksV1OwnedByV3 = input.excludedProjections
|
|
104
|
+
.has('task-attachment-links/full-v1');
|
|
105
|
+
const attachmentLinksV2OwnedByV3 = input.excludedProjections
|
|
106
|
+
.has('task-attachment-links/full-v2');
|
|
107
|
+
if (rootOwnedByV3) {
|
|
108
|
+
for (const key of Object.keys(task)) {
|
|
109
|
+
if (![
|
|
110
|
+
'id',
|
|
111
|
+
'comments',
|
|
112
|
+
'checklistItems',
|
|
113
|
+
'attachments',
|
|
114
|
+
'cardCoverAssetId',
|
|
115
|
+
].includes(key)) {
|
|
116
|
+
delete task[key];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (commentsOwnedByV3)
|
|
121
|
+
delete task.comments;
|
|
122
|
+
if (checklistOwnedByV3)
|
|
123
|
+
delete task.checklistItems;
|
|
124
|
+
if (attachmentLinksV1OwnedByV3 || attachmentLinksV2OwnedByV3) {
|
|
125
|
+
delete task.attachments;
|
|
126
|
+
}
|
|
127
|
+
if (attachmentLinksV2OwnedByV3)
|
|
128
|
+
delete task.cardCoverAssetId;
|
|
129
|
+
return {
|
|
130
|
+
...(rootOwnedByV3 ? {} : { archived: input.archived }),
|
|
131
|
+
task,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
export function createWorkspaceSyncEngineV2SettlementIdentityProjection(input) {
|
|
135
|
+
const operationIdentity = String(input.operationIdentity || '').trim();
|
|
136
|
+
if (!operationIdentity || operationIdentity !== input.operationIdentity) {
|
|
137
|
+
throw new TypeError('The V2 push settlement operation identity is invalid.');
|
|
138
|
+
}
|
|
139
|
+
const expectedTaskUpserts = input.changes.filter((change) => change.op === 'upsert');
|
|
140
|
+
if (expectedTaskUpserts.length !== input.appliedTaskUpserts.length) {
|
|
141
|
+
throw new TypeError('The V2 push authoritative settlement projection is incomplete.');
|
|
142
|
+
}
|
|
143
|
+
const expectedProjection = expectedTaskUpserts.map((change) => ({
|
|
144
|
+
archived: change.archived,
|
|
145
|
+
task: taskSettlementProjection(change.task, change.task.referenceNumber !== undefined && change.task.referenceNumber !== null),
|
|
146
|
+
}));
|
|
147
|
+
const excludedProjections = new Set(input.excludedProjections || []);
|
|
148
|
+
const expectedOwnedProjection = expectedTaskUpserts.map((change) => (taskSettlementOwnedProjection({
|
|
149
|
+
archived: change.archived,
|
|
150
|
+
task: change.task,
|
|
151
|
+
preserveReferenceNumber: change.task.referenceNumber !== undefined
|
|
152
|
+
&& change.task.referenceNumber !== null,
|
|
153
|
+
excludedProjections,
|
|
154
|
+
})));
|
|
155
|
+
const authoritativeOwnedProjection = input.appliedTaskUpserts.map((entry, index) => (taskSettlementOwnedProjection({
|
|
156
|
+
archived: entry.archived,
|
|
157
|
+
task: entry.task,
|
|
158
|
+
preserveReferenceNumber: expectedTaskUpserts[index]?.task.referenceNumber !== undefined
|
|
159
|
+
&& expectedTaskUpserts[index]?.task.referenceNumber !== null,
|
|
160
|
+
excludedProjections,
|
|
161
|
+
})));
|
|
162
|
+
if (canonicalWorkspaceSyncJson(authoritativeOwnedProjection)
|
|
163
|
+
!== canonicalWorkspaceSyncJson(expectedOwnedProjection)) {
|
|
164
|
+
throw new TypeError('The V2 push authoritative settlement does not match the canonical request state.');
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
version: 1,
|
|
168
|
+
operationIdentity,
|
|
169
|
+
taskUpserts: expectedProjection,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
@@ -10,6 +10,7 @@ function resetWorkspaceSyncStatePushBaselines(runtime) {
|
|
|
10
10
|
runtime.lastPushedInitiativeWatermarks.current = new Map();
|
|
11
11
|
runtime.lastPushedWorkstreamIds.current = new Set();
|
|
12
12
|
runtime.lastPushedWorkstreamWatermarks.current = new Map();
|
|
13
|
+
runtime.lastPushedPlanningIdentityWatermarks.current = new Map();
|
|
13
14
|
runtime.lastPushedAiProfileIds.current = new Set();
|
|
14
15
|
runtime.lastPushedAiProfileWatermarks.current = new Map();
|
|
15
16
|
runtime.lastPushedAiProfileChangeKeys.current = new Map();
|
|
@@ -37,6 +37,12 @@ export type WorkspaceSyncEngineContentPullInput = Parameters<typeof pullWorkspac
|
|
|
37
37
|
* commit against one exact prior boundary.
|
|
38
38
|
*/
|
|
39
39
|
previousCursor: string | null;
|
|
40
|
+
/**
|
|
41
|
+
* Separates an independent content lookup from a V2 feed page. The
|
|
42
|
+
* identity becomes an apply boundary that settles the transfer
|
|
43
|
+
* without advancing or validating the runner's V2 cursor.
|
|
44
|
+
*/
|
|
45
|
+
independentCompletionIdentity?: string;
|
|
40
46
|
};
|
|
41
47
|
type RemoteResult<Result> = Awaited<Result> & {
|
|
42
48
|
transferReceipt?: WorkspaceSyncEngineRemoteTransferReceipt;
|
|
@@ -94,6 +100,11 @@ export interface WorkspaceSyncEngineRemoteServices {
|
|
|
94
100
|
nextCursor: string | null;
|
|
95
101
|
receipts: readonly WorkspaceSyncEngineRemoteTransferReceipt[];
|
|
96
102
|
}): WorkspaceSyncEngineTransferCompletionGroup | undefined;
|
|
103
|
+
buildIndependentContentApplyCompletionGroup(input: {
|
|
104
|
+
workspaceId: string;
|
|
105
|
+
identity: string;
|
|
106
|
+
receipts: readonly WorkspaceSyncEngineRemoteTransferReceipt[];
|
|
107
|
+
}): WorkspaceSyncEngineTransferCompletionGroup | undefined;
|
|
97
108
|
buildV2PushApplyCompletionGroup(input: {
|
|
98
109
|
workspaceId: string;
|
|
99
110
|
pushBoundary: WorkspaceSyncEngineV2PushBoundary;
|
|
@@ -6,7 +6,7 @@ export function createBrowserWorkspaceSyncEngineRemoteServices(resolveCloudAuthU
|
|
|
6
6
|
provisionWorkspace: (input) => provisionWorkspace(resolveCloudAuthUrl, input),
|
|
7
7
|
pushWorkspaceChanges: ({ ownership: _ownership, pushBoundary: _pushBoundary, ...input }) => (pushWorkspaceChanges(resolveCloudAuthUrl, input)),
|
|
8
8
|
pullWorkspaceChanges: (input) => pullWorkspaceChanges(resolveCloudAuthUrl, input),
|
|
9
|
-
pullWorkspaceContent: ({ previousCursor: _previousCursor, ...input }) => (pullWorkspaceContent(resolveCloudAuthUrl, input)),
|
|
9
|
+
pullWorkspaceContent: ({ previousCursor: _previousCursor, independentCompletionIdentity: _independentCompletionIdentity, ...input }) => (pullWorkspaceContent(resolveCloudAuthUrl, input)),
|
|
10
10
|
pullInitiativeFeed: (input) => pullWorkspaceSyncV3Feed(resolveCloudAuthUrl, input),
|
|
11
11
|
pullInitiativeRepair: (input) => pullWorkspaceInitiativeRepair(resolveCloudAuthUrl, input),
|
|
12
12
|
pullCombinedFeed: (input) => pullWorkspaceSyncV3CombinedFeed(resolveCloudAuthUrl, input),
|
|
@@ -15,6 +15,7 @@ export function createBrowserWorkspaceSyncEngineRemoteServices(resolveCloudAuthU
|
|
|
15
15
|
abandonTransferReceipts: () => undefined,
|
|
16
16
|
acknowledgeNonApplyingTransferReceipts: () => undefined,
|
|
17
17
|
buildV2ApplyCompletionGroup: () => undefined,
|
|
18
|
+
buildIndependentContentApplyCompletionGroup: () => undefined,
|
|
18
19
|
buildV2PushApplyCompletionGroup: () => undefined,
|
|
19
20
|
buildV3ApplyCompletionGroup: () => undefined,
|
|
20
21
|
};
|
|
@@ -26,6 +26,7 @@ export interface WorkspaceSyncEngineRuntime {
|
|
|
26
26
|
lastPushedInitiativeWatermarks: WorkspaceSyncMutableValue<Map<string, string>>;
|
|
27
27
|
lastPushedWorkstreamIds: WorkspaceSyncMutableValue<Set<string>>;
|
|
28
28
|
lastPushedWorkstreamWatermarks: WorkspaceSyncMutableValue<Map<string, string>>;
|
|
29
|
+
lastPushedPlanningIdentityWatermarks: WorkspaceSyncMutableValue<Map<string, string>>;
|
|
29
30
|
lastPushedAiProfileIds: WorkspaceSyncMutableValue<Set<string>>;
|
|
30
31
|
lastPushedAiProfileWatermarks: WorkspaceSyncMutableValue<Map<string, string>>;
|
|
31
32
|
lastPushedAiProfileChangeKeys: WorkspaceSyncMutableValue<Map<string, string>>;
|
|
@@ -24,6 +24,7 @@ export function createWorkspaceSyncEngineRuntime() {
|
|
|
24
24
|
lastPushedInitiativeWatermarks: mutable(new Map()),
|
|
25
25
|
lastPushedWorkstreamIds: mutable(new Set()),
|
|
26
26
|
lastPushedWorkstreamWatermarks: mutable(new Map()),
|
|
27
|
+
lastPushedPlanningIdentityWatermarks: mutable(new Map()),
|
|
27
28
|
lastPushedAiProfileIds: mutable(new Set()),
|
|
28
29
|
lastPushedAiProfileWatermarks: mutable(new Map()),
|
|
29
30
|
lastPushedAiProfileChangeKeys: mutable(new Map()),
|
|
@@ -40,6 +40,18 @@ function v3Boundary(input) {
|
|
|
40
40
|
...(input.coverage ? { coverage: { ...input.coverage } } : {}),
|
|
41
41
|
};
|
|
42
42
|
}
|
|
43
|
+
function independentContentBoundary(identity) {
|
|
44
|
+
const normalizedIdentity = String(identity || '').trim();
|
|
45
|
+
if (!normalizedIdentity) {
|
|
46
|
+
throw new TypeError('Independent content transfer identity is required.');
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
version: 1,
|
|
50
|
+
projection: 'independent-content',
|
|
51
|
+
cursor: null,
|
|
52
|
+
identity: normalizedIdentity,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
43
55
|
function decodeGatewayResult(result, nowMs) {
|
|
44
56
|
const rawText = new TextDecoder().decode(result.body);
|
|
45
57
|
let data = {};
|
|
@@ -96,12 +108,15 @@ export function createServerWorkspaceSyncEngineRemoteServices(options) {
|
|
|
96
108
|
throw new TypeError('The server sync operation workspace does not match its runner.');
|
|
97
109
|
}
|
|
98
110
|
};
|
|
99
|
-
const abandon = (permitId, errorCode) => (options.permitStore.abandonPermit({
|
|
111
|
+
const abandon = (permitId, errorCode, readResponseUnavailableBeforeApply = false) => (options.permitStore.abandonPermit({
|
|
100
112
|
permitId,
|
|
101
113
|
workspaceId: options.workspaceId,
|
|
102
114
|
coordinatorGeneration: options.coordinatorGeneration,
|
|
103
115
|
serverInstanceId: options.serverInstanceId,
|
|
104
116
|
errorCode,
|
|
117
|
+
...(readResponseUnavailableBeforeApply
|
|
118
|
+
? { readResponseUnavailableBeforeApply: true }
|
|
119
|
+
: {}),
|
|
105
120
|
}));
|
|
106
121
|
const execute = async (input) => {
|
|
107
122
|
assertWorkspace(input.operation.workspaceId);
|
|
@@ -131,7 +146,7 @@ export function createServerWorkspaceSyncEngineRemoteServices(options) {
|
|
|
131
146
|
});
|
|
132
147
|
}
|
|
133
148
|
catch (error) {
|
|
134
|
-
abandon(permit.permitId, 'SYNC_COORDINATOR_GATEWAY_REQUEST_FAILED');
|
|
149
|
+
abandon(permit.permitId, 'SYNC_COORDINATOR_GATEWAY_REQUEST_FAILED', operationClass === 'pull' || operationClass === 'repair');
|
|
135
150
|
throw error;
|
|
136
151
|
}
|
|
137
152
|
const decoded = decodeGatewayResult(gatewayResult, issuedAt.getTime());
|
|
@@ -171,6 +186,12 @@ export function createServerWorkspaceSyncEngineRemoteServices(options) {
|
|
|
171
186
|
abandon(permit.permitId, 'SYNC_COORDINATOR_APPLYING_REJECTED');
|
|
172
187
|
return result;
|
|
173
188
|
}
|
|
189
|
+
if (!result.ok
|
|
190
|
+
&& completedPermit.upstreamDisposition === 'unknown'
|
|
191
|
+
&& (operationClass === 'pull' || operationClass === 'repair')) {
|
|
192
|
+
abandon(permit.permitId, 'SYNC_COORDINATOR_GATEWAY_REQUEST_FAILED', true);
|
|
193
|
+
return result;
|
|
194
|
+
}
|
|
174
195
|
if (!input.previousBoundary) {
|
|
175
196
|
abandon(permit.permitId, 'SYNC_COORDINATOR_APPLY_BOUNDARY_MISSING');
|
|
176
197
|
throw new Error('A server applying request did not declare its prior boundary.');
|
|
@@ -319,10 +340,12 @@ export function createServerWorkspaceSyncEngineRemoteServices(options) {
|
|
|
319
340
|
});
|
|
320
341
|
},
|
|
321
342
|
pullWorkspaceContent: (input) => {
|
|
322
|
-
const { previousCursor, ...request } = input;
|
|
343
|
+
const { previousCursor, independentCompletionIdentity, ...request } = input;
|
|
323
344
|
return execute({
|
|
324
345
|
operation: { type: 'content-pull', ...request },
|
|
325
|
-
previousBoundary:
|
|
346
|
+
previousBoundary: independentCompletionIdentity
|
|
347
|
+
? independentContentBoundary(independentCompletionIdentity)
|
|
348
|
+
: v2Boundary(previousCursor),
|
|
326
349
|
applying: true,
|
|
327
350
|
});
|
|
328
351
|
},
|
|
@@ -433,6 +456,10 @@ export function createServerWorkspaceSyncEngineRemoteServices(options) {
|
|
|
433
456
|
}
|
|
434
457
|
},
|
|
435
458
|
buildV2ApplyCompletionGroup: ({ workspaceId, previousCursor, nextCursor, receipts, }) => completionGroup(workspaceId, receipts, v2Boundary(previousCursor), v2Boundary(nextCursor)),
|
|
459
|
+
buildIndependentContentApplyCompletionGroup: ({ workspaceId, identity, receipts, }) => {
|
|
460
|
+
const boundary = independentContentBoundary(identity);
|
|
461
|
+
return completionGroup(workspaceId, receipts, boundary, boundary);
|
|
462
|
+
},
|
|
436
463
|
buildV2PushApplyCompletionGroup: ({ workspaceId, pushBoundary, receipts, }) => completionGroup(workspaceId, receipts, parseWorkspaceSyncEngineV2PushBoundary(pushBoundary), parseWorkspaceSyncEngineV2PushBoundary(pushBoundary)),
|
|
437
464
|
buildV3ApplyCompletionGroup: ({ workspaceId, apply, receipts }) => {
|
|
438
465
|
const metadata = readReceipts(workspaceId, receipts);
|
|
@@ -2,7 +2,7 @@ import type { LocalWorkspaceSyncRunnerOperations } from '../coordinator/localWor
|
|
|
2
2
|
import { type EnsureWorkspaceReadyResult } from '../syncService.js';
|
|
3
3
|
import type { WorkspaceSyncV2ProjectionExclusion } from '../v3/workspaceSyncV2ProjectionExclusions.js';
|
|
4
4
|
import type { WorkspaceSyncV3CombinedCoverageSelector } from '../v3/workspaceSyncV3CombinedWireContract.js';
|
|
5
|
-
import type
|
|
5
|
+
import { type WorkspaceSyncEngineLocalServices } from './workspaceSyncEngineLocalServices.js';
|
|
6
6
|
import type { WorkspaceSyncEngineRemoteServices } from './workspaceSyncEngineRemoteServices.js';
|
|
7
7
|
import type { WorkspaceSyncEngineServerPushCandidateProvider } from './workspaceSyncEngineServerSnapshotReader.js';
|
|
8
8
|
import type { WorkspaceSyncEngineServerCheckpointPort } from './workspaceSyncEngineServerApplyBoundary.js';
|
|
@@ -46,11 +46,13 @@ export interface WorkspaceSyncEngineServerAttachmentApplyPort {
|
|
|
46
46
|
} | {
|
|
47
47
|
success: false;
|
|
48
48
|
error: string;
|
|
49
|
+
disposition?: 'retryable' | 'terminal-unavailable';
|
|
49
50
|
}>;
|
|
50
51
|
}): Promise<{
|
|
51
52
|
attempted: number;
|
|
52
53
|
resolved: number;
|
|
53
54
|
remaining: number;
|
|
55
|
+
terminal: number;
|
|
54
56
|
nextAttemptAt: string | null;
|
|
55
57
|
lastError: string | null;
|
|
56
58
|
}>;
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { createHash } from 'crypto';
|
|
2
|
-
import { createLocalWorkspaceSyncPendingV2Push, decodeWorkspaceSyncPayload, fingerprintLocalWorkspaceSyncPreparedPlan, isLocalWorkspaceSyncPullFairnessDue, } from '../coordinator/localWorkspaceSyncRunnerState.js';
|
|
2
|
+
import { createLocalWorkspaceSyncPendingV2Push, decodeWorkspaceSyncPayload, fingerprintLocalWorkspaceSyncPreparedPlan, isLocalWorkspaceSyncPullFairnessDue, upgradeLocalWorkspaceSyncPendingV2PushSettlement, } from '../coordinator/localWorkspaceSyncRunnerState.js';
|
|
3
3
|
import { isTransientWorkspaceSyncStatus, runWorkspacePullSyncService, runWorkspacePushSyncService, } from '../syncService.js';
|
|
4
4
|
import { hydrateWorkspaceSyncV3AttachmentAsset } from '../v3/workspaceSyncV3AttachmentAssetHydration.js';
|
|
5
5
|
import { runWorkspaceSyncV3CombinedProjectionCycle } from '../v3/workspaceSyncV3CombinedFeedOrchestrator.js';
|
|
6
6
|
import { runWorkspaceSyncV3InitiativeProjectionCycle } from '../v3/workspaceSyncV3FeedOrchestrator.js';
|
|
7
7
|
import { normalizeWorkspaceSyncV2ProjectionExclusions } from '../v3/workspaceSyncV2ProjectionExclusions.js';
|
|
8
8
|
import { canonicalWorkspaceSyncJson } from '../v3/canonicalWorkspaceSyncJson.js';
|
|
9
|
+
import { authoritativeV2ApplyFailureMessage, } from './workspaceSyncEngineLocalServices.js';
|
|
9
10
|
import { combinedAttachmentAssetHydrationId, createWorkspaceSyncV3TransferBindings, } from './workspaceSyncEngineTransfers.js';
|
|
10
11
|
import { createWorkspaceSyncTransferEvidence, } from './workspaceSyncTransferEvidence.js';
|
|
11
12
|
const NOOP_CLOUD_RESOLVER = (path) => path;
|
|
@@ -13,6 +14,7 @@ const RETRY_BASE_DELAY_MS = 1_000;
|
|
|
13
14
|
const RETRY_MAX_DELAY_MS = 5 * 60_000;
|
|
14
15
|
const COMBINED_FEED_COVERED_OUTBOX_BLOCK = 'WORKSPACE_SYNC_V3_COVERED_LOCAL_OPERATIONS';
|
|
15
16
|
const REPAIR_OWNERSHIP_FINGERPRINT_VERSION = 2;
|
|
17
|
+
const NON_APPLYING_ACKNOWLEDGEMENT_CHECKPOINT_INTERVAL = 64;
|
|
16
18
|
class WorkspaceSyncEngineServerRunnerOperationError extends Error {
|
|
17
19
|
code;
|
|
18
20
|
retryAfterMs;
|
|
@@ -513,7 +515,9 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
|
|
|
513
515
|
? 'repair'
|
|
514
516
|
: 'push';
|
|
515
517
|
activeRetryKind = pushRetryKind;
|
|
516
|
-
|
|
518
|
+
if (checkpoint.controlState !== 'pushing') {
|
|
519
|
+
persist({ ...checkpoint, controlState: 'pushing' });
|
|
520
|
+
}
|
|
517
521
|
let payload;
|
|
518
522
|
let signature;
|
|
519
523
|
if (checkpoint.pendingV2Push) {
|
|
@@ -523,6 +527,13 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
|
|
|
523
527
|
forceAllAiProfiles: checkpoint.pendingV2Push.forceAllAiProfiles,
|
|
524
528
|
repairMode: checkpoint.pendingV2Push.repairMode,
|
|
525
529
|
};
|
|
530
|
+
if (checkpoint.pendingV2Push.preparedPlan
|
|
531
|
+
&& checkpoint.pendingV2Push.settlementVersion !== 1) {
|
|
532
|
+
persist({
|
|
533
|
+
...checkpoint,
|
|
534
|
+
pendingV2Push: upgradeLocalWorkspaceSyncPendingV2PushSettlement(checkpoint.pendingV2Push),
|
|
535
|
+
});
|
|
536
|
+
}
|
|
526
537
|
}
|
|
527
538
|
else {
|
|
528
539
|
const forcedContentPaths = pushRetryKind === 'v2-content-push'
|
|
@@ -551,11 +562,13 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
|
|
|
551
562
|
persist({ ...checkpoint, pendingV2Push });
|
|
552
563
|
}
|
|
553
564
|
if (checkpoint.remoteHintObservedAt) {
|
|
554
|
-
|
|
565
|
+
checkpoint = {
|
|
555
566
|
...checkpoint,
|
|
556
567
|
consecutivePushesWhilePullDue: Math.min(Number.MAX_SAFE_INTEGER, checkpoint.consecutivePushesWhilePullDue + 1),
|
|
557
|
-
}
|
|
568
|
+
};
|
|
558
569
|
}
|
|
570
|
+
let persistedAcknowledgementCount = checkpoint.pendingV2Push
|
|
571
|
+
?.acknowledgedNonApplyingBatchOperationIdentities.length || 0;
|
|
559
572
|
const result = await runWorkspacePushSyncService({
|
|
560
573
|
resolveCloudAuthUrl: NOOP_CLOUD_RESOLVER,
|
|
561
574
|
workspaceId,
|
|
@@ -567,29 +580,33 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
|
|
|
567
580
|
preparedPlan: checkpoint.pendingV2Push?.preparedPlan,
|
|
568
581
|
acknowledgedNonApplyingBatchOperationIdentities: checkpoint.pendingV2Push
|
|
569
582
|
?.acknowledgedNonApplyingBatchOperationIdentities,
|
|
583
|
+
settledBatchOperationIdentities: checkpoint.pendingV2Push?.settledBatchOperationIdentities,
|
|
570
584
|
onPreparedPlan: ({ plan, acknowledgedOperationIdentities, }) => {
|
|
571
585
|
const pendingV2Push = checkpoint.pendingV2Push;
|
|
572
586
|
if (!pendingV2Push) {
|
|
573
587
|
throw new WorkspaceSyncEngineServerRunnerOperationError('The frozen V2 push disappeared while recording its prepared plan.', 'SYNC_RUNNER_PUSH_CHECKPOINT_INVALID');
|
|
574
588
|
}
|
|
589
|
+
const preparedPendingV2Push = {
|
|
590
|
+
...pendingV2Push,
|
|
591
|
+
preparedPlan: plan,
|
|
592
|
+
preparedPlanFingerprint: fingerprintLocalWorkspaceSyncPreparedPlan(plan),
|
|
593
|
+
acknowledgedNonApplyingBatchOperationIdentities: [
|
|
594
|
+
...acknowledgedOperationIdentities,
|
|
595
|
+
],
|
|
596
|
+
};
|
|
575
597
|
persist({
|
|
576
598
|
...checkpoint,
|
|
577
|
-
pendingV2Push:
|
|
578
|
-
...pendingV2Push,
|
|
579
|
-
preparedPlan: plan,
|
|
580
|
-
preparedPlanFingerprint: fingerprintLocalWorkspaceSyncPreparedPlan(plan),
|
|
581
|
-
acknowledgedNonApplyingBatchOperationIdentities: [
|
|
582
|
-
...acknowledgedOperationIdentities,
|
|
583
|
-
],
|
|
584
|
-
},
|
|
599
|
+
pendingV2Push: upgradeLocalWorkspaceSyncPendingV2PushSettlement(preparedPendingV2Push),
|
|
585
600
|
});
|
|
601
|
+
persistedAcknowledgementCount =
|
|
602
|
+
acknowledgedOperationIdentities.length;
|
|
586
603
|
},
|
|
587
604
|
onNonApplyingBatchAcknowledged: ({ acknowledgedOperationIdentities }) => {
|
|
588
605
|
const pendingV2Push = checkpoint.pendingV2Push;
|
|
589
606
|
if (!pendingV2Push) {
|
|
590
607
|
throw new WorkspaceSyncEngineServerRunnerOperationError('The frozen V2 push disappeared while recording batch progress.', 'SYNC_RUNNER_PUSH_CHECKPOINT_INVALID');
|
|
591
608
|
}
|
|
592
|
-
|
|
609
|
+
checkpoint = {
|
|
593
610
|
...checkpoint,
|
|
594
611
|
pendingV2Push: {
|
|
595
612
|
...pendingV2Push,
|
|
@@ -597,19 +614,93 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
|
|
|
597
614
|
...acknowledgedOperationIdentities,
|
|
598
615
|
],
|
|
599
616
|
},
|
|
617
|
+
};
|
|
618
|
+
if (acknowledgedOperationIdentities.length
|
|
619
|
+
- persistedAcknowledgementCount
|
|
620
|
+
>= NON_APPLYING_ACKNOWLEDGEMENT_CHECKPOINT_INTERVAL) {
|
|
621
|
+
persist(checkpoint);
|
|
622
|
+
persistedAcknowledgementCount =
|
|
623
|
+
acknowledgedOperationIdentities.length;
|
|
624
|
+
}
|
|
625
|
+
},
|
|
626
|
+
onAcceptedBatchSettled: async ({ operationIdentity, settlementIdentityFingerprint, appliedTaskUpserts, transferReceipt, pushBoundary, excludedProjections, }) => {
|
|
627
|
+
const pendingV2Push = checkpoint.pendingV2Push;
|
|
628
|
+
if (!pendingV2Push
|
|
629
|
+
|| pendingV2Push.settlementVersion !== 1
|
|
630
|
+
|| !pendingV2Push.settledBatchOperationIdentities
|
|
631
|
+
|| !pendingV2Push.settledBatchContributions) {
|
|
632
|
+
throw new WorkspaceSyncEngineServerRunnerOperationError('The frozen V2 push settlement checkpoint is unavailable.', 'SYNC_RUNNER_PUSH_CHECKPOINT_INVALID');
|
|
633
|
+
}
|
|
634
|
+
if (pendingV2Push.settledBatchOperationIdentities.includes(operationIdentity)) {
|
|
635
|
+
throw new WorkspaceSyncEngineServerRunnerOperationError('The accepted V2 push page was already settled locally.', 'SYNC_RUNNER_PUSH_CHECKPOINT_INVALID');
|
|
636
|
+
}
|
|
637
|
+
if (checkpoint.retry?.kind !== pushRetryKind) {
|
|
638
|
+
setRetry(pushRetryKind, 'Accepted V2 push page local settlement is pending.');
|
|
639
|
+
}
|
|
640
|
+
const completionGroup = options.remoteServices.buildV2PushApplyCompletionGroup({
|
|
641
|
+
workspaceId,
|
|
642
|
+
pushBoundary,
|
|
643
|
+
receipts: [transferReceipt],
|
|
644
|
+
});
|
|
645
|
+
if (!completionGroup) {
|
|
646
|
+
throw new WorkspaceSyncEngineServerRunnerOperationError('Accepted V2 push page is missing an atomic local apply completion group.', 'SYNC_RUNNER_PUSH_APPLY_COMPLETION_INVALID');
|
|
647
|
+
}
|
|
648
|
+
const nextCheckpoint = {
|
|
649
|
+
...checkpoint,
|
|
650
|
+
pendingV2Push: {
|
|
651
|
+
...checkpoint.pendingV2Push,
|
|
652
|
+
settledBatchOperationIdentities: [
|
|
653
|
+
...checkpoint.pendingV2Push
|
|
654
|
+
.settledBatchOperationIdentities,
|
|
655
|
+
operationIdentity,
|
|
656
|
+
],
|
|
657
|
+
settledBatchContributions: [
|
|
658
|
+
...checkpoint.pendingV2Push
|
|
659
|
+
.settledBatchContributions,
|
|
660
|
+
{
|
|
661
|
+
operationIdentity,
|
|
662
|
+
settlementIdentityFingerprint,
|
|
663
|
+
appliedTaskUpserts: structuredClone(appliedTaskUpserts),
|
|
664
|
+
},
|
|
665
|
+
],
|
|
666
|
+
},
|
|
667
|
+
};
|
|
668
|
+
const commitState = {};
|
|
669
|
+
const applyResult = await localServices.applyV2Batch(workspaceId, appliedTaskUpserts.map((entry) => ({
|
|
670
|
+
op: 'upsert',
|
|
671
|
+
archived: entry.archived === true,
|
|
672
|
+
task: entry.task,
|
|
673
|
+
...(entry.durableRevision
|
|
674
|
+
? { durableRevision: entry.durableRevision }
|
|
675
|
+
: {}),
|
|
676
|
+
})), {
|
|
677
|
+
repairMode: attemptOptions.repairMode,
|
|
678
|
+
excludedProjections,
|
|
679
|
+
completionGroup,
|
|
680
|
+
commitServerCheckpoint: () => {
|
|
681
|
+
const persisted = input.persistCheckpoint(nextCheckpoint);
|
|
682
|
+
commitState.checkpoint = structuredClone(persisted.checkpoint);
|
|
683
|
+
return commitState.checkpoint;
|
|
684
|
+
},
|
|
600
685
|
});
|
|
686
|
+
if (!applyResult.ok || !commitState.checkpoint) {
|
|
687
|
+
throw new WorkspaceSyncEngineServerRunnerOperationError(!applyResult.ok
|
|
688
|
+
? authoritativeV2ApplyFailureMessage(applyResult)
|
|
689
|
+
: 'Accepted V2 push page did not commit its settlement checkpoint.', 'SYNC_RUNNER_PUSH_AUTHORITATIVE_APPLY_FAILED');
|
|
690
|
+
}
|
|
691
|
+
checkpoint = structuredClone(commitState.checkpoint);
|
|
601
692
|
},
|
|
602
693
|
});
|
|
603
694
|
onResult?.(result);
|
|
604
695
|
if (!result.success) {
|
|
605
696
|
if (result.batchProgress && checkpoint.pendingV2Push) {
|
|
606
|
-
|
|
697
|
+
checkpoint = {
|
|
607
698
|
...checkpoint,
|
|
608
699
|
pendingV2Push: {
|
|
609
700
|
...checkpoint.pendingV2Push,
|
|
610
701
|
lastBatchProgress: structuredClone(result.batchProgress),
|
|
611
702
|
},
|
|
612
|
-
}
|
|
703
|
+
};
|
|
613
704
|
}
|
|
614
705
|
const message = pushFailureMessage(result);
|
|
615
706
|
if (isAuthFailure(result)) {
|
|
@@ -617,7 +708,19 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
|
|
|
617
708
|
}
|
|
618
709
|
fail(pushRetryKind, message, 'SYNC_RUNNER_PUSH_FAILED', result.retryAfterMs);
|
|
619
710
|
}
|
|
620
|
-
|
|
711
|
+
const serviceTaskUpserts = result.appliedTaskUpserts || [];
|
|
712
|
+
const pushTransferReceipts = result.pushTransferReceipts || [];
|
|
713
|
+
const settledTaskUpserts = checkpoint.pendingV2Push
|
|
714
|
+
?.settledBatchContributions
|
|
715
|
+
?.flatMap((entry) => entry.appliedTaskUpserts) || [];
|
|
716
|
+
const terminalTaskUpserts = pushTransferReceipts.length > 0
|
|
717
|
+
? serviceTaskUpserts
|
|
718
|
+
: [];
|
|
719
|
+
result.appliedTaskUpserts = [
|
|
720
|
+
...settledTaskUpserts,
|
|
721
|
+
...terminalTaskUpserts,
|
|
722
|
+
];
|
|
723
|
+
for (const entry of result.appliedTaskUpserts) {
|
|
621
724
|
const taskId = String(entry.task.id || '').trim();
|
|
622
725
|
const watermark = String(entry.task.updatedAt || entry.task.createdAt || '').trim();
|
|
623
726
|
if (!taskId || !watermark)
|
|
@@ -632,14 +735,6 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
|
|
|
632
735
|
result,
|
|
633
736
|
});
|
|
634
737
|
const syncedAt = result.syncedAt || input.now;
|
|
635
|
-
const appliedTaskUpserts = result.appliedTaskUpserts || [];
|
|
636
|
-
const pushTransferReceipts = result.pushTransferReceipts || [];
|
|
637
|
-
if (appliedTaskUpserts.length > 0) {
|
|
638
|
-
// Persist the retry obligation before entering the atomic local
|
|
639
|
-
// apply. If that transaction rolls back after its checkpoint
|
|
640
|
-
// callback, the runner resumes from this durable revision.
|
|
641
|
-
setRetry(pushRetryKind, 'Authoritative V2 push echo local commit is pending.');
|
|
642
|
-
}
|
|
643
738
|
const baseNextCheckpoint = {
|
|
644
739
|
...checkpoint,
|
|
645
740
|
controlState: 'pushing',
|
|
@@ -653,10 +748,8 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
|
|
|
653
748
|
const nextCheckpoint = transformTerminalCheckpoint
|
|
654
749
|
? transformTerminalCheckpoint(baseNextCheckpoint, result, signature)
|
|
655
750
|
: baseNextCheckpoint;
|
|
656
|
-
if (
|
|
657
|
-
const
|
|
658
|
-
if (pushTransferReceipts.length === 0)
|
|
659
|
-
return;
|
|
751
|
+
if (terminalTaskUpserts.length > 0) {
|
|
752
|
+
const abandonTerminalReceipts = async (errorCode = 'WORKSPACE_SYNC_V2_PUSH_AUTHORITATIVE_APPLY_FAILED') => {
|
|
660
753
|
try {
|
|
661
754
|
await options.remoteServices.abandonTransferReceipts({
|
|
662
755
|
workspaceId,
|
|
@@ -666,10 +759,9 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
|
|
|
666
759
|
}
|
|
667
760
|
catch {
|
|
668
761
|
// The durable retry checkpoint remains authoritative.
|
|
669
|
-
// The next exact replay will recover the retained or
|
|
670
|
-
// ambiguous permit through the gateway.
|
|
671
762
|
}
|
|
672
763
|
};
|
|
764
|
+
setRetry(pushRetryKind, 'Authoritative V2 push echo local commit is pending.');
|
|
673
765
|
const completionGroup = result.pushBoundary
|
|
674
766
|
? options.remoteServices.buildV2PushApplyCompletionGroup({
|
|
675
767
|
workspaceId,
|
|
@@ -678,13 +770,13 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
|
|
|
678
770
|
})
|
|
679
771
|
: undefined;
|
|
680
772
|
if (!completionGroup) {
|
|
681
|
-
await
|
|
773
|
+
await abandonTerminalReceipts('WORKSPACE_SYNC_V2_PUSH_APPLY_COMPLETION_INVALID');
|
|
682
774
|
throw new WorkspaceSyncEngineServerRunnerOperationError('Accepted V2 push echoes are missing an atomic local apply completion group.', 'SYNC_RUNNER_PUSH_APPLY_COMPLETION_INVALID');
|
|
683
775
|
}
|
|
684
776
|
const commitState = {};
|
|
685
777
|
let applyResult;
|
|
686
778
|
try {
|
|
687
|
-
applyResult = await localServices.applyV2Batch(workspaceId,
|
|
779
|
+
applyResult = await localServices.applyV2Batch(workspaceId, terminalTaskUpserts.map((entry) => ({
|
|
688
780
|
op: 'upsert',
|
|
689
781
|
archived: entry.archived === true,
|
|
690
782
|
task: entry.task,
|
|
@@ -692,32 +784,31 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
|
|
|
692
784
|
? { durableRevision: entry.durableRevision }
|
|
693
785
|
: {}),
|
|
694
786
|
})), {
|
|
695
|
-
|
|
787
|
+
repairMode: attemptOptions.repairMode,
|
|
788
|
+
excludedProjections: result.effectiveV2ExcludedProjections,
|
|
789
|
+
completionGroup,
|
|
696
790
|
commitServerCheckpoint: () => {
|
|
697
791
|
const persisted = input.persistCheckpoint(nextCheckpoint, {
|
|
698
792
|
beforeCommit: beforeTerminalPersist
|
|
699
793
|
? () => beforeTerminalPersist(result)
|
|
700
794
|
: undefined,
|
|
701
795
|
});
|
|
702
|
-
commitState.checkpoint =
|
|
703
|
-
structuredClone(persisted.checkpoint);
|
|
796
|
+
commitState.checkpoint = structuredClone(persisted.checkpoint);
|
|
704
797
|
return commitState.checkpoint;
|
|
705
798
|
},
|
|
706
799
|
});
|
|
707
800
|
}
|
|
708
801
|
catch (error) {
|
|
709
|
-
await
|
|
802
|
+
await abandonTerminalReceipts();
|
|
710
803
|
throw new WorkspaceSyncEngineServerRunnerOperationError(errorMessage(error, 'Authoritative V2 push echo apply failed.'), 'SYNC_RUNNER_PUSH_AUTHORITATIVE_APPLY_FAILED');
|
|
711
804
|
}
|
|
712
805
|
if (!applyResult.ok || !commitState.checkpoint) {
|
|
713
|
-
await
|
|
714
|
-
throw new WorkspaceSyncEngineServerRunnerOperationError(
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
if (!committedCheckpoint) {
|
|
718
|
-
throw new WorkspaceSyncEngineServerRunnerOperationError('The authoritative V2 push echo apply did not commit its runner checkpoint.', 'SYNC_RUNNER_PUSH_CHECKPOINT_NOT_COMMITTED');
|
|
806
|
+
await abandonTerminalReceipts();
|
|
807
|
+
throw new WorkspaceSyncEngineServerRunnerOperationError(!applyResult.ok
|
|
808
|
+
? authoritativeV2ApplyFailureMessage(applyResult)
|
|
809
|
+
: 'Authoritative V2 push echo did not commit the server checkpoint.', 'SYNC_RUNNER_PUSH_AUTHORITATIVE_APPLY_FAILED');
|
|
719
810
|
}
|
|
720
|
-
checkpoint = structuredClone(
|
|
811
|
+
checkpoint = structuredClone(commitState.checkpoint);
|
|
721
812
|
}
|
|
722
813
|
else {
|
|
723
814
|
persist(nextCheckpoint, {
|
|
@@ -28,6 +28,7 @@ export function toWorkspaceSyncV2PushBaseline(snapshot, currentTaxonomyStateFing
|
|
|
28
28
|
lastPushedInitiativeWatermarks: new Map(),
|
|
29
29
|
lastPushedWorkstreamIds: new Set(),
|
|
30
30
|
lastPushedWorkstreamWatermarks: new Map(),
|
|
31
|
+
lastPushedPlanningIdentityWatermarks: new Map(),
|
|
31
32
|
lastPushedAiProfileIds: new Set(),
|
|
32
33
|
lastPushedAiProfileWatermarks: new Map(),
|
|
33
34
|
lastPushedAiProfileChangeKeys: new Map(),
|
|
@@ -57,6 +58,7 @@ export function toWorkspaceSyncV2PushBaseline(snapshot, currentTaxonomyStateFing
|
|
|
57
58
|
|| snapshot.taxonomyStateFingerprint === currentTaxonomyStateFingerprint;
|
|
58
59
|
const initiativeWatermarks = stringMap(snapshot.initiativeWatermarks);
|
|
59
60
|
const workstreamWatermarks = stringMap(snapshot.workstreamWatermarks);
|
|
61
|
+
const planningIdentityWatermarks = stringMap(snapshot.planningIdentityWatermarks);
|
|
60
62
|
const aiProfileWatermarks = stringMap(snapshot.aiProfileWatermarks);
|
|
61
63
|
const documentWatermarks = stringMap(snapshot.documentWatermarks);
|
|
62
64
|
const assetWatermarks = stringMap(snapshot.assetWatermarks);
|
|
@@ -76,6 +78,7 @@ export function toWorkspaceSyncV2PushBaseline(snapshot, currentTaxonomyStateFing
|
|
|
76
78
|
lastPushedInitiativeWatermarks: initiativeWatermarks,
|
|
77
79
|
lastPushedWorkstreamIds: new Set(workstreamWatermarks.keys()),
|
|
78
80
|
lastPushedWorkstreamWatermarks: workstreamWatermarks,
|
|
81
|
+
lastPushedPlanningIdentityWatermarks: planningIdentityWatermarks,
|
|
79
82
|
lastPushedAiProfileIds: new Set(aiProfileWatermarks.keys()),
|
|
80
83
|
lastPushedAiProfileWatermarks: aiProfileWatermarks,
|
|
81
84
|
lastPushedAiProfileChangeKeys: stringMap(snapshot.aiProfileChangeKeys),
|
|
@@ -146,6 +149,9 @@ export function createWorkspaceSyncEngineServerPushCandidateProvider(snapshotRea
|
|
|
146
149
|
taskRelationshipChangeKeys: sortedEntries(taskRelationshipChangeKeys),
|
|
147
150
|
initiativeWatermarks: sortedEntries(result.currentInitiativeWatermarks),
|
|
148
151
|
workstreamWatermarks: sortedEntries(result.currentWorkstreamWatermarks),
|
|
152
|
+
planningIdentityWatermarks: sortedEntries(result.currentPlanningIdentityWatermarks
|
|
153
|
+
|| payload.currentPlanningIdentityWatermarks
|
|
154
|
+
|| stringMap(previousBaseline?.planningIdentityWatermarks)),
|
|
149
155
|
aiProfileWatermarks: sortedEntries(result.currentAiProfileWatermarks),
|
|
150
156
|
aiProfileChangeKeys: sortedEntries(aiProfileChangeKeys),
|
|
151
157
|
taskforceAgentWatermarks: sortedEntries(result.currentTaskforceAgentWatermarks),
|
|
@@ -3,7 +3,7 @@ import type { WorkspaceSyncPayload } from '../workspaceSyncModel.js';
|
|
|
3
3
|
import type { WorkspaceSyncPhase } from '../workspaceSyncState.js';
|
|
4
4
|
import type { WorkspaceSyncV3CombinedCoverageSelector } from '../v3/workspaceSyncV3CombinedWireContract.js';
|
|
5
5
|
import type { WorkspaceSyncEngineRuntime } from './workspaceSyncEngineRuntime.js';
|
|
6
|
-
import type
|
|
6
|
+
import { type WorkspaceSyncEngineLocalServices } from './workspaceSyncEngineLocalServices.js';
|
|
7
7
|
import type { WorkspaceSyncEngineRemoteServices, WorkspaceSyncEngineRemoteTransferReceipt } from './workspaceSyncEngineRemoteServices.js';
|
|
8
8
|
export type { PendingWorkspacePushReplay } from './workspaceSyncEngineTransferTypes.js';
|
|
9
9
|
type StateSetter<T> = (value: T | ((current: T) => T)) => void;
|